From 8734de2a760cedfa0cdb81713053b1d2d2c8fb43 Mon Sep 17 00:00:00 2001 From: jotpio Date: Fri, 2 Mar 2018 18:17:39 +0100 Subject: [PATCH 001/171] diasabled left toolbar and video toolbar when no tracker loaded --- .../CoreApp/BioTracker/View/MainWindow.cpp | 11 +++ .../CoreApp/BioTracker/View/MainWindow.h | 2 + .../CoreApp/BioTracker/View/MainWindow.ui | 71 ++++++++++++------- .../BioTracker/View/VideoControllWidget.ui | 23 +++++- 4 files changed, 82 insertions(+), 25 deletions(-) diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp index bf4cd7be..8dcf473a 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp @@ -49,6 +49,7 @@ MainWindow::MainWindow(QWidget* parent, IController* controller, IModel* model) //setup toolbars setupUpperToolBar(); setupVideoToolBar(); + ui->toolBarTools->setEnabled(false); ui->toolBox->setStyleSheet("QToolBox::tab {" " background-color: #e5e5e5;}" @@ -383,6 +384,7 @@ void MainWindow::activeTrackingCheckBox() { //ui->checkBox_TrackingActivated->setEnabled(true); _trackerActivator->setEnabled(true); checkTrackerGroupBox(); + ui->toolBarTools->setEnabled(true); } void MainWindow::deactivateTrackingCheckBox() { @@ -598,6 +600,12 @@ void MainWindow::on_actionToggle_view_toolbar_triggered(){ ui->toolBarTools->setVisible(!currentState); ui->actionToggle_view_toolbar->setText(!currentState?"Hide view toolbar": "Show view toolbar"); } +void MainWindow::on_actionToggle_video_toolbar_triggered() { + bool currentState = ui->toolBarVideo->isVisible(); + ui->toolBarVideo->setVisible(!currentState); + ui->actionToggle_video_toolbar->setText(!currentState ? "Hide view toolbar" : "Show view toolbar"); +} + void MainWindow::on_actionToggle_compact_menu_toolbar_2_triggered(){ // //hide/show compact actions // for(int i = 3; i < ui->toolBarMenu->actions().size(); i++){ @@ -620,6 +628,9 @@ void MainWindow::on_toolBarMenu_visibilityChanged(bool visible){ void MainWindow::on_toolBarTools_visibilityChanged(bool visible){ ui->actionToggle_view_toolbar->setText(visible?"Hide view toolbar": "Show view toolbar"); } +void MainWindow::on_toolBarVideo_visibilityChanged(bool visible) { + ui->actionToggle_video_toolbar->setText(visible ? "Hide video toolbar" : "Show video toolbar"); +} void MainWindow::on_actionBottom_panel_triggered(bool checked){ ui->bottomPanelViewControllerButton->click(); diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.h b/BioTracker/CoreApp/BioTracker/View/MainWindow.h index 28bb1774..6042a523 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.h +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.h @@ -91,6 +91,7 @@ class MainWindow : public IViewMainWindow { void on_actionToggle_menu_toolbar_triggered(); void on_actionToggle_view_toolbar_triggered(); void on_actionToggle_compact_menu_toolbar_2_triggered(); + void on_actionToggle_video_toolbar_triggered(); //view toolbar actions @@ -130,6 +131,7 @@ class MainWindow : public IViewMainWindow { //ui signals void on_toolBarMenu_visibilityChanged(bool visible); void on_toolBarTools_visibilityChanged(bool visible); + void on_toolBarVideo_visibilityChanged(bool visible); private: Ui::MainWindow* ui; diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.ui b/BioTracker/CoreApp/BioTracker/View/MainWindow.ui index 9ef5d9a6..42aaa6c9 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.ui +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.ui @@ -395,6 +395,12 @@ + + + 0 + 0 + + Select the desired tracker @@ -422,8 +428,8 @@ 0 0 - 497 - 294 + 494 + 304 @@ -442,8 +448,8 @@ 0 0 - 497 - 302 + 494 + 304 @@ -488,8 +494,8 @@ 0 0 - 497 - 302 + 494 + 304 @@ -518,8 +524,8 @@ 0 0 - 497 - 302 + 494 + 304 @@ -575,19 +581,19 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Ubuntu'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The BioTracker is a modular tracking software consisting of a core management framework and various trackers which you can 'plug in'. You can track on videos, picture and camera streams.</p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> -<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:large; font-weight:600;">Basic steps</span></p> -<ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Load a medium (video, picture or camera stream) </li> -<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Load a tracker (usually trackers are preloaded from the 'Plugins' directory) </li> -<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the desired tracker options </li> -<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Insert the objects to track if the tracker does not generate them automatically</li> -<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can manage the tracking and trials in the experiment tab</li> -<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Start tracking!</li></ol> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:0px;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">More information on how to use the BioTracker can be found in the <a href="https://github.com/BioroboticsLab/biotracker_core/wiki"><span style=" text-decoration: underline; color:#0000ff;">user guide</span></a>.</p></body></html> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:9pt;">The BioTracker is a modular tracking software consisting of a core management framework and various trackers which you can 'plug in'. You can track on videos, picture and camera streams.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:9pt;"><br /></p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:9pt; font-weight:600;">Basic steps</span></p> +<ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Load a medium (video, picture or camera stream) </li> +<li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Load a tracker (usually trackers are preloaded from the 'Plugins' directory) </li> +<li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the desired tracker options </li> +<li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Insert the objects to track if the tracker does not generate them automatically</li> +<li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can manage the tracking and trials in the experiment tab</li> +<li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Start tracking!</li></ol> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:0px; font-family:'Ubuntu'; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:9pt;"> </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:9pt;">More information on how to use the BioTracker can be found in the </span><a href="https://github.com/BioroboticsLab/biotracker_core/wiki"><span style=" font-family:'Ubuntu'; font-size:9pt; text-decoration: underline; color:#0000ff;">user guide</span></a><span style=" font-family:'Ubuntu'; font-size:9pt;">.</span></p></body></html> true @@ -601,8 +607,8 @@ p, li { white-space: pre-wrap; } 0 0 - 497 - 302 + 494 + 304 @@ -648,7 +654,7 @@ p, li { white-space: pre-wrap; } 0 0 845 - 18 + 21 @@ -686,6 +692,7 @@ p, li { white-space: pre-wrap; } Toolbars + @@ -1235,6 +1242,22 @@ QToolButton { User guide + + + true + + + true + + + Video panel + + + + + Hide video toolbar + + diff --git a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.ui b/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.ui index 57d12f05..f868ea16 100644 --- a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.ui +++ b/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.ui @@ -10,7 +10,7 @@ 0 0 1056 - 98 + 101 @@ -449,6 +449,9 @@ + + true + :/Images/resources/recordCam.png:/Images/resources/recordCam.png @@ -458,6 +461,9 @@ + + true + :/Images/resources/record.png:/Images/resources/record.png @@ -467,6 +473,9 @@ + + true + :/Images/resources/screenshot.png:/Images/resources/screenshot.png @@ -479,6 +488,9 @@ + + false + :/Images/resources/arrows-skip-forward.png:/Images/resources/arrows-skip-forward.png @@ -491,6 +503,9 @@ + + false + :/Images/resources/arrows-skip-back.png:/Images/resources/arrows-skip-back.png @@ -506,6 +521,9 @@ + + false + :/Images/resources/stop.png:/Images/resources/stop.png @@ -518,6 +536,9 @@ + + false + :/Images/resources/arrow-forward1.png:/Images/resources/arrow-forward1.png From b10a86ecd53bb7c65410bb8ab3b2fd35661368f2 Mon Sep 17 00:00:00 2001 From: jonas Date: Mon, 5 Mar 2018 19:46:14 +0100 Subject: [PATCH 002/171] belongs to previous commit --- .../BioTracker/View/VideoControllWidget.cpp | 20 ++++-- .../BioTracker/View/VideoControllWidget.ui | 60 +++++++++++++++- .../Utils/BioTrackerUtils/util/misc.cpp | 69 ++++++++++++------- 3 files changed, 116 insertions(+), 33 deletions(-) diff --git a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp b/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp index 186eb731..970044c6 100644 --- a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp +++ b/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp @@ -4,6 +4,7 @@ #include "Model/MediaPlayer.h" #include +#include VideoControllWidget::VideoControllWidget(QWidget* parent, IController* controller, IModel* model) : IViewWidget(parent, controller, model), @@ -60,25 +61,30 @@ void VideoControllWidget::getNotified() { } int currentFrameNr = mediaPlayer->getCurrentFrameNumber(); + int totalNumberOfFrames = mediaPlayer->getTotalNumberOfFrames(); + int mediaFps = mediaPlayer->getFpsOfSourceFile(); ui->frame_num_edit->setText(QString::number(currentFrameNr)); ui->sld_video->setValue(currentFrameNr); + QString currentVideoTime = QDateTime::fromMSecsSinceEpoch(((float)currentFrameNr / (float) mediaFps) * 1000).toUTC().toString("hh:mm:ss:zzz"); + + + ui->time_edit->setText(currentVideoTime); + - //Write current fps label every 1/2 second - std::chrono::system_clock::time_point now = std::chrono::system_clock::now(); - long long dt = std::chrono::duration_cast(now - lastFpsSet).count(); - int fps = mediaPlayer->getCurrentFPS(); + //Write current fps label every 1/2 second + std::chrono::system_clock::time_point now = std::chrono::system_clock::now(); + long long dt = std::chrono::duration_cast(now - lastFpsSet).count(); + int fps = mediaPlayer->getCurrentFPS(); if (dt > 500 || fps <= 0){ ui->lcd_currentFpsNum->display(fps); lastFpsSet = now; } - ui->fps_label->setText(QString::number(mediaPlayer->getFpsOfSourceFile())); + ui->fps_label->setText(QString::number(mediaFps)); double cfps = mediaPlayer->getCurrentFPS(); - int totalNumberOfFrames = mediaPlayer->getTotalNumberOfFrames(); - if(totalNumberOfFrames >= 1) { ui->sld_video->setEnabled(true); ui->sld_video->setMaximum(totalNumberOfFrames-1); diff --git a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.ui b/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.ui index f868ea16..fb6841ea 100644 --- a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.ui +++ b/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.ui @@ -163,7 +163,7 @@ - 5 + 0 0 @@ -177,6 +177,62 @@ 0 + + + + + 5 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Current time: + + + + + + + false + + + + 0 + 0 + + + + + 100 + 30 + + + + Displays the current time (in hours:minutes:seconds:milliseconds) + + + 00:00:00:00 + + + 11 + + + + + + @@ -266,7 +322,7 @@ 0 - + diff --git a/BioTracker/Utils/BioTrackerUtils/util/misc.cpp b/BioTracker/Utils/BioTrackerUtils/util/misc.cpp index 49ffdff8..31054abe 100644 --- a/BioTracker/Utils/BioTrackerUtils/util/misc.cpp +++ b/BioTracker/Utils/BioTrackerUtils/util/misc.cpp @@ -1,8 +1,8 @@ #include "util/misc.h" - -#include // QPoint -#include -#include + +#include // QPoint +#include +#include int split(std::string &txt, std::vector &strs, char ch) { @@ -26,27 +26,48 @@ int split(std::string &txt, std::vector &strs, char ch) std::string getTimeAndDate(std::string prefix, std::string suffix) { - time_t timetitle; - std::string timeInfo = prefix; - time(&timetitle); - std::string t = ctime(&timetitle); - for (int i = 0; i < t.size(); i++) - if (t[i] == ' ' || t[i] == ':') - t[i] = '_'; - timeInfo += t.substr(0, t.size() - 1); - timeInfo += suffix; - return timeInfo; + // time_t timetitle; + // std::string timeInfo = prefix; + // time(&timetitle); + // std::string t = ctime(&timetitle); + // for (int i = 0; i < t.size(); i++) + // if (t[i] == ' ' || t[i] == ':') + // t[i] = '_'; + // timeInfo += t.substr(0, t.size() - 1); + // timeInfo += suffix; + // return timeInfo; + + + + + time_t rawtime; + struct tm * timeinfo; + + time ( &rawtime ); + timeinfo = localtime ( &rawtime ); + + char t[30]; + strftime(t, 30, "%Y-%m-%dT%H:%M:%S", timeinfo); // + + std::string out = prefix; + + std::string timeStampF(t); + + out += timeStampF; + out += suffix; + + return out; } std::vector stringToCVPointVec(std::string arena) { - std::vector pts; - - QString qarena(arena.c_str()); - QStringList corners = qarena.split(";"); - for (int i = 0; i < corners.size(); i++) { - QString cur = corners.at(i); - QStringList p = cur.split(","); - pts.push_back(cv::Point(p.at(0).toInt(), p.at(1).toInt())); + std::vector pts; + + QString qarena(arena.c_str()); + QStringList corners = qarena.split(";"); + for (int i = 0; i < corners.size(); i++) { + QString cur = corners.at(i); + QStringList p = cur.split(","); + pts.push_back(cv::Point(p.at(0).toInt(), p.at(1).toInt())); } return pts; } @@ -66,8 +87,8 @@ std::vector CvVecToQVec(std::vector q) { } std::string cvPointsToString(std::vector ac) { - - std::string arena = ""; + + std::string arena = ""; for (int i = 0; i < ac.size(); i++) arena += (std::to_string(ac[i].x) + "," + std::to_string(ac[i].y) + ";"); return arena.substr(0, arena.size() - 1); From ccd279969b35bb9cceca8afaeee2fd9dfe1f8115 Mon Sep 17 00:00:00 2001 From: jonas Date: Tue, 6 Mar 2018 16:15:21 +0100 Subject: [PATCH 003/171] added instant video time change on slider move various small changes --- .../CoreApp/BioTracker/View/MainWindow.cpp | 15 ++++-- .../CoreApp/BioTracker/View/MainWindow.ui | 53 +++++++++++-------- .../BioTracker/View/Utility/SwitchButton.cpp | 1 + .../BioTracker/View/VideoControllWidget.cpp | 5 ++ 4 files changed, 49 insertions(+), 25 deletions(-) diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp index 8dcf473a..19258437 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp @@ -93,7 +93,7 @@ void MainWindow::setupUpperToolBar() { _mediaBox = new QGroupBox("Load media"); //style groupbox (initial red border -> no video loaded) _mediaBox->setStyleSheet("QGroupBox" - " {border: 1px solid #c8e6c9;}"); + " {border: 1px solid #e56262;}"); // "QGroupBox::title {subcontrol-origin: margin;subcontrol-position: top center; padding: 0 3px;}"); QFont font = QFont(); font.setPointSize(8); @@ -132,7 +132,7 @@ void MainWindow::setupUpperToolBar() { _trackerBox = new QGroupBox("Load tracker"); //style groupbox _trackerBox->setStyleSheet("QGroupBox" - " {border: 1px solid #c8e6c9;}"); + " {border: 1px solid #e56262;}"); // "QGroupBox::title {subcontrol-origin: margin;subcontrol-position: top center; padding: 0 3px;}"); QFont font0 = QFont(); @@ -394,7 +394,16 @@ void MainWindow::deactivateTrackingCheckBox() { void MainWindow::on_actionOpen_Video_triggered() { static const QString videoFilter("Video files (*.avi *.wmv *.mp4 *.mkv *.mov)"); - + + // QFileDialog dialog(this); + // dialog.setNameFilter(videoFilter); + // QStringList fileNames; + // if (dialog.exec()) + // fileNames = dialog.selectedFiles(); + + // QString filename; + // if(fileNames.size() > 0) + // filename = fileNames[0]; QString filename = QFileDialog::getOpenFileName(this, "Open video", "", videoFilter, 0); diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.ui b/BioTracker/CoreApp/BioTracker/View/MainWindow.ui index c308e249..81ee404a 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.ui +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.ui @@ -404,6 +404,12 @@ 0 + + + 200 + 0 + + Select the desired tracker @@ -431,7 +437,7 @@ 0 0 - 565 + 497 294 @@ -451,8 +457,8 @@ 0 0 - 98 - 50 + 497 + 294 @@ -497,8 +503,8 @@ 0 0 - 98 - 28 + 497 + 294 @@ -527,7 +533,7 @@ 0 0 - 565 + 497 294 @@ -584,19 +590,19 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:9pt;">The BioTracker is a modular tracking software consisting of a core management framework and various trackers which you can 'plug in'. You can track on videos, picture and camera streams.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:9pt;"><br /></p> -<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:9pt; font-weight:600;">Basic steps</span></p> -<ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Load a medium (video, picture or camera stream) </li> -<li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Load a tracker (usually trackers are preloaded from the 'Plugins' directory) </li> -<li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the desired tracker options </li> -<li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Insert the objects to track if the tracker does not generate them automatically</li> -<li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can manage the tracking and trials in the experiment tab</li> -<li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Start tracking!</li></ol> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:0px; font-family:'Ubuntu'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:9pt;"> </span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:9pt;">More information on how to use the BioTracker can be found in the </span><a href="https://github.com/BioroboticsLab/biotracker_core/wiki"><span style=" font-family:'Ubuntu'; font-size:9pt; text-decoration: underline; color:#0000ff;">user guide</span></a><span style=" font-family:'Ubuntu'; font-size:9pt;">.</span></p></body></html> +</style></head><body style=" font-family:'Ubuntu'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The BioTracker is a modular tracking software consisting of a core management framework and various trackers which you can 'plug in'. You can track on videos, picture and camera streams.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Basic steps</span></p> +<ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Load a medium (video, picture or camera stream) </li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Load a tracker (usually trackers are preloaded from the 'Plugins' directory) </li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the desired tracker options </li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Insert the objects to track if the tracker does not generate them automatically</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can manage the tracking and trials in the experiment tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Start tracking!</li></ol> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">More information on how to use the BioTracker can be found in the <a href="https://github.com/BioroboticsLab/biotracker_core/wiki"><span style=" text-decoration: underline; color:#0000ff;">user guide</span></a>.</p></body></html> true @@ -610,8 +616,8 @@ p, li { white-space: pre-wrap; } 0 0 - 98 - 28 + 497 + 294 @@ -657,7 +663,7 @@ p, li { white-space: pre-wrap; } 0 0 845 - 21 + 18 @@ -870,6 +876,9 @@ QToolButton { true + + Qt::BottomToolBarArea|Qt::TopToolBarArea + Qt::ToolButtonIconOnly diff --git a/BioTracker/CoreApp/BioTracker/View/Utility/SwitchButton.cpp b/BioTracker/CoreApp/BioTracker/View/Utility/SwitchButton.cpp index 056bd19d..842d648d 100644 --- a/BioTracker/CoreApp/BioTracker/View/Utility/SwitchButton.cpp +++ b/BioTracker/CoreApp/BioTracker/View/Utility/SwitchButton.cpp @@ -48,6 +48,7 @@ void SwitchButton::paintEvent(QPaintEvent *e) { QRectF textRect = QRectF(_margin, _margin, width() - 2 * _margin, height() - 2 * _margin); p.drawText(textRect, Qt::AlignHCenter | Qt::AlignVCenter, _switch ? _s1: _s0); } else { + p.setRenderHint(QPainter::Antialiasing, true); p.setBrush(Qt::black); p.setOpacity(0.12); p.drawRoundedRect(QRect(_margin, _margin, width() - 2 * _margin, height() - 2 * _margin), 8.0, 8.0); diff --git a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp b/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp index 970044c6..122c6d96 100644 --- a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp +++ b/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp @@ -180,6 +180,11 @@ void VideoControllWidget::on_sld_video_actionTriggered(int action) */ void VideoControllWidget::on_sld_video_sliderMoved(int position) { ui->frame_num_edit->setText(QString::number(position)); + + MediaPlayer* mediaPlayer = dynamic_cast(getModel()); + int mediaFps = mediaPlayer->getFpsOfSourceFile(); + QString currentVideoTime = QDateTime::fromMSecsSinceEpoch(((float)position / (float) mediaFps) * 1000).toUTC().toString("hh:mm:ss:zzz"); + ui->time_edit->setText(currentVideoTime); } void VideoControllWidget::on_doubleSpinBoxTargetFps_editingFinished() { From 14130fa82308b8467da1526a9911e9554884a83c Mon Sep 17 00:00:00 2001 From: jonas Date: Thu, 8 Mar 2018 14:44:46 +0100 Subject: [PATCH 004/171] minor layout changes added/changed tooltips tracing style is now tracing type for better comprehensibility --- .../CoreApp/BioTracker/Model/CoreParameter.h | 2 +- .../BioTracker/View/ComponentShape.cpp | 4 +- .../BioTracker/View/CoreParameterView.cpp | 2 +- .../BioTracker/View/CoreParameterView.ui | 1311 ++++++++++------- .../CoreApp/BioTracker/View/MainWindow.cpp | 21 +- .../CoreApp/BioTracker/View/MainWindow.h | 2 + .../CoreApp/BioTracker/View/MainWindow.ui | 44 +- .../BioTracker/View/VideoControllWidget.cpp | 104 +- .../BioTracker/View/VideoControllWidget.h | 16 +- 9 files changed, 906 insertions(+), 600 deletions(-) diff --git a/BioTracker/CoreApp/BioTracker/Model/CoreParameter.h b/BioTracker/CoreApp/BioTracker/Model/CoreParameter.h index b0d8d5fe..de22f5b9 100644 --- a/BioTracker/CoreApp/BioTracker/Model/CoreParameter.h +++ b/BioTracker/CoreApp/BioTracker/Model/CoreParameter.h @@ -38,7 +38,7 @@ class CoreParameter : public IModel bool m_antialiasingFull = false; //Tracing - QString m_tracingStyle = "None"; + QString m_tracingStyle = "No tracing"; int m_tracingHistory = 20; int m_tracingSteps = 1; QString m_tracingTimeDegradation = "None"; diff --git a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp index afbc6d9d..538a9864 100644 --- a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp +++ b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp @@ -332,7 +332,7 @@ void ComponentShape::trace() delete m_tracingLayer->childItems()[0]; } - if (m_trajectory->size() == 0 || m_tracingLength <= 0 || m_tracingStyle == "None") { + if (m_trajectory->size() == 0 || m_tracingLength <= 0 || m_tracingStyle == "No tracing") { return; } @@ -398,7 +398,7 @@ void ComponentShape::trace() lastPointDifference = adjustedHistoryPointDifference; } //ARROWPATH - else if (m_tracingStyle == "ArrowPath") { + else if (m_tracingStyle == "Arrow path") { QLineF base = QLineF(lastPointDifference, adjustedHistoryPointDifference); int armLength = std::floor(base.length() / 9) + 2; diff --git a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp index bae191a1..68881af7 100644 --- a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp +++ b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp @@ -332,7 +332,7 @@ void CoreParameterView::fillUI() //tracer orientation line ui->checkBoxTracerOrientationLine->setChecked(coreParams->m_tracerOrientationLine); //tracing style - if (coreParams->m_tracingStyle == "None") { ui->comboBoxTracingStyle->setCurrentIndex(0); } + if (coreParams->m_tracingStyle == "No tracing") { ui->comboBoxTracingStyle->setCurrentIndex(0); } //tracing time degradation if (coreParams->m_tracingTimeDegradation == "None") { ui->comboBoxTracingTimeDegradation->setCurrentIndex(0); } //tracing history diff --git a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui index 61208ead..3ad51497 100644 --- a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui +++ b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui @@ -12,7 +12,7 @@ 0 0 - 451 + 525 677 @@ -155,9 +155,9 @@ 0 - -242 - 317 - 903 + -103 + 351 + 935 @@ -297,31 +297,48 @@ 5 - - - 6 + + + Displays the number of tracks - - - - Number of Tracks: - - - - - - - - 75 - true - - - - 0 - - - - + + + 3 + + + 3 + + + 3 + + + 3 + + + 3 + + + + + Number of Objects: + + + + + + + + 75 + true + + + + 0 + + + + + @@ -357,46 +374,148 @@ 5 - - - - 0 - 0 - + + + QFrame::StyledPanel - - - 0 - 25 - + + QFrame::Sunken - + - 0 + 2 - 0 + 3 - 0 + 3 - 0 + 3 - 0 + 3 - - - Set for: + + + + 0 + 25 + + + + Set the height + + + + 3 + + + 3 + + + 3 + + + 3 + + + 3 + + + + + + 0 + 14 + + + + Set the height + + + Height: + + + + + + + QAbstractSpinBox::PlusMinus + + + 1 + + + 1000 + + + + + + + + + + + 0 + 25 + + + + Set the width + + + 3 + + + 3 + + + 3 + + + 3 + + + 3 + + + + + + 0 + 0 + + + + Width: + + + + + + + QAbstractSpinBox::PlusMinus + + + 1 + + + 1000 + + + + - + - + 0 0 @@ -404,24 +523,77 @@ 0 - 0 + 25 - Set the width and height for all tracks - - - All tracks + Buttons to set the dimensions entered for all or only selected tracks + + + 3 + + + 3 + + + 3 + + + 3 + + + 3 + + + + + Set for: + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Set the width and height for all tracks + + + All tracks + + + + + + + Set the width and height only for selected tracks + + + Selected tracks + + + + - + - Set the width and height only for selected tracks + Set the dimensions of all tracks back to default - Selected tracks + Default dimensions @@ -429,52 +601,128 @@ - - - - 0 - 25 - + + + true + + + Show the orientation line for entities - + + Show orientation line + + + false + + + + + + + true + + + Set to disable entity scaling when zooming + + + Always same size + + + + + + + Show the id in the entity + + + Show track ID + + + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Color + + + + 2 + + + 5 + + + 5 + + + 5 + + + 5 + + + + + Buttons to set the fill color for all or only selected tracks + + - 0 + 3 - 0 + 3 - 0 + 3 - 0 + 3 - 0 + 3 - - - - 0 - 14 - + + + Buttons to set the fill color for all or only selected tracks - Height: + Fill: - - - QAbstractSpinBox::PlusMinus + + + Choose a fill color for all trajectories - - 1 + + All tracks + + + + + + + Choose a fill color for selected trajectories - - 1000 + + Selected tracks @@ -482,111 +730,250 @@ - - - - 0 - 25 - + + + Buttons to set the border color for all or only selected tracks - + - 0 + 3 - 0 + 3 - 0 + 3 - 0 + 3 - 0 + 3 - - - - 0 - 0 - - + - Width: + Border: - - - QAbstractSpinBox::PlusMinus + + + Choose a border color for all trajectories + + + All tracks - - 1 + + + + + + Choose a border color for selected trajectories - - 1000 + + Selected tracks + + + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + Tracing + + + + 2 + + + 5 + + + 5 + + + 5 + + + 5 + + + + + Set the tracer type + + + + 3 + + + 3 + + + 3 + + + 3 + + + 3 + - - - Set the dimensions of all tracks back to default - + - Default dimensions + Type: - - - Qt::Horizontal + + + Choose the tracing type + + No tracing + + + + No tracing + + + + + Shape + + + + + Path + + + + + Arrow path + + + + + + + + + Set the number of frames to trace + + + + 3 + + + 3 + + + 3 + + + 3 + + + 3 + - - - true + + + History frames: + + + + - Show the orientation line for entities + Set how many frames to trace - - Show orientation line - - + false + + QAbstractSpinBox::PlusMinus + + + 1 + + + 1000000 + + + 10 + + + + + + + + Set the step size to show each Xth tracer (e.g. 5 means show each 5th tracer) + + + + 3 + + + 3 + + + 3 + + + 3 + + + 3 + - - - true - - - Set entities are not scaling when zooming - + - Always same size + Steps: - + - Show the id in the entity + Set the steps to trace (each one, each second,...) - - Show track ID + + QAbstractSpinBox::PlusMinus + + + 1 + + + 1 @@ -594,283 +981,91 @@ - - - - 0 - 0 - - - - - 0 - 0 - - - - Color + + + Set the time degradation type - + - 2 + 3 - 5 + 3 - 5 + 3 - 5 + 3 - 5 + 3 - - - - - Fill: - - - - - - - Choose a fill color for all trajectories - - - All tracks - - - - - - - Choose a fill color for selected trajectories - - - Selected tracks - - - - + + + Time degradation: + + - + + + Choose the gradient style (old to young) + - - - Border: - - + + None + - - - Choose a border color for all trajectories - - - All tracks - - + + Transparency + - - - Choose a border color for selected trajectories - - - Selected tracks - - + + False color + - + - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - Tracing - - - - 2 - - - 5 - - - 5 - - - 5 - - - 5 - - - - - - - Style: - - - - - - - Choose the tracing style - - - - None - - - - - Shape - - - - - Path - - - - - ArrowPath - - - - - - - - - - - - History frames: - - - - - - - Set how many frames to trace - - - false - - - QAbstractSpinBox::PlusMinus - - - 1 - - - 1000000 - - - 10 - - - - - - - - - - Steps: - - - - - - - Set the steps to trace (each one, each second,...) - - - QAbstractSpinBox::PlusMinus - - - 1 - - - 1 - - - - - - - - - - - Time degradation: - - - - - - - Choose the gradient style (old to young) - - - - None - - - - - Transparency + + + Show the frame number of each tracer + + + + 3 + + + 3 + + + 3 + + + 3 + + + 3 + + + + + Show frame number of each tracer - - - False color + Show frame number - - - - - - - - - - - Show frame number of each tracer - - - Show frame number - - - - + + + + @@ -901,6 +1096,9 @@ + + Set the tracer dimensions proportional to entity dimensions + 0 @@ -919,6 +1117,21 @@ + + 3 + + + 3 + + + 3 + + + 3 + + + 3 + @@ -929,7 +1142,7 @@ - Set the tracer dimensions according to entity dimensions + Set the tracer dimensions proportional to entity dimensions 2 @@ -953,7 +1166,7 @@ - Show the orientation lne for tracers + Show the orientation line for tracers Show orientation line @@ -964,9 +1177,12 @@ + widgetTracingSteps + widgetTracingTime + widgetTracerFrameNumber groupBoxTracerDimensions - - + widgetTracingType + widgetTracingHistory @@ -1014,6 +1230,21 @@ Set the area dimensions (in cm) + + 3 + + + 3 + + + 3 + + + 3 + + + 3 + @@ -1250,153 +1481,172 @@ - - - - - - 0 - 0 - - - - - 70 - 0 - - - - - 50 - 16777215 - - - - The trajectory number under which data (tracks, videos, ...) will be saved. + + + The trajectory number under which data (tracks, videos, ...) will be saved. Increments automatically after finalizing. Resets when removing the tracks from the "Tracks" folder. - - - Trial No. - - - - - - - - 0 - 0 - - - - The trajectory number under which data (tracks, videos, ...) will be saved. + + + + + + + 0 + 0 + + + + + 70 + 0 + + + + + 50 + 16777215 + + + + The trajectory number under which data (tracks, videos, ...) will be saved. Increments automatically after finalizing. Resets when removing the tracks from the "Tracks" folder. - - - ### - - - - + + + Trial No. + + + + + + + + 0 + 0 + + + + The trajectory number under which data (tracks, videos, ...) will be saved. +Increments automatically after finalizing. +Resets when removing the tracks from the "Tracks" folder. + + + ### + + + + + - - - - - - 0 - 0 - - - - - 70 - 0 - - - - - 50 - 16777215 - - - - Source of the video data. + + + Source of the video data. Select a source in the "File" menu. - - - Source: - - - - - - - - 0 - 0 - - - - Source of the video data. + + + + + + + 0 + 0 + + + + + 70 + 0 + + + + + 50 + 16777215 + + + + Source of the video data. Select a source in the "File" menu. - - - No Media - - - true - - - - + + + Source: + + + + + + + + 0 + 0 + + + + Source of the video data. +Select a source in the "File" menu. + + + No Media + + + true + + + + + - - - - - - 70 - 0 - - - - - 50 - 16777215 - - - - Number of objects being tracked in a video. + + + Number of objects being tracked in a video. You can add some by right-clicking the video (if loaded). - - - Objects: - - - - - - - - 0 - 0 - - - - Number of objects being tracked in a video. + + + + + + + 70 + 0 + + + + + 50 + 16777215 + + + + Number of objects being tracked in a video. You can add some by right-clicking the video (if loaded). - - - ### - - - - + + + Objects: + + + + + + + + 0 + 0 + + + + Number of objects being tracked in a video. +You can add some by right-clicking the video (if loaded). + + + ### + + + + + @@ -1414,6 +1664,13 @@ If results are questionable, mediate the selection of tracker + + + + Qt::Horizontal + + + diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp index 19258437..b142e5c8 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp @@ -310,8 +310,25 @@ void MainWindow::addNotificationBrowser(IView * notificationBrowser) void MainWindow::addTrackerParameterView(IView *parameter) { QWidget* pluginParameter = dynamic_cast(parameter); - ui->trackerOptions->layout()->removeItem(ui->trackerOptions->layout()->takeAt(0)); - ui->trackerOptions->layout()->addWidget(pluginParameter); + //ui->trackerOptions->layout()->removeItem(ui->trackerOptions->layout()->takeAt(0)); + // for (auto widget: ui->trackerOptions->findChildren("",Qt::FindDirectChildrenOnly)){ + // delete widget; + //} + + // while(auto item = ui->trackerOptions->layout()->takeAt(0)){ + // delete item->widget(); + // } + + // if(_currentTrackerP){ + // _currentTrackerP->deleteLater(); + // } + // _currentTrackerP = pluginParameter; + + if(pluginParameter){ + ui->trackerOptions->layout()->addWidget(pluginParameter); + } + + //ui->toolBox->addItem(pluginParameter, "bla"); } void MainWindow::addCoreParameterView(IView * coreParameterView) diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.h b/BioTracker/CoreApp/BioTracker/View/MainWindow.h index 6042a523..2caccfac 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.h +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.h @@ -153,6 +153,8 @@ class MainWindow : public IViewMainWindow { QGroupBox* _mediaBox; QGroupBox* _trackerBox; + + QWidget* _currentTrackerP; }; #endif // BIOTRACKER3MAINWINDOW_H diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.ui b/BioTracker/CoreApp/BioTracker/View/MainWindow.ui index 81ee404a..2bb5bd52 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.ui +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.ui @@ -178,6 +178,9 @@ + + Hide the slider + 0 @@ -423,6 +426,9 @@ 0 + + Choose your visualization options + QFrame::NoFrame @@ -430,14 +436,14 @@ 1 - 0 + 4 0 0 - 497 + 558 294 @@ -447,6 +453,9 @@ 0 + + Manage your experiment + Experiment @@ -457,12 +466,12 @@ 0 0 - 497 + 558 294 - SetPreferences for tracker and visualization + Set preferences for visualization Visualization options @@ -503,10 +512,13 @@ 0 0 - 497 + 558 294 + + Set preferences for the current tracker + Tracker options @@ -526,6 +538,9 @@ 0 + + + @@ -533,10 +548,13 @@ 0 0 - 497 + 558 294 + + A short stepwise tutorial + How to use BioTracker @@ -616,10 +634,13 @@ p, li { white-space: pre-wrap; } 0 0 - 497 + 558 294 + + Displays the notifications of the tracker and main application + Notifications @@ -798,6 +819,9 @@ p, li { white-space: pre-wrap; } toolBar + + Tools for managing the basic functionalities + QGroupBox { border: 1px solid #e5e5e5; @@ -837,6 +861,9 @@ QToolButton { toolBar_2 + + Tools to manage the visualization and track properties + true @@ -873,6 +900,9 @@ QToolButton { toolBar + + Tools to manage the media properties and to show media info + true diff --git a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp b/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp index 122c6d96..f7e96e49 100644 --- a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp +++ b/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp @@ -97,30 +97,30 @@ void VideoControllWidget::getNotified() { } -void VideoControllWidget::on_button_nextFrame_clicked() { - ControllerPlayer* controller = dynamic_cast(getController()); - controller->nextFrame(); -} - -void VideoControllWidget::on_button_playPause_clicked() { - ControllerPlayer* controller = dynamic_cast(getController()); - - if (m_Paus) { - controller->pause(); - } else { - controller->play(); - } -} - -void VideoControllWidget::on_button_stop_clicked() { - ControllerPlayer* controller = dynamic_cast(getController()); - controller->stop(); -} - -void VideoControllWidget::on_button_previousFrame_clicked() { - ControllerPlayer* controller = dynamic_cast(getController()); - controller->prevFrame(); -} +// void VideoControllWidget::on_button_nextFrame_clicked() { +// ControllerPlayer* controller = dynamic_cast(getController()); +// controller->nextFrame(); +// } + +// void VideoControllWidget::on_button_playPause_clicked() { +// ControllerPlayer* controller = dynamic_cast(getController()); + +// if (m_Paus) { +// controller->pause(); +// } else { +// controller->play(); +// } +// } + +// void VideoControllWidget::on_button_stop_clicked() { +// ControllerPlayer* controller = dynamic_cast(getController()); +// controller->stop(); +// } + +// void VideoControllWidget::on_button_previousFrame_clicked() { +// ControllerPlayer* controller = dynamic_cast(getController()); +// controller->prevFrame(); +// } void VideoControllWidget::on_DurationChanged(int position) { @@ -131,34 +131,34 @@ void VideoControllWidget::on_PositionChanged(int position) { } -void VideoControllWidget::on_button_record_clicked() { - ControllerPlayer* controller = dynamic_cast(getController()); - - int success = controller->recordOutput(); - if (success == 1) { - QPixmap pix(":/Images/resources/recording.png"); - QIcon icon(pix); - ui->actionRecord_all->setIcon(icon); - //ui->actionRecord_all->setIconSize(QSize(32,32)); - } - else { - QPixmap pix(":/Images/resources/record.png"); - QIcon icon(pix); - ui->actionRecord_all->setIcon(icon); - //ui->actionRecord_all->setIconSize(QSize(32, 32)); - } -} - -void VideoControllWidget::on_button_record_cam_clicked() { - ControllerPlayer* controller = dynamic_cast(getController()); - - int success = controller->recordInput(); -} - -void VideoControllWidget::on_button_screenshot_clicked() { - ControllerPlayer* controller = dynamic_cast(getController()); - controller->takeScreenshot(); -} +// void VideoControllWidget::on_button_record_clicked() { +// ControllerPlayer* controller = dynamic_cast(getController()); + +// int success = controller->recordOutput(); +// if (success == 1) { +// QPixmap pix(":/Images/resources/recording.png"); +// QIcon icon(pix); +// ui->actionRecord_all->setIcon(icon); +// //ui->actionRecord_all->setIconSize(QSize(32,32)); +// } +// else { +// QPixmap pix(":/Images/resources/record.png"); +// QIcon icon(pix); +// ui->actionRecord_all->setIcon(icon); +// //ui->actionRecord_all->setIconSize(QSize(32, 32)); +// } +// } + +// void VideoControllWidget::on_button_record_cam_clicked() { +// ControllerPlayer* controller = dynamic_cast(getController()); + +// int success = controller->recordInput(); +// } + +// void VideoControllWidget::on_button_screenshot_clicked() { +// ControllerPlayer* controller = dynamic_cast(getController()); +// controller->takeScreenshot(); +// } void VideoControllWidget::on_comboBoxSelectedView_currentTextChanged(const QString& arg1) { /*QString name = arg1;*/ diff --git a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.h b/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.h index 0ea80b53..9d356a5b 100644 --- a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.h +++ b/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.h @@ -41,16 +41,16 @@ class VideoControllWidget : public IViewWidget { private Q_SLOTS: void on_DurationChanged(int position); void on_PositionChanged(int position); - void on_button_nextFrame_clicked(); - void on_button_playPause_clicked(); - void on_button_record_clicked(); - void on_button_record_cam_clicked(); + // void on_button_nextFrame_clicked(); + // void on_button_playPause_clicked(); + // void on_button_record_clicked(); + // void on_button_record_cam_clicked(); - void on_button_stop_clicked(); + // void on_button_stop_clicked(); - void on_button_screenshot_clicked(); + // void on_button_screenshot_clicked(); - void on_button_previousFrame_clicked(); + // void on_button_previousFrame_clicked(); void on_comboBoxSelectedView_currentTextChanged(const QString& arg1); @@ -89,7 +89,7 @@ class VideoControllWidget : public IViewWidget { QAction* action_prev_frame; QAction* action_rec_cam; QAction* action_rec; - + std::chrono::system_clock::time_point lastFpsSet; }; From 0d3d95b769467728b0fa8f6fcb81c2c5dd5e0d98 Mon Sep 17 00:00:00 2001 From: jonas Date: Thu, 8 Mar 2018 15:38:23 +0100 Subject: [PATCH 005/171] added messagebox when screenshot is taken --- .gitignore | 3 ++- .../CoreApp/BioTracker/Controller/ControllerPlayer.cpp | 2 +- .../CoreApp/BioTracker/Controller/ControllerPlayer.h | 2 +- BioTracker/CoreApp/BioTracker/Model/MediaPlayer.cpp | 8 ++++++-- BioTracker/CoreApp/BioTracker/Model/MediaPlayer.h | 6 +++--- BioTracker/CoreApp/BioTracker/View/GraphicsView.cpp | 2 -- BioTracker/CoreApp/BioTracker/View/MainWindow.cpp | 1 + BioTracker/CoreApp/BioTracker/View/MainWindow.ui | 2 +- .../CoreApp/BioTracker/View/VideoControllWidget.cpp | 8 +++++++- 9 files changed, 22 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index a28a6d99..99850f96 100644 --- a/.gitignore +++ b/.gitignore @@ -105,6 +105,7 @@ CMakeFiles /BioTracker/CoreApp/BioTracker/debug/placeholder /BioTracker/CoreApp/BioTracker/ui_SettingsWindow.h /BioTracker/CoreApp/BioTracker/Tracks +/BioTracker/CoreApp/BioTracker/Screenshots /BioTracker/CoreApp/BioTracker/BSTrackerConfig.ini /BioTracker/CoreApp/BioTracker/Biotracker_core_autogen/EWIEGA46WW/qrc_guiresources.cpp /BioTracker/Plugin/Sample/x64/Debug/Sample.tracker_autogen/*.cache @@ -125,4 +126,4 @@ CMakeFiles .vscode/c_cpp_properties.json .vscode/c_cpp_properties.json .vscode/c_cpp_properties.json -Screenshots/ScreenshotThu_Feb_22_17_41_24_2018.png +/Screenshots diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerPlayer.cpp b/BioTracker/CoreApp/BioTracker/Controller/ControllerPlayer.cpp index f384093c..5cbdff27 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerPlayer.cpp +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerPlayer.cpp @@ -97,7 +97,7 @@ void ControllerPlayer::setTargetFps(double fps) { return qobject_cast(m_Model)->setTargetFPS(fps); } -void ControllerPlayer::takeScreenshot() { +QString ControllerPlayer::takeScreenshot() { IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::GRAPHICSVIEW); QPointer< ControllerGraphicScene > ctrTextureObject = qobject_cast(ctr); return qobject_cast(m_Model)->takeScreenshot(dynamic_cast(ctrTextureObject->getView())); diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerPlayer.h b/BioTracker/CoreApp/BioTracker/Controller/ControllerPlayer.h index 9fb79c88..833853b7 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerPlayer.h +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerPlayer.h @@ -81,7 +81,7 @@ class ControllerPlayer : public IController { void setTargetFps(double fps); - void takeScreenshot(); + QString takeScreenshot(); // IController interface public: diff --git a/BioTracker/CoreApp/BioTracker/Model/MediaPlayer.cpp b/BioTracker/CoreApp/BioTracker/Model/MediaPlayer.cpp index 1cb82e4a..6985a67e 100644 --- a/BioTracker/CoreApp/BioTracker/Model/MediaPlayer.cpp +++ b/BioTracker/CoreApp/BioTracker/Model/MediaPlayer.cpp @@ -187,7 +187,7 @@ int MediaPlayer::reopenVideoWriter() { return m_recd; } -void MediaPlayer::takeScreenshot(GraphicsView *gv) { +QString MediaPlayer::takeScreenshot(GraphicsView *gv) { //TODO duplicated code QRectF rscene = gv->sceneRect(); //0us QRectF rview = gv->rect(); //0us @@ -206,7 +206,11 @@ void MediaPlayer::takeScreenshot(GraphicsView *gv) { QImage image = pix->toImage(); //8724us - image.save(getTimeAndDate(CFG_DIR_SCREENSHOTS+std::string("/Screenshot"), ".png").c_str()); + QString filePath = getTimeAndDate(CFG_DIR_SCREENSHOTS+std::string("/Screenshot"), ".png").c_str(); + + image.save(filePath); + + return filePath; } void MediaPlayer::receiveTrackingPaused() { diff --git a/BioTracker/CoreApp/BioTracker/Model/MediaPlayer.h b/BioTracker/CoreApp/BioTracker/Model/MediaPlayer.h index ccb6e180..ec0e18ff 100644 --- a/BioTracker/CoreApp/BioTracker/Model/MediaPlayer.h +++ b/BioTracker/CoreApp/BioTracker/Model/MediaPlayer.h @@ -121,7 +121,7 @@ class MediaPlayer : public IModel { QString getCurrentFileName(); std::shared_ptr getCurrentFrame(); - void takeScreenshot(GraphicsView *gv); + QString takeScreenshot(GraphicsView *gv); public Q_SLOTS: /** @@ -145,8 +145,8 @@ class MediaPlayer : public IModel { */ void receiveTrackingPaused(); - /** - * Catches the pause state from the controller. + /** + * Catches the pause state from the controller. * This will automatically wrap all cases of "stop" semantics. * We do this although the info is basically passed implicitly via other commands, because it's easier */ diff --git a/BioTracker/CoreApp/BioTracker/View/GraphicsView.cpp b/BioTracker/CoreApp/BioTracker/View/GraphicsView.cpp index 2ae2d4af..f9946df3 100644 --- a/BioTracker/CoreApp/BioTracker/View/GraphicsView.cpp +++ b/BioTracker/CoreApp/BioTracker/View/GraphicsView.cpp @@ -29,8 +29,6 @@ GraphicsView::GraphicsView(QWidget *parent, IController *controller, IModel *mod setViewportUpdateMode(FullViewportUpdate); setDragMode(RubberBandDrag); - - } void GraphicsView::addGraphicsItem(QGraphicsItem *item) diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp index b142e5c8..b2d378fb 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp @@ -25,6 +25,7 @@ #include "qdesktopwidget.h" #include "QToolButton" + #include "QDesktopServices" diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.ui b/BioTracker/CoreApp/BioTracker/View/MainWindow.ui index 2bb5bd52..73a5a88d 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.ui +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.ui @@ -436,7 +436,7 @@ 1 - 4 + 0 diff --git a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp b/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp index f7e96e49..dce9ec76 100644 --- a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp +++ b/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp @@ -4,6 +4,7 @@ #include "Model/MediaPlayer.h" #include +#include "QMessageBox" #include VideoControllWidget::VideoControllWidget(QWidget* parent, IController* controller, IModel* model) : @@ -217,7 +218,12 @@ void VideoControllWidget::on_actionPrev_frame_triggered(bool checked){ } void VideoControllWidget::on_actionScreenshot_triggered(bool checked){ ControllerPlayer* controller = dynamic_cast(getController()); - controller->takeScreenshot(); + QString filePathStr = controller->takeScreenshot(); + QFileInfo fi(filePathStr); + QString filePathAbs = fi.absoluteFilePath(); + QString msgText = "The Screenshot has been saved to:\n " + filePathAbs; + + QMessageBox::information(nullptr, "Screenshot taken!", msgText); } void VideoControllWidget::on_actionRecord_cam_triggered(bool checked){ ControllerPlayer* controller = dynamic_cast(getController()); From c06a27329c263a5a0b387d1e86805ab56a88d69d Mon Sep 17 00:00:00 2001 From: jonas Date: Thu, 8 Mar 2018 18:04:31 +0100 Subject: [PATCH 006/171] fixed entity deletion bug there are now always as many shapes as trajectories in root (valid and invalid) (each existng trajectory has a corresponding shape now) this means shapes are now only hidden, not deleted. --- .../BioTracker/View/ComponentShape.cpp | 29 ++++++--- .../BioTracker/View/TrackedComponentView.cpp | 59 +++++++++++++------ .../Controller/ControllerTrackedComponent.cpp | 2 +- 3 files changed, 61 insertions(+), 29 deletions(-) diff --git a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp index 538a9864..0a2bf0bc 100644 --- a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp +++ b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp @@ -194,7 +194,16 @@ bool ComponentShape::updateAttributes(uint frameNumber) { m_currentFramenumber = frameNumber; - if (m_trajectory && m_trajectory->size() != 0 && m_trajectory->getValid() && m_trajectory->getChild(frameNumber)) { + // if trajectory does not exist anymore, delete the shape + if(!m_trajectory){ + this->hide(); + m_tracingLayer->hide(); + this->deleteLater(); + return false; + } + + + if (m_trajectory->size() != 0 && m_trajectory->getValid() && m_trajectory->getChild(frameNumber)) { m_id = m_trajectory->getId(); //update m_fixed m_fixed = m_trajectory->getFixed(); @@ -278,7 +287,8 @@ bool ComponentShape::updateAttributes(uint frameNumber) return true; } else { - qDebug() << "no valid tracked component in this trajectory in frame: " << frameNumber; + //qDebug() << "no valid tracked component in this trajectory in frame: " << frameNumber; + this->hide(); return true; } // if polygon TODO @@ -298,7 +308,7 @@ bool ComponentShape::updateAttributes(uint frameNumber) //trajectory is empty or null or invald or current entity is null this->hide(); m_tracingLayer->hide(); - delete this; + //delete this; return false; } } @@ -321,15 +331,16 @@ void ComponentShape::trace() // really unefficient to flush each time //flush tracing shape history, open up the memory - while (m_tracingLayer->childItems().size() > 0) { - delete m_tracingLayer->childItems()[0]; - } + // while (m_tracingLayer->childItems().size() > 0) { + // delete m_tracingLayer->childItems()[0]; + // } //check if number of tracing children in tracing layer is correct //delete/add the difference - int initialSize = m_tracingLayer->childItems().size(); - while (m_tracingLayer->childItems().size() > 0) { - delete m_tracingLayer->childItems()[0]; + QList tracers = m_tracingLayer->childItems(); + foreach(QGraphicsItem * tracer, tracers) + { + delete tracer; } if (m_trajectory->size() == 0 || m_tracingLength <= 0 || m_tracingStyle == "No tracing") { diff --git a/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp b/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp index 989d06da..86c1f04c 100644 --- a/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp +++ b/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp @@ -168,35 +168,56 @@ void TrackedComponentView::updateShapes(uint framenumber) { m_currentFrameNumber = framenumber; IModelTrackedTrajectory *all = dynamic_cast(getModel()); - if (!all) + if (!all){ + //if root is nullptr, delete all children + foreach (auto child, this->childItems()){ + delete child; + } return; + } - //update each shape; shape deletes itself if trajectory is empty or not existant - for (int i = 0; i < this->childItems().size(); i++) { - ComponentShape* shape = dynamic_cast(this->childItems()[i]); - if (shape) { - if (!(shape->updateAttributes(framenumber))) { - i--; - } + //update each shape; shape hides itself if trajectory is empty or not existant or currentchild + foreach(auto child, this->childItems()){ + ComponentShape* shape = dynamic_cast(child); + if(shape){ + shape->updateAttributes(m_currentFrameNumber); } } // check for new trajectories; for each create a new shape //if #shapes smaller than #validtracks add new shapes - int validTracks = all->validCount(); - - if (this->childItems().size() < validTracks) { - int childrenCount = this->childItems().size(); - // iterate over trajectories form back to increase performance - for (int i = all->size()-1; i >= 0 && this->childItems().size() < validTracks; i--) { + //int validTracks = all->validCount(); + + // if (this->childItems().size() < validTracks) { + // int childrenCount = this->childItems().size(); + // // iterate over trajectories form back to increase performance + // for (int i = all->size()-1; i >= 0 && this->childItems().size() < validTracks; i--) { + // IModelTrackedTrajectory* trajectory = dynamic_cast(all->getChild(i)); + // //trajectory must not be null, must be valid, and must not be already visualized + // if (trajectory && trajectory->getValid() && !checkTrajectory(trajectory)) { + // ComponentShape* newShape = new ComponentShape(this, trajectory, trajectory->getId()); + // connectShape(newShape); + // } + // else { + // //qDebug() << "error: no trajectory valid -> no shape created"; + // } + // } + // } + + if (this->childItems().size() < all->size()){ + //iterate over trajectories form back to increase performance + for (int i = all->size()-1; i >= 0 && this->childItems().size() < all->size(); i--) { IModelTrackedTrajectory* trajectory = dynamic_cast(all->getChild(i)); - //trajectory must not be null, must be valid, and must not be already visualized - if (trajectory && trajectory->getValid() && !checkTrajectory(trajectory)) { + if(trajectory && !checkTrajectory(trajectory)){ ComponentShape* newShape = new ComponentShape(this, trajectory, trajectory->getId()); - connectShape(newShape); + connectShape(newShape); + } + else{ + //already there or nullptr } - else { - //qDebug() << "error: no trajectory valid -> no shape created"; + //all trajectories already have shapes + if(all->size() == this->childItems().size()){ + continue; } } } diff --git a/BioTracker/Plugin/BackgroundSubtraction/Controller/ControllerTrackedComponent.cpp b/BioTracker/Plugin/BackgroundSubtraction/Controller/ControllerTrackedComponent.cpp index 415399b7..f35ba46b 100644 --- a/BioTracker/Plugin/BackgroundSubtraction/Controller/ControllerTrackedComponent.cpp +++ b/BioTracker/Plugin/BackgroundSubtraction/Controller/ControllerTrackedComponent.cpp @@ -75,7 +75,7 @@ void ControllerTrackedComponent::receiveValidateEntity(IModelTrackedTrajectory * void ControllerTrackedComponent::receiveRemoveTrackEntity(IModelTrackedTrajectory * trajectory, uint frameNumber) { trajectory->getChild(frameNumber)->setValid(false); - qDebug() << "track " << trajectory->getId() << " entity #" << frameNumber << "set invalid"; + qDebug() << "Track " << trajectory->getId() << " entity #" << frameNumber << "deleted (set invalid)"; } void ControllerTrackedComponent::receiveAddTrajectory(QPoint position) From e89c4941261d540bd24490fc3119a648f50601bd Mon Sep 17 00:00:00 2001 From: jonas Date: Wed, 14 Mar 2018 16:28:38 +0100 Subject: [PATCH 007/171] added introduction wizard added window icon for windows os renamed finalize trial button to save trial and reset data --- .../BioTracker/View/CoreParameterView.ui | 8 +- .../CoreApp/BioTracker/View/MainWindow.cpp | 310 +++++++++++++++++- .../CoreApp/BioTracker/View/MainWindow.h | 10 + .../CoreApp/BioTracker/View/MainWindow.ui | 18 +- .../CoreApp/BioTracker/guiresources.qrc | 36 +- .../resources/introduction/context_menus.txt | 4 + .../introduction/images/BioTracker.PNG | Bin 0 -> 1006945 bytes .../introduction/images/context_entity.png | Bin 0 -> 41908 bytes .../introduction/images/context_video.png | Bin 0 -> 84746 bytes .../introduction/images/right_panel.png | Bin 0 -> 37775 bytes .../introduction/images/toolbars.png | Bin 0 -> 42859 bytes .../introduction/images/tracking.png | Bin 0 -> 829202 bytes .../resources/introduction/intro.txt | 4 + .../resources/introduction/right_panel.txt | 8 + .../resources/introduction/toolbars.txt | 11 + .../resources/introduction/tracking.txt | 11 + .../BioTracker/resources/logo/firstlogo.ico | Bin 0 -> 102277 bytes .../BioTracker/resources/logo/firstlogo.png | Bin 0 -> 6817 bytes 18 files changed, 397 insertions(+), 23 deletions(-) create mode 100644 BioTracker/CoreApp/BioTracker/resources/introduction/context_menus.txt create mode 100644 BioTracker/CoreApp/BioTracker/resources/introduction/images/BioTracker.PNG create mode 100644 BioTracker/CoreApp/BioTracker/resources/introduction/images/context_entity.png create mode 100644 BioTracker/CoreApp/BioTracker/resources/introduction/images/context_video.png create mode 100644 BioTracker/CoreApp/BioTracker/resources/introduction/images/right_panel.png create mode 100644 BioTracker/CoreApp/BioTracker/resources/introduction/images/toolbars.png create mode 100644 BioTracker/CoreApp/BioTracker/resources/introduction/images/tracking.png create mode 100644 BioTracker/CoreApp/BioTracker/resources/introduction/intro.txt create mode 100644 BioTracker/CoreApp/BioTracker/resources/introduction/right_panel.txt create mode 100644 BioTracker/CoreApp/BioTracker/resources/introduction/toolbars.txt create mode 100644 BioTracker/CoreApp/BioTracker/resources/introduction/tracking.txt create mode 100644 BioTracker/CoreApp/BioTracker/resources/logo/firstlogo.ico create mode 100644 BioTracker/CoreApp/BioTracker/resources/logo/firstlogo.png diff --git a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui index 3ad51497..bf484b56 100644 --- a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui +++ b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui @@ -155,8 +155,8 @@ 0 - -103 - 351 + 0 + 344 935 @@ -1653,7 +1653,7 @@ You can add some by right-clicking the video (if loaded). - Starts tracking the video or stop tracking respectively. + Starts tracking the video or pause tracking respectively. If results are questionable, mediate the selection of tracker (drop down menu at the top) and the tracker parameters ("Tracker" tab) @@ -1682,7 +1682,7 @@ but also write back the data to the "Tracks" directory and increment the trial count. - Finalize Trial + Save Trial and Reset Data diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp index b2d378fb..61fbfb32 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp @@ -25,8 +25,13 @@ #include "qdesktopwidget.h" #include "QToolButton" +#include "QWizard" +#include "QWizardPage" #include "QDesktopServices" +#include "util/singleton.h" +#include "settings/Settings.h" + @@ -60,6 +65,10 @@ MainWindow::MainWindow(QWidget* parent, IController* controller, IModel* model) //QWidget::showFullScreen(); QWidget::showMaximized(); + createIntroductionWizard(); + + QApplication::setWindowIcon(QIcon(":/Logo/resources/logo/firstlogo.ico")); + //view actions //QAction* dockWidgetHider = ui->dockWidgetAlgorithm->toggleViewAction(); //dockWidgetHider->setText(ui->dockWidgetAlgorithm->isVisible()?"Hide right panel":"Show right panel"); @@ -235,10 +244,280 @@ void MainWindow::checkMediaGroupBox(){ " {border: 1px solid #82c985;}"); } -void MainWindow::setupVideoToolBar() { +void MainWindow::setupVideoToolBar(){ } +//TODO put this in a class +void MainWindow::createIntroductionWizard(){ + m_introWiz = new QWizard; + + //BioTracker::Core::Settings *disableIntroWiz = GET_CORESETTINGS(CORE_CONFIGURATION); + BioTracker::Core::Settings *set = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); + bool disabled = set->getValueOrDefault("BiotrackerCore/Disable_Wizard", false); + + //dont show again checkbox + QCheckBox* noShowCheck = new QCheckBox("Don't show this again"); + noShowCheck->setChecked(disabled); + QObject::connect(noShowCheck, &QCheckBox::toggled, this, &MainWindow::toggleNoShowWiz); + + + //intrduction + QWizardPage* p1 = new QWizardPage; + { + p1->setTitle("BioTracker 3 - Introduction"); + + QPixmap logoImg(":/Logo/resources/logo/firstlogo.png"); + QPixmap scaledImg = logoImg.scaled(QSize(600,400),Qt::KeepAspectRatio, Qt::SmoothTransformation); + + QLabel* imgLabel = new QLabel; + imgLabel->setPixmap(scaledImg); + imgLabel->setAttribute(Qt::WA_TranslucentBackground); + imgLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + + + QFile file(":/Introduction/resources/introduction/intro.txt"); + QLabel *introLabel= new QLabel; + + //read introduction text from file + QString line; + if (file.open(QIODevice::ReadOnly | QIODevice::Text)){ + QTextStream stream(&file); + while (!stream.atEnd()){ + line.append(stream.readLine()+"\n"); + } + introLabel->setText(line); + } + file.close(); + + QVBoxLayout *layout = new QVBoxLayout; + layout->addWidget(imgLabel); + QScrollArea* textScroll = new QScrollArea; + textScroll->setFrameShape(QFrame::NoFrame); + textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + textScroll->setWidget(introLabel); + layout->addWidget(textScroll); + layout->setAlignment(Qt::AlignHCenter); + p1->setLayout(layout); + + } + + //overview + QWizardPage* p2 = new QWizardPage; + { + p2->setTitle("BioTracker 3 - Overview"); + QLabel *label = new QLabel("This is the BioTracker. Don't let yourself be overwhelmed it is actually pretty simple."); + label->setWordWrap(true); + + QPixmap overviewImg(":/Introduction/resources/introduction/images/BioTracker.PNG"); + QPixmap scaledImg = overviewImg.scaled(QSize(600,400),Qt::KeepAspectRatio, Qt::SmoothTransformation); + + QLabel* imgLabel = new QLabel; + imgLabel->setPixmap(scaledImg); + imgLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + //imgLabel->setScaledContents(true); + + QVBoxLayout *layout = new QVBoxLayout; + layout->addWidget(imgLabel); + QScrollArea* textScroll = new QScrollArea; + textScroll->setFrameShape(QFrame::NoFrame); + textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + textScroll->setWidget(label); + layout->addWidget(textScroll); + layout->setAlignment(Qt::AlignHCenter); + p2->setLayout(layout); + } + + //toolbars + QWizardPage* p3 = new QWizardPage; + { + p3->setTitle("BioTracker 3 - Toolbars"); + + //image + QPixmap overviewImg(":/Introduction/resources/introduction/images/toolbars.png"); + QPixmap scaledImg = overviewImg.scaled(QSize(600,400),Qt::KeepAspectRatio, Qt::SmoothTransformation); + QLabel* imgLabel = new QLabel; + imgLabel->setPixmap(scaledImg); + + //read toolbar text from file + QFile file(":/Introduction/resources/introduction/toolbars.txt"); + QLabel *label = new QLabel(); + label->setWordWrap(true); + + QString line; + if (file.open(QIODevice::ReadOnly | QIODevice::Text)){ + QTextStream stream(&file); + while (!stream.atEnd()){ + line.append(stream.readLine()+"\n"); + } + label->setText(line); + } + file.close(); + + + QVBoxLayout *layout = new QVBoxLayout; + layout->addWidget(imgLabel); + QScrollArea* textScroll = new QScrollArea; + textScroll->setFrameShape(QFrame::NoFrame); + textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + textScroll->setWidget(label); + layout->addWidget(textScroll); + layout->setAlignment(Qt::AlignHCenter); + p3->setLayout(layout); + } + + + //right panel - overview + QWizardPage* p4 = new QWizardPage; + { + p4->setTitle("BioTracker 3 - Right panel overview"); + + //image + QPixmap overviewImg(":/Introduction/resources/introduction/images/right_panel.png"); + QPixmap scaledImg = overviewImg.scaled(QSize(600,400),Qt::KeepAspectRatio, Qt::SmoothTransformation); + QLabel* imgLabel = new QLabel; + imgLabel->setPixmap(scaledImg); + + //read right panel text from file + QFile file(":/Introduction/resources/introduction/right_panel.txt"); + QLabel *label = new QLabel(); + label->setWordWrap(true); + + QString line; + if (file.open(QIODevice::ReadOnly | QIODevice::Text)){ + QTextStream stream(&file); + while (!stream.atEnd()){ + line.append(stream.readLine()+"\n"); + } + label->setText(line); + } + file.close(); + + + QVBoxLayout *layout = new QVBoxLayout; + layout->addWidget(imgLabel); + QScrollArea* textScroll = new QScrollArea; + textScroll->setFrameShape(QFrame::NoFrame); + textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + textScroll->setWidget(label); + layout->addWidget(textScroll); + layout->setAlignment(Qt::AlignHCenter); + + p4->setLayout(layout); + } + + + //how to track + QWizardPage* p5 = new QWizardPage; + { + p5->setTitle("BioTracker 3 - Tracking"); + + //image + QPixmap overviewImg(":/Introduction/resources/introduction/images/tracking.png"); + QPixmap scaledImg = overviewImg.scaled(QSize(600,400),Qt::KeepAspectRatio, Qt::SmoothTransformation); + QLabel* imgLabel = new QLabel; + imgLabel->setPixmap(scaledImg); + + //read tracking text from file + QFile file(":/Introduction/resources/introduction/tracking.txt"); + QLabel *label = new QLabel(); + label->setWordWrap(true); + + QString line; + if (file.open(QIODevice::ReadOnly | QIODevice::Text)){ + QTextStream stream(&file); + while (!stream.atEnd()){ + line.append(stream.readLine()+"\n"); + } + label->setText(line); + } + file.close(); + + + QVBoxLayout *layout = new QVBoxLayout; + layout->addWidget(imgLabel); + QScrollArea* textScroll = new QScrollArea; + textScroll->setFrameShape(QFrame::NoFrame); + textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + textScroll->setWidget(label); + layout->addWidget(textScroll); + layout->setAlignment(Qt::AlignHCenter); + + p5->setLayout(layout); + } + + //context menus + QWizardPage* p6 = new QWizardPage; + { + p6->setTitle("BioTracker 3 - Context menus"); + + //images + QPixmap contextEntityImg(":/Introduction/resources/introduction/images/context_entity.png"); + QPixmap scaledImg1 = contextEntityImg.scaled(QSize(300,400),Qt::KeepAspectRatio, Qt::SmoothTransformation); + QLabel* imgEntityLabel = new QLabel; + imgEntityLabel->setPixmap(scaledImg1); + + QPixmap contextVideoImg(":/Introduction/resources/introduction/images/context_video.png"); + QPixmap scaledImg2 = contextVideoImg.scaled(QSize(300,400),Qt::KeepAspectRatio, Qt::SmoothTransformation); + QLabel* imgVideoLabel = new QLabel; + imgVideoLabel->setPixmap(scaledImg2); + + //read tracking text from file + QFile file(":/Introduction/resources/introduction/context_menus.txt"); + QLabel *label = new QLabel(); + label->setWordWrap(true); + + QString line; + if (file.open(QIODevice::ReadOnly | QIODevice::Text)){ + QTextStream stream(&file); + while (!stream.atEnd()){ + line.append(stream.readLine()+"\n"); + } + label->setText(line); + } + file.close(); + + + QVBoxLayout *outerLayout = new QVBoxLayout; + QHBoxLayout *imgLayout = new QHBoxLayout; + imgLayout->addWidget(imgEntityLabel); + imgLayout->addWidget(imgVideoLabel); + QFrame* imgFrame = new QFrame; + imgFrame->setFrameStyle(QFrame::Panel | QFrame::Sunken); + imgFrame->setLayout(imgLayout); + + outerLayout->addWidget(imgFrame); + QScrollArea* textScroll = new QScrollArea; + textScroll->setFrameShape(QFrame::NoFrame); + textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + textScroll->setWidget(label); + outerLayout->addWidget(textScroll); + outerLayout->addWidget(noShowCheck); + + outerLayout->setAlignment(Qt::AlignHCenter); + + p6->setLayout(outerLayout); + } + + + m_introWiz->addPage(p1); + m_introWiz->addPage(p2); + m_introWiz->addPage(p3); + m_introWiz->addPage(p4); + m_introWiz->addPage(p5); + m_introWiz->addPage(p6); + //m_introWiz->addPage(p7); + + + m_introWiz->setWindowTitle("Introduction"); + if(!disabled){ + QRect rec = QApplication::desktop()->availableGeometry(); + m_introWiz->resize(m_introWiz->width(), rec.height()); + m_introWiz->show(); + //m_introWiz->showMaximized(); + } +} + void MainWindow::setCorePermission(std::pair permission){ if (permission.first == ENUMS::COREPERMISSIONS::COMPONENTADD) { ui->actionAdd_Track->setEnabled(permission.second); @@ -306,6 +585,8 @@ void MainWindow::addNotificationBrowser(IView * notificationBrowser) notificationWidget->setVisible(1); } + + //createIntroductionWizard(); } void MainWindow::addTrackerParameterView(IView *parameter) @@ -316,18 +597,18 @@ void MainWindow::addTrackerParameterView(IView *parameter) // delete widget; //} - // while(auto item = ui->trackerOptions->layout()->takeAt(0)){ - // delete item->widget(); - // } + while(auto item = ui->trackerOptions->layout()->takeAt(0)){ + delete item->widget(); + } // if(_currentTrackerP){ // _currentTrackerP->deleteLater(); // } // _currentTrackerP = pluginParameter; - if(pluginParameter){ - ui->trackerOptions->layout()->addWidget(pluginParameter); - } + // if(pluginParameter){ + ui->trackerOptions->layout()->addWidget(pluginParameter); + // } //ui->toolBox->addItem(pluginParameter, "bla"); } @@ -410,6 +691,17 @@ void MainWindow::deactivateTrackingCheckBox() { _trackerActivator->setEnabled(false); } + +//SLOTS + +void MainWindow::toggleNoShowWiz(bool toggle){ + //qDebug() << toggle; + //BioTracker::Core::Settings *disableIntroWiz = GET_CORESETTINGS(CORE_CONFIGURATION); + BioTracker::Core::Settings *disableIntroWiz = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); + disableIntroWiz->setParam("BiotrackerCore/Disable_Wizard", toggle); +} + + void MainWindow::on_actionOpen_Video_triggered() { static const QString videoFilter("Video files (*.avi *.wmv *.mp4 *.mkv *.mov)"); @@ -782,6 +1074,10 @@ void MainWindow::on_actionShortcuts_triggered() { } +void MainWindow::on_actionShow_introduction_triggered(){ + m_introWiz->show(); +} + ///////////// void MainWindow::closeEvent(QCloseEvent *event) { qobject_cast (getController())->exit(); diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.h b/BioTracker/CoreApp/BioTracker/View/MainWindow.h index 2caccfac..78bd1ea7 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.h +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.h @@ -14,6 +14,7 @@ #include "util/types.h" #include "SettingsWindow.h" #include +#include "QWizard" #include "Utility/SwitchButton.h" @@ -49,6 +50,10 @@ class MainWindow : public IViewMainWindow { void setupUpperToolBar(); void setupVideoToolBar(); + + //intro wizard + void createIntroductionWizard(); + void checkTrackerGroupBox(); void checkMediaGroupBox(); void activateTracking(); @@ -61,6 +66,9 @@ class MainWindow : public IViewMainWindow { void selectPlugin(QString ct); private Q_SLOTS: + + void toggleNoShowWiz(bool toggle); + //menu->File void on_actionOpen_Video_triggered(); @@ -115,6 +123,7 @@ class MainWindow : public IViewMainWindow { void on_actionUser_guide_triggered(); + void on_actionShow_introduction_triggered(); //GUI void receiveSelectedCameraDevice(CameraConfiguration conf); @@ -155,6 +164,7 @@ class MainWindow : public IViewMainWindow { QGroupBox* _trackerBox; QWidget* _currentTrackerP; + QWizard* m_introWiz; }; #endif // BIOTRACKER3MAINWINDOW_H diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.ui b/BioTracker/CoreApp/BioTracker/View/MainWindow.ui index 73a5a88d..5557e6e7 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.ui +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.ui @@ -234,7 +234,7 @@ true - + 0 100 @@ -443,7 +443,7 @@ 0 0 - 558 + 565 294 @@ -466,7 +466,7 @@ 0 0 - 558 + 565 294 @@ -512,7 +512,7 @@ 0 0 - 558 + 565 294 @@ -548,7 +548,7 @@ 0 0 - 558 + 565 294 @@ -634,7 +634,7 @@ p, li { white-space: pre-wrap; } 0 0 - 558 + 565 294 @@ -739,6 +739,7 @@ p, li { white-space: pre-wrap; } + @@ -1300,6 +1301,11 @@ QToolButton { Hide video toolbar + + + Show introduction + + diff --git a/BioTracker/CoreApp/BioTracker/guiresources.qrc b/BioTracker/CoreApp/BioTracker/guiresources.qrc index 5efeeb9a..ffa52c6c 100644 --- a/BioTracker/CoreApp/BioTracker/guiresources.qrc +++ b/BioTracker/CoreApp/BioTracker/guiresources.qrc @@ -27,11 +27,35 @@ resources/left_toolbar/anno-rect.png resources/left_toolbar/anno-del.png resources/left_toolbar/add-track.png - resources/left_toolbar/color-border.png - resources/left_toolbar/color-fill.png - resources/left_toolbar/delete-track.png - resources/left_toolbar/select-all.png - resources/left_toolbar/swap.png - + resources/left_toolbar/color-border.png + resources/left_toolbar/color-fill.png + resources/left_toolbar/delete-track.png + resources/left_toolbar/select-all.png + resources/left_toolbar/swap.png + + + + + + resources/introduction/intro.txt + resources/introduction/images/BioTracker.PNG + resources/introduction/toolbars.txt + resources/introduction/images/toolbars.png + resources/introduction/right_panel.txt + resources/introduction/images/right_panel.png + resources/introduction/tracking.txt + resources/introduction/images/tracking.png + resources/introduction/context_menus.txt + resources/introduction/images/context_video.png + resources/introduction/images/context_entity.png + + + + + + + resources/logo/firstlogo.png + resources/logo/firstlogo.ico + diff --git a/BioTracker/CoreApp/BioTracker/resources/introduction/context_menus.txt b/BioTracker/CoreApp/BioTracker/resources/introduction/context_menus.txt new file mode 100644 index 00000000..0d4123f4 --- /dev/null +++ b/BioTracker/CoreApp/BioTracker/resources/introduction/context_menus.txt @@ -0,0 +1,4 @@ +Both the video and each entity can be right-clicked to open a context menu. + +Please keep this in mind as many functionalities are in these context menues! + diff --git a/BioTracker/CoreApp/BioTracker/resources/introduction/images/BioTracker.PNG b/BioTracker/CoreApp/BioTracker/resources/introduction/images/BioTracker.PNG new file mode 100644 index 0000000000000000000000000000000000000000..62e6f7e5470e7c385840ece26ac2c54513d28f64 GIT binary patch literal 1006945 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

@ZIeG*=@B|?SJN(wTYI2I#^W^g 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

ReI_M~bF*FqhNMbVKOIwkok~9vf~h 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 ZUzu82& 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

_V#8V{b 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%0D; z+6U?pk3Sd@N{+*U1cub|VUoXr#5W8h_a%d<;7FlkHH4wy}&A+c>z@zxtt$ zfMOfO$rlvVQ~!v#_LHzywf(D28qzOywQcR2_KzPy=Hpt(iYw01s>WlCKRUEWl+~t{ zCl^@zhS)dqG;hQLvUtO}ByX^bAAoNA8^r5|f)3EqxGa;vLkw&}fYeRsT(e|#R*OD} zI0K)03}V5gK~En7Bn3|8f=X$LeGy>VKL8Sxq~*qP4Adu{_DvmalXlDrX+uAPP>>Su zZfbJSsZU?pH_EjyC7=UF2_RAG#$qM8W|jiQllFSzo{*>QksyqNJuc!Pfb>fxnFXax zbr1joWOO?#){ivp0ZZ13kO9SjA?}06ej$0LQNnFu1k7dg8*@&x64-^)A|f%;z$EpgIfcg5UEVyNNO+Fk$s|X0Z5!}svm$v zf>qllPKatPs32o|x)X;w+9sk*$D};BkXS|ljEYZ8AU)H^BTn3@zcDxO3nzdHhz#td zv1$7QSRV%C{BX2*Kq>2o08EgQPr72EBH#j503yMS08fKngOq`#!6j+Hp>*)Y!G<-8 zR-Hb1KpH4f+)f<$NCT7Y(w;nkNb~7i16uirel*wx8g&`qw8O>a2ab@mjz{hI5l|c; z=tKQ+{KS#APaQ(Gqk6;%NwZzz+J^Q=apjYTlt-NHVf_Rl;K@zpo?qgWJCrt18MqqI z8pr}FjSB(?)U2Z(W(GvA&jF%B4PFiObifm*AGwXBHNeyDAo3_ literal 0 HcmV?d00001 diff --git a/BioTracker/CoreApp/BioTracker/resources/introduction/images/context_video.png b/BioTracker/CoreApp/BioTracker/resources/introduction/images/context_video.png new file mode 100644 index 0000000000000000000000000000000000000000..b3ac3f49e5bf660607442f7b4b350685d2c30dc2 GIT binary patch literal 84746 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

Ki^vYEEvktR(@hRdH5 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 KEPV0$-TwmC!C2h@ literal 0 HcmV?d00001 diff --git a/BioTracker/CoreApp/BioTracker/resources/introduction/images/toolbars.png b/BioTracker/CoreApp/BioTracker/resources/introduction/images/toolbars.png new file mode 100644 index 0000000000000000000000000000000000000000..9c59e825e9882baa15c56cd0a937a293197583f7 GIT binary patch literal 42859 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 literal 0 HcmV?d00001 diff --git a/BioTracker/CoreApp/BioTracker/resources/introduction/images/tracking.png b/BioTracker/CoreApp/BioTracker/resources/introduction/images/tracking.png new file mode 100644 index 0000000000000000000000000000000000000000..99d2adf12a952d3065787818ec4ccfbb8f1bc74a GIT binary patch literal 829202 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 z zn&xH$xZJAHV-NnkK3};QywKd0SRm3{S5;v$moi0vcz|&gMpG9RNGJx5} zETa_Qp4YrZ<}t^wfE89U$3A>k>AAqBZwLEHsf7)-_pDiu^E~5dbFL>2sICkKkG(1| zuffe{oS@e4b12(@ZmxLmF%277YrB?k{b$aj2rkYtzdru)k7K{zL0AjE$?U}d(gNtc7qbAsHU^6WydPjKvA@P~1LS1|WM6r_4)L;U>eWAl*bIS8 zrPEPu;<#LyFC~$addeuVh^sRP&^!rM`qNEuk`D@fQRFJNdt&N&JTZmx-TOCX8$=e<4Kkw?Fj&9roOPyo6aSH_@M(82#oO^Xd;EIQko`e zE>)Aaol`MZjmTP9i3y#FPy@qkE3(wWpEm_=@N$nD;AK{tGY-x%yC%|Ha7Kzbr8po* z#jd18pE_S7JhS)#(Y;HhHzU+Zr>orxrWDx9K1Cr-;+!K!Pv_}XM zfwh*o(QV5Nc(a2#F_W?yt6uXqmqi$=+;ZGG(APCOO%pDkJP9DfyJG>g=6Tlx+Lld5 zGIH+Qz^!YY4KzhnYjw(f@pEWem%50nJ5bnUh#9D-6?;e@*VK*)Q#DhulBCIXk72M2 zwZ*uAM1fUO zCD}xH=ew?oVcL+EY|i4$P4`(@lfGas0bUtXrc^Kt6AHD>(Aa0{PB3t!t(gs$FvAXY zek~Q0IT|Up3RNq09K=Y;4HmEl#Q?^UHYEx=5MCGa8#}y#F%0@>P@EZbYXDz^;`FSt zuxM$`F~hVL_icu;1=Dx~LI_yqSmgoge2tY2su=qm^Ju`C*~uwp

Orp_=6|yWCm) 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
L=>PGihS!PXIL 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

(9B|0g(*Xf&kDXvgREkx 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�*V6_L45@; zqz<-o4ntlC5)zcAjsd#Q473lm@D;*>ITvu{x#a%C^MRe?Q;0|i#PC;G>7Z6nDG8n7 z%+7>@&pOuAG$8qa1a+2x&`V6TEc1AlrA_CE4cOgl3)B9*!8neE)g!;hV~4vtR4(wx z7-1|{CZ;{u-j6qV$YOzH`pau9K(+Htj3U=wo{yW&rmS(izO!C1Gce_6^-T2FhiJTnI52byd+CmCv_c^N{5r9A#dj6H2llt+gcy0wGzCLzz1IogID}arfI@%w`<-T zw+bGQ#{%Xs=*nhS95lWoXv$wtz>9zW7aL|BC#XuP0ys;yCEu&m{p9z-j;4K!H-j{N zGSXMtALfwBb6?c`}ZtCxmKNHb?|k|anmQD{nsVi2OVp< zPdMdy`C59$hGbbiXzw`3Zk6lwIe@xn#`W)4GBV|}>)X0}ZDRR5a(wpdfIOGnulRa; zrp$xD(RX5d$)DxtAX|qY1a_X)+!hix=XAsSBvb-{5^Rti0P;CYy+;W?GB7KpRwRR3 zUY`Vj3Sy+NzRpi9Lsx>=aI4nT+rnId5@FtlVc0HM)jtga($Ec%%EBSym>tJ z%wfrXld)05Kgi(7x%IMNU*#SxL3epB`RCd+GOgq`y3=7xRXR0FZFSEU&!zOUrPbh!m50KEI}dHHu>yiA(Zc$vV>gQmqJFJ>k`*ZnEZ{XGEUov;-0eAjv*>c{mTXK%| zapJlCxc}Wgj*)=sZnrCAZnxV(=jX!21X<`~09-yhxpqsVPN};tulL-Z*T;%|*H$l` zbuRDg<>2}~@IhvYx5q!+KpNJ&f(s@dqryR_P9OxIGs+o zckf=a=70SdrvNZKiS&Vg2l&E|0bl-4fhT?h7@qv<%+b^Ti}b~x1aOOWdzD3%vjSIR@DIE zFdwQ$&`^V4$?A|BJ24PZn1-~W)4^Yuzbrq;+zVHC~G-7+1{@9t48w#!_bdPPJAI_!ly_g_gykqS~3g3qDiMKP}>r* z{{jYM5Mv%&f%MIYwMNg0fiJ6R%u9A?D9+EiG2ZBtS9(8L53vNa0o=YUK?`QP8Z#6& z4xNYDelbmB@{526GvGzkN~(*StdmkIV3uZPPj}lQClk z0I>nGn>i?e!@ljB&%O%rZzZfbZYz(X0&^q`yswj@(KrfS|I!7M46LE}ah z8IdFm{*-EqE6mdOp@KSmU2k2#0j)JIFE63BDyEp;6LV9tdnI^V_w9Du=xmeQ zH_g@S>uWsn$Rl(OnF;EgD;lT97$7FnbB54G2QXM&v`bTpP^wBs@Vb(sY9yI>F4H`1 z3qQNvZe_g2V=tx(Uc(R*U3Wm+vT&iuHOye%2aVm5Jc|UxP=RQlViRl5^IYbyES87h zn<9Z+&v?z3dnDgSl`omf*R)PqW3!D-U2rgJXe62jYhldLtye&bVHLEU14(7qj5MK> zpmQmljIG&Y4`>d~=dG4u^7$o6QE>?FC-DehuR| z;*pC>#2E3$8*gBqk5%7YJj?BNyVC!cBmr5-VfJ)N3CH6R8$%KZ%m@WSV>VXxt=rfz z&#bbCrKE8>xuO$X3&2|Jo2^d&H}mn^>hu4!?U{ax0F;Fl=EhwfNX+#5SA5NFyk%EtF9hrU^z*IL?Qf9OP@2 z@&^P!I2bb&4K{08sQ%P2Qhdnm^dVu&1{L1VIbm+~^ahY5gE0!rQrQ(srE=bB7;!o+ zPzsnbm_E;Q4iI%27d*$f)y@_<0N(_1F-B!!%(3V< zVJ89X$Lxb+Y1rHS!Y!1G8t&}VV-ONuKKRzs3+m~8Emu!x=-EN`HP{)S? z5;PXqGT#~GVnB~U1fK6~SO=}J8Mi>9H6$TXLaZQwo&*&mX-7k0&U(zH0FwbIHBf7v zg)Iqi2m#5F#DmfXqs{L0er_0iT5E(1Ua8cYvN5YFWGR#o0>%u^NS4kyV=-$jj>qH5 z2!a8s)OG>N^`LY6?BERx9}wJB`Ixg^`1jLW1{f}%ZJ z7C_mz4u?Yl_v-qpR{D9?>I|?S^K+qlZ44X*lg#;J21~O^l5#6xStlUz98W;diCRRl zZd>=>Bk}wZ27Jr1zzKk2v)R!8nqvzC13NIVVPM9oVWdlQA#UOBb&{#*WL7{<2mvq} zKFdTH(EFIZJ8S;MAWQ|_Q^&AoO+$mj;m|POthI1{ZUA>)8zc+vbX+i+%7|mL`dYZk zg^xfB@b!Fylcqw$#l;2O=?F6p*r*+%qV?_Oc)-o+27ZaSyu8dV-W01zmvP!#h8n|! z+~JfILIljXsfKP@KRbG<1Fx{zUc!4%d+?YG-U=8uLmAhzTd*ut{7nilgM|()+c$50 z4cILU{}Pz(JECIputVN=vVo9gDUayLpoeY{S^;)5mVyx!0K?!HfDDG~B9FkJuSZJ2 zFtm=|63A@~8l?lekj~LsliyuRrNA0e$`S>-6dGvU3}@P*!z$U?44eFW8c38osHDo; zG`kt&FqYzBDSTumBF8;V=T?dcE zbSX}gbXP(Mry@s2>zWsm2t$#@qCz!|(c|#|=X93zAo(cgD$v`nv`+=~c{km^xFvPE0yAtBI3H-+WxM8Nv- zc*JIFFc_M1pZp`=g*N0C*2%ZMR~$lst?!<=+WG=>HIN zE@=WeWr7p41`xT8>a(p=vLbBGFwD-iO|%umB-$*|v=5OBGGJ}hB&goz_zWL^R8ec#4 zXa5X-{=a;&06^ASsLcLQR$(+FtmO(h0g}@+G;BmpVkKi!zVq5vRRf}N97~m)1G55Z z6kWwA*aIB+vRO^53#O84=1d3<+wDb8I%WGMGs_ITM|N=4`LpMSB_Z3r>R8Y3N}E+H zds#%Rg|!;T`2b_|Dro0(4a0!wvtd(kFvD0hRV5>$)!%Kw=)PTEgISq8CfBTz-Z-Ie zZD%>WTP(9%0dgsx=NU?q@shC$%G9Kgk_06faS2gH(hXD!P#P{) z*^dIqg4ow78}&uyu!NSeLIA4)@;uRrG$&J}@otQP0&Dw*Rr`2KwK&w90r8wZ*GAp9 z7xn;Jqt7WiciAXKwl(*14#o_CkFBxcpn*i45DCJB#HD6jF+;dsPuDsd$pDAhX(@%q z7(+6`d+CmzeJa7?ey&x$LA8={;kn1`#%hcfnr;QT7DzTw%mtHqX6B7*81HN}SlE4H zuJ@)VN|_8AthHI|Gg!C1%e6_)VX6O@`t?Dp0{$M4M<`R-$=-RG!8ZHIgT`4MC+4h6 zIsv$DWy00yHFu0{2`WmErDyERHBrjlNM?PjPT z);vhNQ|@hjn{630nO!^2GcGPJ8g_86l^BrD%K6CgS2_^b@gDEJjrW`s4Ht9B6jC+% z^z}I~h$majvf+6i$|3?kx56M6CnhGm zKKpDM$8%%Op0}3|k>}WKHk}S>Xuy0f%FCh^#f=u@D7Btd(Jz&8ai5pe&X%<%`#DBd zRP3<;0xxxh8Fh2-wc`XizN)5ZJRT$i7yyooYjoF}&V&+UaSjl2AwA?cHy{KLV>AY% z5S`CsL*R=#~Vw3`ejN@*PcX7P(i}>yz0{+Zz z{2)Gh`!sHW)7#_r_(uYqf>-0?L?ohM=msiGgXEDJ_E6tjY>tE=)^$K$Cm z+~kJL*OOAhIE}ctxWL85MbW2Xc45B}lPfz)hketNb?Zcu19X^y7}6@ zd-srnE9_0GkkjXJ`=Qhy_4#?oWcJNBuQ3b*9)0vt%=3&ded$Z@dC)J*5y#~Kn1qXI zgb&1mmHJKmT&Sfdl>m|Tm1MP;jk`{#Q`7n=K~grKqH$xJgfqH`B}VLayAm8nrOCB7 zvqU5H<|Boy7a9csmw=QEnKCH@C-zE-F7F;a00NQV zyAtF{;7x)~eM_6Q7CwZ+6l2pdIX7uekt6!KMNy3R?vJAPH7m^>wfkvwo*@wj0t>ZnnxjFVPQI zWJ`6^A{+@M=J)5l2UKR(3>jo{kxW`bgpXO^Ya$)*C99WzkM|TdBb2NsX0}OyH>K8LyKgb(IU&KrbH+@(-^A!e z+)xd123^_5(zHyTS29#fr$GVDJQnAmm09UF^FHhshg6tuLvy{-^hW1`mej80HAm{| zNmDdF$2`xC-XlMU;s`IK82DZ!Lz~~FbOM)p+0rpu78a$sj>&QblN}ILDsAR+{p=m6G!X;!bUHz6jbkn@d+%|1d5JrB?!ek=idfcZ1^5i=rNH|c8|o07PR@t5 zgaC4!NFY6#&b9Bi0bNB=NXAV(PJ2!7W{+fJC9YqKIIirIq1F90&fmDc2ib9&2t!I9SqHU{Ex&W49QASyLZOX1lq zD{X68U>(P?bSU(izH6qwYC7LI7OYYo2F^uMShY>ji04~>@7~9TxKPX>GZV7ae^re( zd>zZJA*e#D>C9^fui^9F;o_2{ew5Ko?!x;vuS@g}tT1FUjn-^2Sq#3!(XwMkn%FVB z9x!G9m0bg5uBniefzlRw7~qdL0H_#iv*D*P2D{x3Z@>L^dB&Va^+hCO4SX)V_3JNx zuJ;})wGusAYb?n%CU-pnh_#aC{v+e>WjU5-%WFBC3^Fn0eF>bt@{9QHZ~q1So&3*_ zKL3~Sndd)x3yR(zUv*E5F#><W3MU<~q6($zX=0)Vli1U@$-iut;iU zULb=^*4&anKmmM5YSWj2a|oemD6u&d2Nm!2;2>r*1;h*hN

A_$b8Eq( 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%0A=>ajvdjXA{sB0K_qaA+uIYJEaq>oKm3 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 bo~9H>UGNX76nMJeFwO=-+P%zmsonnpFOVSb literal 0 HcmV?d00001 diff --git a/BioTracker/CoreApp/BioTracker/resources/logo/firstlogo.png b/BioTracker/CoreApp/BioTracker/resources/logo/firstlogo.png new file mode 100644 index 0000000000000000000000000000000000000000..41944d172d60b87892937d0c0defec3c2f3dc79d GIT binary patch literal 6817 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 literal 0 HcmV?d00001 From 1f781c51ea146ed63b21d2124e85d6db648a0d0d Mon Sep 17 00:00:00 2001 From: jotpio Date: Thu, 15 Mar 2018 01:32:57 +0100 Subject: [PATCH 008/171] revamped the trial system (the tracks are now in two directories ('tracks' and 'tracks/trials') minor layouting changes fixed bad file formating fixed bug indeleting shapes after data reset --- .../Controller/ControllerCoreParameter.cpp | 14 +++- .../Controller/ControllerCoreParameter.h | 1 + .../Controller/ControllerDataExporter.cpp | 9 ++- .../Controller/ControllerDataExporter.h | 2 + .../Controller/ControllerMainWindow.cpp | 8 +- .../Controller/ControllerPlayer.cpp | 9 ++- .../BioTracker/View/CoreParameterView.cpp | 54 ++++++++++++-- .../BioTracker/View/CoreParameterView.h | 10 ++- .../BioTracker/View/CoreParameterView.ui | 61 ++++++++++++++- .../CoreApp/BioTracker/View/MainWindow.cpp | 11 ++- .../CoreApp/BioTracker/View/MainWindow.ui | 70 +++++++++--------- .../BioTracker/View/TrackedComponentView.cpp | 2 +- .../BioTracker/View/Utility/SwitchButton.cpp | 16 +++- .../BioTracker/View/Utility/SwitchButton.h | 2 + BioTracker/CoreApp/BioTracker/main.cpp | 1 + .../resources/introduction/context_menus.txt | 2 +- .../BioTracker/resources/logo/firstlogo.ico | Bin 102277 -> 22929 bytes BioTracker/CoreApp/BioTracker/util/types.h | 1 + .../Utils/BioTrackerUtils/util/misc.cpp | 2 +- 19 files changed, 214 insertions(+), 61 deletions(-) diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerCoreParameter.cpp b/BioTracker/CoreApp/BioTracker/Controller/ControllerCoreParameter.cpp index b8954c24..c56666b1 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerCoreParameter.cpp +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerCoreParameter.cpp @@ -88,6 +88,9 @@ void ControllerCoreParameter::connectControllerToController() IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::DATAEXPORT); ControllerDataExporter *deController = static_cast(ctr); QObject::connect(view, &CoreParameterView::emitFinalizeExperiment, deController, &ControllerDataExporter::receiveFinalizeExperiment, Qt::DirectConnection); + QObject::connect(view, &CoreParameterView::emitTrialStarted, deController, &ControllerDataExporter::receiveTrialStarted, Qt::DirectConnection); + + } //Media Player { @@ -97,6 +100,7 @@ void ControllerCoreParameter::connectControllerToController() QObject::connect(mp, &MediaPlayer::fwdPlayerParameters, view, &CoreParameterView::rcvPlayerParameters); QObject::connect(view, &CoreParameterView::emitStartPlayback, mpc, &ControllerPlayer::play); QObject::connect(view, &CoreParameterView::emitStopPlayback, mpc, &ControllerPlayer::stop); + QObject::connect(view, &CoreParameterView::emitPausePlayback, mpc, &ControllerPlayer::pause); } //Main Window { @@ -104,6 +108,8 @@ void ControllerCoreParameter::connectControllerToController() ControllerMainWindow *mwc = static_cast(ctr); QObject::connect(view, &CoreParameterView::emitEnableTracking, mwc, &ControllerMainWindow::activeTracking); QObject::connect(view, &CoreParameterView::emitDisableTracking, mwc, &ControllerMainWindow::deactiveTrackring); + QObject::connect(view, &CoreParameterView::emitActivateTrackingSwitch, mwc, &ControllerMainWindow::activeTrackingCheckBox); + QObject::connect(view, &CoreParameterView::emitDeactivateTrackingSwitch, mwc, &ControllerMainWindow::deactiveTrackingCheckBox); } view->triggerUpdate(); @@ -112,11 +118,17 @@ void ControllerCoreParameter::connectControllerToController() void ControllerCoreParameter::changeAreaDescriptorType(QString type) { if (dynamic_cast(m_View)) dynamic_cast(m_View)->areaDescriptorTypeChanged(type); +} + +void ControllerCoreParameter::receiveResetTrial() +{ + CoreParameterView* view = static_cast(m_View); + view->resetTrial(); } void ControllerCoreParameter::triggerUpdate() { - CoreParameterView* view = static_cast(m_View); view->triggerUpdate(); + CoreParameterView* view = static_cast(m_View); view->triggerUpdate(); } diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerCoreParameter.h b/BioTracker/CoreApp/BioTracker/Controller/ControllerCoreParameter.h index 30e7ac0d..a1627b13 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerCoreParameter.h +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerCoreParameter.h @@ -26,6 +26,7 @@ class ControllerCoreParameter : public IController public slots: void setCorePermission(std::pair permission); void changeAreaDescriptorType(QString type); + void receiveResetTrial(); //Forwarded from data exporter int getTrialNumber(); diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.cpp b/BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.cpp index 47c1ef7e..81a170ff 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.cpp +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.cpp @@ -159,7 +159,9 @@ int ControllerDataExporter::getTrialNumber() { QString ControllerDataExporter::generateBasename(bool temporaryFile) { - QString path = (temporaryFile ? CFG_DIR_TEMP : CFG_DIR_TRACKS); + QString resultPath = (_trialStarted ? CFG_DIR_TRIALS : CFG_DIR_TRACKS); + + QString path = (temporaryFile ? CFG_DIR_TEMP : resultPath); int maxVal = getTrialNumber(); std::string current = "Export_"+std::to_string(maxVal+1)+"_"; @@ -176,3 +178,8 @@ void ControllerDataExporter::receiveFileWritten(QFileInfo fname) { QMessageBox::Ok); } +void ControllerDataExporter::receiveTrialStarted(bool started) +{ + _trialStarted = started; +} + diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.h b/BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.h index 5796ca02..3b365c8a 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.h +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.h @@ -42,6 +42,7 @@ class ControllerDataExporter : public IController { void receiveTrackingDone(uint frame); void receiveFinalizeExperiment(); void receiveFileWritten(QFileInfo fname); + void receiveTrialStarted(bool started); protected: void createModel() override; @@ -53,5 +54,6 @@ private Q_SLOTS: private: IModelTrackedComponentFactory* _factory; + bool _trialStarted = false; }; diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerMainWindow.cpp b/BioTracker/CoreApp/BioTracker/Controller/ControllerMainWindow.cpp index 2a7fd785..a521d2e9 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerMainWindow.cpp +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerMainWindow.cpp @@ -11,6 +11,7 @@ #include "Controller/ControllerTrackedComponentCore.h" #include "Controller/ControllerCommands.h" #include "Controller/ControllerGraphicScene.h" +#include "Controller/ControllerCoreParameter.h" #include "GuiContext.h" #include "QPluginLoader" @@ -197,6 +198,11 @@ void ControllerMainWindow::connectControllerToController() { ControllerDataExporter *deController = static_cast(ictrde); QObject::connect(this, &ControllerMainWindow::emitFinalizeExperiment, deController, &ControllerDataExporter::receiveFinalizeExperiment, Qt::DirectConnection); + // reset trials + IController* ictrcpv = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::COREPARAMETER); + ControllerCoreParameter *ctrcpv = static_cast(ictrcpv); + QObject::connect(this, &ControllerMainWindow::emitOnLoadMedia, ctrcpv, &ControllerCoreParameter::receiveResetTrial, Qt::DirectConnection); + QObject::connect(this, &ControllerMainWindow::emitOnLoadPlugin, ctrcpv, &ControllerCoreParameter::receiveResetTrial, Qt::DirectConnection); // BioTracker::Core::Settings *set = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); @@ -225,7 +231,7 @@ void ControllerMainWindow::rcvSelectPlugin(QString plugin) { dynamic_cast(m_View)->resetTrackerViews(); IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::PLUGIN); qobject_cast(ctr)->selectPlugin(plugin); - dynamic_cast(m_View)->activeTrackingCheckBox(); + //dynamic_cast(m_View)->activeTrackingCheckBox(); activeTrackingCheckBox(); Q_EMIT emitPluginLoaded(plugin.toStdString()); } diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerPlayer.cpp b/BioTracker/CoreApp/BioTracker/Controller/ControllerPlayer.cpp index 5cbdff27..4867a68a 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerPlayer.cpp +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerPlayer.cpp @@ -5,6 +5,7 @@ #include "Controller/ControllerPlugin.h" #include "Controller/ControllerGraphicScene.h" #include "Controller/ControllerTrackedComponentCore.h" +#include "Controller/ControllerCoreParameter.h" #include #include @@ -26,7 +27,6 @@ void ControllerPlayer::loadVideoStream(QString str) { void ControllerPlayer::loadPictures(std::vector files) { qobject_cast(m_Model)->loadPictures(files); emitPauseState(true); - } void ControllerPlayer::loadCameraDevice(CameraConfiguration conf) { @@ -112,11 +112,18 @@ void ControllerPlayer::setTrackingDeactivated() { } void ControllerPlayer::connectControllerToController() { + //connect to mainwindow IController* ctrM = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::MAINWINDOW); QPointer< MainWindow > mainWin = dynamic_cast(ctrM->getView()); mainWin->addVideoControllWidget(m_View); VideoControllWidget* vControl = static_cast(m_View); vControl->setupVideoToolbar(); + + ////connect to coreparameterview + //IController* ictrCpv = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::COREPARAMETER); + //QPointer< ControllerCoreParameter > ctrCpv = dynamic_cast(ictrCpv); + + //QObject::connect(this, &ControllerPlayer::emitPauseState, ctrCpv, &ControllercoreParameter) } void ControllerPlayer::createModel() { diff --git a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp index 68881af7..e997be31 100644 --- a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp +++ b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp @@ -387,6 +387,15 @@ void CoreParameterView::setStyle() } +void CoreParameterView::resetTrial() +{ + _trialActive = false; + _trialStarted = false; + Q_EMIT emitTrialStarted(false); + ui->pushButton_startExp->setText("Start Trial"); + +} + void CoreParameterView::getNotified() { CoreParameter* coreParams = dynamic_cast(getModel()); @@ -400,40 +409,69 @@ void CoreParameterView::getNotified() /************EXPERIMENT TAB*******************/ void CoreParameterView::on_pushButton_startExp_clicked() { - if (!_trackingStarted) { + if (!_trialActive) { if (_currentFile == "No Media"){ int ret = QMessageBox::information(this, tr("BioTracker"), tr("Please select a source video first. \nYou can do so in the \"File\" menu."), QMessageBox::Ok); } else { + if (!_trialStarted) { + _trialStarted = true; + emitTrialStarted(true); + emitFinalizeExperiment(); + QMessageBox::information(0, "New trial", "You started a new trial! Previous data was saved and reset.\n\nGo to the timespot in the video you want to track at." + "\n\nPlease add the number of objects you want to track as trajectories.\nResume the video." ); + } + else { + emitStartPlayback(); + } + emitDeactivateTrackingSwitch(); emitEnableTracking(); - emitStartPlayback(); - ui->pushButton_startExp->setText("Stop Trial"); - _trackingStarted = true; + ui->pushButton_startExp->setText("Pause Trial"); + ui->label_ExpSt->setText("Active - tracking"); + _trialActive = true; } } else { + emitDisableTracking(); - emitStopPlayback(); - ui->pushButton_startExp->setText("Start Trial"); - _trackingStarted = false; + emitPausePlayback(); + ui->pushButton_startExp->setText("Resume Trial"); + ui->label_ExpSt->setText("Paused - not tracking"); + _trialActive = false; } } void CoreParameterView::on_pushButton_finalizeExp_clicked() { Q_EMIT emitStopPlayback(); + Q_EMIT emitActivateTrackingSwitch(); Q_EMIT emitDisableTracking(); - _trackingStarted = false; + _trialActive = false; + _trialStarted = false; ui->pushButton_startExp->setText("Start Trial"); + ui->label_ExpSt->setText("No Trial started!"); Q_EMIT emitFinalizeExperiment(); + Q_EMIT emitTrialStarted(false); + } void CoreParameterView::on_label_ExpSrcCnt_clicked() { //Event does not exist } +void CoreParameterView::on_trialHelpButton_clicked() +{ + QMessageBox::information(0, "Trials", "'Start Trial' will cause all the previous data to be saved and then reset.\n\n" + "Go to the time spot you want to track and create a trajectory for each object you want to track.\n" + "Resume the video and the tracker will track your objects.\n\n" + "If you want to pause the tracking you can just pause the video. Resuming the video will continue the tracking.\n" + "If you want to pause the video and resume without tracking you will have to click 'Pause Trial' causing the tracking to be disabled.\n" + "You can now watch the video without tracking.\n\n" + "'Resume trial' will cause the tracking to be activated AND the video to be resumed"); +} + void CoreParameterView::rcvPlayerParameters(playerParameters* parameters) { QFileInfo f(parameters->m_CurrentFilename); _currentFile = f.baseName(); diff --git a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.h b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.h index 8e476319..d80f50e7 100644 --- a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.h +++ b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.h @@ -93,6 +93,7 @@ class CoreParameterView : public IViewWidget void on_pushButton_startExp_clicked(); void on_pushButton_finalizeExp_clicked(); void on_label_ExpSrcCnt_clicked(); + void on_trialHelpButton_clicked(); public slots: void rcvPlayerParameters(playerParameters* parameters); @@ -105,8 +106,13 @@ public slots: */ void emitEnableTracking(); void emitDisableTracking(); + void emitActivateTrackingSwitch(); + void emitDeactivateTrackingSwitch(); void emitStartPlayback(); void emitStopPlayback(); + void emitPausePlayback(); + void emitTrialStarted(bool started); + //Enable view void emitViewSwitch(bool lever); @@ -155,7 +161,8 @@ public slots: bool m_viewSwitch; SwitchButton* _expertSwitch; - bool _trackingStarted = false; + bool _trialActive = false; + bool _trialStarted = false; QString _currentFile = "No Media"; // IViewWidget interface @@ -164,6 +171,7 @@ public slots: void getNotified(); void fillUI(); void setStyle(); + void resetTrial(); }; diff --git a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui index bf484b56..1eadf5bc 100644 --- a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui +++ b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui @@ -156,8 +156,8 @@ 0 0 - 344 - 935 + 316 + 844 @@ -1648,6 +1648,41 @@ You can add some by right-clicking the video (if loaded). + + + + Current status of the trial. If paused the tracking is deactivated. + + + + + + + 70 + 0 + + + + + 50 + 16777215 + + + + Trial Status + + + + + + + No Trial started! + + + + + + @@ -1662,6 +1697,25 @@ If results are questionable, mediate the selection of tracker + + + + + 0 + 0 + + + + + 25 + 25 + + + + ? + + + @@ -1679,7 +1733,8 @@ If results are questionable, mediate the selection of tracker Finalizes the current trial. Clicking this will not only stop the trial, but also write back the -data to the "Tracks" directory and increment the trial count. +data to the "Tracks" directory and increment the trial count. +If no trial is active this button saves and resets the current data. Save Trial and Reset Data diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp index 61fbfb32..1fdad330 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp @@ -512,7 +512,7 @@ void MainWindow::createIntroductionWizard(){ m_introWiz->setWindowTitle("Introduction"); if(!disabled){ QRect rec = QApplication::desktop()->availableGeometry(); - m_introWiz->resize(m_introWiz->width(), rec.height()); + //m_introWiz->resize(m_introWiz->width(), rec.height()); m_introWiz->show(); //m_introWiz->showMaximized(); } @@ -535,8 +535,13 @@ void MainWindow::setCorePermission(std::pair permi void MainWindow::addVideoControllWidget(IView* widget) { QLayout* layout = new QGridLayout(); - layout->addWidget(dynamic_cast(widget)); - ui->videoControls->setLayout(layout); + //layout->addWidget(dynamic_cast(widget)); + + QWidget* controlW = dynamic_cast(widget); + if (controlW) { + layout->addWidget(controlW->findChild("sld_video")); + } + ui->videoControls->setLayout(layout); //ui->videoControls->adjustSize(); diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.ui b/BioTracker/CoreApp/BioTracker/View/MainWindow.ui index 5557e6e7..18f2d83a 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.ui +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.ui @@ -6,7 +6,7 @@ 0 0 - 845 + 1022 565 @@ -117,7 +117,7 @@ 0 - 0 + 100 @@ -126,7 +126,7 @@ 0 - + 0 @@ -143,7 +143,7 @@ 0 - + 0 @@ -234,15 +234,15 @@ true - + 0 - 100 + 0 0 - 0 + 40 @@ -427,7 +427,7 @@ - Choose your visualization options + QFrame::NoFrame @@ -436,15 +436,15 @@ 1 - 0 + 3 0 0 - 565 - 294 + 705 + 304 @@ -466,8 +466,8 @@ 0 0 - 565 - 294 + 705 + 304 @@ -512,8 +512,8 @@ 0 0 - 565 - 294 + 705 + 304 @@ -548,15 +548,15 @@ 0 0 - 565 - 294 + 705 + 304 A short stepwise tutorial - How to use BioTracker + How to use the BioTracker @@ -608,19 +608,19 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Ubuntu'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The BioTracker is a modular tracking software consisting of a core management framework and various trackers which you can 'plug in'. You can track on videos, picture and camera streams.</p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> -<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Basic steps</span></p> -<ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Load a medium (video, picture or camera stream) </li> -<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Load a tracker (usually trackers are preloaded from the 'Plugins' directory) </li> -<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the desired tracker options </li> -<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Insert the objects to track if the tracker does not generate them automatically</li> -<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can manage the tracking and trials in the experiment tab</li> -<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Start tracking!</li></ol> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:0px;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">More information on how to use the BioTracker can be found in the <a href="https://github.com/BioroboticsLab/biotracker_core/wiki"><span style=" text-decoration: underline; color:#0000ff;">user guide</span></a>.</p></body></html> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:9pt;">The BioTracker is a modular tracking software consisting of a core management framework and various trackers which you can 'plug in'. You can track on videos, picture and camera streams.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:9pt;"><br /></p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:9pt; font-weight:600;">Basic steps</span></p> +<ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Load a medium (video, picture or camera stream) </li> +<li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Load a tracker (usually trackers are preloaded from the 'Plugins' directory) </li> +<li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the desired tracker options </li> +<li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Insert the objects to track if the tracker does not generate them automatically</li> +<li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can manage the tracking and trials in the 'Experiment' tab</li> +<li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Start tracking!</li></ol> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:0px; font-family:'Ubuntu'; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:9pt;"> </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:9pt;">More information on how to use the BioTracker can be found in the </span><a href="https://github.com/BioroboticsLab/biotracker_core/wiki"><span style=" font-family:'Ubuntu'; font-size:9pt; text-decoration: underline; color:#0000ff;">user guide</span></a><span style=" font-family:'Ubuntu'; font-size:9pt;">.</span></p></body></html> true @@ -634,8 +634,8 @@ p, li { white-space: pre-wrap; } 0 0 - 565 - 294 + 705 + 304 @@ -683,8 +683,8 @@ p, li { white-space: pre-wrap; } 0 0 - 845 - 18 + 1022 + 21 diff --git a/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp b/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp index 86c1f04c..d675165e 100644 --- a/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp +++ b/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp @@ -168,7 +168,7 @@ void TrackedComponentView::updateShapes(uint framenumber) { m_currentFrameNumber = framenumber; IModelTrackedTrajectory *all = dynamic_cast(getModel()); - if (!all){ + if (!all || all->size() == 0){ //if root is nullptr, delete all children foreach (auto child, this->childItems()){ delete child; diff --git a/BioTracker/CoreApp/BioTracker/View/Utility/SwitchButton.cpp b/BioTracker/CoreApp/BioTracker/View/Utility/SwitchButton.cpp index 842d648d..4f46b385 100644 --- a/BioTracker/CoreApp/BioTracker/View/Utility/SwitchButton.cpp +++ b/BioTracker/CoreApp/BioTracker/View/Utility/SwitchButton.cpp @@ -55,6 +55,14 @@ void SwitchButton::paintEvent(QPaintEvent *e) { p.setOpacity(1.0); p.setBrush(QColor("#BDBDBD")); p.drawEllipse(QRectF(offset() - (_height / 2), _y - (_height / 2), height(), height())); + + //text + p.setPen(Qt::black); + QFont font = p.font(); + font.setPixelSize(height() - 3 * _margin); + p.setFont(font); + QRectF textRect = QRectF(_margin, _margin, width() - 2 * _margin, height() - 2 * _margin); + p.drawText(textRect, Qt::AlignHCenter | Qt::AlignVCenter, _switch ? _s1 : _s0); } } @@ -68,10 +76,10 @@ void SwitchButton::mouseReleaseEvent(QMouseEvent *e) { QAbstractButton::mouseReleaseEvent(e); } -// void SwitchButton::enterEvent(QEvent *e) { -// setCursor(Qt::PointingHandCursor); -// QAbstractButton::enterEvent(e); -// } +void SwitchButton::enterEvent(QEvent *e) { + setCursor(Qt::PointingHandCursor); + QAbstractButton::enterEvent(e); +} void SwitchButton::animateSwitch(){ if (_switch) { diff --git a/BioTracker/CoreApp/BioTracker/View/Utility/SwitchButton.h b/BioTracker/CoreApp/BioTracker/View/Utility/SwitchButton.h index 949f4114..a54be168 100644 --- a/BioTracker/CoreApp/BioTracker/View/Utility/SwitchButton.h +++ b/BioTracker/CoreApp/BioTracker/View/Utility/SwitchButton.h @@ -34,6 +34,8 @@ class SwitchButton : public QAbstractButton { protected: void paintEvent(QPaintEvent* event) override; void mouseReleaseEvent(QMouseEvent*) override; + void enterEvent(QEvent *e) override; + bool _switch; qreal _opacity; diff --git a/BioTracker/CoreApp/BioTracker/main.cpp b/BioTracker/CoreApp/BioTracker/main.cpp index ab9344e2..f31faaa7 100644 --- a/BioTracker/CoreApp/BioTracker/main.cpp +++ b/BioTracker/CoreApp/BioTracker/main.cpp @@ -34,6 +34,7 @@ int main(int argc, char* argv[]) { boost::filesystem::create_directory(boost::filesystem::path(CFG_DIR_PLUGINS)); boost::filesystem::create_directory(boost::filesystem::path(CFG_DIR_VIDEOS)); boost::filesystem::create_directory(boost::filesystem::path(CFG_DIR_TRACKS)); + boost::filesystem::create_directory(boost::filesystem::path(CFG_DIR_TRIALS)); boost::filesystem::create_directory(boost::filesystem::path(CFG_DIR_SCREENSHOTS)); BioTracker3App bioTracker3(&app); diff --git a/BioTracker/CoreApp/BioTracker/resources/introduction/context_menus.txt b/BioTracker/CoreApp/BioTracker/resources/introduction/context_menus.txt index 0d4123f4..58386fd2 100644 --- a/BioTracker/CoreApp/BioTracker/resources/introduction/context_menus.txt +++ b/BioTracker/CoreApp/BioTracker/resources/introduction/context_menus.txt @@ -1,4 +1,4 @@ Both the video and each entity can be right-clicked to open a context menu. -Please keep this in mind as many functionalities are in these context menues! +Please keep this in mind as many functionalities are in these context menus! diff --git a/BioTracker/CoreApp/BioTracker/resources/logo/firstlogo.ico b/BioTracker/CoreApp/BioTracker/resources/logo/firstlogo.ico index 8222e4b8a60067dbf15363372dc4b24e0b901933..e8a57c71ff50e7110ba5d0ed70ff0e01c60ad445 100644 GIT binary patch literal 22929 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 bo~9H>UGNX76nMJeFwO=-+P%zmsonnpFOVSb diff --git a/BioTracker/CoreApp/BioTracker/util/types.h b/BioTracker/CoreApp/BioTracker/util/types.h index a8e5ae65..e7d39f0a 100644 --- a/BioTracker/CoreApp/BioTracker/util/types.h +++ b/BioTracker/CoreApp/BioTracker/util/types.h @@ -27,6 +27,7 @@ #define CFG_DIR_PLUGINS "./Plugins/" #define CFG_DIR_VIDEOS "./Videos/" #define CFG_DIR_TRACKS "./Tracks/" +#define CFG_DIR_TRIALS "./Tracks/Trials/" #define CFG_DIR_SCREENSHOTS "./Screenshots/" #define CFG_DIR_TEMP "./temp/" #define CFG_AREA_DEFINITIONS "./areas.csv" diff --git a/BioTracker/Utils/BioTrackerUtils/util/misc.cpp b/BioTracker/Utils/BioTrackerUtils/util/misc.cpp index 31054abe..6fcf6deb 100644 --- a/BioTracker/Utils/BioTrackerUtils/util/misc.cpp +++ b/BioTracker/Utils/BioTrackerUtils/util/misc.cpp @@ -47,7 +47,7 @@ std::string getTimeAndDate(std::string prefix, std::string suffix) timeinfo = localtime ( &rawtime ); char t[30]; - strftime(t, 30, "%Y-%m-%dT%H:%M:%S", timeinfo); // + strftime(t, 30, "%Y-%m-%dT%H_%M_%S", timeinfo); // std::string out = prefix; From d16d6f88bf4fc5a81f4269a9da47c6137c6fe39e Mon Sep 17 00:00:00 2001 From: jonas Date: Tue, 20 Mar 2018 18:10:48 +0100 Subject: [PATCH 009/171] fix to the trial-track naming scheme -trials are now numbered seperately added fullscreen toggle action to menubar (F11) added object naming to shapes causing the trajectory to be also named --- .../Controller/ControllerDataExporter.cpp | 3 +- .../Model/DataExporters/DataExporterCSV.cpp | 2 +- .../BioTracker/View/ComponentShape.cpp | 32 ++++++++++ .../CoreApp/BioTracker/View/ComponentShape.h | 1 + .../BioTracker/View/CoreParameterView.cpp | 3 +- .../CoreApp/BioTracker/View/MainWindow.cpp | 10 +++ .../CoreApp/BioTracker/View/MainWindow.h | 1 + .../CoreApp/BioTracker/View/MainWindow.ui | 62 +++++++++++-------- 8 files changed, 85 insertions(+), 29 deletions(-) diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.cpp b/BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.cpp index 81a170ff..9fd286d0 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.cpp +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.cpp @@ -145,7 +145,8 @@ void ControllerDataExporter::rcvPlayerParameters(playerParameters* parameters) { int ControllerDataExporter::getTrialNumber() { //Get all existing files and parse highest export number - QStringList allFiles = QDir(CFG_DIR_TRACKS).entryList(QDir::NoDotAndDotDot | QDir::Files); + QString basePath = _trialStarted ? CFG_DIR_TRIALS : CFG_DIR_TRACKS; + QStringList allFiles = QDir(basePath).entryList(QDir::NoDotAndDotDot | QDir::Files); int maxVal = 0; foreach(QString s, allFiles) { diff --git a/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterCSV.cpp b/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterCSV.cpp index ff0808d7..0ce5bd70 100644 --- a/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterCSV.cpp +++ b/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterCSV.cpp @@ -218,7 +218,7 @@ void DataExporterCSV::writeAll(std::string f) { int max = getMaxLinecount(); //There is nothing to write - if (max <= 1) + if (max <= 0) { cleanup(); return; diff --git a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp index 0a2bf0bc..f6811d06 100644 --- a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp +++ b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp @@ -15,6 +15,7 @@ #include "QGraphicsProxyWidget" #include "QVBoxLayout" #include "QSlider" +#include "QLineEdit" #include "QAbstractSlider" #include #include @@ -609,6 +610,28 @@ void ComponentShape::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) infoLabel->setAlignment(Qt::AlignCenter); infoBox->setDefaultWidget(infoLabel); menu.addAction(infoBox); + + menu.addSeparator(); + //set object name - line edit + QWidgetAction* objectNameAction = new QWidgetAction(this); + QLineEdit* objectEdit = new QLineEdit(); + + if(objectName() == ""){ + objectEdit->setPlaceholderText("no object name set"); + } + else{ + objectEdit->setText(objectName()); + } + objectEdit->setAlignment(Qt::AlignHCenter); + objectEdit->setFrame(false); + objectEdit->setToolTip("Change the trajectory's name. This will not be saved in the data output (yet)!"); + + QObject::connect(objectEdit, &QLineEdit::textEdited, this, &ComponentShape::setObjectNameContext); + + objectNameAction->setDefaultWidget(objectEdit); + menu.addAction(objectNameAction); + + //show info window for current frame menu.addSeparator(); QAction *showInfoAction = menu.addAction("Show full info", dynamic_cast(this), SLOT(createInfoWindow())); @@ -624,6 +647,7 @@ void ComponentShape::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) transparencySlider->setMinimum(0); transparencySlider->setMaximum(255); transparencySlider->setSingleStep(1); + transparencySlider->setTickPosition(QSlider::TicksBothSides); transparencySlider->setTickInterval(64); transparencySlider->setValue(m_transparency); @@ -888,6 +912,14 @@ void ComponentShape::createInfoWindow() } +void ComponentShape::setObjectNameContext(QString name){ + setObjectName(name); + m_trajectory->setObjectName(name); + //_objNameBuffer = name; +} + +//void ComponentShape::setObjectName + void ComponentShape::morphIntoRect(){ setData(1, "rectangle"); update(); diff --git a/BioTracker/CoreApp/BioTracker/View/ComponentShape.h b/BioTracker/CoreApp/BioTracker/View/ComponentShape.h index 45c6a63d..0d4e5ee0 100644 --- a/BioTracker/CoreApp/BioTracker/View/ComponentShape.h +++ b/BioTracker/CoreApp/BioTracker/View/ComponentShape.h @@ -65,6 +65,7 @@ class ComponentShape : public QGraphicsObject void unmarkShape(); void toggleFixTrack(); void createInfoWindow(); + void setObjectNameContext(QString name); void morphIntoRect(); void morphIntoEllipse(); void morphIntoPoint(); diff --git a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp index e997be31..e9aa09c4 100644 --- a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp +++ b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp @@ -452,9 +452,8 @@ void CoreParameterView::on_pushButton_finalizeExp_clicked() { _trialStarted = false; ui->pushButton_startExp->setText("Start Trial"); ui->label_ExpSt->setText("No Trial started!"); - Q_EMIT emitFinalizeExperiment(); Q_EMIT emitTrialStarted(false); - + Q_EMIT emitFinalizeExperiment(); } void CoreParameterView::on_label_ExpSrcCnt_clicked() { diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp index 1fdad330..46fcd933 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp @@ -963,6 +963,16 @@ void MainWindow::on_actionRight_panel_triggered(bool checked){ ui->rightPanelViewControllerButton->click(); } +void MainWindow::on_actionToggle_fullscreen_triggered(){ + if(isFullScreen()){ + showNormal(); + } + else{ + showFullScreen(); + } +} + + //////////////////////////////////Help////////////////////////////// void MainWindow::on_actionUser_guide_triggered(){ diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.h b/BioTracker/CoreApp/BioTracker/View/MainWindow.h index 78bd1ea7..a46e9db6 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.h +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.h @@ -100,6 +100,7 @@ class MainWindow : public IViewMainWindow { void on_actionToggle_view_toolbar_triggered(); void on_actionToggle_compact_menu_toolbar_2_triggered(); void on_actionToggle_video_toolbar_triggered(); + void on_actionToggle_fullscreen_triggered(); //view toolbar actions diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.ui b/BioTracker/CoreApp/BioTracker/View/MainWindow.ui index 18f2d83a..019c118e 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.ui +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.ui @@ -143,7 +143,7 @@ 0 - + 0 @@ -443,8 +443,8 @@ 0 0 - 705 - 304 + 738 + 294 @@ -466,8 +466,8 @@ 0 0 - 705 - 304 + 738 + 294 @@ -512,8 +512,8 @@ 0 0 - 705 - 304 + 738 + 294 @@ -548,8 +548,8 @@ 0 0 - 705 - 304 + 738 + 294 @@ -608,19 +608,19 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:9pt;">The BioTracker is a modular tracking software consisting of a core management framework and various trackers which you can 'plug in'. You can track on videos, picture and camera streams.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:9pt;"><br /></p> -<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:9pt; font-weight:600;">Basic steps</span></p> -<ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Load a medium (video, picture or camera stream) </li> -<li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Load a tracker (usually trackers are preloaded from the 'Plugins' directory) </li> -<li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the desired tracker options </li> -<li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Insert the objects to track if the tracker does not generate them automatically</li> -<li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can manage the tracking and trials in the 'Experiment' tab</li> -<li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Start tracking!</li></ol> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:0px; font-family:'Ubuntu'; font-size:9pt;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:9pt;"> </span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:9pt;">More information on how to use the BioTracker can be found in the </span><a href="https://github.com/BioroboticsLab/biotracker_core/wiki"><span style=" font-family:'Ubuntu'; font-size:9pt; text-decoration: underline; color:#0000ff;">user guide</span></a><span style=" font-family:'Ubuntu'; font-size:9pt;">.</span></p></body></html> +</style></head><body style=" font-family:'Ubuntu'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The BioTracker is a modular tracking software consisting of a core management framework and various trackers which you can 'plug in'. You can track on videos, picture and camera streams.</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Basic steps</span></p> +<ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Load a medium (video, picture or camera stream) </li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Load a tracker (usually trackers are preloaded from the 'Plugins' directory) </li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the desired tracker options </li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Insert the objects to track if the tracker does not generate them automatically</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can manage the tracking and trials in the 'Experiment' tab</li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Start tracking!</li></ol> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">More information on how to use the BioTracker can be found in the <a href="https://github.com/BioroboticsLab/biotracker_core/wiki"><span style=" text-decoration: underline; color:#0000ff;">user guide</span></a>.</p></body></html> true @@ -634,8 +634,8 @@ p, li { white-space: pre-wrap; } 0 0 - 705 - 304 + 738 + 294 @@ -684,7 +684,7 @@ p, li { white-space: pre-wrap; } 0 0 1022 - 21 + 18 @@ -731,6 +731,7 @@ p, li { white-space: pre-wrap; } + @@ -1306,6 +1307,17 @@ QToolButton { Show introduction + + + Toggle fullscreen + + + F11 + + + Qt::ApplicationShortcut + + From 7727df17a31b767e70f200caf81c0c88ea4e5d5c Mon Sep 17 00:00:00 2001 From: jonas Date: Tue, 20 Mar 2018 20:02:47 +0100 Subject: [PATCH 010/171] changed time degradation transparency and base transparency interaction added fullscreen shortcut to list --- .../BioTracker/View/ComponentShape.cpp | 62 +++++++++++++++++-- .../CoreApp/BioTracker/View/MainWindow.cpp | 1 + 2 files changed, 57 insertions(+), 6 deletions(-) diff --git a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp index f6811d06..abf12128 100644 --- a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp +++ b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp @@ -17,11 +17,14 @@ #include "QSlider" #include "QLineEdit" #include "QAbstractSlider" +#include "QComboBox" +#include "QSpinBox" #include #include #include #include #include +//#include ComponentShape::ComponentShape(QGraphicsObject* parent, IModelTrackedTrajectory* trajectory, int id): @@ -367,17 +370,23 @@ void ComponentShape::trace() QColor timeDegradationPenColor; if (m_tracingTimeDegradation == "Transparency") { - timeDegradationPenColor = QColor(m_penColor.red(), m_penColor.green(), m_penColor.blue(), (200.0f - (200.0f / (float)m_tracingLength) * i) + 30); + + float tr = (float)m_transparency; + float trForThis = tr != 0 ? tr - (tr / (float)m_tracingLength) * (i-1) : 0.0f; + + timeDegradationPenColor = QColor(m_penColor.red(), m_penColor.green(), m_penColor.blue(), trForThis); timeDegradationPen = QPen(timeDegradationPenColor, m_penWidth, Qt::SolidLine); - timeDegradationBrushColor = QColor(m_brushColor.red(), m_brushColor.green(), m_brushColor.blue(), (200.0f - (200.0f / (float)m_tracingLength) * i) + 30); + timeDegradationBrushColor = QColor(m_brushColor.red(), m_brushColor.green(), m_brushColor.blue(), trForThis); timeDegradationBrush = QBrush(timeDegradationBrushColor); } else if (m_tracingTimeDegradation == "False color") { float hue = (240.0f - ((240.0f / (float)m_tracingLength) * i)); timeDegradationPenColor = QColor::fromHsv((int)hue, 255.0f, 255.0f); + timeDegradationPenColor.setAlpha(m_transparency); timeDegradationBrushColor = QColor::fromHsv((int)hue, 255.0f, 255.0f); + timeDegradationBrushColor.setAlpha(m_transparency); timeDegradationPen = QPen(m_penColor, m_penWidth, m_penStyle); timeDegradationBrush = QBrush(timeDegradationBrushColor); } @@ -405,7 +414,7 @@ void ComponentShape::trace() QLineF base = QLineF(lastPointDifference, adjustedHistoryPointDifference); QGraphicsLineItem* lineItem = new QGraphicsLineItem(base, m_tracingLayer); - lineItem->setPen(QPen(timeDegradationBrushColor, m_penWidth, m_penStyle)); + lineItem->setPen(QPen(timeDegradationPenColor, m_penWidth, m_penStyle)); lastPointDifference = adjustedHistoryPointDifference; } @@ -426,9 +435,9 @@ void ComponentShape::trace() QGraphicsLineItem* baseItem = new QGraphicsLineItem(base, m_tracingLayer); baseItem->setPen(QPen(timeDegradationBrushColor, m_penWidth, m_penStyle)); QGraphicsLineItem* arm0Item = new QGraphicsLineItem(arm0, m_tracingLayer); - arm0Item->setPen(QPen(m_penColor, m_penWidth, m_penStyle)); + arm0Item->setPen(timeDegradationPen); QGraphicsLineItem* arm1Item = new QGraphicsLineItem(arm1, m_tracingLayer); - arm1Item->setPen(QPen(m_penColor, m_penWidth, m_penStyle)); + arm1Item->setPen(timeDegradationPen); lastPointDifference = adjustedHistoryPointDifference; } @@ -659,7 +668,48 @@ void ComponentShape::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) menu.addMenu(transparencyMenu); // - QAction *showProperties = menu.addSeparator(); + menu.addSeparator(); + + //tracing + QMenu* tracingMenu = new QMenu("Tracing"); + //tracing type + QWidgetAction* typeBox = new QWidgetAction(this); + QComboBox* typeCombo = new QComboBox; + QStringList types; + types << "No tracing" << "Shape" << "Path" << "Arrow Path"; + typeCombo->addItems(types); + typeCombo->setCurrentText(m_tracingStyle); + QObject::connect(typeCombo, QOverload::of(&QComboBox::currentIndexChanged), this, &ComponentShape::receiveTracingStyle); + typeBox->setDefaultWidget(typeCombo); + tracingMenu->addAction(typeBox); + //tracingHistory + QWidgetAction* historyBox = new QWidgetAction(this); + QSpinBox* historySpinBox = new QSpinBox; + historySpinBox->setValue(m_tracingLength); + QObject::connect(historySpinBox, QOverload::of(&QSpinBox::valueChanged), this, &ComponentShape::receiveTracingLength); + historyBox->setDefaultWidget(historySpinBox); + tracingMenu->addAction(historyBox); + //tracingSteps + QWidgetAction* stepsBox = new QWidgetAction(this); + QSpinBox* stepsSpinBox = new QSpinBox; + stepsSpinBox->setValue(m_tracingSteps); + QObject::connect(stepsSpinBox, QOverload::of(&QSpinBox::valueChanged), this, &ComponentShape::receiveTracingSteps); + stepsBox->setDefaultWidget(stepsSpinBox); + tracingMenu->addAction(stepsBox); + //tracingDegradation + QWidgetAction* degrBox = new QWidgetAction(this); + QComboBox* degrCombo = new QComboBox; + QStringList degrTypes; + degrTypes << "None" << "Transparency" << "False color"; + degrCombo->addItems(degrTypes); + degrCombo->setCurrentText(m_tracingTimeDegradation); + QObject::connect(degrCombo, QOverload::of(&QComboBox::currentIndexChanged), this, &ComponentShape::receiveTracingTimeDegradation); + degrBox->setDefaultWidget(degrCombo); + tracingMenu->addAction(degrBox); + + menu.addMenu(tracingMenu); + + menu.addSeparator(); //removing QAction *removeTrackAction = menu.addAction("Remove track", dynamic_cast(this), SLOT(removeTrack())); diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp index 46fcd933..0e0b979b 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp @@ -1041,6 +1041,7 @@ void MainWindow::on_actionShortcuts_triggered() { QLinkedList> scList; //TODO import this from file + scList.append(QPair(QString("F11"), QString("Toggle fullscreen"))); scList.append(QPair(QString("CTRL + Z"), QString("Undo"))); scList.append(QPair(QString("CTRL + Y"), QString("Redo"))); scList.append(QPair(QString("CTRL + A"), QString("Select all"))); From 854d43f4fb2e3d1689fb5ba67f7f59c63b1898f5 Mon Sep 17 00:00:00 2001 From: jonas Date: Thu, 22 Mar 2018 14:53:18 +0100 Subject: [PATCH 011/171] refactored qdebug messages edited introduction texts added tracing to entity contextmenu added 'add trajectory' and 'save data' buttons to coreparameterview --- .../Controller/ControllerCommands.cpp | 4 +- .../Controller/ControllerCoreParameter.cpp | 31 ++++----- .../Controller/ControllerMainWindow.cpp | 4 ++ .../Controller/ControllerMainWindow.h | 2 + .../Model/DataExporters/DataExporterCSV.cpp | 4 +- .../Model/DataExporters/DataExporterJson.cpp | 4 +- .../DataExporters/DataExporterSerialize.cpp | 4 +- .../CoreApp/BioTracker/Model/PluginLoader.cpp | 2 +- .../BioTracker/View/ComponentShape.cpp | 64 +++++++++++++++---- .../BioTracker/View/CoreParameterView.cpp | 9 +++ .../BioTracker/View/CoreParameterView.h | 11 ++-- .../BioTracker/View/CoreParameterView.ui | 33 +++++++--- .../CoreApp/BioTracker/View/MainWindow.cpp | 28 +++++--- .../CoreApp/BioTracker/View/MainWindow.h | 2 + .../CoreApp/BioTracker/View/MainWindow.ui | 9 ++- .../BioTracker/View/TrackedComponentView.cpp | 2 +- .../resources/introduction/intro.txt | 4 +- .../resources/introduction/right_panel.txt | 11 ++-- .../resources/introduction/toolbars.txt | 2 +- .../resources/introduction/tracking.txt | 9 +-- .../Controller/ControllerTrackedComponent.cpp | 14 ++-- .../Controller/ControllerTrackedComponent.cpp | 16 ++--- 22 files changed, 178 insertions(+), 91 deletions(-) diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerCommands.cpp b/BioTracker/CoreApp/BioTracker/Controller/ControllerCommands.cpp index 9212d732..e8da6014 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerCommands.cpp +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerCommands.cpp @@ -75,7 +75,7 @@ void ControllerCommands::receiveUndo() _undoStack->undo(); } else { - qDebug() << "Cannot undo the last command!"; + qDebug() << "CORE: Cannot undo the last command!"; } } @@ -85,7 +85,7 @@ void ControllerCommands::receiveRedo() _undoStack->redo(); } else { - qDebug() << "Cannot redo the next command!"; + qDebug() << "CORE: Csannot redo the next command!"; } } diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerCoreParameter.cpp b/BioTracker/CoreApp/BioTracker/Controller/ControllerCoreParameter.cpp index c56666b1..2288fc6b 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerCoreParameter.cpp +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerCoreParameter.cpp @@ -43,7 +43,7 @@ void ControllerCoreParameter::connectControllerToController() QObject::connect(view, &CoreParameterView::emitViewSwitch, tcview, &TrackedComponentView::receiveViewSwitch, Qt::DirectConnection); //Tracks //QObject::connect(view, &CoreParameterView::emitSelectAll, tcview, &TrackedComponentView::receiveSelectAll, Qt::DirectConnection); - //QObject::connect(view, &CoreParameterView::emitAddTrack, tcview, &TrackedComponentView::addTrajectory, Qt::DirectConnection); + QObject::connect(view, &CoreParameterView::emitAddTrack, tcview, &TrackedComponentView::addTrajectory, Qt::DirectConnection); //Track dimensions QObject::connect(view, &CoreParameterView::emitTrackOrientationLine, tcview, &TrackedComponentView::receiveTrackOrientationLine, Qt::DirectConnection); @@ -95,21 +95,22 @@ void ControllerCoreParameter::connectControllerToController() //Media Player { IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::PLAYER); - ControllerPlayer *mpc = static_cast(ctr); - MediaPlayer* mp = static_cast(mpc->getModel()); - QObject::connect(mp, &MediaPlayer::fwdPlayerParameters, view, &CoreParameterView::rcvPlayerParameters); - QObject::connect(view, &CoreParameterView::emitStartPlayback, mpc, &ControllerPlayer::play); + ControllerPlayer *mpc = static_cast(ctr); + MediaPlayer* mp = static_cast(mpc->getModel()); + QObject::connect(mp, &MediaPlayer::fwdPlayerParameters, view, &CoreParameterView::rcvPlayerParameters); + QObject::connect(view, &CoreParameterView::emitStartPlayback, mpc, &ControllerPlayer::play); QObject::connect(view, &CoreParameterView::emitStopPlayback, mpc, &ControllerPlayer::stop); QObject::connect(view, &CoreParameterView::emitPausePlayback, mpc, &ControllerPlayer::pause); } //Main Window { IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::MAINWINDOW); - ControllerMainWindow *mwc = static_cast(ctr); - QObject::connect(view, &CoreParameterView::emitEnableTracking, mwc, &ControllerMainWindow::activeTracking); + ControllerMainWindow *mwc = static_cast(ctr); + QObject::connect(view, &CoreParameterView::emitEnableTracking, mwc, &ControllerMainWindow::activeTracking); QObject::connect(view, &CoreParameterView::emitDisableTracking, mwc, &ControllerMainWindow::deactiveTrackring); - QObject::connect(view, &CoreParameterView::emitActivateTrackingSwitch, mwc, &ControllerMainWindow::activeTrackingCheckBox); + QObject::connect(view, &CoreParameterView::emitActivateTrackingSwitch, mwc, &ControllerMainWindow::activeTrackingCheckBox); QObject::connect(view, &CoreParameterView::emitDeactivateTrackingSwitch, mwc, &ControllerMainWindow::deactiveTrackingCheckBox); + QObject::connect(view, &CoreParameterView::emitSaveDataToFile, mwc, &ControllerMainWindow::receiveSaveTrajData); } view->triggerUpdate(); @@ -118,12 +119,12 @@ void ControllerCoreParameter::connectControllerToController() void ControllerCoreParameter::changeAreaDescriptorType(QString type) { if (dynamic_cast(m_View)) dynamic_cast(m_View)->areaDescriptorTypeChanged(type); -} - -void ControllerCoreParameter::receiveResetTrial() -{ - CoreParameterView* view = static_cast(m_View); - view->resetTrial(); +} + +void ControllerCoreParameter::receiveResetTrial() +{ + CoreParameterView* view = static_cast(m_View); + view->resetTrial(); } void ControllerCoreParameter::triggerUpdate() { @@ -161,7 +162,7 @@ void ControllerCoreParameter::setCorePermission(std::pair(m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::DATAEXPORT)))->getTrialNumber(); } diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerMainWindow.cpp b/BioTracker/CoreApp/BioTracker/Controller/ControllerMainWindow.cpp index a521d2e9..5a40861d 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerMainWindow.cpp +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerMainWindow.cpp @@ -120,6 +120,10 @@ void ControllerMainWindow::activeTrackingCheckBox() { dynamic_cast(m_View)->activeTrackingCheckBox(); } +void ControllerMainWindow::receiveSaveTrajData(){ + dynamic_cast(m_View)->saveDataToFile(); +} + void ControllerMainWindow::createModel() { // no model for MainWindow diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerMainWindow.h b/BioTracker/CoreApp/BioTracker/Controller/ControllerMainWindow.h index beb18155..d39939f1 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerMainWindow.h +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerMainWindow.h @@ -102,6 +102,8 @@ class ControllerMainWindow : public IController { */ void deactiveTrackring(); + void receiveSaveTrajData(); + // IController interface protected: void createModel() override; diff --git a/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterCSV.cpp b/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterCSV.cpp index 0ce5bd70..b417826d 100644 --- a/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterCSV.cpp +++ b/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterCSV.cpp @@ -168,7 +168,7 @@ void DataExporterCSV::loadFile(std::string file) void DataExporterCSV::write(int idx) { if (!_root) { - qDebug() << "No output opened!"; + qDebug() << "CORE: No output opened!"; return; } @@ -207,7 +207,7 @@ void DataExporterCSV::finalizeAndReInit() { void DataExporterCSV::writeAll(std::string f) { //Sanity if (!_root) { - qDebug() << "No output opened!"; + qDebug() << "CORE: No output opened!"; return; } if (_ofs.is_open()) { diff --git a/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterJson.cpp b/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterJson.cpp index 480d5919..0a3337ed 100644 --- a/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterJson.cpp +++ b/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterJson.cpp @@ -131,7 +131,7 @@ std::string DataExporterJson::writeTrackpoint(IModelTrackedPoint *e, int trajNum void DataExporterJson::write(int idx) { if (!_root) { - qDebug() << "No output opened!"; + qDebug() << "CORE: No output opened!"; return; } @@ -169,7 +169,7 @@ void DataExporterJson::loadFile(std::string file) { void DataExporterJson::writeAll(std::string f) { //Sanity if (!_root) { - qDebug() << "No output opened!"; + qDebug() << "CORE: No output opened!"; return; } if (_ofs.is_open()) { diff --git a/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterSerialize.cpp b/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterSerialize.cpp index e180df45..9f74d0f9 100644 --- a/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterSerialize.cpp +++ b/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterSerialize.cpp @@ -31,7 +31,7 @@ std::string DataExporterSerialize::writeTrackpoint(IModelTrackedPoint *e, int tr void DataExporterSerialize::write(int idx) { if (!_root) { - qDebug() << "No output opened!"; + qDebug() << "CORE: No output opened!"; return; } @@ -91,7 +91,7 @@ void DataExporterSerialize::loadFile(std::string file){ void DataExporterSerialize::writeAll(std::string f) { //Sanity if (!_root) { - qDebug() << "No output opened!"; + qDebug() << "CORE: No output opened!"; return; } if (_ofs.is_open()) { diff --git a/BioTracker/CoreApp/BioTracker/Model/PluginLoader.cpp b/BioTracker/CoreApp/BioTracker/Model/PluginLoader.cpp index d9bf5de0..9d5fa933 100644 --- a/BioTracker/CoreApp/BioTracker/Model/PluginLoader.cpp +++ b/BioTracker/CoreApp/BioTracker/Model/PluginLoader.cpp @@ -55,7 +55,7 @@ bool PluginLoader::loadPluginFromFilename(QString filename) { retval = false; } - qDebug() << "Plugin loaded: " << m_PluginLoader->fileName(); + qDebug() << "CORE: Plugin loaded: " << m_PluginLoader->fileName(); m_isPluginLoaded = retval; diff --git a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp index abf12128..96d1c4bc 100644 --- a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp +++ b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp @@ -608,7 +608,9 @@ void ComponentShape::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) { QMenu menu; - // create the info box + /* + create the info box + */ QWidgetAction* infoBox = new QWidgetAction(this); QString info = QString("ID: "); @@ -620,8 +622,12 @@ void ComponentShape::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) infoBox->setDefaultWidget(infoLabel); menu.addAction(infoBox); + // menu.addSeparator(); - //set object name - line edit + + /* + create set object name - line edit + */ QWidgetAction* objectNameAction = new QWidgetAction(this); QLineEdit* objectEdit = new QLineEdit(); @@ -640,15 +646,21 @@ void ComponentShape::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) objectNameAction->setDefaultWidget(objectEdit); menu.addAction(objectNameAction); - //show info window for current frame + /* + show info window for current frame + */ menu.addSeparator(); QAction *showInfoAction = menu.addAction("Show full info", dynamic_cast(this), SLOT(createInfoWindow())); - //coloring + /* + coloring + */ QAction *changeBrushColorAction = menu.addAction("Change fill color",dynamic_cast(this),SLOT(changeBrushColor())); QAction *changePenColorAction = menu.addAction("Change border color", dynamic_cast(this), SLOT(changePenColor())); - //transparency slider + /* + transparency slider + */ QMenu* transparencyMenu = new QMenu("Transparency"); QWidgetAction* sliderBox = new QWidgetAction(this); QSlider* transparencySlider = new QSlider(Qt::Horizontal); @@ -670,7 +682,9 @@ void ComponentShape::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) // menu.addSeparator(); - //tracing + /* + tracing menu + */ QMenu* tracingMenu = new QMenu("Tracing"); //tracing type QWidgetAction* typeBox = new QWidgetAction(this); @@ -681,21 +695,32 @@ void ComponentShape::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) typeCombo->setCurrentText(m_tracingStyle); QObject::connect(typeCombo, QOverload::of(&QComboBox::currentIndexChanged), this, &ComponentShape::receiveTracingStyle); typeBox->setDefaultWidget(typeCombo); - tracingMenu->addAction(typeBox); + QMenu* tracingTypeMenu = new QMenu("Type"); + tracingTypeMenu->addAction(typeBox); + tracingMenu->addMenu(tracingTypeMenu); + //tracingHistory QWidgetAction* historyBox = new QWidgetAction(this); QSpinBox* historySpinBox = new QSpinBox; historySpinBox->setValue(m_tracingLength); + historySpinBox->setPrefix("History: "); + historySpinBox->setMinimum(1); + historySpinBox->setMaximum(100000); QObject::connect(historySpinBox, QOverload::of(&QSpinBox::valueChanged), this, &ComponentShape::receiveTracingLength); historyBox->setDefaultWidget(historySpinBox); tracingMenu->addAction(historyBox); + //tracingSteps QWidgetAction* stepsBox = new QWidgetAction(this); QSpinBox* stepsSpinBox = new QSpinBox; stepsSpinBox->setValue(m_tracingSteps); + stepsSpinBox->setPrefix("Steps: "); + stepsSpinBox->setMinimum(1); + stepsSpinBox->setMaximum(100000); QObject::connect(stepsSpinBox, QOverload::of(&QSpinBox::valueChanged), this, &ComponentShape::receiveTracingSteps); stepsBox->setDefaultWidget(stepsSpinBox); tracingMenu->addAction(stepsBox); + //tracingDegradation QWidgetAction* degrBox = new QWidgetAction(this); QComboBox* degrCombo = new QComboBox; @@ -705,13 +730,18 @@ void ComponentShape::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) degrCombo->setCurrentText(m_tracingTimeDegradation); QObject::connect(degrCombo, QOverload::of(&QComboBox::currentIndexChanged), this, &ComponentShape::receiveTracingTimeDegradation); degrBox->setDefaultWidget(degrCombo); - tracingMenu->addAction(degrBox); + QMenu* tracingTimeDegrMenu = new QMenu("Time degradation"); + tracingTimeDegrMenu->addAction(degrBox); + tracingMenu->addMenu(tracingTimeDegrMenu); menu.addMenu(tracingMenu); + // menu.addSeparator(); - //removing + /* + removing + */ QAction *removeTrackAction = menu.addAction("Remove track", dynamic_cast(this), SLOT(removeTrack())); QAction *removeTrackEntityAction = menu.addAction("Remove track entity", dynamic_cast(this), SLOT(removeTrackEntity())); if (!m_pRemovable) { @@ -719,11 +749,15 @@ void ComponentShape::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) removeTrackEntityAction->setEnabled(false); } - //fixing + /* + fixing + */ QString fixText = m_fixed?"Unfix track":"Fix Track"; QAction *fixTrackAction = menu.addAction(fixText, dynamic_cast(this), SLOT(toggleFixTrack())); - //marking + /* + marking + */ QString markText = m_marked?"Unmark":"Mark"; QAction *markAction = menu.addAction(markText, dynamic_cast(this), SLOT(markShape())); QAction *unmarkAction = menu.addAction(markText, dynamic_cast(this), SLOT(unmarkShape())); @@ -731,9 +765,11 @@ void ComponentShape::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) unmarkAction->setVisible(m_marked); // - QAction *sep2 = menu.addSeparator(); + menu.addSeparator(); - //morphing + /* + morphing + */ QMenu* morphMenu = new QMenu("Morph into..."); if(data(1)=="rectangle" || data(1) == "ellipse" || data(1) == "point"){ QAction* morphPoint = morphMenu->addAction("Point", dynamic_cast(this), SLOT(morphIntoPoint())); @@ -745,7 +781,7 @@ void ComponentShape::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) } menu.addMenu(morphMenu); - + // QAction *selectedAction = menu.exec(event->screenPos()); } diff --git a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp index e9aa09c4..4b2422c5 100644 --- a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp +++ b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp @@ -420,6 +420,7 @@ void CoreParameterView::on_pushButton_startExp_clicked() { _trialStarted = true; emitTrialStarted(true); emitFinalizeExperiment(); + emitPausePlayback(); QMessageBox::information(0, "New trial", "You started a new trial! Previous data was saved and reset.\n\nGo to the timespot in the video you want to track at." "\n\nPlease add the number of objects you want to track as trajectories.\nResume the video." ); } @@ -471,6 +472,14 @@ void CoreParameterView::on_trialHelpButton_clicked() "'Resume trial' will cause the tracking to be activated AND the video to be resumed"); } +void CoreParameterView::on_pushButton_saveData_clicked(){ + emitSaveDataToFile(); +} + +void CoreParameterView::on_pushButton_addTraj_clicked(){ + emitAddTrack(); +} + void CoreParameterView::rcvPlayerParameters(playerParameters* parameters) { QFileInfo f(parameters->m_CurrentFilename); _currentFile = f.baseName(); diff --git a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.h b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.h index d80f50e7..8f389582 100644 --- a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.h +++ b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.h @@ -81,9 +81,9 @@ class CoreParameterView : public IViewWidget void on_checkBoxAntialiasingEntities_toggled(bool toggle); void on_checkBoxAntialiasingFull_toggled(bool toggle); - /* - EXPERIMENT TAB - */ +/* +EXPERIMENT TAB +*/ //label_ExpTrialNo //label_ExpSrcCnt @@ -94,6 +94,8 @@ class CoreParameterView : public IViewWidget void on_pushButton_finalizeExp_clicked(); void on_label_ExpSrcCnt_clicked(); void on_trialHelpButton_clicked(); + void on_pushButton_saveData_clicked(); + void on_pushButton_addTraj_clicked(); public slots: void rcvPlayerParameters(playerParameters* parameters); @@ -112,13 +114,14 @@ public slots: void emitStopPlayback(); void emitPausePlayback(); void emitTrialStarted(bool started); + void emitSaveDataToFile(); //Enable view void emitViewSwitch(bool lever); //Select all tracks //void emitSelectAll(); - //Set number of tracks + //Add tracks void emitAddTrack(); //Ignore zoom void emitIgnoreZoom(bool toggle); diff --git a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui index 1eadf5bc..8045663e 100644 --- a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui +++ b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui @@ -156,8 +156,8 @@ 0 0 - 316 - 844 + 293 + 935 @@ -972,6 +972,9 @@ 1 + + 100000 + 1 @@ -1504,7 +1507,7 @@ Resets when removing the tracks from the "Tracks" folder. - 50 + 80 16777215 @@ -1562,7 +1565,7 @@ Select a source in the "File" menu. - 50 + 80 16777215 @@ -1615,7 +1618,7 @@ You can add some by right-clicking the video (if loaded). - 50 + 80 16777215 @@ -1645,6 +1648,13 @@ You can add some by right-clicking the video (if loaded). + + + + Add a trajectory + + + @@ -1664,12 +1674,12 @@ You can add some by right-clicking the video (if loaded). - 50 + 80 16777215 - Trial Status + Trial Status: @@ -1737,12 +1747,19 @@ data to the "Tracks" directory and increment the trial count. If no trial is active this button saves and resets the current data. - Save Trial and Reset Data + Finalize and Save Trial and Reset Data + + + + Save Data + + + diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp index 0e0b979b..79aedaba 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp @@ -262,7 +262,7 @@ void MainWindow::createIntroductionWizard(){ QObject::connect(noShowCheck, &QCheckBox::toggled, this, &MainWindow::toggleNoShowWiz); - //intrduction + //introduction QWizardPage* p1 = new QWizardPage; { p1->setTitle("BioTracker 3 - Introduction"); @@ -278,6 +278,7 @@ void MainWindow::createIntroductionWizard(){ QFile file(":/Introduction/resources/introduction/intro.txt"); QLabel *introLabel= new QLabel; + introLabel->setWordWrap(true); //read introduction text from file QString line; @@ -296,6 +297,7 @@ void MainWindow::createIntroductionWizard(){ textScroll->setFrameShape(QFrame::NoFrame); textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); textScroll->setWidget(introLabel); + textScroll->setWidgetResizable(true); layout->addWidget(textScroll); layout->setAlignment(Qt::AlignHCenter); p1->setLayout(layout); @@ -323,6 +325,7 @@ void MainWindow::createIntroductionWizard(){ textScroll->setFrameShape(QFrame::NoFrame); textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); textScroll->setWidget(label); + textScroll->setWidgetResizable(true); layout->addWidget(textScroll); layout->setAlignment(Qt::AlignHCenter); p2->setLayout(layout); @@ -337,6 +340,7 @@ void MainWindow::createIntroductionWizard(){ QPixmap overviewImg(":/Introduction/resources/introduction/images/toolbars.png"); QPixmap scaledImg = overviewImg.scaled(QSize(600,400),Qt::KeepAspectRatio, Qt::SmoothTransformation); QLabel* imgLabel = new QLabel; + imgLabel->setPixmap(scaledImg); //read toolbar text from file @@ -361,6 +365,7 @@ void MainWindow::createIntroductionWizard(){ textScroll->setFrameShape(QFrame::NoFrame); textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); textScroll->setWidget(label); + textScroll->setWidgetResizable(true); layout->addWidget(textScroll); layout->setAlignment(Qt::AlignHCenter); p3->setLayout(layout); @@ -400,6 +405,7 @@ void MainWindow::createIntroductionWizard(){ textScroll->setFrameShape(QFrame::NoFrame); textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); textScroll->setWidget(label); + textScroll->setWidgetResizable(true); layout->addWidget(textScroll); layout->setAlignment(Qt::AlignHCenter); @@ -440,6 +446,7 @@ void MainWindow::createIntroductionWizard(){ textScroll->setFrameShape(QFrame::NoFrame); textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); textScroll->setWidget(label); + textScroll->setWidgetResizable(true); layout->addWidget(textScroll); layout->setAlignment(Qt::AlignHCenter); @@ -491,6 +498,7 @@ void MainWindow::createIntroductionWizard(){ textScroll->setFrameShape(QFrame::NoFrame); textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); textScroll->setWidget(label); + textScroll->setWidgetResizable(true); outerLayout->addWidget(textScroll); outerLayout->addWidget(noShowCheck); @@ -696,6 +704,15 @@ void MainWindow::deactivateTrackingCheckBox() { _trackerActivator->setEnabled(false); } +void MainWindow::saveDataToFile(){ + static const QString fileFilter( + "tracking data files (*.csv *.dat *.json)"); + + boost::filesystem::path file; + QString f = QFileDialog::getSaveFileName(this, "Save trajectory data to file", "", fileFilter, 0); + + qobject_cast (getController())->saveTrajectoryFile(f.toStdString()); +} //SLOTS @@ -769,14 +786,7 @@ void MainWindow::on_actionLoad_trackingdata_triggered() { } void MainWindow::on_actionSave_trackingdata_triggered() { - static const QString imageFilter( - "tracking data files (*.csv *.dat *.json)"); - - boost::filesystem::path file; - QString f = QFileDialog::getSaveFileName(this, "Open image files", "", imageFilter, 0); - - qobject_cast (getController())->saveTrajectoryFile(f.toStdString()); - + saveDataToFile(); } void MainWindow::on_actionOpen_Camera_triggered() { diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.h b/BioTracker/CoreApp/BioTracker/View/MainWindow.h index a46e9db6..7f4dc346 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.h +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.h @@ -54,6 +54,8 @@ class MainWindow : public IViewMainWindow { //intro wizard void createIntroductionWizard(); + void saveDataToFile(); + void checkTrackerGroupBox(); void checkMediaGroupBox(); void activateTracking(); diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.ui b/BioTracker/CoreApp/BioTracker/View/MainWindow.ui index 019c118e..e8172c1b 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.ui +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.ui @@ -614,10 +614,13 @@ p, li { white-space: pre-wrap; } <p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Basic steps</span></p> <ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Load a medium (video, picture or camera stream) </li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Load a tracker (usually trackers are preloaded from the 'Plugins' directory) </li> -<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the desired tracker options </li> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the desired tracker options </li> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:0px;"><span style=" font-size:8pt; font-style:italic;">(This often takes some time to figure out)</span></p> +<li style=" font-size:8pt; font-style:italic;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-style:normal;">You can manage the tracking and trials in the 'Experiment' tab</span></li> <li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Insert the objects to track if the tracker does not generate them automatically</li> -<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can manage the tracking and trials in the 'Experiment' tab</li> -<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Start tracking!</li></ol> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:0px;"><span style=" font-size:8pt; font-style:italic;">(If you want to track two objects, add two tracks by right clicking the video or using the button on the left toolbar)</span></p> +<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Start tracking by having the tracking activated and playing the video!</li></ol> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:0px;"><br /></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">More information on how to use the BioTracker can be found in the <a href="https://github.com/BioroboticsLab/biotracker_core/wiki"><span style=" text-decoration: underline; color:#0000ff;">user guide</span></a>.</p></body></html> diff --git a/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp b/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp index d675165e..f7a82fe1 100644 --- a/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp +++ b/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp @@ -472,7 +472,7 @@ void TrackedComponentView::contextMenuEvent(QGraphicsSceneContextMenuEvent * eve infoBox->setDefaultWidget(infoLabel); menu.addAction(infoBox); menu.addSeparator(); - QAction *addComponentAction = menu.addAction("Add entity here", dynamic_cast(this), SLOT(addTrajectory())); + QAction *addComponentAction = menu.addAction("Add trajectory here", dynamic_cast(this), SLOT(addTrajectory())); QAction *swapIdsAction = menu.addAction("Swap ID's", dynamic_cast(this), SLOT(swapIds())); QAction *unmarkAllAction = menu.addAction("Unmark all...", dynamic_cast(this), SLOT(unmarkAll())); QAction *removeSelectedAction = menu.addAction("Remove selected tracks", dynamic_cast(this), SLOT(removeTrajectories())); diff --git a/BioTracker/CoreApp/BioTracker/resources/introduction/intro.txt b/BioTracker/CoreApp/BioTracker/resources/introduction/intro.txt index 1dc71fb5..e47c5b87 100644 --- a/BioTracker/CoreApp/BioTracker/resources/introduction/intro.txt +++ b/BioTracker/CoreApp/BioTracker/resources/introduction/intro.txt @@ -1,4 +1,4 @@ -The BioTracker is a open-source tracking software. -It is designed to be highly modular. +The BioTracker is a open-source tracking software. It is designed to be modular regarding trackers. + Load a tracker, load a medium and start tracking! diff --git a/BioTracker/CoreApp/BioTracker/resources/introduction/right_panel.txt b/BioTracker/CoreApp/BioTracker/resources/introduction/right_panel.txt index b6f6483b..3fffbffe 100644 --- a/BioTracker/CoreApp/BioTracker/resources/introduction/right_panel.txt +++ b/BioTracker/CoreApp/BioTracker/resources/introduction/right_panel.txt @@ -1,8 +1,7 @@ The right panel consists of different tabs. - -- Experiment: Control your experiment. Start/Stop a trial and save your data by finalizing -- Visualization options: Control the visualization paramters -- Tracker options: Control the tracker parameters -- How to use BioTracker: Show some basic steps on how to use the BioTracker -- Notifications: Displays notifications bothfrom the loaded tracker and the core application +- Experiment: Control your experiment. Start/Stop a trial and save your data by finalizing. +- Visualization options: Control the visualization parameters. +- Tracker options: Control the tracker parameters. +- How to use BioTracker: Show some basic steps on how to use the BioTracker. +- Notifications: Displays notifications bothfrom the loaded tracker and the core application. diff --git a/BioTracker/CoreApp/BioTracker/resources/introduction/toolbars.txt b/BioTracker/CoreApp/BioTracker/resources/introduction/toolbars.txt index fb69983e..f59d7e7e 100644 --- a/BioTracker/CoreApp/BioTracker/resources/introduction/toolbars.txt +++ b/BioTracker/CoreApp/BioTracker/resources/introduction/toolbars.txt @@ -3,7 +3,7 @@ First of all, there are the toolbars. The upper toolbar controls the loading of media, trackers and tracks. Additionaly you can switch between the loaded trackers and control the activation of the tracking. -The right toolbar controls the tracks and lets you add annotations to each frame of the video. +The left toolbar controls the tracks and lets you add annotations to each frame of the video. The lower/video toolbar controls the video and shows playback information. Screenshots and recording are both possible. diff --git a/BioTracker/CoreApp/BioTracker/resources/introduction/tracking.txt b/BioTracker/CoreApp/BioTracker/resources/introduction/tracking.txt index 255ee351..2dcee641 100644 --- a/BioTracker/CoreApp/BioTracker/resources/introduction/tracking.txt +++ b/BioTracker/CoreApp/BioTracker/resources/introduction/tracking.txt @@ -1,11 +1,12 @@ +We are assuming that you have a tracking experiment, want to start a trial and save the data afterwards. 1. Load a medium (video, picture or camera stream) 2. Load a tracker (usually trackers are preloaded from the 'Plugins' directory) 3 Choose the desired tracker options (This often takes some time to figure out) +5. Go to the Experiment tab and click 'Start trial'. + (The video gets paused when you starta new trial) 4. Insert the objects to track if the tracker does not generate them automatically (If you want to track two objects, add two tracks by right clicking the video or using the button on the left toolbar) -5. Go to the Experiment tab and Start a trial. - (You can pause the video meanwhile) -6. After you are done tracking, finalize the trial. -7. The data is only then written to a file. \ No newline at end of file +6. After you are done tracking, finalize and save the trial. +7. The data is then written to a file. diff --git a/BioTracker/Plugin/BackgroundSubtraction/Controller/ControllerTrackedComponent.cpp b/BioTracker/Plugin/BackgroundSubtraction/Controller/ControllerTrackedComponent.cpp index f35ba46b..57b1ac92 100644 --- a/BioTracker/Plugin/BackgroundSubtraction/Controller/ControllerTrackedComponent.cpp +++ b/BioTracker/Plugin/BackgroundSubtraction/Controller/ControllerTrackedComponent.cpp @@ -43,7 +43,7 @@ IView *ControllerTrackedComponent::getTrackingElementsWidget() void ControllerTrackedComponent::receiveRemoveTrajectory(IModelTrackedTrajectory * trajectory) { trajectory->setValid(false); - qDebug() << "track" << trajectory->getId() << "set invalid"; + qDebug() << "TRACKER: Track" << trajectory->getId() << "set invalid"; } void ControllerTrackedComponent::receiveRemoveTrajectoryId(int id) @@ -52,7 +52,7 @@ void ControllerTrackedComponent::receiveRemoveTrajectoryId(int id) if (allTraj) { IModelTrackedComponent* traj = allTraj->getChild(id - 1); traj->setValid(false); - qDebug() << "track" << id << "set invalid"; + qDebug() << "TRACKER: Track" << id << "set invalid"; } } @@ -62,20 +62,20 @@ void ControllerTrackedComponent::receiveValidateTrajectory(int id) if (allTraj) { IModelTrackedComponent* traj = allTraj->getChild(id - 1); traj->setValid(true); - qDebug() << "track" << id << "validated"; + qDebug() << "TRACKER: Track" << id << "validated"; } } void ControllerTrackedComponent::receiveValidateEntity(IModelTrackedTrajectory * trajectory, uint frameNumber) { trajectory->getChild(frameNumber)->setValid(true); - qDebug() << "track " << trajectory->getId() << " entity #" << frameNumber << "set valid"; + qDebug() << "TRACKER: Track " << trajectory->getId() << " entity #" << frameNumber << "set valid"; } void ControllerTrackedComponent::receiveRemoveTrackEntity(IModelTrackedTrajectory * trajectory, uint frameNumber) { trajectory->getChild(frameNumber)->setValid(false); - qDebug() << "Track " << trajectory->getId() << " entity #" << frameNumber << "deleted (set invalid)"; + qDebug() << "TRACKER: Track " << trajectory->getId() << " entity #" << frameNumber << "deleted (set invalid)"; } void ControllerTrackedComponent::receiveAddTrajectory(QPoint position) @@ -138,14 +138,14 @@ void ControllerTrackedComponent::receiveSwapIds(IModelTrackedTrajectory * trajec traj0->setId(traj1Id); traj1->setId(traj0Id); - qDebug() << "Swap IDs " << traj0Id << "and " << traj1Id; + qDebug() << "TRACKER: Swap IDs " << traj0Id << "and " << traj1Id; } } } void ControllerTrackedComponent::receiveToggleFixTrack(IModelTrackedTrajectory * trajectory, bool toggle) { - qDebug() << "Fix trajectory " << trajectory->getId(); + qDebug() << "TRACKER: Fix trajectory " << trajectory->getId(); trajectory->setFixed(toggle); } diff --git a/BioTracker/Plugin/LukasKanade/Controller/ControllerTrackedComponent.cpp b/BioTracker/Plugin/LukasKanade/Controller/ControllerTrackedComponent.cpp index 4932b510..fe71f80a 100644 --- a/BioTracker/Plugin/LukasKanade/Controller/ControllerTrackedComponent.cpp +++ b/BioTracker/Plugin/LukasKanade/Controller/ControllerTrackedComponent.cpp @@ -52,7 +52,7 @@ IView *ControllerTrackedComponent::getTrackingElementsWidget() void ControllerTrackedComponent::receiveRemoveTrajectory(IModelTrackedTrajectory * trajectory) { trajectory->setValid(false); - qDebug() << "Trajectory" << trajectory->getId() << "set invalid"; + qDebug() << "TRACKER: Trajectory" << trajectory->getId() << "set invalid"; } void ControllerTrackedComponent::receiveRemoveTrajectoryId(int id) @@ -61,7 +61,7 @@ void ControllerTrackedComponent::receiveRemoveTrajectoryId(int id) if (allTraj) { IModelTrackedComponent* traj = allTraj->getChild(id - 1); traj->setValid(false); - qDebug() << "Track" << id << "set invalid"; + qDebug() << "TRACKER: Track" << id << "set invalid"; } } @@ -71,20 +71,20 @@ void ControllerTrackedComponent::receiveValidateTrajectory(int id) if (allTraj) { IModelTrackedComponent* traj = allTraj->getChild(id - 1); traj->setValid(true); - qDebug() << "Track" << id << "validated"; + qDebug() << "TRACKER: Track" << id << "validated"; } } void ControllerTrackedComponent::receiveValidateEntity(IModelTrackedTrajectory * trajectory, uint frameNumber) { trajectory->getChild(frameNumber)->setValid(true); - qDebug() << "Track " << trajectory->getId() << " entity #" << frameNumber << "set valid"; + qDebug() << "TRACKER: Track " << trajectory->getId() << " entity #" << frameNumber << "set valid"; } void ControllerTrackedComponent::receiveRemoveTrackEntity(IModelTrackedTrajectory * trajectory, uint frameNumber) { trajectory->getChild(frameNumber)->setValid(false); - qDebug() << "Track " << trajectory->getId() << " entity #" << frameNumber << "set invalid"; + qDebug() << "TRACKER: Track " << trajectory->getId() << " entity #" << frameNumber << "set invalid"; } void ControllerTrackedComponent::receiveAddTrajectory(QPoint position) @@ -101,7 +101,7 @@ void ControllerTrackedComponent::receiveAddTrajectory(QPoint position) TrackedTrajectory* allTraj = qobject_cast(m_Model); if (allTraj) { allTraj->add(newTraj); - qDebug() << "Track added at" << firstElem->getX() << "," << firstElem->getY(); + qDebug() << "TRACKER: Track added at" << firstElem->getX() << "," << firstElem->getY(); } } @@ -117,7 +117,7 @@ void ControllerTrackedComponent::receiveMoveElement(IModelTrackedTrajectory* tra //qDebug() << "plugin-pos:" << position; } else { - qDebug() << "Entity to move not found (moved and deleted?): " << position; + qDebug() << "TRACKER: Entity to move not found (moved and deleted?): " << position; } } } @@ -136,7 +136,7 @@ void ControllerTrackedComponent::receiveSwapIds(IModelTrackedTrajectory * trajec traj0->setId(traj1Id); traj1->setId(traj0Id); - qDebug() << "Swap IDs " << traj0Id << "and " << traj1Id; + qDebug() << "TRACKER: Swap IDs " << traj0Id << "and " << traj1Id; } } From edb3a039fec065a1ec2cf1984f30e5ba450a498d Mon Sep 17 00:00:00 2001 From: David Dormagen Date: Thu, 22 Mar 2018 15:34:05 +0100 Subject: [PATCH 012/171] ComponentShape: fix compilation by including cmath --- BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp index 0a2bf0bc..c9137ebf 100644 --- a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp +++ b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp @@ -1,4 +1,5 @@ #include "ComponentShape.h" +#include #include "QBrush" #include "QPainter" #include "QMenu" From d3b1ee3c829a19e0ef97f28df26192ed521ace94 Mon Sep 17 00:00:00 2001 From: jonas Date: Thu, 22 Mar 2018 17:50:00 +0100 Subject: [PATCH 013/171] fixed bug when tracer path length is 0 added some options to shape context menu --- .../BioTracker/View/ComponentShape.cpp | 123 +++++++++++++++++- .../CoreApp/BioTracker/View/ComponentShape.h | 2 + .../BioTracker/View/CoreParameterView.ui | 2 +- .../CoreApp/BioTracker/View/MainWindow.cpp | 2 +- .../CoreApp/BioTracker/View/MainWindow.ui | 8 +- 5 files changed, 124 insertions(+), 13 deletions(-) diff --git a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp index 96d1c4bc..a52073cc 100644 --- a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp +++ b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp @@ -19,6 +19,8 @@ #include "QAbstractSlider" #include "QComboBox" #include "QSpinBox" +#include "QDoubleSpinBox" +#include "QCheckBox" #include #include #include @@ -412,14 +414,20 @@ void ComponentShape::trace() //PATH else if (m_tracingStyle == "Path") { - QLineF base = QLineF(lastPointDifference, adjustedHistoryPointDifference); - QGraphicsLineItem* lineItem = new QGraphicsLineItem(base, m_tracingLayer); - lineItem->setPen(QPen(timeDegradationPenColor, m_penWidth, m_penStyle)); + if(lastPointDifference != adjustedHistoryPointDifference){ - lastPointDifference = adjustedHistoryPointDifference; + QLineF base = QLineF(lastPointDifference, adjustedHistoryPointDifference); + QGraphicsLineItem* lineItem = new QGraphicsLineItem(base, m_tracingLayer); + lineItem->setPen(QPen(timeDegradationPenColor, m_penWidth, m_penStyle)); + + lastPointDifference = adjustedHistoryPointDifference; + } } //ARROWPATH else if (m_tracingStyle == "Arrow path") { + + if(lastPointDifference != adjustedHistoryPointDifference){ + QLineF base = QLineF(lastPointDifference, adjustedHistoryPointDifference); int armLength = std::floor(base.length() / 9) + 2; @@ -440,6 +448,8 @@ void ComponentShape::trace() arm1Item->setPen(timeDegradationPen); lastPointDifference = adjustedHistoryPointDifference; + + } } //add framenumber to each tracer @@ -651,6 +661,7 @@ void ComponentShape::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) */ menu.addSeparator(); QAction *showInfoAction = menu.addAction("Show full info", dynamic_cast(this), SLOT(createInfoWindow())); + menu.addSeparator(); /* coloring @@ -681,8 +692,59 @@ void ComponentShape::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) // menu.addSeparator(); + /* + dimension menu + */ + QMenu* dimensionMenu = new QMenu("Dimensions"); + + //Width + QWidgetAction* widthBox = new QWidgetAction(this); + QSpinBox* widthSpin = new QSpinBox; + widthSpin->setPrefix("Width: "); + widthSpin->setMinimum(1); + widthSpin->setMaximum(100000); + widthSpin->setValue(m_w); + QObject::connect(widthSpin, QOverload::of(&QSpinBox::valueChanged), this, &ComponentShape::receiveWidth); + widthBox->setDefaultWidget(widthSpin); + dimensionMenu->addAction(widthBox); + + //Height + QWidgetAction* heightBox = new QWidgetAction(this); + QSpinBox* heightSpin = new QSpinBox; + heightSpin->setPrefix("Height: "); + heightSpin->setMinimum(1); + heightSpin->setMaximum(100000); + heightSpin->setValue(m_w); + QObject::connect(heightSpin, QOverload::of(&QSpinBox::valueChanged), this, &ComponentShape::receiveHeight); + heightBox->setDefaultWidget(heightSpin); + dimensionMenu->addAction(heightBox); - /* + // + menu.addMenu(dimensionMenu); + + /* + toggle orientation line + */ + QWidgetAction* orientationBox = new QWidgetAction(this); + QCheckBox* orientationCheck = new QCheckBox(); + orientationCheck->setText("Show orientation line"); + orientationCheck->setChecked(m_orientationLine); + QObject::connect(orientationCheck, &QCheckBox::toggled, this, &ComponentShape::receiveToggleOrientationLine); + orientationBox->setDefaultWidget(orientationCheck); + menu.addAction(orientationBox); + + /* + toggle id + */ + QWidgetAction* idBox = new QWidgetAction(this); + QCheckBox* idCheck = new QCheckBox(); + idCheck->setText("Show ID"); + idCheck->setChecked(m_showId); + QObject::connect(idCheck, &QCheckBox::toggled, this, &ComponentShape::receiveShowId); + idBox->setDefaultWidget(idCheck); + menu.addAction(idBox); + + /* tracing menu */ QMenu* tracingMenu = new QMenu("Tracing"); @@ -702,10 +764,10 @@ void ComponentShape::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) //tracingHistory QWidgetAction* historyBox = new QWidgetAction(this); QSpinBox* historySpinBox = new QSpinBox; - historySpinBox->setValue(m_tracingLength); historySpinBox->setPrefix("History: "); historySpinBox->setMinimum(1); historySpinBox->setMaximum(100000); + historySpinBox->setValue(m_tracingLength); QObject::connect(historySpinBox, QOverload::of(&QSpinBox::valueChanged), this, &ComponentShape::receiveTracingLength); historyBox->setDefaultWidget(historySpinBox); tracingMenu->addAction(historyBox); @@ -713,10 +775,10 @@ void ComponentShape::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) //tracingSteps QWidgetAction* stepsBox = new QWidgetAction(this); QSpinBox* stepsSpinBox = new QSpinBox; - stepsSpinBox->setValue(m_tracingSteps); stepsSpinBox->setPrefix("Steps: "); stepsSpinBox->setMinimum(1); stepsSpinBox->setMaximum(100000); + stepsSpinBox->setValue(m_tracingSteps); QObject::connect(stepsSpinBox, QOverload::of(&QSpinBox::valueChanged), this, &ComponentShape::receiveTracingSteps); stepsBox->setDefaultWidget(stepsSpinBox); tracingMenu->addAction(stepsBox); @@ -734,6 +796,38 @@ void ComponentShape::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) tracingTimeDegrMenu->addAction(degrBox); tracingMenu->addMenu(tracingTimeDegrMenu); + //toggle orientation line + QWidgetAction* trOrientationBox = new QWidgetAction(this); + QCheckBox* trOrientationCheck = new QCheckBox(); + trOrientationCheck->setText("Show tracer orientation line"); + trOrientationCheck->setChecked(m_tracingOrientationLine); + QObject::connect(trOrientationCheck, &QCheckBox::toggled, this, &ComponentShape::receiveTracerOrientationLine); + trOrientationBox->setDefaultWidget(trOrientationCheck); + tracingMenu->addAction(trOrientationBox); + + //tracer number + QWidgetAction* trNumberBox = new QWidgetAction(this); + QCheckBox* trNumberCheck = new QCheckBox(); + trNumberCheck->setText("Show framenumber on tracers"); + trNumberCheck->setChecked(m_tracerFrameNumber); + QObject::connect(trNumberCheck, &QCheckBox::toggled, this, &ComponentShape::receiveTracerFrameNumber); + trNumberBox->setDefaultWidget(trNumberCheck); + tracingMenu->addAction(trNumberBox); + + //tracer proportions + QWidgetAction* propBox = new QWidgetAction(this); + QDoubleSpinBox* propSpinBox = new QDoubleSpinBox; + propSpinBox->setPrefix("Proportions: "); + propSpinBox->setDecimals(2); + propSpinBox->setSingleStep(0.001f); + propSpinBox->setMinimum(0.01f); + propSpinBox->setMaximum(99.99f); + propSpinBox->setValue(m_tracerProportions); + QObject::connect(propSpinBox, QOverload::of(&QDoubleSpinBox::valueChanged), this, &ComponentShape::receiveTracerProportions); + propBox->setDefaultWidget(propSpinBox); + tracingMenu->addAction(propBox); + + menu.addMenu(tracingMenu); // @@ -1089,6 +1183,21 @@ void ComponentShape::receiveDimensions(int width, int height) update(); } +void ComponentShape::receiveHeight(int height){ + m_useDefaultDimensions = false; + m_h = height; + updateAttributes(m_currentFramenumber); + trace(); + update(); +} +void ComponentShape::receiveWidth(int width){ + m_useDefaultDimensions = false; + m_w = width; + updateAttributes(m_currentFramenumber); + trace(); + update(); +} + void ComponentShape::setDimensionsToDefault() { m_useDefaultDimensions = true; diff --git a/BioTracker/CoreApp/BioTracker/View/ComponentShape.h b/BioTracker/CoreApp/BioTracker/View/ComponentShape.h index 0d4e5ee0..47e14f90 100644 --- a/BioTracker/CoreApp/BioTracker/View/ComponentShape.h +++ b/BioTracker/CoreApp/BioTracker/View/ComponentShape.h @@ -85,6 +85,8 @@ class ComponentShape : public QGraphicsObject void receiveTransparency(int alpha); //Dimensions void receiveDimensions(int width, int height); + void receiveHeight(int height); + void receiveWidth(int width); void setDimensionsToDefault(); void receiveToggleOrientationLine(bool toggle); void receiveShowId(bool toggle); diff --git a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui index 8045663e..74e2487b 100644 --- a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui +++ b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui @@ -973,7 +973,7 @@ 1 - 100000 + 1000000 1 diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp index 79aedaba..9375442f 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp @@ -776,7 +776,7 @@ void MainWindow::on_actionLoad_trackingdata_triggered() { std::vector files; for (QString const& path : QFileDialog::getOpenFileNames(this, - "Open image files", "", imageFilter, 0)) { + "Open tracking file", "", imageFilter, 0)) { files.push_back(boost::filesystem::path(path.toStdString())); } diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.ui b/BioTracker/CoreApp/BioTracker/View/MainWindow.ui index e8172c1b..47be0495 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.ui +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.ui @@ -822,7 +822,7 @@ p, li { white-space: pre-wrap; } - toolBar + Menu toolbar Tools for managing the basic functionalities @@ -864,7 +864,7 @@ QToolButton { - toolBar_2 + View toolbar Tools to manage the visualization and track properties @@ -903,7 +903,7 @@ QToolButton { - toolBar + Video toolbar Tools to manage the media properties and to show media info @@ -1172,7 +1172,7 @@ QToolButton { Delete selected track - Delete the selected entities + Delete the selected trajectories Del From e9325ccd59dc6b8b2376ab7716fac8c01553684f Mon Sep 17 00:00:00 2001 From: jonas Date: Mon, 26 Mar 2018 18:43:30 +0200 Subject: [PATCH 014/171] changed icons for tracker loading, track file loading rotating entity when it is selected works now (unselects it) --- .../CoreApp/BioTracker/View/MainWindow.cpp | 2 +- .../CoreApp/BioTracker/View/MainWindow.ui | 4 ++-- .../BioTracker/View/Utility/RotationHandle.cpp | 17 ++++++++++++++--- BioTracker/CoreApp/BioTracker/guiresources.qrc | 5 +++++ .../resources/upper_toolbar/save.png | Bin 0 -> 488 bytes .../resources/upper_toolbar/tracker2.png | Bin 0 -> 509 bytes .../resources/upper_toolbar/tracker3.png | Bin 0 -> 646 bytes .../{icons8-marker-26.png => tracker4.png} | Bin .../resources/upper_toolbar/tracker5.png | Bin 0 -> 577 bytes 9 files changed, 22 insertions(+), 6 deletions(-) create mode 100644 BioTracker/CoreApp/BioTracker/resources/upper_toolbar/save.png create mode 100644 BioTracker/CoreApp/BioTracker/resources/upper_toolbar/tracker2.png create mode 100644 BioTracker/CoreApp/BioTracker/resources/upper_toolbar/tracker3.png rename BioTracker/CoreApp/BioTracker/resources/upper_toolbar/{icons8-marker-26.png => tracker4.png} (100%) create mode 100644 BioTracker/CoreApp/BioTracker/resources/upper_toolbar/tracker5.png diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp index 9375442f..d24b8aec 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp @@ -308,7 +308,7 @@ void MainWindow::createIntroductionWizard(){ QWizardPage* p2 = new QWizardPage; { p2->setTitle("BioTracker 3 - Overview"); - QLabel *label = new QLabel("This is the BioTracker. Don't let yourself be overwhelmed it is actually pretty simple."); + QLabel *label = new QLabel("This is the BioTracker. Don't let yourself be overwhelmed as it is actually pretty simple."); label->setWordWrap(true); QPixmap overviewImg(":/Introduction/resources/introduction/images/BioTracker.PNG"); diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.ui b/BioTracker/CoreApp/BioTracker/View/MainWindow.ui index 47be0495..b6002920 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.ui +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.ui @@ -981,7 +981,7 @@ QToolButton { - :/Images/resources/upper_toolbar/tracker.png:/Images/resources/upper_toolbar/tracker.png + :/Images/resources/upper_toolbar/tracker2.png:/Images/resources/upper_toolbar/tracker2.png L&oad Tracker... @@ -1063,7 +1063,7 @@ QToolButton { - :/Images/resources/upper_toolbar/download.png:/Images/resources/upper_toolbar/download.png + :/Images/resources/upper_toolbar/save.png:/Images/resources/upper_toolbar/save.png Save Trajectory diff --git a/BioTracker/CoreApp/BioTracker/View/Utility/RotationHandle.cpp b/BioTracker/CoreApp/BioTracker/View/Utility/RotationHandle.cpp index 44a6d101..acc886c5 100644 --- a/BioTracker/CoreApp/BioTracker/View/Utility/RotationHandle.cpp +++ b/BioTracker/CoreApp/BioTracker/View/Utility/RotationHandle.cpp @@ -3,6 +3,7 @@ #include "QGraphicsSceneMouseEvent" #include "QCursor" #include "QtMath" +#include "QGraphicsScene" #include "qdebug.h" @@ -12,6 +13,7 @@ RotationHandle::RotationHandle(QPoint origin, QAbstractGraphicsShapeItem* parent setFlag(ItemIsMovable); setPen(QPen(Qt::blue)); setBrush(QBrush(Qt::red)); + //setFlag(QGraphicsItem::ItemIsSelectable); //setFlag(ItemIgnoresTransformations); } @@ -21,7 +23,7 @@ RotationHandle::~RotationHandle() QRectF RotationHandle::boundingRect() const { - return QRectF(-3, -3, 6, 6); + return QRectF(-5, -5, 10, 10); } void RotationHandle::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) @@ -32,7 +34,7 @@ void RotationHandle::paint(QPainter * painter, const QStyleOptionGraphicsItem * painter->setPen(this->pen()); painter->setBrush(this->brush()); - painter->drawEllipse(QRect(-2, -2, 4, 4)); + painter->drawEllipse(QRect(-5, -5, 10, 10)); //painter->drawRect(boundingRect()); } @@ -41,9 +43,19 @@ void RotationHandle::mousePressEvent(QGraphicsSceneMouseEvent * event) { if (event->button() == Qt::LeftButton) { // handle left mouse button here + + //unselect all selected items so they wont get moved + QList allSelectedItems = scene()->selectedItems(); + QGraphicsItem* item; + foreach (item, allSelectedItems) { + item->setSelected(false); + } + + setCursor(Qt::ClosedHandCursor); update(); } + //pass on QGraphicsItem::mousePressEvent(event); } @@ -67,7 +79,6 @@ void RotationHandle::mouseReleaseEvent(QGraphicsSceneMouseEvent * event) void RotationHandle::mouseMoveEvent(QGraphicsSceneMouseEvent * event) { - double angleRad = atan2(this->y() - _origin.y(), this->x() - _origin.x()); double angleDeg = qRadiansToDegrees(angleRad); diff --git a/BioTracker/CoreApp/BioTracker/guiresources.qrc b/BioTracker/CoreApp/BioTracker/guiresources.qrc index ffa52c6c..5010e0a8 100644 --- a/BioTracker/CoreApp/BioTracker/guiresources.qrc +++ b/BioTracker/CoreApp/BioTracker/guiresources.qrc @@ -17,6 +17,11 @@ resources/upper_toolbar/file-picture.png resources/upper_toolbar/file-play.png resources/upper_toolbar/tracker.png + resources/upper_toolbar/tracker2.png + resources/upper_toolbar/tracker3.png + resources/upper_toolbar/tracker4.png + resources/upper_toolbar/tracker5.png + resources/upper_toolbar/save.png resources/upper_toolbar/redo2.png resources/upper_toolbar/undo2.png resources/upper_toolbar/upload.png diff --git a/BioTracker/CoreApp/BioTracker/resources/upper_toolbar/save.png b/BioTracker/CoreApp/BioTracker/resources/upper_toolbar/save.png new file mode 100644 index 0000000000000000000000000000000000000000..769d1eb94570eb0872705ffb71b07e25bee89de4 GIT binary patch literal 488 zcmVP)@!txu5kc@36oXj!1%ic05E~m^30PVO zKZ9WHr?9hdNh`j!30PQ&h@FTEDhL6!GZHq%&W7vc#+`Nc<-mnu<~--mz4w`!3m>qK zOOzWhp0I`vDXmA$Gig&s%?24IbcPRaBA~2_)r9wULRf72jRI9?)=~IRaG?%Rx+a#l z+A7e`R)PL)!DgxLpy`bDgHj$b&#K&|Y0LBqJk1bzgyr|54a2)^TYs@P zIWK4g=MhjD$LL9XU+|I#1f#f!fJ#`vP~uz0eI5{e^!iYtercul%;nfa&^=?%UkoV$URBJq7GRf+~ eCbrQVLjC}}VYQ>#1Q)>o0000 zYmlRZVCWzyxJyI?xd)brMukIYLpTQ!%~wn1c5682gTv>i_sgK^K5*dhywCeS@AsZ_ zKH6yGf1^@D(}$ZF#8p%y-^6FU!z+BbNCTHJi5>hdxjx`t%q@i**!v5E{MyC!^9-t( zLE|4xvek&SP904JO9crBcwVCL3ceNai+QsrIYAT4=)znHqXl$E!+dNuGZ~A8v%pV` zCrzxEFj`Oa4{(&kehIhMW-e(fH`cc$jPg0#x%fsE`-xx;HS{Ljj@C#uS7ME|gxiM> zOyQPraC>-`hz9WEoUb`Vf1-bZk8wYSyV2tmhK0FKCfse*3ry;*YF0f@ioS}F^Um< z!b7~js8OaF5ym)#%fk757q0$GY(%b&Hd^Bkt{1ZnodXJ{00000NkvXXu0mjfCyv+C literal 0 HcmV?d00001 diff --git a/BioTracker/CoreApp/BioTracker/resources/upper_toolbar/tracker3.png b/BioTracker/CoreApp/BioTracker/resources/upper_toolbar/tracker3.png new file mode 100644 index 0000000000000000000000000000000000000000..764a950440ee6c0b715aae64adcb426342c45b3f GIT binary patch literal 646 zcmV;10(t$3P)(1^HXRs3kh4-$;gti^kW-He;r?Cfr;9C(@CJNMjk z=Igzeb+m^~IE^Q$;%lrb9>=+XUWuQ;JJedNDvozkcmr-W2)x2&?8f$3qnN-<q>{;-UJN|1Nu;+a?;&ElgG zdsD{1&meEDOGX`m9vu~tP2ka6FZF)$s+{2TnG zfb%K$KjTj46IX+s_=`DgZHSMDiToq@Z24!n4f9cBq>KT05yh{S;9d{z^RnWwKZ<;l zn$Bvm1K)$YuM-3CEDGIigL5x9PdgPSZ6<%Ph&`*wAB)^YsbzNsx77PWQDf`4R?Aa4ujH6 zSi}8>_yhHMaj=&LNbPw}eNs9bzvuklx_gF8Avzzc+2GQ1OsV&QskIg-4JtFzbI%Vg gYlaaWbh>rGKcxno2$LL~lK=n!07*qoM6N<$f=%lpWB>pF literal 0 HcmV?d00001 diff --git a/BioTracker/CoreApp/BioTracker/resources/upper_toolbar/icons8-marker-26.png b/BioTracker/CoreApp/BioTracker/resources/upper_toolbar/tracker4.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/upper_toolbar/icons8-marker-26.png rename to BioTracker/CoreApp/BioTracker/resources/upper_toolbar/tracker4.png diff --git a/BioTracker/CoreApp/BioTracker/resources/upper_toolbar/tracker5.png b/BioTracker/CoreApp/BioTracker/resources/upper_toolbar/tracker5.png new file mode 100644 index 0000000000000000000000000000000000000000..a05d8d3d8566603599f58374a4efa1cbf817dce5 GIT binary patch literal 577 zcmV-H0>1r;P)Stt}J-3W}r=vGxHJ zECsO;En=&MjjteBiA9i$81Mx|Y!rzR1Vt3V%498^y*c;ptg~72!NA!w=bP{BIWw~h zBV5K#Wt_zGo*Y#gUvM9XGr{Mu5@P#s8sy)2j1wW7dhRFg;X2-Rb$tLHJJKRN~|1H|~W~*Vnk5Op4M=_%%oM{n?J&2;Y!#zfPqg+NMln!^c zbZg;xwWCl8S)nf1&793|O)sHC1;QTO!nZV*aI^!bA+(NVTrv4~Gmi)O6=LhLu?3C= zJi(vfe1mJaiyy)N8W&nPZws6;_Twf#WinsJsZ445aK@NPrC8|_+?Deetq Date: Wed, 28 Mar 2018 13:16:12 +0200 Subject: [PATCH 015/171] added tracer class for shape tracers changed numbering of trial files --- .../Controller/ControllerCoreParameter.cpp | 2 +- .../Controller/ControllerDataExporter.cpp | 8 +-- .../Controller/ControllerDataExporter.h | 2 +- .../BioTracker/View/ComponentShape.cpp | 57 +++---------------- .../CoreApp/BioTracker/View/ComponentShape.h | 2 - .../BioTracker/View/CoreParameterView.cpp | 12 ++-- .../BioTracker/View/CoreParameterView.h | 1 + .../BioTracker/View/CoreParameterView.ui | 55 ++++++++++++------ .../CoreApp/BioTracker/View/GraphicsView.cpp | 1 + .../CoreApp/BioTracker/View/MainWindow.ui | 4 +- .../BioTracker/View/Utility/Tracer.cpp | 51 +++++++++++++++++ .../CoreApp/BioTracker/View/Utility/Tracer.h | 35 ++++++++++++ .../resources/introduction/tracking.txt | 2 +- 13 files changed, 149 insertions(+), 83 deletions(-) create mode 100644 BioTracker/CoreApp/BioTracker/View/Utility/Tracer.cpp create mode 100644 BioTracker/CoreApp/BioTracker/View/Utility/Tracer.h diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerCoreParameter.cpp b/BioTracker/CoreApp/BioTracker/Controller/ControllerCoreParameter.cpp index 2288fc6b..df3c0e19 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerCoreParameter.cpp +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerCoreParameter.cpp @@ -164,6 +164,6 @@ void ControllerCoreParameter::setCorePermission(std::pair(m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::DATAEXPORT)))->getTrialNumber(); + return (static_cast(m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::DATAEXPORT)))->getNumber(true); } diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.cpp b/BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.cpp index 9fd286d0..e364a45c 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.cpp +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.cpp @@ -143,9 +143,9 @@ void ControllerDataExporter::rcvPlayerParameters(playerParameters* parameters) { } } -int ControllerDataExporter::getTrialNumber() { - //Get all existing files and parse highest export number - QString basePath = _trialStarted ? CFG_DIR_TRIALS : CFG_DIR_TRACKS; +int ControllerDataExporter::getNumber(bool trial) { + //Get all existing files of trial or track directory and parse highest export number + QString basePath = trial ? CFG_DIR_TRIALS : CFG_DIR_TRACKS; QStringList allFiles = QDir(basePath).entryList(QDir::NoDotAndDotDot | QDir::Files); int maxVal = 0; @@ -163,7 +163,7 @@ QString ControllerDataExporter::generateBasename(bool temporaryFile) { QString resultPath = (_trialStarted ? CFG_DIR_TRIALS : CFG_DIR_TRACKS); QString path = (temporaryFile ? CFG_DIR_TEMP : resultPath); - int maxVal = getTrialNumber(); + int maxVal = getNumber(_trialStarted ? true : false); std::string current = "Export_"+std::to_string(maxVal+1)+"_"; return QString(getTimeAndDate(path.toStdString() + current, "").c_str()); diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.h b/BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.h index 3b365c8a..ea71cb3c 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.h +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.h @@ -27,7 +27,7 @@ class ControllerDataExporter : public IController { void setComponentFactory(IModelTrackedComponentFactory* exp); IModelTrackedComponentFactory* getComponentFactory() { return _factory; }; SourceVideoMetadata getSourceMetadata(); - int getTrialNumber(); + int getNumber(bool trial); QString generateBasename(bool temporaryFile); void loadFile(std::string file); diff --git a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp index 607af98f..20482204 100644 --- a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp +++ b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp @@ -27,6 +27,7 @@ #include #include #include +#include "View/Utility/Tracer.h" //#include @@ -52,6 +53,7 @@ ComponentShape::ComponentShape(QGraphicsObject* parent, IModelTrackedTrajectory* m_trajectoryWasActiveOnce = false; m_tracingLayer = new QGraphicsRectItem(); + m_tracingLayer->setZValue(-1); this->scene()->addItem(m_tracingLayer); m_rotationLine = QLineF(); @@ -408,7 +410,11 @@ void ComponentShape::trace() QGraphicsLineItem* orientationItem = new QGraphicsLineItem(orientationLine, m_tracingLayer); } - createShapeTracer(this->data(1), historyChild, adjustedHistoryPointDifference, timeDegradationPen, timeDegradationBrush); + //createShapeTracer(this->data(1), historyChild, adjustedHistoryPointDifference, timeDegradationPen, timeDegradationBrush); + float tracerDeg = historyChild->hasDeg() ? historyChild->getDeg() : 0.0; + float tracerW = m_w * m_tracerProportions; + float tracerH = m_h * m_tracerProportions; + Tracer* tracer = new Tracer(this->data(1), tracerDeg, adjustedHistoryPointDifference, tracerW, tracerH, timeDegradationPen, timeDegradationBrush, m_tracingLayer); } @@ -880,55 +886,6 @@ void ComponentShape::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) QAction *selectedAction = menu.exec(event->screenPos()); } -void ComponentShape::createShapeTracer(QVariant type, IModelTrackedPoint * historyChild, QPointF pos, QPen pen, QBrush brush) -{ - if (this->data(1) == "point") { - QGraphicsEllipseItem* tracePoint = new QGraphicsEllipseItem(m_tracingLayer); - tracePoint->setPos(pos); - int dim = m_w <= m_h? m_w : m_h; - - tracePoint->setRect(QRect(-dim * m_tracerProportions / 2, -dim * m_tracerProportions / 2, dim * m_tracerProportions, dim * m_tracerProportions)); - //tracer orientation - float tracerOrientation; - if (m_h > m_w) { tracerOrientation = -90 - historyChild->getDeg(); } - else { tracerOrientation = -historyChild->getDeg(); } - tracePoint->setRotation(tracerOrientation); - //set colors - tracePoint->setPen(pen); - tracePoint->setBrush(brush); - - qDebug() << m_tracingLayer->childItems().size(); - - } - else if (this->data(1) == "ellipse") { - QGraphicsEllipseItem* traceEllipse = new QGraphicsEllipseItem(m_tracingLayer); - traceEllipse->setPos(pos); - traceEllipse->setRect(QRect(-m_w * m_tracerProportions / 2, -m_h * m_tracerProportions / 2, m_w * m_tracerProportions, m_h * m_tracerProportions)); - //set orientation - float tracerOrientation; - if (m_h > m_w) { tracerOrientation = -90 - historyChild->getDeg(); } - else { tracerOrientation = -historyChild->getDeg(); } - traceEllipse->setRotation(tracerOrientation); - //set colors - traceEllipse->setPen(pen); - traceEllipse->setBrush(brush); - } - else if (this->data(1) == "rectangle") { - QGraphicsRectItem* traceRect = new QGraphicsRectItem(m_tracingLayer); - traceRect->setPos(pos); - traceRect->setRect(QRect(-m_w * m_tracerProportions / 2, -m_h * m_tracerProportions / 2, m_w * m_tracerProportions, m_h * m_tracerProportions)); - //set orientation - float tracerOrientation; - if (m_h > m_w) { tracerOrientation = -90 - historyChild->getDeg(); } - else { tracerOrientation = -historyChild->getDeg(); } - traceRect->setRotation(tracerOrientation); - //set colors - traceRect->setPen(pen); - traceRect->setBrush(brush); - } - //TODO polygons -} - //SLOTS void ComponentShape::changeBrushColor() diff --git a/BioTracker/CoreApp/BioTracker/View/ComponentShape.h b/BioTracker/CoreApp/BioTracker/View/ComponentShape.h index 47e14f90..099db158 100644 --- a/BioTracker/CoreApp/BioTracker/View/ComponentShape.h +++ b/BioTracker/CoreApp/BioTracker/View/ComponentShape.h @@ -103,10 +103,8 @@ class ComponentShape : public QGraphicsObject void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override; - void createShapeTracer(QVariant type, IModelTrackedPoint* historyChild, QPointF pos, QPen pen, QBrush brush); double constrainAngle(double x); - private: //Member diff --git a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp index 4b2422c5..9ce2dc06 100644 --- a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp +++ b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp @@ -392,7 +392,7 @@ void CoreParameterView::resetTrial() _trialActive = false; _trialStarted = false; Q_EMIT emitTrialStarted(false); - ui->pushButton_startExp->setText("Start Trial"); + ui->pushButton_startExp->setText("Start a new Trial"); } @@ -445,13 +445,12 @@ void CoreParameterView::on_pushButton_startExp_clicked() { } void CoreParameterView::on_pushButton_finalizeExp_clicked() { - Q_EMIT emitStopPlayback(); Q_EMIT emitActivateTrackingSwitch(); Q_EMIT emitDisableTracking(); _trialActive = false; _trialStarted = false; - ui->pushButton_startExp->setText("Start Trial"); + ui->pushButton_startExp->setText("Start a new Trial"); ui->label_ExpSt->setText("No Trial started!"); Q_EMIT emitTrialStarted(false); Q_EMIT emitFinalizeExperiment(); @@ -463,7 +462,7 @@ void CoreParameterView::on_label_ExpSrcCnt_clicked() { void CoreParameterView::on_trialHelpButton_clicked() { - QMessageBox::information(0, "Trials", "'Start Trial' will cause all the previous data to be saved and then reset.\n\n" + QMessageBox::information(0, "Trials", "'Start a new Trial' will cause all the previous data to be saved and then reset.\n\n" "Go to the time spot you want to track and create a trajectory for each object you want to track.\n" "Resume the video and the tracker will track your objects.\n\n" "If you want to pause the tracking you can just pause the video. Resuming the video will continue the tracking.\n" @@ -476,6 +475,11 @@ void CoreParameterView::on_pushButton_saveData_clicked(){ emitSaveDataToFile(); } +void CoreParameterView::on_pushButton_resetData_clicked(){ + Q_EMIT emitFinalizeExperiment(); +} + + void CoreParameterView::on_pushButton_addTraj_clicked(){ emitAddTrack(); } diff --git a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.h b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.h index 8f389582..ee6172e0 100644 --- a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.h +++ b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.h @@ -95,6 +95,7 @@ EXPERIMENT TAB void on_label_ExpSrcCnt_clicked(); void on_trialHelpButton_clicked(); void on_pushButton_saveData_clicked(); + void on_pushButton_resetData_clicked(); void on_pushButton_addTraj_clicked(); public slots: void rcvPlayerParameters(playerParameters* parameters); diff --git a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui index 74e2487b..fa3f3497 100644 --- a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui +++ b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui @@ -12,7 +12,7 @@ 0 0 - 525 + 583 677 @@ -156,7 +156,7 @@ 0 0 - 293 + 328 935 @@ -1650,8 +1650,11 @@ You can add some by right-clicking the video (if loaded). + + Add a Trajectory for an object + - Add a trajectory + Add a Trajectory @@ -1703,7 +1706,7 @@ If results are questionable, mediate the selection of tracker (drop down menu at the top) and the tracker parameters ("Tracker" tab) - Start Trial + Start a new Trial @@ -1728,35 +1731,51 @@ If results are questionable, mediate the selection of tracker - - - - Qt::Horizontal - - - - Finalizes the current trial. - Clicking this will not only stop the trial, -but also write back the -data to the "Tracks" directory and increment the trial count. -If no trial is active this button saves and resets the current data. + <html><head/><body><p>Finalizes the current trial and resets the data.</p><p>Clicking this will not only stop the trial, but also write back the trajectory data to the &quot;Trials&quot; directory and increment the trial count.</p><p>If no trial is active this button saves and resets the current data. </p></body></html> - Finalize and Save Trial and Reset Data + Finalize Trial (Save Data and Reset) + + + + Qt::Horizontal + + + + + + + Qt::Horizontal + + + + + <html><head/><body><p>Save current trajectory data to file.</p><p>No data is reset!</p></body></html> + + + Save Trajectory Data to file + + + + + + + <html><head/><body><p>Reset the current trajectory data.</p><p>Data is saved automatically first. No data is ever deleted permanently!</p><p>If a trial is active, the trial mode will still be active. Trial data will be saved in the &quot;Trials&quot; directory.</p></body></html> + - Save Data + Reset Trajectory Data diff --git a/BioTracker/CoreApp/BioTracker/View/GraphicsView.cpp b/BioTracker/CoreApp/BioTracker/View/GraphicsView.cpp index f9946df3..5ab7851c 100644 --- a/BioTracker/CoreApp/BioTracker/View/GraphicsView.cpp +++ b/BioTracker/CoreApp/BioTracker/View/GraphicsView.cpp @@ -49,6 +49,7 @@ void GraphicsView::addPixmapItem(QGraphicsItem *item) { m_BackgroundImage = item; m_GraphicsScene->addItem(item); + item->setZValue(-5); update(); } diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.ui b/BioTracker/CoreApp/BioTracker/View/MainWindow.ui index b6002920..536a393c 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.ui +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.ui @@ -1069,7 +1069,7 @@ QToolButton { Save Trajectory - Save current trajectory to file + Save current trajectory data to file @@ -1097,7 +1097,7 @@ QToolButton { Add Track - Add a Trajectory + Add a Trajectory for an object + diff --git a/BioTracker/CoreApp/BioTracker/View/Utility/Tracer.cpp b/BioTracker/CoreApp/BioTracker/View/Utility/Tracer.cpp new file mode 100644 index 00000000..76c14469 --- /dev/null +++ b/BioTracker/CoreApp/BioTracker/View/Utility/Tracer.cpp @@ -0,0 +1,51 @@ +#include "Tracer.h" +#include "QDebug" +#include "QPen" +#include "QBrush" +#include "QPainter" +#include "QMenu" +#include "QGraphicsSceneContextMenuEvent" + +Tracer::Tracer(QVariant type, float orientation, QPointF pos, float w, float h, QPen pen, QBrush brush, QAbstractGraphicsShapeItem* parent) +:QAbstractGraphicsShapeItem(parent), _type(type.toString()), _w(w), _h(h) +{ + setPos(pos); + setPen(pen); + setBrush(brush); + setRotation(_h > _w ? -90 - orientation : -orientation); +} + +Tracer::~Tracer() +{ +} + +QRectF Tracer::boundingRect() const +{ + return QRect(-_w / 2, -_h / 2, _w, _h); +} + +void Tracer::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + painter->setPen(pen()); + painter->setBrush(brush()); + + if (_type == "point") { + int dim = _w <= _h? _w : _h; + painter->drawEllipse(QRect(-dim / 2, -dim / 2, dim, dim)); + } + else if (_type == "ellipse") { + + painter->drawEllipse(QRect(-_w / 2, -_h / 2, _w, _h)); + } + else if (_type == "rectangle") { + + painter->drawRect(QRect(-_w / 2, -_h / 2, _w, _h)); + } +} + +void Tracer::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) +{ + QMenu menu; + menu.addAction("Go to frame ", dynamic_cast(this), SLOT(goToFrame())); + menu.exec(event->screenPos()); +} \ No newline at end of file diff --git a/BioTracker/CoreApp/BioTracker/View/Utility/Tracer.h b/BioTracker/CoreApp/BioTracker/View/Utility/Tracer.h new file mode 100644 index 00000000..75075b4f --- /dev/null +++ b/BioTracker/CoreApp/BioTracker/View/Utility/Tracer.h @@ -0,0 +1,35 @@ +#pragma once + +#ifndef TRACER_H +#define TRACER_H + +#include "QAbstractGraphicsShapeItem" + +class Tracer : public QObject, public QAbstractGraphicsShapeItem { + Q_OBJECT + + public: + Tracer(QVariant type, float orientation, QPointF pos, float w, float h, QPen pen, QBrush brush, QAbstractGraphicsShapeItem* parent); + ~Tracer(); + + protected: + QRectF boundingRect() const override; + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; + void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override; + + //void mousePressEvent(QGraphicsSceneMouseEvent * event) override; + //void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override; + //void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; + + + //member + QString _type; + float _orientation; + QPointF pos; + float _w; + float _h; +}; + + + +#endif // TRACER_H \ No newline at end of file diff --git a/BioTracker/CoreApp/BioTracker/resources/introduction/tracking.txt b/BioTracker/CoreApp/BioTracker/resources/introduction/tracking.txt index 2dcee641..627ba9ea 100644 --- a/BioTracker/CoreApp/BioTracker/resources/introduction/tracking.txt +++ b/BioTracker/CoreApp/BioTracker/resources/introduction/tracking.txt @@ -4,7 +4,7 @@ We are assuming that you have a tracking experiment, want to start a trial and s 2. Load a tracker (usually trackers are preloaded from the 'Plugins' directory) 3 Choose the desired tracker options (This often takes some time to figure out) -5. Go to the Experiment tab and click 'Start trial'. +5. Go to the Experiment tab and click 'Start a new trial'. (The video gets paused when you starta new trial) 4. Insert the objects to track if the tracker does not generate them automatically (If you want to track two objects, add two tracks by right clicking the video or using the button on the left toolbar) From 5cc0e68de3f81b5338c57962af69d1e88f4e14a8 Mon Sep 17 00:00:00 2001 From: jonas Date: Wed, 28 Mar 2018 23:23:38 +0200 Subject: [PATCH 016/171] added context menu for tracers with 'go to frame' option --- .../CoreApp/BioTracker/Controller/ControllerPlayer.h | 8 ++++---- .../Controller/ControllerTrackedComponentCore.cpp | 6 ++++++ .../Controller/ControllerTrackedComponentCore.h | 1 + BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp | 8 +++++--- BioTracker/CoreApp/BioTracker/View/ComponentShape.h | 3 ++- .../CoreApp/BioTracker/View/TrackedComponentView.cpp | 5 +++-- BioTracker/CoreApp/BioTracker/View/Utility/Tracer.cpp | 11 ++++++++--- BioTracker/CoreApp/BioTracker/View/Utility/Tracer.h | 11 ++++++++--- 8 files changed, 37 insertions(+), 16 deletions(-) diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerPlayer.h b/BioTracker/CoreApp/BioTracker/Controller/ControllerPlayer.h index 833853b7..0a9a0424 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerPlayer.h +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerPlayer.h @@ -64,10 +64,6 @@ class ControllerPlayer : public IController { */ void pause(); /** - * Tells the IModel class MediaPlayer to jump directly to the specified image frame by the parameter frame. - */ - void setGoToFrame(int frame); - /** * If the user changes the ImageView in the comboBox represented in the VideoControllWidget it passes the selected ImageView name to the ControllerTextureObject class of the TextureObject-Component. */ void changeImageView(QString str); @@ -109,6 +105,10 @@ class ControllerPlayer : public IController { void receiveChangeDisplayImage(QString str); void receiveCurrentFrameNumberToPlugin(uint frameNumber); + /** + * Tells the IModel class MediaPlayer to jump directly to the specified image frame by the parameter frame. + */ + void setGoToFrame(int frame); protected: void createModel() override; diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerTrackedComponentCore.cpp b/BioTracker/CoreApp/BioTracker/Controller/ControllerTrackedComponentCore.cpp index ffd38566..6fea38e3 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerTrackedComponentCore.cpp +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerTrackedComponentCore.cpp @@ -1,6 +1,7 @@ #include "ControllerTrackedComponentCore.h" #include "ControllerMainWindow.h" #include "ControllerCoreParameter.h" +#include "ControllerPlayer.h" #include "Model/null_Model.h" #include "Model/CoreParameter.h" #include "View/TrackedComponentView.h" @@ -69,6 +70,11 @@ void ControllerTrackedComponentCore::connectControllerToController() QObject::connect(this, SIGNAL(emitToggleFixTrack(IModelTrackedTrajectory*, bool)), ctrCC, SLOT(receiveFixTrackCommand(IModelTrackedTrajectory*, bool))); QObject::connect(this, SIGNAL(emitEntityRotation(IModelTrackedTrajectory*, double, double, uint)), ctrCC, SLOT(receiveEntityRotation(IModelTrackedTrajectory*, double, double, uint))); + //connect to controllerPlayer + IController * ctrIP = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::PLAYER); + QPointer< ControllerPlayer > ctrP = qobject_cast(ctrIP); + QObject::connect(this, &ControllerTrackedComponentCore::emitGoToFrame, ctrP, &ControllerPlayer::setGoToFrame); + // Tell the Visualization to reset upon loading a new plugin QObject::connect(ctrMainWindow, &ControllerMainWindow::emitTrackLoaded, this, &ControllerTrackedComponentCore::receiveOnPluginLoaded); diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerTrackedComponentCore.h b/BioTracker/CoreApp/BioTracker/Controller/ControllerTrackedComponentCore.h index 46f9a393..12718489 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerTrackedComponentCore.h +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerTrackedComponentCore.h @@ -45,6 +45,7 @@ class ControllerTrackedComponentCore : public IController void emitSelectAll(); void emitChangeColorBorder(); void emitChangeColorFill(); + void emitGoToFrame(int frame); public Q_SLOTS: diff --git a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp index 20482204..1c0b6500 100644 --- a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp +++ b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp @@ -53,7 +53,7 @@ ComponentShape::ComponentShape(QGraphicsObject* parent, IModelTrackedTrajectory* m_trajectoryWasActiveOnce = false; m_tracingLayer = new QGraphicsRectItem(); - m_tracingLayer->setZValue(-1); + m_tracingLayer->setZValue(3); this->scene()->addItem(m_tracingLayer); m_rotationLine = QLineF(); @@ -414,8 +414,10 @@ void ComponentShape::trace() float tracerDeg = historyChild->hasDeg() ? historyChild->getDeg() : 0.0; float tracerW = m_w * m_tracerProportions; float tracerH = m_h * m_tracerProportions; - Tracer* tracer = new Tracer(this->data(1), tracerDeg, adjustedHistoryPointDifference, tracerW, tracerH, timeDegradationPen, timeDegradationBrush, m_tracingLayer); + int tracerNumber = m_currentFramenumber - i; + Tracer* tracer = new Tracer(this->data(1), tracerNumber, tracerDeg, adjustedHistoryPointDifference, tracerW, tracerH, timeDegradationPen, timeDegradationBrush, m_tracingLayer); + QObject::connect(tracer, &Tracer::emitGoToFrame, this, &ComponentShape::emitGoToFrame); } //PATH @@ -1296,4 +1298,4 @@ double ComponentShape::constrainAngle(double x){ if (x < 0) x += 360; return x; -} \ No newline at end of file +} diff --git a/BioTracker/CoreApp/BioTracker/View/ComponentShape.h b/BioTracker/CoreApp/BioTracker/View/ComponentShape.h index 099db158..0b1aad64 100644 --- a/BioTracker/CoreApp/BioTracker/View/ComponentShape.h +++ b/BioTracker/CoreApp/BioTracker/View/ComponentShape.h @@ -51,6 +51,7 @@ class ComponentShape : public QGraphicsObject void emitMoveElement(IModelTrackedTrajectory* trajectory, QPoint oldPos, QPoint newPos, uint frameNumber, int sizeOfStackToMove); void emitToggleFixTrack(IModelTrackedTrajectory* trajectory, bool toggle); void emitEntityRotation(IModelTrackedTrajectory* trajectory, double oldAngleDeg, double newAngleDeg, uint frameNumber); + void emitGoToFrame(int frame); void broadcastMove(); public Q_SLOTS: @@ -154,4 +155,4 @@ class ComponentShape : public QGraphicsObject }; -#endif // COMPONENTSHAPE_H \ No newline at end of file +#endif // COMPONENTSHAPE_H diff --git a/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp b/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp index f7a82fe1..7bb4c1fb 100644 --- a/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp +++ b/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp @@ -589,7 +589,8 @@ void TrackedComponentView::connectShape(ComponentShape* shape) { QObject::connect(shape, SIGNAL(emitMoveElement(IModelTrackedTrajectory*,QPoint, QPoint, uint, int)), dynamic_cast(this->getController()), SLOT(receiveMoveElement(IModelTrackedTrajectory*, QPoint, QPoint, uint, int)), Qt::DirectConnection); QObject::connect(shape, SIGNAL(emitToggleFixTrack(IModelTrackedTrajectory*, bool)), dynamic_cast(this->getController()), SLOT(receiveToggleFixTrack(IModelTrackedTrajectory*,bool)), Qt::DirectConnection); QObject::connect(shape, SIGNAL(emitEntityRotation(IModelTrackedTrajectory*, double, double, uint)), dynamic_cast(this->getController()), SIGNAL(emitEntityRotation(IModelTrackedTrajectory*, double, double, uint)), Qt::DirectConnection); - + QObject::connect(shape, &ComponentShape::emitGoToFrame, dynamic_cast(this->getController()), &ControllerTrackedComponentCore::emitGoToFrame, Qt::DirectConnection); + QObject::connect(shape, SIGNAL(broadcastMove()), this, SLOT(receiveBroadcastMove()), Qt::DirectConnection); @@ -679,4 +680,4 @@ void TrackedComponentView::receiveIgnoreZoom(bool toggle) childShape->receiveIgnoreZoom(toggle); } } -} \ No newline at end of file +} diff --git a/BioTracker/CoreApp/BioTracker/View/Utility/Tracer.cpp b/BioTracker/CoreApp/BioTracker/View/Utility/Tracer.cpp index 76c14469..ab88b82e 100644 --- a/BioTracker/CoreApp/BioTracker/View/Utility/Tracer.cpp +++ b/BioTracker/CoreApp/BioTracker/View/Utility/Tracer.cpp @@ -6,8 +6,8 @@ #include "QMenu" #include "QGraphicsSceneContextMenuEvent" -Tracer::Tracer(QVariant type, float orientation, QPointF pos, float w, float h, QPen pen, QBrush brush, QAbstractGraphicsShapeItem* parent) -:QAbstractGraphicsShapeItem(parent), _type(type.toString()), _w(w), _h(h) +Tracer::Tracer(QVariant type, int frame, float orientation, QPointF pos, float w, float h, QPen pen, QBrush brush, QAbstractGraphicsShapeItem* parent) +:QAbstractGraphicsShapeItem(parent), _type(type.toString()), _frame(frame), _w(w), _h(h) { setPos(pos); setPen(pen); @@ -48,4 +48,9 @@ void Tracer::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) QMenu menu; menu.addAction("Go to frame ", dynamic_cast(this), SLOT(goToFrame())); menu.exec(event->screenPos()); -} \ No newline at end of file +} + +void Tracer::goToFrame() +{ + Q_EMIT emitGoToFrame(_frame); +} diff --git a/BioTracker/CoreApp/BioTracker/View/Utility/Tracer.h b/BioTracker/CoreApp/BioTracker/View/Utility/Tracer.h index 75075b4f..76d0c6c4 100644 --- a/BioTracker/CoreApp/BioTracker/View/Utility/Tracer.h +++ b/BioTracker/CoreApp/BioTracker/View/Utility/Tracer.h @@ -9,8 +9,13 @@ class Tracer : public QObject, public QAbstractGraphicsShapeItem { Q_OBJECT public: - Tracer(QVariant type, float orientation, QPointF pos, float w, float h, QPen pen, QBrush brush, QAbstractGraphicsShapeItem* parent); + Tracer(QVariant type, int frame, float orientation, QPointF pos, float w, float h, QPen pen, QBrush brush, QAbstractGraphicsShapeItem* parent); ~Tracer(); + signals: + void emitGoToFrame(int frame); + +public slots: + void goToFrame(); protected: QRectF boundingRect() const override; @@ -21,9 +26,9 @@ class Tracer : public QObject, public QAbstractGraphicsShapeItem { //void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override; //void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; - //member QString _type; + int _frame; float _orientation; QPointF pos; float _w; @@ -32,4 +37,4 @@ class Tracer : public QObject, public QAbstractGraphicsShapeItem { -#endif // TRACER_H \ No newline at end of file +#endif // TRACER_H From 67720442fa5ee7d5e93b433d659ea4c64c6de5d9 Mon Sep 17 00:00:00 2001 From: jonas Date: Wed, 28 Mar 2018 23:44:26 +0200 Subject: [PATCH 017/171] added confirmation dialogs for new trial, finalize trial and reset data buttons --- .../BioTracker/View/CoreParameterView.cpp | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp index 9ce2dc06..961953bd 100644 --- a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp +++ b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp @@ -409,7 +409,8 @@ void CoreParameterView::getNotified() /************EXPERIMENT TAB*******************/ void CoreParameterView::on_pushButton_startExp_clicked() { - if (!_trialActive) { + if (!_trialActive) { + if (_currentFile == "No Media"){ int ret = QMessageBox::information(this, tr("BioTracker"), tr("Please select a source video first. \nYou can do so in the \"File\" menu."), @@ -417,6 +418,15 @@ void CoreParameterView::on_pushButton_startExp_clicked() { } else { if (!_trialStarted) { + QMessageBox::StandardButton reply; + reply = QMessageBox::question(this, "Confirmation", "Are you sure you want to start a new trial?" + "\nThis will reset the previous tracking data!", + QMessageBox::Yes|QMessageBox::No); + if (reply == QMessageBox::No) { + qDebug() << "CORE: New trial aborted"; + return; + } + _trialStarted = true; emitTrialStarted(true); emitFinalizeExperiment(); @@ -445,6 +455,17 @@ void CoreParameterView::on_pushButton_startExp_clicked() { } void CoreParameterView::on_pushButton_finalizeExp_clicked() { + QMessageBox::StandardButton reply; + reply = QMessageBox::question(this, "Confirmation", "Are you sure you want to finalize the trial?" + "\nThis will save the current trial tracking" + " data in a new file in the 'Trials' directory" + " and reset it afterwards!", + QMessageBox::Yes|QMessageBox::No); + if (reply == QMessageBox::No) { + qDebug() << "CORE: Finalize trial aborted!"; + return; + } + Q_EMIT emitStopPlayback(); Q_EMIT emitActivateTrackingSwitch(); Q_EMIT emitDisableTracking(); @@ -476,6 +497,14 @@ void CoreParameterView::on_pushButton_saveData_clicked(){ } void CoreParameterView::on_pushButton_resetData_clicked(){ + QMessageBox::StandardButton reply; + reply = QMessageBox::question(this, "Confirmation", "Are you sure you want to reset the current tracking data?" + "This will firstly save the data and then reset it!", + QMessageBox::Yes|QMessageBox::No); + if (reply == QMessageBox::No) { + qDebug() << "CORE: Data reset aborted"; + return; + } Q_EMIT emitFinalizeExperiment(); } From c7190fd9f9b7a98a45dc81f777c4c0572f86e1a5 Mon Sep 17 00:00:00 2001 From: jonas Date: Thu, 29 Mar 2018 00:23:29 +0200 Subject: [PATCH 018/171] changed current frame box to editable spinbox to set the current frame --- .../BioTracker/View/VideoControllWidget.cpp | 17 ++++++++++--- .../BioTracker/View/VideoControllWidget.h | 3 +++ .../BioTracker/View/VideoControllWidget.ui | 25 +++++++++++++++++++ 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp b/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp index dce9ec76..54fad303 100644 --- a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp +++ b/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp @@ -64,7 +64,9 @@ void VideoControllWidget::getNotified() { int currentFrameNr = mediaPlayer->getCurrentFrameNumber(); int totalNumberOfFrames = mediaPlayer->getTotalNumberOfFrames(); int mediaFps = mediaPlayer->getFpsOfSourceFile(); - ui->frame_num_edit->setText(QString::number(currentFrameNr)); + //ui->frame_num_edit->setText(QString::number(currentFrameNr)); + ui->frame_num_spin->setMaximum(totalNumberOfFrames); + ui->frame_num_spin->setValue(currentFrameNr); ui->sld_video->setValue(currentFrameNr); QString currentVideoTime = QDateTime::fromMSecsSinceEpoch(((float)currentFrameNr / (float) mediaFps) * 1000).toUTC().toString("hh:mm:ss:zzz"); @@ -180,8 +182,8 @@ void VideoControllWidget::on_sld_video_actionTriggered(int action) * If the video slider is moved, this function sets the value to the current frame number lable */ void VideoControllWidget::on_sld_video_sliderMoved(int position) { - ui->frame_num_edit->setText(QString::number(position)); - + //ui->frame_num_edit->setText(QString::number(position)); + ui->frame_num_spin->setValue(position); MediaPlayer* mediaPlayer = dynamic_cast(getModel()); int mediaFps = mediaPlayer->getFpsOfSourceFile(); QString currentVideoTime = QDateTime::fromMSecsSinceEpoch(((float)position / (float) mediaFps) * 1000).toUTC().toString("hh:mm:ss:zzz"); @@ -194,6 +196,13 @@ void VideoControllWidget::on_doubleSpinBoxTargetFps_editingFinished() { controller->setTargetFps(val); } +void VideoControllWidget::on_frame_num_spin_editingFinished(){ + int val = ui->frame_num_spin->value(); + ControllerPlayer* controller = dynamic_cast(getController()); + controller->setGoToFrame(val); +} + + //actions void VideoControllWidget::on_actionPlay_Pause_triggered(bool checked){ ControllerPlayer* controller = dynamic_cast(getController()); @@ -281,4 +290,4 @@ void VideoControllWidget::setupVideoToolbar(){ videoToolBar->addWidget(ui->scrollAreaVideoInfo); } } -} \ No newline at end of file +} diff --git a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.h b/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.h index 9d356a5b..e6f2379a 100644 --- a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.h +++ b/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.h @@ -63,6 +63,9 @@ class VideoControllWidget : public IViewWidget { void on_doubleSpinBoxTargetFps_editingFinished(); + void on_frame_num_spin_editingFinished(); + + void on_actionPlay_Pause_triggered(bool checked = false); void on_actionStop_triggered(bool checked = false); void on_actionNext_frame_triggered(bool checked = false); diff --git a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.ui b/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.ui index fb6841ea..327c0bf4 100644 --- a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.ui +++ b/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.ui @@ -270,6 +270,28 @@ + + + + + 60 + 30 + + + + QAbstractSpinBox::NoButtons + + + QAbstractSpinBox::CorrectToNearestValue + + + 100 + + + 10 + + + @@ -293,6 +315,9 @@ 0 + + true + From 33f5f7401e98035215ebc3bf0d00fa61c01f9838 Mon Sep 17 00:00:00 2001 From: jonas Date: Thu, 29 Mar 2018 11:42:02 +0200 Subject: [PATCH 019/171] added 'open file' and 'show in folder' to file saved dialog --- .../Controller/ControllerDataExporter.cpp | 27 ++++++++++++++++-- .../BioTracker/View/CoreParameterView.ui | 26 ++++++++--------- .../BioTracker/View/VideoControllWidget.ui | 28 ------------------- 3 files changed, 37 insertions(+), 44 deletions(-) diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.cpp b/BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.cpp index e364a45c..6954e811 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.cpp +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.cpp @@ -7,6 +7,7 @@ #include "settings/Settings.h" #include "util/types.h" #include +#include "QDesktopServices" ControllerDataExporter::ControllerDataExporter(QObject *parent, IBioTrackerContext *context, ENUMS::CONTROLLERTYPE ctr) : @@ -174,9 +175,29 @@ void ControllerDataExporter::receiveFileWritten(QFileInfo fname) { QString str = "Exported file:\n"; str += fname.absoluteFilePath(); - int ret = QMessageBox::information(nullptr, QString("Trajectory Exporting"), - str, - QMessageBox::Ok); +// int ret = QMessageBox::information(nullptr, QString("Trajectory Exporting"), +// str, +// QMessageBox::Ok); + QMessageBox msgBox; + msgBox.setText("File saved!"); + msgBox.setInformativeText(str); + msgBox.setStandardButtons(QMessageBox::Ok); + msgBox.setDefaultButton(QMessageBox::Ok); + QPushButton *goToFileDirButton = msgBox.addButton(tr("Show in folder"), QMessageBox::ActionRole); + QPushButton *openFileButton = msgBox.addButton(tr("Open file"), QMessageBox::ActionRole); + + msgBox.setIcon(QMessageBox::Information); + msgBox.exec(); + + if (msgBox.clickedButton() == goToFileDirButton) { + QUrl fileDirUrl = QUrl::fromLocalFile(fname.absolutePath()); + QDesktopServices::openUrl(fileDirUrl); + } + else if (msgBox.clickedButton() == openFileButton){ + QUrl fileUrl = QUrl::fromLocalFile(fname.absoluteFilePath()); + QDesktopServices::openUrl(fileUrl); + } + } void ControllerDataExporter::receiveTrialStarted(bool started) diff --git a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui index fa3f3497..912c7018 100644 --- a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui +++ b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui @@ -320,7 +320,7 @@ - Number of Objects: + Number of tracked Objects: @@ -570,7 +570,7 @@ Set the width and height for all tracks - All tracks + All Tracks @@ -580,7 +580,7 @@ Set the width and height only for selected tracks - Selected tracks + Selected Tracks @@ -593,7 +593,7 @@ Set the dimensions of all tracks back to default - Default dimensions + Reset To Default Dimensions @@ -712,7 +712,7 @@ Choose a fill color for all trajectories - All tracks + All Tracks @@ -722,7 +722,7 @@ Choose a fill color for selected trajectories - Selected tracks + Selected Tracks @@ -763,7 +763,7 @@ Choose a border color for all trajectories - All tracks + All Tracks @@ -773,7 +773,7 @@ Choose a border color for selected trajectories - Selected tracks + Selected Tracks @@ -904,7 +904,7 @@ - History frames: + History Frames: @@ -1007,7 +1007,7 @@ - Time degradation: + Time Degradation: @@ -1079,7 +1079,7 @@ - Tracer dimensions + Tracer Dimensions @@ -1138,7 +1138,7 @@ - Tracer proportions + Tracer Proportions @@ -1172,7 +1172,7 @@ Show the orientation line for tracers - Show orientation line + Show Orientation line diff --git a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.ui b/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.ui index 327c0bf4..5d4312f4 100644 --- a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.ui +++ b/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.ui @@ -292,34 +292,6 @@ - - - - false - - - - 0 - 0 - - - - - 60 - 30 - - - - Displays the current frame - - - 0 - - - true - - - From 6501714d07e0a366c11b2d6c2e597e665ea4c7ec Mon Sep 17 00:00:00 2001 From: jotpio Date: Tue, 10 Apr 2018 22:32:49 +0200 Subject: [PATCH 020/171] added 'Go to' menu to menu bar for different directory links refactoring --- .../BioTracker/View/ComponentShape.cpp | 45 ++-- .../CoreApp/BioTracker/View/MainWindow.cpp | 232 ++++++++++-------- .../CoreApp/BioTracker/View/MainWindow.h | 7 + .../CoreApp/BioTracker/View/MainWindow.ui | 102 +++++--- .../IModel/IModelTrackedComponent.h | 10 +- 5 files changed, 228 insertions(+), 168 deletions(-) diff --git a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp index 1c0b6500..5ff7a1bb 100644 --- a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp +++ b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp @@ -21,7 +21,6 @@ #include "QComboBox" #include "QSpinBox" #include "QDoubleSpinBox" -#include "QCheckBox" #include #include #include @@ -734,24 +733,19 @@ void ComponentShape::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) /* toggle orientation line */ - QWidgetAction* orientationBox = new QWidgetAction(this); - QCheckBox* orientationCheck = new QCheckBox(); - orientationCheck->setText("Show orientation line"); - orientationCheck->setChecked(m_orientationLine); - QObject::connect(orientationCheck, &QCheckBox::toggled, this, &ComponentShape::receiveToggleOrientationLine); - orientationBox->setDefaultWidget(orientationCheck); - menu.addAction(orientationBox); + + QAction *showOrientationAction = menu.addAction("Show orientation line", dynamic_cast(this), SLOT(receiveToggleOrientationLine(bool))); + showOrientationAction->setCheckable(true); + showOrientationAction->setChecked(m_orientationLine); /* toggle id */ - QWidgetAction* idBox = new QWidgetAction(this); - QCheckBox* idCheck = new QCheckBox(); - idCheck->setText("Show ID"); - idCheck->setChecked(m_showId); - QObject::connect(idCheck, &QCheckBox::toggled, this, &ComponentShape::receiveShowId); - idBox->setDefaultWidget(idCheck); - menu.addAction(idBox); + + QAction *showIDAction = menu.addAction("Show ID", dynamic_cast(this), SLOT(receiveShowId(bool))); + showIDAction->setCheckable(true); + showIDAction->setChecked(m_showId); + /* tracing menu @@ -806,22 +800,15 @@ void ComponentShape::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) tracingMenu->addMenu(tracingTimeDegrMenu); //toggle orientation line - QWidgetAction* trOrientationBox = new QWidgetAction(this); - QCheckBox* trOrientationCheck = new QCheckBox(); - trOrientationCheck->setText("Show tracer orientation line"); - trOrientationCheck->setChecked(m_tracingOrientationLine); - QObject::connect(trOrientationCheck, &QCheckBox::toggled, this, &ComponentShape::receiveTracerOrientationLine); - trOrientationBox->setDefaultWidget(trOrientationCheck); - tracingMenu->addAction(trOrientationBox); + + QAction *showTrOrientationAction = tracingMenu->addAction("Show tracer orientation line", dynamic_cast(this), SLOT(receiveTracerOrientationLine(bool))); + showTrOrientationAction->setCheckable(true); + showTrOrientationAction->setChecked(m_tracingOrientationLine); //tracer number - QWidgetAction* trNumberBox = new QWidgetAction(this); - QCheckBox* trNumberCheck = new QCheckBox(); - trNumberCheck->setText("Show framenumber on tracers"); - trNumberCheck->setChecked(m_tracerFrameNumber); - QObject::connect(trNumberCheck, &QCheckBox::toggled, this, &ComponentShape::receiveTracerFrameNumber); - trNumberBox->setDefaultWidget(trNumberCheck); - tracingMenu->addAction(trNumberBox); + QAction *showTrNumberAction = tracingMenu->addAction("Show framenumber on tracers", dynamic_cast(this), SLOT(receiveTracerFrameNumber(bool))); + showTrNumberAction->setCheckable(true); + showTrNumberAction->setChecked(m_tracerFrameNumber); //tracer proportions QWidgetAction* propBox = new QWidgetAction(this); diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp index d24b8aec..e6570529 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp @@ -1,6 +1,8 @@ #include "MainWindow.h" #include "ui_MainWindow.h" +#include "util/types.h" + #include "Controller/ControllerMainWindow.h" #include "View/CoreParameterView.h" #include "VideoControllWidget.h" @@ -714,7 +716,7 @@ void MainWindow::saveDataToFile(){ qobject_cast (getController())->saveTrajectoryFile(f.toStdString()); } -//SLOTS +////////////////////////////////////////////////SLOTS///////////////////////////////////// void MainWindow::toggleNoShowWiz(bool toggle){ //qDebug() << toggle; @@ -723,110 +725,11 @@ void MainWindow::toggleNoShowWiz(bool toggle){ disableIntroWiz->setParam("BiotrackerCore/Disable_Wizard", toggle); } - -void MainWindow::on_actionOpen_Video_triggered() { - static const QString videoFilter("Video files (*.avi *.wmv *.mp4 *.mkv *.mov)"); - - // QFileDialog dialog(this); - // dialog.setNameFilter(videoFilter); - // QStringList fileNames; - // if (dialog.exec()) - // fileNames = dialog.selectedFiles(); - - // QString filename; - // if(fileNames.size() > 0) - // filename = fileNames[0]; - QString filename = QFileDialog::getOpenFileName(this, - "Open video", "", videoFilter, 0); - - if (!filename.isEmpty()) { - dynamic_cast (getController())->loadVideo(filename); - } -} - -void MainWindow::on_actionLoad_Tracker_triggered() { - static const QString pluginFilter("BioTracker Tracking Plugin files (*.tracker.so *.tracker.dll *.tracker.dylib)"); - - QString filename = QFileDialog::getOpenFileName(this, - "Open BioTracker Tracking Plugin", "", pluginFilter, 0); - - if (!filename.isEmpty()) { - qobject_cast (getController())->loadTracker(filename); - } -} - -void MainWindow::on_actionOpen_Picture_triggered() { - static const QString imageFilter( - "image files (*.png *.jpg *.jpeg *.gif *.bmp *.jpe *.ppm *.tiff *.tif *.sr *.ras *.pbm *.pgm *.jp2 *.dib)"); - - std::vector files; - for (QString const& path : QFileDialog::getOpenFileNames(this, - "Open image files", "", imageFilter, 0)) { - files.push_back(boost::filesystem::path(path.toStdString())); - } - - if (!files.empty()) { - qobject_cast (getController())->loadPictures(files); - } -} - -void MainWindow::on_actionLoad_trackingdata_triggered() { - static const QString imageFilter( - "tracking data files (*.csv *.dat *.json)"); - - std::vector files; - for (QString const& path : QFileDialog::getOpenFileNames(this, - "Open tracking file", "", imageFilter, 0)) { - files.push_back(boost::filesystem::path(path.toStdString())); - } - - if (!files.empty()) { - qobject_cast (getController())->loadTrajectoryFile(files[0].string()); - } -} - -void MainWindow::on_actionSave_trackingdata_triggered() { - saveDataToFile(); -} - -void MainWindow::on_actionOpen_Camera_triggered() { - m_CameraDevice = new CameraDevice(); - - m_CameraDevice->show(); - - QObject::connect(m_CameraDevice, &CameraDevice::emitSelectedCameraDevice, this, &MainWindow::receiveSelectedCameraDevice); -} - -void MainWindow::on_actionUndo_triggered() -{ - qobject_cast (getController())->emitUndoCommand(); -} - -void MainWindow::on_actionRedo_triggered() -{ - qobject_cast (getController())->emitRedoCommand(); -} - -void MainWindow::on_actionShowActionList_triggered() -{ - qobject_cast (getController())->emitShowActionListCommand(); -} - void MainWindow::receiveSelectedCameraDevice(CameraConfiguration conf) { qobject_cast (getController())->loadCameraDevice(conf); } -void MainWindow::on_actionQuit_triggered() { - qobject_cast (getController())->exit(); -} - -void MainWindow::on_actionSettings_triggered() { - m_SettingsWindow = new SettingsWindow(); - - m_SettingsWindow->show(); -} - void MainWindow::on_rightPanelViewControllerButton_clicked(){ QList splitterSizes = QList (); if(ui->widgetParameterAreaOuterCanvas->isVisible()){ @@ -855,6 +758,7 @@ void MainWindow::on_bottomPanelViewControllerButton_clicked(){ ui->videoControls->setVisible(ui->bottomPanelViewControllerButton->text() == "^"); ui->bottomPanelViewControllerButton->setText(ui->bottomPanelViewControllerButton->text() == "v"?"^":"v"); } + void MainWindow::activateTracking() { _trackerActivator->setState(true); } @@ -884,7 +788,7 @@ void MainWindow::resetTrackerViews(){ _currentCoreView = nullptr; } -//////////////////////////view toolbar actions/////////////////////////// +//////////////////////////utility toolbar actions/////////////////////////// void MainWindow::on_actionAdd_Track_triggered(){ qobject_cast (getController())->emitAddTrack(); } @@ -920,10 +824,112 @@ void MainWindow::on_actionDelete_selected_Annotation_triggered(){ qobject_cast (getController())->emitDelSelAnno(); } -///////////////////////////////menu->view///////////////////////////// +///////////////////////////////menu->file///////////////////////////// + +void MainWindow::on_actionOpen_Video_triggered() { + static const QString videoFilter("Video files (*.avi *.wmv *.mp4 *.mkv *.mov)"); -//toolbars actions + // QFileDialog dialog(this); + // dialog.setNameFilter(videoFilter); + // QStringList fileNames; + // if (dialog.exec()) + // fileNames = dialog.selectedFiles(); + + // QString filename; + // if(fileNames.size() > 0) + // filename = fileNames[0]; + QString filename = QFileDialog::getOpenFileName(this, + "Open video", "", videoFilter, 0); + + if (!filename.isEmpty()) { + dynamic_cast (getController())->loadVideo(filename); + } +} + +void MainWindow::on_actionLoad_Tracker_triggered() { + static const QString pluginFilter("BioTracker Tracking Plugin files (*.tracker.so *.tracker.dll *.tracker.dylib)"); + + QString filename = QFileDialog::getOpenFileName(this, + "Open BioTracker Tracking Plugin", "", pluginFilter, 0); + + if (!filename.isEmpty()) { + qobject_cast (getController())->loadTracker(filename); + } +} + +void MainWindow::on_actionOpen_Picture_triggered() { + static const QString imageFilter( + "image files (*.png *.jpg *.jpeg *.gif *.bmp *.jpe *.ppm *.tiff *.tif *.sr *.ras *.pbm *.pgm *.jp2 *.dib)"); + + std::vector files; + for (QString const& path : QFileDialog::getOpenFileNames(this, + "Open image files", "", imageFilter, 0)) { + files.push_back(boost::filesystem::path(path.toStdString())); + } + + if (!files.empty()) { + qobject_cast (getController())->loadPictures(files); + } +} + +void MainWindow::on_actionLoad_trackingdata_triggered() { + static const QString imageFilter( + "tracking data files (*.csv *.dat *.json)"); + + std::vector files; + for (QString const& path : QFileDialog::getOpenFileNames(this, + "Open tracking file", "", imageFilter, 0)) { + files.push_back(boost::filesystem::path(path.toStdString())); + } + + if (!files.empty()) { + qobject_cast (getController())->loadTrajectoryFile(files[0].string()); + } +} + +void MainWindow::on_actionSave_trackingdata_triggered() { + saveDataToFile(); +} + +void MainWindow::on_actionOpen_Camera_triggered() { + m_CameraDevice = new CameraDevice(); + + m_CameraDevice->show(); + + QObject::connect(m_CameraDevice, &CameraDevice::emitSelectedCameraDevice, this, &MainWindow::receiveSelectedCameraDevice); +} + +void MainWindow::on_actionQuit_triggered() { + qobject_cast (getController())->exit(); +} + +///////////////////////////////menu->edit///////////////////////////// + +void MainWindow::on_actionUndo_triggered() +{ + qobject_cast (getController())->emitUndoCommand(); +} + +void MainWindow::on_actionRedo_triggered() +{ + qobject_cast (getController())->emitRedoCommand(); +} + +void MainWindow::on_actionShowActionList_triggered() +{ + qobject_cast (getController())->emitShowActionListCommand(); +} + +void MainWindow::on_actionSettings_triggered() { + m_SettingsWindow = new SettingsWindow(); + + m_SettingsWindow->show(); +} + +///////////////////////////////menu->view///////////////////////////// + +//toggle toolbars actions void MainWindow::on_actionToggle_menu_toolbar_triggered(){ bool currentState = ui->toolBarMenu->isVisible(); ui->toolBarMenu->setVisible(!currentState); @@ -982,8 +988,26 @@ void MainWindow::on_actionToggle_fullscreen_triggered(){ } } +//////////////////////////////////menu->Go to////////////////////////////////// + +void MainWindow::on_actionOpen_Plugins_directory_triggered() { + QDesktopServices::openUrl(QUrl::fromLocalFile(CFG_DIR_PLUGINS)); +} +void MainWindow::on_actionOpen_Track_directory_triggered() { + QDesktopServices::openUrl(QUrl::fromLocalFile(CFG_DIR_TRACKS)); +} +void MainWindow::on_actionOpen_Trial_directory_triggered() { + QDesktopServices::openUrl(QUrl::fromLocalFile(CFG_DIR_TRIALS)); +} +void MainWindow::on_actionOpen_Screenshot_directory_triggered() { + QDesktopServices::openUrl(QUrl::fromLocalFile(CFG_DIR_SCREENSHOTS)); +} +void MainWindow::on_actionOpen_Videos_directory_triggered() { + QDesktopServices::openUrl(QUrl::fromLocalFile(CFG_DIR_VIDEOS)); +} + -//////////////////////////////////Help////////////////////////////// +//////////////////////////////////menu->Help////////////////////////////// void MainWindow::on_actionUser_guide_triggered(){ QDesktopServices::openUrl(QUrl("https://github.com/BioroboticsLab/biotracker_core/wiki")); diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.h b/BioTracker/CoreApp/BioTracker/View/MainWindow.h index 7f4dc346..750eaa0b 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.h +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.h @@ -104,6 +104,13 @@ class MainWindow : public IViewMainWindow { void on_actionToggle_video_toolbar_triggered(); void on_actionToggle_fullscreen_triggered(); +//menu->Go to + void on_actionOpen_Plugins_directory_triggered(); + void on_actionOpen_Track_directory_triggered(); + void on_actionOpen_Trial_directory_triggered(); + void on_actionOpen_Screenshot_directory_triggered(); + void on_actionOpen_Videos_directory_triggered(); + //view toolbar actions void on_actionAdd_Track_triggered(); diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.ui b/BioTracker/CoreApp/BioTracker/View/MainWindow.ui index 536a393c..7096a93b 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.ui +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.ui @@ -443,8 +443,8 @@ 0 0 - 738 - 294 + 737 + 304 @@ -466,8 +466,8 @@ 0 0 - 738 - 294 + 737 + 304 @@ -512,8 +512,8 @@ 0 0 - 738 - 294 + 737 + 304 @@ -548,8 +548,8 @@ 0 0 - 738 - 294 + 737 + 304 @@ -608,22 +608,22 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Ubuntu'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The BioTracker is a modular tracking software consisting of a core management framework and various trackers which you can 'plug in'. You can track on videos, picture and camera streams.</p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> -<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Basic steps</span></p> -<ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Load a medium (video, picture or camera stream) </li> -<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Load a tracker (usually trackers are preloaded from the 'Plugins' directory) </li> -<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the desired tracker options </li> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:0px;"><span style=" font-size:8pt; font-style:italic;">(This often takes some time to figure out)</span></p> -<li style=" font-size:8pt; font-style:italic;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-style:normal;">You can manage the tracking and trials in the 'Experiment' tab</span></li> -<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Insert the objects to track if the tracker does not generate them automatically</li> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:0px;"><span style=" font-size:8pt; font-style:italic;">(If you want to track two objects, add two tracks by right clicking the video or using the button on the left toolbar)</span></p> -<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Start tracking by having the tracking activated and playing the video!</li></ol> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:0px;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">More information on how to use the BioTracker can be found in the <a href="https://github.com/BioroboticsLab/biotracker_core/wiki"><span style=" text-decoration: underline; color:#0000ff;">user guide</span></a>.</p></body></html> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:9pt;">The BioTracker is a modular tracking software consisting of a core management framework and various trackers which you can 'plug in'. You can track on videos, picture and camera streams.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:9pt;"><br /></p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:9pt; font-weight:600;">Basic steps</span></p> +<ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Load a medium (video, picture or camera stream) </li> +<li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Load a tracker (usually trackers are preloaded from the 'Plugins' directory) </li> +<li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the desired tracker options </li> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:8pt; font-style:italic;">(This often takes some time to figure out)</span></p> +<li style=" font-family:'Ubuntu'; font-size:8pt; font-style:italic;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-style:normal;">You can manage the tracking and trials in the 'Experiment' tab</span></li> +<li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Insert the objects to track if the tracker does not generate them automatically</li> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:8pt; font-style:italic;">(If you want to track two objects, add two tracks by right clicking the video or using the button on the left toolbar)</span></p> +<li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Start tracking by having the tracking activated and playing the video!</li></ol> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:9pt;"><br /></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:0px; font-family:'Ubuntu'; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:9pt;"> </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:9pt;">More information on how to use the BioTracker can be found in the </span><a href="https://github.com/BioroboticsLab/biotracker_core/wiki"><span style=" font-family:'Ubuntu'; font-size:9pt; text-decoration: underline; color:#0000ff;">user guide</span></a><span style=" font-family:'Ubuntu'; font-size:9pt;">.</span></p></body></html> true @@ -637,8 +637,8 @@ p, li { white-space: pre-wrap; } 0 0 - 738 - 294 + 737 + 304 @@ -687,7 +687,7 @@ p, li { white-space: pre-wrap; } 0 0 1022 - 18 + 21 @@ -746,9 +746,22 @@ p, li { white-space: pre-wrap; } + + + Go to + + + + + + + + + + @@ -877,8 +890,8 @@ QToolButton { - 20 - 20 + 30 + 30 @@ -1016,7 +1029,7 @@ QToolButton { :/Images/resources/upper_toolbar/undo2.png:/Images/resources/upper_toolbar/undo2.png - undo + Undo Undo the last entity action @@ -1031,7 +1044,7 @@ QToolButton { :/Images/resources/upper_toolbar/redo2.png:/Images/resources/upper_toolbar/redo2.png - redo + Redo Redo the next entity action if possible @@ -1042,7 +1055,7 @@ QToolButton { - show action list + Show command list Show the action list containing all actions @@ -1321,6 +1334,31 @@ QToolButton { Qt::ApplicationShortcut + + + Open Tracks directory + + + + + Open Trials directory + + + + + Open Screenshots directory + + + + + Open Videos directory + + + + + Open Plugins directory + + diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedComponent.h b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedComponent.h index f2e61aa6..878da95b 100644 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedComponent.h +++ b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedComponent.h @@ -6,6 +6,7 @@ #include #include +#include #include @@ -217,19 +218,22 @@ class IModelTrackedPolygon : public IModelComponentTemporal2D public: /** - * The constructor of the IModelTrackedPoint class is able to receive a QObject as parent. + * The constructor of the IModelTrackedPolygon class is able to receive a QObject as parent. */ IModelTrackedPolygon(QObject *parent = 0); // TODO: check if overlapping needed? - // List of Polygons; first one is the outer Polygon the others are inner Polygons (holes) - virtual void setPolygon(QList> polygons) = 0; + // List of QPolygons; first one is the outer Polygon the others are inner Polygons (holes) + virtual void setPolygon(QList polygons) = 0; // Get list of Polygons; first one is the outer Polygon the others are inner Polygons (holes) virtual QList> getPolygon() = 0; // Check if list of Polygons exists; first one is the outer Polygon the others are inner Polygons (holes) virtual float hasPolygon() = 0; + +protected: + QList _polygon; }; class IModelTrackedEllipse : public IModelTrackedPoint From cad3e841f520fc0e394c2838300c05581391b728 Mon Sep 17 00:00:00 2001 From: jotpio Date: Wed, 11 Apr 2018 02:35:16 +0200 Subject: [PATCH 021/171] fixed annotations not serialized added new logo --- .../Controller/ControllerAnnotations.cpp | 59 ++++++++++-------- .../Controller/ControllerAnnotations.h | 1 + .../CoreApp/BioTracker/View/MainWindow.cpp | 5 +- .../CoreApp/BioTracker/guiresources.qrc | 13 ++-- .../BioTracker/resources/logo/BT3-big.ico | Bin 0 -> 6468 bytes .../BioTracker/resources/logo/BT3-big.png | Bin 0 -> 12401 bytes .../BioTracker/resources/logo/BT3-small.png | Bin 0 -> 1963 bytes 7 files changed, 42 insertions(+), 36 deletions(-) create mode 100644 BioTracker/CoreApp/BioTracker/resources/logo/BT3-big.ico create mode 100644 BioTracker/CoreApp/BioTracker/resources/logo/BT3-big.png create mode 100644 BioTracker/CoreApp/BioTracker/resources/logo/BT3-small.png diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.cpp b/BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.cpp index c8b99513..fd8ce40e 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.cpp +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.cpp @@ -13,6 +13,11 @@ ControllerAnnotations::~ControllerAnnotations() delete getView(); } +void ControllerAnnotations::cleanup() { + // Delete the model to trigger serialization + delete getModel(); +} + void ControllerAnnotations::reset(std::string filepath) { // Replace the model with a fresh one. @@ -117,34 +122,38 @@ void ControllerAnnotations::keyPressEvent(QKeyEvent *event) void ControllerAnnotations::mousePressEvent(QMouseEvent *event, const QPoint &pos) { - auto model = static_cast(getModel()); - bool handled = true; - switch (actionQueued) - { - case ActionQueued::CreateArrow: - model->startArrow(pos, model->getCurrentFrame()); - break; - case ActionQueued::CreateLabel: - model->startLabel(pos, model->getCurrentFrame()); - break; - case ActionQueued::CreateRect: - model->startRect(pos, model->getCurrentFrame()); - break; - case ActionQueued::CreateEllipse: - model->startEllipse(pos, model->getCurrentFrame()); - break; - default: - if (model->tryStartDragging(pos)) - updateView(); - else - handled = false; + if (event->button() == Qt::LeftButton) { + auto model = static_cast(getModel()); + bool handled = true; + + switch (actionQueued) + { + case ActionQueued::CreateArrow: + model->startArrow(pos, model->getCurrentFrame()); + break; + case ActionQueued::CreateLabel: + model->startLabel(pos, model->getCurrentFrame()); + break; + case ActionQueued::CreateRect: + model->startRect(pos, model->getCurrentFrame()); + break; + case ActionQueued::CreateEllipse: + model->startEllipse(pos, model->getCurrentFrame()); + break; + default: + if (model->tryStartDragging(pos)) + updateView(); + else + handled = false; updateView(); - break; + break; + } + if (handled) + event->accept(); + actionQueued = ActionQueued::None; } - if (handled) - event->accept(); - actionQueued = ActionQueued::None; + } void ControllerAnnotations::mouseReleaseEvent(QMouseEvent*event, const QPoint &pos) diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.h b/BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.h index 3293307c..7e0dc898 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.h +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.h @@ -13,6 +13,7 @@ Q_OBJECT public: ControllerAnnotations(QObject* parent = 0, IBioTrackerContext* context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::ANNOTATIONS); virtual ~ControllerAnnotations(); + void cleanup(); // IController interface public: diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp index e6570529..e9a2ba49 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp @@ -69,7 +69,8 @@ MainWindow::MainWindow(QWidget* parent, IController* controller, IModel* model) createIntroductionWizard(); - QApplication::setWindowIcon(QIcon(":/Logo/resources/logo/firstlogo.ico")); + //set window icon + QApplication::setWindowIcon(QIcon(":/Logo/resources/logo/BT3-big.ico")); //view actions //QAction* dockWidgetHider = ui->dockWidgetAlgorithm->toggleViewAction(); @@ -269,7 +270,7 @@ void MainWindow::createIntroductionWizard(){ { p1->setTitle("BioTracker 3 - Introduction"); - QPixmap logoImg(":/Logo/resources/logo/firstlogo.png"); + QPixmap logoImg(":/Logo/resources/logo/BT3-big.png"); QPixmap scaledImg = logoImg.scaled(QSize(600,400),Qt::KeepAspectRatio, Qt::SmoothTransformation); QLabel* imgLabel = new QLabel; diff --git a/BioTracker/CoreApp/BioTracker/guiresources.qrc b/BioTracker/CoreApp/BioTracker/guiresources.qrc index 5010e0a8..a6dfca2e 100644 --- a/BioTracker/CoreApp/BioTracker/guiresources.qrc +++ b/BioTracker/CoreApp/BioTracker/guiresources.qrc @@ -37,11 +37,8 @@ resources/left_toolbar/delete-track.png resources/left_toolbar/select-all.png resources/left_toolbar/swap.png - - - resources/introduction/intro.txt resources/introduction/images/BioTracker.PNG resources/introduction/toolbars.txt @@ -53,14 +50,12 @@ resources/introduction/context_menus.txt resources/introduction/images/context_video.png resources/introduction/images/context_entity.png - - - - - + resources/logo/firstlogo.png resources/logo/firstlogo.ico - + resources/logo/BT3-big.ico + resources/logo/BT3-big.png + resources/logo/BT3-small.png diff --git a/BioTracker/CoreApp/BioTracker/resources/logo/BT3-big.ico b/BioTracker/CoreApp/BioTracker/resources/logo/BT3-big.ico new file mode 100644 index 0000000000000000000000000000000000000000..06441e39ef262425d63a88b5abd070a0fc0eb6f9 GIT binary patch literal 6468 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 literal 0 HcmV?d00001 diff --git a/BioTracker/CoreApp/BioTracker/resources/logo/BT3-big.png b/BioTracker/CoreApp/BioTracker/resources/logo/BT3-big.png new file mode 100644 index 0000000000000000000000000000000000000000..62c4b41fb6074344e8a371bd2688ad76b3636c86 GIT binary patch literal 12401 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 Vb_^_?IP|l=0M5n Date: Wed, 11 Apr 2018 21:01:35 +0200 Subject: [PATCH 022/171] added open file, open directory to screenshot functionality --- .../CoreApp/BioTracker/View/MainWindow.cpp | 2 +- .../BioTracker/View/TrackedComponentView.cpp | 15 ++++++++--- .../BioTracker/View/VideoControllWidget.cpp | 25 +++++++++++++++++-- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp index e9a2ba49..835d5d81 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp @@ -277,7 +277,7 @@ void MainWindow::createIntroductionWizard(){ imgLabel->setPixmap(scaledImg); imgLabel->setAttribute(Qt::WA_TranslucentBackground); imgLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - + imgLabel->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); QFile file(":/Introduction/resources/introduction/intro.txt"); QLabel *introLabel= new QLabel; diff --git a/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp b/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp index 7bb4c1fb..49621c70 100644 --- a/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp +++ b/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp @@ -384,11 +384,18 @@ void TrackedComponentView::receiveColorChangeBrushAll() { QList childrenItems = this->childItems(); QGraphicsItem* childItem; - QColor color = QColorDialog::getColor(Qt::white, nullptr, QString("Choose fill color"), QColorDialog::ShowAlphaChannel);; - foreach(childItem, childrenItems) { + const QColorDialog::ColorDialogOptions options = QFlag(QColorDialog::ShowAlphaChannel || QColorDialog::DontUseNativeDialog); + QColor color = QColorDialog::getColor(Qt::white, nullptr, QString("Choose fill color"), options); +// QColorDialog* cDialog = new QColorDialog(Qt::white); +// cDialog->show(); +// cDialog->activateWindow(); +// cDialog->raise(); +// cDialog->setFocus(); + + foreach(childItem, childrenItems) { ComponentShape* childShape = dynamic_cast(childItem); if (childShape) { - childShape->changeBrushColor(color); + childShape->changeBrushColor(color); } } } @@ -398,7 +405,7 @@ void TrackedComponentView::receiveColorChangeBorderAll() { QList childrenItems = this->childItems(); QGraphicsItem* childItem; - QColor color = QColorDialog::getColor(Qt::white, nullptr, QString("Choose border color"), QColorDialog::ShowAlphaChannel);; + QColor color = QColorDialog::getColor(Qt::white, nullptr, QString("Choose border color"), QColorDialog::ShowAlphaChannel);; foreach(childItem, childrenItems) { ComponentShape* childShape = dynamic_cast(childItem); if (childShape) { diff --git a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp b/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp index 54fad303..736a93c4 100644 --- a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp +++ b/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp @@ -4,8 +4,9 @@ #include "Model/MediaPlayer.h" #include -#include "QMessageBox" +#include #include +#include VideoControllWidget::VideoControllWidget(QWidget* parent, IController* controller, IModel* model) : IViewWidget(parent, controller, model), @@ -232,7 +233,27 @@ void VideoControllWidget::on_actionScreenshot_triggered(bool checked){ QString filePathAbs = fi.absoluteFilePath(); QString msgText = "The Screenshot has been saved to:\n " + filePathAbs; - QMessageBox::information(nullptr, "Screenshot taken!", msgText); + //QMessageBox::information(nullptr, "Screenshot taken!", msgText); + + QMessageBox msgBox; + msgBox.setText("You took a screenshot!"); + msgBox.setInformativeText(msgText); + msgBox.setStandardButtons(QMessageBox::Ok); + msgBox.setDefaultButton(QMessageBox::Ok); + QPushButton *goToFileDirButton = msgBox.addButton(tr("Show in folder"), QMessageBox::ActionRole); + QPushButton *openFileButton = msgBox.addButton(tr("Open screenshot"), QMessageBox::ActionRole); + + msgBox.setIcon(QMessageBox::Information); + msgBox.exec(); + + if (msgBox.clickedButton() == goToFileDirButton) { + QUrl fileDirUrl = QUrl::fromLocalFile(fi.absolutePath()); + QDesktopServices::openUrl(fileDirUrl); + } + else if (msgBox.clickedButton() == openFileButton){ + QUrl fileUrl = QUrl::fromLocalFile(filePathAbs); + QDesktopServices::openUrl(fileUrl); + } } void VideoControllWidget::on_actionRecord_cam_triggered(bool checked){ ControllerPlayer* controller = dynamic_cast(getController()); From 39ce747d8b3ce7838f9d299e88576b7ef80be43b Mon Sep 17 00:00:00 2001 From: jotpio Date: Thu, 12 Apr 2018 17:07:08 +0200 Subject: [PATCH 023/171] added default location for manual saving to settings window --- .../CoreApp/BioTracker/View/MainWindow.cpp | 12 +- .../CoreApp/BioTracker/View/MainWindow.ui | 15 +- .../BioTracker/View/SettingsWindow.cpp | 16 + .../CoreApp/BioTracker/View/SettingsWindow.h | 2 + .../CoreApp/BioTracker/View/SettingsWindow.ui | 310 ++++++++---------- BioTracker/CoreApp/BioTracker/util/types.h | 2 + 6 files changed, 183 insertions(+), 174 deletions(-) diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp index 835d5d81..b5895e65 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp @@ -64,7 +64,6 @@ MainWindow::MainWindow(QWidget* parent, IController* controller, IModel* model) ); //resize to full size - //QWidget::showFullScreen(); QWidget::showMaximized(); createIntroductionWizard(); @@ -712,9 +711,16 @@ void MainWindow::saveDataToFile(){ "tracking data files (*.csv *.dat *.json)"); boost::filesystem::path file; - QString f = QFileDialog::getSaveFileName(this, "Save trajectory data to file", "", fileFilter, 0); - qobject_cast (getController())->saveTrajectoryFile(f.toStdString()); + BioTracker::Core::Settings *set = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); + std::string locStr = set->getValueOrDefault(CFG_DEFAULT_LOC_MAN_SAVE, ""); + QString locStrQ = QString::fromStdString(locStr); + + QString f = QFileDialog::getSaveFileName(this, "Save trajectory data to file", locStrQ, fileFilter, 0); + + if (f != "") { + qobject_cast (getController())->saveTrajectoryFile(f.toStdString()); + } } ////////////////////////////////////////////////SLOTS///////////////////////////////////// diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.ui b/BioTracker/CoreApp/BioTracker/View/MainWindow.ui index 7096a93b..ecaefee7 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.ui +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.ui @@ -78,7 +78,7 @@ Qt::Horizontal - 7 + 10 false @@ -313,6 +313,9 @@ 0 + + 0 + 0 @@ -443,7 +446,7 @@ 0 0 - 737 + 743 304 @@ -466,7 +469,7 @@ 0 0 - 737 + 743 304 @@ -512,7 +515,7 @@ 0 0 - 737 + 743 304 @@ -548,7 +551,7 @@ 0 0 - 737 + 743 304 @@ -637,7 +640,7 @@ p, li { white-space: pre-wrap; } 0 0 - 737 + 743 304 diff --git a/BioTracker/CoreApp/BioTracker/View/SettingsWindow.cpp b/BioTracker/CoreApp/BioTracker/View/SettingsWindow.cpp index 2cb7bc03..3aa21098 100644 --- a/BioTracker/CoreApp/BioTracker/View/SettingsWindow.cpp +++ b/BioTracker/CoreApp/BioTracker/View/SettingsWindow.cpp @@ -2,6 +2,8 @@ #include "settings/Settings.h" +#include + SettingsWindow::SettingsWindow(QWidget *parent) : QWidget(parent), ui(new Ui::SettingsForm) @@ -37,6 +39,9 @@ SettingsWindow::SettingsWindow(QWidget *parent) : int qp = set->getValueOrDefault(CFG_GPU_QP, CFG_GPU_QP_VAL); ui->lineEdit_qp->setText(std::to_string(qp).c_str()); + std::string locStr= set->getValueOrDefault(CFG_DEFAULT_LOC_MAN_SAVE, CFG_DEFAULT_LOC_MAN_SAVE_VAL); + ui->lineEditLocationManSave->setText(QString::fromStdString(locStr)); + #ifndef WITH_CUDA ui->lineEdit_qp->setVisible(false); ui->label_qp->setVisible(false); @@ -64,9 +69,20 @@ void SettingsWindow::on_buttonSaveClose_clicked() { int qp = (ui->lineEdit_qp->text()).toInt(); set->setParam(CFG_GPU_QP, qp); + std::string defaultManSave = (ui->lineEditLocationManSave->text()).toStdString(); + set->setParam(CFG_DEFAULT_LOC_MAN_SAVE, defaultManSave); + this->close(); } +void SettingsWindow::on_pushButtonSetNewLocManSave_clicked() { + QString dirStr = QFileDialog::getExistingDirectory(this, tr("Select Directory"), "", QFileDialog::ShowDirsOnly); + if (dirStr) { + ui->lineEditLocationManSave->setText(dirStr); + } +} + + SettingsWindow::~SettingsWindow() { diff --git a/BioTracker/CoreApp/BioTracker/View/SettingsWindow.h b/BioTracker/CoreApp/BioTracker/View/SettingsWindow.h index 9740a410..46a12ec8 100644 --- a/BioTracker/CoreApp/BioTracker/View/SettingsWindow.h +++ b/BioTracker/CoreApp/BioTracker/View/SettingsWindow.h @@ -27,6 +27,8 @@ class SettingsWindow : public QWidget //void on_pushButton_clicked(); void on_buttonSaveClose_clicked(); + void on_pushButtonSetNewLocManSave_clicked(); + //void on_comboBox_currentIndexChanged(int index); Q_SIGNALS: diff --git a/BioTracker/CoreApp/BioTracker/View/SettingsWindow.ui b/BioTracker/CoreApp/BioTracker/View/SettingsWindow.ui index 5abd166a..5b4f3e13 100644 --- a/BioTracker/CoreApp/BioTracker/View/SettingsWindow.ui +++ b/BioTracker/CoreApp/BioTracker/View/SettingsWindow.ui @@ -6,176 +6,156 @@ 0 0 - 389 - 239 + 485 + 303 Settings - - - - 290 - 210 - 91 - 23 - - - - Save and Close - - - - - - 10 - 10 - 371 - 131 - - - - Recording - - - - - 10 - 20 - 61 - 16 - - - - Video codec - - - - - - 228 - 20 - 131 - 22 - - - - - - - 10 - 40 - 181 - 17 - - - - Drop frames on buffer-overrun - - - - - - 10 - 60 - 161 - 17 - - - - Record scaled output - - - - - - 10 - 80 - 131 - 16 - - - - Process every n'th frame: - - - - - - 230 - 80 - 121 - 20 - - - - 1 - - - - - - 10 - 100 - 171 - 16 - - - - GPU encoder, Quantizer Parameter - - - - - - 230 - 100 - 121 - 20 - - - - 15 - - - - - - - 10 - 150 - 371 - 51 - - - - Exporting - - - - - 230 - 20 - 131 - 22 - - - - - - - 10 - 20 - 91 - 16 - - - - Default exporter - - - + + + + + Recording + + + + + + + + Video codec + + + + + + + + 0 + 0 + + + + + + + + + + Drop frames on buffer-overrun + + + + + + + Record scaled output + + + + + + + + + Process every n'th frame: + + + + + + + 1 + + + + + + + + + + + GPU encoder, Quantizer Parameter + + + + + + + 15 + + + + + + + + + + + + + 0 + 0 + + + + Exporting + + + + + + + + Default exporter + + + + + + + + + + + + + + Default location for manual saves: + + + + + + + false + + + + + + + Change + + + + + + + + + + + + Save and Close + + + + diff --git a/BioTracker/CoreApp/BioTracker/util/types.h b/BioTracker/CoreApp/BioTracker/util/types.h index e7d39f0a..d119c62d 100644 --- a/BioTracker/CoreApp/BioTracker/util/types.h +++ b/BioTracker/CoreApp/BioTracker/util/types.h @@ -22,6 +22,8 @@ #define CFG_GPU_QP_VAL 15 #define CFG_SER_CSVSEP "Serializers/CSV_SEPARATOR" #define CFG_SER_CSVSEP_VAL ";" +#define CFG_DEFAULT_LOC_MAN_SAVE "BiotrackerCore/DefaultLocationManualSave" +#define CFG_DEFAULT_LOC_MAN_SAVE_VAL "" #define CFG_DIR_PLUGINS "./Plugins/" From 866291cd12908a70a07db4ba2a38750697fc9962 Mon Sep 17 00:00:00 2001 From: jotpio Date: Thu, 12 Apr 2018 17:52:53 +0200 Subject: [PATCH 024/171] added non transparent logo as icon --- .../CoreApp/BioTracker/View/MainWindow.cpp | 2 +- .../CoreApp/BioTracker/View/SettingsWindow.cpp | 2 +- BioTracker/CoreApp/BioTracker/guiresources.qrc | 2 ++ .../resources/logo/BT3-big_non_transparent.ico | Bin 0 -> 7304 bytes .../resources/logo/BT3-big_non_transparent.png | Bin 0 -> 15251 bytes 5 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 BioTracker/CoreApp/BioTracker/resources/logo/BT3-big_non_transparent.ico create mode 100644 BioTracker/CoreApp/BioTracker/resources/logo/BT3-big_non_transparent.png diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp index b5895e65..2aeaf300 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp @@ -69,7 +69,7 @@ MainWindow::MainWindow(QWidget* parent, IController* controller, IModel* model) createIntroductionWizard(); //set window icon - QApplication::setWindowIcon(QIcon(":/Logo/resources/logo/BT3-big.ico")); + QApplication::setWindowIcon(QIcon(":/Logo/resources/logo/BT3-big_non_transparent.ico")); //view actions //QAction* dockWidgetHider = ui->dockWidgetAlgorithm->toggleViewAction(); diff --git a/BioTracker/CoreApp/BioTracker/View/SettingsWindow.cpp b/BioTracker/CoreApp/BioTracker/View/SettingsWindow.cpp index 3aa21098..2fa35b7e 100644 --- a/BioTracker/CoreApp/BioTracker/View/SettingsWindow.cpp +++ b/BioTracker/CoreApp/BioTracker/View/SettingsWindow.cpp @@ -77,7 +77,7 @@ void SettingsWindow::on_buttonSaveClose_clicked() { void SettingsWindow::on_pushButtonSetNewLocManSave_clicked() { QString dirStr = QFileDialog::getExistingDirectory(this, tr("Select Directory"), "", QFileDialog::ShowDirsOnly); - if (dirStr) { + if (dirStr != "") { ui->lineEditLocationManSave->setText(dirStr); } } diff --git a/BioTracker/CoreApp/BioTracker/guiresources.qrc b/BioTracker/CoreApp/BioTracker/guiresources.qrc index a6dfca2e..9269e482 100644 --- a/BioTracker/CoreApp/BioTracker/guiresources.qrc +++ b/BioTracker/CoreApp/BioTracker/guiresources.qrc @@ -57,5 +57,7 @@ resources/logo/BT3-big.ico resources/logo/BT3-big.png resources/logo/BT3-small.png + resources/logo/BT3-big_non_transparent.ico + resources/logo/BT3-big_non_transparent.png diff --git a/BioTracker/CoreApp/BioTracker/resources/logo/BT3-big_non_transparent.ico b/BioTracker/CoreApp/BioTracker/resources/logo/BT3-big_non_transparent.ico new file mode 100644 index 0000000000000000000000000000000000000000..558b13ae5fa64abd534bc5d12a656b612fb40eb7 GIT binary patch literal 7304 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 DaT=SJ literal 0 HcmV?d00001 diff --git a/BioTracker/CoreApp/BioTracker/resources/logo/BT3-big_non_transparent.png b/BioTracker/CoreApp/BioTracker/resources/logo/BT3-big_non_transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..e1f19634962d27be2e16c78dffd783f5f1cdef3b GIT binary patch literal 15251 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ƴi%)5w9_owWl!Bhl_ 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 CpfV2t literal 0 HcmV?d00001 From a0d040246cc5347c16b77db64eb5cdc123c6e9ef Mon Sep 17 00:00:00 2001 From: jotpio Date: Fri, 13 Apr 2018 01:21:57 +0200 Subject: [PATCH 025/171] fixed rotation bug --- .../BioTracker/View/ComponentShape.cpp | 139 ++++++++++++------ .../CoreApp/BioTracker/View/ComponentShape.h | 1 + .../BioTracker/View/TrackedComponentView.cpp | 12 +- .../IModel/IModelTrackedComponent.h | 2 +- 4 files changed, 102 insertions(+), 52 deletions(-) diff --git a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp index 5ff7a1bb..8d8b486a 100644 --- a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp +++ b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp @@ -52,7 +52,7 @@ ComponentShape::ComponentShape(QGraphicsObject* parent, IModelTrackedTrajectory* m_trajectoryWasActiveOnce = false; m_tracingLayer = new QGraphicsRectItem(); - m_tracingLayer->setZValue(3); + m_tracingLayer->setZValue(3); this->scene()->addItem(m_tracingLayer); m_rotationLine = QLineF(); @@ -66,7 +66,7 @@ ComponentShape::ComponentShape(QGraphicsObject* parent, IModelTrackedTrajectory* } ComponentShape::~ComponentShape() { - delete m_tracingLayer; + delete m_tracingLayer; } QRectF ComponentShape::boundingRect() const @@ -77,6 +77,7 @@ QRectF ComponentShape::boundingRect() const else if (this->data(1) == "polygon") { //outer polygon bounding rect return m_polygons[0].boundingRect(); + //return(QRect(0, 0, 1000, 1000)); } else { qDebug() << "Could not create a bounding rect for current track" << m_id; @@ -111,7 +112,7 @@ QPainterPath ComponentShape::shape() const path.addPolygon(m_polygons[0]); } else { - qDebug() << "Could not create a shape (interaction area) for current track " << m_id; + qDebug() << "Could not create a interaction area for trajectory " << m_id; assert(0); } return path; @@ -123,8 +124,8 @@ void ComponentShape::paint(QPainter * painter, const QStyleOptionGraphicsItem * Q_UNUSED(widget); - if (m_currentFramenumber < 0) - return; + if (m_currentFramenumber < 0) + return; //Antialiasing if (m_antialiasing) { painter->setRenderHint(QPainter::Antialiasing); @@ -210,7 +211,7 @@ bool ComponentShape::updateAttributes(uint frameNumber) return false; } - + // check if trajectory is valid and current entity exists if (m_trajectory->size() != 0 && m_trajectory->getValid() && m_trajectory->getChild(frameNumber)) { m_id = m_trajectory->getId(); //update m_fixed @@ -231,7 +232,7 @@ bool ComponentShape::updateAttributes(uint frameNumber) //type checker bool hasType = false; - //if point, ellipse, rectangle and valid or frameNumber = 0 (for initial entities) + //if point, ellipse, rectangle and valid or frameNumber = 0 (for initial entities that are invalid) IModelTrackedPoint* pointLike = dynamic_cast(m_trajectory->getChild(m_currentFramenumber)); if (pointLike && (pointLike->getValid() || m_currentFramenumber == 0)) { hasType = true; @@ -275,17 +276,36 @@ bool ComponentShape::updateAttributes(uint frameNumber) } //update Position - // qreal x,y; - // if(data(1) == "point"){ - // x = m_w <= m_h? pointLike->getXpx() - m_w/2 : pointLike->getXpx() - m_h/2; - // y = m_w <= m_h? pointLike->getYpx() - m_w/2 : pointLike->getYpx() - m_h/2; - // this->setPos(x,y); - // } - // else{ - this->setPos(pointLike->getXpx() - m_w/2, pointLike->getYpx() - m_h/2); - // } + this->setPos(pointLike->getXpx() - m_w/2, pointLike->getYpx() - m_h/2); m_oldPos = this->pos().toPoint(); + + /* + -for morphing into polygon: + -construct polygon from pos and width,height + -pentagon + + x / \ + / \ + | | + \_ _/ + + */ + m_polygons = QList(); + + QPolygonF polygon; + QPointF startPoint = QPointF( m_w/2, 0); + polygon << startPoint; + polygon << QPointF( m_w, m_h / 2); + polygon << QPointF( 3 * m_w / 4, m_h); + polygon << QPointF( m_w / 4, m_h); + polygon << QPointF( 0, m_h / 2); + polygon << startPoint; + + if (polygon.isClosed()) { + m_polygons.append(polygon); + } + //create tracers trace(); @@ -295,18 +315,36 @@ bool ComponentShape::updateAttributes(uint frameNumber) return true; } else { - //qDebug() << "no valid tracked component in this trajectory in frame: " << frameNumber; this->hide(); return true; } - // if polygon TODO + // if polygon IModelTrackedPolygon* polygons = dynamic_cast(m_trajectory->getChild(frameNumber)); if (polygons && (polygons->getValid() || m_currentFramenumber == 0)){ hasType = true; - qDebug() << "TODO polygon update"; + //update polygon + if (polygons->hasPolygon()) { + m_polygons = polygons->getPolygon(); + } + //also update position + this->setPos(polygons->getXpx() - m_w / 2, polygons->getYpx() - m_h / 2); + m_oldPos = this->pos().toPoint(); + + //update width and height or use defaults --> for morphing + if (m_useDefaultDimensions) { + m_w = m_polygons[0].boundingRect().width(); + m_h = m_polygons[0].boundingRect().height(); + } + + //create tracers + trace(); + + this->show(); + update(); + return true; } - //has no type + //has no type if (!hasType){ qDebug() << "The current entity has no known type"; @@ -339,9 +377,9 @@ void ComponentShape::trace() // really unefficient to flush each time //flush tracing shape history, open up the memory - // while (m_tracingLayer->childItems().size() > 0) { + // while (m_tracingLayer->childItems().size() > 0) { // delete m_tracingLayer->childItems()[0]; - // } + // } //check if number of tracing children in tracing layer is correct //delete/add the difference @@ -413,10 +451,10 @@ void ComponentShape::trace() float tracerDeg = historyChild->hasDeg() ? historyChild->getDeg() : 0.0; float tracerW = m_w * m_tracerProportions; float tracerH = m_h * m_tracerProportions; - int tracerNumber = m_currentFramenumber - i; + int tracerNumber = m_currentFramenumber - i; - Tracer* tracer = new Tracer(this->data(1), tracerNumber, tracerDeg, adjustedHistoryPointDifference, tracerW, tracerH, timeDegradationPen, timeDegradationBrush, m_tracingLayer); - QObject::connect(tracer, &Tracer::emitGoToFrame, this, &ComponentShape::emitGoToFrame); + Tracer* tracer = new Tracer(this->data(1), tracerNumber, tracerDeg, adjustedHistoryPointDifference, tracerW, tracerH, timeDegradationPen, timeDegradationBrush, m_tracingLayer); + QObject::connect(tracer, &Tracer::emitGoToFrame, this, &ComponentShape::emitGoToFrame); } //PATH @@ -464,7 +502,7 @@ void ComponentShape::trace() if (m_tracerFrameNumber) { uint tracerNumber = m_currentFramenumber - i; QFont font = QFont(); - int fontPixelSize = (int)((m_w + m_h) / 2) * m_tracerProportions * 0.2; + int fontPixelSize = (int)((m_w + m_h) / 2) * m_tracerProportions; font.setPixelSize(fontPixelSize); //font.setBold(true); QGraphicsSimpleTextItem* tracerNumberText = new QGraphicsSimpleTextItem(QString::number(tracerNumber), m_tracingLayer); @@ -722,7 +760,7 @@ void ComponentShape::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) heightSpin->setPrefix("Height: "); heightSpin->setMinimum(1); heightSpin->setMaximum(100000); - heightSpin->setValue(m_w); + heightSpin->setValue(m_h); QObject::connect(heightSpin, QOverload::of(&QSpinBox::valueChanged), this, &ComponentShape::receiveHeight); heightBox->setDefaultWidget(heightSpin); dimensionMenu->addAction(heightBox); @@ -861,10 +899,11 @@ void ComponentShape::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) morphing */ QMenu* morphMenu = new QMenu("Morph into..."); - if(data(1)=="rectangle" || data(1) == "ellipse" || data(1) == "point"){ + if(data(1)=="rectangle" || data(1) == "ellipse" || data(1) == "point" || data(1) == "polygon"){ QAction* morphPoint = morphMenu->addAction("Point", dynamic_cast(this), SLOT(morphIntoPoint())); QAction* morphEllipse = morphMenu->addAction("Ellipse", dynamic_cast(this), SLOT(morphIntoEllipse())); QAction* morphRect = morphMenu->addAction("Rectangle", dynamic_cast(this), SLOT(morphIntoRect())); + QAction* morphPoylgon = morphMenu->addAction("Polygon", dynamic_cast(this), SLOT(morphIntoPolygon())); } else{ morphMenu->setEnabled(false); @@ -1063,6 +1102,14 @@ void ComponentShape::morphIntoPoint(){ trace(); } +void ComponentShape::morphIntoPolygon() +{ + setData(1, "polygon"); + + update(); + trace(); +} + void ComponentShape::receiveTracingLength(int tracingLength) { m_tracingLength = tracingLength; @@ -1137,6 +1184,7 @@ void ComponentShape::receiveHeight(int height){ trace(); update(); } + void ComponentShape::receiveWidth(int width){ m_useDefaultDimensions = false; m_w = width; @@ -1176,29 +1224,28 @@ void ComponentShape::receiveShowId(bool toggle) void ComponentShape::receiveShapeRotation(double angle, bool rotateEntity) { m_rotationHandleLayer->setTransformOriginPoint(m_w / 2, m_h / 2); - m_rotationHandleLayer->setRotation(-angle); - - double oldAngle = m_rotation; + //m_rotationHandleLayer->setRotation(-angle); this->setTransformOriginPoint(m_w / 2, m_h / 2); - this->setRotation(m_rotation + angle); - - double toAngle; + if (m_h > m_w) { + m_rotationHandleLayer->setRotation(-angle + 90); + this->setRotation(m_rotation + angle - 90); + } + else { + m_rotationHandleLayer->setRotation(-angle); + this->setRotation(m_rotation + angle); + } if (rotateEntity) { this->pos(); - if (m_h > m_w) { - toAngle += -90 - m_rotation; - oldAngle += -90; - } - else { - toAngle = -angle - m_rotation; - oldAngle = -oldAngle; - } + double toAngle = -angle - m_rotation ; + double oldAngle = -m_rotation; + double toAngleNorm = constrainAngle(toAngle); double oldAngleNorm = constrainAngle(oldAngle); + qDebug() << toAngleNorm; Q_EMIT emitEntityRotation(m_trajectory, oldAngleNorm, toAngleNorm, m_currentFramenumber); } @@ -1281,8 +1328,8 @@ void ComponentShape::setMembers(CoreParameter* coreParams) } double ComponentShape::constrainAngle(double x){ - x = fmod(x,360); - if (x < 0) - x += 360; - return x; + x = fmod(x,360); + if (x < 0) + x += 360; + return x; } diff --git a/BioTracker/CoreApp/BioTracker/View/ComponentShape.h b/BioTracker/CoreApp/BioTracker/View/ComponentShape.h index 0b1aad64..35aa385b 100644 --- a/BioTracker/CoreApp/BioTracker/View/ComponentShape.h +++ b/BioTracker/CoreApp/BioTracker/View/ComponentShape.h @@ -70,6 +70,7 @@ class ComponentShape : public QGraphicsObject void morphIntoRect(); void morphIntoEllipse(); void morphIntoPoint(); + void morphIntoPolygon(); diff --git a/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp b/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp index 49621c70..7bc2c492 100644 --- a/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp +++ b/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp @@ -205,9 +205,10 @@ void TrackedComponentView::updateShapes(uint framenumber) { // } if (this->childItems().size() < all->size()){ - //iterate over trajectories form back to increase performance + //iterate over trajectories from back to increase performance for (int i = all->size()-1; i >= 0 && this->childItems().size() < all->size(); i--) { IModelTrackedTrajectory* trajectory = dynamic_cast(all->getChild(i)); + //check if trajectory already has shape object if(trajectory && !checkTrajectory(trajectory)){ ComponentShape* newShape = new ComponentShape(this, trajectory, trajectory->getId()); connectShape(newShape); @@ -581,15 +582,16 @@ void TrackedComponentView::connectShape(ComponentShape* shape) { //TODO bad code clean up IModelTrackedTrajectory* trajectory = shape->getTrajectory(); - IModelTrackedPoint* point = dynamic_cast(trajectory->getLastChild()); + IModelTrackedPoint* point = dynamic_cast(trajectory->getChild(m_currentFrameNumber)); if (point) { shape->setData(1, "point"); } - IModelTrackedEllipse* ellipse = dynamic_cast(trajectory->getLastChild()); + IModelTrackedEllipse* ellipse = dynamic_cast(trajectory->getChild(m_currentFrameNumber)); if (ellipse) { shape->setData(1, "ellipse"); } - IModelTrackedRectangle* rectangle = dynamic_cast(trajectory->getLastChild()); + IModelTrackedRectangle* rectangle = dynamic_cast(trajectory->getChild(m_currentFrameNumber)); if (rectangle) { shape->setData(1, "rectangle"); } - IModelTrackedPolygon* polygon = dynamic_cast(trajectory->getLastChild()); + IModelTrackedPolygon* polygon = dynamic_cast(trajectory->getChild(m_currentFrameNumber)); if (polygon) { shape->setData(1, "polygon"); } + //connect slots/signals QObject::connect(shape, SIGNAL(emitRemoveTrajectory(IModelTrackedTrajectory*)), dynamic_cast(this->getController()), SLOT(receiveRemoveTrajectory(IModelTrackedTrajectory*)), Qt::DirectConnection); QObject::connect(shape, SIGNAL(emitRemoveTrackEntity(IModelTrackedTrajectory*, uint)), dynamic_cast(this->getController()), SLOT(receiveRemoveTrackEntity(IModelTrackedTrajectory*, uint)), Qt::DirectConnection); diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedComponent.h b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedComponent.h index 878da95b..dadfeb64 100644 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedComponent.h +++ b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedComponent.h @@ -227,7 +227,7 @@ class IModelTrackedPolygon : public IModelComponentTemporal2D virtual void setPolygon(QList polygons) = 0; // Get list of Polygons; first one is the outer Polygon the others are inner Polygons (holes) - virtual QList> getPolygon() = 0; + virtual QList getPolygon() = 0; // Check if list of Polygons exists; first one is the outer Polygon the others are inner Polygons (holes) virtual float hasPolygon() = 0; From 480991d0670f666ac91413db0999fe3a56371626 Mon Sep 17 00:00:00 2001 From: jotpio Date: Fri, 13 Apr 2018 01:44:35 +0200 Subject: [PATCH 026/171] added polygon functionality to component shape --- .../CoreApp/BioTracker/View/ComponentShape.cpp | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp index 8d8b486a..e77a71ab 100644 --- a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp +++ b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp @@ -77,7 +77,6 @@ QRectF ComponentShape::boundingRect() const else if (this->data(1) == "polygon") { //outer polygon bounding rect return m_polygons[0].boundingRect(); - //return(QRect(0, 0, 1000, 1000)); } else { qDebug() << "Could not create a bounding rect for current track" << m_id; @@ -198,7 +197,6 @@ bool ComponentShape::advance() } //enables possibility for plugin to change width, height, rotation, position, etc.. -//TODO for polygons bool ComponentShape::updateAttributes(uint frameNumber) { m_currentFramenumber = frameNumber; @@ -246,7 +244,7 @@ bool ComponentShape::updateAttributes(uint frameNumber) //update rotation if(pointLike->hasDeg()){ this->setTransformOriginPoint(m_w / 2, m_h / 2); - if (m_h > m_w) { + if (m_h > m_w || data(1) == "polygon") { m_rotation = -90 - pointLike->getDeg(); this->setRotation(m_rotation); } @@ -257,7 +255,7 @@ bool ComponentShape::updateAttributes(uint frameNumber) //update rotation line m_rotationLine.setP1(QPointF(m_w / 2, m_h / 2)); - if (m_h > m_w) { + if (m_h > m_w || data(1) == "polygon") { m_rotationLine.setAngle(-90); } else { @@ -1088,25 +1086,24 @@ void ComponentShape::setObjectNameContext(QString name){ void ComponentShape::morphIntoRect(){ setData(1, "rectangle"); - update(); + updateAttributes(m_currentFramenumber); trace(); } void ComponentShape::morphIntoEllipse(){ setData(1, "ellipse"); - update(); + updateAttributes(m_currentFramenumber); trace(); } void ComponentShape::morphIntoPoint(){ setData(1, "point"); - update(); + updateAttributes(m_currentFramenumber); trace(); } - void ComponentShape::morphIntoPolygon() { setData(1, "polygon"); - update(); + updateAttributes(m_currentFramenumber); trace(); } @@ -1227,7 +1224,7 @@ void ComponentShape::receiveShapeRotation(double angle, bool rotateEntity) //m_rotationHandleLayer->setRotation(-angle); this->setTransformOriginPoint(m_w / 2, m_h / 2); - if (m_h > m_w) { + if (m_h > m_w || data(1) == "polygon") { m_rotationHandleLayer->setRotation(-angle + 90); this->setRotation(m_rotation + angle - 90); } From 465353d53f0deb56c4b79e5f770e2c1fac2e0398 Mon Sep 17 00:00:00 2001 From: jotpio Date: Fri, 13 Apr 2018 13:30:17 +0200 Subject: [PATCH 027/171] changed rectification and area descriptor handles cannot be grabbed anymore when they are invisible --- .../Controller/ControllerAreaDescriptor.cpp | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerAreaDescriptor.cpp b/BioTracker/CoreApp/BioTracker/Controller/ControllerAreaDescriptor.cpp index df4815fc..8c5d3410 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerAreaDescriptor.cpp +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerAreaDescriptor.cpp @@ -188,25 +188,38 @@ void ControllerAreaDescriptor::mousePressEvent(QMouseEvent *event, const QPoint { auto model = static_cast(getModel()); - int verticeRect = model->_rect->getVerticeAtLocation(pos); - if (verticeRect >= 0) { - _watchingVertice = verticeRect; - _watchingVerticeType = BiotrackerTypes::AreaType::RECT; - event->accept(); + //check if rectification vertice is grabbed and visible + RectDescriptor* rd = static_cast(getView()); + int verticeRect = -1; + if (rd->isVisible()) { + verticeRect = model->_rect->getVerticeAtLocation(pos); + if (verticeRect >= 0) { + _watchingVertice = verticeRect; + _watchingVerticeType = BiotrackerTypes::AreaType::RECT; + event->accept(); + } } - int verticeApp = model->_apperture->getVerticeAtLocation(pos); - if (verticeApp >= 0) { - _watchingVertice = verticeApp; - _watchingVerticeType = BiotrackerTypes::AreaType::APPERTURE; - event->accept(); + + //check if apperture vertice is grabbed and visible + AreaDescriptor* ad = static_cast(m_ViewApperture); + int verticeApp = -1; + if (ad->isVisible()) { + verticeApp = model->_apperture->getVerticeAtLocation(pos); + if (verticeApp >= 0) { + _watchingVertice = verticeApp; + _watchingVerticeType = BiotrackerTypes::AreaType::APPERTURE; + event->accept(); + } } + //else none is grabbed if (verticeRect < 0 && verticeApp < 0) { _watchingVertice = -1; _watchingVerticeType = BiotrackerTypes::AreaType::NONE; } + //disable use entire screen when one vertice is grabbed if (verticeRect > 0 || verticeApp > 0) { AreaInfo* area = static_cast(getModel()); area->setUseEntireScreen(false); From 49ed2bb0dfdf5221cbd9e70acb86b7bce511d724 Mon Sep 17 00:00:00 2001 From: jotpio Date: Fri, 13 Apr 2018 17:23:40 +0200 Subject: [PATCH 028/171] added annotation color change possiblity --- .../Controller/ControllerAnnotations.cpp | 8 + .../Controller/ControllerAnnotations.h | 1 + .../Controller/ControllerCoreParameter.cpp | 9 + .../BioTracker/View/AnnotationsView.cpp | 9 +- .../CoreApp/BioTracker/View/AnnotationsView.h | 4 + .../BioTracker/View/ComponentShape.cpp | 4 +- .../BioTracker/View/CoreParameterView.cpp | 67 ++- .../BioTracker/View/CoreParameterView.h | 6 + .../BioTracker/View/CoreParameterView.ui | 555 +++++++++++++++--- .../CoreApp/BioTracker/View/MainWindow.cpp | 2 +- .../CoreApp/BioTracker/guiresources.qrc | 2 + .../logo/BT-3_non_transparent_rounded.ico | Bin 0 -> 9475 bytes .../logo/BT-3_non_transparent_rounded.png | Bin 0 -> 40230 bytes .../View/TrackerParameterView.ui | 383 ++++++++---- 14 files changed, 814 insertions(+), 236 deletions(-) create mode 100644 BioTracker/CoreApp/BioTracker/resources/logo/BT-3_non_transparent_rounded.ico create mode 100644 BioTracker/CoreApp/BioTracker/resources/logo/BT-3_non_transparent_rounded.png diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.cpp b/BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.cpp index fd8ce40e..3bf096d8 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.cpp +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.cpp @@ -204,3 +204,11 @@ void ControllerAnnotations::receiveDelSelAnno(){ } } +void ControllerAnnotations::receiveSetAnnoColor(QColor color) +{ + AnnotationsView* view = dynamic_cast(m_View); + if (view) { + view->setColor(color); + } +} + diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.h b/BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.h index 7e0dc898..401c509d 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.h +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.h @@ -33,6 +33,7 @@ public Q_SLOTS: void receiveAddArrAnno(); void receiveAddEllAnno(); void receiveDelSelAnno(); + void receiveSetAnnoColor(QColor color); protected: void createModel(std::string filepath = ""); diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerCoreParameter.cpp b/BioTracker/CoreApp/BioTracker/Controller/ControllerCoreParameter.cpp index df3c0e19..cc1ba3cd 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerCoreParameter.cpp +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerCoreParameter.cpp @@ -5,6 +5,7 @@ #include "ControllerGraphicScene.h" #include "ControllerPlayer.h" #include "ControllerMainWindow.h" +#include "ControllerAnnotations.h" #include "View/CoreParameterView.h" #include "View/TrackedComponentView.h" #include "Model/CoreParameter.h" @@ -83,6 +84,14 @@ void ControllerCoreParameter::connectControllerToController() QObject::connect(view, &CoreParameterView::emitDisplayRectification, adController, &ControllerAreaDescriptor::setDisplayRectificationDefinition, Qt::DirectConnection); QObject::connect(view, &CoreParameterView::emitTrackingAreaAsEllipse, adController, &ControllerAreaDescriptor::setTrackingAreaAsEllipse, Qt::DirectConnection); } + + //Connections to the Annotations + { + IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::ANNOTATIONS); + ControllerAnnotations *annoController = static_cast(ctr); + QObject::connect(view, &CoreParameterView::emitSetAnnoColor, annoController, &ControllerAnnotations::receiveSetAnnoColor, Qt::DirectConnection); + } + //Connections to the DataExporter { IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::DATAEXPORT); diff --git a/BioTracker/CoreApp/BioTracker/View/AnnotationsView.cpp b/BioTracker/CoreApp/BioTracker/View/AnnotationsView.cpp index 5665d944..190dddf6 100644 --- a/BioTracker/CoreApp/BioTracker/View/AnnotationsView.cpp +++ b/BioTracker/CoreApp/BioTracker/View/AnnotationsView.cpp @@ -19,6 +19,11 @@ void AnnotationsView::prepareUpdate() prepareGeometryChange(); } +void AnnotationsView::setColor(QColor color) +{ + _annoColor = color; +} + QRectF AnnotationsView::boundingRect() const { auto model = static_cast(getModel()); @@ -42,7 +47,7 @@ void AnnotationsView::paint(QPainter * painter, const QStyleOptionGraphicsItem * for (auto &annotation : model->annotations) { if (model->getCurrentFrame() == annotation->startFrame) - painter->setPen(QPen(Qt::yellow, 6, Qt::SolidLine, Qt::RoundCap)); + painter->setPen(QPen(_annoColor, 6, Qt::SolidLine, Qt::RoundCap)); else { QColor transparentGray = Qt::gray; @@ -54,7 +59,7 @@ void AnnotationsView::paint(QPainter * painter, const QStyleOptionGraphicsItem * if (model->currentAnnotation) { - QColor transparentYellow = Qt::yellow; + QColor transparentYellow = _annoColor; transparentYellow.setAlphaF(0.5); painter->setPen(QPen(transparentYellow, 6, Qt::SolidLine, Qt::RoundCap)); model->currentAnnotation->paint(painter, option, widget); diff --git a/BioTracker/CoreApp/BioTracker/View/AnnotationsView.h b/BioTracker/CoreApp/BioTracker/View/AnnotationsView.h index 2f6c1f50..f217c8fe 100644 --- a/BioTracker/CoreApp/BioTracker/View/AnnotationsView.h +++ b/BioTracker/CoreApp/BioTracker/View/AnnotationsView.h @@ -18,6 +18,7 @@ class AnnotationsView : public IView, public QGraphicsItem public: void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) override; void prepareUpdate(); + void setColor(QColor color); protected: QRectF boundingRect() const; @@ -26,5 +27,8 @@ class AnnotationsView : public IView, public QGraphicsItem void setNewModel(IModel *model) override { setModel(model); }; protected: void connectModelView() override {}; + + //members + QColor _annoColor = QColor(Qt::yellow); }; diff --git a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp index e77a71ab..685fba4e 100644 --- a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp +++ b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp @@ -230,9 +230,9 @@ bool ComponentShape::updateAttributes(uint frameNumber) //type checker bool hasType = false; - //if point, ellipse, rectangle and valid or frameNumber = 0 (for initial entities that are invalid) + //if point, ellipse, rectangle and valid IModelTrackedPoint* pointLike = dynamic_cast(m_trajectory->getChild(m_currentFramenumber)); - if (pointLike && (pointLike->getValid() || m_currentFramenumber == 0)) { + if (pointLike && (pointLike->getValid())) { hasType = true; //update width and height or use defaults if (m_useDefaultDimensions) { diff --git a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp index 961953bd..e30d8ede 100644 --- a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp +++ b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp @@ -9,6 +9,7 @@ #include #include "Controller/ControllerCoreParameter.h" #include +#include CoreParameterView::CoreParameterView(QWidget *parent, IController *controller, IModel *model) : IViewWidget(parent, controller, model), @@ -61,7 +62,7 @@ void CoreParameterView::setPermission(std::pair pe //first check if permission is for view, if not pass permission to shapes -> view has all permissions, shapes only certain ones if (permission.first == ENUMS::COREPERMISSIONS::COMPONENTVIEW && permission.second == false) { - this->ui->scrollArea_2->setDisabled(true); + this->ui->visualizationScroll->setDisabled(true); return; } //does not need to be propagated to shapes; only handled by view @@ -260,37 +261,34 @@ void CoreParameterView::on_checkboxTrackingAreaAsEllipse_stateChanged(int v) { Q_EMIT emitTrackingAreaAsEllipse(ui->checkboxTrackingAreaAsEllipse->isChecked()); } -// void CoreParameterView::on_pushButtonFinalizeExperiment_clicked() { -// Q_EMIT emitFinalizeExperiment(); -// } +void CoreParameterView::on_pushButtonAnnoColor_clicked() +{ + QPalette pal = ui->pushButtonAnnoColor->palette(); + QColor oldColor = pal.color(QPalette::Button); + QColor newAnnoColor = QColorDialog::getColor(oldColor, Q_NULLPTR ,"Set new annotation color", QColorDialog::ShowAlphaChannel); + + if (newAnnoColor.isValid()) { + QPalette pal = ui->pushButtonAnnoColor->palette(); + pal.setColor(QPalette::Button, newAnnoColor); + ui->pushButtonAnnoColor->setAutoFillBackground(true); + ui->pushButtonAnnoColor->setPalette(pal); + ui->pushButtonAnnoColor->update(); + ui->pushButtonAnnoColor->setAutoFillBackground(true); + ui->pushButtonAnnoColor->setFlat(true); + + Q_EMIT emitSetAnnoColor(newAnnoColor); + } -// void CoreParameterView::on_checkBoxExpertOptions_stateChanged(int v) -// { -// //disable -// if (ui->checkBoxExpertOptions->checkState() == Qt::Unchecked) { -// ui->groupBoxTracerDimensions->hide(); -// ui->groupBoxMiscellaneous->hide(); -// ui->groupBoxTrackDimensions->hide(); -// ui->groupBoxTracerDimensions->hide(); -// ui->checkBoxTracerFrameNumber->hide(); -// ui->checkBoxShowId->hide(); -// } -// //enable -// else if (ui->checkBoxExpertOptions->checkState() == Qt::Checked) { -// ui->groupBoxTracerDimensions->show(); -// ui->groupBoxMiscellaneous->show(); -// ui->groupBoxTrackDimensions->show(); -// ui->groupBoxTracerDimensions->show(); -// ui->checkBoxTracerFrameNumber->show(); -// ui->checkBoxShowId->show(); -// } -// } + +} void CoreParameterView::toggleExpertOptions(bool toggle){ ui->groupBoxTracerDimensions->setVisible(toggle); ui->groupBoxMiscellaneous->setVisible(toggle); ui->groupBoxTrackDimensions->setVisible(toggle); ui->groupBoxTracerDimensions->setVisible(toggle); + ui->groupBoxAnno->setVisible(toggle); + ui->checkBoxTracerFrameNumber->setVisible(toggle); ui->checkBoxShowId->setVisible(toggle); } @@ -349,6 +347,14 @@ void CoreParameterView::fillUI() //track height if (coreParams->m_trackHeight) { ui->spinBoxTrackHeight->setValue(coreParams->m_trackHeight); } + //annotation color button + QPalette pal = ui->pushButtonAnnoColor->palette(); + pal.setColor(QPalette::Button, Qt::yellow); + ui->pushButtonAnnoColor->setAutoFillBackground(true); + ui->pushButtonAnnoColor->setPalette(pal); + ui->pushButtonAnnoColor->setFlat(true); + ui->pushButtonAnnoColor->update(); + //enable/disable widgets //expert options @@ -356,6 +362,7 @@ void CoreParameterView::fillUI() ui->groupBoxTracerDimensions->show(); ui->groupBoxMiscellaneous->show(); ui->groupBoxTrackDimensions->show(); + ui->groupBoxAnno->show(); ui->checkBoxTracerFrameNumber->show(); ui->checkBoxShowId->show(); } @@ -363,8 +370,10 @@ void CoreParameterView::fillUI() ui->groupBoxTracerDimensions->hide(); ui->groupBoxMiscellaneous->hide(); ui->groupBoxTrackDimensions->hide(); + ui->groupBoxAnno->hide(); ui->checkBoxTracerFrameNumber->hide(); ui->checkBoxShowId->hide(); + } } @@ -375,16 +384,16 @@ void CoreParameterView::setStyle() ui->groupBoxRectificationParm->setStyleSheet("QGroupBox { background-color: #d1c4e9; }"); ui->groupBoxTracing->setStyleSheet("QGroupBox { background-color: #c8e6c9; }"); ui->groupBoxMiscellaneous->setStyleSheet("QGroupBox { background-color: #ffecb3; }"); + ui->groupBoxAnno->setStyleSheet("QGroupBox { background-color: #fad8ba; }"); //expert options are slightly darker ui->groupBoxTrackDimensions->setStyleSheet("QGroupBox { background-color: #90caf9;}"); ui->groupBoxTracerDimensions->setStyleSheet("QGroupBox { background-color: #a5d6a7;}"); - //default groupbox + //default groupbox style ui->widgetParameter->setStyleSheet("QGroupBox" - " {border: 1px solid #e5e5e5;border-radius: 5px;margin-top: 1ex; /* leave space at the top for the title */}" - "QGroupBox::title {subcontrol-origin: margin; padding: 0 3px; background-color: #e5e5e5; }"); - + " {border: 1px solid #e5e5e5; border-radius: 5px; margin-top: 1ex; /* leave space at the top for the title */}" + "QGroupBox::title {subcontrol-origin: margin; padding: -1px 3px; background-color: #e5e5e5; }"); } void CoreParameterView::resetTrial() diff --git a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.h b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.h index ee6172e0..646612e0 100644 --- a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.h +++ b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.h @@ -72,6 +72,9 @@ class CoreParameterView : public IViewWidget void on_checkBoxDisplayRectification_stateChanged(int v); void on_checkboxTrackingAreaAsEllipse_stateChanged(int v); + //Annotations + void on_pushButtonAnnoColor_clicked(); + //Finalize experiment //void on_pushButtonFinalizeExperiment_clicked(); @@ -153,6 +156,9 @@ public slots: void emitDisplayRectification(bool b); void emitTrackingAreaAsEllipse(bool b); + //Annotations + void emitSetAnnoColor(QColor color); + //Finalize Experiment void emitFinalizeExperiment(); diff --git a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui index 912c7018..fe4a141e 100644 --- a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui +++ b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui @@ -123,7 +123,7 @@ 0 - + 0 @@ -155,9 +155,9 @@ 0 - 0 - 328 - 935 + -258 + 333 + 936 @@ -210,6 +210,12 @@ + + color: #e5e5e5; + + + QFrame::Plain + Qt::Horizontal @@ -223,6 +229,12 @@ 0 + + color: #e5e5e5; + + + QFrame::Plain + Qt::Horizontal @@ -376,7 +388,7 @@ - QFrame::StyledPanel + QFrame::NoFrame QFrame::Sunken @@ -386,16 +398,16 @@ 2 - 3 + 0 - 3 + 0 - 3 + 0 - 3 + 0 @@ -512,6 +524,19 @@ + + + + color: #e5e5e5; + + + QFrame::Plain + + + Qt::Horizontal + + + @@ -587,6 +612,19 @@ + + + + color: #e5e5e5; + + + QFrame::Plain + + + Qt::Horizontal + + + @@ -629,6 +667,19 @@ + + + + color: #e5e5e5; + + + QFrame::Plain + + + Qt::Horizontal + + + @@ -729,6 +780,19 @@ + + + + color: #e5e5e5; + + + QFrame::Plain + + + Qt::Horizontal + + + @@ -832,13 +896,13 @@ 3 - 3 + 0 3 - 3 + 0 @@ -880,6 +944,19 @@ + + + + color: #e5e5e5; + + + QFrame::Plain + + + Qt::Horizontal + + + @@ -893,13 +970,13 @@ 3 - 3 + 0 3 - 3 + 0 @@ -933,6 +1010,19 @@ + + + + color: #e5e5e5; + + + QFrame::Plain + + + Qt::Horizontal + + + @@ -946,13 +1036,13 @@ 3 - 3 + 0 3 - 3 + 0 @@ -983,6 +1073,19 @@ + + + + color: #e5e5e5; + + + QFrame::Plain + + + Qt::Horizontal + + + @@ -996,13 +1099,13 @@ 3 - 3 + 0 3 - 3 + 0 @@ -1036,6 +1139,19 @@ + + + + color: #e5e5e5; + + + QFrame::Plain + + + Qt::Horizontal + + + @@ -1119,53 +1235,68 @@ 0 - - - 3 - - - 3 - - - 3 - - - 3 - - - 3 - - - - - Tracer Proportions - - - - - - - Set the tracer dimensions proportional to entity dimensions - - - 2 - - - 0.010000000000000 - - - 0.001000000000000 - - - 0.500000000000000 - - - - + + + + 3 + + + 3 + + + 3 + + + 3 + + + 0 + + + + + Tracer Proportions + + + + + + + Set the tracer dimensions proportional to entity dimensions + + + 2 + + + 0.010000000000000 + + + 0.001000000000000 + + + 0.500000000000000 + + + + + + + + + color: #e5e5e5; + + + QFrame::Plain + + + Qt::Horizontal + + + @@ -1186,6 +1317,10 @@ groupBoxTracerDimensions widgetTracingType widgetTracingHistory + line_10 + line_11 + line_12 + line_13 @@ -1246,7 +1381,7 @@ 3 - 3 + 0 @@ -1310,6 +1445,19 @@ + + + + color: #e5e5e5; + + + QFrame::Plain + + + Qt::Horizontal + + + @@ -1323,6 +1471,19 @@ + + + + color: #e5e5e5; + + + QFrame::Plain + + + Qt::Horizontal + + + @@ -1336,6 +1497,19 @@ + + + + color: #e5e5e5; + + + QFrame::Plain + + + Qt::Horizontal + + + @@ -1349,6 +1523,119 @@ + + + + + 0 + 0 + + + + Annotations + + + + 2 + + + 5 + + + 5 + + + 5 + + + 5 + + + + + <html><head/><body><p>Set the color of active annotations. Inactive annotations are greyed out. An annotation is active in the frame it was created in.</p></body></html> + + + + 3 + + + 3 + + + 3 + + + 3 + + + 3 + + + + + Set color: + + + + + + + + 40 + 0 + + + + QFrame::Panel + + + QFrame::Raised + + + 1 + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 40 + 0 + + + + + 50 + 16777215 + + + + + + + + + + + + + + + + @@ -1389,29 +1676,78 @@ 5 - - - - 0 - 0 - + + + + 3 + + + 3 + + + 3 + + + 0 + + + + + + 0 + 0 + + + + Set antialiasing only for entities + + + Enable antialiasing for entities + + + + + + + + + + color: #e5e5e5; - - Set antialiasing only for entities + + QFrame::Plain - - Enable antialiasing for entities + + Qt::Horizontal - - - Set antialiasing for whole media frame - - - Enable full antialiasing - + + + + 3 + + + 0 + + + 3 + + + 0 + + + + + Set antialiasing for whole media frame + + + Enable full antialiasing + + + + @@ -1419,6 +1755,12 @@ + + color: #e5e5e5; + + + QFrame::Plain + Qt::Horizontal @@ -1449,6 +1791,9 @@ + + 3 + @@ -1542,6 +1887,19 @@ Resets when removing the tracks from the "Tracks" folder. + + + + color: #e5e5e5; + + + QFrame::Plain + + + Qt::Horizontal + + + @@ -1601,6 +1959,19 @@ Select a source in the "File" menu. + + + + color: #e5e5e5; + + + QFrame::Plain + + + Qt::Horizontal + + + @@ -1661,6 +2032,19 @@ You can add some by right-clicking the video (if loaded). + + + + color: #e5e5e5; + + + QFrame::Plain + + + Qt::Horizontal + + + @@ -1708,6 +2092,9 @@ If results are questionable, mediate the selection of tracker Start a new Trial + + false + @@ -1747,6 +2134,12 @@ If results are questionable, mediate the selection of tracker + + color: #e5e5e5; + + + QFrame::Plain + Qt::Horizontal @@ -1754,6 +2147,12 @@ If results are questionable, mediate the selection of tracker + + color: #e5e5e5; + + + QFrame::Plain + Qt::Horizontal diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp index 2aeaf300..bfd8cdf8 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp @@ -69,7 +69,7 @@ MainWindow::MainWindow(QWidget* parent, IController* controller, IModel* model) createIntroductionWizard(); //set window icon - QApplication::setWindowIcon(QIcon(":/Logo/resources/logo/BT3-big_non_transparent.ico")); + QApplication::setWindowIcon(QIcon(":/Logo/resources/logo/BT3-big_non_transparent_rounded.ico")); //view actions //QAction* dockWidgetHider = ui->dockWidgetAlgorithm->toggleViewAction(); diff --git a/BioTracker/CoreApp/BioTracker/guiresources.qrc b/BioTracker/CoreApp/BioTracker/guiresources.qrc index 9269e482..20571405 100644 --- a/BioTracker/CoreApp/BioTracker/guiresources.qrc +++ b/BioTracker/CoreApp/BioTracker/guiresources.qrc @@ -59,5 +59,7 @@ resources/logo/BT3-small.png resources/logo/BT3-big_non_transparent.ico resources/logo/BT3-big_non_transparent.png + resources/logo/BT-3_non_transparent_rounded.ico + resources/logo/BT-3_non_transparent_rounded.png diff --git a/BioTracker/CoreApp/BioTracker/resources/logo/BT-3_non_transparent_rounded.ico b/BioTracker/CoreApp/BioTracker/resources/logo/BT-3_non_transparent_rounded.ico new file mode 100644 index 0000000000000000000000000000000000000000..fdddbcc3ae42783f6a7d041f21e3454987ceec92 GIT binary patch literal 9475 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 a@ze0dN(yG4TZC{5?%mN*D^qzG^#1@Fih580 literal 0 HcmV?d00001 diff --git a/BioTracker/CoreApp/BioTracker/resources/logo/BT-3_non_transparent_rounded.png b/BioTracker/CoreApp/BioTracker/resources/logo/BT-3_non_transparent_rounded.png new file mode 100644 index 0000000000000000000000000000000000000000..d4d9e7709d28f818fc7562d0448f712ee46a4c05 GIT binary patch literal 40230 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⪙Ht$!gGS zvXEO1vmDUpgGWZI`he^9M2&P9hd=vUccl2oX&!6My)MsH1*y4TEGhJ|+Zs~iwxY#- zqz1D-0KpY!2jz>fGEg3vbUYS`IXn=R@t+uOdGYPzlN`HNcvP1WxQ_D?0YtKF(nqPm zt!hyKU!IjL3*)+8P(TJ))T#aPYv)pjY82VnbX}1=SA^pgPPAD~zC%0Ahqn*-?%kOp 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 Te4ht^(7(V8%?*n5{&(;H6K8ug literal 1006945 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

    @ZIeG*=@B|?SJN(wTYI2I#^W^g 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

    ReI_M~bF*FqhNMbVKOIwkok~9vf~h zaggqsSosR5Jm0Ccgfg2_61RH1^!5Hw*O;;>^E7idKn}pNR@zYwfuV#neP{o9{=o@d zr`XPv+lNdjU7Bpr42-gO7kNXinr1J=b5u7{+4zgflt&zRAi$}XynkGZP zzr~DeZV)@1wy!pJ&VNyc)j|(l~!iPdWGo!|9AUB~( zo-_y2<+9s#vfNfhowSWrie_X(^gGEdV&u-0uhW^^gxsYG1g$CK5Ei!C$zw6!(%hO* z`<b3t;MDB#QTTWrt3JI|*HLR6C_5PCVNT>DzzV)}WPa#vRv)vSSbyJz= zVlwmIu!!HUQe{9Cr!LCJIk?n2@eUU)E1P%h$C{zx^P%LgnxU}>1HNpn8NB}}tP@t+ zVnAJUNeb|GNpcSMOxXI{`qMZ0{O`5+^@rMyT_NPAXA>#)o${cH{htFD&Q0qqAjo=D z$9!-l`~8X3*}8$hWeDYrms+Zfk3cBHSy2z27o3qdg_4vzXPLq|&k9bW_8#t{3s zz=cL;x1K6d4+PSpvAC-5GXQ!O#*(kLt--@s54Fb3A6t?FM4T#fI{1RCvtloy!(p;7 z0pEXOeznY5qC1F0NG7nXSb`)`cJ$)M1=V^aPH^r#H5$z*7gc`PGdkso{L7plmsq!v zFLB*A{(I6DoyR3CPmXw{i`=>*stId(O z;YdS)kE0Bzc5X(dZ8TPnLvGd8{hRi3QpQ$C0m7gg-uyFGXRU;RDH+g2H@4R++iD@V z8jt^Bx~x8u^q&0@$PlPcZE*nzIX{Na#8}oHcE51=Mi93sd-;5Yc^-4+JM^ZXjO631 z$4C7&7`EM-oDzmFixC4TjB7^{$fc&PfNJH&HpsN=5V$SA4gPi?T3_#*kn*@l zqQ=Dxmjvp*=#Z7MU?eh%2pUV6VSWKJsS*Z0tQn1mi&j%QWDJ&yYu7Sin4`MQ_fw1c zj>mtJv4b*S#s}y!KLsEA)~b>e&+j_ONK`GxtwgLitJM6_TYWQWVXo@4lg+bj&9arh z0k`?24x!%txCD4P`g+(;LD0bYPH|0OMp7mkhG2YcFD#OP+pi<|OCEeWs z-?b~Si)vuMq)`U$E1vA~$Pq?xa5=`;E2iYv?wx$#NEH$RaN!Usrrl;44Bu>JB~PS80C@pk-t|l? zSVioCkGqqHt_1$@Zw`I3qn=-f@O>&y7!O2k^+bS8Ry#Q_aSiBGw8VdxF(@6S)T!GA z^M^@l`2P*NhZUM@F|kwe^_**t4!sAB{x3Z9|EM`hE<{qPSfbvNrzxgE0)_!t;1LWzaW*nX=qj%Nfadx}A31f{Rq3~b zrZURm?a!P&!Mct&zl_~q`?}9`2dyOY@ZK*uyg2i&V`-_Ik_UrcO0uZ;r4xi*#R=X9E!w2|F z;uXqF!Igm$!A7yl(KB}ja1ZhniWON*eQs-uvhVr}0|w6kINyb^@t53f-VBxgR~p#Q3VWtXq&FH`!S< zd}jUj=ZV`coSWQR0kP;ug!`^oNH6k)y23BQ0z>+c81!9PG=RpiTQH$f)l=1TV!xtBb zoe)^#xs=fw;O7eEDp_cVGp+$qGpj2g-lZah7KXV6ROx>&4TT5#`Mb{&rK82 zN_o~>8f&&0H}R-CAe0DrhBPsCB*>JB*f`h4IE}zJ+y#VR)-Npxk-kRfj?kSeR+J^IQ=UAlKGwg z3fuTphC25@u{-y_ha7z1lC9t`Q*CBH(&zd8F5p&8pq>wbm;Q6^*J90gGn4X^Qh&qS z_nZ#A8J!LO)&+dyJp=*(wSbjo25~RgWEnF`+t}_i$yI4d{L}l`@6wx7=?V#N?INy$ zJAlTkf3~Ffv-jg!a!2B!0Q2@LRp6&ehq6Z%$`xr%?A>Ov=5ON)A74YK15xbWS<+hp zIfYBItu4LK{si6a8_v}|8|tDWyAlQBPbX~Wz=iTYf^VwpF%83gANmcJ!rF%s!Or!l zHw_Ep=ssn?YGF9aj6lpq0%qe_tV$rENDmWer{=!fk4XF{tFd?C4 zUUs{PNO)TS;95coJPrS}I2c!k{+G8}_-n0&h%DQEWQ_DjOTn?rL%2-mRyE&REmn`* zQWKw!uKuk^?|IhZeW4ka35-GaxcO_VcUCh9vz&~qIPUvgiSSw=%3cKae=zmdQBD7E z-2Z}sgn$ClVbLie(pV_XM&}d(>Fye!;s*(pZV=h%?i?bbfPieHV~T)`jxlQE-uJ%G z@0=fpzxiW__xrW$bv>Vt$Jk}P%&Kian!JP(!Oq8#UoGrionjW&EvdzU-nQ0Ek7nZvVXzTNC~(#YU#tzWTzOv(^hZ6hDK_Z*g+>nDL~ z7<@isM81(x1Z`2yB(r{Orck;2*QY8!GVf_(i!~JNH`Y%m5+jC18b1{x6JV39q`H~s zir*@Bm2ocVh{Tk6?wEgbzY5)#{iMtr~K4(%$x<^_*K&kxSOFMN&!@l-1Uhrlze~sqP zuyXaTo%{Vz+M>t440$;f7k?M1X>F>s4zo;(o)6mjk%ClB(Vx5ceLu@{jq7C?c~R#w zwK^RGjWU$-dNKE02e}9x0czTZ7?dz66N#J(9QzUsTFhLbcvzhu8so_rCkQUtdoGV$ zkIU^5;$@9NwJ$2Yj_qR=Vt5l<67zZH?s3q_yTr&iF=0;`3zOz=pFTpOaB;I~PGLR9 zbJ6SXdQHG@HWc5>M!v=zhRswj)2gzg(yUs&x-oeAERS7NKp&zLeVEW{BHy&vGQI_ z$Gd+!N#~Cw23X$aI9{{v^xcSC?7i6Sy!;(IK%PjR&G-_~j|5|K0*SGvbF;IdQ{jg5 z7NouVI2ls++}Xd<0_b7_Hrq|XvvdJ)2XN^Xu%=1m(xugyufiPM;qpLUYveb zGgu~>3}|Rc$iNMHEWFiS>*(Ij(XncKZ0UOv1m?T8?ymNmcgB_wXaWdJvkxvBtCJ@_ zt}f^ZHlG3A3;@t@g{)eoeP3;ry$?CAm~$J@z;>=mr%}O8%)x?4or%pmBj1XjeO00% z2c0NyVEDwxHyc_`J~NS!qvn#HMb@_a;n7T;D=V%2NA^E5z!k*DOR}#jiyvTA^Duj&Q>>lx1QxwAUrk!Fn7^ooE$MM1xQTnt@YqqU4(j&x(5xEs>r@ z+hiNdv5NBZ$?vlXXd^mbSoyb=`XL~Xg&Fs_RMm};iAal04 z%;MDdZD`>gON6Q<5QQ7y@eCD7w{g2|WI#flw& zzOyx;uLLMWV!U0IU#h5SiP6yU-*s}}V-0L$D7$#7+ul7`QJtdnY9!#?<6WaOuEiC{ z!0I1<5q+9M+gH}j<2;HM|Na9#4m6_cvN6__7Nn@8n?=081IGpdaxVfdwkB9*0L{yQ z;@mR#J{RI=_`*2;BLQCr#BY zyt2%z1bWQa1Z9~Oyn-Qt>f@8nJpNXAC%h{{{H>^fGEeEcnyizSn^9}DyHhRvVz$yd zd41En$_+7;(bdugEL|RAw2Xs)l(X8~@<5B&oViG7`U>Q; z+u_*)a>eEp@sION(Q>!8quOg{M-^wm0W{;#CA7(EmhwH9+%K)ez0QM8K{H5mo1Xoj zQ@pZ0N3rX~F*MqW3eOF3n>}vnAfayvF|zj_?Qc}yq3+;@7i|{-=|90{KI4&Yg>^DL z_qzAL@G^R~8KXKfx69A^dEQKQGxNDD9MwwYE1B9<)07WaMf7%Ub2oMupEjrOZs|1B zw?GprDqSgQh3a-avmF0|SZq-g0zEs+Ma@~boahQ&QnN`~4ctS9#>^@C{x!Acg~;Yv zP0}sc4z~{#O-=2f40VjAI~PgloldOx{B18g4NX>4l^oNHxW?Pa+n+1Fw8KcWsdC`n z39l8Z*`?qkZ;bl`FvZ_nMX#1U3FLVsyi2bii!ymJ8{F+VSjxsKk*CSrFl%oaLy_bl zWC`qqXjQ6}8)zF!%)g^cK8*$#{(J&|;A`!8ZbgBknv(g{71NL?cS#$hz(g_C$4%T0 zSkX;V<)LBm(KT~lB2GLj63YZltg)oO1Ma3#H-qIxc>YQts>fn@tyZzpO|V`n_-2NL3+^=aN|^@-kZw5Dx1Q?jFo=AJ6pA->8gRo81XwmiFJ(%zPEP@4bzH|N8XY z9&K^KH&18`wK0{g0*WCmJNE5MaF6?;am8B5v*4A{IU?_F{yKJ`^Kz|NxcB^;5`JrR zj+{D1oD*ysgOQDG)NaQTOUG zI2EU(&eLMn>F){*6Bps4O>njFMAd%oZ8KZ|f3q5uc()JBv3~gpm0;muLW`6dv+LB% zFY5^DX_`WM#&;Td&zZ@*F|+@cf(*jy9F~YikeP4o$dSoUruuw~jIFT#%aacn$%&pb zCKrs?I#ohCHj46w(pgmX!&iFF$Ok4j6M_Jyole#rYXjacQES%4c3a2`zOswV2gHj{ z5%^CV^G1=eCNDddF8gjM3-SJ|w)edUxKumW)k@+GvgoPt?EMr-jUqU#*$w(>zTQst z+qw6o)aK$fhY=a*fmS5goj^Z9Kl_2f)?;z7A=p`w7^35U*ouj4WUV1#>-Jnzcmf8X zjWE8Hb;nqC$h7#F3X8iBmndCF^qYunF-w!KHTLvxLA*li1+bUIPG-mz`V)yq1qy{At*vj0EJ6`DTWjce+Tzi`v(u?+kw?JCecgl27-On9SH`V6| z5CF5*DSHmXfMX4ZQQ1hg-{`E1%fOFN+Q}h{&KX(~+9*^-x`$l$1g3Gjd8y<-nT;v_3q#F(pyljBw;LcsgUVO(ggcF zb%^CY2q&l%{hHR)H6FChJdD2>2TH~0(<*~XqjF1CC+d!u0TsyywOgbmQ*xU>(8S=^ z+OopCN8%~R%hpcnxM%wy$CX;cpKMi7rHO^b8%$}=0n+ym$0?^JQmUbwVdSTF z8<~2>Yn0_31Mld=<@LB7id7tjq)D|}oO!3b{!|bFD4>KGhMvZ09391LZXH;NvF>zf z+O?nc1*{*1V+J;M3@p5(v5b!wLeCd|UmQ|IF6W?c*8M~G=wXgL2gB2S@Ytqcaf9)@ zyIA~d`M|oXZHMv0ec{pVl8v*s+f+2ieMj&@4!#ys!&YfZY07BfKyl@;3j2_h$#>=B z&DjJQO|Tfa;5aZfLqVSW>jZ5YCj|yk(mbMzX=Q2YBTfORlP@D-@W86=A3u0J@&tQm z4BkQBP6I5#=Rm(0zw<}2`f#8Y%@ZJJ(T6SbeiJqUL4pZfOHH@0?B~~JzY{}3yNdVO z^vqn~c9a8Ky6c1fn>ZzZfc)Hn7MlXShhJ6kaD8R!BS(OhEA)A&*qDMd0tA1qHDJOp z-GJ8lBs#F}#NYHK}ZO#YT4CaVivSG)AUiuOK2s_4pXUc7U? zz}f;EBktG-zznp(^E8(zp-#cy@`giUSwIdvOI@cgX@OS1Nca9@U!8TGbkriY5nk&_ z^b)o8tmG$6;=>A;;u(W0)OUjC?7H?|s6>+&16D?tm84muZM!=GTDxf=0D(Qx z$ij%@k~f&`+no^``RfG!ElOL#MN0h7b3TV2^5z~S{a(6qUUuY`Kxd)X}pJKUgZ1HW-MFJDvpV&1)U;W zwFmI-m&#Md%xN_gz;USb*koha@5z$&(|!`Fl0@|}E>dZ|J$rDK$l~q5fqLV~>a!iA zV1gP>TJiQJI?&n)a=iIC&UH89ZJ4kc9r7HO6&D4}8hXDr)JUJOXSO#;ZPpIXdTDfyLa zqdNtMK+DiJ8JC**0z><*Uj)m@D1q3Z^NLoLvUf_VmNIWl>!|9O3$9BBCt`wg6F}{3 zzsKD}ZK?n>E4-qmxREn2Q=p+0w*I$wdORa=E$h6S=B&2JJaA0x9?)`XC0ID{$FTBC zLiA`f`@1pNg-uHz);!Ovs7^t>o3bOWzH-mE<5YJgc=!8^F6m`ybjYlQOnv9Z?I8c| zteQ$rOdxMxU-jjy!JD#=E}rxvVD?Yhw3ze{FX$^qbI&7aAkxc*bXb5gkfjKG_}JtOPUxH={}p6HW3?2;yo8wplqOlkscfdR#`CX6P#hBqlipj&-ay|9 ztq17(`uA`|R8F=UjpwT#8FmIu9wP~G-6+%2m?uL>K0vB_DX>V~MdDzQ=Y3i;D3DgU zMA_g>D$@Pra58szHbcrzuG+H4&AKz;PkJW;huLp6XR=fV=itQ@Zv(Q^kAO00R<1O< zHd;`_l*I`#I3SRDc9ZujY z)4hFK_2>hmn)?HihK2#~iR{%bk7f^I3020ZT%l4|kD9jVoi|ygaz{2!Dkv@;enu&^ zDkQ>TbACXxx@ad=uKUJtuGOnD3g-Ba;J8t_@VP#6Vbqn}pc{OGWS%m!si_L5@(gEk z+@eFhtYB07zSb-7y>Ri`HVybJ15@CD_b}3J_u)Dy$64Hv zR;T6Qs;D41P5*V`Cl0NZ_X1dTi?}z8iXq1noV^nc&pmm&xO|*;Z+i|2Y5XTT?nUKN zTaaiq8tyBV=CdAx3}Q659uMd#USf!$jmgBvXS&pl4tKlGXx*NsKYyEB-WzXdU&zcy zMY+2JpU@%|{z{h2gVgPYZB@M|-h0FKOkL17AKj8&QJV&aiLwZx|6E)#{@mtH+a>DT6L zclt9E8}UxpWuXek7&D-yX}HiWGdrU-%|BV|%V}8_l|B7ylISNK8Lm{Go|J8;|IQP~ zv(e?tkIMD>7(DOao+dPAhcT;_yrA*N@^Y2xgLO;ibQc(Lw783vM}bsmz%FZ9X#?!B z)1?rew`;{r4%@qVWvB~LXn3h&fpGLbJw1nx|KQ7=0c_%zgJN^dV-I7oePa(7?_ZriB#eST|2(-eVFzPDK|8T0N`t{m9qq?2O|Sd(t|(t5ZnQJB6$kRaQLehsY`PxWwZ zg7iq+<@FOs>YiGJu3BTn6=gGTeA*8^m3^>4x*6|Ga*QQB-JhxGs-Psqh>G5{K0tlU4y zcH@1Yn%VT3al%9ygqqE-g~G5g$SC%-`VA7O#w4a zPTgidTAQAysBqNrP;P9T;?l=viTOvX;!_B7a8~T+JsB~h!OvGhD!RjmBGVPg_X}Y= zsBP}D_>&YnRcvkG2&GY)PxSlQiS1A%q_F40;fNw}{P9-jj@sb&-&uQ3_N%Xzj2dMW zx@x!jCC9G{X)(V^qPoD(K$<5TqPls3di)h4I z1QM5CKT~vti9OApE+^bX3w;&3`ZUmab8R8+#D~Dmk_9Tx&~rLfEj-pgkGyi@-;<~; z@`y{6_az-wp)GsJs7@|d9eoI>1ftR$ie;dQD?IvOfiSf%6iU!p_~2EaCw=}wT;A;n zZ04yMAUhhF8-g@N+L;ZBnhYpHjP*W<_s$<0ur}YL2;k^Ij`WfXP0o(98G*U}3t3=8 zf7@^BLQ+L4w1$HoBi}qmqPmZQV=+5B)AQ2g;Uz<%uoH)9B>DL3hm--ipU0>VF1dGx zqN3MUQ*gejog8@riJC?6%LC~NA9=&LIrl)QqV<}sy?C{Za;+Fxs)}9Y+S%4@r{>F@ zh>ay-<;V@2=xqF9HOqzgZ?Vq(Q5Lp5XjTKJHv0Ye;d#1ut9)ipcF^`j{MN_-%hf!P zCB$&4jk4hUr7WOzVNoQsm;eU1ZAe*ll~+5k$vn?xxvfQvrHeg%?)F7g(<4Gk+J~S6 zm|kBQVoc3cmie!$^9$d1l{OJw#;~ww2c@AK-_*G+l5Bbe?V{LEeE;e|$;QxHPR+qR zoTWOVs--O6=GlNP(UDG#Jc5e8i-CzqHyI5!2+BYVvTOT5ZLlP2EQ{%}+kN!mL^F#Y zHy4eJ7Spcj5>O0ptZh&vGqrp>@3e}&0O|zb7t{M!w=*(`Uf+JePjgKf(mJt1{O;b) z^7fL_Q=Q^+r@6ixLP&&}n6aMNec;om+wIh;Y`+GZ$HX*nR^cuag z2)51X5kIv&Y= z$aDm}oV}^E^}6!cg?Cpf8C8fDT`Mu#w5h@ELyN_NHui?w`Md7aAi|xQxHA=%nrFz+ zH2`zR(dd=G?4OE+iu{H;9X@}1_N4iFL zZddtO)aihF@S))8>wBcg@zmM=TfVc*$>yCp7^d2~HB*f-zo7Y$AOLEF@#ASChZ}|l z`OAK=FT5tQ+qZS z=$q2H6vZ{_xkiiJnqvgE zdzJ63@eAGSmxWxOgQxq8CEr%Fl~?OqBFHT-jk<&e-<7V(e81!-ZQpadAH*)Z@UK*{ zVBs4C=VJF@YP5Z&5yzG6UTQa6Sxt6)QYhDpEv3e4AF#bi&I+49JN>D`YKu3ucSz~w zPV3*hyP!yS7grg*#h5oaa*^!51ij5ILaDi?#vg@XS`Gv%oSvsOqiMP&w_Sw?3rLX&ZqR1##MJ%%Yg1 zseitpf>9JA7c+j(KjZd8DO~xTArSHpRX=Me@eqKgd)%O6A3OSpN?~Qp2}++OL(XrGDmVGLS(ZYzo(kp4uC2luk#&e0kaDXhLwVwj`yVkEl0QNjkb1z=>WQsZGpq1 zEskded7%ROG>it@50mI_B^#!tvWjIi>!{ByHv6~&rQ=vxThWUqF7Eg<%{pHyw{#bSS!!dudeh|g9QF? z2KBAk;#>EGaJOu^K?o)NRpo*6C?#v3{Sx2nL3BB#%t;I(o^ro+R>=+hOdBR-qUk2{ z#GYWqV1hTb9!8^<bAnv9*dB_FJca5ZcG zv!b%R52OlOi>hrKB>S)(F9nGXF%m0HeSTs_r4R#&(Tby6tSK8CT}kwA7!b;KLwh{I ziYd`r8c~tQa_8Zd{VYG~vVKUea2KnCEaknL1unz88k`eIYR}&MNJ8uSs`kOgnxStp z(p8$~XZj}mTxIIoydBi~ZwmS})d=iJ6pSH68aMNAEYUyjR6)ZA*VcQKu; zmIN|w2=PPJpZ6(-%mchDjfG_Ld@FcPAQM~PP*|@|e53 z{e90#joZJdyuK%DrNg#%Z*}=i{SO98N(@Ghw~_kmP)p9oQ$d1TOD!oaHQrM_r-NIA zgDgu*QLf*#lc=FZ_d=WDc{fePd)V!oI}k&?K!!X&+?X=TX8DmPBhmG|c+S7Y7e{9Z z6sFSH$@uW-ROvHz)YRg|v(Cdw67*RZnOqp)qhegp6SUR2^@q4qYS%WqHIXFvLN}73 z0#wdf6NR!1A@{$sNsAGlyE6D;mR*e_l}&P??OC)cz_8F=p6#LOaujQQFIt~ z@8FJk<2k5sD7G46*sTDa4Y88U-WVp^9rt7HPAfZ)l$*a*z1TZa0Y5Q+Fu-pvOUsfbK;UUG2b|< zG*yQqo!&pn2FW$^mx;gTF&;vI@UMY(iJhu&-S%$-i&3KxNf1-s*sgM1ppVOvw$^{| zq{;%S!3A6v0OpnDU-DBht0DC~f^S)wn!jQStZw&bu!h^za}Um!694of#aGJ@Xwu8n z^Ly{K#3=^WAS3{pMG~h1FDA@cX_~glx{+=f;r04-Y{$lNkFAFk@dGMCU|K&{y0LcU zxMzeCJh<4_#vIRnYY8;^IRDQ)(mimVRGJ80(2^30cT4_bBv>^UCJQ5D7FK0SP1ZSN zv5PfrNi73`<18)f@~lj1riD?s3%p{8wfOTBsIFmxF1m64AO{YqY?JB$RuX9>wyed|5&G0?p(RU>gXQVde1gm6Y=r>(EO zDjam&%x@b%dc3$DG9#-&eFc-3HRP3S8^u|ofN$<1_eP|XhNK;1MQ+buOL*mD>FRJE+0rJO14I;B(2~}8Drfp-5!CrxlP97) z1bGs3k#2Dd~>=Gd6f0%jj z#B8%;fj&hnuFryMtSr@%;1JK!^|h{{1RCK6ksT=cuV{3-{X&&3LCRw3W$*HoIw4O_ zyE4yn`+z#2?5H)Bvv-YpKRVx%r}jUILVSSRAAP@|VbOPirpq4KuR@CJrX9;HTI+5M z1+ql}m`U|t=GW<4UMx;LYg)i&vfsBQX>U(UK*Uq1QYm-PNSN7cJPG{W=}aE=QBMK|IdYnDI; z?Sv^E6WVPRuNdr1T8)2(6T^*bTu$`QfrC$C9+xkJ^5`{7s)Y<^8;B3!)<^@qh-lU} zsea60x3S#QRyFHHb)9b1nBgYDnjg-hTBfZcH@~kbv za=83O(*8O_Pu0}ZcHNnB&v(~yjNMFlUW(hbGX;Q`{^U8%e3qowLj~PE3s4nAk3&`CDTp|GrLJ=etOFIs&25_Ix zA^!`~U1LzvVpS_uTd~*NOMklFa&cH<)Ql30>QFzyr+S{JjyWw>%5ydyi@gvt-{5 zuY*cxDBTNTHDcd0^OUEAth>do!8nH|_%oXZ(NmA7iT$CB4My0Rg~FRMB5v02wE|re z8RrI!xH+S z%g(BI!_LuhK1-(c++d@HMdZ@~@1l3KScv!w3yX-WxdCr4z0r+%jBdgr_uaZpvmyL? zKdsI}>HgJ_I47hEObWteM70Ncj>Aj4!Wc%7AjPQY+3f|CX$5pFY%C~x%+i2)WhXC~ z(O)XWg@C^HRZX3yJlO=%I_uT`U@>myNM%QNn4w0TP9c+8xH2g9kVJh702t~3-Kt@^ zIYMq11rJ>LKju8WfU5?cd#L&z2CQaEM8}wI;MYfgc3#c9GXxuFmsA|(#(mOSPEUQ^A{`T^5manDWgMF4H-=J>8W796`OQ`Q;4v1t zQZc55X$p?Yl0Nh9BFE97AO=9wy2EDo=qpZ9e4&E3Wer-%vU4(VO2gVKIniO)4?)xYfXyF*;v*^I4yDT4!>E+)$j6Jn0yR<~XpV1qN8Mc3q<%d6} zhJ{SWn@mwqJo8tO9@jrp_~m~f3d5uk#b2;Ivz35u+>MtDr0Yq=qthQLO>WgpKt?ffqRI1r)xy)*Nw zS(gQ2N??!*+xpF%_croVl$-%$26O-zS{}v(J`jcV{kmHdtqQbkw&SI?fRtou^MKZ8KZ?9D>|e6CSmmefmM``c1INYy5CzL*qIRVjG?b{0zDi^+!l ziqcF=igsjSfBNq#>F#$>*V}w+IpIDN)`6h9H=oRu0ppKD2@kjIT3w^<2WbXHI#n7^ zV^`WY)$pqBr|BGO>7d4%zDX|9X)M%Np@xbflh!HZ?yb3( zE)_y+C^vkBJul_``NA?SA>PR0<>2VR z^gYj25^VkSav6b__Nri_Cl<+JeWNcd@ru?25!!nocTLPU<~}JYTravq6Sp$&A9R|p zuH z@>wa6(&8HLdnrfP&c-;eqwNofH*PU@ynL@L61rTA7pn}na&Xo21XBhcHUB)p zhD=V<{P-0`wivfkRngkQW81|xZeB&`;@o4U1kJca2`5^C1aAX!cLz>?_OG`v!dm{w zX4}^^2Igx-5|J&XwiwrBtY@xCTjfU!#$a-oek|!nOO$FTo!YE>3(F+U(jtRi&bH!~ z%uk>v%{5W9Mb}u(YP+DF&XTw~21uQXecn{{(!`|q+suDJS%~u#>?&s(KU&Y6!DLvI zV@bijOZ$QOkm(=|RR9R2hFx57bV|whO#|cJL*GLaO-=|C$u!xTH@}HNoW#tupRH`s zQ7$olmKKmkT+gDQ?D*T<0)ZWq;ftkQNpdo{rTz>QpV(zBpC z8Zv~n?Aj0={!isYjYr|#At$VP8P7Qm!BopD2-zA78%B!}ZvreCU>l=XruCZFu`~4A zp0H7xr_VbXOaMiGV|0cnqg-{GGJs@YxdtaM_SGHXocied-?@fuiHy532#68TXzz)b zVPW)hTVB$1+tJ9)u_n$!fhBwX3*A`Q`YTR*gZGxZ0Sb%mKvQuHG@tshi41h$(9q># zyh=z}3c!VxYhDsz&9?gQrV@j=o-dtnI-@%JFPGxIR6qD#%xcGDoJQ!EE0P7BqR-eR z0J<{_IkT&6$*7)KBsVR5HTG2%+zU80;BT%Vzn`1tzTNcbL8El^%sJQKfjRQIse^I4 zwNn4Z<~rUjB}QDPcpZMjf?zV-^om+%J&6n8hQDmLpjHRQQ3 zn>+`MHKl?_}eCQL_>DfBVrOf}o`Dls#j1FQru>C?<<2hao z-WEN!eq7>z$8&5HMlF=rIr@pp8HyQb9&cY{us!TP>2qjl?IliS-*KCmS~`zHS}c*D zb{;J{2tS0F0%0fAR)cvTY>(=HTZ%Z-p$7n^_YAZ#kMvraI4Xmh?Nl8jaiak^heki0 z``9g;Kd*yQYunYov96SJN)U`fqvipnPzNeU@J_Mm&k6UIsBQA|l4}ahc9LddmH(Cf zJ-KpQv@1+Js9a{6BPEH^_?sesn`(}j13zJ@&rUds<_EY;lU%+uOwowg^;nkn|MRu< zoGL8JLP#1js{Nel8nb=sR6LEuB5NHYdplpU%=f$dQTYW;W0cDQ0KR71Az7kv_e?K9 z^d-3BmV%03JrIe%0T(yW$`xwtWRw^B%Bb#RMyU16rH;^}u~Jq073z?_GFOB5;4f*a za$uLoF}(1<=jg5qmRBHK1n+h^zxh{RW>=QGo^r5Sh59ft1Mh+<_jTPo>3=4z%a)qK zR`UxiY!z-OC1o#dS>tNqq@jcHC+3K_@qPcxwdNX(PI#X zZ_LJV-ebCO$h&T2^Gtt)`iw%L{z?~8I#7e0GmjL(u}&2&kb{0!DnNv=$U|aO<(c|u zqv!+Kl^yR$>-{G1?@xr-?dG|YI2&}12B0pFbLBH-QhG38%Ptp`ddhGP{&MJBuCKkD z;2m~2f*S$PxT#g3Y`f$iKG<|wP#QE+e0J2ocl~`s%AV`Oy|_}X7oZ;x?C!ZnZ-M&l zDmyZ^B?NCqHTf`iO9tN?wl@m zOX6x?eaQWzvRNd3FMH}^gRH_ zAM-^XDXdhrti->TCDXU5L{9;*l8UVxAEs`7bB-}_#B@81Vp#-=tVW-{oAh|^jy377hs+9ZX7Y4rA_vuvD zL0a{nKlEQ}63Ab4>oW+m%1eGzbOtVlJ2l6eV+>``!fT0A-~oV~+ZWwF=pal(+dZ$d z4m|qd-VW#sTv$;|cBriyoU3&`grQ={;@inJ$si9hFi|BVa84To{XUCi@?jV$ryGZe zHufkhDGy7cc+4VxS~0$<_!aO@5K-f0CpW|KnlWDdK>{{lO|Z;lt5#b43GqoEY`6vd zrg;(fLA}7Wx&OqSvo(@dAg(4Y8_wVZx*FTDa67`lrZFIL)&S2*)KNzWA+pe^ABpMz zdH!LPX|*T_FIGSJSF-gxeB0GXW8aeZVx+Cfr7#MqPTFj{t_Dff{tGR-_C)G#xHoIFRvn$E3a^laRQv6F(7nxT^cOV~MTiI5Mp}~fT-~FI(=unO z$!3uoVO7+dIT9o_20DEDM9sp-v=CULSgC;%d*nWvAkze~>L~+3(2%3G$Wyv zcf3y7QFJ7eJb{1mgq`WRAg_15I31&wn{*}A2+-&3XN5e0XBo$5by5CNhXAW!&;K@B z%R9GHz9~x)%d?NBYS+snp-viHYmWH;Z%T5%p!(Jd`03cvGJs`iD7rr^iayqC4}3A2 zO&4ES^Ku^QZ0aPy++9?9hNUi)8X7Zu7e*a^cU+ht z=MPiz!&Ny@LWHE?s61c8_WYgM$QsW@zpiR(X0F=0Q6wfM3#pgs;gx%L)2O-J5@o+D z-or{P%ap0ZTEI^1zju|LT>neQdWqqM*IV+)giJGYA_xT#pQbNssNTEbI``$c_}lH; z`9MNEC$F8fk1no5CaMlmN`T$HMmtb`_xM(USA$lV~V8;)%2ej7J&~-gJ_Jq|5bwdo=-Bmfo`Ca*)3^|`UXsM zV%c<-b>@m0>BRvsb8&I>4Q-1}3t8|j6V7Si8!MUbqBsGBxLG1NWT=T=@&ikjD5G<% zJK8FrO_@&Vb{-!(J1_0=ru{ex(c;#4Wb5YgJkPG}I7)sU^Mlb_$But8omXXiMH#9K zlRk%%Eh|hsfnIsw>Bqj-WRD;(F^Stn{*%2B4r#1&X z4s9B*;OMLax{)$IM%J37a7#h1+#%?vYrCy1kaBKfv(+5VRT5kWdBu1Q3WMUj{>yw# z#ESYZGV$rja?7x({;~GZ6iWNHuB_p7<5(E!tj7C^UkepZ2d5ddZ3V3r@WR{9o~gec z37S%<=>vRJd7~1RIGXDl?AdA%iA{uVFjbAZ^Q^E%aC~r=+@2!)NgYI46wq*i z5sRnSBoz!%ra14*nDW^yKMbKGuP!I|K*B074oiK_#{`A2ig#%@I(Ub_HM^AUdE86i zl+#E%=$e=+V5EY96_Na~5HLPX;^w2E4xG1KpAD8jS}^HRWKC^e;{opOD1X!6s}9?z zlEosoeJmGlYAA3#DV4TscD6XrpUWN|5`&E^^!t0fbNO=gpx?cqD0Mh;zBgIV%xyw= z`w*>2ikLF&OcV(nT4TEK)tEK)G|fB(!o~_BD8~q{=-#wu76euCTdH<<1UXg}Jjc4$ z?fSA@%MN6o6G8uVLmWB`F{}m`RUuq~(2bEL@95!;Wz-#rWej5|;@N=sRs|+^`y3jb zQpr?iG2XUPXdTGjZc%eOctCjj?ku(#^!@S zqtcScPcsn=vQoSVSkV)LZC`HeAe{N_O&Po0eo-lHOl&rLF~ra_Q>CYa_@MpN#<^5Y z>ZKd6nZz>4u(^~O&|rJS&-l4|x!$jrZkbw-LCT|~U&QnYnztgX) zmCks;p$-6Qj6o{FQ>NWR zxwnS=K$tR%3WrUH$jf=jUta9pkb=Fx=Ak5(PEAM=V8wv86$_2B962+WV6efOfkPgi zdV^M(`8DfS6ql&ZLBCewFHgCnm}rt&Beg==F^SA#WP zTGyPY&zq}t9%N$+O*pno;!NwasSheOfK@f_fOir*UrFb|Druz+v42++h_(Tkk2eXq zcXNuO42`e8|9t);d4(MR92;&VgDLiS?X<^~K31k*Zot2TDWoju{|~A=Zl;cKZ6D=i zl`?kAHPwe9ut#nz-^H8xU*cSZ>p$J#$W7n-CXpo`UG{h(yliX1-{+D+`-Y%~&#j+{ zr+BfqVVk>qL5Ie9W24=kJJP9-w-QK`WY4+Pb2W;b@+tS5)*a9gK#xq8c1_Q zmy<;?uzUf>Xr{d6nXIIlEOOYEAd@on9KRdM_7InNYDuL;4e~Bj?%>YKAS0)irm&WY z*D*j8=OX@e`BCWbo8$UM75iHT=k?R?zKp6x%W}v<^tKqAVk<}VxYElrOQ3nW{AY%5_k=MH2NLH;NB zTIih;_!itK_UfQIC;565N;$i}%J97@ReqE`%dQV0er==PGBgpu2HcS12-ctXRzfcW z6u7|0qQNT$sfFE{Xyxli+3ww2CWaR;I+w$E*YFmg@t-=@qg9%(knvaFLd&w%^Gt5) zwtCes{nrwP+Ya$f%8U&>%gIW?yKVQb!@uAHeaD{keT)?oVwk2uGMk0%^;>l|Ed{2= zKEiWPf6bG4`%;bl-;eA~2kIAx^3n$E6k@ufEfWCK>Ud7=(Zktq3(7h%@wA@Oj!R;U z_AAC1@?zjxZ1S{vk;;6TI%lt(W+taOL%`li*@>+@jz5S1wD_d3mJ?I^=r^V(Oa)Lr z6$eimV*7fW3z|L4d9xtF*Ob9%4 z=^%&|X2LTk*;&Y#7u33!3!myy<N@YCc1L~flA`IOYkV{keR@ubU_rh_n9qEN#>$^d3{WU2 zo>2S|Qk%rPS2#7ebcGZn_ggKm(bthr`C79Wz=~lMgv6tQrnh?}2dG_I`|&0y>7ImH z8D+foNG40X`at6UkaXUUY&P!qPY{Y0wbgu{wurr{8ST^BL1OPxTkKh4b!hF@-dZAJ zuh@htTDwLOvu2Ihdw%l%e*b{{cIUpY>s+sM&b!h}Gpg84?$bBH_&`tPfu@Obux`f6 zJF6D#bT2MCri9Bm?~aQjNBs@ zk4y7sQEP65w>zgNNuEKjH05WxB2-!3J%bv~5i%NT2hGx0#Ke2z-2VB3fl4$+g0vq= zFLXi&Fl@LemYq=YsF*5JDwq5E8(0r}CXuKsq**d%I!5lLO|kPQId?QuHK$3rz;Bic zx@y?c(TPvZ_XMb$s@mlnyZpX}4Z*UFE;*8@wLJ>S0X7_WhMzve$(e1mBJ zkD?%gUd*l9KiDy$UPJYUD(YL!kI!OnYz=Z}H(b3rcnsO>OWieRU}Z+Rdw@+tV=k48 ze=qGq8^|!!1){ch4F(K)mr|`O&UukFchgfJ7-mvUbZ^b{J@;yT=PD_D8nVT{e0t7o zWxKz=@3ta(WndX>5x7ld*8PT221-_vJgs zc>C~?8d}zI0xA*>IR%ygoPcoLE?AS=g_$2E2ND8m=fi^)83?ovBn8P|Y*zQrvds3p zCwE9G`4N?Y#UPCdV=7pGeHc-Z)9`#Pf5S!1V6?hzys7{JAw2}NQ6M$fHXfG<3s0u> z-=YVse`oo|HmmC1z;>S^O_jr`Dk4$&&QL0*^~WIf&e3ayQ`FLUjiQ*J)>Yhev$J^# zv=bf;=j9dy>7tNdixJfvyPsdC0>`nX?=(!ah^a!y_luQtV>6x$F$rZ(l*-GAILgNZn4M-J5l9l3T<8ls|+01 z$p(jvMf*|ZlN5G1Yus9o$VAL_JFD`J^ndu`Qe_>Q|oe zX)lZf#_Y8k=YoFG_r`uJ7(Uq2l1@|HdX}=0i8%jkv{={sUo^`C@GVM?sC?5g$xU$a z982b%UpKx;JM0}VUK;Ng$@kyEvJ)CVWe^&cr+y^I= z{LG*VtgeucIix0i;aZdDJ*hKcwW7gLmK#r4ui$elAP0dlCscYRv}AUD@Z2>rB{gfU zJ8->v?ovS@{2r^HzL>mP?K&K0-Ac2K%d4$_Q;IJLB~SF;CD#NO0M02UJp48E%+YR^i?!q#SXaxCvhWe(XZINH;+AIf8b)nN zFb$K7PSJ}mcTV)qCba+BeBH8F*_7L-q5c{!z6eI;S5p+ZrnwfCQ(g}pPnA=?wzJH! zN%GRGq95_Kf+TxW@-AOQ+VW;D?a-t*S1=Z*S_%q`3wv2JCi`++)6{H8`k7Je0tD^u z>j@rzm2j2W9<&!w&)0cEr?=2zwP`Tq1vr#I012H6`zFQ+e9j+GEUgX82xzd(XB~Yp zRDGW?UeR3tWNqn2=LZ|Ik^spI9rZ_Ivg`E>HYn^W`Ezb0mFkDY zL~K2=Ko%(XI`sWbYG$USrx38sPcBtfcWL64t%1H1u;TNif|2;-ga4WW3{~E|iQll$ zG&CdZed&o}8UD1L6d2E{f?-zTK0RoXrO(CpV!d)qNXF$(Nzmco#OA~raVx91UohV_ z>4bv{56mpsRg!CO(TX49EcE6h5BHtT<&K(^eOQaFxqw1b7ik{8>fak?R>AX65923N zicY4P{k91%gHtqB_}()R)N+!f0&fbbGspr-1uHavV;B(fYY3h|YU<-v-X10L?dYzV zZ2EJYI+19LUU&&xJnUahA&y|Z#<*7bP-TUs#(E$c6)B7*{8#x%G8a$FSPF<-xz{ky3@&6qsA!s0%{ zjHVfuR^dd=EaEKbF!V8P;5p*YR}|tVvOCDaUM-@;74SO(ad)LuBcubqn4k}hOrazx zptX>sOEJSjijyM(c(@zFsu;ctCOWl+|FgGlkx?Ia5~W-k7`2!$Lz1rK?~qNKu3)F% zobsl~;L|vY=b?!vXI~loWAvQMoZCf`b;by9`;lhwM$(stsemicvR%N+ILY(7viffIreuy8T<`1rO{n9O>zxmqtd?rhmt%w(w2}gtSgcXdM z*83UQCt}x3hesP<#7q`Gxhe8v{IcIL{mSpnEIC4xBk`o{H|C^B*r$&AGL83 z8_*oQRZ(YY-ni2%eJo_cF#K-9m7Yk2Jm~EJPi(NtT@Om}9I0GI-R?;a`rQuSo~tz6 z9_8J@EB-%#XPtNb28dRp`Odu?*d!3B>6PhzxgQlm8}LVG-@ESdP4PY6m-G)usTHJ) z<f%FrDZb-RCL9$`biXPLllcB>wM);h=xmgFA8VxtMKx22Tj7OU&hv1j!Z zNHAj*1L>8&sS5osqA-S~hgMy@l3e5>9E0E~shk2q`w6(+E!UIzvuc0-u-5RR@QOe* zu{=cg7|d|^qhGXugbd0i=CwSxyDqc~!n%wW6!2Y??el&hkpS>V%i1u;R(pJ_66?=@ zPq2t9Pm302GO+mzLG+<=O0c~D2ux1FPJRlaoQVm>hCz#UCm_9d4E)C&q+eO9$cnXT1)m`COx%mKBD{#<1vkXTXyOPA+jeX)P%hk*Ge%z3cJ zqovNqBLcqng6oIjNb={SkwpJQ^!QN~zx9lkrNthoHUBP3ne;tX zZfdk1RR=)i0=b(zhJpF%e(<7fEw-NFq}|i}%hXHp`nTKkOlsxAC%x#FN_kH1eAzXq zb!cr)V_;iO$n~JXiyC;^SKN?=X38Ub)W<}K^Ky?LzaP&TjpAnTB-1N{3c-_jw3hNa z@Q*vTZ-_}KA$HO!VZV$LlYr{@^2)L|9*d?Vf)z`j(28_Mkk|+)e&sc*EKh~}cWq%F z4@DF5sZNDO8o9YfNh`qDY?(ALb*5G8fmOWDB7=~0ZtOz>#RO!l0=A6^7#cD}ZUP9M zqE+6Enhz*;`n%A}uV2hv7`N(H=}k+nyT5XZ`iK9XJ! z@R6t}gR&QF%j9YgpV>i(XOP7T!ROFB=NIL7%gh;-)(oG%!)dX zojCfHN-gug?#QOgev0?U6d=M!%8i zloF7YYnyi4#p8zF1^MA@5}fj4aaR)&t=5jPCk~($0&$sDCF zwFpTlEc%!JWAL)K)y}$fj7r06mr*RhxX?BwlAW^EmfiEt4U?3xiAxjU?sKsH#t~&L zz6@MD=AfOKQN=h5zC+H+{9kg>5)om2R}@=QZV{p2w80?ZhkfAL%nRHYmdLMjm~aHR zV04Kf0YTKsj98j%$o<6ennzg7q~81c1p7dN4cSWJ;%x6ktXF$7Hb3p~9$YPQ`7d=U z!A#-Um@dOz(#>z=xts_8HswE1eT;*>DJ5 zeo=*7dykdsxI_@D`M0QL+)M<9xEJyG9pZ&4bvX+z=+ud3^~{hWi@4JZ$Uonwh5~bm zuWQqi=aW7A6pMBF&Yh$BwVXff@-gWs%b;diV19@VqnKer2%vVy8FL(238F+Ueo02t zgA9V&4O{Kjke$I18n$3z-JA~#uWpKZ_G!6eaewv$^yYtcp~s|^CaU#uC+hD2d$ZDB zF9VL(nHPXX{%BXlsYbq`myXu+EtOpZuq={-@h?1o(aOiu+7bGTbW@=u0?yJa6a-@^+WC0HF%V5O(Oj0D z&oL2qAx+?z_gETjHY{4gZVovlQ~q(?`-)IJeGG&zGD-CqHds3i>&(n4U;M!#ZueDgdT(zd#!81977k<=8*)92J?85F9A58s zt;>ceh7I&wtjW&abcT=7XwyD_-AeetqER37RM_$e`EyGg%I5icWe?@QxpI7Ru}V9W z;<|vCoWJ0A9KqdmCJ;gCn}#Q)H>jH9_Z*HGJS=B^m~d{Q(qCO-AE})n&LWPynx7x-s4(--8C;m ztP)f3Ct3?ljFM_UVcd!Rv^$|jcpp{+4y8Ny8hr^SwFkZ`vgSAMhNA*O2-%7m1q%xM zPSfMyKSxZamb^2GB{7Ch5ip#0+ArokskxJ7RHKChYlF`o;E045!o7H(71f850BO^5 zw9lS!HBQlRN|zp|yhSs%*gVcBS&0bl;2zOWB>SL|GW|vQ69e5+An2rK8<2Q}uvlm@ zf6`&s;wO5BrS*IGp_fXo&$!Yq`KeBe_oaA8T)+4`vz5H2aVRddEvGrKoKxlYg@Vt< zpuxw;gp)6S2Y&jAv`#>C2;wkme1sUlgpHM$fh{p!La9dKDPxFATVVfY>SAES)cO(? zIpCkm9Cip3@KAjP3F^J6#q?pzd$kDSrpM(c>eMgZs7*{Reldv;|Cj&8OFq#EuVjiA z9VmQJ>Wju~7Hs6h!M(+o08O?)Uz;$CthV)0%LTV9*a)6goQu9Mr)d(UunsTVcn->hGXwne(mR*Eaf zNl%U{y=wYK*699CGF_~Ur)3Lh)*SDr6A}X0vusgP`>I5tyKx0FV@cf&+%q?1c7C2B4h$!dgUU6P#^c zwLUVuJ4#mE+X1uN@r^ysI%O53>dBZI*e`qIjVI0)miB%s!CXxg!>u<~* zIJeB4qwK5XRR4YoG}=z6W?LsI*`meNGljG4`Vme7KgD?u1#+L-^;%U2H9XIA|EN4QQokKr z|IXC9+F$4B=LK1Me`@7V)7|w!>rsb6tC1p|yd)W9&#a8yTC2>8QaD~~Sl3Nd zS@uhtVkj*5xEqWZ6&zz|1$v_Xl6`D;)JQ;@=`oU#QI6>#pC_DCCa3-jH={E&6WQs5 zr3__O=MUyKc@_%@+n9+%C5@bpXcujt3SSz}t;*2O@>AH5C^9|x;SZ_B|7nCUR}~6{ z3odw3{g$s-o`F6u(V=uHaKq>bmzEA`aN<({(kG^Lm!cfwrk5q9^~M8+8y3B>2R4F# z&8jBTNzE-4ywnE$EAzZhZh|b1Te6gGh+Rz?TaIhn$BbS1))+pY&zR0a_~=iDqQ`V~ zoO)y$s=o}hM2M0EnYK0xQP=A?Awv*YtwHRNZtc+WeD3?rYRzsJvi}w3td%C@k=$^= z@0H<)K^(4k`_X18BOJ1%yflN|XU|TK;KTK3Ze)ql<(VX5qc_)yH{ta`HTwPDQPX;^ zt7zL1EK9;(GfOGhU(!|O2SE`6vnjR}XO{B|O<^V@*UWK@fUj2$I_y%6NXBmg1|qle zg&I~#>Oi7ugGgAku7lA9A#1szfi_-zCmC~wt5&$U}%CDZ2b*Ndzd1>fGGn@end);$Zyx8=L?P_2hI@^U|j6?JUV2A``3UJ?~ z>8NFWHEs3eEDOLDnbGk$oKh@T@ee0B)aPCpGu z%+;RiU4G|NNdb>gB^Q}V{Z=(`Xc}ntzOf3Nf76Ph(TTA$;wJfm5=$|MWz46#TxEPjvc=~al8=Hj$mE6Hbz{gU+0|A zk`trkFJ8Ae_Wr6@u(|^@NTkaqBPTwsq-Y)iVqeSI1R2`H;u=~46>U3iJGqG4<%M8F z_BR6_Wc~PHwI|N|AFlqfaHDl0woy29Ov%wZOkD1 zMKE=Cg%wsZ)U%uRJ%PuyRjT(%M5c{BY7ui*w3O{V?RY?MaF6lp1>^@wN9}ky4~7od z;jOBNbRgj$84op(XNyTOe%<+7YW1t4r$7&;5uJDSN~kyCj>@+XwxVs$)m!lMe0?<=_qP0k{w+|dBa1}8ATjfRhR$|1_3i`xS4HxoCtv=R^#9I5 z=Gc)0!<$lQYBBvNLtlvOjI{+1IWz}PZZyiqf5*luvwiRI6S0vjl`DdcNdDRQJ<7cvU73i7GCYnrD~?l|7D_2usnm2Q6!8 zt1X12vOvgx-M8hG(E`3*^~n7t`ro|+?>H*Qvne?!!e`Pa7kbKHTX-P#_3}z;l1nbA z8hyAu3n=yg2Fu;&6X`(xh~c-{UU?Dd9gI95vXB;D&c3YPX7ITu4jJduk#;eTTrGH8 zodJ;8^qt#MmMCf_sa4@~X$21Z2~BqQk|Fv2`;hR&^5uNqy&&rsDvWYWGe)dr}1a|YIB7im+NZV>QpOi9)K;MY2Z_wtFzZK z$GtpUd>m@`ZHx(^JDx)K5+DZoM|2Bf1birl$p@2afi*heU?zSZ;(UzonkCHm^Adj- zWG?U@aFm2O{wKDTv4AH$?JDF~0?QI2c(@cB;CqdT$ohgJYCyEmKG$S0$n@F^#2}JVv4jC+?=<*tnP7(*wSJm0d2M3lAVT=xNQUHU^ zN&4p8GD_FoaKwPkrvJ%L3Tc8z(9v1y>JxX2WjWs&N4Q>ZrN4oB;i26^w>~+~#EAfW zeb!Dflf%vDK}U%jP}6Q8a4fH4F1tyISs<`PCEP*4V6o1icyuQoCl=wv2BAui#7J)` z7gKT6z_LloKyZdkJQpFq4D|sOi`{t>>2F$*jG>St-h0NRchDx*?QZrW{WDco#UK1k ziy#7leQN``lMX}abG)q&miOPK%}@`=dJHQ)5n0ZY5V<0fzG)p|#9R(ydVCU}E|le_ zg3jt#+>n!$cS{k-y>1l#OGdMmq#W}tha0IR*>m%msX9U9tNRe1HkCv@JlW6AX`Eko zj&D_hHq*=@bxtKUVmz`m-rNOZ#Dk~EBta+Ra-Zj8)<3TQh%XO~+3gz-9U6Xu8Kz(u zzCWyBbKkQpL9zq09_Oel@Vv|IkfY=hU8)KE6-d)9(?QFF9nfqOsMK{BpBwKSyP4gD zeE#ug{HG+PE-hy~PT`WqvH1y}_A6c&nOwfeJdhLzum!b1{ zJ^MIVSV0DDlHq88^ICUx;iBWM%>-ZZrpTERmopJCHt-`wUw&s=W!~N84QKB!=t%xa z3gu*x0%;1aS`C+TF-{nx9F)3)0A6Ei!eJYt<%+JUfu-Kj~Mo`p^QRpP}>I^7Vr z-7$aG#u&6(A{tLzj$vs;5LMIh1(N8c-Z;@Qr_Y7uz|`KL4A9A^i~mos#Lh&FHOyZc zUH;O&X(p)bLoZpZt;Tnd?yeT6xbyRhi?9VTA8oIT(&+`)g)1o{CQtMb6ID#6G2hCx zt3WSeaf2Y{NrdW16=Ryiv`XM&$dy>*sEGANzGc%1;iPB6f^9haq`yN0Rzz>b;gYPrw9#0PgC0-~| z=E5{#>k^B}AI&qpOm(fGaw&R3W%=m_*~S1mx_+79-i=iBC3cDJXWe~`jDxNXP)0)HR+SzJ?m{oqp)(tJY`PSru;#OKBq zQG^xZU1}%wQlf2V?sxQIgZS#O`TfiChl+wn$^QT*Vk{RCTA`#Ye9S)qR;Pk!3|qC% zSInL{L_$Vhgy~D*Zq{TOgo*?t>wgB!iQtY0{WsoI{;A+C_KAzobl|Z5;7Ck9_OQ5h zFI>=M3GC%~+7y9@bJbeV4L5p~J#$>*(9P~g#>P=C=UX4=xLVr{HX80+%!GYs{$?Ar+og$#?V0GuCByFnH5J+r(Zlln+ZhGXs!kqetii;_`C)EA52<;Lt%1QkAC||Tj5nbk z_*V&kK?;$6uJFi^Um@bvg5e%Q9#f%Gd|G(sVYT58cX9XEb53=SqHcae_oRgJCgPUV zWm}?`h&!WG}Ud zx~Vnp1dH~+;4W$TrfDM6LX3N|MW^a# zSH!TKy{$G6;FAL-fxUE^>k!6Q3*;`%5w&osk1s(vHw9hGTq> z&~UnRsZO3ui%t$bAxE)5CsVFmCtFM!@r}6F^^5AbiMGjoX*>H?>I~-{(3aix-Yt?4 z-g{_oLwjllp|^Mm0ec!z{Uk{SQFW%1yvHh2L8;><`mt73Nlb}lA8TDK&Gc&eN?K+k zG9)%jmQ!6N617w*BPU;}6X*18vQjFuj8@7!($#~XAG>;+ZeGY0$s|9C_on=|90*}b zEFCWP(}~4;{!@(qgV`!m-m9~?5}asyrhZ3#rY6XIEuwfQZQ9FPFAo~zXPdRR)K8Q}ha1-OLQ66bw;OzUnu38B z+qJ_*Ub|uE?jpPLO_>*7Nj%$`)4k!WQZ^@vfJ?Cv}lE~w$V$G%Abw?+i~`c4f2AXlJr%(Cb( zt+Z-d7zQ-Fwz7|1l~{hume6C4(aCV+nkvsbZn-Wm9mbZ@{uhr5?FR)=s@G*W1SyW#L~gyy;OEuVIDK2w{Cc%uee)eSNOe2O75jL~q+Db3-( zfEI%?wfJmj^s?;6m$N~8ww2kYbo}96>_7jWP&Wd>7d?vw+wriu> z#F@~<1#)PZBynjAJ)7HY;J#U@#78Zh7hmVy?%s~HpRDwpPy`4$J6hcu zUB)CRUrcm3uipOl@T1G@CuKGB^!@%`vuDPQeJ5b6+U5GUcLRQy-&mlpCeP)KchfF_ z=O(AO1)qCc-cC4VClA67S5=sB)rEDfQykwFO1PEmdxcb~TzGNHZrXm#+9jcauE?9` z8@f&PzaD5W^=@d{u{#l*QDG&H$NW1N7^yk0I>PLOu(u5X?=Xx!$&v4gwOu)_cq`nQ zRZGZfmsAy_l>Pt0HAvtL&mszwQKQjbR3&EXHN*53Rs;qeU=hHjc?-wpXK@KF0e2hD zVJ|J7j!IOVxf*APebs&SNiuQwLz+eOaNPbw$MugEj>KexXZg;zFaKc;4v4C(%(jXa z;01ebqPj!FdH4Dt23sf@>DsX7zqI)^h}naFX>P?736aSrkGiCYqI?m^r2_666Pk@g zOU#2)F!je%Ptgafcxt(-)IRK??7xI0NCfm78=%<3BBs6Vitx4wJ=~U6agiJn&L6Hh z=!k7^t3X*ABIblD?oPy=4hNW0}|851)lBSX= zgTsV3(9qAmP2ZZ+T;<4Tcb(iR)mF07l=TBuG638GW~KTX{`jQ2^2C%pZ=$n<7@2UQV`h(N@v0Bv*Y2iSYfU<5O=oMG$Rw71>C9?nhVu3r&GAwtNZ` zl28;tIe7ndi|2XHKXSr9C|rOJc(1eVElMc%`Q@dOw^FZ}Rob$W)Z2D)*l~e)zFRy_ z&U%I|&CBl1L7;(`0J)ewqT9s}3aL6&IDbGF_GDPsoYOq#LaNg(R@}t^nZC303wmmS z+r7}f?Ll_JG5c;RcC=@>bMbs#x8Gx>mZmu+lUZN5O*$utKFh@LlA4}2#KqA06Y@J? z;sSHmfQ$yij!0_W!B^m7&AIRW?w!I{p>$u6=R4rk!i>3F=4X$92E7i9D5g+|O0n)j zY*A13zFTa|8Y*1)xzLzM>Zw|p;8;o?=ldFxqK=29%^kzdXpXU_ls`h~4RZkWrLi!)i^4nDkiS zrvNuS#sQUYORJdm4g9g zYlUVyeaOIrw_wED5gVeXZiB7&lTN0X_#CF&dE0$Lf7m9h6eaI}yjDe{tjfN~IHlqA;CiOv6ai8~f%H5;=;SOLdtg5- zgjrEo&V@~C@MjhIF>$JfZZ+POv#hp-XVy?!QuGFF!@d!fK_VCTWn=NI%(fymlE^Cd zhepeDJ`rd?Q!5{N5zFdv$oyjd zD{ng=9ThQQFBLeZoGULS%=D%FSLHl+f+1 z+6VJN3x>_cVE&D>53g(K445*l%6y77C@G+u@Q#2JK)OUB)kf*iR)N^@lybqiQjkuj zn&I#K#$NAur1RlMN!ZzspJZsB#}i7PE(>Ip)hdD$X!}28if;nxeX3es668gP@MLF&Y4yqmI+%ZX-tyN>oA8YeSN_+B#S6V_|x z@FIu)^<3+HXwx2x97rd?V{QyEE}@s4p^9_(g%-0n|LyBX^i+hLM$^(LztGEej}@2u z-^Y=7JzRD5z`E{+;1Kfx*lX_Fn}r5=C35O!VlovQ+=Cc&z5NrlaM9hdF%nv;6z2CR z3^1rn4p1>t>+IoA#E!^QS9xBwNFt z-ig9f-^ja~Tm^I70oQCJ8~inFfX;UYLuu3ZmG3HIX-O|3DmydbC3WG>Y-i5g7=%4z zj3K#R`L#=n;^had*&r z3v&l5tmAG)(^EikR)jFfpq!-+P77IO<-yqTmh~;4YShu!y=bXxfcPFi2UDo>bWqBH z6jjG+Nd6~$?NX(e)bf}CF|ZO-Q9xHX$7P?7GEtc2*>J5^Vw3etWW4efo>c=df*ST8 z^?(beP~oI05$%!jD7gt)%A&89HYuTj%Y(EG&4vpwrM#dv-IC|s)RDQt%jGmhT@b}{ zPPx!MaloCc=^~C|<3(C+(n$$}XBOs*pC3#}`?uw^_%|s#R<=$cJZUOeJi#DBT}+9= ztwHG1Ce_;(=946O|E6wNI7WiAfw2-_&QT@czBS!HX|B_nYzK}vM2zH}z;)w15Z*$Q zHTY$VBh<3kYQ|xKo^;O<`DeUS5DzI6}}#`M}$)!@?4W@ZZj zC2oa}t?tTxr~cPC!2QrRoXcgyk1NT0i zoRQKt@NvJcQ##(WBW$Q~dC)HSgaxn6Q{e4rl}BG~9Az0Ho%@cQl_a?sv8(-@WKJgg#Lp~G?Nl65ruRwm%!NM`k&F}`#--XkeD42)Rv z5iQbTJ$+h%J6oxB#u8TftehBfL!TfH8YvNdJ`6M4#twypAWUbFK$o|C+Nyv!?Kn4&)|gW#=L{)LU#?2OVz!Syqkiwjj+3wGhy0WI65P1EBrP5d0NfsF{HJO_+O%am`=9Bh=4GfW zL-wX_VoFvB=0(P8Z~z+)q5btkjwE39zhGFxq`4n_KXC^E$}H zZ1|p^GwEuf{Vp4XuQ5a9aR2m06PJjM$GoKS(0JRQd3|VbhxIXk76bn~!ptO}Cy73A za3DtFKvk!A>kr9N!0t}hhS#DgNImrc&M~^&3vIAd)2)N^4Pz%oEZoEPC~gJd$DT7P zuaDfgx|*9uIm33pD82w2A=9;-ns@i;5_xUnmp3Gx!TP{4{o{?|Y4kwz);6B7z`2gS zT%^l2BOU-Bb3Y=w*zNsyKLnupYkg*N$%+(~l|&H#dAZQ@>m{4cSHCo$0l#`4yRTC! z^GJKHS*D&(jA`fJp6!E1N87uRrFM%)vSU=)H;Za2?g?$pf=orbA%}c~oArhUm8+hE zv+LWJJu=sSFICP&;o0*v72Ox*(cO6esRX`-_f0qOV&M zp7oM^e)BpMdg%eGG29iM^-w9uE3s_Yipn#cTmVAD+!wAn3EZ{TgE#XX8!fx-GdJfd zx9fx$>nq!q*T>8*VeFTt6&D@E5TuAPOX5_Vp1M>wOZ3e#^e(7-zTSxQc#jnP!$+z+ zwt91+_AIckn5SD-$!8;rJI1T81C|s$RXI)^A|*pt-!*v4EX8GA^Y2X@f2XspFmDqK zeZ(=WI8s-ypW*&Lzvu)lQ9PKix)#Sv=R*C@Z}{B*FmD|FL{LqsN@UCHy63!!6ZkfY#!a-sD%A%Rd>;(m(3;b zD{@cHemtUsna8*)reEope@kR&foMM2!P3&F=PDlhCkMO!HKR$z6ORnCoiH0xG7iHe z=Bqjjs!=n?lTX$&0t+`Ck*}$A!S*k8SPl1eRa0O&k-8nQ zk_&RZn5?s=N%y*68ZXDGOA1FlJUOaBRd)Fw?UyAtK=QDBC>n|!A_|Yz#%vP+hc)crg^izC-3Hm@-JDx0jJBJK&w6#Pz;_{m9^l_=z ztE^yRe=YE9zwxeZS0zM_qCAhp{B`A&~AQ9_#W~amc&h>YX+iAN_C*-vAF;LTwaTe03kWe=TzCe z>XubfhY`v%#SgVCf4UVsAbko@T}*DK7eYBP8Ye}3v3U@lq$d(#Nr9HNOYOnN%8+_8 z<}5l!_BNgt^QTnby^BvX6@}-zDyBG^MvP?_Qu61D*S1|PX%V{jMWuEw$~rcdy>P#k zG~zZ3x(;=_+xBO*2&;|8MNkP!qbM|_`j8<0p!*3yTob4b4m8_K%QVOkm{j$N`Zdtx zU@?lFyO%d{z^{n4qO0kPDEek2*84l^BI&cS^$tFWp?)I(vjwnf5n=L}HmM}02>{(< zA18`O1jO=L**TO4++CEqR2uq(`X+M_B_?$Olq696b@5UCrJ177>?vYnvBsu9GG6;l z^1C-iug!X#Oj}vRAoSbV*}c_J&)r6rbo+elCW*E%?H?x-umN>;QB2F#8?wg^6T1v5 z7>dO*)Ghl!ZH83zvbB_T5Gmc6w>f$ue6$Q>zHp1I zxRxk}|NM-v5yT9c!j6p!*5Qtgo)jn!jYOJ09aG4gAH7kzJ-^MG3A;+lyJ~wgM&b{mzO1*tmwl6Ld&qogy129c z4QD<>cM`*uU^qRj5*D1YSyk!Mww>x@u*R~}@ax(gQ*gr074T@c-Y+gj=PSX`>L_+ z{Dz3da^KkZaJ7aI%n5N@3(zxi5@4ncFND%2GA{hl;vF}bOJr(O#dWn#J2xXpSN5YC zql(3M8YOzsSr$zC)@H^<^Jx`+C4x# zp-efJE)5{&K-CMCB0<_(UM{!ZgO1XwOp;F+kHLNzxn~p!*@)nim}fyHoN_|UtJA(H zsNv!}*|F9|7QpN4KH1vJVrUa#ve0byNHvATz~JTLi|)Tt7=3|fw3aR{r(V(&d(9E3 zyZpkQR3-7>VCM(P;BE{O0q0Zi^_x>(e5(4?S@nJgi7((q2ki*?-Iow`)lcone08N? zcGfVK$k&WW2!odW;`vtf)$7zsWC=~bHak_S{wpq}3o`|;C0qO-r>;*AXA6hy`?4vf zy0_7TWd;cV#>6fNe1zfAsyhxj`RnfjYf?+6fxA&JeMqDz&mg~03azF_1Sb#ql!o!e zm`8~ApqU>_adkG2E6b#f%UGj-@N)C^pAzm<&lTe<_=o{=waD7bx3h|*nG*diT=ANM zp6SO#TKSlIsjultUyis4ue^~8rKXo4cv=-e zaNf4TG@PWK4o_l1Jr zNsGzMGq;3(pwuKge__p1+@bTF^|p_#f!BaO48E|Y#De&lKrMbl^fhrSOKUfHt8mP! zoUru!2DOrrM)iF3kv2{KnXV|iIZvw0SsK5=CGlPro@mXks(WfWXD%Ht>n@Ff&Dzbx zuPLLplZj2w+-KX6Bp2TWIwyyL3E1x@>M-DT8ltGj07KYK zpRQ>rpKBK7i#Bf%#!Hwu3NAknO=0Q3mo=7JX)>28YCX>^VuoiHvLGU(>A%;8a;J%E z={(WkW*dC`Zhzw-cz5o!uBF|}@$$kL_q%=1F>GG>wn@b$?BIMDb)BVhQ*eS34Mkm_ z`R?>x|4O_6|GMGV!zkn>a$Y@Sp_B$*(%s)jwnZd0$a9;k6rDls5Y zTK|fjz#w|Xn6kQd*8xC3F$7DEEO2Px#=;6DR;lvMhJLn^^DuG<>rrJh12k7>PiVUO z%Fvl2^{Y4H@v8I$Tf7N*c>IHjf@G=*?;Z||TJTE~oe$sn|LqoCv7#pPUbWw7Z$TJ~ zc+Az6XZ-yDl&!$}tE+V;gpRFGc+|gfk2fWVjF{}S&gq2etN~N)0c)bRHnsxaS%ing z7%SVaG=oKYr0qA}&??UE;C4Gt{yt1VPfUd_{ZX4~)DWGLp}*EZm4eP9@5 zq-ZcAb^1}6T$(MMoP%Y+_xiZ4U8HzT-lT%|KAZQysRYv3X2aKZ9GT@@iYeBJ2cV`M z@qFx#>}l@t11-EcL8SE1$XInraaYcri?64yuA^8Zz5|-X1ycv3&0)y%xq=( z&yo^$+N03_hb))!*+XpQDhw;pe;^!iXGZD&m^#mJxYqY=k1_-acJxF^_D=NP`;hFA z=#1V)bfb5MArgt6=v~NQ^g22t2@*YeA0db`y1_8KYyaLa|Ksr42adI#_1yP$o#$q~ zC3}XM6Zj>KC8t6N{~b{!!D!Hfdw7&CoZAkdC-p^@QaRY$z(}79sFgdcOj5FPCI2>2 z8tQ*-U;@32S`9t(n!<7|tnK5gJA?DsX16(qoSvFu)&5$1$XEO~lG`EO?ImyZMPJ$F zoDyBMMqs~eq3lwX%_^Kul4;P-&2m#{M`q)Z-hJb0mz-7WV;NiDc(+17i^Z?$%~grr zBo!|!=^PhpeiUIQ#JmVOF8}FZLOO|_H+wg8jx~x)*BLb;o;N#r0`rk6`%O1j1vkF@ zI>GpBK)-9gH@3$tb7)bx-j7+pftGj|+w+WCACf1m5x-OuWO}wl!W5+qE9;{^*fp~s zmkuQ5&%j1*Ht`G2OT~lD3K<_lJS}FhF%{Q1w2_rPUULD~v(*K^T6^ig*BOX8^GjdS*Pr~JY>(39rQZn@++${Uc$qu> z*=QPa@qTmzSSx7EihE^5S{OzymTO0mr+Q^EEM2fbPK$jcopztxhyG{C$t15rx~-6Hpkd{W4fY<@~RDx^9!<<623%0+sz zMddNfQ>>&udKy%sK2mBnttL&aqbiG`*d>uWO-eQRi=F?CO#wMip8@L|tC2os(iiOl zUP-#t6sXr(@Qzi8u>uHce-w~j8{kRjMw08XeD8wn6mU;FajkD_Y{oPoue~w9(v=SD={H|I)9~l-CPaT^R4mTirPf%hv$0Pu z5NA|Lqx`~s&ebxwV^cWPQnoY9UO+>r{s&_<8M^XsBGp=VHOu)%rs0>qsw8Sxm_pfC&iHWT!nj#VG~VFF%MH^E|m)6$9KNbn_@&GHj@NCY7upQo2rBSv&~VrKxmH3P^QXa8_71qfm=9n0X@y*_5Kz z?U_uwzxF1ASb}!My+wx%6VN{E1L#@7r9or#o8wKi3-lW~yj45s@J)Q$cZci4(0v!| z`7y*T@ahLwv&hxXjT8=hb=d6@LEtHHvpH{oc-RoW6r5sdBW7-T_GuoR0OzVJaIQWt zVJrd27D|E5>YObVN`6?G`G3x^DTq^mAL&ZBJas1s3|J$6fAFAFmX9u5O7f{(ll;r(llwFiZdxm&>{bKj-qf{ zQ^^*(Qi6EZqc?~|lMD8IAuTtm#=O$Le)RT_Xuu!LQWxWABZ^zvkF6%x0&j_?2;)9X zdpC^CvJ6#98@3Nrar%*F@&fh+l_JB|zWVxc(k@$TF;8UWA8^D# zFKgKgS^4omt%&g3g|w9f^Er()E`K_wbcUlU%M6b*#$@nG$Q-SZDkdsR<$*x$kGqeA zEvC{1cdIW^FWC|6(M4p>&8hp%(Vf#xU+a1#{f+W&UwwWhHQ3!!ky@3G?0%T=vT7VpX3QG z(R%NV=H0PqdZM-9AjX~EH)|?kNomZ{V0m$Bf11(dpKt4C^;#d189PKGTh&rhXkUKa za!P0WIc!05YkMBr3h)D`KsnblGu3tBcvXAGLXCBcfIN*Jw~pI27V)Fmi)kcCAnN57 zSPo6Vwv?J$&FDYp_fIfehvvFMpauR9Z%taLph4v!3b%mP2HC9HN`qt4=A5xt{a#*M zl8T;#=7r9ClrntkvI47_o(6V|G~Rb#0*#(uD(K}$A?HaGHQMDHu_=4)x>qAS3tQ05 z80rb#@FR(=>@=Hpgn^osd7VKOUia?pWu~jnNE99zaW;*fjv{Vm1b>~gi`E&;m zYDg7#r6xoHOieCz1az$NWrjywTcm-QHcG3?$vXa*w%g2Sm}OHr%)GO$D$bj(kQ8NM zTs5*TBzE20cl>I&J}9v|R*WlxW!wnTcl}>izwtkkWXI30v(9d3$kh)lT24T>3G6nC zzB#@j7R+~R{&V?#R^K@`~J+kmBb7{Vh z=<6*j@EJZs%STXMwZS3354?WEE{QRi+y`y}+?%?9~SMz4FF#Mj(2UNo0qAB=gb* zev5-;vgS|I?Lsmbr1BJrj(yS`3hn$E&~{-O*mNJ2~o}_)GI5cnkv$=qdKR$XmG%kY+lE2T{w+<&lMPYH+!S< zQeQ-c-~TGAn6V1!dJ3N1Jzs)th6&HK*;^R*X%W)-I3UMa5kHxdesUk0oIO)eT_$zH z@FA%G1(obpofY4Bh6xz80e#bDdRZREd*1JrgMZ-+b7F(3i=s+_K8dD6(C79dGJac{ zcVAm(n6F4)-%WfbhcPhs`aG@ru$C;0Ogl0_k117SeGZhKP7-*uOBuo`A0BY)n~y;W zbcq*hKn!Sns-<$9wRkLr^ckM=L(7qyLQ`RfD^Jj8>r2v-$qDr&8<&_Q>k(xkuMpXh zzXU7H2qGt=?pxtJq^Xm+6sNY$+)^<|2S)0alF2hz16+=I-D4xmC`pCuJ&UF4hAF@SBJ zCxF=Hv{m5>;!{M_VdB9KOX~A`%SR-C+wK3HjqoY}*%r3?I&AxjoU$E`Znn;;JHPhL zSd(L+n2sV+UD@vjc!f$`{zQ|1|1e*J57c$~6H6kiJ+_no&d}n-s`Yz&V3YpkV$DEg z+5@M2-^ne`E!^!mWnUo#bf%bbogi8hxHvi+CAd>TZ#uu0aIwp; zaD7+bON|QH{B5-zsLEg80wWk@{c%ff(=^Z1?^=eE=oyb?eDsq{MU0VR_#DbEljRLV z6q>^vhgh_lEXSHu$`vo2HKVqkdRt$XeY0O`csO63VBnylPvNS-viZwWGkCz=;=V{0 zcZB#~j6rRGTN6~E2YwqvEi9{y=W-T-8^q<;gnfdq>nhJ& zU)kJL;4dJA3|x}(86{5l`aEK*n=Sn3jXpl|-0D+T=>GZ3lHIPFaK4#|y$jd&osrq_ zQIo%kFWWD7Y+UKE5l*28%QZZP@ZC?L23Z67VSh}>ilEj(b=naZY0@}k#)M$QT#6Gq zcw(awEV0pq^kr#wI8MKf#6z`&c|^WutD3-Bs1-cme$vi~fc@tTQIXqFeuCd8v< ziM1~j54QaW1QZE=#_IB`tyN(d4IPeDbXFc4d0})|pHmgOek~(3Ab`J`{em*JoTivL z?p5&vV=IRNSBZus|Nc6UoB5=)@<#4)QV1f?r>9Bljxn{G7nv4W+FLt%v_55kLlJBd z=607WnYQtskq`joZkKdf6BM7wj32!NzoJRa79AGPQE*!pc{SkEKq*6_Jus2|KxpZdD^w9G zOh{6CzC`?f5FT`JO?fvH*nH^N1h1!|gZ7Hh+#}v=+5WKMqcqt1$6gq*yoDuQ*kzDe z_|JjgvzTtBx9;o;>6&@w{6kT_g%3eg?98dJQsFA)_0?I#-QsSHnjOh*3bo#7?I~k1 zM`lzISPkH3Gc6eA`_F)Qn{3`{n|3NMn2s$5^lQI+@vE(*nPE1Kd8LEt3$vt%O7gcfgEf@MOna6|QAY?U;6$F5XMv5=#!f_+ zeBeyPdbbCDQ&u?Rk!%uH3V$@RgZbb$A=2xjeL|jW@XjFC!@AwU7XF0Sb$r-u^@0;^ z2Ye+4%+-^ZxE~KR!JfunNC6@YZ2{xH5JkH5Z`k-CVNmHF*Z(?jKfr)tR@-vA zdUIU?)&C5syWMR|%(<~9A$yCh0axdThVgr|e~G-fzZQcnH-h~vdInqW2u7*pNxB$> zUaV(8KWHRSrxHjW1IeTQ8!@Nlup8o8M0t3Cfb6OI0+(~c;O5N0xxLOEJ~W@vI{G=u zH)U1m)h~G;WS(qru~pmAQUCy)Y1Z@%S8y8WCP+8^q4RkQ57?^OUl+U_Col30=NWdt z9FQ1{*Dzv3oSyEi@IT&ez6*-t1l{Uo2V8-?q@Pt>dM12QM%RPHgbN3>y98y3#--`L$SI#mXgcZI&hj>b?Cs+7B7ERZ6 zoPytrfw<3L_v-9=71!%MOMLDA()#i^p44=pH~U%QE13+=&h^e$Fy-lsUZ~VxX(7ACoR>!KP&Iv; zMiGpBt}@BY@apR|P`wfC@+MYbHSc_+t?IZ5_KhR(2w?NfNm(JRYG2?0X@vk(zX;!y2 ziNyscY`!?^SaWI4;c^kRDz+Pj{QmQ?@XKtKtuJYGMh)UcN0O)4-@DW*FqutgY#Hr=_D@ory-X0AaZtCsS@QPWPpI?yy@*8L{Jw~P z5qfaq*19BpmQR15$;mX^TaOa-@$&kh_=#x(FknbSksa`3gLx3cmz$2Pf7vsggZ0)g zZvBl_>WgRDU`t6>-u~|UuC8B^a`H|X^J3Lndms|+Hb}or`y`;Y!!r`w)4992z4q?# zi%-X9e>$z6=X{r))&!HAbad6=+)+mV;L0S*3ML;6lo*gK`JN(*5aFdi1;OWg_>-rB zP5t|q=AnN^M4B$U@te54_O7w6E9B^%o|f$0^v)aVgld4!;^~qr_Uj2Ai{KvJc~{sJI7@$4o)>EB0op z`o@KReT~7u*?j@S54}ksZ90ksTHSp_<+LKQa#}&ycsZ$ zLvSH=hu9z(eHYy;-tz2)@!m-~&6g+*TQ_v@dP#g9m91E9JSjaZ_#w&n?B@gCBqKT7 zV>uEduh&!iSLBj~Z7ek5RPjFsgHQq?94kdHN|;Bj#+irB7B@yM$2NvDu^T!`Ykl%L zO8z?44RRA3*Qrxz{TwN!BPXHnnN@7fQu7VYBVT5vd6<5$<%bpN2W!6h!dr2<8F{&< zd%9(xq?nze9$7h>6k4sFB`Nn%5V^ITRxw_thtgkHs4@7Zk@wHL?G7{5HS+$!X{YWT zH%BWh4=abtSD)sY8YYUT{G&nB`-JA#n@v<@AQ6Pyq*R+q=4lgmw?)%NNw3m_g7=UY z9M2!OggZ3KxDS`-Q0wESln3X_IHvNWeyx-`%y6psFIN-k%ldqK#6Ay@d^PHuEu#|| zX(jXqYyz@8p?076ncoJCEsQxU|1<}F5^!xT^jLCBkL-=j&_pe)ef1dXh)M=q_ZaSb z$)P6qzT&*DD5`!`M+0~_7f%MRSysH=S8~mpRhz48`cwdf=-j8Dps42Hdf$tG7+05@ z@-J>r16s(Ks}#n&>_$=B2;{DU5w78q@1uN2%6kcQRjm?BwJJ^icU< zhxSs~e683>ux8tznIICq=6;Eg<5*T1@1>d6nYFBB2IbyN$DMQ$U5i%UzN@QeS(L!Z zTWwL_2rC@3?hu63S0!#@=YwdoRa}9~o8vut!r(k^o9#b`&l2k-FN24`BRPv=Vs3L5T8SJcbg8@ z>`#|^9fe%&)7BAd3RX)&LD%n~~U0E-Jx z-crC4n!mpPB#b@R0d&}B29eLasZ&WTwqEYO@wI4_F~E^)t4D6pXV(k8r09*?*<1Sx z2RL^?xA(}co_l*rssjD2v!CIfr|BTaZ^yhzq)|a5V|9F-(lb=nfhv$%U@MkPUyrm% z7tlgUHJqsWWtLPGlhBCaOa5EP)cim)a%;}*Y38dX zY1{taPry1rD3!)s*m*$kwNT-=x(URK0xHE%3w*8sypJTe(KD*PEbim*`E!{y5=l}W z9L?f)k>r8Y7jeEM<&)qJ4b^)qsb`N4XVb-nestHK-pnllY=6Axsf%H z(th_F-T=w$M|vvwS_)Mi=S?zz5Wt{t@!5>LLMx%1_(%wo)$#*^^AkL`^Xva z79SROEhcF;y@=G9x;6G9PvH&kL=2&Hh52AFyY(7_S|^X&jL(@_Xq~|h?YQP5FnAJv zltKbk;gTuKIH@esl~TLPhC+`rR(EYN2<`r)VrT#6S=0oepK{C=^Hd|=J04LQmAn0U zw@{oQ)Aw9;G^M8VuTy^{O1d?$Y_|dC&E6jn-*$tT$n{oE>^V}7zb1`py_o4wx`*v+ zKj2tFxw$H`wHH%6i{1<&Wr}h8znjKA{4Zxe;esP>V^AHjYvwceg8c5pOV|&YR?t82 z?*=u`+iS7#I;d>b(Rlu@zxwJ_d@Xv=$Q@ODkGXUjUbY`^L|>0VB~hoDj2#)jGs8d^ z5Y}g^W>v3C^0f`likxD_zABnr5ygyi<6sv(JOuImv=;TeoXh@0L5Y4rTT4WseMfEf zgAwB3HybN1k=mo&!K#(iR-NiBhXoC9YJhCvRFBer>ecpNf6-y!8~&=r2?)U|&*cYi zzsH}XBmtS$;M#(48gE4etIR)8A`pw8&{-^aIQHc zeX%lbhV!|Ve68}~2RsO9Z=-ZQqsI5b={ln7sIn31z25K*Aq`oY^!hgqERPlQq#Ob) z#OY2f^B({M{AJqQ1!Poh@%*7?tF^qu7c@wu#_4fErV2ahdJ6T*GM4I2pktr_*>^;G#oeKrir zFK9j+h?0H;YpO5pogU`O@(?S9`K=JfHX>QgvcFvTE>-l$X4}FB3I6LJ9b76hs+yyY7ZHuBi3W>uUVEw9` z7u}exQV21W%Jyt80llXnWtbyh@;-7XO2c#Fu5yr2tbt4p(mA`LkAl}{gjT2h*JTZYwSG+W4JHt%`Xe8C98ZXG(l45Vm!K~z{ zSQ4xwv!CeA%BQzxAI-L(#Mzx|EP>rrkL@ID-X!_1HG@?uWgz^i2p_7B2Yv?)2g|{# zHI5ZytlA&dG(C*oS0)vUEWaH`zj;g1h+PYF7qfM6c^X}u8Uhl0upR{NZZf*9Q_Cg_ zO;Vmz7KK`IOZrz4g?K|oWQp%@u z!hXNro52k~yj`_^FQu@6Fu`%X8cOB5{yM!cfRY5hpd6nS-WnwID?-~ZZN?E)`^Fp8lmOv+ z_N^@d(lSHhK1yp}mc$f0qC7Xd_s{0UH-{yL(Rz5l2>Pp2QDP*A+(M7UY?)Bsttnnn z{wlFHx%~b6Ygv1iDg&f>;PIW}_(Pd^_4{iBSh}-^O<~JP`rSC>v@+)?D{<3WCOiu* z%Yq6W4tS`D@Ztg=aVpH#nFiu08EL z$fYbl<#)p-EC9oW!*1T-U@p36QpN%Uy-;!n&)Y=2e-7#hzLO8^)LX(;fbrr|0 zgRUa+L$3po38Clt`0sf(9%suJZvtj!t{cfRZ16Xr@i1Im#NzeU@l82#YxBC0ILAdC z4CpVo(Z3{QTz`hI(L^lnT?`a7sqbH?g%Wxw#dWsU&XzM$nv~B)x_wT*_W^XNl8Op7UOWp!Ql#*kO{d5_9k(0Hms1XQ%wlOGfPl9rzDojHb~QE-;(bCj;_#78jk zUYdZ?1C!*?!>bk#JLFv)g%|#P3PP!H_-GsHHb2l?G0v=BP;J^+KU`493+w$d1$%KK zC&fFP&b(uoWBcfqoM+#now=hz0~fu#C!sPvX>da;EA1CobY!NOoq2Ub>x5&td;28b zrAEs|f=6fc$bF=7?!VSQY(5%AWrET#)y`Zl(ars^BfLRlgx8FDwxJi^~?}Pm3 z#{FhC+qz#}cSIvGRhLwv$a%?sL5>VN_2TH4sl$^>REPK9Y9lIk~ z!`Mo&JCSE(x8DBxER~J)H>yF|xFo}ZeVsQ^Pkc()CBg9z9NuYG|jHJ9}@h$w8)7MaNXQ z_co3A4=H`8yFTS)F}3R%3SVv2pd889DZCdv`pk8yfl6_hPRJWVRt9G#1hLGu zLa>Je0ezmru3p^MyuJUu#j^r-|GW?QbMPMjUN; zC5MtSU$J7wwELOhFYm@IpN=mK&Ncp@s6r}@N%Qvzbl(hWNvr#53$&)TKD<^xmNoo? z(y(c6C7XDD+*+%`z7u5p?Kr|g5i3)@o1$EmRM#@?|1LD_Vv!Z%O=MMRbF{NO4%(=U z-*LDc4;Bkw_0)RfZ+3TdQ_M@=(O%lo9>3GnE#u{iC(=Q#M7f5V7s4xuC%^R$frjHX zd1+_>JLfmx^1tGDmbmuR%heHHd-(lV9PZnp%)Hy-c=#zHaNMeUvUmkGcdCs~r8aP# zsErDwI^k^-?k*71Woyaa0_BsI?*3_Yqta6)Q=#x9(~mmX~m!D zT&~=itj75ax2$v+)qbXxPpKJrE&7S7k(D8_N{4Xf*Iz@LhSEZF`vxPbA_&lKh4`lIhVA|UJ)=vU(+%hA;{~%3AXxH416z?Z4z2ns-jyJ?EGI2mBAUFrya#`F9nl zn(9o?qyiUNp)F6-z30?H%!2FJ!_?9IJl)eUUt;TRvd4&oph_N{?ld5IZmbXk@-Jkr zViW{VA*6#r`b~L1AQ4nrq|3bLZAXS?m&}UZ;kI`lY=&_RN|)pw5y}_ipb3a5Nmmf1e|6v4EEf6z3@SPYM_`0p6%iF9n)eO#WkIC`L8~e{d@=}l z6^nams9KlH!9QE~)9<9_bTINxY+|b6nrYNsTfS@LwxhmE*CF`Fw~Uj^F?OxB85Q9u ziVChsy~4ke$+>&J`=BUwRG|SE1et|ifqjQO4nej1!eo{Ej$KCv_LD8b4_v}*!q&b% z3`?B{uqV3z!NS9o`j%P+o_bOHM3o@Pr-aY)rJ2b)gRJJ812YHKIo(eqd&tc^e+R(r zx%_$8&i5c^j!nI@WI2(#UPkbFYlk#ck}g;$tIp~69|?NKFo2A%xHi%xk+}Fzbym2+ zh`;7{jx(RO>jD{C!YrxIY2M*0cGw)eLwEa`xBR=T?6VDT;WKZWw=hVM_->E|mx#N8 zw^N!FcUhEK!mns#-R}JTb~GCq0rHeO9$~mPsnn!oT}~}Nzh}KQuzmdjq!oC>)_@8c z75z)aE&k>?!%F{gE5?-%z0|ztNi5qxx$j%xxKOm%)AQK|g;1s+CH}Mbb6;GAgRLejSHq5osc5@) z{*giG`WvVD!BNF&Zgs-d8XbV14wIb#j>F0Pkb^z^A0-<%x`TmIa`TH*d`W z`P3=8Hzn=xWeDxHS5NNsz(VLX?U49$>iBw}2pdt)XTYuQMTrB(C2~qXNaHcJR@8^v z@q(uEt}E(M34hHx+iXu<=_g}FYwUHLi z8@oQcZCf-8yFVHjrX!7SH?f7V9dPSwU!*qlDqyj+vNso%&DvF>{tO{^!FX12%_d<%@02L1+-4j9;-+_Ty(63f$ zI3d;VCyS>4&!{(I_>IR8a@jUP`P=qz4J)dDy^S2H{MPVRM<|)F|62^iG?|a@wku z*NUsn;E*)8A0o3UakJ(2BZtY&dFLFe{6;q3;h@rd&75NP=j{#6(2z&hZ#my%+bP%f zxf*Wg=F8rTXg;I*XU6^^*%Sihb;t7b^r2UqWPY%1>Ex``uZgy2gA4O-2IqZdVE8Mv zU?1&s>XK|(dfBvo=22_b8PRHs&nx9_auomD^tlg(cj9Rxp>!5{jO?9Dc$;1iaOt92 znHI?ewPlyT{gukH&m*JEg=TggGS+68(ljks2o7jX4hJf`&R_|@v@e~Hnwz(ytCf-I@(XdJ6f>L3uk#QIn8;__hq=;cVzZ-2V06L*LwYC z>PTe4_fU%MgbDd6N2JvqSA&whRY+SWX~pJeQ#*78G`nBSED`p>=f}Q8j<3^}7upb6 z$sNAU?T)#QZoOQ4)AHn@DTPjtCH{wQ74XGc~O`dlyO$O?dM7nZ_Zg0I9o|#efv79qk%IU`nJ@}W)v9+p@Z_L)wF-2A)u7E4u6BCP}`Zu*9UdMK&%zLnzk{Fc_qihqx=+lrN)3WzWW1djGP4sKtG64CwP@o&R zY{|ATwks8>Nh6wEh)@-yo*_dw&Tyfgk9gMzYiy*OJnIH);<|Z$1THUN@5#xqnfN{T`@~@?|!1?!a)n60bO`4X@(R8NPWfnyv1dy-@gCrAcqa!+?1O*lWfeKfW$>k&Eh&&ciN|fn*}Lej2ae4_n17qH zVRR`@x&nmqEq+q)t&tYkNv`DcT46W z?&soY9eckwU^Pl6Emi0ZW@rdX%IxXXR^e@^wpuA`qpnVjf^yMUmez;aPO+%)2{=dx zwZZoz4FOi=eKbz%PnyJzi1p&ea8A~W-%-UHaO6Pp@LwbVa0*vzjS_K836~YKukAJ9 zaGfX;-nDev1mTKGx7m(J?LOBc~Ea!#mDgsS!k-$Q>Ww;S(oPNSz&!tN{ls2S^_?_1}?If=p$a z3ak#uX+fznhXE~zNE4Tyd0JhQ#;pk!w95qZ=f{$FCh~z{-#xM>kO$i>4VbwevuxEl zN(=CW@(OZ*%Z~={R#wktR(E3f((aLIvIS}MbigjFql***eEwPfurqX2B4jZ?jaz^c z(;KqsxJme%Um;RoeweRC@D^$#o&M&j{)4gP!@C2%>ljsq*j3Wc)tzFZzVnq@31sUC zea!8aY$eoF*_97b6Fw!-jmC?K;@w70NaM=-$$PQtzniQP)rI9(C=p$qKV}d77-OS8 zqaRBqtcx#f=oaJ@_DYunstXkXOd!MCkwLtRXRqp%;|gvXk9^`=C=FDoK2z%+u1e@O zc?0JdfLFNww3@mU+;8&s?4&agJI5KeGSa~nb9V7gzd$%s2GVzMWOy8_Tn=~nXq{s>WF2OUxo|=`u zK=Z)DL^#7{YO|Abl!A!d|BP|?Qr}x~cRri`)+6u^Mxi!wdt7|1!m?b=Nd$KQ-xx=~ z)LGnV$Y?}1Fgq=%lL+zVAe0TL)zUXvclwxBMIomW{qYhFEhBt&zeQ?JV{h z?;)^no4y8*R)XR6mmpzQ8p8=?QPGqYaVzaqXZbpf_x+b`8#3ZZg@Zo zmWPB~Ib+C@ekRDyqSMR8LazHMu&FZ4?~{lgNL@A5aFBP!2i}CH1BO9hTL=6AK-0XH zlXfi84q&4iWE&rNN$l*;g?HfYvV2&Om%&$YznA|>%h55G z$km=(P4MhGWqIlqvX;lyEQ8$}s|K{XJV@mxK`FjeR=}a#TY-hG*V8#ay45o46jiDL z#&@*jR0S`LOrRvK+QU69Is*cuv_!hVPgM16j{`~sK?BHcMA@XW0mIWYBtde(h^^MB zwf?DN=E(WS)q*~{7+5N56&2tmUmgI~sklAmHWI{Ue9)L$yJ#O``S+oYXB3n>iNN@X zLZ?>-8BVG@V8kWcc{p5sB;*_-APY`byJY=6-o5C4D(1xx?lk4+YwgV675=HB8QE=k z>#aUb`aQ;1nkw1;{$(02t`rd$wmi-Q{K~vu<`_dxiLdZTeYGs=>~xawqqI-bV4c=m zWI3pkc7XZ)*R2fxKHsHNbfIAsYDQiXS3XfKnrf4*V=g*)@j4TT9(wk?+$>wB1-F`= ziGq&!uZxw*d_QX~Xe3DQ+Stk-u@@g1ya+sZCp86ji$q)tq201o!M6RwO5zW)agem0 zF7?S4jaTK%NgrK`Pc#TulOEL>=G(p;B>fGW#iJv4K&M$r?cWt-;MH`P=VD2G=^|D{ z(b2EyoC5~--8vtXI?2dHM)97Eyxycoe~mQRXU~ocyL5jzbv&>ZK9#|a9#aauF&iss zn;vOiDf8a9jPDHTlID6eywmsW;3~xRu~7Qybkv=2fokWG#Vi z#BGoDVp~Z%N1j^Hbh$;~-EvdBQC5UCW8W+CE^li>d}J=w1m(fx`HBH;zGFeZn5(CVNR z^g0zhFP0VZ;z!DM0=Y+LU`mM$7?tUoRUHr^Kn9|abjp4vC8J6=|LXkf!oAPK8T!a> z3uq5y0DIWeDTVo^z{Q_?#QB+dxXn#S=s|Vpf|3nUt^KS5C>!hnH@D;OP~1gnUum1) zYFx_Qc)h$SatNahw-}%QBfWu2&7P5{lG}_zMlOAHc~TIP$9iV})8?$xmycL1t}!Me zhG@lRc-X=E0NSv!b|i!sQEgd8U`6tz@d>QEJehE|Nn-;P;+722w-cSRqEh3OWX+9Z zCkzS_+i#J`fd;OXRxpZzOb1-G zwCLbGI5VB3bP^En@?>A(TwM1k8FK4GyRMtaOULz9kVqfo%^$kGm+fO9AMNyQ{E5gabpF zS{56F<13|L7$w~F)FKeqGh`4w-HNziDowp7_0W0o27x?^D-m+lbi7@-rB$o-E~YvW ztjpl>wpDoq;J8*>Hj|c4@qqX(Sl8HP0h%WaFXQ2)u1u!Upc4x`+6%d;I``Xj7?-zX znGCp`C8jyX87ArnQ^2Fx5T+(%opOl)hEYrktd^hu1^+z=wjP2y<^fBp;V*Q#)IU`H zsZ%%NiFTHos)iUt%L#)#0IwV(Me^sCViRp9>C97bxzpfAUa+Adrew3QOWpm=3==i|8hv-4G+N*FPW^Jh;Au z`^`d^6|+DOeWy6IO(Dxz?O($ft!xQ`bN&UB^JHgdlk$U3zTZH>!_44=W?yeNkz zN|moN`8`G4gU~cu zqJ8;xr3vrESh_Hr+l^C6ol6-o7)#a64YE}dHof|gbmhMj(CF`mZi3ZScL3r*fVHCw zKWb>b{V|(;;Im!~ZSIR=1k-V&K>mnR7_=N}OKJK`I_xyB`}+X}LA$_ry(+V=kndC& zM3F8&R#vg+ar@IdMpizrjM#qFD-0>a$`k&nA}xM>-N+295A#;_Sk|`H5)0u%pSB8U z8dPM3>MipXISa?ryu_@%rk}I`^hRXCo{tp1LWQA@(x>MqJ2CiPqJc&%qxJ|ilctn$ zh-QN>rcBaLyp)lm7X#vh+oZvWFNSZ`y5+dwo4Kscn(xg940rI9HYa8=Y8iJ|K%$23 zDv9zWoc|3OS;p#z#Z~?hetfG!r0K_D57dh;w^(#)A7j*3ZIgH%MAT65=ObK(o%EO$ zp7`X8@H(?ClHn%xMQ2(AP9L#&rNsCL;@M?NL%9@0V1cwM515bv^}7{+xXx-W=Yj;E z>vHgo2EaF1sif_1`zEniOxCGBcOg-$Z7P&($lc@^90A*=*3*uM6u8lyb8|cK`KzAg z?hZ6OJUaP=eiWZrH{L(k`@G%tr~iZqp?|hcI4$EqWS*`PFE(9;c+9X7nI}u5XFYUX z9wOgy6||JL&rb7zXN42AsA094V@Lnek^_=~qtMy8nzBd{6w`QNUxRT)9-;S`+>TYI zQ8q0F`^t--R+fuP$BEabjl^VMd9E|t+2vU*t3%?CsW2iQZk9y&b_ix}=T8|_0I|)i z(l-ad2cWG~Rxl(~)3-M-MNoda89i+6bmYpswu_zglsrRK1@J*ll;o2{W-@93H z6Y`QsMcj&yp|`nS1GjfQd~3DI49mOH2=RAoB`yF~h+42t>8NKzQ6jBA3tFx&VK}Fq z_fBQiTKc*cc89S0TaN5JTZrn3x+Fgo z=?vrVGFT~q(&jj_Ygl0#{I0CdCYr-vH-E0ATi*YcFk9gq%sNK` zZk{9MuQ4D0BV}B0G+$Z@NXKlM^<5XA8ghVDd-VU)i`Ij6))#8h-QbKLr!SZpUvWGN zD03!qzsg%;9<@kDdyRBNmttJn_H+xDt)>53WJp@?r&jYeKRBtdx%wg!U_&?1adZ^j zVN=!$FD%@XR&)Au;~WvGv5D)*RXBLzK=mkHQ=W`^or#}1*bX*YrXK7m76UI zghu3;W3IKS-m9OTjo$3-lTNQJomfAC6v=pNueO>h(GzVgYDsNvWQ~kob>Y|Mfid9bj!7Oy){d}xLx0ElNZwnnt(B<-hK1`oHtU(P zC2#{&kQ`d^?wa3PpR5hTt2cn-;yCq3iX+huv-#FvVI1u)zT?)MuoI{@*9k~XP*+h^ zIWlSxg_x!Og;M2`{&-iwc&||S!yUVtL#ho% zkr>+18t8`{<^^n@1~S}DGr0Sl^xJ?om!!jF>52neCY3D73jkx$>1 zq%%CZ0|SxM1)d#$iaK$QX&N_l=1dAH5;8~`MU&zYFwCrAQT?Bf z$rU(o_f@Px^tt0UsS(HrT92{MgeRAB85I0CLdu0&D_EXSW;`hL$MFF~Su0HCOJ-MH zRsMri@8W4Sgup|ac0hLhs1ysjKF-i73MLy9tCKu++}E>vS>=Pf zI>S$KY8SUwtU8X20goTu+f9??5z}!lD#03PWP}7sx$k5QLipTd@B3ux;xKY#CfJon z)YGQcP)VgcG~4KAYyT7BC?x*pOwAppTz{p;!8(LMq45og%{25*(1})}0ES+6G4xiU z1l7m65#2u1Vot>mDru21{W{h|U8J{q5mQN9`O3BI3*Oa*aMBQl4{y?PS{&>R%H1hb zmHZ;5qdu$aMlP57WQ|X>xq*!5OOq(io-8iZMJy}47Nf~;>tEt&<%EIN-2^Wm*kQ>N zV=gOq2FhpT?mbR`8+ti2tM_>(v>&veAuBR?G?-c6m~gdqIksdk&5 ztM+wKT&p3va8=*#-8XAFR+*YQ;&L7fUMqjGpRrKR?I2~xSMaTnog>wbY3wF%M{qK7 zAg2CO=2wq64jXcQVwf&!TE@4;p_6gs1<|$+*~%v$WV2Lx#zH4}S}54!-?P^4hbWRJ zaZBtn;D3cS>x)WdC+p+=(Bb9-Oz4^42^Iv$$tRFS$ME}%8OXa@RwoFc0Dr? z!zOjKmuH5QH=S+v(3{uS#{?FM8T>;Q??RaWOAo|Yf56-o+cb+ST59M1HYpx zvSKaTn}kRIr54wG;e2B|Io_7~8)RMr*Ts-$KL>be91=bpSwJla5eYNbOE8)fj%uK~ z!o7Nx03HOB^KHXnu51|$N_sD@;DoNRpIJWes1qYOQjK_xoA}kOnwX28|6~wGul9_&QA{T=D1fzrI^12xKjY@ zk<9Hy4DJvA0U?c zw1aI3oIgk4iFi^%vQuJ$m?OQoiRDBzJJ&!)BJC~I8+s%x3P2#bN)k-8i5RY7^Ly;fOg7YqE`h- z86*CdP$uZK6AJtjMa$AWXf zN=5oRiTB%Lm6R=@egjSlITjEg6IsfsTDe^xSuSdBl3QP_H}XRd62p}AR^dA_MT zIzU;1vE^nt`Tf~`<_YNlJ9cZaVePydK&D{f9U>Q0v#CJ zXgFzjcBAH^Nku}c?h$%;RwgV{ZUkC|zpM_qKNp!%RN7gmR@cY1A~bxcd!>h@Ozvx} zQri7m;ca>&3>h6+R^E8u>LP(o9nGYOmRo7og)^i9^P(4}Mlk>aPCIjPRTckM!L{80WRBDPJhZH1 zxycv^Ob@#c7!ip3u!phI&FTacSLl0mGrW~R{uZK8NI254mIa18l@zwxL2SnzY`W&d z!Czsy`en&+R`A;O>&znwdr}MQDzm@y3{*$FwjJ1FZ8*vjNK8105kFq&MxO1hQoIpe z4u>~4Q$iBqr{hQO#VGe79zKRASh1TRXLQ5mpTCSzUA4X^xrsamYzLL@I0hhlMVH&$Q*!p*x(*c3gZ@lh`^Q$6=?U`on60yw z&NrrLUNF%9^p|1kr>(?QhFfuBW1-baITTyE>j^K>B_ z`V@`g*B{Ua6r^hP%I^47%sIw;NT^IoU_k!*c=%PzrcZ}JbfUp}tyuL_o;-7WJo_?j zl}6usZK8sy5%ZaR=6GdC5Z#N}cw2%-87B&HJAUPy{nRDs)7_oxzlzRTBbnoqRwAq@ z*dc-Au&j8Ji~$nZ&)v~Qty#16Y0d8D)B7B|`lP!%W{9#DI~7W6lufR91C(|nPiyB& z%v-9Dy%MJD0Zejk?^~YkjTg<2j0u6%v`MCG8a#R=N2eo))=y7&dxp;k1l z9p{g_lax#JPC3cA*_VlPsg#kA&sp36mR^ivQ3>hqJrr{YhLu#uS!Y~7W}RN9AHMEG zbt8)(N1vE-fWc!pP7O^tD9#+9#f@^vG7<*9^S<$KvXaFg2L*6)Y$s;XfA9 zABiF0kD=~T`qYXHs;cKn=H;~6{Y7F$i5T5a90WlN{(%dEQSSKkLcSua)PpF4vIE~8 zHo2xz6+PpUqv)tA++Rm?yJX}8{kk*n^U}#ip&0-*Y-QT5X|Wns_#w4cxPwiFAtRid zEjO_N2`DOsf#h9OBlLSpq>+M-1-zBYwiepZoM=Oven*; z)}!><#18K}0&-lxRN0+vCeISuJgCE*>h}foJ_Y$+5URcYq|jhe$6Z}0g95{dVMGIK zlyUD+#CIFWP0C>tOc?+oaO>gc<*37E!))V+Js|Cd?gN`dF^-U9kfu;c5z>vM;?Qa! zx$`;~nnINujR|*P_OJIOR!8PO`b~vF%h|mx+5C@zCkQjw5(G$8Q}(D zf4i~nEUjRa4T7W_k_?A&o4Ja8i@d8~KqWpX0qt6BBcvhP}P5i(gl=$gJF z#A2c>Yj=P?re7VY2Q(0CQnCk+=5jdE=J=YNP4tUEqlKC{`d|qW-x3+$YY4q+%|$9K zfnI7h8g4#6s(Ue868YW5#C<@qXJh#)UjY$hIEuA5YFrk#yF1UQ90t)1l@FmZ*`ag* zT;85jrj3W!Q(!4P913hwpV)e7BnFy%v!}VXtNtrOb;wfo4rHrsO%w&wIW_XjVg)jA zKlx=j0KH-;&Wz776xNI~?xfNI59io?seOwBhjk+o{}l^&&JiB{@%lt~Td8|g(P}R? z!wFTv>EV)Psssf-x8=UA(LTRB&I*XaKL00=IF-IN5?`U8u{b~j>(tSEJ@>x)sYR@{ zPM8xH^#jI5d1GuL-U*^EHkan3W_{xcNWJw>R6c#8u~j~GIK*j;wG%03`ToLQKxfux z*CaPg$keoI9p*+!}6d z_T-@ll0pyOc#Fvf5n=Dng%WMw`Oivo<@9WDAYFpMj_&{;A`X8|GHcxh>Bgo>#q>LH z;;%~ytNeDhCNAG#Hr6D8N3-p0{!GkODhQt>o2@~hX=#pGPe8)yyat#P1->TEnAWDp zN>?ml!S#m(=%U7!fBaXQ{L==*xTfaX&>zYN`L=punx8%qgaSa~l{0`SU&kqdGU|oE zKw+33bC$v%_(*n%1d`L+2JFa?<@O=z?s!M-t@^=E&x+uYjbjT^l7u(uEjMCzb#}dg z8D?(Pk}o9QIykx;Y*#q8b+d#z*JXUOzj2gnakAdd+M?Vy$bv^KlwNS$)m_NgopJj5 zifzDXOtlws`CT!5*w(5P&Pyttj_ZM)3d74E#+G~ajY*wGBxZC?#dUJy%ujoS{8IwT zDFbn$@gX2BB6ms<-st09vtlvz!!C8YBEe#B;^ZaqEm42FKToV*Xo$T~7F|sFR(+;W zURxYSlR)|?zQK1ZWcQ{Z?c4n=PF&en7Y#(M{}GGnF~OoWIeyKbcOeKP^u*C5YptNw z{LU!~L(y?5GoW5+cjqyY!h>?3e71!ds|0CCKTAk z#Op()k&NJ@59FiQu~?JNmalk$JNk`Uxf;$VfLp!ak|g!0vti}eO@co3C6D!0G)pfz z1JR4FFepp~1}(XXgKBh-7Rq+YO$@DySpK;oYBqaA%p%q8q~@02xqi>tbJeClM;JbP zu$sv09H!s|>k?8TYjA%|#cOrTy!(v5Z&*^C&_msoihjB0iJccp!Z@Y}SMR2S-@X{> zLGUV47&=0VXqlCNl^7_y$o7W`5~%D_K}}Lp)nZ0W{aTWyGN1Va1GG*4#Cys%aVToE z`H!M8cqee|F5m46Qgl?zI$k^V?vddU^ad zDe4IVp~fj*^myAwyIF&!34=AiF!_lVl_I&+FoW>!$e?oTy1AI2L;B+U1J%I9F~+b5 zHo8^`aVC^*FfY8iX%AO1L_zSryTg928p=RHE?pAol}aY`5RV0T z-T#A%2H~3Owj$Qd58y}|QwRBoLx_tzSr zw6(Hc+N(1mPeRY-nw9Ek+WdD-SAi6I>JfQC=z#Rxj@oD!xq|0J!bz&#vO;xmCq?a6 zolqDW)72_j^$soW>)sJo#I*k6pI}jrdK$5;*MQENOrn=fh zF6Kz|X}K%tKK)GzWr3>J2%q0{cc&No*Zp~(6sqZX7# zpZ4J?m6Y^9@d%rO7P^_u0H%>hFW9by%TGb1UP?p`-QxCaD_m{r`>dLGz&zPe_Y9i% z0T=d?R?rVbNNH5QF_6p~@NtULO52zJi0Dr2OHM5tS=P7QZ+|2*9&&7X!kAL=^v~g@ zECnq%QTF2h&Kr4)W>3!QN8K28l>9>}yyssmcq3xyN#+HHJbzJhiRh41@?OR{L zPLs8F>Ad#88>;6bpkIwCruZLnlq$-2Fzq)90Ojd(OyTyqIASE-5=yP@Qo))?sM+90 ztV_O0&C9VGYkCFSc+U%=l$S*h#_I4U!TMm2dZ-nS@oS#$YIuZL&#X~{pQU_V>Cq@C%dW^xwG-P_M=G=n9QRmXYVHiq{6}3I%v6K z&Md|>7&QPU14Lg37*0^Xzw*aBpUsyD7)cAW2c)V<+ug2V^JWW$n;i!}Qb{b6 z8e?1ykDj`c2*h;iTDj0M!?jEqP9hQwGbxIRfBEv%ITW%HM&nd{O{8bR?Vkp?g*e+e{X^snBBEi<# zfVLW#$w`O2TxU+T<&>h?V$i8zW@=~i=!EkLRA()$)T-`4DQtfOfcGqOkkT-YA@9=|GYX^73%K){_nza#+h&ut( zemuIBY12P+kc9&e3ATxYGAGc{5`OMmVFo=hYtWYjS_7;;gTFbg?5LSXRZQE7=SgMR z;!AT{rTvp%7yWkz?y5S)Qec>7ofNZ*D6w3ZI8dATI(Pa|E!qFWRM~5VKt-YK7+9Kp zvj3MqEk*HhC2J=lK~qs!i|Le4yPGrhvXoA7Um!rgUT8sZgRhF~cb&a7Zc_D?D&^0a zh4$((b|YN#K^B!p1&(b-os;h!RP`nnzdunK&11y*2>*AaJuuiA**~%!l!<<6ICt$U zb4)UVp{KgzfvSOr$#g+6BZs?|M}06Urs{r=EVjL8(SKu;WzJ305rS>@dD^J>jNuv? zv3q#$qL#3A z*$83yDzU3$RxF^!jf3q}!NRIk94L&iEW;4aE8Rvnq$uq}-j!d%eYNP<=Y_!{uXA1d zqucXkMEvDlo{bRYUerVk>-)he_|5ElmuBQT1y2$C0(*4?sC#;{ z8HtJ3C?iv$DLI*ZZI{$@*r=kO8c;in-JluZ*s5;d1V|26Vf#fr!mw;Ksb7n+R2>7l z>?M;RohQ|D?^L1w&+G_Ljl(lj;|>|(7vprZ0lwVzVi~`wUc+>+aR*8M<|(Uyt;yPf zOh*w`nEPYRE}7yV+-Qt*ap2c2`L)1fjbr=aGk zBl9C;*I3c(Kh1hl{PQT$k2=AO@0v1Ip9-s)*fIR!LWA@ku(+*>$%H(^oXiu$#?a06 z%2jF%{As<|3$ScxfuZO*_EPY@^kiHhW%LE-6$a^WUL#Cq?i%}Tx%2-k)D8}Vi0p^= z%`=enQh^v1Fy*M^`8W^R3mg7axWtWEdCRQD@w$Ci@nZ|eVw&iC3XUmYR~C|C6y2cY zSTA_ux9%#VED#FRNm#3JA445?19A;>v%81qX*}e~?wj)yE#;w?pD+J+_Jpi1>)G)J z@2EEH_bW^*U#?xAIdlk}8*LhUK$^i=FxD>fCd6t^#;0bF=A#Y19==OQHU)zCsDvel zv7Du)P3P%`sb0gSU0L7kAjA5O-KbzWC;cMLl@%H(4!0bM>r#F6_H)6d$-mwfLU;IA zXU9a|Nsd84uK5ppK6w*W=<5SXWXs&&yAfvgsHG`*fE(A?rt8KM$V3C)-~?}!>-@O; z)?YPO4&Gp{C0_D+_eX=G)$+?ayr8(bN>v!7a1W5bV%Jm4<)#%@;99>`x{+nf-5u8W zG9zTs56Z5r!z@+#_wd7ylY2(OOX)mNgZ=4W0yXfk zdWqLno&C9sY@6V})E89G?e?I#WeWa~X?X^1mxu7QQ6;^)h`cH0cv!l5Qbe+}(>2F+ z#hy>r408!7Ukhs`PPFEeH=~n%GP)OLah6L9c<5)T53>ZH{w6*3K;?a(ox& zmnhGM*YqR2#@kjQuZ@L8U~M3u5&z!Tt5y-^%i}3I&i<^IvGnjTb!{ez6lb?Ob5buc zX07Q+_y)>Nr|bC;`@^c!lZo~(B8GP>EQ8{XjAC>5f}fdMH+?TWs{a}5;v4JUg;tm? z2h+>8dn522O`gMlszV+tUXn8qLFDuvhcvkq{-4<;n2I%WpM=$FwLk6F7Are?(NEmd zgi06R}X_BRx7+0z}i`Mm_`*0(|OiyCb%*>6a4XYyN znbjVXZ!Jql=EEq247Eu|zXNU66)acS>=73$@vHH)yiH6C+=5nPR%F-D&8CiL+@3f^ zq}SH;WJvKE#mG@obORax*BzjfImNH-Z})djVHa&Or8)44La{ovnCHT#wIUPZ zQl6Nv9>pN)><4LokUlhnuNAZy$L8rIuS9)!Za@`n%mZ^^ZpZ9g<@{g3js>%Ta&q#Y z)Q6c74gB;4A$Hi3&|Ix=52GCzLX3MUk*ml=F_AoZn(yVM&HYeb9D&(l?a4)>3}Ww~ zil*>IhYis>Y8aSXT^KjT<_auhc>dv|6MrDC99AyY^G0E|7Ss1Th-L=@U`Ts_XTk&j zFkHXEX1AwSbKjK9lxWcdFt7Vd?Sjt_?o@w&V@=OaGIS_@It8)s@Z@;?Phx)DbbOMv ztATYuK7}-WOkQ4Mx$MRtw4U-hQtHg1xx=|y+UWIM?8fxlQ5OSjgUxEM)Oi9Tjg81_ zn(j@4lWdbo5wYldl=LvOF{5F(iB31e*D)yU6n*uMW9%DqE-or}E5v&P5Ry z9ZkC~X7!FbikQWaJQjM(LsZ#Iau*AAzc*xJiaj6tk}8VdtiX&Q)bx-m#3U^O)8M=9 zl6idKFm-{VWBnGg$eMZU(HQmVBHSGlz{~uqahO@dZ_O8pn5~e6Z-Xg!hKLl)^*0Pz zfgpD@R>zYeCa_t=s!Z4b7ymB8P7gW1_4;8x`x`O3zUP7_p(uGUHbFSo>Bo1@b^KqyLg?Zvp2jzO z&H_drn4JGVarXH0qfX`j=~P3{$3s!m#Fi*ZQc`UxH6m&x*XG~f&pn;(&oz>hkfM2| z@IVZ_`9!tBtEuq08U+jEs6k~`7Qb;c$+(S4Z#nAoT_CYcC+}}#y*cJx{xf>pr^9Pc zbRzhiD-G+3(aJN^x=*;6Yd*PS(t|pkM`8$ z6kA}M+Dygf%Y!#$Hcr|kEb64JeyfFn!_4t)j_~S8NF?lDcSk*u5{1%}wTiaomSbO{ ztS{(upy&Bp1!B$lQmyOd<1i`>r@)Iv3+ncK&foJcNp8WPyAALouM`$DQXIxruvTd*&sx@HrVWLGaI*YfA&ZiR-JmNv%= zyzRCEziN7onXfX|&WT0e<6(Gt)g!@IOjF|BHr?|jy)^E9e?uQ^eNGv4m~rFcG=Z&-S_$j}PK&E`veZ>7#{WlIFxCyi~g5%n;JJf{8j zU?-ZPoG%aQl&`3{o_u5A`oNdy?Aw&fq0kM-h@n>B<7nrvf!Fy!x|-@{sJ3ULNn`2n zWDMLRVsNio2O`kuxmPaZozOqA$+CH33$GNZ!(jt!M!UTSMYoMU6pTv`@|=pAHQ$Lf z!?S)Ce%j(7T)5VvI6W%Fn?nt!8V8oTEZ%n`5%Pq(!AsN}vcXY98eolZ{cAq0LnOpp z1TtS38H_Ni@_9V9*pAEm_SI$j>?vUJr21aQrLb~Z`-4O^=LSSmpT%&XMc@RL_@s2+ z2L1@k?AY*Z{UWohzR;b@#71Vp)hg~2Vz+{X*qT}Kq$p|^f<-6T(z*7I=nod(1b63{ zAz+P1y6K7y+QG=c)Z1dau0Mr_r!>X1x{1~7XOcpSVa8E9C1jhq2vFgkoDw`ajyHiz z$=?LPGGd!xV(k29%8H;qT@VZ${Y`zS!I=!WzRXobd7xfhbnL0Pzd^g6GE;J{#hHk@ zwg!qcH)iorYX>c}KNsP;&@Sb(#;j!C2yK===d`LxC)ZD7 zl*=CXHLuk)!D;q%Y!RiqpYP~Gb}cE6hV=wM3U$^Tn`SQF06dy1=2yj{0#&R;4?n)W za}_dbeEu2ltwZ-P+ijoT_g~&$U;4kvdtZ5m20;9s&CGkWn&Qz~EjLuSK|csWR~V`i zHIjEtRd->uCFYciM2ZqxHzlE9mR{2PCz_zPR%{KAi^wT5EJAA#QS+y;OPv7q7-cH`Z()C5Ln z$iR(&w@f8SUIA{LGeyrN9PT)hKJNJ}^WLZMOth3;hac6*{oS)`OHxZ|9ZlWK24|Wa zo#%~SyHV9LTO?`E0r$yTY;s@7^eWNGz8=FoTaGdT!k)e8CRte;;0;|3)&=M!H!Mmd zq8X6$b6bQK7tA$)!s6j%_4kzcpr(nORLX9Pf`K-o{dyu8Uodo}&^$KpIZ%Ed9zZZN zW_`vUIT})Vz&pc1obt}%j;h|oxX!YLQZG$*;Pge0H5cpXzm}Lc3NOV+py{8{#X;*t z@hwn{47{nf(4cO!)V%5kBFfgHrcdjX45lcyJ8|pZK21_yrQ;!YJWj0JC_xC2c8_*b zX{tCuW%_A2c2@;R(UphGsidk$QD}xuG#LAy7V?-HaSyv)HC`I*@+~9u{9KClaeBj% z&QI{?5vJ3mk`RTOxNwmOk;SSGi(^DKeEj)Wyk+ATjs^x#C0oEmXKNgdIS#U$URub@%o`)q}{rzKZ+U2@L6}cn(zZ$_PiGI+x_d(M}f83(itcwS%~|?i;(e6mEj{XIPexIi?+W>(gXagL&QXkI5F$f3yZf3X?wuK}||$r;STu9C`s4RJrt; zcctm|ezvN@xjnXe&H?&8$a6+{^P1xB1DVZU)MPPkq&~!koYXA|b#AC&&&XlAM+r;8 zFIPR)@J@*znzMOEL+$e2qHT@l|FVi#j-|60z53J#DYR^bpJRQ`FRERiE2R5A;WP(h&MJq9-xDAo29% zEBkJZV8`ZHc8hnOFoT4Kz%@Np##MQD9Q%>>3SvakW$derI}fh5Q9H9)Ts!EX>uY=J z)K3uirZXds-Yp_MMky4^ei!ujtrUrkNrbOn?xH!oygFgh{YB%>RBjsEU*W%9VMfP< zL77vdbTY5>3jFS=qjf)28Gx~zVT_;<)ahF(Zb-YCrL`xaWxzPQnvziAQ1K7?5M{b3 z^~6dt%goE-RPh4CV!JHCT6xq|FHIb!=)Bzb4Jzay#9Lp@(i`|LiThDvP+-0l)lZt* z{cg1K6dOrHZ8X2zLQM9Qz>7$EXzQCur@6N74jZ1LjVvf62%1jaLA=YsUR42^NcKD3P7RD@5KHjK8Qr`> zDW(~N)Zgtmd(kEA6$>%WfZffkhz4aJCyl3FluyN{8K?B`05S0~-0|e9M72X+?4Mv_ zvh)j$R9U-csR{vsx%-&@+rK1;D%a)Gp)b60M}6%ezIUmOt^LXQ*7TIkp048VrR}!z zYw4b?)8?cVJsrCw#POSA4hgt$)cq!y8S;K4)$?8BNeJg*)YqFT|9-uq#dqgAn|OYk zPyfU8{)c|Ly1In*EqWzRPQK?;*VV1Ne+cSl3HE#?S|F`A8=#li(1FU+9RQ8GdQO<6 z!KJxN>5jEaY14pr|2}a(v^bM9WKjSr5xjg?Stb~-7V2}fn|ao?P>ywZ2M?N3@EvRz zU07#J(V%+jEkbg#a5=0DSfNPB9(aphsdE%*g^d#`-1r;`4j1_=NRn^BO})}skgC`At%pU z>qojwQl+`YCAZzro;-kWAN=)W(8-peT*&Fvh@$NUY_F6?LONQ1-92St!RP`$Cr$a) z?6;vA*}f;e72=@kcR?=;H_WgE05w$qxR|_IR1hYlgPy4xd$0)_m1w1Q@^1T*ocG5! z^93@vGf)Iy?q!+`*vB#Y6E$590Gf}z!d+~5s(NMOn0&sWrD||_?FphgY}hF?Y*@fu zFMaNIM#xz{5W}I9E~dBH4Aul|wGQ7j4SYHOMWP$V$96{Z6kVM{r8)UWM$|EI_4#Sj z43xEU4UB{s)i@CAL|zZuSyWSA%2ubW)H-0DH|wu+_a0FKZmUnuRfZWIGKD`gG={x= z)X`c!u6(Wu(%|IlUZ#}fU^eju15Rsu-6LJ|^{0~+A-@N>yc^C5fSt*uQk!4vT%;9a z)74#l?Z8^N$=~49uX1k^=}S$L29F_hifYu)sC5dpY6Y$ZEx$|vrD-sBoJc6dWM_)~ zq?=Ca&wmQPhr}7K{@{I1U_>({48H}TC>P=4_0taZ}#Th zh+C*!<|v@9wi1`gpy9dYFd+zEjxLFt-q288Z7lU&dy_ zP(5#(&6FxB%PBrjSX{b$K4R!+q1(i1#kP`pS(O?2o(Rb$$ari1d}? zpSuNNmA(OfX!8B^xz}~6l>X$#(AuAIVZ@4LX-P&S^fuJFuk`9W=9+qPZ&7IY&_7q~ zV`2LuR|uS+mg?pse;Xj5!8wi41KO*S(wP{TOz}qdNHgy%%0u!ky*#Vw6E)$?^JoF>B?{dTAN)D^$m4c?XB`6T= z+1U_Yv&?h4fdsqxF=i(Pf8>;+IQ?_C%5nHUh+?RsLMv4Ba#y==045t{6p9=x+oEt? zk4K?+g972ttb}_(K zC(d~P1unljyb{J27oI|uIZ`nuVPkNs)=BH!GBum+igsRzijz$d*1OOB&E@|5)Vc%n z?gJ2}OSdxvqPxMDE;0)c_)MP#{GG$+7;hKG4!Gfn&H%l7a1Pu$_!AQwkNI>0FtO8r z2*eb%)z7;a@EY_Sox${JQ#yPR6B0$%$EGZ=t!v63ciH3eFQn(k1ag~vg?LYvck(kY zk7Sv3u`c8|<>NmQx#fqA+o-l!)KOd8YZhfi*O|tEiE*u6>^Zib#gHeBklpZXqjtt4v}NiV@Rn_thW#Toa@tU0D09%y)@jYZ5Z?C6 zayrvl$kz)l7!lMLYMdWD3VawY? zT@Gnh*5_oc_oWgW+DKy*Gh#%V&d`9rg&cVSyLG{%aL`hNF_>6}>KiDwzU38j6Cjxx`Hegu( zP0Oc%R#jt!m0_ONMDu49ex!2Dfiq2XxpXEf%eE8PWKnTd!?DINT9~7P|$ro7muG8;ZK!H{>pTlVdSd2Ya*Xfoi!&{Aw z`eSJAcCT=nGCqFS+5?-sfoiy2;qg*#q*<==#ALXsvuCkVNKZjUDdZp+wNA2wTJNcj zoD9to=E-AzhN%qGp`F&8X|*ihDsD5AHY-aFpYNwDxHApRI{R+-0Wq1!?JWwyWT8-Z zf8u@%?E7kbLKc`>o5*!{N22%F*Y#0tv zQk%CZJh;T>wg+7X?CSW3Mcrm8YD_r#q(ju|#+>_hXMkzYDt<~a(oMH*vWdk(RMAMF zpE`H$pKS(dk>5I`D`fQq&^3PdtG5emxv0kZoF5T2A3ogTglO?ffnW*YMN*2q(4L}ub!L$+{?%^g1Izu^B+B>fjI9>2idv7FCLce5Xo7FH z!szJCcx__B1MzIX>CMZ}9zV*zqgp#g`E|q_uyvUY57QJ+pEP;vA8Ig8$m?~QS7AZd zF$}r^U}|24zm4KnhdXD0pE)W~zLv0%>B*_Z5Zgzz#T@jPC*dJmITd z)N!l)MC88SVgB}o;?zFpp?_k>jIs)Z<=fc4i=FVcK^Em>RFv^a+Uam56u3-rd!%-#63R29~LH;-=K3%A`ry7DplP zKA>i}j#H+ZNm)m9di=Uc)Fk56Ud8a1U_n})PC$5TxhOzN4=beorsz~A_#YlgzJYnRimRQl5Or~J@6^5L}|!Yolf~& zD$!cfzUrpK+cz8Fl8;TMS1ZTL;Ds1I?M&QYhF?U8Ns`XA_;?ZD#?1oWb|Pa;cR9z)8FE0q%>~{2&dUwm z`x48tZvf;cb(wn76j?m|24Ss@5LTTeFOS0*n6;=uG;cswqa;WX96sGZ=i8weiyH(CFNfFXB+SpuKeY?bp~?~7MppkYz1`1p3zh^# zqudSjkbacgX9hITSuS+XlG2_cy#5jfejh;G`^34!_Vsdh`)q4rl~tEr4%MkJ_mHv6 zLFrXXq5kAbPtrRflak(OUg(C3z-dEG3w0#HAQp&*4USA89r59;AniAsnT{XV#len$vX1yj7AGYF`_;Fv-AMv%SjbH-Foz?(ld)(%rWm?7@)5@P|$_ zTPi^!%HZ?~*R1K~n=S%Lg;wGC_cxkk!IX2SYX+C9$BBQh@KO3_|@l1IC7^Ti8YOaZXzb{Y- zXIa~ZMyBob0ZqVq#2T457@XcuEi_tD$@c}V&KqLOQusC)@0mPw&|QhX7f11P7Bt=A zzVUR|e|y;ameuj5m~m}$nOBs-i*?YkTMG;mH_a+B$TkDi!F|rb(~a`!CC44KD(-wu z__5QiXxT!RZ(8<9#q?+p{|=UU6Vsg#8I1w%6w#~LSh#xFt4Ad8zrzmBRDOh36RIv`D z38-q@`b>=9Nvn@2HgVM-gi4B17syWUdma5#Hr1Nj40<@7$mPX}@8!ARTfooS7C zp7j=wU7b)GJ~T<__)%08+4$=sc&i};O*SqgU6*+S7^$Q7ITCe$-)R6Xp*eaJ-M z?#m!whscE*EGT+g?fdn|hONm9g;AQ{S^-ZvTPYEVB~!QiFrrt0kT z#coawZH8+&5!iy9rkt~zg7Y8O0Mqonwg`5qr{DG1uQ%IoFvV+RcQZ+$(|pq9@uke6 zlfsH2LC4h6SZX0j+QM^PwZdzc#&i)|v!i2(>5_=ZUHDQ>okQlN=_kp8M`%#Asvc@u zDJ*#?vO}|v3rB-g9c_lI^vLq=iVeuPO-vnnA})aH$8?qnE4SpZR>C`yxmL*+4+f?5 zs>bTz812JybnhL7hmH;+Bx|9{L-3MGz&s;zqinbQDz~DvHGs~@jL(QlO7Hp;i}91v zNz-=^j55bEQkXo3MZ=ga^*cvEgW;C=RK0-e7o#a-ENmdNM{R$y?M^*kTXOp0$v0_st3$FbF z1c(Q*?|$RvdPt?O*)*j(7;KzsPf783p@6Rv!tt!dA9a@YXA5>Tjix)>|)~` zzD{=YF9A4FkrU~((YW<3vNs~Lr;#Hg&aX#_Iz_lZ4>2UFCuL{gXg%0)93SBwjxG{< zuAl7p}vE<2I} zo76e_DO2-?8R>4J8+ysKC024lbvUQvhLTG zj`E%Yuaxm4PW$ng&7rzfJ1UG{Mi9b({mlSVX2_C|WcxZ>8oyR3PvYephEY1*MIJCh|nk1fdL*^oO5%nY)fzi zh7U}wp4=!+r;|?13Ga)6#32jKX7RAPsbupIA zq!)6nq*lEb}3)`g(?(cy_^c&M=C6WkP?)izWpC zHV}xMf?~LXp%(kpM}QF*lWnG&3{+D!>lG=GEMtFq$jj;)G<3?kd8EUwL$)1q8C-EI z>Bm25h<%&z_259+NL_=h2&eAZBqAvKYDInSORSnJkt%TM&7PA;5q0)YY>kk=Gm8PO zie}Thk-Sx4TA*^i6Uke5BxX|VI*$5dn2HTkq!8NLBK5Xao1(Ri)B<5IAp?lx*&drR z!xS0et(o+I>p-HS*yn$aG>(v}?Y{6q;cLa5zi%Yi+E|(>`bxW~4r<2dcGSW6{tTG6 zl$Kb=%MRc=^Ej!ek04K9o!(9PG3hP-Y$Q3usCA&Sn8kE*>?60cGAr`=pUINy-n8YV zROdep_;VUOuHJ0AIWvG(KL#@PER#OqyE2xJK?ph0=@i#_oY#cu?tsbx+XqW7&B*#i| z-#lFFJ~8)Q5s?!TdAhbs<}}=XO!sSR^d`v2A~huaaA1rk%gw#gW{?;^_q%V2f6*V=$lg`=Iy?s-&T<(l!mge||*|jTi&)>tn=y ziCm^-8u#PDPXD44+4=awz38v;KYaXpB(HfhK&g>^_cio`KEOWmYX=a38U{R$DX$ZA z@cdz2@=u6F)}I4n(<4(73&&Z4jE&w`u0PEUHu+M$C&GO#aUk&q+iWuickkm57%$P` zyu*c9XuV;O<>T@WGulbI!V|9e*|T7kMjTF;1AJ?cXa4Xh`*jpK;0spX*2tRT)6k(K#bLJ_}t9AeV&w9UR45aV2zE65CH*N3+no&O)A-oq`) z{ty2K2`x1BzSG=d--e===E_`P%W^BYQ*4-flq*FPH1ob&T50BhodAF9-__KL?zn8UbRt3+;c!W zo$`+y&~1cGj1Q03+yN;=Ou-I;pvL&ZhHf9P^AAe%eR1g^`zc%i?d*l`sA1==03?5f zl~8D3VoA%cT*`4|%+ZS>W_KQ;lP-ai4}B8?0zX_c*cHcvJ4enXE$ynY-J<5cMz&A3 zc>AG2y2rNZ6ugZK50xg6{R!mz)LXq;0ze?;$dUl2*M)T(`SSph-7FFC8stt()9hD) zfMUI{lkma3^AXL9OFe&HcFf-5Zfx%*cqxm*Pv?sjPjggMF}PRTNr{tuQQ)vpI9(lm zbN_-+c~Y{NlTBXL%JG&BC%F(^#^Eq`L2`FP0Pu@zmkT2&0Om*X7TK zRyqB1?yVQx29$hL{P*9gB0->Q%o2`o;sSiZ@B1v+YHMXdI7BqyX8S>Hx^_OW6EnNj z#e}>D7jk@9BrJxCUZ*x!nsCjTEJ!$pO6{NdbvJ+LhC}J4{hR1|Jh47$D2c4$gkM3^~}^mSn`1bhNvUr&%sHc z|NV0z$5C^kD-;R{7W6N=DH$n&pitMvrflO?Oz#nqwI@B2ba2;`Zji*SOMgB;naRwo z1G&vJY!=;M#hFDl0vN;MIWnW{r7GlFn>KWog}cagU9!ze+UVM&c4eF`dgCRkuS#Hz z`_h||e$njxuhzSU(Av_i8`Ay!4}(utryxVGnL`iWJDYEt5mC+=r}#rR%B2YDZIY&y z@#Nz=>kAN{@r5J$(OT88=yV?J? zd*8-9iMgb!5aL>0xpi7!|AM7pa|WcyfRtSx-Pb6y>`ZT*GVM*he7OrdK2`_OZ%Z1d zJ^1GRq`Uy5_l#5 zejVP?&arMCQ>DI+4~#}~Hy7GXzwF8XqS%o4wo1KW_j2zsD)6tARq7tc*97>83ZOnX#+?Suup=Q1^JQ8)a;0$*A*qOgz)a?RE7&x`7U2j?Zz zOYv8W&T!3bLv(Seyf(|)v47t@$VYoxiy2ZO1y`gE5(|ZemiBi!p~KR%>~}YvO0>2J zT`ERoKc;=;*L;K$!V)Xp)`m3H%!xidr_F2DG$t=VsCPt2Qk5)WIKe`8HV==;Ucbu=Aa@_l2bJ$h^SuM^Po2iD9h zfd^(MfN~ zADOOR9Y*6CxVCQx_|Ezm>NVB}+&a6IDPg;A4Jp~S%M&a%utVZSoge?6&ww1mJ7;Q`6Z$a$cwX0Ke^rP=p zH>!rKO{s{RTd5)s_e&LY0`FXCrpYkSfu0qS1s6YQ69~(0KKBR>EViIFfyZjR`Cp^Y zRn+(4&6x{0;IrPi_B$5>y=tSVf1RVFq$@6|U*GAA@)vdI-vN=8Z5qNo{@Vq6@sIdD zM$(Rs=9P97Nc%{w`-&z#`YxdpemL7c`${-07d8?%JD`zHB-@8zV7c)nP&@2aOvb#t z#N{Yhw*4BIobQgo=R1KE^}#S`HY?$4ZZQTJyK;FStC^SEe>Kb#zQ?%mrruVX^_>?h z1He~iCubMANmO;19pX2|gp06Q7qd(&iAy5m+-wadHwPb~aANWdCto6==>sZ=a+Ju{K4j_Ag9* zq5r-7uj~=^RI%3rT8WkrJJ3mSDC~<{+)yq!<|7L7}g7?9#X*4ZZ(&waBW z*a~IGhlC$~;xV_JHZ@M{Fj)BP2<94VN=^QeTaJQ*+z(i{p}}NK$=M~BcfEHAWjrO7 zf!U{Wk;0jVJ%jlBO@!z4j{x5DOp9^pvxP9ISZ?Y zSWrUzmqF-<+E;^0wv6yWC)toLCb>0#ppvo>0V=&wyqDc$FAv6e1v9nJ^P{?8`K>S zbm`!L2ePFhO-RXUaQa5D502UTjJi)oNLyoB8&Z^`9^b4^n(^Gz9dqomd_T=)nkz;;h zEn-G#_PM9vw&$TG0hKVWxHdvX))SU1m>+cDqT5{b%%Dm_Av!GkH`C82xV)wKoQmA$}mej_TFK2a2>bS2CHw%<fEu^dPTF7CIGaBBO0Qe4O; z2RClK^I5EMCpl(+dGWtXK5m?UE=eq=IxPN^A39@u6zIV{)X}v?PDJHap1L(xsLU@fwKQvxOc=l{!e7w;^DA*!~Rd& zrpCj_wt4psw2iUu&etX2_or$2m3=l$N@zpH`bedQB@&os05(>=#cp+BS$dvKZu8a! znE_uE;v)iL?$V`-pX?^-LoJV#*hpUercBa$%96;2?9or>zn2P}$nMtwR3n0qQnAK| zrdL<+22hHUGF=98(Ueh4A&aL8q0@v)RE6(bxp^|-p!e2m!XY`_@aCbn+++xqqIV8E z+&i>RIl>hqLsbL6_f4~U( zcXSfu5m5i5P=N%xdMIZbi6gBjbcJ%U@`Pj3ph<7S>G7#0uS$QWaymbfaSZT|;W7Ai1@#nv#D! zo_D6_HF;O&*W!eYdRxf_yh?s8=*3Kk1Kjt*j<#NSy6;bY?*?mtI)annt9`3E+lEI$M8_@DG^$}k6L&A zo*l)UuP213VRrAmZ)HP>X`Jbwcw|~{KQAg~Ii|OaXA+qAu8YJo3HM<>KdwN(azhr> zEpQxi%+yR=iA}>DVESfszqCaP!>{CayhIQ z%d%YcMFLiC6SMq-v2O%`;5yI`2GWNX*9a6=SYtKq=3Gk+IKR6MoDbT5Dm>wkx4ccT zT?ZFKPiLLfIBc6XRQV|=v`fB6<~QWB>6gj_Tu*eaL7iwStD&L-a?;nov0x0x&+0Mi zk^3xi>A?Teq?~^+iFYw|=bs~2?_oz6VS3j7LVmIryPUvtjwbH4r8kd=vTd5#uK5x= zX;nwKZm{f#86M)jAs8Pg`?fFC}1pJ5YQ1RL%wKkV++2Imib{JE&sQDYv1&9gJ(TmeYg8 z4BnIv6`UT7$Ist+^jQV&g7QGYQBo*k6 z(EA(g?e+;{`#~rvc^|mn=k1Rqi{|ZY<;m`SW$gZ1 z<|xOuZ*4NGW7i*PsiFll0b#fR02CTjCRB(BSZg~``gUb3p{GZi-;!tB?Bhxf=lLtT zxJ>=&tgBJ%dN(9fy?&kLDj}`Vc-GS&?s_)h{_WoKN=!ioZHu{+$tZSVZ2q%-q%YNV zNX05Lcz#)%Ar_z(ev6-RYx^p(HFaPw<2316d3#pN3bVjXd&&>jDJ|WV^ajfuLb|o$s{35u@+;cftN2`& z@iI>c_K#rhCjq9g?f@DRqi|> zKl<*6eU@HJRDGE>vHxX~O)7A=o^8)*@!#bw&G8qbk9LYFR)*k*zy&;{m43Ss#GGQ8 zu~VR+Q0FJsjC1TR*#7@yorV+o_?Lsj?Nr-u`P+>edHRe#FU{fV>E5=lt-kBaGPEW_09~U3U4I`42ZgW)hWl%Ex z4-e&d+a(D44N|uGZu`8G64E&WHbZt#<4G7Yfy$(1o?18&cVMlf&_F-jAkLGT5~G=J zr+;WfsyVnKan3u>g`<;nVc?j_h2I(`hSzBkktO=|);#^3_W5u|+AmWU+ z=rfrKz~qFI4w3CE63uVg`@pr|Hek*!3g@ZO59$kAgD(+Z5pzhk#zO^nOqu?XFjtn@ zz$!!z;M_Ge;0pc1kw8ZYUceHe2=-7W*$~Ulwn6A}ai7#}4dO?O$0e%=?vKc&6*7nC zOwm*Jfdup(a|3?^tD+RWIx7YHA96ly_mv5L-eU@3Y03=RaNVEr4pAq3afJ+!8TH7k zqwptWjWq*twUC+wbsV~3{;!|V2l2(ID3D@^=puB*YGRgYulQT?s$dGKN4EJHI4rkK zcjFAmy(y0wj_utjy|dQyLl|`ELX*^1hAu5Xv&N`jwEF>tE!}O@Df)t9Mno^AdoN_l z*3o^-BE`UjLzgw2N4f@Z02x=fIM*l7Mq6{3l_l5h{je3&hL5tzYj(NA?b?3}2z9w; zskNx0CX4k*8!(v_bw~8R0j|(;o>5VF1G)wJ#~JzeJM1$ zVx_C@M&&wXhCMhSO)TCm-f3^7tcdC`MEPPls_?Tz`IKFIZkB6b*a7m{kRxjc1Wj$0 zbv)}JecDj#r?;M<>}LN=1}Y|5H#CP1IGq;`OPgs_(*u7y0+lCoFkMW>28z2JCVIy3 zgqM3b3tW;q2dwMWp%xbI1{atLF*;cnzEv2CHmvnk--;BL_9n3n-#0{_+yD2wC-^nN=lx8^8-kthO4GA@n65hS5r$4+;mxPmqj6KWbm(?K z-Lksov#7c-sjGdg+Gf2Ve`G?*b`ZRSWd{0OC#(;JK@4Qx-uDc4d(49(0~fpu98v|J z2^Pl3iF$$mdeA!yaJXvth3|AxkXkUo%K z*V070a_-@?=5NUv_~a1Ke&|=WcziK9Yg^zR-NV%7QP@}k6^~eOVK8k~vQ&!w z2dU=Y4sOnwPt4r7_@v>9rWi-qGBy3^efbVPiGC8EHB^pBK}>lA0p*UlBokeu%}_Yp zWNmLlWNEix2_DPg?_oQ{_MYxX0xMPv_C66#)x=Z#X}dLWx&O|H&1H^8Ou!~nIkuTI z+hv3IbN=%s=?+KY2~;dH;D`Rg*cFA58E{Bt?C)>p+%4IYrMh7KUc-DXO1Q0)ZD>Hp z9j=p+}ZM)up&G& zZMO&ST*M^}1*?a2shA@a2Ee({c@{&j{`j(BcJm!G){J!;m!%D5eQ!<}Yg<9bU7stPw44vcpZ}hbr z0yDlDYl)=Y`BjvhoJ&b{r}+pId6BzYWl(pBy=ni0c|++(O`XSuSQ|B5LvMfS&4AMn z=H1RINl1`XfD6KVo+~1 zJ9{s?sxC%a=@^-5>@peIx{JF**d_|Klk?3)e?Aw~?=p1A1NT(5{ps$Qp>580%m?q8 zR|FzXYp_*+e<|#Okc#I})=>oWsP~hU%it?iz^kNmoN(Ch>@NMgfcx=f3-;?>Ck2nG zl#?lX)eV@UbQV99yU1Bq2}GP(7u!5^qT+ns8!Yumx2Y@DX*D+JZAcCL`p2GuY*?{1 zlkz1i4ux0`05ctfvO(yj+?1Fo&g&K4pR7n&?wN*COa@NN+S5}+|FBWp@Lr!`Xw8z{ zArw)MBLV3%n!FBipx?%1*D$p`C6x|euYZ_pn)(79M=WKXOpU4JEDYru{v#==Bz?40 zFTuYe`Ch(SpU&zF4d)?~KexS4dJyP$0 zM@d8GZ&j;#VWz|0LT$$vbpCvd&G#QR@2nnu>X`B7F!94?1IPo;LQ8JD@^y?BItz3K zI1{hv2UPBzz374}(%Seg*#tyvHtwy@X?LWliS{)+n){p7Yj}n>UNK5N5O#E3~ikZB6{INmtGJ*KbVn_ADzZ zj;u*NtJ4kgr;ImiP2omo% zEd5P0L|y4SyRR>F%gsq*T-&DhkS=7LF!vJn56ie*y(zqKR`+moC=)smy zYe`Hy9+an?lvAPb8dj(Ubk;Rh1TiY7Y4z+=Ol;}iK|Aeqx(B~FzG*t+y!}XgEvs1& z2!1c=3`EvgnX0GAqWqus+{!%Kqd-)FSmdN?tjRCee`Up!IRAre!#1DNYn6VM#QNBK zBCu%GylZLm-iRw`)8e%;{b0$_Cu7V;Fz9BHs>7?(AZLL52U3?dgl6nypqVA$+8Tn* zBdZ~(OcrB~y=N_)I(F&+&0S6nmu(F`sUi!Kg`_P(y19x0H}V6g|N7^Uc_rzsTsPqx zs$azvVoO$KGP}{mE8qu5F^Wrfsb{!%82xwU2;uLS`MKox+v`&{T~409Vm0jR9PPdA%QcaC{RNg^`CIjiOnJcSPcao}pQ*YRU1^|b z&({eRe$lNeK11P=Ik~#l^5FU9bAu;)uIr!2e)0zYyW%i3c!_Oq-C%-vDYzNnF_mAM z*749mZLYf148F4k>=AaK14GHme?!TVkoPPO*g7YP#r-nwFpJy4SL~T3q#tNRz00c{)(s6>V;PYS{Wb7*PR!K&fyscZG-UW+ztwTDX@&C zeZS7Q|Bjne1WGPMw*Og`eciM9uDKCQg3A3bgl{k?yQU?H-I#aC)1~FXZ*t%TZel8|fK>>mr0gKnC8=VsRh{Cd!`N&LcJBLwUyzbY{wokS_~)y} z^x51BzBfG#%a=!TBKw~4Tw3v1?nw0Q{cjULeOG^zSA?>8kfI>Wu*uby5YBRl&;EtP zc}OXyVX&4LJ2seWp{*ow0(x;H;K$iod{*SZHU2e-l~};2M?>6v!wvSUhOcsZ4Kqzm zT?BL=bA!7-zrRhp!;9O?+xM1{oO7aW+a$%U*t8q$0KmeR6OFO+@WZq}a&d8+-_v97 zzK!6rwDjHo-v!2T)(g%WaxZy*a^fOX&+~X>$ zcRz9@l%N3cY>+rRU`{kX#s{Q5GEc7;Y*&6^9lQO0xy%2;3dJh!j|s#Uu){lzrc?d%g!`I{i89w^`cEWd;8|p;|h&hN|{C4M<%7Ixr(AwAYEaAE-u*M`K|9Ush!yYeSCH%D>V|a_At%&V{ zU`geR6c?aeYWXaODXTv_9$P|Y*#D8ON`0%B3p?P1C8~%H{dxrX6O;UbyKOU#XaUqtI7P283HE$xoC7hF?W2Pkl zo0rwd+uAvN>jdym9F< zODyvq2eW!M9u2frN>Udy?eE=bk$Tu3IV1lpJ_2>CP%0HnB2wqlE`J%}Q|75Qk1!yK z>;p<9yC;jIxai^f)y-06SX1Hvmsn5Ae z9Usqu8jea$8R+|YuL_AgTdu(r(r0*zj##f=8-h2-n|CP9n||!|LCZNT$U!d9ZGTg< zN+7wna9c!Yz@*D|^|L$yV?so$qC*9aycDbsa_&D?Y6OB^KPnRF$O-52Ogi-x54xt* z)#q&a+#**h&FX8+2IR1eF|U#0hR?8l^)7VZ!QM>E0kV3v&X#XmYXu~A^`qI&rJPKr zesaZibO`f0!V2O5v4+@eXXnEQoxdf&_brDQLciU zWQgqj=Go`_NDd;IN1%2nP&RTCq1Fionu;fiY zb6wrXJc@N}h7?~!BnRW>NBxuSr+{dia;QE=f;{upL&Z6>f4#^YYQ6Q(1-x`TC?PvL=^4@30iJ6FhZwi7!8mlp1Mev_i1@!Z@fwjyY~?* z>k+m7bV3cgHFaa3xch&@6h0R5Xxu9p4NDF3qwS8;+;42#6xnaS8>_X7`%DEa_;^1Ct7PCaai?_l#T)q{AzmA zkjbuE8f;9eBpBPDT^u(#Ucf6=8s+KDBQkLE0? zsgizU6d_t;>A2_9A8>$_!O)389+mEbvv)A1y9d!?jT!}JJaFOmdH1~Ji?z|K=6RDz zjMOh`-ZF-P3wQmvjJ*2JSuDaC@Q_Ihq<|k{UJ*+1o{0nKhwVj=+^AJ~6tDc77 zfL7aP$T$t~@V2+%PU9!Wy&pbeid-OVlV*E&>SMB=R^C?Ifc)kwe^d`8IvpZY2Hi_U?z z?S|HSDOTgd;0K>x$TFOX;Q&>km-TFj6rymf_}(o{UUO1xzMVbcEL~@EdiTJmEs>bX zp;$m&rS#iK>G!%`eVU#MpB(tXicTn|~19q`i=d)u|M{;5&ST19r+p2xbb_A`IM+@tb=Q`>K@dz%b?M5^4b>Wk&{8?AZF zo%e&hxYBe;$3Ur18)UhZK<00c5B___wi5+ZYxEtXGW)shXX@_ZTM$CFBu~}E6TgK- z1iJ>EU!E-_Smr|a!vBe`E63zb?uOR3LMW^pMH1kcRetqP8!Hw>t$JX7)r~t;V)bDuSd7FaL=v%+qOTy3M z$kxChVQWETZCguLe~)boF8QraAKJb$;z9`Rcot8zvx|=hlkN25{~^YGM=?Ziw!o_^ zx3jQvW`>;SH3;*Yk z^BpWY+>;a|K_-^W%B6H|f^I(rzdo8BG-UT?uK(EV;Ej(RWo4B^jE;?r2GUJH-!gZ2 zb^i6OX@Ok7#-J&djLyKhscj_hbLNfHzZ-%?W`je`U2Vg-uQH%a2cM`itkByES8Nne zR!6Lek+`H_Du;r_pY~FMck9}Afd8;%# zsH-+QoGj`OkFEw$=T(bL+?xuY)=-sZOFEmWb#Q_D<}O^ukv;fnv=o6F==71-4k~Mq zpvpOwmm2`?AZGNZ@{9TRR+?Tp@*Aw*@5^YKn>L5`zKSnlme48fxxU+TN8o7<>)BMI zF+BeTI3wVXNyhhG!{+}vlat>d}Hb~yrNqM8P+ja$RBw#V^}QkvYQ58D~d z%oYjlq*AMa(+h^SIK1L;BMpx=(9713h|$NdV4N~M-fCWN3Txu{l4dldq`g+?WV{u` zT0xZb>^(--8E6YCTU_|4<>#Pk`$_D`V%#rVe$WBeMMDfBG~(ypEDyJj;_tR@gb?ko z_|D1dcu85is~_wJVK|bP07KBpg$&-t#nre?&U1qkT^>LJ7+5#g%^VY9f7zlVbP?f{ zwnyY;46xdWfD{WGQZSLPh^1$#{e*rM%l(hEO)0M78WIjv-tUhr8`4&7lCb;hZ0Ws4 z_HO-z)7}gaM4nQkX|-<6G7fJnwgFApULno@8E3nBW{pSyy%o7MzAUx(9xL6xfuluk zChaf79Y-XxS4@cp+#_y&$!Ly_Dtd@m>go05=gYaZFUq;_+$d_&cO-v7?Z1rnQGKrq zYqwHM7QQ|feX#vLWFt{Sq;V;>5@_1a48dRdDD@Gc=D>cbAUhe3cb~$Abyulfn~lSNs!T=vXK10+r^BCS3oXwMbF{|k>MZeeQK(gya;{+$>M67 z>hvdT zryR&bJ$eXDYSKeDj@_Ac$7Ug#YZHQIk{!cS-tq?(e+ z16Pd=ZT5`DtcXnc#}Xp686&Kfk1J1{r)P4#8NdHIEqEr(%e$6~`*Q&eWtT%DRRb>r+ z4GMAMUyu*?O)Yu+4srjWV|*C;^}&OJuRqZ*;t`k7M^OfWPPYiRzt5t`_ z*!ENT>XX_@=HPT<=J&d@8w7{&l{pf~D2#5ZFrz}7&PUHl; z?FNp-tQ?e~A3zv)fEG)wOq&#^$KFx2%+Z<>620SO)=+^hcLuQ>c4On+Uzv*1&lYNz zW_W;T^0Wd{%F-vyOT50L2)$_r1kQipdl{wr#&1I2;@RizIBP$*gt@`Vp=p4NG$uY- zNqKqJ^}dOC=FWfx9tkJ{+s+L}7>b6{I!Jt)8~BBDbzU!8}LMRbfKmVFS`!k5m~x?fn+tzBta<3&#nh-S$G{9qQ&k;nD&k~Vm0n>f42b4 zt`plM?6s+(xF$=W(FK-i5;;>_E54iUy4RD_-iYutzbiX1i?(Ug0sO*k0J4>gscJvL zs_Hc%fu9qL+fSHz>FlnkL#=W=tFX-6@6w*KXsM7nP-*4OdNJyDY+)>&vTQgVqC&uo zX1~=KP{aVvLe>5!dGo-sDW`r>f(#}TEJgo?9eDavLKEQU5LEOJstP=)oO&sU8W(cZ z2CHog%0?N4S0jewRkHtP1qxW51v{fs!yS%_Rr#rnWT|Uj8E(Z9uY&) z>k1x=Y6^b7yr7om(Zai)#PX&$E0!n}(S?7_R|APlLXm)5uRzmH4#wUej_MNld^6@_ za94ShNHwfS;OmPe)lcWITVz%*E<8Tud|7v7^>|G7>wE36e;Us2WP9k(R2Ro0rzQ5o zZ6=M%*k`+J2n{o7#7Hz-K|ey50*QU&5o7x;8rk&~>9SESny)VYBjy7ZbYsW7-fAo? zwyQ!Cd3G<=``NZnS?f?sRau3o_!2>jgUP`ytS%6Bqi&n#~jq>Rv{#6;(HwL-SD(qk4+SN}l1 zc#8~#Tz+SZK&t0sOvEwmOUUT-}58sqxtgnJbg+TZeSU-dui* zX9)K*JW89SqSn8E92{ubRidEKs+dsl)n35rO9(~zDQRrZ5J>XnC&p?=BOprtLK*5I ze=n$^hRY?gj-aRt^lSC7djh4tW$=1mphfQEX~VL%yIPJYzpkmRGd>3K=*d5Sg=FH* zo~itwnkr55Ke48c&eNiq;Ml( zTF6}RiFu$*ezJj=`tHESd4YWQ^Qz$r&{J-<>yj~SR?j4Y*h5P0oFQxR}Qsa6V z0FUMfTW48EGZkE_G{wZ`m$r(>aKb#y(}Z{W4Hd)KRAMxq8ZJb2r9gPi)fDRC^tf5MI$C$a9B%3{Mp1RNWvc`_( z$gSjhNu?u?CDg++TQE&pg0HkdXMm<-v^8% zHa7$EzD=6RtA;l${P3kR)u6_S+?ED5#mKNG4AkB`l#1Hi{+=93UHE1hq`u z5*|oreBqmk*0cFS$pd>OKno8-QUmz1gRbP|hXo4eZa4k8P9h*aQtEg{fk-n6D#_248{i27f%5+r!Dg_=FtRnwFJ|x9C)04 zdHR5LGXxKqhW<8>oB1l&(T2-|d*FA|VY#e+fSmz^;WFN#`MK7Tu5kl(y@N z*eaZc)T2fKpDaTBRx%o9H>dCjjY|M{?t+2X7#Ydu8XrmO3bYeub`ptp7v^&wGXA~; zUzX|qvc*vzpy=Tu)?$cu{7>~7uURS-P1LCJTl{U!4M>&3{ZT z<=*x$bjMb0BMTl$n9rH`{&B_}pSipsP#ySe8qKLEeZmOs+!5teNoYzwf;#~CDxtsq z`^6HP4HF7eOKJ%H@_(m^?-_F4*Tn?s|0gFAWOq11lLfvdbnEzLz!v3&miVEtRcrK1 zfm^HKj<`qF&W@+raWiwoVoa8WP9ngjI{Y-SKOnZSy&J1s;Ag;=%Y|m3-Pl0k%4y1JVfh_ z$|bPJ?f?vU;)MSF#L462i`UlJLYIHZ*hTuu3Y|T8tZ%lFu zVy#ZHIu;_!{a58Dei!9!X28B-`OC^`R=MxPI#~l94H4`otS}3=B>4kgHt3C%82112 z)vi`J<#n=To-|-79d*AZkLTB+=8Du{J#T(^OH?Q{@Ro7@0uQ^il~NBe(y5IPEn5Ug zlev^ZLypv%Zo4ki8u_Zm|MY0)o9HtY3iMBe{zPL1COASne73U93(#>&t=q_Yl5gVf zGYYiuOfa|QQ%Gz>+3pj-VNRY4fZn)%l;H0{EVF*;%`8EOs2a!a+~&8+0JNQQ*8jrGA z^^D9?JZa`x9#vPcsUpk!4zj;e%h;C6%%;L2=0zAUR%~rN`meIM7lD-X8vn8J8cXmO zIm}}=)>mTI2b|`&2P@nJS`EbUN* z5N5zG%Rs3soOS7LrY2tS3E(6X)rS&`GQEOv-4LKF>n8Uu%!lYT*bEvwC@PiE-1*d=% zRIxz25smN;)m+?TcsN^7iRem`8(j-Ipn2v~^q{d@+XhfIV3e z^F#FwdRpInRS$g<+`bY(>e6DPKG_8^)(9bF%u*FaQf&{6Fx#0eN-irAIVn8kI1K(q_D$RV&06?ko-Dt z)XkVE9?KfCganL+gPmp{bOW$K*aKP{teEtw^Exfdhw2W=%6dQ2Jv4XlxT~iktQfJf=)_Z z-WrmfP|umaf)j6OZg5mmk0T)NyD0xmZvTI%I`@C3|NsAQW>zD5y>dQ8?^nefBIom_ zdLhTzCg(%R*-(-k#-^lKC0?(P^C5>BIpmo0Uy>+{?94{+gf zndf7V=ly=WU9Xb&454J9JA+>WWl&PiQqIy10%bSxK4*Ux1d8Of$@{?aq!o*|Blf0u zMf0EivCwb)bIe}OT0Y2@o1K_DMzHm;IOD1~(_)aAMf4LbMx7JnUnqpGvJF_h<$OLr zPK7U6NbgDSeb9R{AJpLIG0m9>_6u)#wf|j<2ayD0==Pp2c7`JNM9t-p2LlZttS?Ay z1oq6Fklmp@MO}UtDK|ihrphW@Lx((w2WqPVi{Mgl#c||RzmEQUk?_E|K^{M+#w)P) zvxPtTXV}b!bJCC6*wS81^YwR^*EqmX#-4D)d7I)TsaqR@@4+bC`AvT)zEt6CIQ)v= z+S3{QJ0SqsfHU1GQ6ot5^p@yn%*87PoSAR8GiIoSs$4hKfrvxGW2Lc75fuY>PVOQB!J@b(v3DR`f@$)G^fk=2*b@= zpPxS3d>_a$P!$9uqN{g;fBa0ie&m4%=GWS%aEu!_%`=T~ASf@VNupuMVPwGTA4}? zJ7R~)AAa{bc+#siY^-%KBElQlVDe&*<~FcM7PfooCl9HrFZNHE7nYlA?jenaZLD)(lazGdLjy<4A09W&Q?btl?TUPl>c`k2! z*YH-w(RBCeZ#+3uO#XSHqp#V)_t8-Uqj9%BN%)*E{rheDpDu<;<Evb9(bmiLSACc)5TSe+hCo(ZWK(@)`QhRbsH?LhV;Npnr0r+CD z`moCIgqgi?@;`|cThl8zNy7;x$pJnT*rI%ngrTnBB9#XVkDmVF8%KGv%+#nP7sN&1 zV~u%9neHxl$$j#Qj?pK4`|I04%1m!lZZ*ML-J{*ay(`}TP5k!U#!f_-uwFq-8GW*0 zxG@^Ji9xs*wzHNq6IxNrn?6&)N7!rE52~y8t%r=P9GFlL{5!Y|M2SNM5(7fuXsjaC zo^rDxm9lGaQYSXwlpB)E9m97P#QMI8tg4QTWxl}V38ZPFA1~}jF8HX!s`&=S4J3h) z%I7xe*AOj=rZ|;f9NGmAQVmaAmOts57O~Ug1-mQvFJdL4RTpBLeL3z!Kj>n_qWbRh z*dNbPi9apmC~(`|IRIYC~MhYmi5{t=z|m^^LHa z!N$qH(b`(pSF-VTNQXMAJk}_8&&u8MWeaK=> zE9OB^L-M-6$=)(y|H*)8!dnRA(_v`;yf$XgXc)h*LG{R&;O8Bmj zHE;#2)>N2z%43|5l-2?%PxTv%(U`hDn?We!E>Pc+_CAYCMHXm9^D4;p(ep9^5W&A*nNbtX?Iie?kP}7WP2<5zobs)x?RZx2A zYtp;2P(#6+>t9T;rtpQRz31oy)Z_!Ubra0N+LtC|tVV3B;eBn4dhh<#qB$O|tAiI= zopV!MDb$Z^iW-+04i#fD$qv(o3c>Ka0>ijhpu2B3 zOfCnF0&t-rI>k^t34yMZy)t3ZCS-S%#(t~#kjbgB7gASs+&%ICpZc{tTI~t>!;R$R zqhCl)>cb;Ca!(}4YwYN-`-qt!qV1a?8lJAup+D4vcF3EHpZl;t02ZsFUtThDNm=Y9iL)p4O>WcUD0bFzg8WYx!^?nF zvR#Clsup~Vh!tlc0%#NE5oLi?#INby%WIEEmF$4-fBA(ooMn|0`X`*Bgrt>SRwt&I zGb*@rT7GU*xR@jNej2v<{atQZ*VBPf&Umwc{d^U{&ns@TAwz->NNMe!ZW38u)Aat! z_0%4}t4US6dR&bP+guE>q1=Hi!o)`V7NvL5em*!%EF1lYVwq6yN*n#Q zxb$*WZf=lBj<|m3=zuv$=mK_JvzX(J_!GfWRa(jMz$frqnc=)MerNTibhR*Vgbx^# zS6zQ+xxQHDZem&9d7G}i`)}%9hnC6hfQ7h)g3^OuVb5yJt}->hz#j@I^TmuN`dHBN z3Jbl!B-I?fnjRIOOw~D;!TW^AT3{2-@deZkX12jOmwf&3!fljSZCio zm@ypl5N~3r!3=NilLUtV;_bg9PZw4-7C5!bo8I=y_V1b0l?cW~1g)$PSjH|+S$FSA zc@H$czF?ET(lNiKaOO>btk0HM_p(t^`k>A+1GSHN87?B-@&_f-b-(04S2&oN#b)z8 zxWr;n{Ecf0IYiXJ`}@^uSyC&ghTbWvTjmxp)fg7OY}7ce2bzeafnH8pbrUBGJ~@_C z1GnPIk$XymoxND)PsCBsc!e#+vgG86_g|YMgtfB|`cjMpL--2TXAPA^gginv%Z}tl z^TgkT_)gyiDM7Jh?u*Iz@*gC0NCNj|zKMNQ2>C1kxq8CPCz!$bz?M@@PLy!Y8fRxD zKH3M}&X-3IpdwI8YFWpXFy+mS#B)ge`T&DS`K^Gjw9HxVOh^hcQ!FlIJIkZRcu&&X zQ1G+fH5r*kp}cgFS3(_m_dnvHGFnc7v{L&4!5cMX-7?u(-PJkpxZ!da#10R!HT&4L z6of0>ehu-E^5QH4TMO*z3?-rz;75et#E|TE1sua{Hne^IB;@Q9DQuLQM*Ce{Omi2w z9Q-;?Dw(4G$dGS{4|p2;)SyM~_sfbDpNm*dSQtGvrE1Z&D={OYH#1tID!UG{-MlMb zKZV@ee3z`j1Jx48gqbmt`buAl7mW|PAZ^0eAlq5Z4mSmqD($-<)~u4>?|39Xm&@XN zq@q0A5#-zRx&F6jwBhuOwmUla_5&z3dMmXdxV){8NH1z2DtzF!2etZqhP&91u;F%eZ?Br&YLJq1WWFjh_hZK?f#sCE+kM3A z?cQb{81*J>&mZXZHU&?uSEcf<_aMBdL=qXwmc*Td<$l3`;NM_-C@T%e){R?1XevO$ z1_nF|uuRMgyKe}w%6bV;4hDE8D{QknHt=UggoOC{dMGOFc;oH8@J2#l4R&L}d8MEL9C>TD z?XC7V4g)ja6U5yzRR(CjhjC%p@(acLi*t@-xdMT_%(1jBe8t*W>9&lRvfdWHNz_jZjg-Xhb>E|)1;$^Gx0yOGDd znZp=%KP5OAyj@UfJ{y60!9weun1I<-L+>$6nvkz_lqQ1O^#Ui~E%OvAqK1JImBpF; z<1@7=QTj)%8ev>ECyg>kI{L59gRm<7HfNJ4cf}#nrE|(6;;J=+t`g z!7n;Ty7LcOE!2YNT45XM(8ui9HD&W_3iZ{335=nMrZ$jvG}DZuHARbNgR_oT4ab+Z zvW1DyQE`_T6vNpt9Qnf%@5A;`hnDV_V|j@zEPdz|si{tQ@IcdR@|)kh{qEt?mtudf z=LI5PZ03cnxDAfN#{`I#F9dG0b*Il4Rb5#^!Xox41@ox>#uFXmel%ox2$RIl4n^t| z@BMKv!%ht~rq87@lX=OUt_oCeNK8)GEh$Nk*UWMtBPn2Y(T!cvy z*`(1^GGX3cl)t)FSKh$=gRbtS)l-RuqK$){z6FHZQDJ@37-$$l&#Sa`0sWe4*n6s; z8NX=+CDX*-ge-vn>jsbl6?|(1(anuiMop(yfHV<~;(HGIiDS7G)i0FT40#rl$XMTi zo?(26a%09sL8;M9o~z86y}ndZ`Qm#%Yap`Lg+he4##<~{>(GQ`wS_-6gC@u+GHI2- zi@O~u!0h|A^In90gOApybcgxO!0*>#2dl*_Qr@PTuap*DGZJd2hmO=OT#0=Y&s0C? zPJIzaqWzW**AaO5KtXXQi;;#$_|AU1&ht_0zFy!eax$;ltuxxWp`K|i?dX4LRjY3R z<}^qQQNX(d3u^zlcHFhCX6u9+5}REk1!NfYUU@8o$}*t6FSF9wX@s;_yI^PVICWAg zPwpcLh{#YeM2)E;H|qbCVDCwhU<$Z=tL&ld%ui|l8wl9Lom9;R_KnDwhZO>m^7PV+ zl(Q*+bk7oMo2SSp_r=Q2X9%PxmaE3*VM>%mzBEpNkm==6OS56!%-A8GYt&=xuv<=V z^B_SWCKsBug-F@b?%D&Vump)vgC09N&c&?Hp-cvV8b6e_INFjqQgbYqled|fGX=G@ z2oAD^jQgieOJ-0n7q?Q;YEWa2hp_SOHLv=LDqrF59UdK+Qq>x3+^?y<|NEo z%S=VsuJ(9SV?DH}f~}+}v9jRziKdw3 z1Zdtsf;GbK$notbqYJ}kRDqNfe0={ zPMD?Ay`|Di1}qKivK8uvTQ|$Cn_K{#DphcA?t{Fw21Ug$-(&w&b6I@|-R7->-EH6e_fe8saTE9C#C75#_n3^+) zZWDj1MHRw%{JP*v;U~`;-(Iyc8v!{iY!v~+J0-rC4*BKXG32{|)yS=7UiEzp zw^dK&Y~d&_Xa+jGljLNI>|kemNf)&8`Zo5Sv#laWy9w90rq%S!`(+h3NSMs$2M{|_ zZP1KR9n_{oGqP~Y0oLYEX#(4m2XM(*7vsN1tOHak`Xmx`Z&>mjki<_4TnOuQPrk$o z=Q+K=<$1R4+yv%IdE%?mXRaj&$?3D}c*2_;(@eP_f!mQye)ChmWx?t2n<=$>6aA3~ zio*#tWi?G|0nv>RXI^J85ZFPWgMx*WnN%#&nw2UtWD(a7n}r|Ggvfs$8lt(D@|&gPd#Q-dqmAWEw#FgwLLp-LOOBDO%L!7F)87-z*A+ZMKEMC33=kgmLI& zKX<(GjPTVZ@^^c%5`@(O8vqYEPvW{-hR!(1HTR8|5mbk-3?!dCAi!q)k3O4*#xdl- zNO>)`?Na~ZBgdO7q0I&kO5CXwHt8Q#K*#1|*UKQ;dt*I_Dl5BlGyE4|d5lxu@HT-* zn6$~SGhe8Ph4bM9$-0cDm2dm7%Iepn-7U+gh>vXHi)13egwc$2d+-wS!Y8*Z1a9jx zK#m9EyUM9;<0d<5ur|03TGLysB3;w>5}RUU9cWl-FR1^F`unf+%*PRzMgE*`!WIhK zK^*o=bWg}m6atn$6C)#yiE@S2V^%&5z|P%2cbQCB#1O~!s=M!0>Yq5PwlPh!>Y+`` z(jpbgMLTRf;Q?09oi3;~E%nuKga-LhMv`KWMF#FZqE$o2ggx53_b>&UKUWl9`IW7Q zboGoqJ=MK6z^8L6Q7Dhk59A6`4!8PCASEzx!Og)v!k9}CjF&U8o<$m_Gfm1pPPPP2ET zid>m+0?HJR9enSmO%;2>a^y}X`e4zp!wPFpcsip>&i7``Q0&kjA}4@Q`kOukE3iEk z^r@>wS>H0r%3->917RijG_gF@c=W)8HiN#eE9eY8)s8uJZ;de|Oh5#$!Db46RE$@T zu`IlmoBAne9%`^OjvpuRRv^#SK9db5lU_OigawDtdeAkVvsbOKJunmqU+|y3yf`w$ z)^T-QIe((Vub_CTH8=wKl|l_|_ag?ta@aGg*SQ9GBscsMF__!BrBxsMQolO7WfMZ& z7PfSm6H)B#UwVBxIk<3)I{IJjG%_Rq_m}DiUH5^Y!Z~APk*L0{r%6^266OhURl zEQ;$MTIgu1xMq}t-4R(2o`251AbJJrnBtR)A^(DuuLf{=k(2X9$@b&Rdq6qLzCh(3 z{GTmIj-CBPArNWG&fU)<8)T<;dLrIe6X=m|cdBKeh_YpEcO+HRIORLeMffjHrU3Z| zOL6W`5~t>RaYpCHUqGI1WUc+7eMj1%U~jwM!n|%r@Wj7UZ`=Lw%$1`^Dg!g(`+ujr z!Ro~PUU%}*n*3qOIb?2T{kfjy1a=|MzZYh@K|1&C7to@e_*Qs0R`y{Pxd%J)-djoF z)ruU=ChX2nu;lsk_|j06#wr{2;Y)z8=hU^DS9X)#J9ofmlP@1X6@?P@W`D2plJtz; zmQX3vy_ue@-pN_`1`I8*kFO}!2!3EPx~7!vb&m6!U;O|NpM5i9FTcAm`(po(HNjSO z`q~p;l=89THhdi(AEvvs?L`YQkpt7BkLoL~n4x)%pY01sFM-$Rv3Qy_VVcjY-HK(o z(Bq5)d^CFaLlDoiH#Y59t7fVOEXbj{GP=E_pP;;Qr$A=yKkjc+J@bNeL?g9lSqlJzG7(5#r&;{rLXs z^ClwbuEksUkRQ@o+$wl9^44Nsczve``BPJ?PQ>G`jksYBXGmg2o7X@t3{0q)m9FuK zzV#-4Eh)zWB&+~Yg}x&FwWL0)`smbxye0fWA`o_==iQDN%(0wJNGH<+$IBz%OitA3 zo^XGbkr)}`Z$CCO-0ewTx?jfD?ToDId|{9D`o>|KmYH@&Z--82sNnNH+Mjs4J!BMK zQzg_sszFC&8ZLCEa@WIE>kvG?%6fAIfHyoZvJvp&_J(6Tyz^%n?SoAJ@biQK(1Vw{ ztO!4AAz=4~i>4j@_WjU6S{*&qDPw=nxJ)slez!mN&aaJk)9rWmek~k^%8|EZN!~Kg zk>Y!OVYBnEYc!#7aMyB=<*Y@56UdpHB3(!-_pKg2yzI}o!l8a1Y*C5h>O&>mJY#i} zDz-XbF)s$qf&3;T3hp{8SNv*CERnl%_Yts2iCz!kT=;kISU_ZTw`SL<`mjPol*jH! z!QTew=Bs-zn~o+>ZVe8#ZRGBz%y(EHOmfGzTJ0FEqd_p!Uq-jV%t*J0FF!f>7MN==)9Eg7T}UttHal@deHb2j$*a&n`F2ljrZ zdTrES+E!c^3ToEgaFh$s3vRzv!%?k!6K^qLe+Hjk2!56kw(!&*-PC-7HZ>XS4-?^( zdM%=To}JX{;=>rp=HDMBeqzjTK~cGdTN4A+&tEM#fm+ap!N{j=<8QJH7w&@CBsnVq3EVjn*=29TW;URotgH%Xyq-O;ByAi5-M@ef4_ad`RqbX%l; z-Pl}(%nIla4dVezKSIR3!|_;gUmy7&(BCtU{;b4aJHzq+beCxO@GIY)yb~&K8g>u`t2tV zYk+YG^N|C~t(e0V76Uce(J4(CeC0sN$F|3za#YD7wf)6xbqB9YzY!mmLHKwdd-Bfp zQNJMKuXb_Qu4L}~)P=4Ai{zTw`K++!jhg8A*J@C=|Feqa_M7r#j&AQ&Cmh&k9>lqZ z0KM3aZGaGmoaw44aJ?-*R<^2_u&p;ELA~6Yz@0yA=}k7>DOTp*Ct^_|XMO3v2zR&4 zx#zximCA?W?TkGI>Zhx=l9rHq9XsD89>%H@UKjnEjV)9QS9a%qdQzwo3!vm4wyP7m zw#5E9I*`%IxT%2nSd3Pv6wPYCz2D0I$f2;Ga2CV2zD(pm9-V?J7s-TMT~v{WDuHq| z_E3%r+SF4*Csb_<9G+KBnW7y7;;Dh0(!%GvV~UaKl=Sw#l(%Beo#Bh-By6VIZ;Z4m z$Wn4k=R$rjrNrrDUZs7Y_5PCQLQ?hp2e{|-bC0fG%{H!^{zf^)O8PpF5B?%nNLA7) zAY3J3qr*Q$2w6h&CCfZTV`&v*$g~Nq-#o)!0Z!#hVK0<{3tT|=xckulzni+u=l1FO z2E3p2pK;gM(+k))#Y_kJPLnW1(J%alBs9}vi-EYF()+a~QlsEjcJrnh6axVo)M4W9 zC?|RC>Rm2YWBb?9Q4e$VD1e-1s_=~mRTNENP$Y8Z?=sm1fT*h&nhjDUR`ybats(g_ zw4Ur0P<FwLKdFlyrK_S~Tus6BGe?cBy zN_q-ynu*w0zj;~;i2xlpr{!Xi-Z(c?t^STD&`TEg5bj90;}kegA*QBjcb%_gk)H2Z z`%IpYaxTo2G`KmI-myp2Y+h-js?zLGpNU$9;S=?`(B95V^joX)- zLa2T3#dU z2kc)_zv7#7cNwekn^Fj?hUKU@lvVR1H?V)_>XDKf>2i^l-;rY=F^KNRR-bL1JuJ5X zP?W^4cq5S^DkXlpKa$a}Gw=OBmg2d9MEbh`!E=y}P!Kx)UM7 zw0BORQtoV5oUHD=YGLWBJnSF^bTsZs)3XinW1i78MDE-7fdug2Zz1M?F}egppQUMe z%0+_M zoz_P5n?NCGLO7U)#(yc-K`oW@l@SA(T6|-E4#_no$3pPd1VdM9pn9R3-Gcf##JgX| zY#>bdqi6JVha)hW26l7c$CPMNtD1!+#mcb|DyRxIAxRW_Bvu4%UOdY^U1>*Y3)Mx6 ze{rHVx{x|Dgq0cG%*1MFoOhPxvP5t^nTfR~WraEra)yyP2S zg3;c+E;o7sUwyf#QgeT6hU0HL{k;naB2*D-uuPOnrTfZB{ndhPJK*dA?fs-DD|qIXCwLt_8OK2Y%@Ps$@b@a~XmQgw~lH6MTp(}a9I5-%?w zP`I|XB*(v2w}X@0l@tZ8*|5 z-4Jy*fx4VD=I>7z)i0>t&uqRhL>%kIhr(u<$(=(-BsHTYbmNeNXST6-4o?2=7WErY zIdv9u-H51BRh#%Vh1W|eaVU$&drP~)8&&_yJnE%(?sXp~B+nmIhuK87oz;)LeFy+Q z6GHc%G54N*<8~i$RSph!8<^ZKrb+-xLIOzb`mlCQgYI1I}3UbR(DM<6n5_>NnL?n zYqGA0e^nFKeXV$uM=X#CDzqZ5e_d9D=bSeB+O?tX9<=>Nvt2;e=ut@b`_x_S$M$ua zR`v_yMOcUl#Kmmb`R&F8q`bXZ?p1wy@Tu@hX5**G-I=aCOla85i#^>!BDSuv*E49G z4SUa@*TqurE}?2z@~Dt`>`3}|5&bg$SEt^ldR3j=B^Sn&0m}qi1iHr>2qF0Kkrf#G zPg>w-0sHTlsZ$!z3?-ZVXSL6mf8cGwiUOHdJs94^3IvdGtENOO(6%G3kR|t^))c`K zeyB}^t7*i^^v+93oioqCS5g?K9tcw5U-_#a%wm&)$Y$7&`=v#cTQ8qFil0M-yLKVa zz|sK4$eDgdjVpY!c>}zVYu}Bg1G^7jL@Wcr7!|gY3g`TMKI}9-QRN+$YzwvllZ68K zo|Z;rE%Wcp*&zkkcNXSlT?Nh#Xn_zKj{}$5Ae2_xIOm;6cc0e7yI{19{Pu~W(S*6$ z`wqUFwfP1s&kgb5Q18#%Hx`RLh-b%=Q};w}=0D8)I4`opG5j^Nlt8&Z_S?GeY`T3$ z&SKx-AHyY+^_^HMS###xzb!Fq3lUxoD`P`WEB#;pcx33*eHU8UJUPtSiRC95JzL1W%vSg%y9jYRYBk6rF%4_%rP5mOkNfygQP_>I$MQ0xYX~?7usA2!@K>CuXpExQc z&_hqfnO0NssY6}WtNWUOrNFbqe~9Nd0#!hGjC_Dp_jGPLLN6@Rp|(x9bfK1Jw`g*| z><`O~)IZmxju!oFwl%H|H8fqF$(cH4*JCYk7j&*D0QU0j&x|$Iv;jU7m5zi5W$7ir z>k@1F;L9SWWG!IWnh`V8CTz98zSb9h0Iy}DMCpKaX05J#971t;!B-yHS;O@)SoWCD z(mjASo_DN?pL!U|Z4QxRhXk=!CMER6;PTi zsD7k6?@kN9I0$sKbM=ZDE544(jqdttB`BVWKv&wohO2g~ulXviKUd z3#5pzWPlHy;gC}hv|D87IeiG^_5K2)GZG#NGiQyFtS2+J4DknxFO(xOyC*>7WvGw9 z!Cp^@$S!1+nHGxA0DQCmV(brRTEaw_@w@HGNFMp<&YBB{J6*W1l~Dec%babWGJT)W zl3tlkKKhWbRd{gvDCDAkq((YVXU$9cUe3v_2E~Fb(pUpIRNNTa4Wv#+!+#0g#05ZVX zRSLljy-~}S!LPvi_#S(JW7@~dQ<1l7x2Q^A5V-lj*tqiJL$DM3V*(0L`yLG5?Ai}G z&o|D2|JkcwD5&WN$1zES&>pvu^c&9mg2M^Lp!TST-*Io^Mac%Br^=#(9g|Nh>lBWaL&Y*7Wn|m^$h9t*p6zLfALW+lr?NL19)Yr$pO##w( zh3no+5$+a`bLW2{`1!_LLQ z>z{4gWyi#i)ueuQ1kUq9g9ZA9=(U)A_lc@OSHzF*b>(+S&CE&Yvy|~A5miU(kWc0cmm%MMg-4%Cprz*5k<9zC zH+hEuzU(SC)RymW6BW8P526T>m=;a*Tkm6@Y*4{?kUhN?OxA)1A+QSL{YlR+-OmrI zlL%I^l?9aN46U`P6|QIL^l9qXh6U6>8Pvc66m$VhL3|{X+qvwTz{(v`+Juj(Nlw?0 z>+Zy)B8KP69P$NFRxKgZPLb3=io=9XH!$-dPlQ@HJwLB)It8QvEPx|^7;`Ul-Yfp4 z{uJDl*LH=EG=qyxc#DU9rvbDj=bk%32~Dy3K_# zlp%=zP=`A<#}F^Cogp44Yev!D5Vg#IxC-fTY`Fz^7%sy~-Sqg#u`r@je2|+iAf&z^ zU@BnK$0rB2*k}YTelZ6k@6=M=F#@`5;4XgN1e>B6{{s?m;_TY?x^E3c&%drAgPaoc zgWt4Sz7rLz$7cr70>W--@g_)1xOYmcuy+1Z zi?G`iZMP9JmQtlFuAMPeuCVlP6g9xx110m(%ytE277^x)a;BxfZ5$HYs6J>@gIY*= zK?lu!m5J~h^;DzlqqxN5-;j0q*zFTtcE!t#Y<1J8B3mRwun$z&!dKB5_Rv?|+y|O@ zmpJK2fl4^(A@L^e+n=$Iuc7PjQ=JF)Ydh`ST#_GNqPMqcf7^e{g6O0mBIT0&=p}6i zH&+$3Pc{sbtFFu@b6zD-eKGh`e)94T^_tWsPRm`wU??Z&6o@gGv8*yAtNCne554Hx z{mRyCwAnA6JnAkpUKP3XyN(P0B(4*oUe>#FFZD-j%%7{S zF49D)qW`vxat*;=6dQ{9nms&b@lITwsD7EbtrC(NTr>G?lrjkrF)wH*Vhh3XT^^A7 zY^TNJKvX>D-cb)=mrP>IvBtyMUp~+Tiql)%X#Qh+b1wF1QT^Gm_{r&YcI&q#bNJ(O zAzYcZ$>&Mtzn;s7lTrQQ;VW#+s|)wXY6%|Pj7iqi@rkhgq^K0dotFBjAv?yDf13q^ z*DQL|%pWTunOQe(5EK&hqZ`j3P9EAmnPcTkTZfx@ft9B;&lVJUVhW z1+c}Ca5x}mpAAS6rv$$i=*KlJ0GMXqMVPUoEniuM|iOn5bApdEBD>Kwmx=I8)E9AiRDD;!?l#j0jzfw6am ze@Yc2AV#DyjE!k@Ey!2c7!YiYU=!hEQA(#k@PGJ9MKfzob*ak(KZ9xhFE)?)#(|0C zwW~LJ$umBkA{YER4C_Fjln{l5t%V(bmE+dKVi(-YB+qao7Pj&eGl&$z?J~PYGKx@M z1|*A(Ghm;k&T0DASIfRMR72A+Q(y`$v6xCZ1e5#3Jnd#Hg~EqSD@4g`eW2CGWmiG% z3JGlBy8{(JZ5x3PKD;8cG!FsSu-+*Su)E=t8R_8bLMZr6 zcw^2bBk`h)6{5{P=#}uaA;@>V#NQDwhSPtK46G;lb3P>+k>#XpTPx z;q(uXXK^x$hZ8DOo&_Sha=`^mCjUo{D`a8YAL-TpGh@l*d1A`e0l!A#qt}CH#IvN8 zvV+C-KkPt7Nyg~kWKV!HkTJM!t%kI|1ytlUaot0#jruxad0+(j) zslv`*ZSp4p|1ou(t(mO>h&#}dN7gJDfuOeB!?L~uw8=S7M%w#DX2jv%{zbXT=G16mG`0s-0AZ8NhDfxTwj*@+}!%FGRZ zKo6GQDEyK(a*(3&4D7lI2_aP#1)&gvH`Souj;Ra&Q@s{j$X5ocyt8Zm_!^b@x>C?s zN8NPqIb+y~E~#;i@##0eyN=i8?L8FGbZ@%+f-LB#YcwpD>g$vzP_*?QC*=H?jj~q~0~P|701MZgGI@PM*2UpOd%>we3gq?i=koy>IU= z_Io_ousyZ|%)l+{986J~Co{fl7j3PD#TIb_kkG7j3diun+&A=LG3=Ge>ybX`9*T)I z#k$rjB!Mhv;BrL$Ux@q_Rzra8tKOtjOAoay?8MMbu=?KFxJ*!O-+S4TJCR7XUYTLj zEQx1hFK1$!XZZEd^UF-Uf5=x1eVn5eUFmRrFWytqnIWwN1V)rgjD6|L-{jg|t^TTv z^IuB_Zr_SiL#UAl%L!BMb2_zCcUAp&<%D&VZMs)ZRjnJLD!m#1?v7_Bs{SAEYsfc# z@&yN&jd!c-^DK^j$v3In!jxAJWtv11_IjbV-P=ap5%&P+%8MOt?5=*K^KXAHwqgo2 z(e_{NiA;1~Q?_58#_GWf94-Kb{e20f7k#J9sY|1S)2Dtd%QV6{eQYb~myznPYi1Lt z>kEU=Cv0ce=tJM#Mu{e!$@m|jdzT3}#O9vv(w6;t*@0$uUSj|>MjRHlOnM*Hgvh=B zsYajWd*LxQa#;^rL95z6cNLy^S0@NozWkhkCRdJCIFv2^voa_)2((OBAS_us`Rfjq-Hi!a9atXPPSuD2h$$y6oBaEgGQd&UCVZEc_MpMEQn3ZqQ z_=g?u<%nT}rxdb%6Ze(~_*b;ZgC$rIUsc&Fe1wh&^O&ScJ|N@V^H$n$CCoInp)ls} z;Mx{RIpJ|Y8KCTfT0qQpD8T#p0oWboq$7D8EqslA3oDx$IeiA>?F73@P>Y3If!(nB z=b$f2RnwGDTIHrg-$EY%WLS+8Z(^A@r=@gwVNFsNcQY59q?h4x#)q!?|jNUHt^la2tf@L1}7=p@V>Eb zEyEi42kAQwXD5-`~FC;U+$)hY#f0 z0SJM@`vc`gS`jDyy-5+Nv&nU)UF0d5x8NfN4tn^C1_qzBc9$+53u3nkd!%3)W54N& z8{-#dVH)sPhDw!Ht`OUH+W23)f&jNiFh}>vchOg`HV$TC4?DdBv<4jNe!H_8-UtwX z-h5*AL%1SNM!xg_;UqqLgk5%Z7~Hej7#i3#TO4v*{h;OIP|r0m6b;017RuSsDR+bo z!p_C6j~oECaUqRXdkkfVvlCzB##9i9{sX`(dtW0|#iL5l80t)>Ytyw*qUk~%O*+(& zSYnDt=W)zkl%c$$DW7(%p;MiJbN$ncA5(b)URr4l<7H|m_H1ICB@^ot+p;e=0F#rL ziT@TcmPp25ik4_G<&Q5)x*V*~I&X-A@QcATgYtZ-`O*xnkptvsX26bS5vyp1W* zUeKbRlJw|qW6DVfNV5VF4sHYrhGnmBn%4AM9*_mUf!=bPp-kw4d@2%Hfy;wCVJlf< z-{k&>^R5}vqYCYml&Tg@hQR5dW(|1-Q)`@!Y+$^~_=6_ zcZK_RS5=x2_c&@%`s3ZgZhT$we*pLFeFA=dcerTPXjjeQsCJ;h%^;2&RU`XM)v@J2 zXybg{zKa)QJMcBHi;nx!Wn!N|hsAsE4IgbE#j(vcSgU{@@u>IPe_-MMZ?vXhmRV=| z{Cs==a*`%Y)xhSse%aHT>15Qx=cFgS+0Ro&go9q{^V`Y67q09AP}_rzx19hb(vx>X zPDrd_9)Y$>87LnaUtR%%MvnpDBt}$RpWr8eCymk|JNI&jKeLnar32K@EmQbPihPKQ z`iK)(Qhs;LR*#muaW^B79w^elL~94eEthnUOPm{NOxQF;gR~X2>FLANFN27_7IyZF zRtbH=N7+31L`!!d+W;sNaQM~DhL=J+9Y#d%@B?ByGqjApZKX-wFZB8I2`kfj$uF3^ z??Rb;WLidL6A+ylK>^9|A|*dr-|;*J#5u*ZKoJM-Q`-EvDH%r=w74Lq-P8g!{uiox zGbDYs?*2c%*G%CcV|{KyPX$rylV8xj$QBFlggb3^?2$rCA`21o9|K$ zrx;Wq(78hn{wFrg-evNf59Cde4_hH6MpN1R(0P5DQ(^S^Kz3VJHglvaP8NBqdG+59 z5xt*%$SNig%_*O|9{lv&*In8-86pL44Gaah*=0v0tjlGUr{2cj7O^H_1?~yN3k20u z(eY)A`fAVZXB)$)D?0@s?1GKVl(#=sQvt4Fo-IYMaBm0Xpr$D8w2Drg8_OfbFu8&L zKgng+=o+mT2wBGhLwrMd>*61P?(u_sfa{rE?=vI%v>j7-NKWU_y`cD&=lhnY-pbEs zdo7lw1cx_5Fa*?$!P%j#OFu{-iDOpaK|B|p$oCTECt3-nFxuWWHib>mDY)1)(Jw-( zw!gYGxNxTy0lXcqqU-_w$3&iz)r{&QUHh?S1%Y)Jfb-{QwvvHwQL) zrSOTS*88bR*p%TdB%}f|;KPpCb%uWjaPd(pP9ichuI(3!^hgh84fRz~`jrSWsAejv z$(OASwd=XEJzBeXk@PIvD4Yf^MMpCRg&#}{Nk7~DP2V;6^W;^R17(ptoOp$SnpSx; zBi%Q|H+xunp7%61y?H-UgQm7CBpy{av%<}Udm!8^zfDHbOzGnh?>S)}t;N*k8rGWs zz&3tAKiDu!OMW}8cE2U6y7@lHOfQsD$K$I&%|Dyf3TL<)j6IuZpDd8@4l>0yAxiEv z57(F;=)XSt_tLzcHXI$TI9zCWeSWN@clwmaUkvm)?tQCiqX$cc1}1sP$ok7Tme2c6 zKwK*@M6xfcF!XsN{;a!&FlR-v&DK3WJGI{TZl#yC?WA%O3Hx(m5;|1j*MmzocX)^C z)d=$JUfy)~#qgNx_m*0C``>uOwjaCxA4lgN&vg6$@g2;HqWg}d za_HM#&XH5jrjv3SCWnMc&c~cjW216cqJu+@Q_RfyEayp44v`I+!&XAZki)PUzt8>q z-vfL2xIWi)yZZ&a`)#mypk8EZ^!;KUxypIMEk4WFhk@F&MUQG5zMz0+iTuIkP+Is}TDb z;gx>#u+mx1k+h=w+SHCSQUNYcQ>FBEbM-OJ*b8L2u=Ni0BwYZYjj+%}QIknJ`?zla zg^ZUCX}~-%h-{H&{z&ZgcxoTw-ZN+m-m7lfBQ%Y+AyXODY!|KVk3r%e`MhqVE4_$i zt%r2a0vQkx5L|xvR?U}RRuwIR=2P~sK>S&(zQ9dRcn(mG73bv2g7!4?gV+!2;eSs+ zM>>i`Dtn+J{(q56w2e&8a?^^f^2Ry}J(u%*9I-;W{Wnfhx{10XX|)@f0VnE<_S<4v zS+yW-H2lR=rl=yz+m2#Ap}J-5>v}rDx&%@(9*`a^s#SqOIW|X3VB9;M9It_jdxYD< zK6G@yL!ewaBd0Gv+@+tnnBVCP(m2+CMvgXhJZR#FJHuJpDJc*f(0rK`$Asw5ZMjMC zhZp?TF|mky(;-0{ygELs5SIpHdlz0*NrnY`EZ2W&8>pcp;l4el4nXMqYwhNi#n!G% zRfTj){kDA`yE$+lB4$*K?JMfZNDXAEHBzV4;#MwKYi@tw@U|bsbOLiPD-WTll&nVzsL8i)diHr16ysF~WVYm%cwQQcbMbD*VOw zDy!Bxu2I@0zg=^zOuvP2Z0!(OmE zFy+`$@BF@c_OXink+BHAA~m$`mHsrr^avk)`%|KFJETqnaFIS=d;qQ(?E|Jf=~M4? zBr?+CEsuXDs1EL|$Bv%0rV`Kbr6b?Oby<;X2T8G@)|~CF>WwjH-n{uF9DdCTutwOb z&KgGvoU!O$0ADjm8)SGWj9>JBZCCj`>b(#)EfxQZNLG*QM|KU|y194ADCB6+g`;Nx zW@sgDqW-Y-XmNMn4E^x#Vqx-P|HuW)ItBCse+lFbdiLuetNr8#;%xs}t0MzbHBr9e zmVioh4&UtD>2Wow|}5K2ZE!?lattNwzLm@wf^c@?O&27r1L-;a)%C;W&uQnll;Hs z?D)rE`H-B}u?FpW>RAij@zTJK8)ShCkQ8uw0b2S#zW46gJ_vkn+;H(?_e9}zW2L>?viB-ArE!M5IB&dgmP3Aj_1!zOLCnprQ7onH zG{QxM2oGOrMuxT6N9n}Go%=q>{f!Axad^a8rKv4X*Z6A1tpz>mNX$iF0CYijhBr6A zScfDOf|!pe#K-*$Uo!-@a82$0?}PWJf)L$wMVmqofL={+{Y44#)f{h7*EzYkH$6js9I8Ean=kGgnn!_ zFMlS&tJr$5%Msq#u;qJ#;JyFg?AzV^@hjZjuLi|7C4ELghL;)gWjqT&uvQ=dte|4W zK%7~3I}VjdAs~91;up4s0rl)*>|WuO5AmoMHRP#nVTFuRw*&cwKY`5r{fbM&(U9U* z$DAs=CO^31K7)e&@i@$RF@FhTF#{vw{Y3_uOsXDp3ypKV<9{@8c&iw3Zvd`Zj zz9U`Nu&AiXNHZq@@>1O#AH@%87TT+o ztU>62NLP!vqG^3a;KUJwOd&<60APocHj!GYaMppjqEGbSRkOfH*!gCAN}uVkTi%}G z`3@PXiOsFs3|eWPuB*BpF9qS)H~3?c{ZszDY^y1EnD5s4y|jwrcnEFmZd|f+ZpmMW zDbeXvl&%^gRXO3eKb=j2yJJ*ukfmH4C><9$xw2A<4AFn|55H;@(bE@ruOWq%)(t%* zyUY!Xu6n~di@545L|d3~=vf{L7K)orVsTbg}>9bEbX?MtE3>MGIrUq ztATgnR}OCrpJXjfk85F2y)Cr*vfDAVv)*KHYCb9wP@h?n3Z$<}ibjW)b8{E*piY-KVh9(3m{w?S(0 zt3&G+tG~8-_u)D`m?`7J2(I5s^_PGJ1p|>cPc?jErV44hB-8}?NbM<8u@A3sFw1A0zLyhf&H2r`nTX|F4zQHYj z-dM6q$dQOtL+^F;qRtDywu>6_zp446h*OdB1j#vkpqp%_k6~g_Ax$KiYMd8ZdPKBG zIQK-P_XdCT^i{GP^!?^xvVi*F41sZ{k&j{OtP3)g;)#EUt%JSN0#I*y(qOqaj1K*l zgGaQ~hWguSRWgY)P-21Hl5`j*>3X3{bq(~|T2-PkEV-U@5-frKE3U({f|7> z`k=W}=wgWQ`g~bDO;&Bj4gdE(ecP6>!l&$erdm~g2vY1+qm$IWaV%!`=I+v36CJNQ zPQww+rbC@}HReU)JoG$b-Fe!T@?I_TFO3BXY$Nv%-EB~aDQa-xvye0EqWEB+vRn} zldI%BuBnxL{Ga>W$vN`3A8YwnZ(BH-JUZRrZ8X`hl)g)=nu496ib95Ig2|x3aSXycvKRHE4Bu_bzmEpOgE}A9eupM_h8{q-8SB z2AR0Z+em#3wSWD3Wz>6?3{);GpI%YH3Y>%}W2s~Z%W4aN_rz<^b(g*mgv5)UaHx^V zBcfA$I$fFCUPa$yOAF*ICq?lR=!Bdea5uHta9d$Y>g4>8tGn3HL;xeJ#W3i5yJHfF znm`(-aq8o;h}z>gtFVHx=^u|`@Zu}LCmG1CMn-WyqK3p|VP>pAfj2E3!E;|U7kptB z(}M5&f3Xa+y4waW9Xn?4RtcSg6mGhCyEzqs{W-FACvbq5LCoG;$a?5=cJWs=YUUR; z69aE)@u2xEU$>Qps(_8ayKZdl&E4=r#L8})@WqkWylF2M5uk>LpkvpkMKdK-aMtL% zpyQ(F4VxnXis{N(;J`PaKY%x~t4VO4pKnQ}EL7gjZUo~l4VQJdmnbhx%G{q?+*1`E z$0QpVF6A`*-dOf`vZKXvV|Cnwq^G^CauO1)$I=HdgSvWobg6zF3)B|v(zZZ-Pg8CE zs6{?5kXi0Iw%{vgL0n2(5Z_QFNQAN%&MaYo>`I@}RsY?7+Se}TZo=c`VLn+?BV!*E z00eaQ*OiU1d&k0#$;uEc`DX4WKBBERty;oM!3hQT_CQa8mi+wh86ZoNKW?-UP@F8` zwS|bBKaF+ZW;KTQ)mp5RG~ zD*dJ<Sapd)wgZ!j)iU_9F3s zX1lfLh3^Yf39XzsiHBdW{>Dl4jX0ggHiW_2ef+jnKbRL(HZ3JVzie1pdf9|!Fza{u zk+Y}ynCO}^ZC!OgcLn2{_Sg{j=a*nl_OLleK2q_9LBXu63U_k2t{3`&tPr*?#)UUr z2z!Nd?$}|4EXo7el=D@JyNgq9eaY#6UT2>x@ks%ba8-NaSLw;8=_5N^XN)K%7Ea@8 zZGp@4ZtgLU{V`x|#^A=&d*ALRAI^mo&A$wLI`Te$Vy7cgnK^x|*04kO(wcfy*nsYf zuyEx8wN1&nQ`e^3{f&X@5U1dR;AUEcfc~e&nsb8sdz}i7e>Zax!&<=XAB&MUylIz*;2|ZYx}gRY=;ih+BT-65r19o zg+K}|V(SAe>7H}>=C4~X6MLD6k`mu-Ke|JKT9P*`n*)C|&05%J%vW^3RhoSKh+QWh zWa4lty);gw7{JT89#{+$e@;^j?64^Kb-9BKKBAJ-pYdWwT{`CIn*AI&@%X>?yPviy zT)IB3LvL7+e`EGL#v}<6=;F#)CH}VU2K@J*oGM)lwGCyu1Rs5TrK34zTV?RFBk)b; z0Ds@%%C3wTM$BW9}vRqud5fo@Z4IeV{>Fd zpnx_T%5UKUjL-hg>rgJwsonf)ikE{TjZmeim|WUq8rbs#sq46#m6M5be)~b%8Wf0q zt+Qb@-4ynxJ!vi4k0Re;AWn^ycgL0D-eE6noWJO@Oa&Jtn-ouW`BXhu_Ch`KzQRri z7o%?b#=f`BPb}SGhAj4tH??m`R9L*(*JV1~)#FB{GLAT)ov(Yb2i8WXSLhOrL0A;tNRNfS*wRq8B`!9Fy~=NnEMzQi$*c%vO2s$M=#x(b69+sAYP@`^0*ohI+e7LzK+iYX_;-*i}k;`r>QVsE#6i zdOs%@Tiv{hZJX)5dW}_a`Md8V|5{V#kgF?JoH3h!H}USuM8m?-+8Uuty0L??$)wKM z0q!^dnHl@}HyQ(XZdP24?Wv05UmmPTm6_{~`G&dQ78Mh+a4v(pI8?h(=K;#szNuzs zP!1a|(Uy88Ncr`Z~{l8?D^nsvzf2d96IPmf3SmG*HGEjgYO6X>U&&{p`|| zI=kv$5s{F~+NarT%y=OHUn*KQMA%(pKi2=b!cpoVjbAYaSWUck{bY_6+>y57{*|$= zY~HLH*Tk7Vtis_r_EEpds&{>{&eBvcRDwxG09+d|DT>r=igWj23;SU4a`cHIM-zwV{yEVXqgTy`k9 zU$B^Ao|9yLT2tusSOwmpz@3WsV==?()`isM^yF@_VDcX^0rUOu&OHC*iCwVHSc_$; z1tQdaMo6_HX67YviZ9ZmpF=9rfZXf3%_GB5nYvz*p1nYEf*sbA8V|O!;=qEfUa?j7 zDgl+*Q#0{7sTUfL$`DhPNA>xnWMOXXfT_FHB5Qn5*&IkuIxl=x0#ruh$We_0&^ZoRIHXB4U4?fHRi_R-r=?{J&Yq?CNB1- zNNHQ4GkntJZ~xng2cS+GFSPlea+-CjAJIZXNROH-?m99l4;KVCff%B+4+XNNH7Wu@OP~v$H3QRDn+Ux z(y|t-Q&Dd3xj#L9;(-Y$2qm-BZ-`&pYvtKsRT z==>wK%QP{R^oO(ZnUBxGhfdTde^870cRpG!=oDI>u$h}cDY0q zK1#}$jm-Ud59d9Pe*WRm(u||A{cVt=({Mb-A_PW^Nf+LV=pDnMe}ayGJbp!ZtT}#uzpJ)H5^4(lM%_5? zj>9l_w^G(7=rtYVd`yZTaFU zQF!Hfm0XE>e)nsR+&%_#B9ZcmtUkV?@IosrJQ4YZB?j z0Ge6ahfMO_MBj0Q1E-$j2ZJa5R*;-fMi?iy5RbPry3E6lmn)o6jNKpmgz=?qlomxkg ze$Kd@ifB!ETDXqt#2W3II7*zfcik%7y5xu#En`-fkWuI$pdv>cN)2&dHXKfaUF6p+ z&RZHlI#g!)ZjW?%+x7Jr!@EP~2wR6#VAtKyJ|Ouea(%mCg`$DlN;X_dUP|0>JN=Tw ze0~%`FJvP(?<>7RA+hUgExSCc_6+ma+FAHt67;4{wCv43Y9ec;O60|$0J$mR8+R`6 zb+pvPOAK5v*EW*Jm)&CUAo49HNk{u`Yhju3usi|!_7`sMWE8Z(Z9%Ve^dlU znRX$^srlH&FSGAZ+Qxo#gYnWIO4utyci+6J_@4uQf}r8FD;o3J!J>*s52agYjv3n4 z^ZHyJB$Z+{(pIP z5q=R@u})zA^d+@?YP6x#XMNutG3Qyw_121_J}nJ&JOVRSwVWCa3wVwsE#U2qCIQ|` z#M~9`|8k)35a)meItLQL@CKE>-kcCrj;|rh+V??Bpr(Wg=xzO=?BiQq>e9!4t2ndm zH1OT8A2n&o{S@9Ju255H%=gbav zRkvR@G+pe0rd517(-(GAmPM{nFzCAAjW{R!&uB(gCy)ca9>tn#H3U^Pxi3~pAU+d) zF%UCx2A?L*f}9l#w|3Gd3HR%aZT&GYFr4-juF))x$@= z1&ozf_4Cd$z&^a_xS^hJhO@Azr3<~^CCazLtS-#qvtCDU3}~p)2lPWOrGk2}SHl2J zl#dXmJtk*AIo5(R&|<%4CHZeX3@k+h86lr@7?q~#d4EDF-TtE#Xb+h{O+V=D|w=ZzN79wI8VIybx zMkU<$tv|X9P>@uZ<@tK=eWg?$gY7|L#SvPtx6(y=&_8JesggGx;MaSS0WMR(qL@yr zzcSXV<58htIAcuqW{~L0lu#k@t}jC1xh9Mop8KXyPD8}0*cCxMJDNq2hV7nVF*{>Xh#Am`O?7rln(@oXXKO^T^nO67BO9e4kAa32kN$XrF;F-q$e1=SpbU(c&@v0N*g7ESgTKNz9CtN%GAM zJPgJwrTxgij9JTP&y4IAmyK zg4YyWEU{Ig!ZAhD0J5>yRAI~qx%7OBlPphd=_XgxP`rGEXQ}f%Ti`6z+ z-0Va zx;ij$OWhXB0&#k8S>7cK~5^}v8g}JpzPJ1I^cQPKD5HkW#gM3RZJ>`(xV~N zUiL~(UM`^0ffGk-WGx8N%qCT>JR^iV?8Jgf(1~C}*fY~PqWhv<^`HG}ZkCcyd?!yq zX!Jm5ypGF_e#=n`G))YQxDu}rv#?wghq-a6j1^o0+_F10o@dcdYVk&0c%wf&{Nu~?*gDL=2P>~wCnl{KX&=7D72D*2~>yE%^Xa2b`w zpWg@n3{EVNICMxwKxrs@w99yQ{~b_n?HBT8x~?$tfwLUf1Q*@7dj9a^P;zLyNP1cc z^BrPPvIO+czs&oga)(YI>%WX2(%+`7t@pc}T$$$j#TYs(%O1{$v?2Ap4``W!xsWy+ zg3P3Tz80neMDkpboD#;GNJN*mXU@AD6p(haeXn#8`r2O~p@#ZDM>vIC99=9IvcUvv zRuS=WHPg!Wd-uR7_*M5*N<#4} z$u$w#Hw)$d9F-2EN-`OAbxl6wQo83<<<2rg5pf)`GJAaf}L zin813%jACh0UgJ}ol)b-naZm(&IWcGCcB_M)%g~& zij~yt=2ont;O`d7rW$sO@!F-x(@V3?RC8XgZyd6|(aJyJ(S(f6}>k4JOL|Xzu zQNa4x?d+Q8XG5ic%tt|S;QC6IxZS~iE=R4wpqV~JjB@Y19ikb5sV(O14t6i5Z|~i` zE|9Idosp(2eFAY*%lu}9O$n{#va|}Qq3Xf*_l-xiewt3o(34c`R|Lv?n}REe zWuHz@AdVSLi{y{Fnh!!O2W8wchyF_Dw3n9m_>H5|<$#miNhPnALIutAOuT=EpQ$qC zhJMf~ufBJhbI0wEhVscd^`=47K=;wIg1?UJrLD^mPMJGY)(QK3*rJ5fQb_dL#zD7t zT1r8!t}$H{p(|WAn4)c}h722#(=tD)FDw3LV)X6dKdV9NTkCtV`auAm3{Y9smY5L= z{BX1_M;~D-;wx}|C+*JzDb3uB==uhz%kHhuacISVnL7IrM?lVWJrhC%d7FJUc=kd4 z>>gmsxF%H%L5h13&e%MM+-|{8dR%+w&Hr-|M+EZe$sM^2jQfVMXQa!~-?PIA2`Hgt z(Q3zAFwS>Sc1DA0Sb4YhTIJ-Cp69^ecrPt6tMA?Lk*U}4Yr1-@;n3N07US{t4#MNe zNNr02As?4xTQ8T9J^@bCeZek0vxXa*#k=>NYd{pL`9cQwCjKE4$R)RD(i-QWw*{+p zK9kx{k02;_@E(+7alB0jp!p-1-_mHIID0|KOS{r#{$fKWla?e|84FMsxLJm+0rPDl zTB3g&Ovh7Za6k!fEr<;3}@?QclS%E^!&@Nj^Z@@l{Jzc zP#Y8e7VoQU7~MuDz24p;-X&ZCT9LIukybFpJ}j@hji6Ch|+rB)mIW-P?b9*Z{t4 zD3}Xqu+E4yJorB8hm0|-I9pc?yfKTx#eKjnuL$w*_`w)IaS&8hQ;z=M&gk;w0d0G` z5yg0K(?ND!-H0JiScjpcOeZjy3#DHJi|9XV#2Vm6YMB!}0?Th8u=OCQjj0=clKFNHn+cb01Irhg!w{KOP z`-#c}Cb82Rc;ZGjzYJkN9srlG;9P7 zo(=hevzZsGR;b{arsgRJMgROf@dKz|_4+OG0iO!UZh?si>2#6?6iL#oa1b(V37xYr zU1ird!0vz*pWZTYom2!p!I^^3ZLeTDm|d6VG-gJ1VWvhmvDE#{38-3<^!YaKScRQ} zjUg9%DpjC?-HBN=1&l-HkA4Y$f?EtqXu;wits3%{ePOn8*3hWuf+GoO?*4J}8Ho?? zwu&vbRjv*)4JwSr%(L`L;Q6XcvmfI?TWpq{CrJtZD=VhYmfs2>wp;&7=pTbvLT*$L zJv}6#`&gL*fsc@fkR)m%ZYFBz$|R_C$`OvWvI-}Q2bCaWO`-2~rdp)@<6g@ZJqkpq4@4-HPhC&k`q z@FfeL;e+U!v7~Jd5SD4$ep+`E(W3o1&w z*7fzOAZw#d{P#^Kftj%1UTxY1RJ-Q=zTysQzw+a<0Z!=q?`KKsFI0YT5YCMMS)M}Q zU7A>-N3VSYFYmOLI?R7b9!!H3BoyL`$8y~B(qY$pbCmcYs=9m2@^-#bUWfnX58?;a zor);81A6$l54chks#i52jR1bPce9JKa};#+%vOx;%<7#e|DTDgSbKnQ$uf^BuqjG= zQvZv}nFYhXD1o7=?nQpy$Cc-L2P1&2(MeCbWTfp94WGjJ!go*GAAqPxxL&Z4j z3!Ngs{>FSzy8}!Ua-Y<1S}MX7;Bruo0Dj{w6X@8R6Q7R!n)MX8ZTgZn2Ki^Yx_0-@ zbgUxSV!Wzec#&pZe8c+`_7w2!BMUFUZX7?Q|EPrdioYD}$v#TB_ZmJ-#d+X-tY16_ zN8_T<9@GMm2Pjtr3*CqCAhXyH`zm!oo6@zx0|3vkbT4U0pNech!I+tbI2}PDV zZZo=B`I2&s)8Cg)t>r<+5Z}{kl3n5?WE(lff}~<;9=h3QMh%5 z0^tD_c=3MNGNL%KvLbJcslO0WZ*WTR9V%|T4p3`Kotri3K8(=+Xto(FdKwSN`Ty6X zREuRmrB3db9WXmj8L(?okH)Z<#rHP>l5KZH{B}f>@bZxIgs0E5E;*I)?hjQqTCrC) zhw@qs&P>uf{*m%=Ny*963-*5>IS&kEk-A5I?+zWUYTKLpF&E<^@6{)7c91@l*;4=E zkIT-LywcTcnBg?-W6Uhws!;Lt)i#Sb3EA+Z1ZeCxKj zmd#U&2U_I&XE7=3ee7q%wKxRI;NdE&G@+7x71o0b85R-I4_WylWPzlY>`iO{UckUj zmHh>my}h+xlq#xznyTiHH6<8Q;&1o3`TLT$2BkoGv?HfnB8x#X|H(WhG)GtHJa1@G zLLqvwZfGV)-0KdLYW1Krm8+4z`{$Dk9ZUp22FC&i4Xg4>-w2CH2yN8O(<)o&C*o);a0koVr7OEH%ar^(uKD8b_CimhZQZY65Pb zUHA90&n@|?!ea|=cTsG^JEmpk79B#oLPF?cJ$Kjlw!pLRPO;`d_c~LU)P}eoNZ%Qe zxvb9${Tr7W)1;PMpX+ztSz>FiIL^B}$P&koYj_ifb! zsD+WE?IcKm zYSE<>VmOb!D1E6DmyRP)V#z=-15v0h{U>cO$yt!i@X2EY;3o?yUv;E&Wd3s-c|5Py#Wymts&xYnhZft3U zvr*4~j-4t>>D;+!cus381_i*Ywrln>%v($I;(9bM2AM?N5%{JwnWXOsfIkpv;71^L zG_jWajcn%qh@I*~_0M73iVLED5n~(TeC-4y;O8Sm(F0*Li=z*1#8k>KJ&KVurU(C( z%E>znb@$U!lQx?EV%1rfrmB{5JMinIEzZ&H!9oQqU9Y_SDJiHLRC7>a zExe$*UON)`jHw1-gieGZz8x|L8-k97!jg;O=fgmU!Y|NW(FiF3fP=DZ`Hltp<9g7` zyKfS{lC3n4(&3VBD={?9>eqzTdoDEtmuD?Dn6)XK6MC3maf0gZ4ow~5ZrlfEa{YR* z;O1Kmwz!%xp|p+U;Jk&NO|S*PdU9NP@xNm!+23@}>gkPN=>a2u%u46gV%y0M8)e&` z4~wzhX~ZjA!pl=L9l|Ve3#oTnd8f}aYoKs}IO`mNaU#E{$52SYc=$Ge^{b( zGCHS(bMI);I#3c`Zp&FlC?ZWP)SpHEUI-T!c|-8gI3bleBeeO~~6dK2lvr zUhpts@2izx%xIHOfUGRXWh9kaR}ZadH7|0oOLxl;>FXb5TFkJSB^ z47d%|2c3z40_|Jxq%wI4W{#AKY2zitmh%4BdiyD*b*SCpDT+wy++5FmZ0B-7_%S!$ zsoJ*51nv{8b7xw(ivpig(`lPg!cCwd)cs_JN z>P+>}G^P+O_laZ~!N_`dT#JB!?FURpH;bf2thCvpEqAmJ9SY6}4(1CUA>Y6r6G`t_ z?-LVjv@T*saM?>Rk7W&-Xx4Tq^22wWiTnTnIdp#?v!GVj?%VYsrZ##EOuWKQ&3kW) z7|q2;uFv=h+l-^VC2T_1|0Lw0f_!2@$A=*;Mc~#xPe28HNd}bBJTEpSI#QJyBl-au zmCZv==U}X|^mSW*Zrb_^4;VOv9Ex@HW7v@YzA0L`Ubu!5`-In{Bz2N2^j^#Ta;uy! zQ{~;Q6OvkR3o98FEf$CRy|Msjs~#T)T75=Q9+xiltk@qZk zc3^?BpxW-?o!K!a7xGKZLlW~9Q!d2D8oRE53#XGbMl_cu#>*4UX6NqE&ITHmm>#6{ z*BJ;86{ZI286@K|=Fr~&C6*HBg3zIfWUj08TIZMRnsHMDnt9)EH zAY8)Q$Wc1uzZAOsbD*};A+EmdYJY%0KWOkdEq%E5 zhSg!)3(CPDb(S|>K)R#$0$J+N8+FF*93h*SlDM>VZ%S3GwFr>bB$=m+ZugMUpof7)>3dJN9SY#hOe11F2KoMOxRNxE^Mnnuw)b9ee0 zsNb!g+fJuQegS8&>7Dw0SG5aBc^x#SLKqT(el*^sycs4-J*0I!Sh%QI@dwB14djhg z9Hh)Dqp!@327ZRC`Ez}`d8Ow0?WSJW^A&!V%I|}UG)c;q+9~2%W%;ms{11JUr3|eA zk94UbX2hTvAI?0%y%flT>JdP4-^B^CC8dfC;Qv5Ht=MlN!@oOa&_6DtXVHsZgnfmWvI8?dFESyQFI@79~PwHbdH z5@%(p4mUbKB#;cyXO$io`}K1gFM|5n?0|aiQNQO;Z=Ys_3!K3z?*e~vLvPSs0xMhe zcVW;Ouq(MV=-0!1RNB`Hu7YFHt6zfTWZ{fUayP{-vsvJG7oD~liQSKlrMx#*&o0Nl zL9Qr-EFtUxyTeqbDz6AvWZh$j`|{vxrQp4k4VYftg~iF<-*KMkx~;qnJFamn9{aUC zvHM+lJR^ATO`)&%y4<+3?Z;DRhP)K8~i=6rt1=CRg-ey(+ybXly4?A*r!qcb21mu3>` zO2=iy_oMODkY40bF=U?qzObm?Rsh$SA0c|AJ-CsFsR^V5Osbk6^XUrRb84QC1!ab8 z40%T5fHRt=M_bKeH!pjR4Bep8$t1j^;UrsIKbmoq^&s04v$jc_Tk1|%%j8IsSR2pQ zHxGtp@V(4*!Zs#w;?nWkOw;a^B*$o=gE}6 zO*PRD)3=>&E7od>F6;(L3JHJdZoYZq*{6Fo^KZ*qM}5A$a_>sv=U#Yv#IfaO>`Oi) zEM|PcfxF$2Lllm&ZuqBlNXoFhVSJ~&VVm3G89!7vR@%afQNnMm|MK^@FO|Ygk{bw| zB$|GZIjq)^^D?hhfzL6ow#wkMPi08zRE|baOR+|Uw>e!BGf7@l=8Y()6Bj$ztM(MS z7Yw$W;X0fOI;VmSX|-S5gvYPJC&k#l!qXd}=e6>ru7wi#a%oE<*V-fJn|}a)L6$Mw z<4LbvP~Yq(a0HMAHWeKlj@{#N`raMY3nX{P{9%I=4{QK3qxDy;#8!!=nF_p4( zp0WACVTPQURF)Yyl);;6c@X$Mq*dz3)~@nCYkl*m)?CybnPrz~SAL5qb4YPu$L<{a zZvAd2_ePX$!j*#mA^3{1GT`SR*_$Vk*66g$a%dl6ik%D3+UN%8(wge9C{V(Va)rE( zaQRJKfVN{vTm{K0l&cw~5)0J(Km)In<2^oh>l1s1%hOn%DP=USz%fUQfWlIiidJ?;k zJx>l0;Bh4JeGy*TfmiV~Vd*7SsB{ic4X-hNvnTh@aUW##@-SW%jKLL4TnJA^&7}{< z${IFUaYTL+{QXVDki2?=Qy*5XP25*S3UH4OS&`U+pf3v#%yS#66Td_Z(i@OwDYD9RmX|5DH88=f_14 zNA6cXi^6lg+`SsZ+5VFcSKNF47aCXu&gR=Wb+zE!usu3d#PK^p*e&;pZ5a9H%;OLw z(qB3Aav2+g56jWPvSwLuGu&H;TB)HsA#VAR0T-0>Gx~Zd)W5@2tj=7sF~F)f;?kw7 zBlZ3VH71(S)Q@Pv{vv_g`;TV^OkhB6!cm2dQGRpeuW4`*L4@XMs^FR1%Kq3#eW-Nr zdsjj7;tIDSoMsx$`?wM##%))O`auJTLBDfqO~k9yAKg%u(CdN$jhaP-Tvg5qW@@oF z4v!-)2Omx0u4jg6l9LWl{hTnHmN>!_MAB~5TGcV+Uh&>zhT)E1uUkBg%fl2K<5oh*>hu zTnFmsDEx9)XXFch6=oB(_u_bsu6yxZVcK8(MYUhvS{hv7>sU z^F6(hZ%Tc$;;PDA8sTJGo%*pRzcWjMA;^&q?SV6%&LQ|$hKZ$xgMWgL{4=P5`0q-r z_yc+5W{0JNDLYl-yPZy5P)R#n=?GCs>S7Qxs02$<>rJiSet#U84VZ2b8Jj5lj*Sv& z;fW8)z&?8AR~FVzskY$jRbOzO$m&j5Rytg4c z=*ATu;bHhru9C++a?@*MZeHi*>RTpL@)s1-BA z^t(L^huk`TAwSM&{JJFCjSgB-{5rdN4Nmk#Dvdh>zaCbuX7UxC)VmmR*`;(hdfT+q z=B+!2EQjq|qN+wPzWp8fA~i`4N$Eg(CMALdRQMu$T7?jD$5bJriy764FNESCW>I?4#Lt>G;vVdEBZ!;Op-+3h&Rf zOy|E0_ct2>-L>2vQyLmv+G^7>ds@LaBhd8?gmOh!61Ko447t-p$sr3$L}{GG7~I0h z8q)(E&&4*)AG=@I>8msu$jZ?b0Ezq^Xh3TcE^;^{)VR>pR*DR*CMK&0wB^hbSW{B2 zXcthyCP?i8lUxg>3Z2k>({Ifd0>$JAkF5qB8D@gYx-akYCcr0j*G3}x_%{hiYcZ8E z59E^O{WfOV)jylb`g$q)Nb#8Ydji^&$`{FM8y}n>_;0Cha7QMWO&34Cu4;>eh`14b zx4-Eh`L)c_j(sxN9=IMgr*u(WS)t3TX*AcT)2T_P;3u_}(x#BpY)f33*k!j*-=8qZ zN&eQRP?%qh@H(BU9hP_Le(s8KMmY*}{+M_mau^l!kKw(fKR#{(wouCnd?d!DaY0{_ z*avw$y02w%jA{=xq2NR3Zsu>2N7Bv@uYKmbIDbsGK$r?W2mJ?S$omaV=DR#w!@P46 zW@};Os%Q2IdQA=!j-BZ8C;Ku8>+Kc0&ZNHoW9r=FnePApzXK*}6s3|wR|kh^uE=qi z>Pk6mm_s>tm6#lJoEaN+xjIr#IgN6dL(YsGW)g}-MwlFOY?#9^hdKP-*XR4s@2~yi zHtg_xJzvk~<8gm%=*oN*vNeg%)O>E4u3xT>?`5#yPwVx;x!e8c!LhwNFNdC<*PIu7 zuTst3hVKaIF<*|=R#Z1m$?6VvXyk@>M5TZDalNS6E3s}7dg?kh3+3c3b4lubgjhX|5qRZD*yo1HF{d9CU6kDM^bj zzF@#g+Ia+WXWdMtKVrSGO**}M0BWZ$)^YD3-2Z7iZepBG$)M?!g*RPgMrFD{(;@#J z_A?>ELoIq=`|7 zGK^ChPuRH66SX-%4PwGgXI(G4BJNClu)WBB)rcY(bbnC*LM;GPMqEC~x+g((T*jOe z>s0RG{{@-BfiQE_0os|XOrLI4Y<#56jdb6#I90wdy7VE zy~ZkoU1xc4bgYag051j@fMQ|_Qt%(#-CS&Y%ycC+rd7gNG|S$=7t#A~jFL{m7g;J# zFQ}riD*Yj~$3Q2Al?850`q!0? z#E|+xSXnBZG~t~pu@*b@GK(03D`k0&xjh&UG=E^vOr`6GbvG9X?el@GdxXcf;a=?i zU73T`_Byh8A&Wl?9%k;XQHP~AyG!kT&S?j|i*P9!!!Qklz7{O*Zcn}9U5c2nXZNiX zabmn8wEOCP_a~OOLiU2mOs%oK#}H~MeJenW#7s|(oE@Dt4OxnOo5g-s+MwRxw_p4e zmd?$pdah@>j>%{+NJj>{0nIDdFYpdt`{C~^{K@gpe)n7m{$9FuO^sQLI?hLyOgHdv zUz%>j(xiSIej1esIxE(VGTr*r@)%;32s4A?TKTp@ozp8P{Y2jJDguPlG+UXm+ekEq zCUx6Ev}c9)w`s@yCk8-DY9%$Pb2#B!#s_OQvM#iINb9>Sb-Z9}!dql>+Byv6FM>9@ zD*HzMjBAIf1|@-U;9rP1*ygOP{J8`%6EX%K0ena?UHcF5ILH&w-_uRYXpXzcwflya zvhR}SU1|gC#}&nTNfxFnMp)X@0UBg7KzwPEtKGO_B4-+}9c$xU9k@Hwc#Ni5GJ+%i zJo!y^%p<_B{)#tt?rD3aP2|MFCHHM;fYGhd@(D%(&`LC}Tct5)FKCR?9h;T{Qn#S@ zL_1!NOEMsCsMB{q7}!-*_v5I%z@5QdNVH6N(5?Iz@bj~#t&g21WEOM1I-+lPyheIo zCwrg{gK=OYt8>>@>|Y6pk9>x|Vrhm_PJHQ$!352KVsAIdk)fX9`|cYS(@G*DPunS@ z*X2Um{-&raG(Ml6m)YEyt!}Zy=QI^4Wb-byRTb-7VTOD{y2UJBa+J=f2HfBd4$QCX zh?_`7n6F?J*Yre zNaiXW2EEtZi$ePo*;45T^97Fa2e%zP)j{fUSQi@~FH`9&Jw9`f?Z>ElmOb=rC|b0S zW>LS|eZ6Us7UH41yCBTpb@aTm@nhQ36E5m0y9hJ*{_60%D00?aMxI*d4wL$)q@UN; zVfhocbZufXMwpVz2d4rvkm9|UYu%sEki1!kG~QSJC>0MEyn_u9!9TwFOv-!Q2c=}* zj5A^n5p|s65+LYmsVsJg&sYik%9*m)1GAFW+^^NXxQ!mp^pu>l#{lQA4aOc^t-2ud zxq43m#PBimVMHVp1MXbVvG1vB#bO8(WV*bfj0a+=BdS=(-;k1(bqD2sMcguCocds; zO2PcIIyPM76!bh4>4f<;ZCylWdcnj)Px2E?8&Tb#sweGJK-kyGRS8&y-Ex;YgB#Ml zQyZGPj;n2twE>>`YoIj^$wg#PP_0{ z2~1`3m|EI}dy>8Ob-w#dl}Ra>4RzUObVfm|o2NC>=oX^noCnU5^sTGdnh#C4np?j_ z+`l;<81W|IVF2pb?|!nJUrk9a87H%6*`Z$vR-F1Uq^|^BpIXn|OLN$YC_6k&Qe2@+ zHdcQqAtXZxAj*8f49e1AP#d5e`kiDH_<}IQ8js(UBRDyWqnc8#9!5h7nQvYU)IP`5 z*K2vdUyI7mo-NYM1KIG&89*;+XD^MB&kG$ds6u_K^Kp9tz#&*O??-+J<)8Xp;6uvi zK&Of}Q2VNZhx*JQ;caN{agF<%YZ1v{~w~Hm%D2?c@3yp9oMo zB#*(KC_f|fPS((>CveW+vtTbb_gPD8W#=^RB%%*PoQR)(?77d34c~03Y`m$u1v7wN z1>21GxeMJxHau`KvcU;dDT}2#19+5LA`oja+1sxx-0_gmIbZ3bguupJk z`*qSm0}gg2cAuXeZCD@biuh!3w}dG4!1ot#*NQ?_bzTl|;5%w1))Wxb$kg`Wnmy5X zi%R6Y|KVWgPMUQ^6#Rb`8`I22>~j(S7m|4>a#L*o*RQ*B{K4f)Lw;pZQe`)LeSYBo z@)r`*K7LQMKY-?cS>#ObqnI($tthle%$a<5K&D>(X8a$`Rqm+aGICXkILl^hHPD-i>-s~#gl7zjj z_FnwD@nmx3Os^x^pJ5U6M#c+bH#Crt{C6S_H@9LPl$D?}V2jEP!+Hom&220IRpL?< zNm!(x#W2~oPhSOmO}^@?jb0MCeVW6Y>icFfP3}BHB_L zoE5TaHk4#TQ!n8HMr~ul%gt}}_PfOzyp~cErX0vk6T9SsLwK7=bih{r(ERq+PcF6= zZ>zc5*WSmhzAO4KsNb_vUyp7V{;d_*b8>mIKSDlgZ_MSE1Xm+u2_&P=A)_m%Q{;|_ zaV-C96_5XVYkCeL`&1B9wEt{frf39-04L)q?z<;3e1o+{hkf~zHRlVK{_fsw=E)4r z^+(V}pRE%!mT(pb&=Kvg;W(+RAYm(5`bdja=-Q2#1bIbY;{juMrblLOB}e^ow~Gf3 zJtX#AvJm<@Rf_WfQ5FOjuHSG=>ZUqZ4}DaphIVnwI9pi7Ta-7&B^BVpwxsR;>z#J8 z%l#XRKT0o+v#Yvrdc6}}DF!(>!;NmF`!IP*$yoiyhm9UPrJ$W8tF~U*bVQdeyp(RM0E`ALVN|w{D$j2F61m!5qk_IXlP^s3S26Q*pzfFcpob7!%ED1 zS$DgzG@Rr$ci_O()Oz7T0_2L4xOM)LO3kclYA$as?owkcN6=*YiD~EHrP03c?p||o zm;Gq#_5N6PimHRd?a7Sjev;Wh&Q9BUnn=Qo_#5tV?_gp6rSKryF^faTca^Ijl8ZWm zV|(Fd*)K3YCpD3DdV|FzS)?z@wA(AxQz(sxtjxV45~y2SG&0Q5Gv$XIs5!(BUOWz8 z7`?nO$}{`2&g)A1C&QuMSjja$cMtS39>DgrHs7PQozaBZdK1C|IMJSleJO3w0562N zA}cw5wP(S<5Sqmz7D=pi1xW`yKBJ~e(p4T;Q~OiIOcD~t6&0d!KTa8gNv_#$3s=g@ zvNzJet>to@qWX%iD*jq_?9o8S1AjDk$?vsMK(AJy!@(GXzY7ox{j3M{JUx+Fiju>qp z{3Eu^T4x%7HRfiJ?1)p=y9?f)Lk;@Ic+$)oKkAiv(y#g%{7EN+NT1r;z~Ie31%vM$ zRbwnDKSpey5mN|cg*0Fhnck5OvK~vaLKM%wUk8_E1EV>QGboq7{3)^}#uB?u{2x1mM_G z8b1(zUx)6tv7$M0*&u{+bJ<$Q4P-TeH<72QnQrLc{r}E_Zbm_L*52?wuc;V#oN(EB z)?#eHef3KrlB*EovX$t9&q~Mg5Y7$SJ41$i_ZYcNvK*jxuD5e}!@Pto7N9mLHU7RI z%M?ZmqA_5kxjWifCh2XTNg? z=-LgN9rc2y_%w90QfyPGv;dk@_lth?S$X^oK^-roqtN4L06j`OKO^T4N|~tXit{(`47ltW+sO z+}SbH@q-kaRChLiclO79HjspSfs)q|&Yk4xa-8pEDLqMsvC84ERsK?-P)N=Va^wb( zbsWY%DFJGRihq{{8Iv8w zZzPNS14(ax=^}Tm+rZHA7F{d7zGtC6G^93&U)(!Aj~F;@K~nO?P;x?+8XY=bhmU4h z$6Pg+SFZK!1QW%V4^X&ePRNkr@%ZxlKW7*`0U3&cp^8%|tpk#SB^4g(PT?GSelwGS zYwk_kU|&mAb$0GvE$Z^*8dE8QzYiyN*{G^k`ho!+L-(}1i?^KRR!*~UDf!Tx_#nm zo6$sDXUSl5Fv&Vnrj3U8!O^h{tG5wzVUMy?TB?c+UuUktJsj*GWRqB%#MDTWE!lWj zt&G=LBY&Py9$C{N1-VE1#g1>o`}moJ!%|1m5T!c!e}`cYp;(f9c$XF@9%7-pgOrf!iBY~t;Y^*B2AjH-Zx7d4(C6e7uC)HcjrA< z7%j~DE%~Oxa93jRWZI{jjVN?ec~S@UP*V*#8=U*8Ge}d2^l*uMXP+Kj{Z;P$S1=|b zty;mELyM?7aO8T2oy@=)>vJIgrEiC6=w8M(kQPZoQV^0W7^f`dVb7^*n1aTU-%6^b z(6STb*4R`{JAJpuhY{a>uEu0snXYuC=qirb%VY6)HfHNnznz`j7t=9rRqjRH1vMH{ zFOy{j`4dlE97>AV?%h(UgjpEbm@X%>%K&3!;RQ0TZ%#1DtXZi*&Mnr4QU)(#2_$)i zg$bGAmNZS%wYn$H(gXPFxg;yV=zi!%B5gjUIPt#AO=llH&CB*W<-W?<~ZpB;;f zmxtdX#&2ffG#*nOC}DMyWp((Ge@vtzw^xEH!%0Wa1_>V{7h`))eijiH3KKehp!s8t zspz$XU(Y-7XWIi%%7;Y9IM0&slpkJo$l zC1Z_(dcQR^33X8wy;Z|A;u?`_%|uJ3tN>PNFy!yMcH>Ku4{h!1Gbfm|OF)WGfrF>_ z+!@@=d3;-_hcREpYo>Mh7kja*18F&lKG~%oi(e1shh~f5OCUsacL*wen#FY{ zM^^CEr!7UCO9ZI;OZULo&Q&qa2)3KwZn#~ptY8@Q32db>9bE<|K~VVEsN5CTpm%$f z$))gish0@@g<+&QX6A#9-%qGT4Y|B^42kDt)Gl^84Xtv>RH3_{UL>!ygsr262i5v- z4Vl2u#F#;e%RLFas--g^4gPB(3WUnn@;=F<@jZrNvOO>wS9e77)DQrS<7T@n=jwaQ z{iN4dSGyldFTwpcpQ*XIbU<71>OR+Hud_vNH#@Ql{e2c6w)peIFT+i-z35-1yVXrR z)NT2--KEILFIKy_QBR=TS2e1MrMhiPmNHrMYoGd~0LY)m; zXg;>RGo}oLb4H;9614rPMl{P?OC7{0k!~*;$je^?=iDds_v0N4N{ZH)%x7`fazsN0&Hc=7%72%!X&95PfRNXAd z0z@PmbTv-WI!IM!8TwRrtvqCEU00=WDP-FOpH_HA&I`N@((mab9)m^xdG7|Ee@67*9bYz)4^)5I0l9R5dGit0 z7u%hoZ+;i%VLwXMaw*a5D$=>^Uec9@|5E|G1-m-#lH~xp(`tN6cU`mCufcev=+A+X z?AH(XsUkfBpCS9UNl#>4ElJ1yLb9FHO!X*Sq^~ z2Dpf8Wv9)lAO5jA^lFdF$(7@rg!LS|mHI%5mWhluD>pk&`cONj&dA zuF=U;V)%)i7d@rPR*35h0*2gy#oZvEhdX~1YyYGN=wlC#@ZtmWDIn`;};B|c799%SJ-eGte zitaDc9Db&A{DdM7SnLIElqdwJI9+lZGBR;<1?xV8Qi4PYQS-n*X-pu%Uchu$azRRWh zq`)xYAARbVWs9=pSAOIuX$!7@x|#AxsVCkMrp<*59syqDiSg6_YCZmUPRPs?`aS^| zA$xECyelX~?p2aEOV#el^;!V(%$UM}@rKM?e8KX*FY&Lm>lfMJdmncDuA6*dhdw_n zkl8$N9{&W}V2(v>vD}U2shTs>q0d=0fpBz)_uM30+dORMwEShl%v^L$LG<%bU`2Rf z5-*a@-4wX!PDp(ze_1wPCZBTR8wL4i_`(@ECBL~87@FMQCuIe{7B7^}Jz4Fdl=a0l zA*q{k0fF_N7Xz{x_3J;~O-xoM&8bhw9c+io%Ar-X-+O+@!oiCxaskBv6ipNZQEw;7 z^?bpueO}aW`Q^k37&eH!m$FCa9R%`%a*1hLQW{Q!^hO3i7o)N~-x4D{Q}*GUg$to| zLg;}iK;gk2&fXA6FL9{x*(_PwF8L+4LpD?kpTlOJ9L3LOm;gkUAIoxkG5dFjhgtJ| z>zO<8kq-*&+DmSc>iPy79 zJ#bS*Uua#Dh}n^D^srchf@EoWRQ5BQi`13j3)LXc2QbO?sH2ECC@Vxr3DmMRm;H=; zCsCBl-OYW#i_#w zQX!@{Vdi9M+0-OXQTwEZ8w16E<=ptN^a>#84u4zMyWJ30nnfj=l9@mj zGro483y9k3d#f#Jz8kx~-qTrT;P1AJ-$p`A8qAxq5N8+Sr0M!8P!7XGwZL!;!R#sD8?yj!o59%w<`qf7_FDfZ5(u*psF1#(!WQrAZ z!rg%8tpJH(20K=^go@CrtCYr7Z+L|ln-kp{PEg}Azy2i!`vHs3YV0Ntuo0tPX$7xM| z8_YGd__pbAlA*L%Ddr)Rer(+FyZcfR^w#nr;XYee1*Ku|z09lLXTL!!vpg@jEYsE{ z^s3W>k0^NmCF8nH4-`&V(imgXOxTm4=pm=FN}?U#XT9+PTm+H_l2>~ZG4$%(`oc4J zMTSQ~xNE8I-2K=dE=u1AF%TeVE+(sM>ju#lU9Q%w?yB#;9nqAPp%D#5}(8F5A0lg8hlHGCY;X)t0wzj!6T746VC=+xg+q0&{Onku4Qk+ znKH>W3E;_Gtx~nYVN8Q;c6F^LnGt%sturAf`tkT%eY6o4a;6e#2=wyAnFD^bXsnw^ zua9RyuU9rCY0~j{8a+TJtz*&FN93jxrv0ypn|8r&TMXu)w1++J%(aZDiATd)Yg?ZO z_0D?V_3}TWu$!aG&rS+nDA~QvQJp(W;75yaj72nb!E(R9_HKp7UT-juMVwOh3*&zN zb!Tf~V);vKl3Da z`~AI7P65<$VP!;Fv8wKK9wu2pQkvdB+4aGP6nKl7_>3QKE%ieB)6tk8E>P-!tIZ#4 zobLn(u$k4<+<9flHU7s~7N4_r)o|@Bt0~@`SXK15(!jR>>IBY5tYVZ6fF!<&j8FfDO zA{tiwr&~b;L+L~|H|M!#-)(`zD&NP(oKYL=QtfQf^xEV`)c1zIo88=S@dQWXjy8T3 z3P(7QdxrB@b<$$&dPTcZEOxXB3C!c~7tqD0Kqe407_-4>Acvh5LkggsqU}ncGmN9I zaAE6zv~rRD{9N6iN-*6*?vizI}u zOas)`(f!`#nb}DH(5-%i)bZ+ACH?)0`j%onU$~Y}lXFarj@s8>cLXS&FzpQ7mMyq1 z^odY}y@_E=UQNgK?sMP__{WaZw-^QI_^t?7z&j1KNo~nO#_SzHfvL9(#S&5x-VZi- z9DecGk8h9R?+{gV@_Q1J5;da_DvvIwPaO}0#6Wrz?$i?`{7gD7P!GoS%>!XJIb-l0 z-Llp2d;2C6P9C>4g+of#gXsF|Clnm@_N)e1^Oj5Ajp3B3GB%A#RqL&c?Mb|*WViSmWDRb zZ-K1jm=QxtU6mA zCWaAB;2TQro>!I_{(G#2!KOHQ*}g zE*$&wMaLqq{^pET%1+5QlIH`3rW$74+Bw6!Irc}I_>8j3Mh$2bBd4l&P*y%Ammf6J zA^4_Ey^3{$DXe|)r+~QAh2%>tkaW>c-iRQ=$XKnCK<1S#MY59Dq|{{QD{w5^1|->D z{IZ(5>3X7R3d4*TIJ|I|#YdF({P?HBNv8IC$9*%LuR+o%dhY44#N{m8Q^@}N=ut$z zZdl|Iagp@Jv7yB;JWVY z)4%mC&}Nm>fUo|_<<=IBJ4QXW=V7iVjN7bms+k)~HZpe|n&`boRwChD+=z~cJgz}C zY)<$uDsbDmp%fQ59mKwAQAsctA=g9xEp}wx;N!IJd>RJwOOgx$9`d<$YHUPLU$_I9 zkOHBuXl6t)f%iM8*T+?Pc&(^=0k2bSm&pKt1E?>@L{1$N=(>C^lS8Jm5rhn()Q)bN zzy-4Z9PiWgZ_p1TvH_17dX-LN*9G=e`4#VA5hb;nsse9C25Rieq>wi z0>|LGkaygvrjw=#mRN-Rs3!~* zxNTnnv>vkBx5lfIMg}hJ0{*=RrA$kb@{Ku?;71-VloQW#>DKqX#Z)e z_r1Qj6RVe~iQB2;eXseED=s@y?&E7>yKfCOc7Dh1{a${I2!G4X44ruLE0aIF_u<#r z{>J{U^1SFnH)%1ZiC+h_(sks^v!JK-%%9y9`-`9hfM&QIUL#c>Zzr10H4{KDjYZbT zD-N!)h5@!Wao#;9d2BP~^|`GTm7{dO{S5lq{ZZ*?iBA01?UN(P#!a>gRmSqNZ`xZp zjJ;Ofbj4+%gNKkASF91wC!9BP2ue!|zd``vvQZyzB9gmYuziP@X)gUb6NktPeAjr8 z;)Qr@JpAlU?wYg6>J`OB!RIg~{0etMq2!=&nCmPce95I=kQ2;Pj?dkOKUH?Pp6?lp zb(PXqt;c|!k#XludB*aBZvw?x&1_Qyk=|fBA`t-dvPYxG3!rZqhRbouIoPlD#xq4W zVvjhT!%Kk7S)FTb94*mW+lB)wLHqg=$Xob?s1%SgIhAtQbPkMp zOIvvCX=p{DL9%B)YLo891=LwLUG1i~E8P@#d z%N7>Ft5{%|%PMtK=rQL|OoNs#IBo$_{z=B5O;b~dp#+0O7k$jV-%`#SGHmEE(3=c~ zv{|}2ICx14>3X(Ts>k4oI}1-6-CRVgnZN#qF(!InxZLs#;$or)eH{Vk4xHsU74R`0 z5oh7Deb{rU89(_}2lng>p@*h(&&FkNcwSSwX7;Q5nSi*5b2z5{!fw#bG*SX+5tXqFhmKva+`2x|whw&et~%k-itf>1{`RlibF&&@ z>?=5Ko!#&7B@37l+tBaW=7pu6au+vpXP>zX>6aujSWS1sq-4AJ`G? zP+UL4!TXHs?a6{%-tdpMrK}=bT3bZfdVSMw(sS9wD{+>F-1X-3#MzpBq`5Ie@x{*l z?_YfRGAeX9VrD@8m>K;X#JtS=oG~Emf9!*?sbL z#A%QGT@NASG*uZ3$V;Sx-aT_2oRai^Hq^Ws`-~3XNZ$ig9@}tb3RjwiyU_hlXhfUP z9dr}y+_d>G_aRMQ|L}si6eA=;xX?*LX&bV?}KOhv4 z5YzwrjNp3_u>HEGeZ^?WgZ=(s^DOoc1v!C7W~;KMwmHjF_Aaz?k`%_h0*6PdhuL_y+%?hW!je9AAJr_S!H5q?ZOpG9CT>R0NcMH6V< z&a{6N<5;~1&g$1u*K2$u0gy{d>Hr8gnm6`DmWmDCA{6v{IsDh)cPEAau;WMA7sNy{ z0jJH_$-NGjtqX#tQ1k)CYOlyKIPR|wPp2s~sBhW| z_R`!KaTFMQI~i;^HtPThm_$l0Pm?&^g)q$8ipcX#2K6ntpS+cNZo2_6B636fE_%Q| zf^r!JjhDfvK$n3Zz9%v3balKSa9QKD_`&NCYMX#Cf|fkX1Zw>H$1mId&Vz(d?NMjp zZkp6WF7F*-@zaMpEBU)Z zP)yeBng`*7uQ!CsSfmnMC2*=MJEc1*I8)gx2XadSnJy8hj^@*XqK>KaGV z-Xy5golE3CYH|!ABDoucpUnmMINJeZUHPuvv@peBM61CMgCusXeb{{Gst^EfOGm$* zsd6Uehq5fM8w`uwr&S@{b6(EVjXe-)8s5TC^D{kF4T=s1dV~~bW9bP=hKNd(m&`R< zmF-Izw@JWgpocy7<_yXzwecz$%eXY&7Y?j;EP80j`wsasA`59Eeb9r|nDIZzPqC;Q z>?W_C{o_%!<;iQec{C{-T2vl6Tc(2M{{p23IWYM_N2W5O8P#MI0bPxyD`_86Q}L)3 z(a!kT%fLG4fB1GPRWhX?;6-?ca{0nchNcT3gtdIm;CGsqpZXM zZ@Pxv2k@~4HAm7Rxhn>Vuy@DS!o#jkhmcrpI$?45zeM1lK?<`WNGKZrv`r7lm4Fz% zu=5bZ60!lIf?ofh?qI5G5myjv9E(jgYFE%x%lO#AFvCw=xWl#{zn3)i40h1dUC5xF z_K2K>Md@})McpQ+jOC;6pYnQgs2rMp&$Ly6V?3@Zy>|3gYI(bX$du%q z0|1&#h_HI8%67TEe#6neEuJ=X@Sp1poJ-Wcs~+%+aXci4g~T?X@#z;AhFnH7?xh%b zbesu%OSD4+Xk|0iuGnL|>bl~uD?Fmen}~_KnfcSZzzzRx6cwD;fR@;f0ihzj_FqA$ z4w-}6UJf;Q?ebD5#NgfP-ESOyiwS>`^stCZU{oTKQ?mc_pF1Pjn8cX6>FsofwG@s( zXbXf2(7ToXRTk6Eb>i?_FA?nrhcK-$T`1Z#jg}CDE175HpO?*(zu;GhMgqlVH1EOq zT1b{%gy$w@X{+E@Vn3IDp!ojqe`cLX+EgW-wZSyemrUm>SMNlKm{TFv9NhNKYWIND zq^EbdDxfeS-sHD(b*G6Zhq4zpKR*8T`{Nc@SD!dxf=`EdCNWo03#Ms?E~CIdXT;=} zM&f9ZxCZl^sd34Lx`Jjdo_GnrLMIaZ5!g&sOvw8_h}u|7IPgN@xzwG``HiLDh}$c| zf@hjLTCv_<=IycRC%>gTp1fF<94s9ROJ|wR_D8IVX}6;U;4d{R;Zwkg^Q z2lg$9ueh-K2<*T(c|+hB`2{N59rk>6N0|8XZ_L7E*UdRaj6n!VsT8~4@CIVJi{bpi zrcgoZZt(;Bx#0SjjYw}kaw=haQSd-IOY{hGTFG=mN6j4Rmv~7kWnj%6U(;v^rhlzb zTke^C3kt1IW^S);u{X{H^_x1mp&H?Iz2m$gZpz_-$d0_lK-uU0r`#?+^qsgpU;iz{ z5uZW}1Lxb&s;Mt>H6w9N@@{EYy?Gy&#sdwKV97JlNeO#5=?__=#}hAFi}^{uuBZ+v zc&PeKGmF~;9_wn*Z{Nj8)oGn`P1&nT)-1|6-??0g9O(_}v83S!D_Qm&!T93t>dC;d*>5{G@khay=Af&wSJ{^8k#^T%yDV(dahhjS9 z+Cb9W1&4Lksd7X4OKy)rca1u~t238O_WTE$C!@y$&uOUM0;=z!Q(c>_FZ5)ow>!Ei zYtqtdt-~6lW&Pd4q4D1?RCDda62{E$26Z`eJP|aLv{vKN@1gD$#CmLEyUvpCU|V%0 z4d#iOKbTGnV_iaA)+#X;tcZI2#JJ%y*$8xG*-WSG5+#fEJFYzX#+{A>P=iE5*vOAN z%x&+MnM1=d-f1CH$5pGtLF(dxg(_Q^6s6zy>}XK=I4ecO`gHre#tO-1_m$=g1ynHQ z$7zrL6L&niVeyGW&awp>f`uLDx`M_gD~EbM!cB*7wNLX_&i=QcMAgoxEZ#opni^IT zpA^hn`e{dydySOMzwj29#4hb?7&BJ~=L5uMWq88tmaHjgLCKKFKS1rGUd~IRNbEuN z=1KXMNk1H-r~D7y^lLUY298Ps{>W|5s5^1 z>Br_6o~}}6s3gLwb6v@F12CK6KXZ2&{q(>lLIy85Y=`kpUmf5;o+!nlBte4mcrWfH zC!~MFr`0}N$)u)LjcUm~X68;{tI-ckBo`~F+-wz8>f{xPrTm8dwX!*N(=!qX8Cb%N zok$v8JwJ^L8*R4iIv?z)JG>`^qk(cM1n0t)cRb>FrXpPq&bj?tVZMew>EE#^ZC8@` z$r~|#FLFGAii7`KF~^aN?_O67?%*!_9 z$;WP%XBQ=BZwUWSRAP@HeecZvc7MI#4e)*0Xn}M{204#Q*6Z<`yL^Jta@QsW z-mF_|5m5OQkG+H_rQ^dq=oXYw)A!H-v9@EbTB7^By znDE<6lE~=~sqtH6EPKFb1Tje9w`z$lLa7brLtWQL3qh)+lfJe@vZc(=b+@U-*xKpE zC(((EG9Hr#5G(Sn8TGhAM1PYbD6xIwLjcJcj?i^*3s`zrbyWPEz|bsYB1x3C>Us|b z`U13mS!Pa?|AyQp-2^x)dYbHMI7BDG9J<5&d44$% z5?3E>=}!~@zyaT$R9b$3)HfJ}1Pi9yclfHj(x5#!v-(*=os$=PV*DPz1PD1oC2)A^ zhctq`z4T~HVOc-z$jtNJ#}bbEB9^$&n|k+t>eVk+yr)Os2zn$*I-nL@`VD>>Do=eI z7{pAjrRPmk#U&C19)OKSfJ-N9uyAxwpQi8zY6Y`lD{xHJ;oc(6Ul-mMMzGF}YXvK) z-u=A-|LgIBq|h4^F~xJE)D_eVJEa@Fn9}XFGus> z?;&U-^m2TS3`xN6he7TI1};(hj+$TL`>=`I+j6eTRo5cx9Gm3l&80|FjbXL7T`z#(Zl{!bP7H7j`!*1=PU(#`U}N+#ts0V!AvB}HN9qci;y2Kvyr{Rj9p{w)Ar@tQ~K)*Z*SV5bk)aoCzk zK^SYNZliJcA;Us$8;#tf(n$4u;AD8J@M^!ambjK|eu)GmZ{mvcE8~r-4FF6@$vJ~O zYS>GcQyqYv!uxP9Rhwl#R7_}jv!F1imZvgMb9N7AxXb45R9U+?APpWP(aol=ea<NOh0{o5}acIZzCtY+`J!?;?hb~oNw$CVuUUyF7Kpst9+np_` z-gtdKdmdWP8*rBeptC?Dw{lVtE&7Hwdv7U^x8-}ki}26|C1eG1(fyib*TO7f3|u0)huyy=SiNkIU^uw=^vyc0@UyvxI-T!)Mf6@_2W5S`2qu zS~$ZsO@*Uc+5Jg#s}GR`E~_kb!t)7L>2_fx_m)eEp`Oh?_gRod&x6uEFOKil%y5$h zg<3tvb}-aySlP;q6i;|5n?Jy zBgY!95w^NIOQdvrsxm9al6%{qNoeZ_HSFHfTG2deuM9xIWDOlg^VXpw&ObQ*Ve3Ep ze|7XG+SiFaTG4NDtuj~I&iSN|W4#L~t>XQt6=5|gRJGBi;^5d`ZiwiffLfH| zZTmxUZC8&}ofjXb9gtx}#g81b!04eA{{1q)*4ru-vpSoqYUlhunn4Qe9FZxxx1|@` zWonn<8Cl<8OupevVYuOwHCOf=9m7gkf(rUlNE>|m$;@(4BSRPU9{&446o3GQR`T?Z zI@5!xywlY=vcDbaJ3rr-F8H4G#jXdK?61!Pf8r=Ux54c}B$MkHble)2TLN`+TGd#H z2@Q%hA66EIswfRmMi`f;Aq^-c&Kn2$FT0E5o&{t4!)0V|un+h)*kl6NIeXPm=8|*i z9@tS6R5zY>iAh6>$qbg)w7BvT6+D?kt-SZzx5u=rY_ck&ucZ#39VJuBq6d7We<#w{ z^baK-&5W92+~|%NdKY^v^V{7H3s{`YV4D!F-QYAiLjE$w`n9IuKbGUJbL|(qo93fJ zw|#Iksruvq($X|9d@xh{t~{u;8(T`=h0fh5!sAX0dIE`c?BGxHHuW5WzW_C-Bs%LM zM?K4TvV&ecqX5vVEug-7`2yzkT{Ehqr4t76$iFuhz>BA%?wyDjBS<2jPY_Rd=yp3O zTHNwPw?*pB6bR2MWB*!ZkPP6EQtg7nXE`re`-4o7A6FCT0kRQhQeB zNm%cwlEv-1}GCKPA;A?c!QJ=WzU$V*8tEspN|Acd39s=XxtxBOYZC24%^b=xwHN)+)B}z}wfCr@0b* zNb($`s-}PTB7WgZgFs0WOD;$VoH4n`899e+(-AiFK3c?j3PR z>q^s11Ti1&X628euF^ z_RNcZb)EEzaohzvM&Qp2eWy*6xX?m*Px$RriiM#KPg`&e^zDRMI_d`KNZ-NdlE>n_ z+@_!zjNH((n4yfjANo$S1uq*f-?~%OGPwpG*P)eq(|jV{6Iz5K3Z?WU(B3y9FH;WN zpHB~~&(mM7O7N%E?vc!bZ9fc_aDJdk3i_)8OV(=kBa1<)^Z70Pa5JdWfhkkH5$r=_ zqZZcWD&v>E=2F@D7)@}3>&yz&_`#MzH-?gaTSzPq@|MJAXLA}0iKP)!SLIH?X=4Y< z*5l>&@8y!;vLJ>=*ii~Yxf|QL!+909c#Y40x6Y}Az0+0cVDIsqt8+4wY27()+y9TK z^A2ZokN~{9j98mXtmU6Rf(;(NF+M62c>4Mphk=uMeGsP(pph5 zqlgg%F@mW5+~;|Izw7zSf37Q+J73@X^Lf8tFC8o0Zap4M5pA!v_SBf+OPyB`C9Z1YzG+87vl<;ULp8~9PM%g2VHr8f&s;7hs#vZ%&tV&6sxXWWa=NjJ3(0( zELt?Z8@{`pC1xMG?eb>792FAGD9tLb7PPq*y4{;4VjnUq-`))n#_NKzM(8PT1nm!Q zT(?37nC@I-X9mlK{ABdgpGI=b;#5yj zerah!XPX&4pCB?lmQ@;W7cmLyqdHgKWNFf;`#`c{?iAH24FHZ0~dM+eL6s@Me;O6q% zMggHmRY8W#Ax_1yq1v;qboQt<0e_fz*d{vU?{nqzf~!rsI^p}hOdCR{+gH&$&LPL! z=`|e(OPc&@I?*~gxM@^~&}xAJz(OP(s^{=pFcm&G$=Fm;@m7!&lD z(D}tWkTRj#4NpKV_RsiG;rkh*SDZW~qPHGzAxBy?;O+M=@O>fIMQb~Lk#wjs8^b6c znmdY8FMAaQQlI4Y!WX_Z?%_VAj*qIp4q)b`S|YG0aQF?U^!ZM4czKgeC-Xl3o!DMh z-|Ibklp^Ism};P>+|3#0tE5RQ$+}*ZR6oDjqdGxOK3tJcC@E2;uP2C7xGUb7nLtsg z*|M7z-WT8-?QOcNGOQDR*b?CQI8qm!p~xn9s3M`k4E-{rya2H3O|SxPkfEw4}k2tA&WVAU@VL<(w2ouJe(NsT0!hKV*jD# zLGvi0(>X6JC2dinE6OP-Z2UE1(KjRfSOb2nDV9M+AanF6_Lbo7h{V!N*}C&1B>uS$ zGy@Nt?LUDL(D8&#-Q~e-jk}AM;VtmQ zGSuzYjXS+?d7($*8RIr%$;UkfcKM-Bm8{#V?)=@al!P%; zj)&McDpJ-k0$co?l3+9QYT}|0sc0J+w1)5_G?vMGzRIs^IQKS<^)rC@Jo(qTKOBZk zRa>Ci$R@x901YQsPJWhmv^Mv%?p{Wwa*G|EUF$Df_3XMis7Af8nEC<`B(aISzPsjG zU75Rs*O5FkS1p)(`P&j(MDmD?%=i-9n=a0)L-z|P3m4sDE!3k&9L+GKlaJq5T02qA zdb>v#UNQ`!+9N@uV^)5{OW1TG;`-n)hbH%yz}D}6iq`;#vW+8whWBEHBTO4gR0=I&C^RP*5Y;x&=#l2^4alreCGljwN za#K&9S##pjZ8Bp@W3PdnVRg1~wfSd6f(rwc_k*kU=}$-#}N zZN<$IYgW>%PJ!Jo2^N8yTHPBOJvqTf(SCJ2hJNux(%jXVXE^!v7ZOq3+=pxf-=*CH*yuYqpejLf%vwXGtW4Wdjwjn>RY zn_V#^w`kUAt8#|7`aJNCm!fqh%V71tc;(IUnxq9fe>O0$|3va^beYUYjt3b77n=`a zoGn#t2rMbGtv9zlR+sr>-N|4-Af&+Nt3DL(AQc{er2M~2g1xQR4#&r*TG#o|$RVAq z?V*;e2X6O$_ICaw?)GKrJ4n;?Cy$i>Y)Bk$c;AiHWsRhoZb89O8(Nqe`im;^XXliHpFCC4wkmz?K4Y%Ea=`}-a zknOF&CEc(}d&xGd3RRTxzC~bBb5pC&?4-}myb-&JnDRf#OCuIXXEL~*j4)+&^_f^Y zh8!E-Fn^e!SZ$nTAj)S()AVm;aVG7nT&hBP=6l z_gKt#-`WkzcKdGUwWY>od%Q^tSv zr4*;lqa$xL(K&AGYh9}w;MF_sPN?4AIGC_@_qHS^cFMj*G9K*QYW6?u^V!`qVmD24 zS^IU45nHD&$kHTmx)cA>Jn`^0Q9q8|t3C_F5B`@;^?ulwtVF&H!F4yoF+?WsMJ%58 zV8(e&Ut^*8m}toydvX)>Y{zirw4rDQPo9*dt*xvzGP6cKx8H`=mIDxI;Y?7 zg$0qUXPs^mXR5PCLGxhb(CR3zPCZfWft-lj?+Km&nl61ORB2P%p>VB-pa(H0N4i{& zRB?XHe12HtzA<<)5R%Y=`}>1CO;MhN&dZ(w96&+^6_xo2Gwsx%$susTh7v=|f#!1f zap$=;1;la+T1j-ljdgQO=8O49L>>96rA+Z~azk=AJ03 zF@zAlh+8%35)X7$!KgA^Rt5%I%x%WhASS+k?c(r&PL?janMz*-uIb~}RF~V!OoY68 zTs6_0__rLD;(-rNpiEVR{Pr0p!VgavCXdi3ciXHuS({d#uw{DJ=n-zSm~bi*sox{bC)W9<P zgBQ28#^F8U1TiJNSiGgrQs`msGItjKp7^C*Y^{t%O14S<*DUE$Mkm1(`Cmr4oKDoyd zkHHru1@(o2^u&7RRL=TvJMJ}w9pp;DT!kMc^JOz{vzwxZJ&_z4O0_$8w8qe|C`^ziB5Roy;^#Vu1J3Lz3D%Vw0wxJ_<{@{Q%^9vwTHk`&ygQQ7 z#d_tI(*wT}+J{sY-03LAdhe+uDb;^yz%R+-iW7ru!b=to&%{Snc5O*g2rw^8X$3OF5A@KfuP;4ky>d z?8aL|4vX}+@o#D;L*0jJBmy-PX?rfF)q-=gf^uy4pr%!=2w=vu@p^hb#yZm4VVAkS zwCn)9IW^sdnt%rv9K!Ja%in7w7uH&B#fyRf;m@-R>P0SNEq{!7=js8)kq-ZtZo-y3YZS1FkxASBh)hSMPB|7|Ea3h89ln zbQ=M#T!-Q{pF#;yrD&s>Ua&b>_2H-RCmZuV^xuqW!}Q~ll-2W}oA$qIw?_r(JB&+X zawLoQrT7$@!|1C%UUZhvbQotYxD<=We(n}t)ji{-|zD`94>Z_Q!sO}(lB(^H5mLfV)l7Em*&rGqGz_sq! z&|mL+55^w~uC}T@MzdZ&*4Iuc?E0c$sX6a(vG`71c)Z+ln-a+};8K2qJ#r!i?Zdom7e3mp2^PUakI@PCpJQ!^L0xKRU zMASC|>{+YtqDWozPO19nvKD~x#rIa;*DpnT3||qs3cG8RRbQrurJT715FoBd+w#|$ zhFx=_=CWl!g_5f@zReU z(6c{ytWI&U+rBu3Ner6f5dWlOogd(nrsKP9(HU^b#GWv;2R&Vs?aCx}Uh%Bwu(z;o zsQfY}^weQ{yo@Gd4fk<$OD00K-^s(26!G&f^??gQV1ZrEwSR#HVu5O-*Cyx%Bm;}P z=BWc$b4DJnqU6f>XvjyXS|n?5_zBP~I%S4p{k(t~vQJLgxjdf?Gysek3y$VT2R;RG zqpr!^OE9BZ**F*tss=rjp(=A%*17!qtotiDP1ihOaw zsIB{ffkd{`Uaojnw3EWkpRqmGtk0KyX~E5D=Qi^mw+$xq4)jufg;yaa7k&$5H^e$s z2W99#nMq{LAc{|2bWJ-gI``=3IKOg$VUzQ+3qakCWi?M*A=eWZq=VhkuS$<(X$PR| zf>{>V&5am})3sYiQW8f#nTcyE8^8F%tCJTSYaUP97qSEc0O;ROqrnpg1G5*pq!NRp zi``qN_oT1yPkw&cPg#h>18d+&qg~O>V%9anKNwbqT8`cwLkfrKckGz1?GC@D?(Y@} ztP`#l7=73aDGb$SV(b4753oV+>s36KI86vg=osg_AkYK6pvv^|Ag_c!IW8=8By4Cw zZ7(i=&w(!*-F%Rzf2(Ay=D${KmZ|QFisJu<^S8!}%2}Gtsu>PVHq1(%yem3^h0PBo z++nm%*vLD8!`N1rMBR!BLgyq;Zz}(XGiSd8V6!C&cvMb)vu#CUN|CO@YhDm!WX0Ez z$Ul18HBIm-#7LI9^)2T+q{+U|OhVrp$Wff-OYB&-;`$tssdF1_xt@SAk-ip62Nu6c zki16)61_xM@>3)>oHbKAO+c3O?Rd3XQPqsLp~gi`rnb9oC1dA(mj1EVWXC(I`EWnw z48>f%=K8jCjYiXM-HLTJx2(y%qO^Z+muc>Ki zK8q3fCC9E!ei?SLyIRCY!q?rGltkS&dCRf_3xD+%2dzzN6JnsmAHd6S`BMf3&p+s| zh~Av4DgAp6G@U4cvVN#TgNiKM)qO;79rzy((B^0AhTZ0VtE7*EO8~C(M8bJ^9r62 z#hB(~daZdHw2XU|pyT(Kl{D2%IRBJ0R3V86ZY=T@@-eseii{!l->#)riV%2K17do3 zo0b(r3+S3;S&06*FpB5{%};2LO)Yp+!uf@|`T*DG{;}+te+l{e(LYwmC_hm|FJ&Tu3p|B66v6Bywn(P9uiA1K<;g zvI{3qJ?8J2 zRXrVR{jjYoSpp=tLR3wI4G9XYi;i~Dz9+5d);)$=&NH4O8vpLGPt zhfIiPKzunL{lhY7fcT5~#+{B$Vpe%%87#da>5ffb3D#m|smpA*)Tla(=3c#BGjjF- zzc-nWk^XbyZSu%sXr!s9Lb+v*`!>&|*ouIL#||j_f&pNTgvh4%ysUa1(1lKLJ}ASl z$K#z?vZsFVH06Qx>0jrtZ?R}_>@WU|+XKk`R|5GhZuj(FoV`L<_9HKwi(rOxu!}Go=zI=e*8TTG*W2HmAY@U-g zt!y39A-B92A;zd-H)J$xck9u*E~txg1&;Cre{qy8CyNMr4-(M4E3Q*hQkpR%jCv>h z8zX!Q_a!r6o<0cwr7NPXLuiHl_e6u-T300rl5SC(u6Ej@OHU$i9`YtHm1D`k@vCjf zw{L9Zz}QFRqo*)rNI)lyA9GSU^LuQy;O4CL5>=)@u~w?ze|g@$y;*Qd@z05jmV;r^ zDOk%e7?Hg4vhag{j!p%?PC!G;p~-b6%qdmWG<){)>(IZan#o4FDfeMC#y|W0Pum8_ zj%GZutNKIjH&G;WA0X5dk{+)be;Xs4=?R;r;x%Oeqal#qwBt;>!gi}lqF8l($R0?U z>e(`q0Dj?Zc^3e3rzsuX-+8VxJQW_Z^UFO1ie7 z1W(M#wR_?@kFI)q{|YXl7!6)Dt_iG&o;t!OGh2Pu7!AiBFMQ6GYaO=iEv2~eO>nQZ zYCo>u3ZuKZ^Zn@^X7f11dCzY&aW5%++iM#J18MfFg6^Y6vgtfKlM0S|1MX{y_Q-uB z#jskI28zWxZ0V%OSaSn5C*Sb8u#Lb*Gs!C?5-+6pLp@hd+6{dOalcJpM<3RkP5;iL z!Ck>lWq-&nd45zFdp|Mk@LiCQt3&VVcX|t3XeB9NW~Frniv=#bZa0*F**ek}sbw|J%D36JKRn~_s%tIQ~9v?3_%2{c;a2ti1vvGLW zIjI-K*uiDWT*}yHwYSu-1$Ekxpj&KoN)ObL(m9o~>CzGpo5{mgD3DITM+o zF@kQ6OXAt(c8&V1Tjx2C=PcpbaS%tSF)oy7{Z3O8A2|B)UMCn#acR=9%Np+U`D2t5M1H~BWn)s}BDq`FL~gok zOKOhLrpNZofHf+Rs#Jc2yildC5=6J%J!`H7F?*6coBq;fQXiYbuH0FlP#Z)#iq`_; zz)8S$TcX&2m#{xXF>6tdl*VR*GiS)lqxdk!CS{MSa0M0ky@bD?KP5$d<|20(P;5HI zc1k%(AV1pNo`MGrZlzx(B6Kva_kwNt^?v2JyylQ~mIhbWX|3fS3 z^{cxx^3yH@vNS@b`|j7G1-C@?Z&*7P+iG#SDaHDVdQs<1|J?jxk($2bt{|=kgpZpZ zdq%`ZerhTU-U}Z{llI}iB|--1!b!Dd$P7pp2*qs&$*Dq)K+^_4e29Z`2s6*$Wg>tv-` zJ1rsZu%SL0S@2Cslwc(7oKgGFLq<^W0+v}w=#&j!^7*VVzJOiY4Vuv_Y^d;b2zk%^ zYofLYYGJf>-BPQPeD!b@TO3m@HFy-HrJ2ubCS76+HV>iwleTrH%(QKBr2AMH=&G(= z@^lMV31d}dl_Kj3yiMjwI%Vpu)#{yVF)foiEzm#jgtci1t$;cNS`ra_`&VfhpY7I{ zwvw2C2(3l+3%=a1BHli$Z-K^P;B=a9gMSI=iH^K%!0(#?Ns}J%$IKEg0 zlxqpAHadQ3FDL`Ihdf929>5|M!LO)Am2h$86r_Nrs3RBi{Gw+7cHotc#%p4B`*FcJL@!|N*W~RkqoB&>YN8c)^bpRx-p*G0AX-}HA-5LCA9k*YSV_+M z2kLSkwQltBnrLg@kL;TDgIuR=r~9?wJL>x!EH(2_de z4|9k#h&7`_(i;Sq7l4dHjx6?`&gGEr5ol~U?`dvP_IvqBcmz;a7cMtll3p`f>!yNr zeNPWrY-0w49XTFD-dXCN%m9)_Pn_~~C#Nqe%h(B5)SZ=!cyAk0SK~hooh(x{c`PK8 zc0{l}jHV`bB3f}T$)iv8f)@+Ql;!@6b+Nkwpv5ot9%dJ4uMw?F6@-}l>^02-A|j9k z@^P0kOm|fLqEF@jquo#f-~=*kfVk>fO=deb6ZuAkr?X3*+)|LdsLkKC&jT~F2b2<< zr1<|>xJ$~aBns!T!_-tQ%9V8K?TKVLJ|CQ3Xff}78OyMpQ?*xGW4x`#^;*3i;hMe3pz$S=Qzz2>+!l~wQE50(2tU`%$X6<2N>c3oIQmfh`LXS02{}ke}`*bg8plM zdLPYu^8#te&EwB>+r(X!*m*zC_pPWsn@!RGKes?ZO`&(eR;OW;co6N&p;7zHyOPVm z$CHN425&VVQGi<>^Dor$M62%0T#PIL=XQ}b?~*^Spg3_Hmf2+5#H(1;hfDe9^owVo zAI=n~wf(#TV1Mx6oC?;SjN}wm{-@s}zs1XVTlSypXS?w_8?V)5=`KNTE?r|m#NHaR zKQu7mi|C3!Xt2K*8R-UB+=spx^6kCicl0hcyto&sf2r8fZ9g}+sWpu#OavFs(tq4M zC&b1s*8fkoV_RP`FBenclqB1LoA-d91~>89wPxp|?8~wDjaKjC8nW|h@_xbq5~A0X zK=$@{%IcJyCYw5-C@ezhhnyVI%d@su7`=%p)VtoBPHMI{niT81l~O+G?d$+ZDRyW( z*Md)~-ai_slL*_!FNAhO zqt1oN_?73aVWhk8PZh)$@+J0yhSv8h6?G)`d=JVQH>aAF*6(fC$fi6?LHVQ85NBnew~X#UV#%MqDs-! z!Y}u-^O$OrfA{$D*GKN16|5XT2o#!Fll_vJ$Ah)%x02W^tFS8%^Ey$Hf&FzQ4p^~! z8THs|+RaP6)k;#wOFqarRnOZqcijyQ>}i{gfjGCy6{i)3f1MDK>*&1eZ;ePiNGh(- zL-MZxvk_jA!$AH&(6hGT;B3nFzBC^oj1BS_*LYblv$1|jl9Xct{(?^7ZmJ2~&Tqza zjh=kUVUyhKbb9;S}vSgYDqgQ zWxNT!-Gk#+X+RVW2%9e|`)#RDTytnyOLHkcEt8pS)O3@~s{pW{h1p8$y=gB_Ta{0> z6}{Mi+;6G<5~LGWeA6_}iehM990SSHZV(k`Pd0=;vsBu)ur4gCv{moZz44k|v3s`C zof`_3!19_~?8?SP$J?9xzQWHW9?13^+YDGr$5jv9UKiqf*njT#6Wg%?CPsprs#DR} z>nZZm-I>Rxrmn_9!$)=f%v&qz$%1UR>pxE^whra;zU!z@i;ih_PFbgWIS^goGL9w9 zD?2iC2w|*MmrK*PasQ=|uG=6v9A1(iW+`ci{HhQ%^+yPHcb)HtJ453xCkJ@25WX~9 zy6WVoEc|ec&uPg~1*C?#S^-0pLC=8yp`PCIYqlW#M!$O1WIKy3D*ds&s_qrCF<=EV z+J5bkUaL}DN}c^!U|c4~JCs8|=gf(OUV~~v6Rat#lsX)G>kD^CwxLly@!nz5VQ<-} z6{71sE60V zuz)vYMmF?thR`y1ME&X$2GmJc$8^Jh?4ny%x?TIbcAjwM~sc;Q>j%)|Mpao z!FesD_&-!j8B7T$Qsz)+Q{lhiimU~8kpTyOZlt5o+qxwiny95;o$~h5%loSyC@w)t zP?@>Nf|*iM_4o1Zu2kCe*NrN6(;e@LiJ_KGxG63NBDbc)_)k|0>YXtGgQR$3_^Q#hD^kGh^6*y$?jD>eeK#;L#_EVD2>LU?AF10QS7m!e0YnadN$}Uj63M0E7xDcK$0ij;lj>YPl##TP5P=CRnmKaew0U) z5kjnyRKO2MHWMygaRhi4hsuk$xi>q9kAOqqYzWBxmy za(v?pt9(KBVYy94S*;^C_tPT^HP)*2ye7o@99q<%|M9m#OXT0*+t1ZS8~jxv@S{Up zxuP4zUIQ`VvBCN=a8N6ihYR%xlJuQR;&letM_ug39K)Ak{XB4g6L#)S7x_3jjC34l zFt=uLHKalZw14zbj6bNi%_%Yfn+Z<4;NN&a^ zoIJmW4II1rL3J~wa{fb)-Mm%!GtE8-Kojv+o{ljj|YtcX($zx(l?dcPA{_F6Q;n34cz_V19RLdZq=Ax z{$M#>YBdEh;_)Q?k3a7cE{0hjvi`_d#&PO72K1bP#Sa~G2V{>;do@{Hw{Wyd+vPw( zjbtbDyWGY`N`>6-|I(x^ z9T#8yXq#f>eBBamjuJ0p&;qzk4{O+TATgAjh$3xPUv_?6mx`YO@{w4MJIINWmLKbB z(Q)zd2~&cYx5WS_i~=VUr{QGgZNPNLNxAF#{?)hlqa6Qo#1HG`NnMJmE%KRvq&0k3 z7eRrT$bu4s-*CI*I-QSnEUsH3m>5eMMB_yE3f*og0`KQDc3qZ_v=V7Zb zd7ww$-$UOybWh03omR6$+fUD$w795TEc%B#j+>ma1s{pPFKYu3l1#iFDt|$X6$o>Z%LO zc_K`ArIBS6lA5Hd)0cymCKFqIX7tZdjFGyGh)-&J1~5&b#mmu|1yqdo>q2`xxGf^Nve$`|2~G>VKFB+%&I=G+D}>)(&a@VP_p(Gs zL6%wtpIzMG0@=i`-3opJr>?~11uA|%yk~0%I{o&f2Y=b%dqA^29`?-J(mWAzz6eg| z(m`-v2X?)d@JH)4NxmlX%Uz z$kjp7tVzF>TS&aET&DH}I-O5K(HtoA|KZddU0U&6QKLrz7LH>D=(pNLJ z+}>%kZxC6spv0FVkP_MLLYYc4Af4#QvayJu?1E%gdPR~-&fDf?cT*k-N3Y1H4 z`srJY^$-W(R5l1ix!{UhZT8a8J98}?bGD}}O6lnd|8ocrwa;JMa{)%X`K%Mb)0_WXMy7et1*^_GN zbygCZmyJsI5sT$~$xGwXRrcyZ5~>W!fC% zmb{X6?bj2owOhD`yJZ416huXQK`UJNZcZ%m+e8CuTA9htbOpm54LJ-p;b`~=YnKSbp*G-UM9s5& zY?k^ya+rVZ^!(svR1xqktS#7{tUOD%C-8nxL%z1?xMKA{?C_%mA{CGW%4y3vIj(sq z+z&(>wz8g*JVXai-93_WkPC*f9BRBw7WFv-uADr^Z?uk(Yo`FX(2BFE)Fj#Ztp_* z8j!h{bWSF}%*P`6Wjdkf?u02fXY~Wn7G>qc(NC?Q!Ln%8T@S)~=mF$FQ07y?n5DT=} zPEek{y+|yR{1xl*_Vqo6(fJ#cquMVwWL*GmdAHI z598`uMzfEj+tgfzZ6Ob#)~~;asj{h8C895D<_G6o5f3P&T$gbjyZC%ZnL!t;Y)Iz& z#NpGIgWyaVBnMe(!{_EJ}F`WwgfQp@aF^eg!kquW?HoV!qDyE2{JL9_dDiDMBlG;GsV56BysM z!L0}zKJ)bXkxQgDK`V8nhfq^p6cZ4uYwsD6V@Vnxw#Rr@FI_?@wfrAK)uW9c?HB0B@9LQ!X;YrXeeTk0={Ueyxjq&Ur^n zKR8%3WNs9wFj|EG{OlR&SWzz$Wq6vi<#>NwyKnW$2B5D81xx|Mq1GI9#3&JgaCuoX@oZxr}(0=GKxTQAD2X5oe1ROg8P35BVJ?}kJ=R&2iu z=)co^xj!-irHI5wLTyq09_DlY9$bNB;gisb2$`&@s}9bJC=8G=(B#8W&`;5S$TiGi zns2E8$dSNmX<%h7paI_Z2hU&DjMmoUspVeud2-%2JC^BYT{; zwna!5yV*s1v{Eg~`G>;eP}Ao1p(t0Lp^M5xO}3xB`;enKBB%eES?JS*FFug9Ptdt6 zhIN-u*z1r7L#6o?3j0=vxv&Wtbj9)S?w59EDcmj&gHn;>Vd9Ne zB=(Pw_6w3V=nSSN`(x~bxFNkfLD-ahaOlk7_VkZ0QHo7k3Q7~A$x78t@=Xuc5=%Gi zFFPr&kwtcRx`b0|p!dcSuYuKiJB?s1*P0Fn#c!2foJx1Lbq_i;?_0r06w<(}-1Z!J{-<5AC%FjM+b@}?S zAi%mNWn-cKedi@vYd;l;X3m#N4JYf{t;q#Dy5_cHPJ%Wz4xc8UlOqVDH$=+ zJM8NFMc*aWXnj!k2SAm{#WY8}&-MHwjZ3^>u!={SkC6f=bGznKjT%)w=oIANsg=chAa6XS5~A;Kv7NucXnI_ zy8m*HCtkfbSAAOYcdw3{ZA(QBw`i$%-~#QM zhYhU=4pUlySx?KBSP#!7HW{q0C$@q&6s(4A3y$v^2j>}^PH>*%`N-j>9sp`+B%Jt{ zDa26cxXLZte>I?_{5cQxp<^|T-L1gWclLvRRrq1@YJk>P3qWbiArE*>G4H8XA2&V# z5s+qZRv8WYQPL$-uH^~2$LM~e8ZIXN4N4nuuF~8B#$<4TcAHmYB4xinpc3Fq2@|>Z zbsW{YEc_!E+0H`nOLt%-z>BP#|CsZ&qwFYWJOIB^CRB~-YG<|*hH{qcg509qgYsE5 zfkcIEJf{UhzM|yjfO_lfQORI;-*s2XxpsKIIWD-hhK8w@7I$?LW)c;H58%y{EOJ(e ze@$!20nx(mFQs0BmSuMO9^KEZv3$M~|MEL!Y5lx%KKwa;!DS5XC7MqX@%7_M~WiWq&Rur2*7nK0D?7r@^H?vfAYmV=P;Fwo?r_Cjoidc<+gZMeSQ|y{&>oTJe znA>h>5yEA`-I7I?TPlEM!tg>rz~cxIjNj!F=VDByZ+8L zdTY(*c)?U@=ZK>A(@0|bsvy#a>$54gq{5!b>kk{+IbRkCy2u zuSm*vZ%zd>qT18T!;6}%b*;0T4*eKyX?oStI>@6vANrCXyScXxU|UY7Ol{FLS{@qh zi17wYclC}k3)fd?dz;pcY3@NygiqZq)pce-)iah(V8?DT@xJ-J&S;_||3-D<&c942CzoTS@6f`Mi-Lo&IzMk}oi28Dk z%8&8;*!khGSz%O2W=Z%nbmuYjJ@CO7{4ZDkZt>jdIhWvarJnb+39dhY>P&qGa_@p9 zuE^MSw8&s=vZz3Gj~|~z9Sm3z6h^M3Lo8U|hQC355?WB*IQt-5eV-y&4yTcyvgJ;h zTF}f!MP|Xv_`EXnP|0T?JQIHTZ4t~FdYk-a8AG09f6I|k3^Nll7tUS^<#o7D%4EMg zmV-jD{t0-P6ueX-Wo7oGWj7ft=^<#Uq{Y^>PmDYC__weJjYisAdkX2mc zWW+2%S2^hYc<58rYbW-Hjk_$op?xq}+_ktlI2IuH^%K;cVyk666ywIq2(l6i>@cuZ zd~zsdv@Yi+ed{hce-DsG8njuPSF_aF*FFV^nHu5|;k2Z^Z+j6hE&0fbu{(7-k+;Xz zRK?@KXzVMZ1CXsiv$QY{YxL2XdG1bR$p>H}@Vz0l#y*v5I!hA2gCF3rzHPf@xt5SWeJ9VU_)$*{x z=hI(Pq6Q(xR`tg?bL2KYOG9iTTH zRwmN2f4KZ+_Jp;3Re|@zsUFmk*z#s9uf!i>E~8$oeW~ec_h<##ZE?lw(?W$p5&1j;Hl?4*K~H``6`L znervW`?sqp7ASEYES}vomLRw-B`B{OvLIN_3p5w`tjj0Gy(Stoej|5Fr?+ccRGSW0 zt>0Kr{b8?_$Ri99r6Ji!AP)|ejVPdT5y8}4WFO0Kx|lvY<^K` z-(a<$e8xfxx-i(@Pz2TDtnOeu%b@nNSh-ai@3&?jmSK8h_x8*Rdnz-Y@mf^US2IyC z0GTNq&g{!Z9qh$R~dIw&YA z>1rt8TGbRBnk|u8_AQ}n*qfj7HZHOEj)iU;B9+oG0VHD`bErYN9uly%4I8oFg=I9} z!_^&LXt-yesakhE*)pU>9qj#?-?wUF%1Uv1YCRz;LGH>4J= z*K3#alBQ72+o)!c0_lE^Cp%+I7m>%ukk$D zz1RP8O!{Nhl?QYD0KeRI@y1xU{)PTw@TFkYQwsoKy8YX}noy5OJ+$N1{7o+0 z`7O~|xQ*nCrpw=*qLwS2KC5{8sgruqhoLBzoC93DX~FjrUT`HeOc}`gwrzH zCxex$ZyrvOLZVfjsM;g6M2s3G_6k~ByJGJm)ZQ@@zxVlkfB%8U1NZyB zuj}=CKA&vI9wljh)kUeT&z_(2S59W=9{KkypBYdi+I#cKTfSufT6jJ|`T*{AH0enf zaP*voU4MCC(&^f~jp&O*i23G3AsLX+2p;Tbbe{_^Qu2wMX*VO43syd^-x%mP|4VAZ zWNIjHp+Wf0e16Z*e~E8hi^g5S5V0BlV9w)mr95?4LJlFm^x*C;i7*vCY#XyXU1fx2 zEdu4EqthBSd z$A3z$T@cjnFxxcG(ykfYmGoGeI%6Q3&JBPUMm6I{KH@S90 zyF$A29AgD*Fe*iP5V~|}qI_%RRhwI;+w>ySE_g}X^uyd{+=`<=LC}X&k*z!Y1t_z5 zu3C^SPOjsnbOmTqk`v{Mw|p@v}BgZ1WOuIc1II8u;a~ zWEdSO7a!@)jfr&8?+0e#$|D!$D4Zp&!G6TKJRnd=gRtHBDSBPtm5ibo|ElTNmM^ln zxQu1At&1=gKc0}G3O;*}usj-Qo_yc)S6Gow-Ad+lWfilEb?WG+b=CB5G(;1sNM$}Q zYff5eb0@W$^P#ae!oh#RaOVhnz1up!5o3rqzv$@xn)ykL$8c0DZ9LHNAe8OZ0;1IcV=FkKEud%oe+wDGkZH?%Q7ddEU0+&;EJ=jB_xP9-6_C?u+1AnUoBST!xlIlK3LNI(jBZ; z+}IKzuHN&j@^l)r)%&=0q;$Nxdc{{?&+dg`#vZ+tB(JusEypZW*Vkzovnlc7j` zX4}dBhQvwR$>xTN{!I={T?nr)J^KY-@fa z9jsgNso_?xXdEqK6t;2YoOaxsHg}kJ67)u@4aNpT1rTc&$|^$}Mn9yK)T3+CSzrG4;3*p1yfU#TrrJTBWq z^<0fP(>Z4>$6QhK@>}mSw9HT%=K5@3J9t>@SH{AZo1lGDyx3%z-9Uj#3RY@Vsqi z#L=1qegK`SL4uW1g!x$7gcWpmVDL<7f4hv@+PP5cgj_Ek`&X2b^ptJi#r|BemglFf z0R*NcrI-eeJPV(nJW6|BauzOEueVp29z;l4AsRN^iAA&<3bEa$^Bw7EIzK;L`P_Mb zZFfgpT9KE-$hs&(SZY}4a?kjAB?a>O{k>fMuzDrQXO}h8^X!7@+dUAcOG8^hVm*g_ zK0hAuu`ek1+a5l-{B%3jk1He%qqe22>-PnR!uW38o$&qAFvghwZaA>;LE&&6D_ZdN zvHd%Z=?5v#Ni4mc#d?92Oco@I|2n!pQre{~;tuip{EOq9{rbYMnwdVL4)G{;sM&)m z??-H>B9M~8`wzu43+psxgfoTKyW}5{;1u|`@JJ`!r>m?!SBi?|Cw`J zn(?($qmJX=wn-C1r*o8JREHd0aH#&}?mflR!*N2Ce50-JL|F~vKx4R!sR&vmQyZF7 z{Xo$fa>cM`M^}S{exn}OhpH(Fjt)S}v1)?aY$2(j7*z#{7?GruL(toMmKFVd zU`5PNxegU_-K`;g-7;hyZjQquV(BgWt1H=YhBk56mll=8Kg~eZZIV0~Tp0g=D)LvB zGcoOi_6r?|%Y_MJ(qVvvX6LWdr{dKk8gaQbcoJ*eJWC#YFdqnfCxvG~brlfaC@obv z`0gVvbK`md^)8>y@(ca($?+G)-wTu3uzN^*s|{0Fq%sg3e`&!6$CkcdEQ^lXAirt}#qu4|Dw`M-0we!wO}7;wEc zDj!GihB)qb+EB?or@SxQmUqi7PJNjy2xz#6)%7`a1kP~>^yBLqMJLTa?=iXl@6c!H zHR?A4{-ML&<(9_1bw+SY^vQlSZzJ8KQT;zgZcC)z&ZpnO4FFW}``?BNyr)m*8xMdO z;?JBJBWp4=zQCyDPnuy7X>H7TxZ#KDfOXS*uik zZ9GiCJgENrl<->J{sY6XLi3KiVq=qsjXNQDO+(ikQ7fNJCtrU^GBPp zs6<}d)Fh^PDv6y3wh?h`rL9Qw(Vz5Ni0Q?zEvrQOaI&!K>Dx36m(P~q02_yn{@hRT z0+<1YNVq!I)y5AH_3h8sbIgCgW>4zN?Hi5O+w`Fw1TCSL*MGeJ%_nhk`@8RWc-ovOFq9o_H%?8HkvJ z5UI3%$GqV0M@ZX0dRxb=-m4y5{nl>~Boq7Mh9Wya85%^~{dL$#9)F~m>+$+1{=(i% z8>KpX7OE_r=kb=jl{Uf?l!f!3?T<$8ynp}fbK@Us$UfCoB#DUxEgg0+x+~ z3lP%0yf0TB^qe5SXuTh=*dk6Q<}ODJR|nM(9HnivRB|pGA`c;h_wrZi03b50CJJm? zo@Lzo*7lDxNr>5rdualkJp2;xwukSs}l?Z-d49}4xH z_g&Xj0Yy@)7L@iP;r%;&j`EL#F+)MEHg2}8F@tIEW+6NarscHC^+mL|90>-E?Y`)G zA{}3y1J^*+@skW^JY)|DPGwV7zJ{y5*k-+wO;ufMENHCtoT(@+l>gYXQ39Xd$AZ-E z-x^2ERHr?a(_yS~n17j~Y*yapIK^gNL%>@u!dKQB8f9h9BaCT4ZRK8|7+PeSeT{S0 zS$Oyk(kDgz!A->G4(XjL<941C?87sDN&#^AAaxI5M(;Ij&I|`g?p+%L@xuu$h%RYktc!MrZuyO$_PNmiHjQN@*$_7vCw zeC;!=c!8u$Z(hUJ2W=2(Q$C&$+D9VC@l~?B$2E{M)W5~2H&a&vMI5b1`*m+a;I6%V zZfWo~H!i~_({q+QRYnZC%BQ}&@!ELOp;KhYw0X_pz(0nrB$(+}_+yX2QHP?4ZzeJQ zdf7AOys}9nOYAR8rH1gC^(S6X1;~Bk$Q}Ouyyv-}6U0-?>bH}pvdaiGryIJ~+i@a468zZ6N`gi4Qg^SgPx)MjrxN}!bW8X_I@?Czq z(Vut3&)b_9>*5)wYN{gs`6_g#RgjSrHbkHHt6%(er{Dx7PT|fT9a7CS=OA#sZo7of zF`-tvN^@|e#Ui(&*QUlMUFic`*pBU0FA-c#NCktZvZ`nMQ~gn7G{#EB*p^ESCb(X~)$@q13@Uxa% z=J$MO((SsQ3&=xF@qKAkjp!Y}CZsbutrVgP^#*44xN?12M{7b(AvQx`d#pa_Xz+~W zlZ34?xr@`udngmCw0J?$5OCb*!*@I|X>atm>RV2Zz6t^EC9g@xLJ% z7+=kU1&O?pzNr<;O4keCevI$_Dc%9J1C!Wj?yN^$(%<@#Az>2bb>-x2?`BuOuGaB^ z)uB{N#uPxLpUcRI$7V7ucTaSNh9D%~1Xo{)q34Un^RDWIr)g9z8wG%xkQDjx>U=*I z{cwW4FEvzRDq~8;XQ|@=;Hm4Yk2hdzDY>-6lkUcCV1A)wFW(Y+R2f!F*P-F%)|(@^ zTTTuenZ*Sa(a_J2TS#^{UipiP$48KF1H#{62Trg61dP=vXFexk(78@$rz4eaf{>I zif(dVAz#bQV@_u-{)%t{59hhJq z4TdJa9pbt)@1xK$szB|T%m9)6|7ApkYVy0K+{%{U9eR02vkRM|I2PTO=gjEqUjT8r zD~f7c0vV@lr#niCfs2Ky-lsIY>+J1w5|t)1@Kjgt2J6WjV(Oj&P|pomxdDWf-oris z#UatP@lY@HhstNm-drY_4lpTmar2|)OYX!caqMK;Ufth#WXC!l3Fm|jAR@_1r+V~z zmg)9QNJ(>HFancq-w;wTI&*(j0<1I{R<^hrI>SVl^c(o(KY@whulKfxxI_`3KLp_^ zsA*JY&(GPqEt4J!3ZC!Rb8}C7RXoR0u*Y_T>s?<(fQ~9;y+I_6P1&Rg<@iuChE8e4 zl~Gi<oNOkV{>Cqv&@k!Pz1R&o}k+ za$bldYUrqOMm0}Jzhx#0;1B2>t=42deoMmkIYhcnusv#Z>a6BX@PnZ6A(9t-=Ivd7 zYCdHDi%oRv+uWmjB!p6>>yiO6SaB<)M5pJ$iodb5ciBZJ4&~Exm*{5fsSK;TfTJeF zAe8-u7=M0ZuYT*6(HsV8Pk7qZsvgyYhL~(?-4!01=d$Hr3T~>9DLi#1xhJ}`{Z(pW zHj3R1GJ&fgL&*3iAn)>(dPeubLely^vCPW^5w#ISu3k&LeBAZ2^U=(flVQd}sCORB z$mV3lS>siZ&v=>YE||N_x@rB#PUWq-mI)?8)A{{dFs`WvZJbYfSBg(<-ct6u2(@NA z1%7KDL(Xey482+B(bzHCwZ7dM^_3CtW%#!Lb&ivn$w9xxgP``-R_lZe+JVA2vvabB zv}Q*)f|_)6yC@x`zjp0E0*aZ!5*R8sL|TGhsjjYj*&&`1S%r#z<`)G- z{hXH1Jv-~uOF2`3J4ghG!sT3;2dkHJM}gx(nV{VJeR!l{k^-VzJo+ae+wniZ7fbFv zX|lhie-J!kPcdT}c>C|xGB*K5%>%nka=9Ax3-nRO`IdxA=2vN#gXzbafB56{j7Cib zH@MAD$=IGwnzz2&9w7O%w(NNkTE<=Il5;eSf%k5H;^Yzdg4m4Ck5vbCEtVeOexj5A z%SAq#b=4p1JA8cvyC1CSpeI4I4vr&ly%YoGDO2Kft^Umjb%M|~{$i9#Ie%UXWF=An zA;mfA7=HP3`HZO5NgL&jIsEf7;$h}uGr?{ZJCDXBTYp~nk*O&eW+t3(T5N8Bv;Y{^ zO>oLs#_08sKSz2G;pfukesd-PYC6LVt0_GvL?BvD3}&Y{!i>^#OvTY{mUW1_1uD@q zoAx!{P;-s)9;an?4w@BLEU+(-Tb`c6oHW;xxHJz-=mhQyY+Tit`9a zu5ZY^Y0E3=_vF#MyjqB-7I_EdF@ZpO0mcjn47zUSrt)av+d_h~|l| zJ1OQ3Bu+7wTaLc-6@Ae#7V_R>-r@Zs!-v|t!%MDeco3IL-~JKJ!ycP}rs5^i+orB2 zw+-MXTjuvE(NR5t@1+*mUrMA89}M`?V~z*rf8#@jcnhv#&Gzuxe8$x8VbN5hshkf%E@lnGQV$=#B^5US|S5PH=G`gT0jzmE->iTJ8r8#3P;$hmj{6 z5_-LZ?uYI^HLA95N{2uV@IYSkmwi;(m2vCu71RU-QKQ2DxYRDfSS^JjP^U6aOWFYz=_ksYgQK&H{E&My@`;4Ky zYw-#lLy=k12`^O)6PL}IDu$L<{f3eK)F*=GG`vW!tf~^enIg042u0kmvmc;qUiJx8 z^8pI(zf%JyE|dtX5?Qo;p+Ayqg_ABc3BU!;2+2s>otI43l!cso192LqMjn-jXvSYr ztXE23BlwOEu${kJWPFaqf_yY{f5liw_|7_sl&2D5)HgEbwR#45o+9LI^6^Os9zXA! z*LBtLa2n|Q$+b;#wN($9EY%DW&_xq`436anvMGVQ^+0U(gNyuhlHSaRykZueiyRzp zK+k<~ZU;e;Z`F7e%-5T>j@Xq3ABdIvx5;jgCC*4_0q>!LLa|=sTwd(FJ!T#psiHW9 z97wtnKnmN;ooZ=dFQ^;lj;eVuRnCA#6p;*)$M;wc(P{M1nms?}4P`N*UMrNsiqneo z_a+m$)X}}A6=C6p7F*ZJ0p7c`U0L2Ae(9<)3LU!<Einq>icclI!Ul!g& zU{JE8BIRE5q?)*$PW-_uc4fCZ-?mBZX}Jwm$Nux^yL4dTi*_+;pVQFv{R=AstUW|n zMBpjQxXw9fR68Q5ot?ZkqK4o#H5TqQ6XyEH4^C#e>^L&ES|NM~=R*H$pyGO_i|4b# zLJE>glL+t46Y|(oEN@#>x%~8uzx&&oqNWC58QVajyj@14!5{h}@UhcUlALY;37+&0 z=JSlpfRDHT5;oCV59PFEVPK>FMG4Iz3QiS!(w$iUJQjA7+awBQ^~76LEg?ZDSNME# z1xJ#R9V6SgeHY>{fz8J)?%+fh5ARwH0jb8!g+m34wnsYr-c)Vdr92*8JN7655qysQ zE+&@kRd|-CtJEuj=}L^>lQ2E=-nW zxP7O%F9#+32<|bOW?)qTDnDEe&{IbumZ$maSpNcbq8r&>2Eb7rxP~bd3<2uQmgQ5{ zj`wrQCR<_OQOJj4x~81_X`^sZ@x2Z@$T1JYw@xXZ=y~u@5YNY0o@{G_hLhx?=VO%v z*BM#0bbccNHUeN7O{3rX93?0Nj3rX+ZM7X9nT(zMiPZ0#92niZ6)dQ?kDYReyxEnB z=59j3OJVvN>tDjyV7nR;#l%CHF%1;cKEUwU`=uK?;~nDi@Fck*>`QPfGAU7(gDWYh z6_dCn2Q~a2LBD?)*qbBqR4RM45DXd^QD=`gAA$pe24>CB;(V!;IEm+VJ2PkNb>!l2 z`h>8LTm!H^aDn^f7eh^kb`-9fuCFud8}}v`yB#h}o-iBL$McpMEg8Xcj24Glm3v{5 zVV_Zl?#|f)cO`a9DqLvH@shBF?x=XwdSQdOrd^>4>Lg=%_Q3b3G3eb_t=Z$CgR5hN zoUkna#$Oc=60AlVj*G3mdQwvi}VSLj5 zOGRa3rq}AE7d<^=DdjTaJE!St->Kv;IYEU~bS5w7&#Gty{rUd<9P6BgXs<8}ROIYKwo#5{ z_$AX5PyKj@3`g--Nzah?ASJjjw#ar;G&sT-%%M!)~@mwB+*kJTpUc z!ZRPUs%)R6bxoqEJZo}CZ-H5Q>yMSx=A!PY4Z-$hx_%PC73wj>nkf=0@M*#YfScoN-|jwWFqOiq?K>NI>_edlB{nND+m|y zHXFK0i@TSqR&@4rO*gvVI4R(Tg=<!mjxDnOJ?a_$r^YUmy}%W0$2nSSnJa9N_sO#2m{n`|NOkvSMgqA8Qii_)oFKOf*Z zrnfTsYb({Z_*A7AHm5xw62wLF3eTC&T?qengG$O6g+X#bB_I;3qlvCslj#{g(RenO z@O(VslA;nt)lrp({73tYwc)HyFiMJa0(rN2J|5vH%fhK1@UZ&R5)n&l>P0^fk8BSA z=%lNBt@oK4R5OR5`Uvh`1TnN@Z(f4fg5kb!{)gG`O7oNm6^6^!VJug5Cq2Hx7;$D*i!6 zp`YObv6%l1so|@zluh~R7!$A2@~>UXZu;Mk)Rg0DPH*2L|ApeuWbb5~t`TGh?rCem zF34cg==fw=1@E1JbzxEd%VeXIKjMZvyyU>z2>RMHGS5@(r+@B(%%xNu}Sk35ON-qTw90w+G2aoY)@@=J-vN~|Muw`$-y3DX(Bp#_A=-tm_^qrLd zRP4zjH>tzJPp#+vrpz>37`qArCJnUV`)6X?{%ixx$hCS4 zT-@H3Vk9AlhiCcdcY|4QB$x~@tT!7;3Fu4Ela&;bWR2hyg&Kg6I5H2e22(r(7>yge z^#?qqHjlT9D;7?=!by_(dK7y`c=O6&bf`nfQyvqAfrUp$Mu z!@X1`swIzk*E1jI1!pv;K_hIVKf!)7OA1#QvR8oOslw&(w1S!P14@pAGk8~4ITLCY z<=Po}TFwTao76!c$y8ACV^Mm(eh?AT019tM-LcggsxRhYhh)EKy+M$5{L+Jn%q^0g zH98u7haI3lBs|ljf2aJ!1ny zRhJs=GBmMIHK%p5u}Y$zQ;=pBM2v#thwGIUGcoMnXg)I2Us(0j@s-rj8^4oDi^3VR zPcjaE)V*zU`P9IrXz1Nn+&li^X#U`h2C8pcp0y-sjc29Is6pZkjdF?o#_Mge(Lr21 z`zt{-t1z!`G81_)l6S8UFCNl={Z>BFM zS(%au(_1}bcsysi|p+1dOx_VQ8NUitb8UH5(m&E`+_mqOVT z!r{utmIY>OR=H)~<->%PBiHbHqY;vKZ~r25CSmP)4$RmW9mlZ7^nkwr&V#x&Hdv(q zoGoEutUgur)UJ7ICEaQdMs|&E11^U*eJsZ{Uv*_}h-j`J<}~H)kD4*O@2#aSto~Oe zn39?h51qkApVBW4jIG!MQcRP3e5>_z>6d%PE$mBb_rm7xysUqX==f6Az~Eb7_9_~j z%3hh2z&u7zA;ycy5@#O>`%h{de_Oqmz6YOws+L)~BwDt4hpvaVQ(qSgo%xOO7fg>QDgf5kHu1Cz3)%vButIf?j(jTCc0-(uUZzJ zO4aaId`{_KKP*}oVYW`~U!bKM=mf0fBKJ=y68n&r#vLU9sMGrX!dT+LQU~2K9C=2$ zgNiYu>+1E8B@~|;PSMh@x*5Rkm3cb+iBRFvEFZt`hSG&*#tPjmp&CxFu;g-TDn$20 zd~8W}B1O(diXQvJXQaNnOAyNujp*qD7RDN_mu=rye#_cyeFo zJshe+McK8(Rgt&D(9%OV6cbkwP%br>K1)mho2-7do+g*)iT!(3M}PAdLNFV+uqU1K z31W@|4voxqe;X-VOi`Wj4c3xt)4YGUHCLb7XKBctLca@?Rn9MZ1|m!&ro}dyM#1gu zw)qPiSL{FIuj3psZ=(pQGou!fm48-k_Sna?>o%HGTk3f;E_hV2b;TJ$ ze@e7;VDxQld1Mr8x7!d9OQ5!q{LJ7awin?~;TDnU{6D04j}0(G?I03<_@=UnOivm( zx1#n(tlwnrjMcN^RTg#sCgo{)M@5SKGX)8LNENu+>;Z$K@k#q84Kmt4vP`L<9~fFq zv16?Q_ssfT9EGdqk_BQz{K-PjYheBN9U;zZT<4+=md@#zReE}x>1~krel^s#J|Bde zo%n5F{=!UKvZQ^DQ3rKODV%onm-$#Rl4%$43PL;@bJeL3*Dtq?6tXf=g!w&gP`JhZ z+HU^6mr%D|#>n}NgfE`v|lCV5<9N2@T+1{zv zZyj0q?&`in7wcesEO!Cry7cLMj0jxIqRz-ei+S^C^2z28{n8NWJ=erG1$anJS7r6` zwCb$Ecu0)i-kOaJKBqQ7BDVzoheKULrna`_=b^DjqXZ}&iIz38>y36FIoS{9N&`^4 znWh{SAOhSIXLF-tP!O&e@wBK3sC@Ofg!NHfXzv}bOFmfJyk=!ZaB%a7pa|syq4!{%7xk*taEj`bv zL+CSqMaQ!*6e*0oj1K+NvWlhcI4;%)b6g3}reC8ym78{%2D=eQ6`AzU3D^6`XC|t>kq&EdW?sOzA?Ge#6&aKVb~~#;zX~v=p-U z?VZv;{&DoOG03OWrrcq_#jT7#4_7q<8{*D&6(sC`J6~{7Lf`fv~wAAJ!2PU>#%E;{V z0TH44;~7(YK3uU|@{GKU!@R@Kc7>-lRsHXp7oCt!7Q;lC)RP^3G3I}YSttTOq!YLX zGnEGZ^dL~sP16#{?T(2=t`+EQ>u!YOVzr9pe^FIhI+9)YeWohc-P4->?s}k9tsAnkMUB+HC?OZzOI&!xsJh=s6$u}MnfYs`qn5~Y|Y<%n}lme0{^?S`48&K~5Hf39`H zs#1A%cPw)Y=H>M4Tp$=X5Mv0JMfC@))8`Qtm9TSHzS1^TM*pF?L&= z=3J)?>k8Iq^Xr%ecK#!MH@D+@tG<17U@436ogUIN^fI~X^(CXGK3Yqjrkm2k3$2j7 z1;UQLyCVmHP_7fhR@puiV7_^E22RqiIFk$@#y2c>=aP8|X`@33uQKIH?lJFgFB=wI zy;b(q9gn9uY)Q(o~gZ!Q$}VPGA$HE7v_Lli!x@9b1at zskCsP^8N11(%q@B2VsYcPHDI77_m&UlKxXk)n32AWv5!KRw}NR#gOhI zKEjza=>A5qm9I?Fftx#}f=p>Zr)=4G>GPMp5aW0UzlHN0o4+r0>1yucWxt)OQ?~MF z#`^AtQL?qE^f&};*M(9#q7^}6ky)prGu?f;3?SyNvtkyz73&!-ed-xA0#@CKwM3{v=@W8iwn+XI zBYLaJ9>P{Lg0MC2Q4-g0!)bz4-+e(}5?WFl97(K3$j8-!;zT^N89n%hqFySipN(r-YeNs(7k zSGnW`*nymqH5M!)i)Fv!e&+!9Lm2MmWxRa5{lSS;-O4QbOeav(N8F$mBK%4^65t)B z{yUBqJTkNat`x2z?EGuFM6J|;3tmF46~m?-yEd4Me+o>d-RA#Vy+41N|Frzu$babu z#B5L^%L6g6S~ybjTJJA^V&U>65g&6CXC{pEYjKrOfXgYG3z`bFU;Q)O&Ysr&`*GRc zYia90qYe4dQMl7z(g1CRnX^-BR(xM1@%PunLQk%50y*C5d3@^@7mLS-Io`1)$R%!V z?W}7P@^wbbcnAQercyvtH+arXVIaC~F|S2ob^jO8MZ1eh?rYLLGGK8x89wQk*0bt8 zr+V@uQg3|ndDP&Rf21NOCYGR$&aS%!SStw0CRBFBs&CNlN<{b<$E!H597q-mihux{ zVAAJfaqET>W|7AM{gws2|2NM=OlqkBtXvJR*@noG>U-tm1x2>FYMs4DQlH?bG;n`48*}#Kt~K{|{4TsqwQ$k?n=G z@sKBITEtLft%gI&4NL#L7UXK6@*?eiiZb>M`n%=DPD$*N8a)o8 zYv-z^=LU$kpK+=}U5St!|KYagMXQNn_+eIb*bZO(ULGQ(MuNxLf$E$1($`Svs3Ec~ zak=->B!OauTC`RWW$Cyifh(j1TOEUO<1> zusqm>2-b@6f~hjNC&X?I8@y@^w;v!sH)TtzzJgN^78+xZ9l}sDwxA+of#AF9yJoD7 za3!3q+j5*L$Q7T=v6SO>m|=^ z9bA{F1d6`PP}j-*(r`!fj&9i3QP-?6!86gw67!mnjva+x?8Z$4-Ff45D&bRG%-J5?-u~|hpdpe>B+`Hwg;?-euwK{v|A)9jm=x@Yznfbk- z9~-#Jbm;~-x#hMJw+9qWAFftbul1Hqm4RzpRl@(qU<7}R18SVBcF8z|*Og8)Mg#F? zqh*{H_qTUqaeDY4vZ}=R-Z%irzo~gzwUBlo1+&m#a8MDFUU7QEN>hEukc4gxP%d1~ zlzkZFuoQPX3yaUfM5{vHuxaw?gdx%z|82I1`Id}#&Lbk4BItZxOka*Og{r-uPa~NSqkH{`GuU>ic$P;2 zx2G?r%4}0Ah83nX&$X*W!d<4FDJa|(e9~2rJ4;^a=rac*dv5;F*kZ3p%%y`mOB#C) zTj>>Z#05NI$wPWJj?E8Dm^oAzoTiEs+aISP?;4;~O3ZDwyuJ;3^^o;ahtC&3oXnAw zlRS_df2S=<>$ObnD4V;-)MDxYURRj&e({2urO=q&f| zMkzQk&T_dY4#!<@_CnZL^Mb>(FBnWa!lisPBLHK|N-p-!$cX2Cb=n+~#TC?gc0b2% zk@oeVdQFV0lr7Gr-q?=a7HkUB%#!~k)N`FF{MhS}7qs_gFPE)cEkrZ*bm~x{M*z&? zlNRxG#*u9v?9$M4LbL#GZh-SH9g-xj1V0~*H~=L{{#G?k=FyDE0uFqZ6g{vuLDGWVq_tV4)A#zSNjlC-G z(X6Gc@(UM8_9e~3P6wK`)R#5*?AJY8txwHsqxW>pva(mFN}V76$Mh);wp19XwABs9 z*6?WBX+N@<{7q;6w#y6l+maV(t>r5r!=@TOJ2C;d<*j%ZB_yuDfk;;>k4tZpy(=ds zS$@eu3#FlGTU45`(*d!?+QUP7a#rOiA*kTdJsz|HU6J2Y!wLH;Pa_*&ARo;Gukn1ct19QrU0=<10QoVxJozANTF&#ru(g5@IHze>V7FyBUa%I~1y`l7pB% zW|R1PySP!OZhySq-FqsEzD2bM1MFi1K)EJflG4!BfsE`n*IzM6>lW3sK}pxGR3vJM z!+3n3ozvgE^xg%?1w>nJy9n#aINq1O z%2>&x{T@#?geC#I0((NCWrDYPTBVXBGz+Eyb zwA=mGI}Sd$;t{kgxNc{2ilyc-&~a#&hbMJB5o|40lG0qw@$H^S8ZB6-5W@(w58_wpF1rykMT1o0o1re7mi-1f{>6TMCq+6_&l`mHI*!zNlkz0*#< zwFwTuqgTZt^=rY7e+fHyc3}&G_2$d&Odf|4l$70V@#J~Q**I^QY-%;+&32t}{0`0& zd!@MTXdFj!%nJ*#x;8EGXe6V;!QshoVu0>chTxgXdidI-89OoalvED+owPqxY+BO~ zb(6*FwrUN|aw&aNGb{}z)$AVlC{zh7S02bgiPJ|>L)cQR-*^i%oAE7B5JujNw(i|1 ztdQ}3Yq&rjl=J#1@_}c^c_--$|2D$tL~kF2=!#SD%*|fY9|nha>J4^Zls|xGR{%kqdnoo^pw&2J~L#M^#p^D_f}n`(WRL_z~)! z&gmcThdd6ic*$JgwVHj!V!?QObmvRhkHdxKZr2)(+|Yk{tGm(J(iwJQ)&Xcvy`r2r z%c9o7qWGbJ%**hk;~#ZKULORH=AgYb2_#W`42zp5+eH$c^{xr@Tj}3cLpO)0s$Q~* zb&~=5J6B`ba5?YOnh`WLZNSe6jF|8flmXnp$T`LX=?!z+hergxE~KAplj&1<+(Pa$ zg_@`Bxk{7sVok-l%&`0gDnQ0OoQy8)np~i3-*#s#$WzyWc7x|cpXU>2+6Trz<-(d) zSaN82wG-d@b`SFN+bo-?VB05dbeP)SmBP@B@qG(0uGC1cNQJ$^!pG zu$iJ{-O565TQGIWK`2TOnEe`qW*}bNZoZ)odB)| zweqe1`i6-L*#Ajyvks0fXX@EpM3_x0XYy&D+BX-1t+JF$WIoO?!Hj~rzJprPK5X6Y zhCwWU$acLuc^OP2;>S|{3wJMU8bM_s;t^tw0lZXH)$UK}QS2{-2Z;__b%r2bx8?e6 zqLL~`#@mKQ?HV7=TcwoFY)Y>B6h|BDZbT24tjcaPN7Q+6!`q*AdyihzVTDR}gWTG> zt&4clVx13xiOiRD_+9qD{k^-M#|HwuiL*D?iuT*|w?4?Z9yBmagy{aoJ+4ajvQTS|XY7Ph?hXs>mZNYWo`?VY<6 zdXcvuQcLggt6>aoDMC%7k91K}Wiv42#L?P*{&)7dwUVl;{ocz*Fyr(p-V`RS@i@`L=|Q><>coLzc`~3a<6a)bJ2uNt zfn2E7aA7A-%lL>q45IHpQy6Mw^(i;i@=;aNhyR7iE4aLw&;!Y3AAM_fwE5-oft045 zo6d|7lKG}5$Z`;s-D&N_I-!vh6;V1Uh7SnNwa+G}i07%l+ zdQ;Mwa=82Q`k%?!mXWLl16-cO!R#vSXqf2)HSQq`IaGWkGB#zpwwQ40xpi~r2v`60t&U-w|DXjE^h1!vb|F-5Vf-uJQUdOPgvG7!Va0H|I4s$jTKJcV{f1DNLyzPLikOOn>6m9K@aI&!=dv4mO9 zUMs-TjdWe_om|rWx9qy_tMMZ+vdf}h_mS9{fo%^S?*MNL`vQOt;mc;y^nezJ(DfaE zbfKq@roOhOz!`#v;ho`p&=-GG#%~@SfAiHiQ`>^<_@Lv)Eg!eQlo6^bv^_k{!kP^B zjUwyAZ)Bns$LOHrv+Sc>l*&U^0yIY;O#*Lyqx`HRaRMhF!|^30_+%Grsj$fdE4S6@ zRZ>RO&myd#T?(a31OR!Da+rY;OIhuP3yDIE@N`%@KXa5-{yR5+Mdv+Y`1D!@3D zAR#ubK*%lsSzN*TTWV;Y%E}g>UMxLp>q(1DDn1WvwdD^A?KyRox zYSwW;!HWpc=o6IV7{C~++tNh1u6xK^)5C3X9}WHkb7d~c%Xv5L+@RW(Fc zjP@)-ZLh|CIU=$3qX*qwQrJrRPNpw1;jv$u(c^T)ZJKeW_m!e!GWc7xQlkzu@Hxw? z?r*n6&ShZzOcyW};Mwm`vZIld-NifmI5%P=LrdV$(9vqd&_;0@A*(1n!V?1@duby- zZ=?O%YR03uJ}d*G12$LOe+ADZN96JH{NYy@1?AQJ`;+BOcZ!oM3Bgp*H4BX+fh2l{ zH!@*RTfuTk?7w6c=b^y-1cdc*7Y@DUU@ zoq}dTEDNIU#+vO#BoWG3{oLo?Q5>~7Dmxx#5~j%uL?o|Ga_LH7sExxnPpjy`o<&-Y zDX(dYS$gJtYL4C}{(4 zqLSg%wvTf>g~0c~l+Wy@z|SK}|00qy<%;SN43)*6%j^K|73+GuB8El^Kk3141-Xu2 z96}e^z%o7t78?;DFw667-#z%AYo1P+gzy;9#$sdis)3hE?^N@5BeG>buKHVO$s&pgjXrTDc-piewhm3rrRdgV7s&}mRSW{hqw9(e#l)H7t zW|yh)!KLmI7 zXLhW3ap(Is)^G^7-@3P3`CEgb>t7%U`7VuYb)DSjR-gY#--?+Y_{z;K*o#-A|G#Lv%|oX9Kj!Vpsr~5q3Ii)?IjwSGwlOYi0gR!zW)Z;e{%YnY zB0x9QRNW-mFAuXBNs14;B=7UGw??bJYOT?!*<$xa9C`82!GveZ-6uUR8RMsm4dE5o zR)bHd%~jOicxED7%8y8;!Vqdv?Cf-cdlO})DpsMZNppIuNbKMC20cku^E^c}Is=}t zH2Ol}BfAq$Xw<o;>G| zG_d>kZ{-j<;NKZL6~1BV7T!OBj*9pddAi)*yWH{J1slK(UHFXSiLYkopcnuojf4BH z%-YwlsKv;rRfFEmN0D5ouSjX>r_6tQCUyH``IjK)kKFpoX5L=q6U@Egz5MF6c8G|# zuUYSB)?1%p5^{KQ5$helR#8%)OwEQ}j}7@pb*LPush1DMRBPF*7zT`8f*ST2?R2G9 z==K64%o0A(!`%#!9ro@ob?pkAE=<%cep2r;{9Zi`?TTcuxnAV7;sYNI_8HE}`_(rp zI@-QN=oJi+mXT7o7SelH+hZn0!1kgLjee^G-SwiAY2e-=df}M5=#WH7x}Hfpo9#dG zg+qleVAXJdSPQXF*&nBe7W6xGcJwo!N5iR|FRyla`4!<8?!|!2Ym6CJl@;7VZ%Tb& z-MwgHc$(W>?g5t2HOQ>dE13-IVK&IjgC0JX{ul~*2gNVeHKkfWUR|*kdca5CN=@B( zNH_=IaF7;WSG3i({*_|^S(~e9R1k1rCK5VqarIiv^9bhr@!`|~Ng>6XpHdW1T0%BO zlTgh?WqiiWQ!Qy%-5zUIIQ37mXz>d&5Z;J$A#OkF|3a;pJ6$R25@O`3W8bQ#@s!6L z^ltNf>LzFW7#i}vIw+;OIK94QK>`GgHjZj2%4RI)OM?5c=~*F2jx2dgaj1m2o)MR# zMxn8_=mSd`B;fvZF;s{b3&Qv4D>P4E2tSuYqmzOGJ{Au0d%TskAt-X`Vnq#HA)q%@ zSsp%|iMi)6jf50QtJ+N8^H_33vrTzJPAPx~zE(|gJ}F-tJhP1(?>aW$wReMtzHLlR zZv;}Mz$f;JY4TdDVwoc;p5Ls7YS+Hsc`?jZGxt zk>&o4UWk3%q?4q{aSxy13uxb%AUudDmRfKDqJ)b2J@@_hO!0PfV{~}5`>68_dk-ZzJZ;FR<5TB^gROX=T6P7?0~v97H<>jE zeg0kz;ksgV>bl9;S^crVfc?1Ydw>KYkf6y~B*}Vx@?1-J_xKs8>p-fD^4O-Xj*ia3 zU)g_X-My2{=I^_wOlKRQ9mWQ+P3V-kqUj8`_(SIJ#$}RnL|0^PNZyr+@Tu6E7e|&l z6PgD{YyXby=CO6NEt|7j4~(E%T5Pl6a#tiTXtnx|ZM5#xF^;e_b1C99lCY9J7SeqL zdVCz^q~^)sfB;=iU0p)_d7OY}0i$x|>w`COt5Ore^%x{!X_!`| zQlVYFs^}=e`JvKuE)Y+U1<7t%-^;|v0$a%ED1^b?=Djp~&)&${ST;0Cd@+!-VbF1KGpj1iMlKY3&glxPMOyU7Z z8|c7!USScWBdkM!DK08LkVw9R`$QM~!wUnS0iS=I;EbOh_!?Pn=-b)Lzu4=l>e_G+ z(nhse)&Y8QPSAoS9J|m_s~Joy{c*k!5y*2;s?y|@9{9SvDxyzwmAZxIhl8;LkPuK_ z%GuC|4(xvIr&nOVB0#Zp;fg9hn>ybmdaS&hFYkRIb?6CekkfVn_XTa9^%gpbi(Y)$ zx~Un48V$9JtX_>^hn2LJcGpdN1*vu0TSUux>sdHgMLAsn0gYOG*HN(Fwh#fYl2 z8*9L4i93ELxNhog=hGuvUPgv9Wl9%+McjYJxoD!R?)wi17EQdJ5Q=}Vbs2nF<79`B z9KppCuRu{$1C$=?TzU}!yT1X&eg64Oif9>Rz);)yIXSe=@tW&{9@mxS`kM4woA3>& zU>2x|9GPA`qp_m^j7W&+;W26bvMKm3?rK|)xv!_#1;v6{KsQ!UJ;UfpQYIHlyLc>A zq%vR!=Emzd-dujTP}eF(kgLg*-ciG7?lm}4ahi)?tGEBeaAHA(nJb-LfYRyWiH$+9 z(E^KnXH@#It0vtyO(AV?Z_6Zp_CSOX?`bBO^AcncY^kXBqefpo(k6R*w(OX=U2krt zZ|hex-Uu%20<<53+`Jl^ym^n+;wf}4O|z#TgSZ1*I*0+5uq%#`Z9fS0@Oj9!glnW9 zK^~+P>PEiBBnHtrFH~MjZm8PO7rkH0Hj_kbtYRvGe2?ecSvt zd)UQ8JUX6vN!`{7hLj?FzR?(!@k+Lje_bSuf|Q68Lz$10H`^4ynRO*6D0C_=Dy=V# z?;eO}nNvv-F2xDu8+zGB4(`eV2cVAFvqg{YnI7g#HqL5FUU^e1nDcs8BS|28HY8xS zV>{nyc=DD&768$SErNujUkBtRP#OB&Y#EJH_&`+AsxBsKBh70vWgvQBRfSRK^)qYx zN1*t2z?i;^5jqY!HhBkzP=7rutnRvrYJzmrB5ndog7@6iEen=2R>}l3h6MJT1hc+W zcP!Oz=dWx6uu*O|r1*bI5L|kPE`@%oh+XuKwU>1Mb+j!li|5PbwGa;X|9lPASQPKz z^eZkHx;x%}EjI9STnGB?-@>n#j@tgHNqDo~K12Z6u4jW9YK!7->)}|dE1ddo+IUy+ ziB&8e(QeE#{r8~lqwi4JskjC2xchCvn{CLX=yb~z+6(kRK6_auG~yPPH)FsFPq6hE z4A{dcVoq5v6+Z2XY-j@a=~A_FVbm(@{}lY)ReHm2T+YqsL7zDv{U0SB^{5J$wPYiH%A4b((Q;e%|0^zfuv3! znbh>S>q`~ilMWLlV{2&`E2SXPG{F|ZtiU#0{yBT_m74uTSq!I$G6xdzu2MuanhTql zz-~=E1LcK*UQj$-a{5hv)t^egKK))Z?<)GLo_&w)p*JqB86*3h&%DHVIj19^E(I;Z z8qfs$IBdbD-N>j~t9HR%%P6{oy>1%9xW=>}WZB7t)ZaH8{P3`@|3TK!@=x8KQI}3W zwz_9l3MJ90xHMHqO8;I1ISTaB%Ioa1FqHaBhGk!@ zoB1K_v=etip*JfCU0C8A*L&5Ys2=TL>KbgJL+XI;K$(j&(ODTUx_6a!(1v`tHi2%} z?7k7UP2+h2?n{1&;Oez5j@MBs2KrJ((~9c#4vy1g_ueZdi{#iHAK#Xj1!yTNs!j*& zF8(ZIyej(L>iD^3f39~Yi+p2;aYt)@t!nzTwHqFb;w zS(_wN*A&ae@Un6jzNMY|X7X7p7Xq4H=Lw3%(?ssV<<6NA=M*nM(J`!J^DK_V4-ncL z`?VY!_pWqLIV;^xt&Z{*MT7j8@vK*u~sK@;ki!YvN-Ap)rfc@k3%zhtJFr|D2S*r8gb1 z3jAI#2i9o&1`Xk;56}=Y*+#kV&;0vL|&jnHpTiZw7{% zn5PZMThIQ)e_*cFxUwV!hFAgO! ze~rM~vvd}}EtuXG*6KkBP^%$=f<*tarl!NNAB+naC4<;?Yo2rSdWNC9C`)#!g>>f| z-j7bhR2sphaG0Fdok95$Qwy_`ghr;)Y8qk%wf$Y2LPu%?#!xKE-`^vvS2;~5*8EGy zb|_uP9v1IWkSUM%1lCg(2rGGB59*FCK|}qLsThPlJ=g<+4N`iM?b%=$O(w-Yffghn zsGBATfL(;gJ_+g-N~AwYq9a{BbNG&d>G!kKT+d* z^#9~(Y-l{*vwoS>M9Re(yC;na&a?{}f0}OCn-*EA?pb>Fkn!~Z7L5$h`$TMhx<;pn zNQrhl=FLqZF6E`jdhpuvY7`3om|G~@lHRw7uFVbmYVe~m`=}Nw}Z(K!_FsH8HFGJb4 zf1{|qt@+;@qsp8&)v%3@dchk9>tE&DWk?ae#b1ouexD`oUtOu zaXktX_l@lrxW@O%EdmXV|653V_HSU6xGVv*UDR;vAgcNIWt*t?oN~W>1SE7lbcSVV zTJwhRyi~#r^uP49m9y3pAL!wkSMi|E#o*r@0A0VU$s}aTxrg5fd%!LSbJJ33mPLHK;ZxWL>_CKY$?mVM9HE)V?51IHte0kp2 zi-4C-2$o68vKv${lUARF00dn?+bk_z!RK)Lo4Mp}5p^xgsfx|y&%q1TLc~i6 zsTt9kpAK134_<x3mvgc)S%qe$dkFLPLK*2a< z9$|$uTtvWKZxQI=&<<)2-+Kydv5ED>hOh~arwPmrh}o#739YOQ_qCOVEOuuaG%WV} zU&+#Do>u*n_@P|jGEP_Z!dS~rIDAiR9EBQ_6T&(orJA&dznU~uHNONA zr80rB_aL!s+rXmIv6nZoKX!{0x684A6|F}_F5IZmUcza+2|vy0Yq*4;TN&(?NPl+L zzI6`aKFF5?Ke{6#Gzf_#92VSUTKy}jC_h>;n$o#Lr}UydkUhXx32(cQ`a6>^nnKpm zpLA_7_cr)~$M=WAr-oBlCKh*SLj?lz)w;GxO~)g64Z4Uf9>u=u%oZ!=n#IKrYRx18 zx4~OGp&;W-@cbiAP30BF3k55wR3N@T-94skpzzr9=*$nkY8WjWRUs{qIjrq5UTGv- zahoF}F;_cO=|h|o`@1(3u8RzYYc_PeSfa+9D zb|r3*{Nq|5J%eB+Ab+voPaWOI(|%SCa5{prVe&$vX*^+E>@NT>xRhI@Mv>a()$LTE z2XozD=g+vlVSiAiHLqQ6nJ5#${)l#i6JxpM&m>TKS!9Y6uUw|KsH@@l8U z&9?JE{4-%FJ480Ic9RpL7*6)SjIzZkjggOiz+w6`6ueHPzVz?tb)=`VZDO?k;jLk2 zvTHF?Up=h%exCR!2eREG>F_`r0yY{&0`VnloEuGqi3Z85Ks-(}qXGaiGI7=d7AM#tRP7Lhn< zY=@mW8jdqY7iuTX7-aVFbS?4Nf{N$7k}NpX%b6B!1KVe8*Q*bog0in5^uClU^XAg9 z#T9{#tsBqz+WKiGt%Z36!3?f4^U?!sVYwi%p0FDY1mC8%etPLeZ;8sVj5X7_CcA4{ zba7V#z!%1vrChquRqXTA7IFA^$XaEQPHG8`&)1JB!7r6;gUbzVQn!{#k=_j!Q=t>R z$GlT<(yCa!_{^SsBV(7w-MRHSVQDGacbO3~P*~@l6!8jsQ7LkQn_DI*F6bVY0O;X3 z5#TJ9>KVcPAQ6Qr($dnXkzH9q4DCz2ODO1aQf3Z1wEn_XRcvpoeY)(@vi0@%+%s<< zSKGbI{{J=#9ZHP5mS%+=TA&7;VYSQLP|o5LT)5{C3t?>Q1P5S#*>m&1d8&QJa!OgV zIc+fBQ-P#LDKY4PaLY7BC1=ObyK_JfrtL9~NjQyZv%`Zoch=md`5!F{xKorcrB~kz zkO8%@+Alzrb;~zZHZ51xg!XOPbk?7iuC2Uz!D-HZ)nLmxB_L-mi05sFqXf@5%X|0L_4JL2l*_0XA9vrlCIFBOye2 zaRsY_mO$5mi;{9ys|5zE%zeP!j!>nQGs-W;8t}A`9aN0XP?5u}f z%aH-ICCde&Pn=3wK9ct7y)79n$$pSb#$Rmb(>{MmPN?b*&Qg!<4dn$}MjyrX2LChU z`#b<)>2k5Y6zYe;rO&zQ3Jq4ViaW|4_Xj6Ok~(^`8wnq8nwMJSvob<@^{pj3ksLi} zt<}k|cN&Ro3&ZoCgqI%Da-!3aFME>^A&uxWFpXBerbPj}{RBKP2k+xj(gQic^<>+i zXHBxUR;=d(XZ`bsFK+9>oM`Bu-_ubSLwRR!PS8ln)B!E0Rs=WxCZzWv&Sv_& z9E2iz16QWu#D0Fug&v3#ktRRn*#_c-JX*iNGpj+8a^79tFhO2=tmqoTk^w^kA3rf z28Ss+_)u<1l`N$iu>Kn-hDwR~PJ6w`POo8BP5z&#)(@Ugb@mnS3+el(^5iY~JouR{gvww+qVK<@#f#b6l6^rIf6d)|=hPgda) zq6hc_cDLsirFgdXYLJnO=aiQ}+7u<$lQtAEGe*IsbH&R<%f=MApaA6g4x2c1n+ zk_FZ@?ItvtEw@Cxm0-MCxt{|M5lH=^ou66c{n~;k-{=b3EdK?gMfI+N9xD;upZt!=$V%%n?$`bwrvljK=X>(2n7mXLX5apEe^-v!| zVgjS%H<~9~oVU(a8c%B?m<@2@MwvWQbpJx5uAlC$a(4e@iXtov>&`)Z;WY5>B=c~| zlouYK=JX9Mfr<*5dJ`5yqAVrk%iW3oJsJJ+3SQ)YB|`}7K?x$^*TYOt6n(y*4{rHp zsy`p^_K5dxt(XyYu3AypkvEqMoBJ_9g$jVbmGwLw`5mlpV!GJuGT5;Fj=kp#@NsU4 z0_J^yd`x^#Guxve-qu?F+6lsH!DsI#=V?w4RQ&~;pH17^dRraad1TnB9Jhdyqz(~U z_Rmhpp2QSuhPsCT46VT}HIbqn4wV@V!rn5xG3(l9p022 zC#1M$FXv7CJ0)UgFL|YtPEZso4`I>~zP@K-fgz=W>d#As`KMfJjuw9;>t+2- zb1>Xo3toLM1hvbKIVXEcxGw|t2Vgrbkk%~{yB@NJYiYS}DI9nQFDvfo)9NZG4a<(_ z_@VWDC*Hb=cAA$1l>NUd`yQB8=+o5h8-lw(8en}G>Nw;tI`Vhfgh0UK!>ApB-~rN9 zD3`TO+dw%xRmtl7>MzOK3Ig%A!8}ha7DoVogt=kAfUUk-y4U?MnMTq$Ou>Prhd-O5 zWb;6F)QX}mtE0D?>-PGr87M_lu13y>nO9n)uL>5J;>Ut=0Pn1$5#o(4O*&uoDL)2w za0MWQ*=_S^9y4Q1`xc)ITO1^^lFTPEU~BKTHz!zWYt{8)(NP?Fs<5n{^}3=UJ&ySi zP#ow&)Z^_S1x8Y+S!({J3IfzG)H<@-%aU=LfR$pJ=6W!{x`{CCH2}ezaZ!%8;WyFu zTcQ4sTf#$(yr_%+-rSp7$mN=-!wD}Hgcsl4+OX)TrYEAyNtvlm1=Utaoom?$t-f1P z4VJ)fqTLE~j7|#GF11E8Ef~ieqPo^|OI`TFYXKRaV3k?xe~&0O34NXNLL09#?cnh< zPb>@A9~3TKlpZ7L&>%2>f87>G(Zf80eX7?K1>7MEhn2l!g~!Y}P{gFVA>(7JKVX4;b6; z`R!wO;gyQ(5s<@`cY?V=dAybdvJa^*iHk4VGiE~!yrwpVP;^!*W7K)tR(jOSI4y+V zl6`^ZhKsR>6)N=oVfRxgr#$h5gnb%c90IQheD9$+Dz21w^-YNyhaDf5%b-@QKInB1 z6S?K#MWA<@oajUXd@zbn>5!8yFA)RXh-rmy#nR}vo5(tHbp^Vl{1H;)wfhvn!g#eG zW6?<$yrDI}j%S8$*JaOdUlCXLD+A>!j|YG9Kw=5EiCX9`-B4fW0&;O|zcz~ZOUouL zJZpAq;8nUt-O{t__Q%y?NyLJvxQO3-tKSS_H=cna@yPKsAhDl^Kct5onWqhWCY3>P z2NV_m(T0J5Y}lw*FAq)Z67FO79JI3N!@LV=wdLU4{Pmi><*D8McCpr7=I`$cZjx?M zf0sEeda-e}E<`}d7O{ZUzdo0lowQQop7yck>n)!~BiO;c(tX`wodhB}kE@aM!*z5~ zS7~##H?B0T+fLRcHEbp4-}no6RUs$2%=SPs(6f8hbz^ogh^zrIg1 z%=hbcm?3O=^TrLStJHY+Z-{V`IQ^-M?;s_rw+izIhyxJe&>fq}z z^m^<#=8*NV~Qe-Yundn%9nX>a&FIX=YzV#l9_^u z`T|3*MSwV9_B~$XVPrv1Jbpa$%8okX-~L~}7|^v$D`$ELj{PF)?&f($>Z*fR=J8Zd zJ9bRbptFaQd%v71DJg#8oVxmYJ!Se!taAB~FsFv)t0{76|Ka_U9uv?vaV?PnjeGqO zF&c2r0ENgPwMX*?6D{7{*0!xiUx3TvUna-_`<0Qg%2P7~CJR515>NN;Pis=wnKgJn z1dz(q5W7$)3oJxX^iGvxsA$QsSq1-Bae$`)&yL&9^pq{r$t_oI^AjF#^e6*~xr{=i zv=bw?bq2r!Gr^cbv@^*}_KOOq5X7&ekUm;jHC@c=kE4efQEcPO3TWNzANSd#gmlUc ze6c!yAmW8Zg+b|X*32J%gJUA)o9R&ld@DJ310|}E2kgf(@3M5iPiuYw#mU_GV~64{ zuMsE({n1>q-Lx-c{(Y)#LI0EOEVbw@B@YSCd!YY#3RT=UMnq)HAdV)#0CsytL)ynM zH}lJlS9&4r%08*YLTz-{b+`tK_I5%1?sGo@(ub3gP6bXANoMT(E|V5(X3bGunJ}yYCZE^R;)1Q%?ZK(64R#Txs{~ad!YLI z84N(Z$I^T0xRbW|8Jz3`)n7ogQc?P1D1QLKE$C;%s?owBZOh7KsuM{v-Ag11dz4l@ zbDj-Ze8OyRDR*YKofYp7dDoybG*b{DL6fWNX;8~T2JJytbd!6z|7lb%+k~{XJG$Ky zPR7qaPs$o}#5_-#Rr(po6XBC|7|J;H?Z@YaW5J9!epB8IUGk?Vi!{=1UQ8gl*F$R9 zh$>Z-Wec{_wR${GRM?izg%9e?%Z$uLh$iNvlM@NE#Vo0!vEiV3Qn@dAL3x;sM{MjH zI=Tu)$Hh|U|AQe~`O5v{124KZl2?DfYtcDnJX_zl+dm`z&tpq0S>rGhNJQVdzZ3Jj zP1-c+s=jl5DRB|I#9}YfcnRhZ_@O$8Ee;>Ll*uKMmnR%SuN*zD=`RbH9ZVY&pnW!|(Cp z?i!N;M0SB}5AKtVfJUX-azJ8a$WecA`-d^$ya+Ljyj>|xmk*eO=H zK*6`{Whb?_**fmoeNWlSl)KVkc}VbG_LtAlZ-b8v2R5@ z%*VU6pMu!y%+5Zt_L^=#O@HJFWf)UN$y=IC(8gqH`#z7+C+L8QtB5tvr2En-uCdZr zBES8;*_@B5Cac_RtoMb$3pxGnrxyfdl~G^(qe`xWnX*6YKldiQ;|@wS=-dkcuielT@EH(u(3havKx$G&Q@ zR`yQFj{Hwq**)^Bsvk9c6IXYh^4UqDY~_0`JG8xOWING4lKOIL{ua~%Kr>eD8x$DV z(>>f>eT{3_=HLcj1NO2@yOC??H#QWcWqJWLsMPPp!w)GnmmVgS zrwj!=PG=3g&j(ck9=woL^IUdAy}zC%T(qx|@SNTc@wb(guhgcng@x9^vA~yjPyBpd z0s=9lAy2w`m{MLtY`$b*c{nFEuNTaqzl0(5Hz0TE2-v&J87#dI{|+9mgkF$*dJ6M>f-^v`z+l>EW;Qrar*^hxS^jYHQn^~1_AuwCl(u5l z2jxXJo1kB`Lisq}yv&jy0^a}&(82OXaPURGceMw%JIRE>;9NM25CQXPFm#|_g=nH{ zzoM0zX*p0G@Oedwh|4+3uaGTt!JnT)&|^aVxVR68_2$8GU+-NlLQCx4R;7Bynnrh0 z*j;CFX5lRqq;DXbq_G-&Rmn0!W4Ulj!bLnX*QD=<)k6%vj*9(JP%YoE?BM=Vm{=~{ z>5Erg3Y;$S1(fu|J?^+<;ZG;edP0zMG1ExOYz$H9!Ggqnq%@T4{&Vl@!kZIo(`0>7 z4fzeu9IksO>-~BGsK&7G?QAt-E)Ao^Eaac&F}O~0l?8_})!uRA~}ws)x}&Da~jK4&FbgsP0&& z|0c%MiCtbkxkoi?_4g}<4U7KZmNX)ew1YwfW379Z5%}^M&sTkCDZ+RWVWrnUr_{4D zgcR$LKpfI3kH7K2^Ja^1jC?sdH-D>_+*C2x@O`G?7?iw8RmWlDUYG+TyS` zd;ug%)!^AToRdwsjPB|(w=Rhiz~BFis5vQ*RW}5)OI)pv=B%FloBg+Ie3EI{_5WdN zM_m|d*_fFY^O_|!y7cmk1882-^-!3+XX!_~W-hB@McHWRk5#uky|yN~)?e(w9^ z#>p)}dmiUDma3>>81vRSq3|~AO6uwnzG&%)(@jA=3!DM9$Omg@&i==Vm{ryCayKNY zVM6%r!viOsW4l9+9?@)7XEkIL7X6;vt=s-vshm1`P;~8AD*5kNI2rcmji+=X4mz+| z?7XK~77%|=1lqjN7*y}JSv~Al0~~xKES9G#Xypuwi{wG!N3s9YhC zUGN|_a%s7p+8c|6PLZB%A;yTkhFUK5Y=EdIG0&0(o}>#?K$kfOK-n`cwY1()Z>cT8 z8}@-78-)sG4s;qTr$PIzuPEecgRjYAy=9wC>^Zz{w-kn$@OD(x9osZe6^yynR?72@ zcO3K?P=#HqED0Rv$oV;aJAC_=w$BXrJV8Iq_8{VMXR2&Lq7~?-FXXT~n>Xb-m?%eo z=GmEqP=E_~!$%#9mv?_{-;^=Xl+r_?prHpLO|68s0vXkOLu0IQd<&iE+3D0|31GZ! zSBX0qKy3_+{_YaSFbhiw%>_oW4V06BY+qp0j1Xr6;4P*SRxiN3PyL?!tS{%B^h-_n z3>`eMT^Bs3TabLmcWlS5NldyYA%q70r+0CM5ptpPPKlbFU8XdT2&ehr8q1}0mb|u(Cm^nQ645t$Wr_#0{oRvJr)-r}TPV zAJ8)#3_`78g_{Y%Jo}TXV$gX=V_>E>11IZ!^<>b|&k_A#)BN=7OYW>(gPv3AezqgSPX21m>FSjlC{=4g zasI7ydmVC!+l*yT*=)l>xAAwPaJqbC@l1INIyRV*Yc{?IwJS|6?|E5Kg{w6zzUnru zhPted;!gler=PTINXAw*CH-6uw|CXe4*KBI_Vs6Qdt*(Wxpp6og46@n_t-gNDtBf} z!kmh56a?s)bZVyo>e6)90M7+bx|}cIeej04#o@*`_rv@Phl~8jZm4AYH3{@N!~%)H z3ZB9Itw*H}Wr~>^pdkRD1Cv1o);yF__NXN=>V$s0GDiH#)X+}A%?8^AvX>9S+)5d0m4q9^lW)EjgK7 zA2tkY17!f~Gh05gCp$j#>+hwOQzHOn>Ya%22fl1A)D5=Ewi))FVveSyfILh-VJH+A z3-PpiBghuJw`9s*3{qshr#Rx$+;|U}&?2z>Jh7#QAEsZMXOwnhDanZQ9DEts$u96( zYy@1w{Ai#l#-DfOs|}OOiv#!r1K9*N(Uqo1x{he`9p2u484TS{ex_%g+%(X`x}q)$ zQ*l`S)B<^aoi@BSx!`9SX9GF!YFw>5kWxc))L5AyBS#tnCIBKS!`qtDQ>v^^!J3^y z!zPQQ9fmYq)^{yJWn7~!cBCP+8+Gqr%WqovC(p{$!o)@Wu_hi2cU(|9um9>;vKpiL zK09r+kDCf$ON%&d3R*Y(fL4o^HFc*4#-B7K7MIEbH&nc;N^s#*ccN*5$;V>K(T&mF zJ-H=;3b82&D$`0<_p%E#^5bX2vD(4S-#E~R)lzRkz|VnwOmAa+`o5nTc-7grO+v%d z`=HZPX1b)T@g$M1MxS~t6ZPk9RKU^Bzr%Rhqo1vNIxkowF=yGMS*R@=I zL2rYi5_7-&zD-?mZl##P>R9#BwepG{yr?0)5=)Q!gsF!_4(t%Cgb|Z4xINQh$BTWv zY*B!<%BMeX8i)|jEA1fm>jBu{%L>ZFDo~P}4I|E1)xMkR&PUcD2 z&&EgIR&EkK1ugyTCFtK3wu7r6a%TS7?3PV}NuOql8AuSU4i?hAq0b-t7MtGR)fT}$ zz0AJd6Osg(OM5Qag!w#@pqw5T;HxF|-$r&kQQHTU?L$96Rx-br$UfzOFFCaA4*q6V z9Q3TuR~)iiXrt&qsyX2m276A0&FdQuNkrUXCa6fxOV_#A*mZiV*t->Ku>U!`OPV)_ zo-V{Ob1pQQG|J?7XHFGUx4Y2X@034Yk6+3pmZ4dnMX+2?ODwptDMUI1yAU&U?SI5I zMpK}low~3qX8X`e+BK%j<}^5Pt81^h%Dzi}Is_s;?NMBA~(BpHU^uv&)aU@HpMzLegoWR~;z6-5|G|Wqw#U)a#&L zw9}LOUX(z2uyX6irZMmAJTm1@w{pROw$;qWN@!8_)vlKfjTvjPp@NNhmv_#@-cnO{ zTJ8H@qqps19xP)m?Oxr-EHRBAMC|NaLmImFIspZyv028RzxU-N4HKRujlFoZ#>-qf zE3U=KHiCn~nM4e-G?lC(=$L(}Cx`EUN9F^%UQqmN_I;6BTV)eS&z28N;o;^t2*qxG zIiGv^yWj~YPg>+sN1ONq9pqA}dgwL!4Fl4T(zo{@*jP)Oo<0E`{qbdMt;NS8eL9>^ zh5szpyBCDs6m-}t&(mkCCafh7-{@U>{I-jGFth5_LjCaYre){PKubxnX738Tpdqgr0{6Eg7q+h0B<_b(Af?BT2yk_7s)_2Id5%I3qxC;&NIo`9nOPW}$s&Jp-M;xhy6Rm%ER7-*?G%e$H>!{?LEP zgH6MQFFg^JbduFO$2P+S@Waib2tB1@F}!Rt`V{y~!ubGGrOM%cm?frqajEAf#@2Op zr=(NwV(3kD;Skec$ixpbFM=TjFi0-CoWxi&V5n+E{We&JT1Tm%BTCi&mQ>_RHu3Ch zDV0u~GO(0=YH>+Og=E{O>Fdpfl^0+y$GY4xTwO)Z$&n?UWCN zs-WxTfxH}vg=1qQKw^l;zDon!>ZcOX=-rFjf<^bznoB85Z<`MtV@QKlnZY&rV0h~4 zqnI^{4k`DTd1XYOLh7gKV#`8R_c#*X!}6!`{*1?21xfZG zd{ptsA)cvYQN6U%d(1uVubY%mzJ(sSfg#$CcF1BiZ+WNdKdLklf=~=e# z4ohPZC!10ba~~SC(uF!05N`h!X4zx7_rrHyTePk!LvdqK)yO$Wngsd7VacR&IV8M= zDUSTdQZ}S+N_QqWEjJte>LBu@*;Q1b866J+xAtInD{b8y`Dz{x3Rv!cgxp>Qd@=mR zN;gVlUNX_33<$9Bnx;zDVt*jH3213-zKX(!5ag90fik5Ct)SGP=WZ=q|20_=#@rPj z&`*K%ch)9`X(QAP92*jY2ui6^zMqcT`tytRevOg(FZ{Pnx4(BjGYoe6z|jlPHN8-*5Z@7Bdr_68dx>$|fIFJki-?(FEu(aJj` zl~v6ifulx#v`_vcb^olJCR+&ivVhRog&9;WbMKzMQ9$|RCS#J^cOUL~V?od4bct`k zEVt?@4S|+#BLGZ?_fbx9s$L)2El_f7HhT;jX6j=?2OC!Cfv)a1{{dKy&Cms33TK;6 zvVq-$grT}bYMNQ+j1%tI^1NH<%gcO@8 zG0MVbd|xt5V~!eNHxJ8e^Mcmq(b!OPYJpKtR(<8CD@j%7j1^@Ir9DYK1A*odFj)_U zRjj8+dNujsFV(biV#IN?UNaJC5#9-bB&JwOP z^K5scAma}XqZ6itG)*`nw(=4Jn;(~c_8+R=w|nySY`qDv4ytEz9Z46-+N>@FCL}zB zc@W5XgbKr@bE#n$Qm7Q$(Bis*E~hiVoVg86x5A&Z8Ntfy&*yqOR!$3P4!(B%fZ6aEg}m zfhmbb`0dS?lX>Khoh#o~=mac9C`mX;0C~6Wh-f_88EjYDdT50HKO~)ZINOW+{*#buQF=P&ch)?i4k-yH5mYO`U9$fu-(v=CZW%Sg=Au&atPt956ghU6-bE@w9 zb*mfL$nXlCx$Cllt+ge~h;6wGX{(aXfx6@$l28l~MBn2|x~-4DlLR7~D|MY;q&jEZ zIbXy73a}k;IKfnUA0Z#aesBoRFi72e{8+=uI`}uL&Iga0u?Nv7qMJF}69It2t0-=3B06 z1w|E^Z(%Azp^mO5oIL%A2*@p4o3J=|BKwwg_yN;aP^c)F5_X?H!*?DD$&m+ylUPnm zvX&C|{JZ0Kb63~4nJG#dZQ4d#Lw?W;V8b*^O%1;QNTQ;*;s<3erR{eNno7KZ%y$ZG zHaWr1tlnK%VQB0-=_>)(%>;P($H1vCmG7+seS72kP76zR^k#efURx<1O=u(C%QvCt zc*E+yjafQ`}I%m?4F^h0eiasweD%@fgvY) zk?-tZ{-Z(%&Q{S;$j>jI*};Ny4yedBG+I=9A}63Wb0(Q0VdwllnQZ;a7Fnvp zn(%H-rp%dZNZ?SeEr6dir*wKKvUxf8I`nVw{WS=Jp)M?{WOrVXbu(68LhdnT?DgiD zVO&LOo1d}qq4D+5W`}hOXXO%z3gv0pz zt9R#f^DK$JY_*eFQ@{n5G#Pn#YbrSQspMp=ZSiE{Xx`ZshbVepWZepOW^ZR%K|Xr^ z^}YTa9jINlnyc=GK#c%DS|6LHvn2K{V5%|U=fk(?rpe)iCNEoHT$PpXdM$5<%A|bq zAxkQyHTdZaCqkk-8gr*Yn(tp#=>|Us<}h2fak!Dy>kWKX@}?N|KM>`Mq>gLX`pg1<@gvkUy;^^yf!pbP8OxuGXNF3E_jVq^;{&0zGR<98U|?>WJ2zR z=2bPV*(knV628??@pvooy63o-X0Jmu=+jjS(WBI0`1X;=BG5O|Aj&=jLvZToDG{P@ zkLNAJhpXz;{3gq}KhH2Ap`jD7LNjDb7a&D;x(S&bc+Q){n)-JK)8;07PJu)mBJP}o z)4EC~wR#U+o0q$DYCuII-~h%_#E4pbaRVBz6+RKo0GdieD}B-XR|o$;3OjwGOv;`3W`8vW?b=16V(*(U4aU<{Tg|7q*n3Sj;A|Jiew z7*Zdg9K{y&AF#m`D=K^W_7W-IfYc-F{YxWPQfcBpAe*KS4HaYd`I3~jWoddSj$MA5 z7lKKuMU^7?VL_u+5PTD!dt0&ORS~qr5`W?B2XV%p{j`q7*83x6-hW`!+2)lK%%|LO zU>9gRIp7M2ITcfnF@*}EaKUXLZqCrnle9*E5e0V~G7{G`j@+FM!nN&M3CXryfWGTO zTBb!lex%`_OG{rJi7>kBEM0fTw9!lXCfidJ_5?@JM*wDB!Std-i)5zRt!^})bdJ=w z`X1VQc_gHS3wN7Uf%+FFOw6#RI72g!(UVR-{JXE5fAVqF_qEEsV{NTFLOK}nYPL(` z!<0TO}U@Di@c;5^K_%zAEV#KDN2i+ zwNu$wt&Ssr{#(OccNHT{#94z>gJKwK<$$x0B4a0f1x;O-acx&`zvR|9)a${X-dKBE zodLgXO=aprZ(p{ovER2Ym(&hFELV-jy#HI_e;7)Mk|f+9%G2z`K{dEx@cSejqGqD2 z|A529N86#CDqB5X!hJ-Agso?lu2@06-!DzV@GyJ9OL+d{58IAr9IBk8YbKe&9uVDq z-zb%y&o-c8pGZ~izMg~rQHm*2n`md6`D=%)c$(v9%V?_i~8g4KTci$9cMhQ_RDK+Bj}N5WXd^fBkDj$ebO61c8EN2zB;Z{Z@P}_ zx$_-D@BOwUcL!-rh0LlcAUjW0aCc5j0QK}sVK9qwAAG#h{rAvUnxrra_Vn3RxYk_F zkPYfXqg^}Xv5-Zo6v|isNeI>^t>@w$E1D!pM<;(!Y3bKyFkA6$h*5IZ$*Ta(^hA1w zMPiRm@RI#>>GJjM(7ey{wlJj7onKq`MjjU2_quOZ6q<%t3}5~*R>d`p@nE2gUr{%B z&jTm)h2kq8yJ0^AwTw(9vtfM}Ncma0x#?g7$!^<^7T+Sl9IAdfr|jh)4MyA}=!4US zJ_PI-=b?ZOhGW`l{=b5L5Hbos4PSIB@Bt}L!#(w7N=~JeH$N>koO2AXZ~Y%0s%DJBRBs6bgyJDGM(XY33~$9D_=-38!p%WV9M z{X^WQBkUvZ`zAz;I?KE}gcbdSL`4_;J1Vw#aNVT1J{(>*61 z9(ae7r>+YD)EaQhw#&hHII=I^qRry8z-kiwi7gr@F5G|dy!61yW706j3(|jq7Fx$o zE0@#xI#pDca&U2#5d5r`*{yI9^~~a=CPmg9zkGSp`V`4PsJOf;=_$-0!b@25*g^l` znn%Ar7uJsJkcRG9gZ*2aI5(XWn{<^1q%@DEIU*|sa2qNcZ$*g@%Xs1y=V4FMl`FpOz{THt7x+#EMib#g_&_bh=+@`4uf-;`n7R>;Gxe z5Mb}56S65WrB^t#u-@8DE5FghEwo4ycXPY$PifeMuAbaD0k8YdCFA^cAVkf{&6SM^ z45VL_9ry9=f%1E!cL28aksO|5*6C9PaKoU@gjzr{BZiM&P`*zf%zmNsfV?AMkI0(g0%mrQt5_ zA_uXt8L`}{15pdazPH}16)9z{btuG#UG|J+IGIm)F};ye;G8A7znZS0AfXW!aGO3H zzenWxNlKcoN=Y^_BaW(PFhxEnLg{6kzDyFER03=i43=~} zX=64sTSdajjZ*H?V0hRUXxIDWWaSHC3OrR!yqB$%5`B#7 z!c|r8=1=;nbjISi|AS zguT$t(~^^(K|@Wk%dO$Rch&M?+@__pnW>iL3T-CJp7i!h2ZFKOBv?Oo^n45j){r6J z$Q0{*6T5su{xR=D6SHb2jY2n?*le=R0u8kU?oR~KIStuXIy~bbx^ZXx)-786G;wec z5ROFTqrC1AW>+KpU2nYF@P(O1gfwo_5(hU#I(0^OFM|#I8Xva4bVs>n^cO>h;}ZD% zY*>zqVV1Y7ws_4gW2lmtN90OrUdR?eF1|0F4XXOLJr0bx*zznaVDmoc+NX12IQa%6Xq_V<^vMJEi%k;)I(xbX^!Hv@PY*Wq0^Z}v^Oo(* z%HmxGXw7C~SvK=glV$yghSK1fM|H{Pg0)A2{Z#GGc{!T?Gv^m#jK=g7ss+C>FHtxA zVwhii(2VlZirrTmld3FJ#qZ*=(@Xb+lheS;K`N=FAKb?rB-B|cXlNPq@1gSt)KQ|+ zcXBp@O+w^+kf5^NK}18{hR~OOecqD~BgfPTd%`)Q!y29rq)(aFCk2V%di zL8pPA1c^$6FGFp`TEm@X(HB9tCram9KbOz4<@I$fTt07%N3lHR%K26&yF=dFjEE7E z7oVpnw3SuI8}~|R7nhFnz#(1=ULsTIo9OFJS!N}m5(DhZ*e(kg0U=O1LNL6V$(b&D zLPFUxXHDFB-%eMy_gQ*5qV5&o6N=r;SR>(FJ^0l4YbDa{ri@7OFCk(Pys-GckWG=s z!gqZv+cSgxt0qsN@)RF{&Z8{W4ur7NFOhKJ)|Z_uPabu4&N^7rlezasw|mqfJjTS; zz4v){?J39j%9pHd3~sE0Ud8W@Tvn4QJN&^6VL)tXOXvK&J*};ds6tRT=B}J&()Xx= zvT473mt8_zQv4DYV1#laY%?;@zx}Q&E%HlpfAQ&9Npawii)M~$o$rs{UNedf*!52F z;jNzK5F0j(_V3Cb3(~2~59O_31)TWx>7WWh+hrvh{fr!b#OGLZGAvj3Fu*zY!QQ3> z;O3|&vYJP+gd!zL{cNVLCDAhR@$g^pyhT&&R>KaRwq6-c^ac{1fvQ{m$%cuWK8c$` zBcmzBra!oJ+Y2xvwys(Omhd_FbNO02nPR&iz|AJGj`!I+)addjtez}$u^I>@tw5~j3>aO)RzlWKzo@;}u@O4oJ*_Q4ZL}^1 zYD*+J(|#JB{#h5iwOsn?`lhS-8f7{UgAAJ1p3#qVt=bu)A)$Ga*BqnBAdkPWTa z`=~iNmv5tBV2II=s}ja|812jlafcWoSYU7RM@?;inkcq)I=D8L(WC7d1l1JgVH2lv za^riA7PEQ!I~#G-pN7-Ix4@)ZO-!vK&1NGj*cxhgpR9NmvA zE%2sSu*UvpsxN2#YHRaJmcr-D*RKgn-l!?p-jl=;jAQ=A`JlJqI{yvhKI(nr_G>OQkliNY3wlL zdH!X@(QJBSaEpn~dtx>DBK)wX*zU(a{y;~jb*N4&4M@Uuj_ohbY_`JS@L!J;=VPK{ ziv)kPZG1S(`z+f{UfVQ>Gkc69<3FHS{d$v{aeG?%D(6M-Knl0$;jtZ*@j$^w5R=nz z?2Fslv;eA;*S;gxaQqC^MR_1o%yH3ZQS{%gyD@ZFgTxkn^=T5`vyp-5WSZ_go6*YO zy~A3tjSFiOe9BkD`vRD_7~l^%?L^X}cN`PlQVAaftF2@!?t(vb+6?hg*B6roIJ;La zD5`-jnOVOJChRGJpM@*XB2O{vqf(0G%AKE3QAT!U1(U?hlL1IY7CPb<7=K$4yGDLZ z1iK;oqIoQ5iY(}7etI3HRy^t<+hp-BlLkK_Nw#4CEFzNYj>J5CvTY~mkdfm#pc4MJ zQao?_;I(0*$pQF7xeO5-f8YB#`$MZncmKNb?JR~6il(-4if=@Zs{IP*`8hOfjNRD^ z>xDlv4E!aP%{B5`d}r^>z8Q;teyCWin_+M3m0v4t+g+m_d}KKIvl-cJ2sG4dh|UG) zX$6g?qp3yc$_2&_JNm{FipL zqrEg_{qi(1k8HfgUlU{Sz@xE#blBE2z=lxiElaArPX9kX3cp2(&5R-)CJDY_A z=T&ve?H%crgE@oJtv0#}FH@DTjY=Zpy!R$*1h5v~c>Pg2>Quv7(xFF?T(I+CIky}5MlMa8e6-;E?L5w z*@L9MIXo0MSZZVpQ$Rz2-u83jPtJoU$~*>K@MD3zDgFe1Msl>2#WzC=V_fDkT&3iU zW4sbs-&eiQ8ZPDjm&jgx-Qyteb9pZWy;U8*W9Tw=8hUZ7pAgxyIoTe$Lq^60%w@#@ zp{?!wtCUXzp`YSdr-3)U3#F|N6t3{*xS6lG4dGZ+3{D`p7kYj=W8EQcYoziC&wR3Q z)zs@?Hzj1UJ)+v!kNk|e9rSB^nUdtAOG!;U@w-pVrX5jm{8g=;@rL^o>cz#~gbwCk za6x@<{2tX*Kvk$9*5CjAEI(?0We@0wzSlF_g|tepKI>NV9m1klCfM=fvSYLg8dgpy zz^3-Ie*Ac3@WM=>@-+2M!M@<6?^7q7ef%IPJ5UBS?qJ zNRRHBn#6OSyw^FKxP_Ldk9pvjF2s?BQWt|D6_2#R<4Hw5eq{-3mZz66_Fle#7pl$O zxzCe36rsi*7STMW3B3t+s~M7x0}bojSK*kpBN@e?%+-&>35TTJ0cD)UfZ%ao#F~D5 z$#2}fa_DBbxO~Xpkmrgj=*(c7134l2mLgJf@z@4~Ry|rpXa6$rfmR^jj|Ekdt?5IKVeXJiiCw|}q{P1PD0O}LY-k^9! zIMcnOy$~;YT>fWULqRF;nsurYfHkEn#IJNbPXr#>^4wO&r%oT!Xz$BZjkwLXop}vY zMia3+YEUhh(3>s#_Vx_ACBQE+V@l5m7z@QI+?GPQqI|*7VW^S*jlibu)tQqdO>AG5w zHvgBB>%Pe-SXHfUzXMRLvLw>$Oskw@E^a_tqsMFfnAjXqi2!u+dv$pxE?5jDeNN(5 zZ>LVLzb`_^Tk?+7E0sX@!GA*A;l?l#Aj)bGNUzpob!vGp_GPK7->@a_QntOOT2wLp7n@uKhe zgmwf}U+mqc_q3K@QqGzU068KLzJ}PRUPmFDto8i!AwA*cddI~lKT6mMpNwr%X|KmW z!Cg5r{O~&Zt#_1)+Ne@d-5-z2xbr>mvl$0)?DVL~Zl{Ebm&hvt2<}vd5=;07q!@Zt zZ?kkuvGhod^ntPi7$>4GR{AHBrrZ6e;vtW;V|JoUX%#B0GLP2s2M^R{5aIrjU96*=?kJ86?@i- z)J8#)o!atRib8b=@N|gwoO7T*^*--N@)s^I!{*e}cg}=Wk=BJbpbpIu1=1UGLL^eB z+1Hnb&qCKy(Z0i`XdC3|6{&-aYv05BTovmWItkzsTJ26#XfL$R0B7bB9vZp18-Ewn z%^x2Rn4@uRt4<4^&xJ+M`S4e*!S8xi&#Z_G!)$+uC_QE4UcQd;<+p~aR$+Z5qn?)+ zZUu+X&lO~#hAz0;&HZ2lGMUqAaNA%-swjqbq8De!Klj~1V4T}y3Yjc`)> zQ7;_z-{WWj)oX81_mn0Ma2TkCy7#Ov-Lupt6N-@EnaSb9_Gg=&?e9 z3AAafHTBDHC#SM=;h1cSb>Fy-j=%eAc3_!_S?!VYdDW2=Ke5jYiE zQ|Xsl1N%$%3YT*i+RAnt>h=Xo{ivzW-W3!dpBm(_u~eh516T)KccpkE*jRlu5z>6wdRImlI(i?l1~S`XSBqwmM>ENIKz95fwC!R9?D0eeT<# z9OCZR>S3KO$0Y-RYYHw!cX(BXg3gmzG%=LPmP>~{XxJWvsvuZvxJT8KlnWlewDap~&$_oHI8unurqc zIt7sv7mecR@lV2UT<#k;ja?5~QVKW`(8TiYRLkf8zNR1>u=73jlSVC67?;3(t0&%& z!0&p~_^}~=L8`M~&x1Y~aDK(2ROWnU18T8SPckx&tHn@hThDS$wxw^pp24NZ2Q{u1 zE_>D(H}8{OMW;-nwq%lH16m0D{jppVk5SOBrBHH<6>loX_k>8Q%$@w(A6Y+sTvbX& zbgP911=k3*10cue=pdK_xuB#m%!Vr97=HH|iFD*1I&#*N@g79x9>t=6dYDHBb+wIk zAoJ}LbwK%<;rkYDu4qzlszFs$IRfVW(?a*8kj-U8?n_P}T|rsa?Bq}UewSBOyhakf zN;O=$8mrzdFxY%jt9Hv|w0LS2z8TZfnYEtPLXfNM`mWQk)O!g`W|+L}c3g}SH>M_b zzn(kK%p6TGQdSM5{aYk*CMgY_cblE}`3H>C@Q_J7h1f!yIdo5ZqP*CLP={~IJwYJR zs4HG-UfMz0W;(0$=@6S?i{a(01DJhlt->1iBv?f!MfA1%8`!zv-$H zNW<&MZ!tSLjgzl51MV={ak4U^=V9qGk8)Bo>VQu6H_yBM4dl}|tWE+n&L8~xh~ea% zANSVFE)HDKGyvm*f$oPj_e>v%4FF!v^`ks=0_T!N!UlIguA%VcVS!(KhKVP-6dexg zCgm4ML5-4v$!7!o-Gs9O9&N=y>=@1?2H8{{jq&vxT?em;?+P1c_JuEb(&v#zSlIl? zIcv_u&u|s2b_>0)JRhC;Y^iz<^`nTl_nju?t3`UlCqy*-x878}_T)86Dd><3B$Hu~ z_tF+rSufz1?auq4UIbhk1BgWO43 z-nKQc%Oeeph3%EELtn~QZ5%oQ!zWs8_cXQNnBGX-_T0;!k=&b>OhCm%H!`~u;~JTa z<8%RcM$I&Vvhr~wd--I7o6*c}$XwWJgy&RStOxdH+w#=pEG;KHaDwbQW&F#=W!Acd zZv0}u;J%y;BqmU|t3_-?Z#eu+{MHKhwrP9#_o?~aD|11^(cOVgPW+Nzjt_2}!oS!z zY&QL$lL~-Eh-QrBSTx)y73HkfpYeACX+gvy8I*C!X2eltv$mg}#J`#`YnyG{Gt zXnVP<@vdZDb_s}@$6@$-#_IP-?~-oIx}b2*l}Pr}dd3VKYT0CbxhDrppB+(Th(h(6 zydwR_On*&GL~dK>?BNv9Z5RTocBAp8b(_+(*r;?^QxLaj#(jCWsrTwcC`v^{<&Lk=X~fsd4%E($&$s>* z*@f(bZnaRJ;M1CHVSR7=GeKsIPd!p6R1_Y?%&!zfK18JH@jMQegkX*y6w2{vdhD`S zecS=+fOfW_5~tYIP6UN`$!L9dsne=D0dUzajLm$jRqgDd#`~Js`BoyBXon+??M;S> z4Cll`GanMGynQXzk}?QF1$&-C<<={R4Cds{D(YxD9<1t}{!iTf+twh8we=d=_Q0@}Be#}w4X1bX^gGh4fp zGo8zcfcIRoE%5g@k%ZD&+?ddZL#Dx<8j*S|AXyyH#=yU(LEbpZ)|`Z4$H;tm1y=%Q_}E%u=x`W17%8%W$Tt|gQT=48PJ=hys_k{*NcF^1 zOu-Iq>x$}} z;=Trp@(;}w-CFbj{~PQ{CM+kg4Y>-Bk+3iWbJBmU=mKTuU{a-k2+c`K{^Q@0baY0q zg^;a~4UZlsc;2u9q7jQe&#+a4EHU``-G$9uD{zLQ2k5U?GIn>!eIxrDf7T2IkA$jO zgYcTKJ`J&TIe=Od_v?~QzsDjUxSl!g-E0Dx3n0M71SS&V6f1>C>NY^`<|#258Uy-G zPAv2X(z*VW9J0O*OxjrmT*XDNv&9vyVPO0-rb0pn!g=|s$Q$%q#fLbuhzlg=^R4$H z`dWtpFqi00jE0$3kc}HrMN6{xfKASU_6LX*dFbEh!a_;pyg@V`l@b*Rw|vwKK+ZAWvO^p>kQ z8+Ezp!jTMRZUH$gXHU2U$o>mi&tbLv6WGULNO7(1_y}w8i`R3Ox$qle+63ZRV_9Iski8Icu;S<8r|p&shLB^7aL=?2^xv`?3xbF7EHz^!~q0uIH$Owond z7;d-aBHacbe538V5blUKVrb?Gw0BB^;$Xj zDVHM~{-!)cIDOKb;v8R<6Y-d4U=+LEGt)aJRyh^V(CpW@BiPoOI^^HYugo~MaB{0@ z^)8t1ulV5VdA}Tc94p@_tPaI`UuYb5SPqZvSY1~&X=#{zkQ1xH^>`jT6_?y$AAnfN zKvCV7Xv>u65&H_uw3TnP>p=!T9Mh;5r!n~w|EOo|J!G^qjJ?roiT%VJQXF2C7ATdNcdF0&A*28e?b-`?nUrv?6IyIq&|ANH2 z^1!ksq1Kb4!R3$m-O3NmOZ>6D9iC2Yr+%a(-PhN@SJSrxbC+XVOcP5++KF#o} z-jC70qT!Z6oWN_e@rRw3m%_=?F=-T({pc6tT<;KhJI+$|rZxW3ni~GfFwMxcq?yrbWJdr$ZJReCd_`^ z@9Eftgx>?Pi67Yf`R?j`n-)FjerW#Q9qYFIgb!pX5^@qDd#wlG8e*l;SpMaK?-;6h zYx3^&#>@^^^-*)k*x3Kt)cYpQ2 zes3@@wMkrb^?Z@JaP{)Nl$6QR9Ni2dLzobNVNouW9|(x_GyLcVit0@j9SDuUlZQS~ zG9vydB5w4DQ~1CkC?njp<2J-b-&F`PXK+~DF(ryEhc6}v%g(jV&c$FT;Rr8QBmJ2a zNME7MQb?n8HnfHPNk*nRNYu)DoE}=^ma#@IP*$XUQ1)sbR$q;H8OTDE{1o<5Q4%+* z3{|`*rP%w_0$ph4JMA|g`KPQkP+b!KkVdS7+fPzK9^}E=J_kXl>*iq{_r%c1@T5p| ztnfj|%VYI)`x@=hzf6)#X&~#KJ5Y=$tlX4|rjiDO7n_A%xIYPD>kpg(OzL=eC$H|HgevatBzBZ_tO|vtByUN9u{vQxYEs1 z@X9gr*7GYkui1oatMmDEuKWFe8s7mh27a1hGdDg9&bm!{IIZ$Z8CH;+)bBW1dQ!0r z`#cn(ER+-Qo=}<3|N3LG)qVH!0Nf%|b=rV+mE=uAPT=3a(MaEAtG*gv>q^aux;%2+ zHpieCO2Vbpx!&`80kQ7L-WHX6*^AUq!u{b@-hXRMBx1Hmm?wIpYLWZ{g;4o9$Yta_ zNFUAc>_(RWmv><(CL|4l!xYZ)i}NQU(KoM*9(#AKDVbF4R@ho)6*DMWN4OYlvtNAd zmw)uo62A-^;W343N($vPVJ_pjSHevsdd+&9Qe~|`IXY?#5gT45f3!<^piD@Gv!!Em z*;b%MgNQyu@&c@nun=QmG`&&g=NDdnn(GMC z^}k*aF#;zjXTW&=;{Pju5n)DTd?d3v+&OuE0X{ozkC*Mu*ytx`NgLDHc)~v!l!C+~ z(M!N?b9t?yjaSKmmBo|C+bGQE6Xss)YwyRFWz?Vy7I=!ngt-y zXrh5*D+JK-KI3#UsZ^Oi3&y+QKhvgt{dNp%<9!y!!s+J=wDbEX`X+3d{}gwV7Ue_o zo(Fmk6G!C(>4B;)ZRNDB(ZVGFihs@d$@gc7us;>~lS$Nac3xyc0^d^#$`<^u@k#QQ z#sqJUzLvH%7ulw{yC)WT*mQ3$^03AkjAsPK#58@bVfS~?sMz|Ny2I!he|*C3EctE> zk|{mFX;l#b>^fl^85OO!2?P_hFyjqQRb<@WcyS{BL3?(y-2T5@il=-KUt>QZrO0zX zJz0;qnb>Se&)AG@kf87G@9BwUyPJvmOF-q4iiFhxVQLBU@YDH_xV@i@!O|y8mnNys z3I66_Ql{n0YBQq{ z6n67CPZMMYqW^~1?L_rO7G#RtZb1xLJyKNRj6GCy;10fZw2{-SjHr0ljBk6a_uvq! zqErRYl_X)ZX|RB~kv->+BG=Bh zh+$d*IL)op3#s^Pof7{bYJoK>R)3&52{-bmpw~Ge7GQiNv>AKrW`BH1sveQv9rf7Z z(RNwIz)7acQDXS2h=zFVc%y6L>su72CgJ1|T31&$^y3J!(w0VpCJ~@Dy@|hTU>o@- zDwyZ1G{|QqHFK;hZW=*uqX!#pcWC(P4T7z|oX%a5;kvz-7kg~GrWV{sa)5RUvkIZu zafMeRv`-C@fji!P2G3km;tj`N2ySQ;q-Ptx^;=I~N{nt?J*}X!#Z(ITJ+SgxlIZh$ zMPuLoYvA5b9-xaQ6yb(l6F0JKtqYXnmG-UI_Beit5mC!@fnjH=f`Cz$T^Qynr`seS|HwWAs&=;9rw4$0L(B95EAXov7r#+%^ zEmfUU!$$lg4KI6KfUlPeP3$sWYKGkTGy#6rlGQuTh92+B)Mq7jFh=x(=Qwbi+aFpH z*>l1@w9Sprol!eu$ zx*o`WYq=M{)OSYXjuqd@m&J>#TRM;n6Dk?*wxGYMYOVj;a(cMSE#8u7{o$zP=>q#H z34b4;+uRDJwe!`abx8#}?aA-j8iOruuPKZ|5#(1HB zdtd*AE}||4rzIJb%e#8ih&1+PtTrkrYigt+Uj0!c>cDsj<&cioC>6YsOTTPaL@s)! zWXyRcWW|@AKB1{953))SDa1&n9SgcEL3Qdbd!UL#(uR&V5kmq@B!1H@+J&4)Rm0@K zk#nKF_SM2MRD!KhUUM- zRlrQAX!(`yWiOB1$(7v=Toq2Ze?cWlRH2v0nVXrjMERiMea{mgs#2& zuRY#+r^=W97RP?Ov#`f7F-%(;{e7b=cvEhJIbiy4g$Iql_h@P7=8NgNC6!mmRI0(A zF3=_g$zSWojX4vcy|#oS@XXE8M`c7Nr+o(~GFNzoRp9Q{Hi);^cxTkl$s{-I{>oi)cNH!l???@9*WV>R8QSa{0Am)1E zB~#GJ?x(1!B=3s!_L@2N9D6-&Murv|Gt7%qV#=Hnu~+xz;~o@Ky1aGk*Vj^)ayEU! z0>XAXTmMgnOFw|wW0}fN{SGuW-OUZ$O+nn@tA%je+x&m8C-Tx|s=ToaPpEH2$j3E} z>l@mlmXR9$hUv%7K(9ZI0Oa#Lldy!wsM%+&4KG*TOmW?(y@)nEfBfLdb)7m`x zDZK9JQIDOpB~e^b38{1-Y#DB&fdNLRcbVWR(=QJJI(8F!4UCYm_!FHiZGPsRif6=v z$j(PY(~{mwq!PdJ_EWc9uY0(TT+#2txP$;3?kzJN#DwAfc>kzvMz!{s11oc;INPJT zA3HB}uE~n?j`CGB$3^BCT&LgD*bEQbu>K*U8hN*?zOk`~KcH$KFs{cF!4*w%zPdU-fuJG0dYm4Qi?k$RONk2Xx zK>-D>gl(l6GcNH`Mr=r7o$SqzV;)?m2GiawW6g=sC47qQNBpNn0J&xMlGfyG(IZ61*d)!_dT)J-XF(Hre zYotEAn8$%W0)U|6eoh*&k*eCR;X&Fr-!Z|~$PK5lj{W~_T;Pw>U?yt}!4$>v%|&|+ zG7DVX{sBjm05c!BbovZ9H7)2 zbxsnET|4`79FY(Y^b@A9SN%EnrtY8KH*+DS^*g2V4?fD5YHvBqc{w&*x*`}O%-Mmj zk3z5p+?ox$V)R=~vDb-bGDiOGdZcp)PaZMw6hk9|g68-fHR30>lSx2-hU`^`XuXPY zr)`q`pTHW$D29HszQ^6%%x&&lu!TKO!U+otl^zRhk4Be)E7&#lk4X1Nwq8nIstLS+ zM88y2Ji>|+KLdM`hQcMx~o#eM}x+0@QNaX$NM|Cr`CJl3T>U5EKncrk41 z=P9O%6X(38dk#2JVL7+^arZO9Te z7JFvHpzkOI*;aipCz(EYeud!0#+f{5$Na}h2)!$+-*r@Ec((PH!f^;oyY>S)o$WgV1xe!uC z_91O+Sz5;NJM)dSfOyEiZ_**K%Z2Ra`#G_|)oeOc+~V@Uww(@1+bnb8iPQGWou6OX ze76=q@CszdS1_o9BW-Ec*v56oNDw7ui7?)J}HV%;Es`K;O%i`W{Tn}=gj4unOmIYoLzhIr|f}gO?PtL`Z!>0RL z3bNdvTKWxM*s7-d<*kM8fW{fuwRyL^{q6kxJZDcXl1kBljaGBA_S1@w+4Rv@f7MMX zWbFMF6cfJZlVX_gcqG5!M81y_bHSbBx{yA0g(-7$f4j+p9(K!pJvTFNXB$a#^ft6j zJjtcB#|H74iMny?`En zFJk4;eW=aX%Z|)Gq(LyIE4;Vg09#M-R}r?>y1xItmg}``Exiv;L9rpg>k4gb(g2V7pm;uo^}nV^l=Q|0I|FdR7-`Y|g%A*c)u_J& z&{p(B|H+wEHy!AGa3Dui$R^V?oIMz{`j@kEBmdgvzEyh=u4Pn$XI;PwrNq~Q*nZXV z-i;yK!!s;A(Lus70FiqgW)e|5qD|;xRqvLWswcz(UIBVpGm8Ay$3<4^QOxcTV`gYf zNh~=e+gIv7)C%p;J=l%leyT4I#o#c-_jB4{`}&?8_I7%RH8mNp$V9Hwigt~|yVPRK z%EW1%|FJ!9dq!>Emrd{CZlBvKwOg zFkdF0GNBD@O0vnei5mi7iHh3_qMA<`#?2PunC(7|4BV2RFLAwL;!8CD$KF@of^A2Zo|Nno8(3(B1mKvp}LxZBVVyEpnZHn}k+BY5_nmFU z%Xl9gB5HN?|A`=#)thuV^;jGArt9gJhOho`V)n3ZS2l4TOw|0`WZfRL_pbN0GVq+O zsT%G4?AfJH#?vUSWiR}$O3jQNQKzdb?7wLGxGTF)){V)~rVON13ibjj^xK{ocA)xE z!fGF`f^G)!z|7f&k=Wub42~^$wIGozy>)ucgu!IqyzHaa zrsQwmeyjh4n}ut8zpyU&YPM;%?B!R4V=nA=#rab_U{a9b8EqN2Onu*;_Yv+w)CQC4 ztG*8Snka*Mv8$UsW6Nd^Z0n6G&da0*)=(ncsJNw>6{0d4?STc$r%Hm!ZWn#|h5aA# zk6gqqv`gR$?CHO(PP7%2s(5@{esg$sR%6mvo;n=mkJ#eM1GXz6TTntd(FygHpfCfQ+B%yb|Pr>I;41@aCRw1A2;E^W=#uvM9IhQg~m3 z2G|7Zs}?r>T-Z5cfB4d`%j$?25yIwT8JWHti(P&&%dTB9>K7Zwnjr8Z#!$yo;_=FffF0HRXdy9`3VAdk&eXy=T~mP&x)v6 z*0(L85};9PI+r=$_8!>AlwWiP>GHB(fz2S9l%VEwVIJSpciZSbIjJjoeF~#um(^3X z$#b!VUK)T@gq=U*Ca4yX^{81dg6&y<2^=NA=Qk zDb)Dj_PQex~$LpN_1r`PpX-==BBi_wAk8zT(GlqRxCrCi3Tui|L z))*BP@eQq<400pNW$^#~EH8nyi8a-Rir|dI21Ji-*94;LZpbrq9)xj`8<1yu_|mRc=m&ID=5#>n z+@^>TO$5F?j1;tB_4fIu1(jYT2Uvl-YPJOiM1n`^7Z=mp42W}Q%=jUF z4FA$;S2?%+Rn>Nzi!lDD&(bQ|*zthg8v~`D#AM<`uuqHiNk#sCDL~|hzRy16Xyi;Q z^8bJndCy%u^t&_vZ3E6!y8EcC5+N6kX5PnK? zP?U%7%vf1?U})q7xbyvikIaP#YPr)lyL!RIsofVt+4xq!hWWItmk~a#=!R`o8A*Lk z)vhqU;Ybf+W^k}6@-TFpqz{YSa&Fg+Tr5Z&_1;CDU;~eRXh1K`Tk1l?u|Q{T;*_SM zo&Te*^)^m``dQ$PSFjL}rWE1(t#apx&x3SuFa5go!?MsotLo)V|Ag>&8bRbHtApK4 z`IdS({o5r{&nxOat-B8AgPn-Vo=qml*q$=*D~;+Fmb#v?EW&zL#JDnHT$MgGk_h}9 z#pamMUmc?ZIzGxt?tQ~T3hDKS0HS`LFw8z!86NIIZ zYnl3Qx!kGvZO4KD>TD#i826a&MKBt@_)P@%-on3|muL=JM9c>dc{4A%$f1AcK;_Um z=n8`JS-9-Q!rklSud$=jWr}f7R~pY>{?8IF;zPA`9^;BSKflOPC_I_r?Wz1ZYf?bT zH}l4uor`1VF!I70lq(Jql(Y3u!@Lf^EQ}A;JRYo(ex913rEeIWU`fNEI9L(HNur4) zR|Z6DEZ9)QDz!dm`AKPMyUlKC{Bx#xNt>Yq{~;3Y&-9yL#YxVl^um^PUaijtv2l?mx~s1s8>gL#*yPI>BYd+^LSEi53MQa$cEjb12**-Z_~KCxh;93=g{xidvLy zdN8?CrJn>tKFb4cr6U%7-O?15Lyt_-B8$JbFSB%1YGda$6cH63bGqX-pxg-%L^N#^M%#Jb}ZIDnGlH)OR#9~FO zjjb`ZD6+2wm|t$K8%OYZ;3$f#|6C~wu37I1ii&a^csB6fwVwkq@6wYQRbzS@4Fp)@ zpFiY>R6xEF{jaat!Qw}hoje2^{kKn$23okf1Jv+4$ zUhw#9ko|Pm&ATI`JcHb~9ibn}MTBF&sqqqeGBVf2 z;lS@;BTx|8rD|yaIt$YaJM`}`2XrYSg*?c1_Q)(Wl>cG3pY}_F<26DNegDCzY7}t3 zzZTl_>Lga)8F7a?yf!@rcv#dd@hihGO|gW9J>BrCsdTAI;-!pn!sg`2@kDX8^7)NF z7V4`+Lr=bamM1H}OQrEpi@yT9qG4z14inY{; zP{)BEtf6{;t9`4{&6cRpog*EA41E?+y7O~{kL23%zkQv04tqPk$6k1;wZ?_+xkbqt z&B(3J_3Lg%nlY>3PJ~Rj4`TLsO3vq+Z}_C^)n0yXg7&g z$f+$@t53Hd6gdP7jg`$qZ}a?Sbe^oqRZ`Fjl5=($twAJX7vbD`S$V@1v%1Gd0< zaC8pTC7vv-d62>e4c<^YJ4UOTOp)Syh8+9d3tfIADEJ@Bn3Cny=60RB8>#1c{63vz zeC~tV05`yTO;1JQNza7oeCh@3LIUFX%2C zNf*e;`E*}HZN0!;gA^D&-uG>;BTd3;0DhOn1!g{y(>uJhGt!v(QaARF1t#E6zKVj@MPbX7$S zjiCu9C0vodf7ZUt2U74(JC(6f{T$`2!t34YP_3~%kpVL*!q5M{@V%A=E$ngO&tn}f z+iecM_s2ggv>cn4#`(Xcj6*?Z1%reY&ps#?NgX4{jQT*Yz zOz1ChH3o7)2=V}m7b-rWti|Z7`T;1!L}lxT=-a2%2l(BZIt_-)CatKVm*eNv01yBS zVk!+L=uC#3w_Z;%nUpb@43d#i_wJT{>%H3+mH3JlhFkR5v^3WGThEm1=nXaSfkAkq z&oOKEXp&{Z0XXdXF8?K#-#8yWAIXXj*tx?;@WJG?GgYOrnF+_u`15W1wBzu!dxtVJ zwzRhYqDa9(u6aoyOCpf?($K3qw(US|BnF(8`Yw_C!Cl5oo44>b#-ho$yw#Sgj9R$u z_lZ9{(fr|33gdTGNW;s{nRW@0QcW1oet=g1eA0NxC^f9VbX{|hY64`i^dM&BgSGLlG^~XMGjgT zAO0D1tYkK+s_KdELIMmMEKOhcSy7ML$ph0MK{7h8f)g zNfp=NC&wgsiw_w;{mq%7FQaeW+z=4A|7dR{k)7-NZDVifpu!)ke?-mh zTz1(NQb?Q9(+xc!^ah1b67+3|z+c{AD;DoFchKYK9!37IAvqU-Kit^mLCS=0BsejP zS#gI=te>^4O{eJ|)==HcH^UaaL7i)i#}wnOMgIV{r_>ZfwbB)2=n*~^%Ob7JU8=2H zDw-!u*5V|PQhL@a3HGp{Dxw?Lu(K-xq$P><`}rzO-LkH9-Hgi9X{7uvFAc z?E&u8v$A>J^Jl`c2~srOZz4o=uix@$+*_}n-efitN;6kJd*8Di;)v4*&F&a%dY=1p ziBkq^gY zoXaIH%>q;b^|cHmLF{O(bHm_Uq{~J4)Zn9SqE}`-v`U{sjXhAu3!y4n6wk^z@qg{>&~XW(U}utzuxNv54cZ3oyn{QcMB7%%LvZHPcisD(377x$!qkZIp{tvDeB+odN8i-!;q2furr}iN5Wgpa zeWeUU;}I;LZG?aFi~5!xzHt6IDs0HWOI}$d9~;U}W`Ba4IrC@mHVqBuYk$iM$3Q`~ zqZZjPIx(k|Ps;&hUc|h?G0C3zF1J!`qU?7Xd3o520=5DyS)ZS&+x9*j&?I_xKvauOnJP>FLbj~%RwIfP7jLON+PZ$SPQ6f0Eb&d7V$w_x1OX3dUXmQrF z-G@^7&9kxIg&ROP_P<>cv5TzUc25Hcuu=Ika%cYV0{5z__m1s^FyY{ z``3xngdvlW+2$~sC^o!+xOarz2@2{k9XMmvl)c^d0t1aDtQoF3;AGIhnyS0k|L>eH zqPH`+F>o|t;4v_cucIxs+Yj$vn|GCprvYlbjU7g}7W?CKa%QkWX7O>~Z1}-O_wmm1 z1})}@(5aa$uzCFi>IJRIJ=1Z=b4G{sSg29ReSZE$+*OTL@eDQBR%v zr48Xuoo>xoyy-HTHsntO%7a6uL)jJ5TlH%dMf(%4WR@;x8NFkgLqRn? z>P0A<{uSfp0KE^3_$JK7l@P8^j@Qg29OZe;z{uVX%1^&+UM%n5=ipvJg}wWzdq^=| z?VzP$-^KfqCC}w5M(0qSKUlvzWc>jQleke82NNO4i}ZokZ6Bd@EyV$SYZ4(LyCPr| zrj9t?cWob*PIP7OupN$>F@w?Am}*-b^(yTC&j&<+bcSB=E9NR7LihN9BfUrGr7XCf zLFDEe2d{x|>2Z%7I7Vfb+V+~YQ&<}NGuM+`c}Fp`?=>;pHr3sQ@gD)0Qqs6G#~Yut&QtKwTb|4^|p1h@xG#<_&VM2G&uO}<@yPugKZ&**nU;QWHmV@ zd+Juy#!#bf=Pwy9ZK5cPzOC^?JEV9z@hWg^+9m+%LA{8@zZl#;xpHfK<>o5|lvq4D zpf~;+C^* zsv{wLXF+FNe?FL2Z(rQf1AZI(AvS8-$(k`X8{z zR#q{!cLs$2kZ$fL{t=a-OyfRFHeCpiI&mITvM&9V1wFiNuCxGFuv7LePWUCGK!+xW zE~gOSE(dG8x}>N;@5s`!ouFt=Pw_o*Uw+R;m}8yBYs!qK?Q7znW@Xgrf<~uf+?^m@ zhwYEh_*-^x`_U0Wwc4tSh_MmRp{E#hY;z5no!zi~JBk1w`r>sWHT;v5sa*;~bC?ER z4Tw@(3&1!Li?(l9`VRDKXk1rvC}s7kjI;caGD8n@{&FnR{dvB6_#}oq z+b`ub+@>*Y(hU*erzF;ZbL16QGRJGxw6?<^Pz!iIeiy)fd(BJ zKKQ|W_c#C1DG{_Te=dO9}R!wWJ-T#^Jw%1(SZx;efnETyI zo!7>?VrYoVFD+sFhxoI;;W?Uk<`Cd2++P&91~E|Wix#~7Li%ODWBC!?HKa1ww^*^h z2(~A=>n00La@YNG5PDvQSkY_@r2-`fwdoOk$zZa<;89v`>twyKU-sHWcSobsczsFs zY<25V_X>GCMC@;#OI%;c_Y%f-4g>B{)`Jf0Z;oVp1RRe}cTUEz2_@|qD8OjtPqRt1 zpX&Bl(}~S-EMS97L23hU2cFReRX;c@S$sz6J1SW4{s9a;?i<>r{dVe6eZx_&^K}#l zV72SKNbrc93^3#1zQnu83`bsYVlbK_y%dP`$t<6PqLUSjXJ z`oeWY_W(>{pzFrb9DNcvws-Oos7nSDS}mK*_8YOe$F#Zl_TBn8&7%WSoMv=8eVyaV zur&@?lRVy?i#O06?}^;ax)U3ZksTZ-tcLhXBuOB$3m7gLpnoqhuGBs6149tsD6rou z4dKwi^Gl5ttyG4Oa^$~JS&u2*!7VPwzK$!gb4&fXmImY3bVuz!fz5N_D6fFbtF2S{ zmk8*D7293`L9S1=7u*Fp%zq#Ij#owrSvPDf@Mgd2V(LZHh*ahRPz0sMj{Mg9+{q(iY@}$1;CAqNnmv zCnmS}YYCAUG*yXSVaHUxVvsNQMPK=?0M-gO#qX5o^2B z62dZWczV=5_iRHCY5$M0R*vT!7tep>?k1JWQPR_7{fy80PG6V;lBd!lI4J1k9~U;H z|0+s6V_HMw+*YV4ms@V!dHZZnA7w43o)prz#foEh8u$7cC1%z&G}#$T1}Ht8U(*K# zS-Xw~F!p&Zn%Ol$@XyZ?vY!b8iBiie*}Ud!=vgkdP8NH1Wjj%%=w4gO1J_ZWD`7ef z*@#pzx&1S8jF5l$LA&|j6rgKX7e2GL6KH_>WA|wrv8zhE1$$lY)IUYhLC*}KXeMR~FA>BbrxWIwI@lRl3f z(Uh_xcG=sO*t{QtIErjhtIGP6gZDT1k84!ZNd7a8h{>uX{?~PpwRnAIIKQPqTYG~C)_hQd z@ol^x`+!s?vr?D3q6Qq_rAS_xpNGkEpk_OtR3HCU%Jrfo7fa*?18uA}u*Xq;{BYqb z5b^xcu{H&$R)t1ecpq>&B}ql-eLny;lrT1jeKvgZZz%<$iy}ttb#F?8U2m**Y}nQ_ z4aeC?s$9PpV1BHcXOlG`X1s#h4s-L5zz=BTyO*z5s)Q{PAQJf|LnP`A`gU)=!S?o2 z++Y~JaYnxRFFU(4*C6kk>OiPLBkiRwXoLU6=hp%J38YFI-B&$ojQ5HI1#cI3U1N(K$o7buV|f=5*M~UN8m)!RAWjxeIY&Hvs)P< zHJl5p?z2JgUz4-!(R1GNIr}Vp^yJQYS?byEzqlcKq=C{<90G4m!XapX$L`;DDH!lY z0dDb2j_MxR?iWUmP1#IvgqF!IRzupiZJzfDABzU{d}ja=(66KLHsX4xPKeOG;M#Rs z-(#S_@#!er?au?O-$rBH8}`hT!?*Ld=Z*iH!u)Vh>;La@z9ZMJ(Xy$tz6{`u*vGXV zSk~@Q?_AdLR>(OZhdLvO4Tiakaexk=@%;Th(W9!|({Fih+%g~Bag1=v1zFJkAzNgi z5BMepe#Ww%S#1Pvw-pI{>%gRDqatBZdx5p@g1ddyR31isD3HNqwmn4^apxemQtz%{ zPmA;8-op%)H?#pzK@pURp+)+-OOpcR`p4J_Pnz`a1Jr$bR$VMP<I*9(6NU2X!1i(loL8z#?+0M>)sHjC& zx6P*-4+sMfZ}$!qb?1dxbbi6|t~vsbyA2f2zViX!pAW7%iS6-;A}iNw*aIrnPUAE6 zZt$zrldpLrdBaarp~`V+jd*U;d?4ATWdTOct69bY;(*fap)>Ah-uCSrmePB)_%+0A zqd(n2VMNsylmMUs)k51hJe*qys&ud1Sol7uBIgU6b&paEOs#uJFYf^`s;PpKv?&x- z6n;g8`BBHaTpj6i@a5ji0U%=vg_Wrz4YrPe`&5x+xs3ki50SKkon#rHAikL<=RE{D z&caql(|cTu4{S;Rk}lPc@p^%|MSn3o+;6J28G7PH!LRL=KATmZ>`@W|tKm+s`mS zE0F9?G|-j+NN!4!X)|NxuIPi#gCCaaGg5?K`k-JU)J@=Ku$6WI)@Zwh?~kY29C0jn zYE4BH-*SLP)_c>YB;o@mk7uz=A$XUl%>)iFGkILxCYc(Eyc07JsqMEWDwXKyE63y<4TY*H}(cMHuiarp7$Hw{i!yb}w~ykgeYs93u(A z;`E|EQ|TX2a{QS%SY%;aVuv|3MJfQmEj~i@`t(?ALGRnCKTmi7|7L}Oj-f|eua-Xm zFDLU1b+cUJr3q+qRU`-r&<$6*id9pjtVO>L@~CMoSSH2Kj;rurzf3eUDt_#q0*_wxQC?HZI|mLu zIe`69cU-*r@_Jr7ES-NKh9i<+6;hsBgTlUm%~5v?XIIi{+3wSQYuEaQ zISs~LG%&g9ty7r~rTY{NQWT3yKoL_WcgBxeA?Ed-R+iNXps#Cc(~k#-7jd`oyPeG< zbs_1j=%L%|-cL{Aw0)m6uoylv3G3637G^e8eUx)PAh3C{=|p zE!wpG&uvgQ`R@V1<@#y@pm*45v<7HjDB3(MA7nwTnOzZ{)I$M>NA&HD8j!n=j3eHa zNSjst3at6~0f@+_bG3zkM#ZpyV8{iUM{(CXHQSG3nk7;acKUn{4S+)RTpOfUDepzW za=?53Tc~mXL+epCAT6DV)YNrXE~i3OPMkg`h&^2L$0bY?tSbV&JEsKgpS@=+r~}su z&v8q1LM=Gu+&{X}!408Xe+dkja$VjiPJjb(nXVV?vH>naV?t(k#bKQuDh~ZGoJ=t( z1_rIva$yav+qe4X`T8wRq@Aw6wzR*qAoo(ab*pQxzHM`*^UZ+nqf`7})$hi(OI3Hj zQmtj*KpTfHZ%oWJdCXW6U(Ezf&lb~r3v>YV8H&^|X2q>vU6l-FQSs;rgPfQ&=qM{ zTs0rw;>+^aG7afxh_k#V)jaK)OO-&Cxwegdr#>c_-((&ZwKJnE*t@pB>bqVB&^C^i zBH~Q#kJsi3R$}}bHt)2nL@wv9pVyD(9KK!8EnkVrO$4^>Aa`EVf3(jfv$2d+nrZ)Tsc87+<(gdlx*D+1GoQv&VkF@@|&=y1Y9mw7l4w;VLt=#E|>m6~K9)Tfs zDi@|!k%L5iYUOj1umD((M6G^4Ds0Qlew;>}NqMI%Jd_erYNGG@Qt=mHI_ zJCYi3n^e?UrOnjYP)Gm!E5t zY}92O%}~aJ8h&mAE7a3)EnfVu`X{@iqkNda=_%1n{tz#^q~?REPop=54r?S^cQ6P? z;icreY>80$;|9B*ZXekjsjIIztBk%<mRfJl{ep`~~f#yEL zopC(zyZKbc!oQwO^gY+!c*!LNOySu-6-=Y_C7VT{WD-$^;g(H$gQ~5QBAKXJD_p2J%rcm<+3sk zT4${R$LH#Tq9$dmE(*o076s)C@rS$8|@frpa4H-Ks%u0;2FYRrC< zjq->&ByMu|lThJ*$N2yMns^sW_BkqgUIG28)RdZ-W*_i_8b`BwOw9l8(q(S-mNH3lF1c@=Raz z3Kr7JbyxPmiE^8)8n{=^raS^*fxmkJx2pl+5meSY zh>S&faT#>;E1s3m*&xZtxpox3dT#l6tc62?=C#&M5j0*lnR(m-c;`F5M}Z;pu>=g% z*GLL4dr3u{kPqFW7BK&8ywicCs%G8Q;uQp2qg|Vo;Da@hWQNY)t68_81l@WxRgoCB zG}!1)&in*&9hHR0HQtUjrkQ3(hQmTw`xMJ#AhoZid+@y?4WQuq!J=1R&3&i4#u zkMG>po6db>WkJ$pXtpkyJ)SUN7uiO1kISFVE>7es;%bDK>GnW#OSP+eqkDQ+*xz^^R_hT1;M{V%MB}P-hopH0fZ3Vl6nvok|#$FT<-#IeVIqn5= z|NDa*bV&pI${pO~nt0k&$oj_k&=vLC={IGAo8XYy5&OCeMd)??3P zB%~NjkD@;&yDSLn2VH7#H42l;RD-;R&-0WQr=u*Vhlr0VN3^sja9M3>Zeu_0jQ+_$ z{p_&9KklLZ!&=ue13^xOmA2+#3U;T$Vj4}gkd4J8*{!_?yZK`k__$qgPBKdvoGk|U zP?R2OOY3~GrcC3adRp{%i&%Nbc zZB(7k0+FhOYt~))|A2IYp}AAD@UMOx%X>QM2Me$y^Q@m-8Mog%wCxx+!jiR;pw!b- z399EEX{XLURjgQ@SIr`7YFyi zZ*1*<4Lrj1V7}*R;h9EULoftb4XoGE|E1dLopaC$JNzNBaDMYM*L>YjBFw6m?|rwr zRVLBKCDvwM-Md$vEqK-<8)WMJfRy%Yd^&nEK0T1cljomi9{b}}wZ+m@WDtxp=LC%4 z{{sCExw+UKtP4r5Df+vgst z2)%yPe5H36JF^G4kgo(zM~i%&l{+feAxHBm;aG{Ku9T2vI;)=4IQM;%RS%>K>xUBT zfQ>!_XF_~hc89Y3LqAT=+VzYgmoYHdvG!0?Kl|UH zqzE1`fh_oKM`6zg(c4YJzu)=}>W63UbGvkBO@K6k8;@wZoSADI@n2#eW|bw(y15F1>N7iKXHX^_o5({k8+} z>b^N!#@X#Zs+l$Pi^5jS%%1-$qpWmAVF4s0*k2`T7cd2rnLly$RO2Yk{Q zb!t+l$m(lnl=g;OANkA4NKqC$B0T4bBQW>NORVtX4RIxE?)n8B*jgo@y$0+&f(-4_ zJ>GSXWU66=91+Ju_lDX${Ost-^E)@lUlly@_-jg2aC7*;Fegt-q>y*-N=#WtW7tY% zNOBQfI)ftHBYbeMxLCmbfXjls-Rsg6u^af|>Ss?B{E1^>5&LL!-pgQr^x3&OuO|c=(ms} z_Rs}Kd4z3~zGUx?va>)&c-!fw#4!DzYJd?HJW|5}o;3+{*5d%*gPHJp&dLeoF*Wgc zVPnML&_PVMzVOfM?hj_m+F19FS2hd|w__TqjWW70ukd-1IzfTkD7Mm6!T)MsJh-Q? zqp_JE&WYGO!%ijBgz*ynQo0YeazB@FHiiG@E{Jw}x)B(nGZtMr*(>P?AToAh3pC=l z?tD?_&-8ycDtd&7%DtBK8SWNwK7ni@^K0REh)JWxygVY>+q_(6O(sdTydPVk3j~Ov zj>|CW&IayGnMuUN%*+ucqm=1R=N>#md<7^2M2jT{tFB&(E2Vc4-QXfnW1#&P#poIe z@=)FwkswHw{+uFEe*^YP{=v@*r6PVlQqtAbb+*~>qVZDsc%)1XX{RB(pTpiYAn-rm z)&v}#NynF<_Z>J}K7v3QY>fZVFk<o>f18p5LrIVVT;%T$T)XJTH<&@5p`JIoGKIhY> zHXA7qjuRexOL*@O-@7V#J1FXqy(|1b${>DkJT6YM{CLo}lg~ic_IO4_P}4q!v+*r4 zI!b<=|^|ZM)<=3| z7;uO3A=Wd`=L9mL|B>z((QvZDWl=>M+%9ZvDl+w{+K%2_Z4te|?Ht=otQU4X2pdox zY>Ls`b()o;FKcKk{<2+gER$yMN-O8^e&)Jg@Yo=9{qx+6j*L8?12tFsZz2>ff7y3u zu#J2Nf7fUJ>Pl7JK!|ZJ6z;Wa*;uMmtWP~7&hyi}{RoZ9P~+cu+p7jjO%d5y4GIcz z>2B&Shz}tyi2rdFHxC-!+y{zT^3oO-%Jh3V=yj37(9hijlB<_RcJfhP3>2@O*SEav z)YItWH{uF~I9h0*lHmFv>l)k7I1pe#u9^eFr7EDL+t+|B;)~nV+Y7K1J9!&RI z9CBlmb^9T>tLvpEaV6~R7_fS^AU+Px4K`ZR5-aoQ~ug(Pc^4})ttkiGv z1jOgJOclJ_?&*&!80PwTb_pR@S5h?nH0eWfy88)QhZODmT zf6ff^#yjP(d`k|)r(_4n$~5>bbUTrY5dePezDd&&IHTuTTD4yW7rE-t?zCGtd#Q-c z=XcRDd~Rx=Ro|UIw^PN^tBml8HAj92ypGC*OBqE%W35jYC{E1R>X7Xo`o!f5-|5WS zS`B$C{!rdX{#f$iC5MCv8|CJpfECwdSSTR@&=0nUI2NIaw|z}0kzLbwrx6p7*IkJF zu^+ed*KXu6mV+?4TRdOwg%FQKPjUC1*egMQDT^fj{tqFMjXM$xw5bZ`&&HUR{~(U7 zi(-*Z=#uAB4nk*}55Yd=mhC4t!0*=D8U1s($89R5p>Bo?L3WThIcL7B+!oS;b$&{+ z05QEe;q6G^R9b~XW$JW~&Zz~SRWs333sZvPSN!(5t@693i?C)Ba7$W6TbuCW;vKTY z`e@A9M-i@$p-&BFUEmkV1+ADmVC6Vy^-DY{pwIaqn|%t6j|XxW{O3F-FHd0prjXm& z0d@gjeV@9QB&%jX%rQK0x14ghXBOXF?|uEg#6BrA)2YV!UKEaV=bv`V7hHr7>TZvs z!dGJ0$s;iX*L}kyeP# zvpzJi^Q{Lezrln~#9WgrkNFW)TK1nzxY_<*Yog!_?qniXoAkpiCn$rlV9K+LT!SN^xw zIYhnpN(Tp z_9KI@{AuoTgTMm8s9SCY&u^E!5`a8_JW>uZ>*>l&`k52NDE~2j`ce56A#P;H<%_=I zPhujOuCveu;lrfp_Id5216G^si^LBGIt0`YGRENPV)3+CGQ6t^awxfIbW|J9-MZYg#6v!f~e6p{T1a5p3E8M#K4%!e8|Ni-b)+94LcDk&y%>`z2f`y%!%Tg@N3<-w9{~|9!%&~_0^WQvOg8b z`vcraOz?koJuv#g8=K)zZIT?a!4aOa+jHy#Ji?{^M}uhDGz}J+ z#jaHz$GC4EyX`H?To6Ax)EPI7DSZLV=6?s9&BIddS6;5U8>BE645!$+t|HlrZbtWR zeLJZLG2#$m=T7_f1o3B31o?HDxr)jvM(A9M$LCwOyvzsf6Y}Lur3ls{sXCV8DmMK? zjL~&1bLAG|)vt8h#s{1e{yE4TcPb$Xt593_UO44xlZtF+tyott0>CzGapSSMve5Vr zs0&AB1;6|#ctq23wyL3sojzdjI7w|VrFXb05LjQ<&J^{1g8km1NB!;XcS_z=!EY-3 zncS+>3vl*MvT|B)%1@P5k6?LnNFxD2d!W29|BUYI&MfOdq;PYdQU0N<7s?~-oE+%b z(#Kp{0eKN0vDpi`bqg_gb0wMg@U?-~L>CT~8jxZ)ROCMXpD~|yyt^!KR)f!v)to8ATuu0?N$F^;-a46@_&MC>A()j&QdbLdbjbT2U(5M$OVaE}1 ziHBQ!FCC%>l!ey!o7bghb_LdD^tU$$1nXm1qjQ^aGDTuWsP*)jV@HltX6=Hz=J2=S z-swq-Om~D{bzBcZ^q!ipyS6v+%vVS-XTTP|KKwSN|Q^%I8Q~vxp(^#aMIrb&tZQuR~gUd>sEFN$TpPp03L97|Lt3HhP`^iY9q7O|Bt2f4rhCR<9>#S zReDOTTIbiQU0PbH8J%iZ?A@bEsJ%x>IIRw=W^LM%+B5b@7cC`ppd>0WAe^qsdyy-z?F2@X3f?1znXOF!kdmhpvJl!_J5lWMtES z;mcKQP@l7|-C06=6Kfm??%~jOJYI{Hs+J#UuwcuUmE5APv3Ay{{A$t%ENU4Se+vkZ zwhfLF1Xj+_Tq})cZkeQ&uCknkB;2s*Sp*t?H~X9Cjq`_x{#K$6;8)eTt%7p`%_d{! zmlwjO;s_^fx!E`MmpJI|q(DRlO`!47P=wn`(?pGjZQkV}w9ehyorvwwCkEst4It)l z%~K0$KBelP2za7>chhjiOPm6L!q10}X>SMzTKg z`fwxzGKgiX?Y#gO3!XB|%F+@Bb$Mbj$XK4I`VnRUwuDWOjxYQ4>)EI&%&=Q_A6>?~ z$#uuDDQS>Z@``RREA36jUNVGEel+X(^r% z9}GUrXJR1c5+>@w83L2-`os>Hp;B*JWN2)66_t9mFc@kG!e4*EkfRvuj(248OmowT zlnSeF-l7fEu(d`122$miQ>pLzu15}-{4Y@oT;!VqylB2Y0m0!T$_mrK6ZnC@778e# z-ZV^H8?*mA7G3=3wfF?NV@_%sJ$M{1?6V?%w{|Rf?7?0xunW?RVw?;`?ckrs__xN= zrhNN+9$PYVJ@-KAPAhrzc7V~D^Vu)2VfsAk_}Fk|10YV1DmprnmOsL9`XV)U`0EXk;+OXyAIabB=fhB@I(UK^u^-avmW;Ft)#UZ5 zVf&36v`#N-YUED-$@om-$$@c?44t8UIL-gF?*DFeyf2?_Zf8gBY73|wGf#I(0zYp9 zGhQ!h+jc=Ix7qOY^$h8BzEPl`=~)kCX0R@|UNQN~Sr|=*Kg=*F0fb>mtKN8`efXz| zaR*smv5A(d`ly|}N2kT~xe*75vbp%gjOoH9$%1p249AhKYhJB|X_@nXZ>Gy#M==%% zVjd!;1m&k5-Wv9u6Cc8D5urjES`I@171dg%o4P6ZG{L@j7FRUOTqIhmYv;KwcaJ9? z*F*z4aXvQ~4uFx7Q?>nfBgo*Ku)@JkS|!G{c?iuIi}f1pE8#%wl*jpz&MPa)e+ zlOJask2;>l``!2ZcSME3KJnh)wUY170^)qM4%S_#^D>psiiJbx?$Dm7?GT?d%bCvI zqG^#l44pi(_-&BaxJ^mpc(<2Oc+Rcosyju~$6Z(xoQ;%b6aLNl1d_>6JQD!S_xVhz z=U=+7q^FqODIgzb1B=krAN7`*;tUFke)q-1-y`d1bNyU3Z%pIr~~Mgb#^0Z~*+u3H9pBk~jB zO)gnl8Scejpl?1@V!I4Bim|FayBMW2Ca|HAO0OtnBdKFaq%9!V{C?|wn4oR;*!%-W z``C`|m$F=Jh9Apm)1xa7!W>oiR`&GlGiVpr=)QkEGWP(W-lcx2R@QNE_43-M6x3mZb*RZjGlo*ifZlw|c6Kd-Q@0W~rBS zmu-MReK2te5hubFdmE42~9cdT}=VlsnT96Ph-0&IaNO8E+xQ+#Tb+GV9ms#}?&7wT16 zJ!8y_8k|~bwC1|{wKc}y`BQuJ5O0zy>$~f)&UQXId|b;)R^vv8d(TOBg|8aTIQ*rj zB4KC7)nN(>_~udo@M%P3-mv6{)RbaU!m}R&FA&cYW^c0U`^$4n^V{VNk28lyQSs1` znk2u9exacWMb9N0X5a^sllulf0Pwb+gY^s?s0CZEyLp7uZBBt~^M#}NKeKGmn;=v{ z&Fyc71g(#OhND*;fxs5(876mVFA!6S$^~r$zfO;@o>XE!@MUtZi&|h-<+76*hU#6s z!ZhSilJrUQ;N!ZkDGo%ShKNI7i}uk>L@I^y zTeK#;td}&fK6@2(eZUNJDbH_N3U)dAy|bWPIk2*(5#c`X3?>y1fIv8&YNkm<0~!U5 zc465dFb<3d6&`#Eo<T0 z*mr>Lk$-E_9`EGR=>STFh^OTFk7yf;p?i`ec|&B6S7)s3BjA= z>pLvz9R63FuQ^u2s)tBd1r1wNAiFt$7dImI>q<5E(u%NRwm@HnweqSPDSM#Hq;;f` z(_50|peXPq|?^HsgFsno}o>e0hkF>UP)q{SWr7E8<(6dF$$C5Tm-Tl7Z8owx$o~##lpz0eIzaCsgSA!*!I$hv?$@F$MTuPyAYF z4(1;C>HZxJiR=0B?iCIdfO26rcz<(uwuHVuI2i9jEZI^W>9W!wnM5rzj=xtjtfy59 z{QzCWRnnVl1xmQDQKFyFyRE0Yjy%9N<|w77_5UsOOUlvz?QF8WS5)HX?f)>*9UcF{ z-cH>^<~pN7Lgr|v8I`Az)ip9ZL%qy_Ih7${z4yJ_hcG%s1+LXCc>=!=ig&UZa z?bk2^PkzaDkwzi5u;szJFKKec8xYXgDe*VRj;o-<+E)u7?Yz4GUu{cWWAoYgbC>;z$-pS}4&c@( zMRfuZaR3#Uw_-TjF@vAers)1(6pxSK&o5{*mOowA?G<16j#fky8tj-~8Zea_J9)XN zZj!~p&y=-D$B5D(Mq{3gmF!Pt)bV;tetT3zX{>v7{;b3p4PvAI zhfj4;Nb0QlA3+utY4V&yQp4`}KFFtB9<3UfJePApUv!1*faN??thHQ#GUM!|*r&*g z%=8Glvi#vncWMiG9l7C`p78l90=AF$NHQ8ks!vaU_A|VZX~TVz?S4hYGh*m@^RgOX zvm5MCSx03V>3A!~?j@otDzX|n+l|K(v#Xt4P$R06zEtH-sn62g&cCG%Yzo|nmnFS^ zydk^JyaZtcIC=U zQFTr`Xqv*3hz1-YXLk8A_`4T=FK7B_9Os#K3##bxl5W0ANin^#$rlpGye9Fh8MtkD zVA`N~zM!33S7!ekLN|Cd>)V28t1f$adb)h(fTswz#-t-+v8>&Put>0d-sF2w;l#o&CY3E2# zW4+3=s$o;W>jSwOZWElaJ{kFOAD?FFYS`CU$ldJ_{)u0#j(d6?TA?-cKn+o3&?s{6HY z6)}X|sKDxbmz)?Yy^eB%?1N$uH}0H|bcfJ|-Y>7KB8r?Y{$a~=XgZ3xd0&TwxPvoF zFf%zXkv4sWF;VQBqgFLh_+EhH6>D6j11+9g5 z=OOrlD{ehEvpv3N)c|}7uTie_pjfYIL5|h`WefQRx8zGD2EyIjn=*!;gmPBU>I;kG z#wtcSTm0W1%$Xf6UeH#Kn1_msYGHQGB~ zIL=drH8rmtVRq9f&HR29XWV&hW#9LHru4mA&3A`_4-tmoW_0t&z2Lwg6FG4!_P1ga zWr_G$`|VkNu3_=-xxZX z-+_MJ@Sejok!Qr!b~OWkR2|#d^0@k#O|+j|xxL=*zq1heC;RC0)z#Icx|kuXX^($W z#EOu3N(A+T|FZGmFsH*6ghHpNexgWt9uAeC4Kh64gz0h2nf6_Wy?_)7)e$LvX*c5k z_Da}$kn5BY#Bt)eT=`2cpLlOT346^%SwiLT9Ba_M1gO&c;oAxRTIik+IdjNnNRWb| zI{J0jTEZi-n-*F=ifD>*`h)%dwYy45Q1FTBtVU4iGh7iL5}|D`VpYUl00wq_WJ7Q? z@d@Z}*wcg|2r}(LK2MT?=q&qt->_}Vh`r|}M73q`8;O6Yc`YbQrzb2C358Fw6-|DX ziibJ+p_Tn{FP$;EogXBtJWfyR_VY>UF8i6&FHezw?fi53pa0$Cb$@eP?-y%>36d0d z`FXN#gIg9W3wsg^`{(l<&u)#Cm+NgDx1+tnHtb!@Tl_Z92%9`kF}#uePs*eMVSoj9 zneFlRvnk!b!bg@G`~Ca-U(08uhp|Cay)P`}-#&Hg)Yrt0Sd5efOT9(;x2WTwamICy?bV&s-R(Q1p?_Bgl9F_;2jF zpEE&wl3U;>!1gVzd|XX>VMD1t!`No!Y`#je>MNMcz)GV=&q+xtA`qL)=Tz3AcC(ZG zS5sLhLnuVAz^LmlpVA1?pTmoifDG@_LdK$a`P?r0=&?gr>9LA!IB|mFLP~wM%o8;o zrFrxxYG<0;SY!7WTGJ+KO4 zRUnUgejGuBL&RB0ED$HNC~OEcOEdB1ctpKn1@1CL% zeB;P&KZyx0uw+%z9O#JcTW*v?90xm|^b9T^>e~z^pL9LGd744lA2{yF=cj3N<(x35 zMb}RjpG0~B#N&vPxdy?wXqo%uM0>)&A>Uoc+Y6l#DfE;o{jRfPq0IVSmy z-fFz&xfX4BEb)=sNMV_0m&M&5!S~uU@Sd0$2(|u;Zp!mP%>b8nFa6kGXVAeIUc8dV zuPaT>-b~dFozsIFI=gTr-Rse}lnTj$zO#B4jX$#E z;ES)llmAVo6XBC~+Oaq)&?)M zV#HcuaIB>6IPET*##*`@O-j)^JNCXfryzlcd9}}r~2zEL=Sm4BR9?h{JNM4J46EIs^=I<$o!@XdrC|^5;z2 z)NeP?A;O{{*jqK0S7qLHS9g!Vsi9=Mn6}!bJ_MPT_gzFb|AbfDjVp&S zfi3pcL8(2ozzdXCR&vL)5A*d08jNqVx8AVpX-izNk?d9VBvD*N<7*kCgw>*P;<^+BrPG>*jm zL4C8L0(^N+h-BR5NSRo4M>Wcx2^qdmL>;b@IdU#*>OaN}MZZZeY`C@?Mjh71Ir8MF zZC0nBR9WvE4y4w5c)4drW?$G*WyPCWyjRfL$=3Q-m7ksteSh*pW>uyd1UlV)a7V{X zmr@=^jIS8y$g}Ap4Gsewz?-ayzy1hHu%#Z_r@`+)#a?PtclY?%D96C{X$-zj;|KoO zw@t~Zw7us1B{zH&7(dJ$`@8f25}Hzd1e63@=wq(T93v;U#n81^=0#U8r7gB>-OtRf z;c%;558Hmv!_&Em+7OFeWkxxLOt(h5hpg9hbLv8ZYE)px`fFh(%XWk2K~7iQ?-aL=6;|&qLqO; zjO>BB*&PQFleYp83`N&+bVAoxOv-J;w`*<$ ziXw+F;|&6cz|xZ$`&N!DwI=pI|EbY8-<+5BY4P?7K8{%>cEq?4*a6pMH@Dcj1)fP! z@0-XAQ>`;|3_VNMJX%!ksL}EUl`_@$1GG>uyQO`874qfHA6a}7usb@Y;W?Gz4U^*v zSK#-5q#PeEup`KD4C_4|6n?4hnj|PKPA8vdJxk6>SPpgex~()84{~#Cm|oJ{*Im!H z2=%AK()cLx9@-XVO|Fmq`!PtnMK5Ep*FDarQ=rgk4Xr`XdmpQg>><|5O9E%&O zI{o3ZpASIbcUm`u)+6Vt?zstgTt&F7{ph*YGkExF8q@S;kp3=QILA$~v*rfOh-br2 zknZKK$Rcmx5qgsFh{T}ZZV#eWhfg-xbT~4zygaliwmQT1dofQ-wAl10GWvsu7h!tV z=|%TJ_Dk{mv>jI;Y&wIv0YcPVJD?xqeI)s&XFGXkboy)_Qm-^GG3x z+d0=mtskx>T5tdOe7tyn6-ccN`t7c6gw#mz=-=e`1CR@j>6PWzKMh$W)lRS=z$E!G zxXLF}eMU3&@pep_UHV7)`wQlmH`DfH1Q4ROg{*I%WOir_LJgqzp@yHFe10E%twXkl z&g~EyOSC2;7j`5iRP}dVE%3)C@RMUqo8g*^g)bz$R91A4>UW z`8hjfoxsnsUK%HnJ1Xht2>}yR@91}nCfEEs$}pWiX)qT7yNt`}6^oM%!j-t@4gc>g z1Ssl}9+T30#5zcC6ZJA>s9HEVA7K{}SEyzocCihnm%TnDAP2uaTCX?er8$ktz9OS5 z8#OxM$8&$5Mr>jb&&#Ywc*10PK+y%|Mo<&p{^SU+a#J0Y7s%a{eZWkAZ`|9IcmZ=3*3edDbU=86|Jf9e96sIA6o*(JVWNWe=-k zlIVDnGa=?sQViH`g22Dj=Y*dE|wb>Yp8OK4Y*NXRSe6qauXe) z>FW-dwVpCP)s=I!LfsL5e|&Td&Ke!RKJVi`vEYthFpR8(=E*M`Gnb8z*lpjDR#GA0 z-a)>k@v+5!S{h}_28Ei0{vSV@efR%9M$oA3oGD-xtwTwf8RfTo?{2k9xMW^!-ap&=RPL;EL07&%GqcJq3vtz_PeRPp??loyn^ ztSU7Aj}wr|-A}p6_TqJy?+@tPEIihA2dahg46pv@?jh7UtxhAKc+29yMn6M}eue9P zkm9h;y>7ag;HvtHCZ|gLx8+aiO9PRyia|6}Vrr2LE`^FW$5{)xrAfS4){2;$K4o6d zNMCK8?%pRV&@Iehx9xG4%x(=Y>1_%1+$?_mrXR8CmT{ zI22I@es{U9`MVZ=jK+88jBZg!C)%-eLu|PN-EK!Q03_)>vCl-;oO~fJpMn|1UkWMuUQX!r&zv!7NOU^Q9{?q; zJ=-w|$2|!IVq@vi#bEs8N`S3(&ieF9JqCVjO{S4vRdVVcMEiwBG2f;?Tefqo^fn&K z$rG3Ry^;}>y=(b9FPSLwXC5oPS z`2$lEV*E|of$8BMdR-bAkJ0Yo5rBThFhSO@p z&>pM%K|cKY-*+F{>{TtmWlC(zf|`mukSfkUk27l)?wtPA0ZySUhVovdycQ)pwJ5?@ z#g5+EW4is-n~0al_MdNxRw%zNTON0@axtI&iLGDXp#Bb2?f6C=#uUB)Y# z#SvxqDQ|AL!jTW1f*@vu3&?B_iv=4IZ726gLO#=*Lt2Vs7eFiCIMlg!4%k&LBC~Gj zHqS4)XZ*{nO26NHQqsNjInbWV$iL#{H(z22Nrzj7Q(7`|A>xT$@FNV52<-Nuj6@)p z!TUJTqhWp|=MgNK)sFS~WxHhsag#qg6X2OC8NM{5?L-Aj8E0M0wtzfL?EZjR=*d*# zvBJ88ldvIfg{>a;4?v9+7wk2(?fN8p-G`Ux9Ln(|xjycfc9eS#uTrVQ0(vA-2(cDA zjDUerWGhmU_tTg~^XD|@dwrOgxEb5cSDyCr{$-Zou80$VpUv81TgH6dT5KVMBbN83X(`aB1`%t+}<(z+OdVU;ah)%=UqDx(7w zCU0b&=5FaIODeS}K17FUUOpsyB=!?P-HQq?o-MAfw2cu3`xKW=aI!Nj=U&03w?aw$ z)QgT1_!enuz*QvS+NFVj7Lm~K*8BIV!*uYR*4BP)UC_Z^VPkv8gj<`Lc9QCVB7ZXV z?}E8%DgJOL)YmY@@O$?vg|Izmo*L%vyB%(`Yhb*r4uA75K=jIm!RkH_f1f+{@^pV0 zq|Nf`pX+0v%;5Mj=yi)UT86gr0e-AD^pfQMT_efhK-2}k4F5X`UmSd7`zEXm@UpG| zowq!t7qSrnq^X(j>-5aY>#8DI*#InoHjr9tCax6NS<9kO-5kE*b3lAUk7yp4x}6oZ zaUz4A?;-j5d);nbq&22-inNG%Gs2^)ifU%60yPvq}|P4*vY zTTgEvg)0~xF3bfRlL*tYBb8G;0CkEF0Sl_bqswiZyFe1qVupMEXin`$M~@i3vZDFt zk$+#!)?1YG#n1`Mnx_`&WSIlT8VA7Lb!1Y2iF=YVv)>UAe6VneUfw;DR6svC^-UY1 z>kL)ZZ*(y+ij&6E*QoW_OCDt}pW%zP%C+^^?j~Y^#HX$%!KW$UpN&s5)C79+bzt%q zbH9{*(c)YAb$d7&1HZdA(d7R&7&}a-$8=PDQ$0VQQ}2j*OVi(}yQ3X>EaEL!urb^1 zf_J&BPuC%{Ndyw%ZXC(1StEIG6zosb4oce1P*iz2vvG)3mm{@d!THUK%SHYR>CHbb z9IOt=F1S}o=!A`Oj8N~ArLp*^e~mN|5iRy~P+&#MdQ8| zrpjKds@6E#9_vl3Y(L1HSzJ@(s*2nmjU`2#sK#1q9hQCBvn_Y@lp*${kxMG_YW6bzwKy`3Pi|T&-y> z<)tfW;al&*zXF8=e}lzG-evIb!<{AMKaa((30%K?Dv0ncB==rx_3kTB#6;pO=QjBB zzd};K3I(tH$k}hhB>0IQHh0MwomvHx$~|2-)%_n`QO-xht0$wVZsEG#qb-Lz6G+1y zyHK0_XLE3bGv)ypk4vUH;*MeazNfKR+Gp77-dc-RL%2=rJh510Dm7%SM3tHbGVmJQ zy?E**p~Srl<*|k`MeY{3$^&=s;)*|vg|`wvx!^|IMc*>uFx6x+X&G(o&Cd6PUzEfk zFJK9n5nZsd?&Lp55&bd}Um$fbhLZ|ZVo%>I+L_?KuvR#xuGKOM83fmHKKx1cqhu9tWWrZb>3E#?=I%L8~!T2(&V^i2N2{G9CQ-#|ZlFpXrT zD~_C5aV#^|3Vh8eZv@P7i$fVqUu5aBKDE$C!b{?Re;Uy7$4aW^7)*|`TN%j(b5kb& zrtYMZ=%!EzT$uG1>!KleiVXotAucsJV0v?I{-u2!2lX!pB#k4Ca4%pf|spctc{+qFTJVv37R zw7Mb&9X5@{ZffLc2i6uWZ@uqW;(wkyKCa>ExfV}(;XW4D3THnn<2JZL<}WCVOn=9n z)boQ`_NkLUNE7nmhsM&K1FXd?k4o@lT&8#%_#0LPX(0HWMc&%=iK9s<=vFA?mzv4i zKaW_GS0}-*8ay<|dQ+mjdW#>C=oOw*7LB2ft@|JfBJ+5C z(3X(?SZ2K3%eCA8p$cP*y;1d=DsE{D%4sXfz95)`D2u^-Tm{*Fc`bvLmpm}!wkL?rg z&KAhsJ(;9bIm6B%&!;;zjAp-J?3>Xl`LbD;8y|eY0;{A2^4Lj`e zW1b-^uYT`IyJ;!vV<3Sd`}6a)&0m-~2L?Q9e`5r*y0e$A8sw8j;vUG{UZ?5VuI=Dg zpR4_ho7R-?#2Dku3V;Ls?+x{fXRpKWf@>K$TD3RGry^XiV*cI9)~ZDXe?iX4iMq_W zpXkb%>SivL1xp^)(8C>4jJK#zYT0m8ENM#|IS!baqM0Mfk(&Kzl#+l3%m+90{=OnV zLb9MtUYZAj_T)~aYii=Ouslj}WYGdv;W0=-fkSI&ZE$%QgxsQrfc1P>%hmo>*~h<>XUn`>gml zRWz{>O64|K>+ONPSs;PYAa|YNkr6>zR(S}1u{NFDc*8nB8of?y=_C=D%++r)2!eQ3 z_+Q_vG~I16^6J(RrJeHk#+&M@JSu6C zR(39~b90vKe;y4qdmAUUe1PjF9{0H6%k8u23L;lN{#Y^ZTnTGzX3@jlsWy%3I;&h= z1Es%5y*3$88OfawduW~5(7<*Hb|0$Gnc5KI^_gPgy?E=b`NyCk#j|`wmITNFv8LTW zmeZ8d@>yE~X@&W(+ z^sa$>uV8*jZJG&6Pu6qK=O}82$ciD(h;Yhtu0jW}*YFh?=V>FF6$Xu3Y23QNE6jsf z+av9Dc+%3V>`Gf~^2A09#iV~2wr`hsV8S244%Ez6m69MQU*S%{(qo@W!b&UY6KAPq z4zeCYH=T-zG|my^JK1sPJScIP_mRV~?0P_-?A#DkC@ilg10)#dB`%Q7D%^ zsC>PdwgsM%;rr*}M|L1#<@afDudI=aX5o1y#6~IdADFxGu%`MrVXVQK!$@by8P3Cn zPY}zDM!|2djSp3h(r;9Hu5~meTD`5|gQ`P}$edXtQ)Mn^S|4!$C>?vbE9aFAZ7w8k zEwl`m9FrFAz#of*s6CdnJ9^4Ej?x(1|ti5E;*l2`#fC7a55Rx{jC zpND0A!zlO8_ziyPBCFyj%^gZ^ExzPe?on5NUy?xkYJU}q0UB(HC%+JifgfcnY-_vn z=}k_S3?%NwUmsbn9Gibyrj;pr^2oy;T6=MHS7;iIYv4W8<0x=}Iv$sF^O*Q@*tZ{? z0rXnY4>lvl+qfEMADhj3@;EKes^CUowfcot#4)9%_*+$^*YAdrzaNUGMtf5;1AGYE zhUF%$X`Zo}!?eu9y$9Owu|xB;y?!E^0U3O_ofL#@1!4nOIa758yJ z%EbS?@JDDg;&Oa8;!*ET8qBDunIE@uG>AimcJLCH{~O(s7&)3PYfkhVq%-jnOqY_s zOHGLRQkW~611VXe^fqCPM7apnMeSUMbd{oW*R#O-o&&=Zl>=3m?}m}3LyUR z?HSxXdg+A`<{Vy9oCKs&v#BtVP8Wu%Lqvs9SMUG|Te7?3YW=ofUSFq8debZd6jvQn zP-)-naF+8@ZuHO(_8j`%ZSmFP)^WjL5+S4Xa4;hL?09F?hRo_&cp=t3XCq$gPLNTti7%LfAwY#PP!Yq9?9Y z9z`Zk(p)5EPX@nv#mjCK$yFIu7-=6jPfNG^%#mki(=L1|sq?&|*lu+U(ti*&9J>0u zs5S_=GZ3l1?*ey}XSL>zwizQSCy{cpJzf!<nH8_am_$4MA%2d;LGqaihYuTgY-CH?Hdm>3LtuhYKqqFV?1lr@=b~7S`8|oc>p2yeNRYNL1;i z$9Eq`(r3vtKcCT?n<@JrTs*U&KP&B;t$oN#UjzT-L;aOwiWr_#Uo#WG_EFvP^-U@h z$xTmoM8C_5wed56(wRGF z5a$IrhYp~|C0H8EDr{TGc0X8`75HH2C&zWG=9&wR5}98FegW6BVSlKrYEm zv&=q>jSwBVOYUM}DUMnuHC^!^-gjF^3w=T4czjdPANp|=Pb;X;-u~*RY=KWtiY~%+ z{1P-NHpH;qtgXC#V;SdLej`_pr=DV*<+A>qkY2Oj{(+O&;J0nEy?<@8rG_Z# z(PW4bC&_=aJQd8MhpxgkA3Av!;I}7!HeP+}e_Zs{a49hS0<*H+Tnx!#k_M#f2b7#@ z7+R3bg5`8W(R9`vKiqKK%i;H0Aj#fcQ9*yk_czH447xhZan+ZjddisSCV@uE;Oal8 z6QJ@n$OW5gUhJVo-jfa%)sHhH3;xH(>&Djd@wPp#U~ZR97bc4Pio9cimr=Gz%O_S0 zlg^RO1@snM=S1TPmoUA>BbL~DCc3R#rYZGCD`y0~0qXOf`#SSn=$r`iL0HdEDvG2W zQ--TlMsnml2?rhfB=I{b80F8y;vp+t)c)kdZ+dw(vKtr{dD8-!?`%let%qOmuZffmK-R4AUaHE2)MaDT1pcA-XR9fjqBPWSD#Oi}7?|Ll(U_|**+E}ehA zxpNaec8-fX_jyXSXQvp&s*P6(8=ry{85&_Euu}V6Do&T#4!Sie@Awd2KuJ;EziD~X z@07LJV&YYh{bdW9ys@*d@b9wef)d{sJi6BfsF%N^y?&P5blCs7y`0l}uj`*FC}lEy z{r*;iw8ZGd#B2YJC+lgB5d42Bk@Q{FGH)Rt;j`#5^^D???6teQ1um8*W-)-YLTHhoeIybrJ_$VHtY?2xXuv_;Lt z?n403LrsG`A`8480$z1}oGIYW5RiExV=UnzZ$uV#(zC85^{6nTA98zr_Y>kF(}~+k zUuILWsGdg_Usw2)2rOD&M42sHwWyh&*YsC37qX^^rS&|0nkFKBQ9n#Mc z!bg1=KM!XPJw|~aXSD#5*5A`H*yOAJIT&%4?@r$}%oR6|cY3|oFtf%dub0+lDErbd zE$8D*$>W0Z29Wt$4>aAOZFA7)a8M3rK*~e!gjDWTJgc$;qV8K=OV2YL04@1Y{xROg zm$B{9d95v^Zg1|;_RF%rW$*0p4X|~wcoOGZ0KZvjTqF3ny<08$n~Y0hU*6QGF~KBQ zee|Qs*ki@D#4(<;wNi`A(Z#X0lOH_SAPw{%@(R0ZIt>n^Tsi%e75qH(ae-*{-OogO zT+1_V>AeT`AgSM(3wx>Ux1rkKN*YHe6^!=&4xeASP-Z#Uf%5+BKjbX(xT88riRp_@_beytsfsr?8U#%D4^*~>RLkN5qcHeElC;9n8U$QuINujX1ha1-F{3G742L(XW~p+Sg#QFDJ~r-vr%BDk_7abCdqXb@`D z7u$i3(H=-a8f?Dc9Dx;#4jwgsftf%r;a!6JBxH4a2KinrWW++u3Ck2dk;##aikNW9 zY-c{8vgaIbn3lkRXi$?O@oE*P>k?_5vo`9efzczDw}Eb~&w~m${;g%>n&>@;**d~K zo!zY=u6z&+EY&`n0J?9H&>lI%t(d~|f*je%pp9e?LN-l}KbKoCJjjaNwsf?OSQ)U~ zvBh{F4mJ)eTjXB|&7n-s$Ovc@#TAxcmr5E8>_K3SAa_4~f#Cai*n*UP52>5E%=}*T zNpAe|OJVxbvOOjgfkY>;DfKzzIhQ?%yvFaJbpSHknm;Tc9X`!woqLh*VdNg+AC#0DNTgf#}4z7+>Psvyn$kPqofX_v3q!hL8g2katdl|7YfR27H@^x>xrQNiKG=kp`xwp_SPgFn9>zp(%2Lec56Tokdy5A6|w z*_GThiz4b2q?&(BnfmYP61%@%>FU360Zyqy0MR|M+;LRWRTE|Y?CsuOHi*-i$1p1% z!UlCU&3)SBn8gU(!^_ExZEQbOa5=NGW4du;oUk_O9);n~O)v()_AQJ|*PgV+JV0`> zKVOR$Y1D%Dj^{K?^8yd*Q<}0<=_&Z5ymN0)Jv$4(tI^NI=AVI_PKzXw?ER}w!Dp~2 z=UscMFne&pBrU*j?h0<`za==35h4G#;kex0JN>}!(+@h(L&JCPi-{RE#6BI^ohY1x zJrrnI7p7Y$bUs>K{|CpBXJj;vx2FYj`CkYcF%5#;oKqwS`~r;wGWHQwNboa(7?cli zbijSYrTpb1yeZsRuzGTX{t{$HPsx4`y)R-egY z9a$bPGvHjOntMwAkMlE9N4!U>4Dks$c~^cdMW-zp+hz6mVL)sM1(UD^i^ESSemw9z zMYx3atPB?d3MQN!uJ|uEmLrxA9NiF-7+&JnuZvP1%~i)7)*T`f1b?gF4WWp7kMQQ5 z>`|Tz7LD-y>ub2$`12YrxG?&}x0!FW#^<(;j%5oBn22MwyqE^2Ieo>|@u5D=!+TJ_ zifc6Q)J*5$tLv_f=hpP+bcW<-M!SK-$SXC`(}S&E$rEl@sqhSk@QUr>YsZ|5=j9io z@u`wbMZ42gALfFikk(%2w1~s;a8;UBPOXZj|H)yk1{n@#?n*L986X2{YAtE`mO>RP zhk6JXh?5HK12tlax(Jhguw8mG`~~FWisWXhUx?-O{|d;H+h*bLmc2_REW2pAJyYv6 zBdioG0haE|tc|cpTS4#N;)G|hCY!E2Ku}dM@Q5-;g{Q{9;@}!<`1zP(Omp*AhK(Z@ zvGzwD;3)ukURHTV#KF(%pR5Lojx9Ir+PD8{p3i5;#l!T+kMoMw*24=@9K%>lM%oCZ zl&ufOjL&D}bEB6=cp@h$&}T69Np)UnSrQ`Zl3`9n$?dmtp5<2&XTGYi`a^tPDW2tU zXsG|Ud2t{xSo~gVP=LOvMX7{T)Ym~i4YJV+NO-8Y=0}F6A(YS2yF}|iCR;1QJ$wDgeoJo3|Y=#}FLK*t)gY!iP;o>dhpU|Z7DxFp@ zpe3KW(s@F!u78$%vwS;ST>~c6+6j21cx|IbYlc@xKF)eL*q)?vUV<4s6LU9~;S>H2n~8>LE#@og_P(uZat_-c%Nt?Tc^zKEVpe&iI^!qc+~tM#tm+ofLRO zyYHk_GUP6_E#mJ6TtESEEuc!Z>2pNH(IjuWP4vuscaUKqci9qNN z21XG)x)mB8%-UV#An{kzAkO$)G4}4EH3RoAjAyh`;k7>c2fnSvIt})i9a=-!cMgA^ z{mGO+yDlclD!FSm)x|Zv8~TyL_5J4~ZE&gcvg2NGt+6Zj-K_ZcF+<$;t$|Mmn`%as zxvOJ4yU1Op*vj~#M1NKT=QMXF*2+0Lpuoi1q=8m#1&(nBF7$X!0Jm`*?jyLsBSRBq z@m^HE_8rS5=FznOnXLcA)4BgM{r~@e8>5i*ib#&HcL%3AREnIoUL7dMkn=H#CFir* z3`HlYFgZ?zIiJsBlMr%fbI6?Lobz!GoAG`2`QiHyU@m(;ANR-Ye!bmp>d2MZ{sMg< zZ!|Q3chKrc<7t+aBsxrKs9m(Q?ShL{5+sK?`YD(@aTHWzZ?tAayLU8WP#f1Pwu=rZ z9Hp}BXAYMJ--t}tYE$r7Zw?MCbH&QFU}L~NGrRB}!yfw_MfD7M@={xw2N{_Q*S|rv zo*M5IA0d^PzZJK4TMI((RszlQtKuU>8<2OzEk92O)0H&sV7Fj;kyil|M}efGMF^F< zRYI<|`0yo|xrN!)O||*`IZVOcNtw_(6TGNB(+10tQ{|%R(f$82ARi7NGc34?;X7V28sP^W zldF<&p!IAp{OTxsYL`F!u=OZxZ_D9GDW-wM=4crUZ}h8WB|3<%hD{r-I$+-mMVX>s zLEc?&)?WW$!!5q@1o3l=|Ao5cy2@YB0Kv>7?5cUIgwEqFxhHOwX#ub=ai_8ni%>HVB#0E5J|4#i4ej9=P&9J|!t{G9}GQ znY)GQ+F43q(F!V~OocK>t+C}sV=FPCN57i$m?4(y=XxmLq7DzD4LlB3oPP3t>)ZkL zOPmU<;a=R|K^mZGU3Vlnmv78OTpR&|Dp|Bq?e*%KA>aGxbnD_U=AY!rgAU%RA-N^M zMZ*aMT$%LsYZD8NZkR9ui17^I(Ak3iS7D1l84lEFUhmq>uBdO|xno~vrwqJB9O(-J zu0W38&4I(Qm9w5+un^I~%B8x{-wh}a6f0#uI<{B)Y9WSM<}_9=9dn{r^Gadp!A3c- z)nw4R2om<_Swg}BUv8j%CC z=ME9q-w{|J(er=J(Xlrx>zGr_ab?Mvjt40YRv%>AXSz8$!i`-0C@=~{Xh8I%XrBe< z=|%HsI&C`=jqHGfvfE_ zm^jyO4k~_L_OSwKvQP#(J=CsQLBBA|%T--=drpOX$r)(Zv-zA8`zE&Xi^0ZRWAWI3 zh!+c`9D;_mN3`Af=D|CDuw}1_FWrdflnr-k7!UWe#V^5=GP}>V6L!;YgRSAW+V82m z74%p>fBWficRQzYk_%ci-bcDAsq8C>ut!20USIcjxIrP?ubv4W)J`obip(3?JuyP_ zifuHmkjy`P%L4K^s+aE1T5DOU!#*ksxp%haH)^Mr>)Y9adyXID__3#Pa!Kfo)trL% zhaPCRjPYgf3i@LGipy}vz}uaN3wdxiu72oe=pShA#_O)jdp>Ap2Xthw%7$F@yd8H{ zS#iAt_e7L*_}%)NWB=a1z}(|B3gkaVyD#RX3F1aSd}7zgXx-m7&V|VaW%Fxt81hnz zJd}C_3c7J7m?VA`^+)-c3n?Be&zoZ1J@jly72iZH7#9v2d(s1p-?OhCAUQ+g=izD{w&{?AYP3&hK^ zYXmYm&xQG&*6+3V+?g1?r86?`5m%<_ILE!Sxt}~B z(6+3|t_S#e?gYx2%t)Zv5TDDQ!Srf!`a=@R;0Eajj=6zZR`s@hxnritf8~Gb2D>** z-18{r@V`946kmT_DBk2z5*Bgez;<7~b`fa)zQ&e191`#bPQzf%^)h;Y@iqvtZWJn& zsK(%a)B}5i(e#XTb1*rv;P8*$S`7A1#QOxS z`Y}25$3Ps7busq0v?4Ok1P2{_0Tq{76Zpa3?%-zLDplsQY6| zMUVRYh9N$)eW!x?$VFW>g2?WZW~I(~%lHU-hi)U$4z!w@QEGeG;mF#gB9XBs+eO8! z>^9HOdU%DnM_3i~98N~9$?WAfUC}Y(OERi))pr$x!~5rvnz;+cGQLW!_eM2m{5m)L z5%Op7rI(=we#ivsUTn+mJD>L}H_J7F)T#bq>n1OEaHh&o!d}PK4hCTiv5SpyN!BLy zrbLz5o^yfF2C6s>lK|0MVZqBh{JI*uZ78O}VLx$l^=N%#vPT%eyjdd?s-tXSNgz*T zG9NfuJkG8jcDcrAkak}KcAQ|xT2`vp!iEDYiZyhV@(=(E2P5<~SQ1~L3iBgf=hcSo zHLX%3ft0b#h5Z(3o=gc^o$GI^L{oboAXt1d=B{2H?B-N8KE;XY)IJO0}`8BCxg%YFxds!DMi^57tucR*7-*V&)r+9 zUMumrzD+M`N^^%@Ec|2tH5C2C2S}jfkE#!0$5#PR(uI?N@EgyqwjvZW-$hHvmJ8;2 z6yZ+KkDuzzP`7{qwxZ_7t(Nh+BB)_dk=^}ue=IxSskn~5Fn78u`l^wZc45e7$7G$3 zWKk05blApzY74+f0htv$@&pApW~V$s-aC|W4{?5RbU3x8?2AQoON=5um95jMDNe%@Z5l@^~O84|-jVq)cv$UsRY7a6HA?@T-h1A{Fq5sj% ztgy4+i3UDdakLlD^EhZd=_Hls+1#*FwH43P|r%RQ{NvjyNxEn*&Ld{#n?^MJ`DY>K7{pa_Rlza}5C@|yVuDOLneo1)S zH|WXkyfPetp0C-Kbm8D7uUb(ND1|4ZI^^!Kb0 z8_1xp8p@Wg(zRO`L8KK`;<;sbm19L;42~=fzGF&xtxDpu%A)GPRdfPQYUG(je#dIKqG{GiDDUpH7d>E56g*0Z* zyE^ft`GSGkFXilK8n_j@e|JRzuX<$Mb+WD`_(!>}herVK5cYC7`4J%dXF>=AalgXe z)v3Vd;6oV+mn58DKhLfIKE`pw29vdlUAG|h)U}o24Z^8Pj5RNU2EE?|Bb4Lf@g$D= zWu;+8mzD7mK74`f1U!P5!KN&f$x7Mvh#Z&fdLO;28dOUgB#ZthI$%lfn@@!4A#hC? zx};+8(FUJ?&imds@B_yaL42n1hRnMeR%CIyz{zgy96&%c=IQLl(?^afZ$5nGBD`=YYRneUt`4UF@D2LF}KZ6RR-QrjPlL9T4U9U=xg&cw#33ohbQ%d(b~ zJ+G-|A&@!R&>61P9Iw|Cwk-L%d@jf_`EBQ_ZAc593-4p_n5W4 zwpVr^7K#uFsU1~AM?R8NuayGAvpRr4$sy-88r-19vlQBcm+Hc9qr+)Cb-nXH=UcCC82wwkrV6?`xp7c{KAxrsC^P^iUU=y1&73uY z1syH?y%xl(!Y1~H{94jW4ylu?LnKYTpf?Ejex-11ZOd845D@Owv(|*J-AW=;0b=$I z-#boOFcqHY8Y1%AbgD*EQmxyBZMWhSwo9{v>T?+S$(R-D?^f1EjnH0uZgG3w0cU5T z3h&ITt}TEnfkkk6B67#6sHsXNWJOE;dCp4fwUd?^mU*3e)1faMY~f}cmMcCyO^YL1 z-qnqT-8D%iaMu*iERt_PU7>zZh@~g&#QCQ!enkDylesZzQPNALvc>gaQ>9gy_WE0z zjfxO4smE4AF|FQmb@oaxtY!rox^G^Sj_kvj{+DR7MHD0xC40HbR$rygG zxo_FYnixy?qsOq?ExW~O-E4Z&Ed`sOhyZv4?tHC=YL%*(AF(Two&)7hU7dg%eQAWF zm*zUs!j5mraYbAz44HCn=`_+D-TqO!JQ>6Lnbrd$L&O|H8GbFU+FJ!HO{}oyd-$Bp zg=FdwFLrap71(;K)*+=M5 z$3ObwY1Y>K2`{_K!?1M4fWVJKH@?(EI(WWS?RkD0p0uDpDKss}c;0l-Kpq=UzWT^f zLRsj?ncy1Bh28xtNzt$8nd4+7+s6A{jFkYM&-QA)mqoH_2EHW%D2BF+lXaiNPMOQG$j0f~WdK0L!~;+pC*ZFqBe zk(F`>=9S#8dR*GOFi*yNM#uoQOu3$!(xaA$X6-5q19j){{ zd`2zaw3_NM5Pdn#ZP2W191B^l6wVd#ZV&zEg|m~K=Bh(;-CaqD2O~nV&%iz)DuYSb zcoX5ixgh$3=mpgaV$8DO_ji|n+XTE@YAvcgt_i)>z;FpV{xn;nrlJiJ-9vT~omL{_^BAMO2_tj0fYO!B&Pb`H^64zP;R;QD#YzTZ;Ma_JhAp82IV7+V`QIJ>-?|?tlrt91tGiGdHBhhhB^hkN9*IE8CP^5ee}(FJN=x3?Jd1vVK~h!FqUA}45e zO7fj<1a{8MIuq5~zFA_EXwrGH@advay|>ZO;nM}J8jb;e^VYoA6Ji@nG3tRd?eYDt+b_pZI8_y8lhKk51dd_hKkBG#qXkSqvyaX~E{ ze5%{`^{dC$oUfAebO4*+F6q%Y47%1^%8%-rT0gQ4-0vPW?WERx@sj1T40ZSw1W}vV z8La6?gO{k*fRE;B&m5nj&~m-=G%F|R-9G|KjQb`iP@Y9jF1ipSq~T8X~!yzY5(U*ib#!y(8RkkvhL zPnsVnO>~RTTQ~r5>ayqb+l38<)U-nA{<8%h;1uL<+LC|oUYU7 zmIm|gPJ2&6qAbXNr~i2*(n9g8T9q2qz=~=YewaNu$FSf{Q9t$yNqs$ElGut;XhZ~L z|1C|6aL38Ho3TCv0JZ^d<+a_PWz_g28KQm-_jdPAOlUE3VQyYRG_VMrb5I#DE6`F; z)YgU{0lgQl5{Ez5_qerbc2J=wK=ZR%AeU?-I!aL9OtA~l zWQxtN&swFG*K!(xyN7)bY)suLmOvZpY!XR%w4PB1$(>P_liueb{)!zTh!op}7vUG> zo$C;|PRLGJ>In6!5da%y;z#4aPj2+KBt>H*4;HKgdrw%-MrJ}SrS<;s0_{_tupHNs zC^&E1YX$LOXUwsW4ATX$sZ0CGfq)YUW(4=tB}K)-oB_kCfq%sdsDLys7(bXaPe_TZ z08w*6w(@>TQpb|251%mv!Vr%J&V8;_50pB%!O>m=Gbokwq~M zC&Fn$I&JFV=CB%u=^K-y5VmWc;mJ$v5-d9oDi`-=N9}6$H3`)HIb_q!eZ?(m zGm3i@F2iCxx+}N#R3cIS51*r9o6FZZoJNB-k$AEaZfB$2mmsuL74nq5YX`|V_3nCx zhPSexmZv=a^Ox| z)DwJ>A2(_l6=_8ldIx<5eH7^g#zS?aJ&|A5RWM(QOx0xq{`C64#JY1Rr#4?Pk8L~@ z@vm5JYW&V2|3&3wd}Y$+G`3U`n1Z%tL4qm+F~C1q*FZcA%gC{1-a`?pP&X(qvr+ud z^R*0b^x3f%u|5+&lvX8zt(_rGtlvLt!f5@wmK|*-0_&U_&ENUe(H{{fD`He@e8+sR zaNigRs}9@D5^IGS%C&z>uzdBn4uf>3y%Yu6GW2o&ommng?R3GkvC>yp3tRH)14=G6 z)HKguT34tl3-tIC@O0Q*UhiPsCTB@mhWpll>?oRluv666QjaWK`%f@n{(HgMufRpz z6g-3S7>12s(>Va=;U1X{7R0ml280WK>9U=@<;0}!y-d>iD5)lx1F=*vY;-Q@x^(_R z4EnLGwhT|$Vu3gLOK`|^zN@WtlI7@2i;F%36UWtJAIjFdw9+8N?BkC_8#YB^E^(GZ zA@@|9bhRn2n4#*ujWFo{l9qI+vFak@oH^) zzeoY)l3J{Z1;~~8A@mfHP;ouQ>Y{IZR~gm3lQ^EBXGf{jFw{fWt$iMCsEc+6dFqSk zEb3}ag_2x}3pSq-TtpuYO_#g%q&HWdMd+8lFP{-NhW=Z`vt;8F;K-A~{K;CbSWcL5 zMUnuZ@8s@ZlYN~=4!ttdg*Cd{Xxh-4$7*vGHV)|BAGIv@YB(0q?KO5E2nRo*2B;RC zDKy%f0l+A___GNxnyqMgdrcT6I!Ka@fgN+tP9tSb)mY`oOnKs)bB93oo23@0X?KUPax0Zxsxk;JubkFE~{rKl=BV0YB5@TbCw%vMQVFkDdp-X zQ1V9EQN3CvwmgeK5Ouo;H<*UxL}cMET9A&-ym2YG^we@(;(HQ8wa{TuLLwDuDwPOb z95+~sv0It+N248o(V$8!=YnEf5sE?A}2 z=83cnM1XH?*y>aCzYZFO4vmFcNX@H&wsH=5O(SS+2i{i6#lhR>S~lY_rFD{kwDMbt zO<8}r3j|i~&0~va?d+AR@z<6l-7Ot02p~P8e_P1dZ8$0)5nk>Im>M#la2 zL>Ifz?Rz&&rKjT?wO9Pkx^+IdC`2r?KV33jZml)Fo_EdF!V|_{9Lg{yT^u!_>)>o}2w=c)Buk@gM26ipwr}*DEd>s7nDNOuD1!kG9TB z=*S%H$zsncxsv_20j^g5)#%jLKN~G&ccAw*K!QosLomrxHl(_r^?f439x3k4Rm)W! zSo&MxaUN*qyaeaWTbMo1M?RS^xa;dYbdC`S3sQjt2v4uF%4`yt$eD6ywRyf|6y9YT zbIZp_3^B0!X{#kK-Zgr<{V|(k7v8OEkt}*B!}8yBujozJdg2k|C=wo%CAG81{OCR; zWo&a+)o)zETSMyV#dnvdi!W8L&3^YmsUHryZl&G)1W~z?ly}a>R8rMX4$jtHYQK-K zs#ZpA$j)2;FrBq#7bk}^-C`;^Zr#(UrH4v9-H3@1$Dgg(9&IG?r*SA*h5Nc+Z=AsG zh^IEihb5A_{WfcfqZ&+@ciZJ&%qch7@aEn*^I<%0!)@2Sc{R~_fnfib5A z2QEW~Qz6o9U7pP&^N4-?3D`=?0Vk1p47&iUxk>g+lx^I6`ZPcv2}fR(%oTavCu5vY z`LDww#n6klKY>^y(3gyDJ9U+;x*%K9?Ni$csWoUzzdT*t9i^OYKjgB6Pj7jQrhA~+ zD5aq?d@MsYQwHI-cs9Rxt!sS8_90=tam9Xddco#2?)gIM*S6+?j7uD^kQW?*3fcSg zoWP~?Omm01>nF`6K1egZm+;g34|B>;XYyTVJdFNBtQy6IVoa+NueW1G) zW(l>(_w&T)RpB!4>RTC!etC%;vAkSSDXG_lkY&UWdY(%|Rr|genF34jA-@r*yz%Rp z)Iy)fP4GYFsHrEt-@0vx#8r-BoG$)%JM^AAfnvQl;p7f}u-jbUqzd#G{>e+P)Oi`N zs_1swQg<_pfASLiCnW%)ZI#TNzow@#i8RHM?~}UH$@kyMC}tP;i;`3JEQ5A5@x8kj zx*|UQ_1nxcHE01)e{vcm-yp(k@d06{UCK*S2Mm;40GTZI=!+-5ax7eqF6%EaJj>CD zyS)+d8Bo~HJUKgG=}^RHk$RA*9r0ya6C6!>_C;c1URMLi;mmX9yE$#~R`SdVsnf1c zr>GV_l>QK}a1FRYoeavS-J=d)H!(FBkc?aViKe|WiK~7AWIJnka{xO%h_SQFqLg%- z2!3cw^5M%+I@x=5Z=?Kw+_&m5Ykvo`oGpfxtJM3`j|1wltU>|g0ztZrE4(XpykDD; z8dKA>(7hWbyth0eY-NKhT*GOv9$Nh|CyL7qHP$_*_EY?)I~l+g=`d&C_01YDq4lW- zh{=^UsL}t)GlVCz{QT7#&frs|kS}CYU4xp$vZV+;NI z|0DV?HxZ~>8>wg+Q^E%M^N|hFt(tw!)iqdg0*FJ_dciQS#)8V~L2ttWoPggioSuE$#eK?c09dH2m$w3{NMX z1PBrT%iRIdx+L(fAz+}*snxkxP}y#G`%23zBTa2!zu5uF!!NE4*Lwc`B_V{Qc6TMg zG)7vYB%dNy$tVSP)Ru_6{nqic40T`M;PnXZ7-#Oc{KU6}Mx8>VB~Erhjk^OCKH%!p zNmJ?CzVWXfquI>yqH=$E7+Gaq#rO^Hvf6tD8i*>OnqXMsjlr|N5!6`sB$y}xT^YM| zvt?0QTeC2X56=FvzI}5|Qi4V9y}HZM5-)j3UhhLsXlOEDlPp);v6E3N&wZSm;Zm~1 zgAw;csH;_!eK4vvcy-X5-P#K<>=>u|XWE0=;LHS$Or!}Nkc`NAD)`(^@Rv?GfxWYi zJXuf9As?i5^(P!(;_ujR9P~@khHi2lAe>n{6 zz|XWW)fmtjOUHHN0zcm=mKpSz>%JcM$b89wqzsSkOHp1i0T}L=pt%A32&V=)u)Gs# znVGK5d6sK#?8{EwfFy=jjRE8COW+-4y|JwKDluJ6rYcOlq_)iJ;Wr%QmZ+8>)tkrALJOlZ;iTi7gnC{1V*L8n$LMX%{qI#S- z9wR|I7F`|eaV%*4H`s-eDEm&vOO)6I6(sW2Fn`a<%~CJQ)A@~T5H(eM7q>VLT_#N5 zQEP1*aHfMfJId1ZgsLZNdg$w3O5addoIB6tc>9<-NWiQOcQw$t&%RDp)VuQ(fAIOifJ~TfXD<_= zl;)KF{GO9HzORNe3&Hxpmn}bDl&n227EsWzqpt=n5{|0o#}-YlvBj5w(Q?_@Bmd1dQm0sj2V}-=@sUZH2R>eI zC`2jo#If0V9%9oaZ$7mX-eyKLhiGJm+p|4uA~qo0jnq z;^FnFii~hPD9><;`#;QTGc|r?xOo#puoEKgCTP2EbRBb@K!_r(-c{J7?i9(7 z1|`(xqRTOH5Msb4*3UWQUIdYz-|L)-8jY+o82?hsJeDx%`WbU=uhBiZqU-@GGgr-z z5WMdkAr}`K+Jqfj3Fl3raqNyrrePlkPoc+^zfPW*C|nDfy7DC~+yFE8auVG%|8nxm zuAa?b*jzj>e0MfnHEh4Y!E@r118HrSvb1nW@6X8Q$1zvd)(%;-`)w8ge^cqRx21IG z+A=o5dOq1Rbl8rjk`9LX4UYzj(bLk_e1>sr+Ly&r5w_}O^MAa3*UBc%(8-8l`-BK8 z$dnxSJgenXkA$Wr4OTHE3;ls zHs~@>B|sV=j=1XWp6k2piJyr|eVK&732Fijso<=GUuv4sx!+JX*<{(*edO*a}boc_toF z>O5}?djlaiy@UYeen$B+r(uK$J%Oy!cahFzmWbUrh@A^sJp6lvjiqacgsBD1^_O~i zq3f*J%cWBD#BK$wj`IH9x?UY^+V7ZTGAv?@FpEhs77mAD z$A56jrQ1#FI#Ow@swf^d(nhz=y{hyZWCNrZ3tR>M1VAA;p z8BZ7*A~%no+x)rZsNitnu!2cC%M`7u9H9M91N8?c+bU*UQ7#@_p;hf`<^BlkaJfKskG?k3Jr|l9? z&@hC#&6b-f=(XJy-ONRxAITBa?>5q|UJS`5+M~V+hIhUJ5>zjEEVLAckK{W{YgP%P z{NmdKyzPGeo5{noI$YL(Cq=y{=Y-(LlUTcr#?F@t0FUb(x-9qwGH26N{%4NoX&NdPGzG!{jZ8KzHm&?l`ovWWnrcmh;Y5=+bJ=@gc|Vc> z|F2nJnKKupYLyASCb%rpY&k8(XwMgP%*$pAAa&u_TT|nHhQoox+b4dbn`OGwk&0yJ z7~?{14R5}8;2g-kx~Z(&aE(^!*igGMp0{KvDU%7vv+N)PoV54wX2QjH7y6>*v3!yo zW~Sk>bxf{5JJi+o(yQKnn*5X7*PYg5c#c&u6HN*GU78R|0l^NS8dirPGpU2cBIeo^ zPc4^DW(TqeXMtOP2+dM7Cp%;t zyVzCf-K5LR%#6JOS25b%a1r}GO>Yja#yGV~k8oB`m$@UWW<^H)caxu5rJtu-S&)<3 zfOaqb7e^d$srXivc7(fd5VQ0sRC>$q_~=&C`c+QzQDxKCME9AV13t0uye`RR9CPce?&Y* zS9=v@GjUIMY@rydhGZcBzY`b z+B>(JDJP67)I4A>dkf)!3CbS+H0WL3qhDwyxg#<+K&Jmwe2a!;m}`2LSDYz6C#eUh z!%l0ojTyCV46Y!{I)*aUETvaNo25cGtZTHPhP~;@D_&=DgW#-|m-PWo7Kj16CggcX z>c7`rjiMgvr1JMi{hWqjyo3MDhd&NJY6uSto)I3`&^%}gIw6T&i#s71+KZ6TW{yir zjvp0=Ykpmm#y;G8P6)MFz#!Pv7W4!oBlNiK#}SJW*w>xT`DkH>FpuE<9b$}8(-YYP z;!-6h#_W28rIb%7PrJTYB{BeYx%~>(mj*&S<&^;FFKBJ2{yhC!ZF4Lk;ZBv3 zF+Mb2_~}n`9$OEhKC|Tkp>}a1%V_hse3Cl(t|RYB(;zTqM~nA^f;ke!`Qg>{6FIHxXL#-w5IAdEHbJJout>xyGrecUva^4xrUT@zHF%`WyDDM$UTYh=K3KQ0GY<5BH~ zg1RoKJMcc-D~S9SnrFserm}jG(;R}kQcdo+dyD@v%G0@pBK>WhgfhxFIYdm0 zqkh`oNri4$pV8%eHwDv;744G|TcVQXvFu-lqwrtzNihX0+XDVC8E&z}=TyUzFE=N1 zla?^Lsq9-DvkwT{GRmmYA>>ccFxfm{!J_&1KVN4Fkgtga8o6f`qPWW8@84zuyN6fuK?G(5Y|Jf4;o$+2&zbl{<5h;Ex@L0;%GO1WXmMMi|4su?E{m~Dj)JCLF zt6&$jV7kX~yTQfkH?DL|32g@yxBgaOxspN&SF*I+A#6(5O!On50o)w`jbZdDM5YKP6 z1LAocUbMC|GQKsSrrvX+M3fdpY1_H(>8mDK%cOI_{4HrsI=-c5;@FXA)fkCdPB{3*2cRv<&~^O`K_SfL`eRq^`+@ zSw?@8h$73jPF*=F;}aCO`N-w@LCxvmC1BSSNmEMPdl`TdeBBRU<2EX=br*P36_*zn zE2?%iklr6x&JC)?tq*^EX)%Rq*_snYlZwt%7rDXey0b5-UG?+} z``kEM@y8{A`L>2s0XJ3{2>PrIG{}FiYd*}8k^?Bifh4^`gI)r*3D|L4NB^WHJTy4_ zx*i~yO2G^`<8f=pV*dv}?zyybv!l`M$-VaijLezaQ`3?Mt&`^vyBU+h;fvDIG1#54 zmY9hx0iXk^KaQWY7mv^k`vY{nN=jlk?AFd=C&v)?Lnn-m`q!z5jbf)+YL~lgZ+IPshK$2sFX z(U#|3H8Fp0OI@3SGAH<;H-O!qN~~r2qCoJysZ-Z#m_d8%!;wTOx!+t|5I3oR>Cnwc zpNLHQL&BP8M~6}|($#cRm)FfeZ5=4k=4#W$H^QVO2%p{5r4@Ku@LxrF$Q*s*>K zXEksCdRX2be+KJob|VmxKOWJV998DKC!p$h%_G}unD_u4K`c~~#i&d$y?X3k*SlJ? zZE*<@&HcJ6P15Y8-a2eT9rr)8;B$$;xMcF4o`=za_l1;{&;4cteAEi79687N%$JeK zi+{zd(tV~@Ht8C~faCi7{0^U=AK=9qYv@`#`Pnk<-r6MpO^&U~4xYrPs*b#%jRkj3 z3fOv#qC(Ga>AGYrsEV(}>9G0W9DT@EbZ7O%D&(nvqg+}M2SlCYE}EeJ?u5*VKQqE! zV!&l4bkmI>8j&0kn)mv9c5hychJ*#9qHc;jyBNNYwn=_nS>?%S>lpPnw)U$lQ_>(r z_T#Tbzce!z!lgdr&==q@;awJ31ryi-x=P+NH2VmE%#T_fVSN;bbOS`-?R z3hH0n{Vq=Qv-(wj=PL1aNrSudcpF`1`byl=P_g`LD#%Q4%R|&S#c~Od);6C`)Ym0Y z846=A5syQZ9LqP8U1JypgZ;-xadPrk0s<=gaHsQDU+V^iAHm_wAsr#% zv1n0vD?94p?qFkaXS;!&bH_+mko@2qgz{a9fF)D-NJdSzDg^Wou=tp{CJ6MLh7~;Y>nU-#=m})S%+e z&n>X&xlKuzz{Fx3?IGCL{i3SdBT=xgjrg_KK}UQ18~cv~7RONYZRsvPJPA7&_V80B z@@{7xVYzbgnq|coxB6M7Uzh_d-jr1(Yr57#??4qB~VVn z*Uoxj%N?#C_0ba>bbmf|;iW#<39r3RH@hd2SQGI|0Sd)8lb?Kv8bnJio>H@;d}wms z)^Io+v#t&&tr1&+nV-Gs8m-}QPz><*B$e0(mXfy0D0}v3Mrp9*z#+OJytW*Ezu+f{ zrasE9I${-$1C}nT*s;?EeK=}z!1+>|L=H@BZQVbJ1)PD8)TW^rSM>3*J_))-bxhBI z4KI+Eamu?s$P_K&rX)s}4bBx0;K&8cLif%gni{M{6f;p?_cso%SISByN*-|D7Pfhh zzp(Iwmf(;9$@SB@$6Z~seQ}zxgaMrid?en&eO)w64m(1@e-svm};R!GD8~gjb0ZDPU8Jd(zpwOvdp^?j-{qRY$7?vGLt_gnHOI5gQzQWOVR_(tGqL+~y=>K72|i8rC##2h^Uj zOj~+MOYPBsoYWBAE_oQNrRh)?98eoFJ==VWX-Wiq0zLLA@Tl;-u{Z~ryBs%qGXggE zpYChvQBsw#fwci_zm`~GZECw}xmxT1>Huop`*+p-IQg)vrB$B3&<)8gG*%cPF~7Ob z=8t3$$ueCO%Z#?p1YEzTPv_^F?xWk}ohQdNuM+Qbr;3O2aQu!Sj9$XUbBj&y)HW%} z70{5HC|QI&cVrJ-xURz;)^C}r{^G}ths6z=i@BlJ))w;Nd-@73-0SL=D`ev)q&b5V z1c`fJ&AWY@SDY^UMM5vl`F0*W!UH7Q2Q9sziQk(!evDVY`*-~STvx+%Gw17N=E-*- z>o$|m*rYJSX3qK}F@>Ek&iP&12~yVH=$c6I;G>w&UGg)5Rp;x8xo#Ip0G zePjz9Uh0h_A8aIg0g5H59Pbg*{2OOd43ILI2n~Ni9A520BD;QGiXMSGW3VmEz!8Sc#+ssc{8ReqL;;{R|xWX7_!2pibC{=FS>3GUvj zQD~6ex+!Q}#+L?MT&zo7AcR<$*@oCj@A`nTl)T#)Bch=N*M9CuCP+F?o~k`|wlm2W zz6-H=fmpBPxM!Y*5kVZ|IfVATiJ%w0^<*6Pei_%rG(h9JYENWd#8TRkJxHU4JVJre zv}T*(l;s4X!?ID9cJIDf<^@DGaLFi9cILSC3In;ajN8b1rGG^RASTYX3Xt0%?sW1un+DZxsv zTKEo8kNNK|kWr(Quy))$yUE>9Z1w2-C+iea0sErY#DhLFME7eJ!u%_n^`%$#$|o7^dPrV{Q;CkG9#RX*~mKla!V`A5tAb4k(~78Pz4_U*MlV!izT26K+!D+tvl)=myf^SWCK+U25AH`-=gf?J%3XDCyzMBfx=0JMySy$sZ9XSJw{y zc+VG*uFF+CsoiQ_OOI{`Rt(L*EK^Nlvf0nr*z&`ONNk}&^DVt?pmrpo6`+FbE*5$B_)d_WtGx>C<0?Chjg)`hpAXd#%-Mr8M+-{lPY2i|>dQ|Nha`pw! zhf^dq)Pb#f?X=@@&9TP&N3@%FMEyXQOKqGzHoq+BBwv;7GI{91^G5wXkgj7Z1l$p{ z_dms%NznT_mPeTiSGgTaFB!H|=eAe8(B3?TK)?ka=;6rtW{S^-8z>B|p;H43Ou27a zW%Sav+g_Idam}Yo>@eBc?Pp!(sH?bysEX>2ZTQ3tz9)B_V?;q(@U^7qKZ zMA_H9Eru2d?BmiHnF1=X7qEyKvS-bfLtGR(UkQMq26gl~J=LR*by^n*V0Ab47riLi zvI1@?wY08nD6X=*i!<|W^8x_rYuPr8!!V1)IgDocTLu9ZpUx4%sIbJ`zC}&C_~ynms4&G^WHS1ti3CXs^tHr z4&n<=;7Z9*A2f=z08+QUF}`jlG8W%A6^ez4u?DmTI6n?<`hrT2D`%mw@4Ospe4%5t zIEx$gJNxo(Y7vC<_G-q8=(NDsw5AycO?r|hv@3p~TmN55G9%%kHS= zoXguu^l;9>nG&dxN%0~4Vm+2sc0)~7BEaL@zwPxkNFh&Yi1WP5FP^7dfm~@R=n$|z z#{A-tBcE>9#Nw2Y_t*q&EGReySj~c}aHig->U~_1`KmY-wm=TfWJoh*oV!Rdz;J1# zyx<@pl2z@|a&T}^8l+_Gz66r0xoML5mZIuX2~OM5GGU?E5zmpC^*0Pl1(!K$`oW6%E@imX#q>y83 zIXH^8&K2*ox?cksDGLkxAUS#E!)+byt@!v=#=m628BQcnDhWIjp!^GU?iPh-Gnn6} zTiQn|PB=~x@^p4~U099$v#Mi%X#yh6_avX2VDNC#Oyq|#^?34mr$J|WOjy;=aF3d2 zKrD;)LlO1rIo@D!Zs;MunudS6RmJToAelY#MNxWXo~9~>v%M_<75-Hc)jT?=6YyhV z(rxX_j)`mA|Kfb!bV1Yd1x9TFR`Rsb;!?maU=pN-Xb%YU{M;Hv_3GH@L(e}k+Q(5V z-B)M9QsUN+5GJb+!G^o>o73vJU$F(|m4VB81?hv2UsJig<*+Nb1aOwPXXJ}3uk{ZX zS+_PX0DGjiq{DSRz0gIdels~~+8=h$?aG_RVQkBMjOtUwZW`5{x#k6g4=oNi)4ml+MKc>zytjYFq|Jz`oAfQqT63?TQ zq=JIf=9kB!rAtDjr8`!jVuA_`X;fg2?v5b>Qi3!iHdWbD@PPSC^u|M6cFRlT{-th6er=v?tVgE~(0y|{6d*3_ojyzNFx z7e&k)0lVCKpvM0WyI*rWIr}T?D8ZUIX3LJ;)DbC;>(LKt$)!JJ&!sHZH-$yN5(%II zTZNS4@4xZwcwRsWxG_;1$e|x32HNek$gcez2AV0KLB3AOLC9oGqJFvpQT^gy~A8xJR^uZRStKX5X;>c%U4#3)|KKh7rfH zCuy_G$eguh)LzR5eOv5;_RdU}9OA$Y$ov6KSU}hx7O{N6;>+xlh`{xr*n}}#VN1-f zW!r-hND@H43@PQC@nE1Au5FdRy74W6W(|y3gU_Sbant#H1iPqgzBk6?#H5vpoA=}Z zkBbF>58}w2X*`^0l{q1b>I_LM@vCutDrTCdRk~!E?p}oJVm_tJqep(Q|2&8KK~%B8 zX-yT0vm8E40(U}wLRL-gW%RZXX3Nm5vDJpGZp50lt`H>)Dc$rXsD3=lH ze*P4D$GQ7%&2TejSJbxY(!bX?wvS96?cY51s1Ik=*zcoBL-iLE1TJ)yG(j>bsSE!d z6ATv<*)B@9mHa%NUXc&>+(ld+-IA@?6EcbevD9M|#vDK%|G_AoBf zKXSF;x^U!44*#B=>ZFOIT}?AiA-lrXF2AMU?MOs7v}cBkk~`6O4>6-*_x4#qaS;%I zd9ayQD7ulC#%<1na;=hFUmdHz&#!VjvpQbdeH|6tCuh`Z9E`>R0EH2O2_bRH#J_Nx z+?wsx7G%fcTTFI%E|k>^2%`)2Lv!|h*6913IetoK)YNOd zJ4=`9lG>z*yJvca%mH~~Hb*&a&w@k`hB}TUNRa2RMN5iHg#Ac;`fDaXjcA7n@fs62 z1yx;TW!%I;(}_)>e6*?~2jLXGY%f6y-31HDWxo!8d$BG6Tcu z=&=3hp_>AFG^y+la9zKb=d&VYyyGO|MztCGYqq5L>yaksIUk?ztmjjKvZ-n|G_s!c zdBk-lpC^B&9p7{~xpZswR$%|EQ|Aj>WO;d#SC+%yVHAQLojc7D zY!F#9`3RfmxO$*Gw>z)#JygGt)M~n;&BiyGi9P{-*wf$5Vk{M1p|PPi1Ctrgy|fus zlrd6OT$0Rbsd%q~nbgfC$dVqQK5VNZc|1S)m`mR;YBOOn;NuInIgH!M5{NbT-QvEs za+jXfOrUu5@BXvMdF1|?!>6Q8!0xocW7t9~d7;t57&7=f=!$R%K{+5+B4YDe4u8#V zSl%5-Y^DqUeOEX+6MC{$2Q-fA#niZdE-Z7zyn>z!-RGrZh5|yx@|gzC{=m-L3eXNR z(bAC_8yC1M1$#a+4JP9=awX)9DxQkz7a@!$-{8eeHvSiR`>h0?c@KaZgr#U~S?Nt< ze!g;%fnU8;V2GstirkcY7uBG~878OW%2oPA zaezGTOInt#sou7#g2TvMmguN96{z{}8YN{O|M?13k!*god=a(h3G>e)%z&H_5nJ9o z0AG3&SbW6>cB-oYeWu)m&8$JElJFjK5_accvcLp`&HrE1u=a zNjSNQKA6LGnW?#vY>Bteiq<8E`Mge zyx6lOkWRtY(PFf&m0gv{mK$vZXYuuzZV$5D`nsSIRk}t#9%A{)b{6tnh9{~YI~_W3 z@jd%Mu->S>MV;LC#)`;`ZlKi|OsSgY-x55PuYEZ9qFR>eC-^egXXEjkcDRNT*MbnE z4lNiaP@q4GEvxNaS$x2muBWwHe67lF4kA$J?7=Dbu9p*>(lNH&67wJ&-w~LTEAl5Y z$3kT2)&_FdMIrGW|Q#4j|-DzTtmQXqYm2j1tgJE2+ua_R9s>PWuzXMSZ~WdGJ~ zkJc>GbN{Vg{%rmf0|jBCGY>TtVuH87#sPkzL~%ANViH=NcB@)E}b z8;>|ML|Tpn3M8g#kxUjChobw?(@kU*7l8)8mp@AkJ;2`v)%DlmW;SR51BCurJNSdw zF-6@fIBtI7jYGxIJZ_ z^Mmg4p#He&8*xJWIgQ%p#{yUZ6dizxyt4FZk|6X+ID-vZ2ZOyvv7RkMrwQgAn&@mf zL(X5W@!#{VX}Ub*FbT5<%Y)7^9&68JqC}a0I$v~Z)3%AK35ypeghxCkU0jHX5#XWq zi#^}p-Vu5ad8r=7CdakMqCt?4Oz+4q5zmP%nP$JDPkwi_!w)aYJwe=pZ9(+gBi=b& za+HaKxB;Xuh$8rVB4w*QroH?Ov{4eIKjVMFSPv!*y1~@V&?-)5zj`>5 z&!Q<#fjxcSxQHsbadQq-9kOD(XvU@n1ZT%5jvo)AUngkiG-PU*1EB5 zaIcD(M@sxtl*0%S%;$~U*~PJu4ht+1$|1*AW3Ig`fyGHIt{DmBk%IVs>0dt!SZ2WE}-^io8{c%c<>n zogYzmNwg)^G1x7uveEJrny8z`O*Zk$rlym_LdFz(x@&kd04^Fjq)n1{<$t+7rcM0G z@*tVYO?K^n*py(t87XS!)wARHanrXY1bk)lKI$`>}}A=`)6v2m&(`&gUqcD)u{zT=h8DQ5*Y#p`n3Q2+-x&)BewTeGHJ60T$1RE6H#F&B>wPay%?JYcCIV(hoq~s17`#sO8STbKk?+ zU#iX53#=vL1YdhUB73lZ zV{p81y{J9#Nz16NjL0V{cEAecYXHH4M6wU#DSPi(oD425-|<^KhYB-dU^1n7_>kY^ zLmztpMg?+EyOgL{Ci8&TRC={Fs4t;MwsCdarLDU&IeApODPX)bs;|^-h~{)sU6-#) zRuxwz?~Q*i!?(*AgROq74wu_Wt&p0J@w1X!p|f|bGi<*16IB@L08B}bnqkJXW1ZJ; z^Fhq9DTJDfr_PV`)YzmX$I2%ASY8C)%A10}#`Gf5COxR5AZwxVmc(^8`p^F3C-P%i z#{<)wz8`6``>1StwpK~My(CMRDMVJJmo<9yAH7aRL+nb0WQP2RqSs)>m@a*0|1pI; zjHlVTSm$?h2B?GbH@zYPOYMLUSS8@oP0mn$Xj6~sAhTu(T;NK$Jbu*;jp*ZXk09RG zkx~G%EFH{!1+TkjhmRmZ;ID(N_1toiVQeM+0FUw!1M>)zw?NENcO?yRFa8TsL{i;3 z0WWtrS@^7a_4%Y4z`$l`t2U4*TXNlu>E->#NJxg|)N9#N_EUyrr;>)v_FHUe1c5Dy zUT8~VMT?|y>dxFV<-9@G@43x{W(KDDU?i)SFbK(utm3&Z^p$345xK)o_tdEyHtO)~ zU2z6aca1-QB~+KRD^}L2TJ9{UUva=j#rU{b*Zb9yWgOKX>Gs=HP#qjPm`Xk*C}u1r zIp>^JM9#a-QpNytY$^soB|8UVhM0kfOcUHrN1xcwTcRz^tf_JBtHX^hGb5J^xfe}3 zgU%Gajlz7v6eVt5NSDkgn6bj$#pJKBywr7E;rmui%4^b~N5y13`Ng7L;hQHx#zwQh zIDa26LfP52>F5lb7SrCx&tC-UDfx$Euz&*$US)z-5Ua$??` z?zw!)(r&6!O5XbwyUhIZ-Fa=ivzs9>RK>;b`Wo@c?}qQ}mwP3DGQBKl$QNOPe) z&;9!9CU;p?i_OiY@?O?|TJ_0B7t$9L&yF8qzJQ+-IsY43e&&I+OiS}lSR3k&iNbR( zuxeC+(>t!3Wm?7NX_xZ-xYPjkv(*9@9bw9tnJb7Mt@EKA|Ff<4yOQpo8`Z792Kct? zn~rR&c>tA!b-rTOjw5Suu|#TS}+Ip;|p(f^ew(eN=i(Ql?wx0Z@dvyoquT zTlyficF}DpaE%SOt=L;r_oR!s`sOVne?(YAdV&zZSIH{C7$m0TULcQS_zY%U8&u(A zR#;t@d+J-|>y5VVkay@WTd9k(d7$%eANrgTOcLZCIJ5o)%6SHwf0eXG4(VyLidjWr zK3TBiE82c>qlQ~YaFq$#(TN@E7LG2Ul14dWioa(a5=%)?p;|uj)+hcNzixO^NUF|% z*HqUKb(7d+8>opvgC07X#Fi=h>An)~`D|acj&y;YMl@c^f}O3}(MLPM&9nKF3GE=+ z!+*nbbK~(kDTMyvYYMy)T0UsE4q->hxXDc^m#T>#5bk##zw*Jvn)g^u7c-f0A2p_k z%3HLxKfG>_^q?E<(7bY+LSXuZrfU%ftCtawf156^xE20meLp%pTawU4=~>(7Q_@0g z4Ga@i$SUXKp!rHY2Iv8pxRu2yM}t;u_h5QlH3`|XVLhO6uuYbM zB~}8rZI*X$%q;F`FPbqYoQx?A0gF#=Avsxaj(EgFj5&!*yI^A_ihH?csgmq9q+koo)6-|@=s!8?2dHfLDc%jP{h!PYkt_-W0h1qHLl5P_ zn1X*<4{dE(C%<4m$D|fi=GahHl+Rxd8;}|C#B+rr5*KZXw6@w{_T_p^0 z8&AeB6zdG}?kwM|sh1>I4lY^!*Na_UPK+`xZyRjB(%cZqna-A4?rDDWEH9kmUsR0c zA@^QKkb~|;mVpfA+u02OD$K|7t5Drm(_ z8)rIl&keb*_#$t<1>5=NN-e8(RA&Bp2p4t0H%C(Q;TJP>Iu@On@mys^>+-(3GuHCvgS2)71` z7d?rJ`TAkTO##4j=4Vpa)x! zGFBSR1HYJx4oHX?vY!LpaDLYg2!F?BK67?V@l@m=>k~XcPmat(*KC(;TlOBNU&|?3 z*_;6`{dG-4(JN+@KrZ!YUl(flH^jcEmN|%DGdDUR;o7@gqlx8V%`5gNIHr&DzuAew zGQe97$G45iiDr_G_F{+kg1Ud_m@bTZ3!4YkPb)VgU1I;JKwGvk%b-X+O@|Fig1XId z)rTym4@96!w%RT^+kuO@prJDUtL~nSm|*}!cOR;cF$E>vY1E{@Z}fnX&2D+;a=+&* z71HTM>lzo}f=fqQ&5bxeoypO^g;okT!KuN^+H|r36X`1lB$9e1BP}8UmaQE8ZqmqF zcN*`7y=e>Kc_MjIJ5#ITqv4t+7%@0=IXF`MnK!H-lp&6h?j=KDf$c-6@C(J1eyOq&+}dcI`NFR$HF zZ1h5;WTThXSLjpqki2-rpAWP6|6AVt8ET`uSqQ3Vm7_k7HQ*n~4)7&#i; zh5K{NaUes;>{g&qj5zosAc}RG`vuInKcevo8sm&qyW$^elolT+kJq?iwwb+Ep& z@a0v9LW{^uZAllC>H>$f%$69_U}JP)eJkPc9l&2uDHS}!%7wUTo#AS&_44#5*F!B# zPLTUK&0M7VNz}VXwvG$0o+D5By}d^;-INKmU5<^B7gckaUH8MYi-l#=?gY;@A?{^B zXB)mZTpS11_FuL4X==H0L;WTQ_6|$|7^huw_|^@NEF^)=Y+r_nIfHe}K8>72Nj>4d z{cs@hpmX131G;S&s8<$nleBbaqHGbUnK-pMTwrCx5(&_FCQsY}qUH%{ z_Ln7+(j4v%(0fGUDcTl(!v*TKC=U^n9CX{Jy{T0%9q$bPgx6SKX) zciSeM1z(tU_5-1f;a#_2HQO&dsWVsKnD*@Y+M|NQRZH}^~k<_a#fmHoJgYE9)Q;|?)j7Po~JO6BA2D zTlLbKbR7yp6mF3{%FSSBZ^Zrw{NGG_?tbE>whor7c`y1@DsfH#?+u1T%9hGmq8%T=T3S!vs{Bz8E^-rvu97usemP?F}f&N;}of4PE@6nBq zncTt|42VP#W|A`t#ioNX?H+`i2FteFPx)?Bue6-kGAMVq4B-;su>YZ5HvzxJUCcVG|v; zfhypRCr6bn?_#cNJ3pwuhVdyQJ~0=CVcu8^m7H|&z3k%JS`dpZaB%eC6q^{EYLZ79 zz41NfWw)K=q-c9_+&90ui?{oZN!czCzR!BDN2pTftT~EBUfF2Mj_24e{_SPz8}>13 zr2hmYfmcvYB2W~#Jr(D=!ms)~{ivZn_^P`u_zS>km3!2|mP*S#7_`0@u)hxEbmjEV z@;)Q5zJ>yjC;4ANr85g3*?zgMAVC+hFJN9`k`oVx+r_r-myKUqHoXVR)sBff0>{tS zQy%MX;*|)}a)@-*;5<8$L*?f3 z#N>uW3FZy@%7qJ`y8AuN95B7tqJrc(w5tW@I#u9he`cVmn{lof^1 z>YVsbjePImeELzlU986gc`-c`*Xf|2i3U;PhT<-D8$DegoymO99$ehID|%e+=j~G2HrY|}DFLW)eXYbhl&uDfMKo_(d@U$wJWT4W4G^&^$cv(7QT&@ko%E-U6;^iJ6MDs?embZ6kq#YYfcDN(xQ$Pm`<9u3hWz zGT_i?JVId*mem>AOUl@OHMkd#OJw?zcs{_(_zwWegl~Q8U*+rbwY8Zg9?C+ z9Q34ickQIzZ$A_XeD#;A*|MF4rBNeyMh1^yjGDF#RAfjk!}erz_LpyCk>c-@j;6zo zztdle_Cs>wrNkgd24)4ni|r03CQiI2=HfPBCjPWblMR7J4ymKaZ(2u; z&()y=pK0jQ(A_1cz62xgwM=A$)$z~EF2OdqRT%BRSUgWna_l{^0;b`ih!C~6Qw#`n zek4%m)3`dcKCNfLlrGJLJ|Q|FH0w{sx3VSZ_xjIlMs11FOsPB>GGV$n?tR_{`H|** z$8W-I)MbaO7rH<0(fW)=%Mt8SWtX^)u8?<+to3LbXDH%@o8C61d*ivYPoAC!J_3X0OVO~94Vx=T?UkVPBubMsM+`yEQ(qoYtzvAVr|UlOieLK)Mq9v zymo?4AxjX3Khh^_U=H=cYk|;UjA;+m*&t$N4q(|mAVKtRTl(*S@(}%l+(y=KcVa$+ zu41YS^-G$!2DiR*F*2G>2z>5Icg6EfPpBUjTE>^s7G=ClBMBh`6Q3pPEW|}FJaHH( zbCHyGOR2pM9s+->Q*i#&?ZEI?P~*cZ_OYeqi3hjnd?ZMX#!Y|x*dcx$&GYjzQ(ABE z)eU^>hh)Aubr*j3q31t_A0Tgowj4jex zBCGtne|zY+@and%SGjH-nlsAgpEN|{)v}9;9*cRC&~;y``Xzi-Lcr8z@0pz4_)dOH zO^G;j{Ne#OUw%xs4Qh$FpAkgyQgj&;OtGqAW@6 zpZOF~is+2NVb@vkt3ovZ3G$u*aXf9I4~gIDj4+?kq1*wQw{SIV>i46$fWDWoc|Wba z(3$;6FI2kXn8y6V5}mI${cYrW@`hhdI)NvkW5>+4yFP9;^k68CX1fp+MQIS2tf?k_ zlV`kmlvYQnalQA(SHUZ-Df{=2)kM%wIjwktIpI8OdPkKe+%oo&h}~;J!*G9s75p(e zMf27Ca{x$wg_QKKV%}$Laj)+fL`CmtbFJ#nR2A$VDoxX6DolQ~!R3;`l za=Z8@M4Pj+&^OqK<~rgaP?4!z``zV%1||g`4?2&?tiA?T=<1R1kV#VkWFBw@bQ}TO zE`+-WPL|`t^?b)sLS%=p$#KD5xH!l2j1skjzKw&=fpvDGf6LibX#G!-gpseQQ7urm zsPIs=D9L$;9+38X&w1gOxD#yn!AWhG&S1L+9tHfiE!Rv{#)|QjGWX=j(nosp2@Z9` zr(d34i&yUp#!e+j(6Zf@>e?QTeQldVoA@jl+iz9a#)Y(KPVZFe*d4wd3OlGv;bq>3 z4UJ`vmKa?Tb4*=>E`dX*o?#4#u8g;%?1+gPZ!Zrg4cUi;inc*OP{@5Rq(VBwx23<( zc)yCYPAjhHMCR@;Vp|qnyjLq0DpLEgp?tOp{4b}qEh+T3qaH_rhFG`ldSuvI+Kd&Y zg=*lNU*?s(myt;QRT21z@wUV>t3QddyPtk&^Kf*fTA|{6KNE|3vK1N{Y#nv)I6Ogu ze*BMV?C+{;>l4igbs(Ws2iehtd6ma%pc4-`C`d~0_%PbLs+LTgllj5tT!j#!F@i5{s{9}E120<0kK zi1MbW%v)jk*mbd)345~Y!RIL;+3{)n<@11O-}qBU)sG{aj>)VEHLy;t-g^af?Nlss z#PN%wU|gX}dzo~Tm|BtGkyh+#uE5(~PAw&ylWWseHFl7PJewLS>81bC2)}hN6NY(I zNav$DU=x*#HOF|#ka*Yn@{BtZJ@19S&V5_XQa9Jb8E`k zXe7Sw_TuUAObmr>UWPgZ>SQNQ+c45{OYFJkm_QnthddgL@E^#Eqe1<>7HO1h> zJsp;i&K%m{J1eZ2v1PXKXOcJ`GEhuze*w!Q+(HK(`cKNuv& z%!#<4t|7TGWbru!r`WRB)oPDZb)W~e>PfA&&{qY!p-S>KZd#uDWydNv{W0|y-3pCz zF*za6)2p%M=jDhm)86h&(Si9HF+DVOxOKf1Eig|HL|jEgdqvRNg@Q z8vK#D0X0J&)U>Qi&-t+^Gz7cXgsq>g*1Po5;=S)luV)2ABZu_|NY9&1 z;MXdJ@KK{mGh^7)r*)Sb&ceTV&LXabWy;4XC4yH{35Muu#t&9qgmMQ|eW-C49mM{)! zcpbW0f9*SuqvO$KY#yvy=B(nQmXFD{yDAq;*7*Ibm}xKD-3mp)-O-6fNSBV?D<$>l z#a=Hv=U-D2un|#wQTp}4kCtNS`?Geuhab5E&i7bTe=26e<{xNbCR~y<^0NSOc7a~x zgP~3<)On?=_M+h!y*YND%ihvy;iV!F_f@kfa$*R-^z@kh_);td*}vY`gfOBcc*Z#! zoIVrdaWwac#rp?DpcX3o72+=(NBlYmU$|eyfg`_4-)E zTmJ|0F9dZ&#}^8xl?&pJ%GL{`CPM_|phoTNUtBk&1E1RQy+3ty*y(!&uEadUq|jS^ zpVDtw(DO+H!nz^+jSHKg;hDUpY?g;)W$}-k-P?kVULFAL zz6!U_nx1z&d`+~X%zu;JkmYJ8CD*`7obNv0k}juNZxmE6AnBrxX)37{U+Bzv!4Q-m zo_IpN(qt<@3m4Jpf0paA@f=77sCf?bi?Z&olRSY+^sh@Vm6x`|&~-UOkNr}^c0G`R zi1i}Q3v2-_NKp26f$iipF~|+9g?;}W{^#?p$ixl#iO`^vbcC^n3IJ8xZHN*{-;f(| zdTLu^kug|{w`A-@7o{ZBG_4p=n%vj6MgbHjXn%u-_?PP?D@H`L3emSj%fRyxe6I#W>Cwuz%lI#?M`ugzY3@6<`Y1JEAk)v0tDCbX*;-Jiq z`Ab)x@~=hX7Z2qO1*;VjIqgSH_G$leWJUvP1iy&trU8vh9BR{5A&k<^6 zF->{Su33c8lj0c$9O#CZEpUje-v}Ui293O;CrIqOWT@ZL5>u1^HfhJm&QuF32VIdq zoy}(0QOiB(>0z&&_CEz@L;)Hn9R zYs^8$olf*>u_Fhu$y;MW!cKca@{houJ03X8T7!}}8%+$`RaMDSE+}(>9PD(3B-BKf zN%v}_+GdIRwCo(_DW16{r(54xt?l=vndM7wuGRyJfv!}%y-=K3v(hDvC=WINy>7pw zpNq3wnBBI|Ot`dcpWcmSM=$ndk&kiHR#|NI7%jd7KC7-l6^rNKVCa!#b{t%d%9l9l zd-{06@$-ipGO7a#?Bu`oxCQ?_pJy4Nn=QQHZ%GiucI*9e9PNtx8m_r zXWgUmzE6jX54FQt7S3D1tVDVyn;POPX{|qz_j$p=^sKtMyey*3JG!V}{&cTAUMJH( z>iNB6|1=l#u1$t3fxEbn-?JW4qE_{p!@?@IVkRJevGE*s6pZ#qUs_ScCIvXkZ4@;HEnY-X;;KVt|#kxUw8#Q~J z)l8uFX}_3l%~M6o%y+`|dmdAy-XtZEd(~TSP=FG@>Ld%RCY#x+5j_Wmox}CdH|q|? zZfE8?8w<5W2*&$f674q-$LF5R*FB6yN;&N4#(SlAB=~PkO=&w9o%sZ|3A+n9cl&u& zPo_uzt*i@~M}OMd+QbgFw#s;b+2ZkmDHLv19$wsi^dDJj&A8_P{JYqKlxG0-1)21} z1m`~7f#{}<1^-lm#;y@-Z8FXs%)OW8AlotI{-{>?u;`5>2MNUtan#&;#czwx-PhiW zvKx5Y+v$+AAS{bk9L+m&RuUe#xOI_m@g$5JGGFVQjXRPg`ynDdCt_}uSNcv@r`VgJI_jF#R?uS?jtj*$ zrsC#^i@0(G_hh<0@ji+$03SL8xYQjx!>11&FQCx*5hJ|tROF)ioem|6FK173-TfBV zRp!UebWp)cmU?aXry&T*yVoBfP`D0Jv37-^;Vy-u7|nrUli<>RlVD@tlemnwS5U_w zHiNp%G0Gi|)BtODdLeKuIW3%g%QzG+C#!!9H}z)8o2ogAQLU<#cVV61_36?oGjZ|e zc%fUd=P;g*&f)&VV(>uJ0^hNsyrQfzb2X=$GiCD8rb{!5U^;(V?S|yl+9~a?;4g*u z+g&zI{j2YvQpvT#b~{HUu5A*pDC|S`HMrBGvl8}i(lw0iKDD2?7zdqBN8Ve_Wb9aC zxk!^6X`7E|vK5SnQ~L_SNQqeq#620(o&AQ;<9K#lZV69lGwt4A{mDKsu|hRtH%NyG zij`Y1k-yLJsQxZGDh1fkJ}+YL{yuy?%Evlwno>K-dt};kC!a@= zPPWUiHyWJT#NnxU$uc$h0#lx$gxJS=2aHUdNH(Ox?|`Pf0)-6kz{)8^CnA?^?! z!M!Ro(no{<4j9&Bm->Tf3%Rr3QwrMNaI4oxRXj=2J|*O30u)>y$lJ!Z%M?7segw(7 zd*Yil<@77w!m_y?A>CGKqH2Em1epsDaNJ^m(FPbgwM5m4nu#+0+&c-y3?)bzRcqT{ zvae_AQbIXW&;ONLo#bT8sOe_oT^Nq}W%u7K%1C=Q7Csh{gJNIDqenoa1XBXv73lp# zj49*}UXg@y;V|@V-aCZgubdn_L0I5uc3glu;AjWYy7F7c8=1B`fRhYFcE396q$59< z-3;ae^`)r4yxJ)J3JF1vyk0N7Fup*^jmV69*g>IW26hqLyapGq`&h( zau5^bE#i3Rh~L2l7*IMup0dmkuAvor+B^NY7uM!A9~JMt)e1k4yVO#NplE=PHeB`IfN7Q@-q4Iz)9nrY~V;kQk*RSr#W0)8*ioL#6P^_F+N zLIZJ=!%E2gswN3(>yB%xvK59twH0xc3KN10eY$$-fbreF3~wM7$lOO01XkB%PjoL!JiZ|uO9ua2=p9<;|q$!0wQw3a@UQh;XQ5k-7( z>~EK-U62N`zkLVkv0v+DLuXCLF0QcBFwe^}hqJ6KOfUn%X;Gp54TZ6(#m5fHdT2SjtO8LhaPn`Tu9#uw3J7=S~1smoG7oCb({Lyw<>D@19tY{ z1v5x2LA)sHJI$;@n^jcu($=5jF3rT2DsXDV%mz^fiu+OiTQffva&;)Va%hdE4rJ0( zs9F`~R}o|C$wtahPA0qxF+IVuIbR?{DAXgM}A^d2vsDATdlA96q8t6%oMv^X!1^K z-XSXMZZR`dNR8R7dXzECl4TG!w1t2*;u*<=m5=uK>J(dORV7>wj741RCUZti1i2U4 z5*kKNwha^7-`nar(xX=!kN;v;s%?@$YD}0R05ii-Vu2^2eO{S*Fr07A2(H`%eDi;O zVxqr9)y$>VHc9oNpBzZYZ#7ja z(>p4l5f6HqT9N7T{w3kK4K4eDL@||IxTzk=I*`LuPQ&`^FPZ>_k;#@Gjjyt6VM}rL3=j=yerq(ZHoX#rYuKVG`45isJtQw% z`p@a~j={wBNFjHQXG;r+$SU<$Em<8T37+xpcg0n8h+qPu{&B)hWyu!+`eY8xU))y$9(}Vdp{a#~ z5(aS|X%P;vR0!mwkX#nUrTD>lFLWOgKR1N@S`6W$KLNe!st9~hkk-E|Wv@d(7? ze0k4a)FFJPoz8(2L&zQQ0s9or1_5w&U9(vljNZPsrU(&Q6^sV;<&Iux-<4*11>0F%J$|2>qbgUid+JG@h*(l}S zu@93tS#|`A)da^7Sqxd&SQM(9_33HNakJml4m-{&BkPv8=92tBXC)@Sl~(p)L+P z+-w31Qv*w-b&2J#cqOTEvz~OU=3L?{$la6c(B|m^?oEg>P!@D0@=(A@*p>L?Ra1DN z+4g0nPV<%!mPLq7r_)(LC)r*5mHT02+6QDW+0jz&>S0w^7V@X?**mWi`n6aM!4`nP z@Ms5O2OgVxtEU})P?b_fyUs*Q!c|_o_%5Y3c+C?BtE)twat3&p% zQyoopaT$_V^$c}~Ay=}R)wu#QPi=gYp&jzLHsE;9?|3-ny1Uc%hSv31r(3bn=pn0* zZ0WBrA5UlvZ^}YU6IA!Vcy&rB-4MUE%gkUmZ1EjGFxVD+!4qYK%KF-}`-8@TB7M&B zT_sR|oJyZ@u2YXL_0N&W(3(P!SGCKmDF2 z9`D6pIp%7MzvQ(|N<4{-#kDBCau_7l1{8JFJ2d;s`f>ahotwQ9)`fJGDKIARH3q#t zex-HK3pKRMZpd{nv^sf~suA0iwzS5ID6Nz;P~DJ*uU57*1Cf>cd}>8v&E3kR{hJx5 za-i-qJyg!O)myV#u>}BU)=<75*VZtp7aHj752WPmy64~gGQDTW)5(3Q7*PUk7^&KHD3Eq$atbkfau!zx#gh&f=pYJ!kj&4T%R)CSR4{TA1& z0y6SZL$9_3eahc!BvhcMZzTp$#WHwT*DRVm##qfYSEWU-B7=heGqv`46`1F ziS+~8;yhujz12zIFemhjmetSApp!JkW)-`J07Na4V$tMi2opz*v|#sF;fe0_<2$TS|1+*ORAd9hrlMK-$J-di4r_hs3~(L(Oi4CbFik+aI!IV_o9l+ zEzcC@^VtC~Hd*Uwyy-034Eg>Vw)uzdc_l6t`BQa%Q5@eO1)#6npJ8CNWYhff^}?y3IHK|l#A`R!)`9Wa=IBl5K<8|!92SR=L5ZZRtn`E_IREadSGLH= z?YeDrFFyT};U$=I`mO2WP}#4Fn9m(W^2ca1m)feJD9CyM*ZrBq2VwzDU*O$xLp)Q9 z5Zn?xvkdZI7jUP@W-KXxXbov-_K1g3_ZTHQzwJ7EQ`GUrJ<_P#16`Ph+^zv|i=Cfh z7i>xcO$DG>AAs(H%Rq%p2>9zetZ+6%1?&zup-c5e#7eS?(>6Ls&BcU0bls@w zLn(l|iCDE{-wyQ_wkWX*uIQ4U5ZASDye~!7ONXENO<IK7vBQ6 z*DgtWWM?W}Xya%5BPYeaBsWrmFudmteI3A<3L;+|XZse=juY|TuWz{X)lGf{llP(2 z%`EtS&7jNY%BJyS*_uF$WwUUzSO4S0>ZN= zl_t^x^dyRXvWjj{_MO5THZ!A&fi(GQoP>1g%I>L8^vvyeA=|u(f8QF4?ilqpSD}$Y zJg3%~SAh!7eU=A-1b(aT_jfK?0nFJEAKB&Rpy_Gf?d8niqT0b`0FBupwz28$`!d&~ zay)f!V83tY2ds}JCl0h;yAHG;s}mUOs6&V2M&z-pU^KkoqS~_WUim$yBY#9cq3RACt&ST^z zM9xnF=jnJ1&N_dSk7*TSLRi_JzNd>_2^759$D;wvl4h$Yu~E*9hm)hN-^7@5Bc+zy zj;r8$?7HuaxgNcuMdlswDKM#NS*)dhd&nw%^|F<2_SKiV(;q7phvLimv<1EqWL`$B zlV@k8$piL|T_`=y!J94GkVa7m_vW+%kBjJNb+MgwWO{MbdKq95NIkwBPt*C5X>Y+} zASFOc&e9C}PxOCBoi)fU+ZGToVj}%w0WkZ%sI?fVA?c8YvXWY@P?I=I{od766(t6= z$d}w+to65C|9>2vXFQwj--nYBX(>9i+M1nqshJXz-o5Xtm8iW(TYJ|YA;!_UuWi8b=6mP|uH|7G@@7~+O+TaQO)I$Xakl^pv%8%g!gH?wzg06xR=^Im%dgI?4j}WxQkHv+lji;+?wy zqjH#K9kQYPmjx}=mI0O{i$uJF8W7an-yYS3yO3?ZT@nMy$;2c)6}A8uyh8nGTn=Gh zzI|-POCM$Cz2_6n7y4f>7KFYZfYP*NJ>|^jDcMK;z6dUWXy~g!9^)xl;FQFvRF+Hl zgXMh@R!;|Q{n#pu&`z<(i`cumHuiJFAr3v1=%b=nSiSNP)jnzfqkj9|IYpt?Kg!8T zk;b$m0K3p6o4Dvbo3{}&_YYyf`d~B})J~?5HJG{kzx9~8Tp7;Z|88bS$MZT6a%}oT zNS+=4j`%COc@a@w*AMiPfE$>f_@uWPiJz7_=kM#|jQNv4sTpL<1y>7;_uXqMP5@s| z-{dmrp*E`pk8+qT7O)U#9&wwCza#R$VlzZA-D_D*7F6JwpuE9SOhO2~93LvwX8FhI z#A>}tx|bU<3;Tz3;r-(hnGJlzQ}~tSTtpN6V3mkN6qP7fJ3SE4m~Q1}-6SFxis37_ zJV3XztvjMS^NN!en5Rt6?DK0`ERxcM90iDvfoUb(8sGoH9OMN#z|}ihc;8@Z)IZml zM^7tuNs4j!R3?NBkjccK2>ik9h~P{*FK3$ ztf40fMoq^@{ZOA)hB(P(&~t0vbiII+WfO^HF%B8Jyvz%fs?4o*$;@A}ZbN`ZCrnuS z@W%z{^=97Q5JDmQyUN;uyklk4ra@RwJ4f0tB`#ch@+G;sQkQABBZ&0AUZ)6|d( zW$zVBf4At-Thm#0;RbiMo*h|ik+PEK)| zlAOe-(6mpsuQ3H$y1m8%LdIsMlwjaorrdA5ztmD_TTIy(7-hs+X&d8mKFKFthYIoUApT!|_ zyv#0O)OOlZIlla(Hhz9qAP`!4FZqslTzjicAGra{P74y85rNYlfL4+Xck$lP6LojKbWyD zo!#^IR{fW!bZv6|8>p7~$QNI2Tud`=W14>hU?2)p(llv%B@;(M9Vxk75TJ<6 z3Agj=7_TaAh%I#Hu3xGIUSg18l4@V9f5O~)3QJ=&FM0a1*#Y-$$FxzO`R1}9DB4A6 z;52>KK7+Ej#~QDPF7W>zn&~8o>0I1F5pu2wa?7G&0 z4A-}RE-~r1BNTrwQa1Np1^TK4tF3H|Ps+42I{V|55i6Z5_n#fsDEGCi0mOtnWK`4Rhg^B=_HhFvZy3*lN_>rz{B56lH#KqilTqr>|Y5 z$H1^cixQz>qPocO?VI0r&72(@rsmI*az*U{N!`YxJGgT?1}OjrL5&BTm*v8dix z119Z+YTSQ+xLxCw&bM9c6~6$NI#vBS%GXjlseVz%vNitrvdgo`8Y7KfUxE3xttX)j zKgd%KeaPKcq=bEPw@Lh>)}MY%=*IL>{}(StwUwP*QoHeVI$8fx#dmPdpRUI^JMchM zA@YJ_hh9AS1MVe`ZF6k;AcC~;Rp>}Jy@LDoueDFytYFnL{;JHC*Y2;_J1+8!kIj9t zEY@@pucmcKh@@-b1Afqw($X+sBJ_!gVzGra{r0-_JHz}Cu^Vb2QM!DQPbeUX89op1 z=v|aMYcIK#5HcpXY9mdLhjfc3X5(nXwemI>O_nl&WtD~};sXg99NQ$>#g9qI9nYV? z0h4a+P#&@mq5B~<`1J8O@H{bEK49}RJ(b@_@lNSg&CnL z^Q*bOInd?Zo=0f`Sf1(kmtss%BDIF z2Wlk@ATe%6-#$5r_8+)pMb0bf{de`8x$AyCgZQ6X7`hMW2B@~wrjXq0ic^K^Z=P(g zt4?Q#SC0M)?YR4Fg9&bJeP_Aele*iX&!Y zQWe`Fa}Fq zXAw&MA*ESR@3D`!Jr3R2>ukzuN_g%OGK$kb+aLO67v2p(g~~$ll!lgTu&ZvPsyi9O z-T`om)h4ErxBtcHDEA^`_eq`mXo>%WL$KfZlc90w<9Vt_@pDP^eF{!rW>Am$W)>)k zBz0B!jcU2Rs`6J_=aGTxcb@m%`|Wep0IKST#(OU(3DF-}bbOTqne@^uu z6xg|4#Vs~<*Hu-(fRc1tGllwFx_(LhwSyoq4`N*4=I&KJ*e`LIublde$F_WU0DJva zJ%)=)2rC7o6&%JK&+Sds92fgU=oM?0&SCw%MncU%0qUTcQZ0}LVAEKlmTn&1hN+Y~ zN)-(82|IB`rT|bhJitS~b4uwR;V~I*luBbA6|-xzkz1FK1v-~+#N5}$rkeGbT$q@_p-Vitt7P5)hi`*b z8X4XAP(Fvbthq1QB7{kce02h@HyCw`6tWOD)|I+j(3K_dhboBl?_K56le$1O`TFk0 z?1dp-wdpOy8{43;VM(x2;Uy(-Y_YTNMF}c@Yc^vOS zGvk8VHbBMMYnfsfZ@NKHJEJDJw*017r*k8JiWvtKHC$F6RyRd?Q+wR6&vGEXJ-E;itZt`g zh0VJ$eaUJp+H(^Uf`2(iRy!Np3c4G6S4O5p7G#iiVU~q+X`QGsg3{Tz$F!JUh!HB1W^`K5ygOwun^SW!uSKl5$7y(M6}r7US&d?2Wd#wq556YP-$2e68p&{EnJb_eK`d9 z9>rim-tR{dX0%KL_1btKIyP>LgWSEPe^3{vVdjuW-LI;<&Ml#OBR)wNtzTZm=isbt z>@)wG2=n2c!ET_%A>Rg7$U5Ky-Uhb(SKg$+`-?X2ByQ+`pObcTy3t#gCFQliqI6c= z>-#fzS^tp^VP=jO-(n9CvE=#y(Ns-+k^N^s&OWa(a5lyK5;1WkbyAYbJ+|!Y-)X(# z;xJ}?XCdOq;_2MGd02rQj3+?A=BlsOFD?`PFkH3E-Pbu5WqTqo;vyd)#~-YU#a>vh zkS!{X_x`JIE!O7PQm1Ys+60eya4YJ+yo!Uu)YQ7d@4yEHBQ@>cZCSuCeye9n*CIGQ zA4c9r&&w@%R|buA*bY)87QGYWc7Z{J7I;7bgH$1@L6yhN8=w9{I=XT^Sq2kZFE9BP z`DxT{f=jRq4Pncm?iKIR{x5fBX5TH@kWOCQ*t1)uj3wPXR^d!LPTx4sybF?&=>N~? z>qY;jxV`3q4Z++ShM%&t8Ix#sIFmVf!kpUk045Yve^ta7UAmidGUl{_#a`Hn1*UFe z-5-FrAJ=%?k>i|94buoy*>MB(b!m`To4i{LkoatDF4lZEfg@Kr@TBWF&KJ(J*B8xf zi5@hMXyEhXgjKDkFXEVJrEcymKB-Rsvj$c2zF!(kT0TEV8A$5fSoZ|Etcd8=OEwaC&zF7`s)fCc3iMa{{{?O!#@ms_WFr7da@$5~gc6s1s6)T0dpc7P843WWfcRc##+~untDepad#}8y=1tb()xj&`$?fM!4}gXay?aXc8~T2)$w&JWJ+Icp?7i;- zeG|!&BUJ;|6XwuIvs2-@_hu(QhLvm|jTGohOmGpUNu?H-0WA0Ln87dE)54;j&h3pp znLGn5W7VY{tlh0R?s`ZMTA6cksb?O-q$^f4h)ubjz84iCVZ77p|+2vR1pkHei)46;HS(4l&{LEX9_$SKuOuS21-0{`8itv;ho{vmxi|fla zvsQt=h@zsev&4#5!ri2zz`0LN9hFD&MVK(>`a;O4w6<4dzm&?IsrNPS(y;tvZZ zO5*Uncw2vk^oL1Ht)0%rifl1hNKUa=v)PV@v_#*oIVcj6`=eIg%i_GyFODB6){t!S zx4Uqil)E4&vT3FhO-InS2)+P*%d>y`j;?pD%^%}x*oV4I{c~AYOES9QGR@V-d z)nLZOutlx(&4(kGPz~{Fk%w{hI8nRFAxrcB4f2K?OM5pIi8h$cQ!t-09x0c{m+D;{ zZ2Goh90XS>Lcv);qLzUkIq5r`u#R{LmciZNfcKpPjZe(!VNs_!P_WlEDLoy;B;JxjRrIKW7flJCYIoF;Xt>1M%GSjei~c-Vi!;HI zS_Iq~_veJS&Yn%KCSUfJt9+()xn#8A)9kF$3ksL4$|DW{@ip)|C~L3Lm(1Iz^jejs z2h2Tf7fc$uJ%Ahd&bfPirVTU@?1on$*HDw!VZ53Hx;1oR@ePt`%&VbKNUKJ&5fkS) z+BW0s9NsVW@7+_V0_TGBvF0zidJ+ zS=8EZuRFCK=s39=Bx1WQ98CiLg_39%!&wJYT2;Vb>YE)glSQkb>B+-js1XYqOE8Ug zFpoSchah%71+TW-wQRN}a`viCOr#RrxB6It<1Zw6?w9J^7J(Uq?ZFC0iDf8d8U&-H zl<4xY@><&h9l@EZ5@%%=%lS;$pSSOph;tzCU<4IxgVpJyDn9!&rVl=WcgP@nyxHOAld>tPjJhY?CQ z(TwfJ{bSpCW=CYp-i(Kt#ooup+1ZKx7zny)W2g9xf0K`0^Sb;@Ia8MY}e6exhQXmob?K(yKbzOx}rT_9D(EaD$actEXBenaG%6*aVL zXziQbVMJx65Zw*-`c+in*z4UdomYMJjjMq0{HT_r3ojgM)cm{AqEYD4Pwv-{oDFHK z4j~igx2jqOPu{ZU*xy4I7~Ijq1ZVf32C<%Xlx~xBJ}~_)I2vqI{d{rE^I&FVGx#iv zmT7W$R^k#%PU4bu@cz`MM?j9Mq#9Ll#)u>|!KqUFY9+@~UpUxx>X+vxePe2Iq_d^w zse{?5`s=5M=riiO`~?lB2Mg&QVGgDZjnjC4fU`^}#G<_)0j%Dol3a>05JVYzUp&;# zm`7U{!HG*R@`@X_N2Y!jRCSj5)JvX}WiL7uCnyNNaTaUx@j?%VZI~5owGum=^^Q{k zJlgku2{4w>lrPd*l6Qj2Md1`~ZDQuq} z49NLLgbvkPFejccq7Wl5?0@w4qxJP>f9CM|TWiKE+k>w{9@6?k1rZPU$U-W9uGJw6 z&gms#8~voI%>-U^^D5${FZc{$@#Oqo`dWa8abl$d+EQFt8+5k{HUIA-N*W3FB%jys1zkj;HvF|*r%JFcJ0Jw23L(J!{6DR@=asS!Paw33nO zc)m%N#r9bpS@cEMfu2;}g#@%PM>-+ov@?F}5w9vXARiZg? zQYNPZ6c>usqUPf!hn)kDPQ`Zc=}M-}uG9JmOyiwfsJnf_&v$ulr;GQbx`H)`%0qLzaC`EM#z$_@(I-AAv$>LEGbEalWovmy&J$mW@} z%O5x2!=x_E8Q<0vz^6S%BLkUNJ9yM%srpl%ck!n-+mA;Lb-KkDe6D`L4C?4O=%e*G> zD-mO{c^mV6v0v%9+a=h#>lI?bd=WFjS#UehxJog_#2WI(?v?3=+qWB~Z{#N+2Rh)d z_$*NNJ=+6uYmhz25#@9<8lv>|uB$-O2V*Qgk9IQ<)qkjyRSt?fcNi0-Kb*Ah_d=LJgtj6DPAe*lfK z!7Wqi_Zx0?i}K8;!CZrHPdtw5PBLp$7MXpO5VfaVxG#n)<8KVB0VerC+1aolI{_}z zpABL}0!C5->KwgR#YkfioHKMT<)~$-r83UB=wk;QUf-#FNy%{Aed*@j;8D5uAUGpM zLgu1mw}p%JN-IE*f8H$@#hg()>aof{N&2OhtEIKsG=0&NQP*@>2fzrF7LZrr4J;|g zdtv_7hnUHGV@zfQpc*e(F1}@#zZ`b5XJ%>KRCAnjh^H*zb9yO1E7Wo9W|f zmqOV&Y-cdznX@qnHP;aP?vjHMU*P1E>Jl7&qYwkm0iF^-fV@_w-gD|;>ib)7sN;Rg z-~I3HQ#0U*e|$X|^ie_A*|h6UPGQKK?DB=#hs0tY8K5>056R)}u_%N?45X%dpC9F# zr-i>aPRSrSAz2sevD&Fw4FM}8+mpt)7j`q~Z%7(VA0yS^4#7rOG(IZ#nYgAyp4yR+ z=1S_d%8w{Wz#!BR%=L)Z+$YO*5rDR_P3xey4;H$q{yOGpJBB-^@dW!qKOiGy=EE+o z;yJv&Z*FmTYO3p#TuXw4@oTLlYf*fhL$8$pI-}77RBry-FL|LvWT=eR`!NuLVbSTW zDzmvQ%Kn<5$la|Y@D!d>OIkQ9e%?O2gC-9%JQqOQnh<@IFNK8%9vyjpA%!gu*C_fs zbn0F3k@p}QHy58CfHWzmA8 zvlIWHP}$7rJ=bvxL0G!?AL~V~AOYkT46{#MxLdH`o0Z#*-(aU= zUc|KV9ZzFqa9B^G`BuLg%ixJ3hW=&t5VttI$%DF8;<*;Rdxc=4oA}=?(VC_gecNyO zpy7)cR@RQBa zQ&-;Pk4GxF84Ku4H|{7O-VZ3UCFd^jnq1K}y+rO7628oVAzwJsKAih+oHiI;`nK~p zbF-t3J7=hDudpuItN>$sR!(%{z+{TWnq_*8_RKky z)&{fRj8Y!~=^R7S&HZ?@D3yM4LqBnHp_)jsz@Hi{o7Zh^dJua3Q4-Uf+J-Ukz#q4) z2zO82@^wt*TNlIpc{MF!_X8^Uv4o)^xbl4Pf=M3NRKt(~gWJMWJfzatsX+6h{X+W&X1eJ3@r z$0K;s!+tgQ-kCF;-&kj7HZsrr&`!tJ(W?EVc_hahYe+Su?3lBIJ3MJ@&sy*7T-ZHY ztw{+bX2$zf39V{i1lO;aC@1*6q@729&a19;6l*Lnh&Zc&j}*@GqSi;s$dz2kVwFw! zjOy&>tBkjZQwEsML(z(mCoHxUt1OF-+t#^J7HwY@G_3-?R)-DyDiXVtZgJ&YO5;(q zJE3eM1n%bt(m53+CgqJMuqqLjE<>E=)*&_Ig(M_%p+6~f$9Qxvye*=zz?d__&rPUD z(2BoD$gOzrfJ+H-2mgWm!JzvA>zJTsh^6GA=rdJ-!O`U4hjSzDoOg@u30k(S2k^1C>fOw&wT zo0M%-nix-%YHIL?s%=SiB7nM7GMs3{SjvTC8IAXpou7uoD(&`ExEEqal63% z@^&R#2g}PD1>caOjM_EUBmUigN16=G5)WW$f~o;F@Ik9Mn|vR^oQ^pm2;oYvVoVoz z(+NvUA%`*h!{cQb5@F#sDR(sFb!z>1_gDk4!W{BhnJKxNkv=1})P!2yI2QYI4f!~- zl;z(6tx6%K8P%af&?9!jc@uVeP|SKLou8c^FUPeucIpQw4`<|F$i`86P#W8pAj_0a z1ne}?YYMpaT3rlIQ$u+ChrG9$#$3oab_(V^`g*bOujQuekuF)x<9F4`L|a7FNrX~F zRntzl|7@6b-d3AOg<@zCX~$T|%>Evn#G0Wbw$}eZWi;m3?e&4M^Wau~I;%WEE#L`! zGE~&s85zIg6;#ChHRp8IvxBnzgRuKFpzSjkM%^>z#g`uxEBU56?5~)KY@SC~*ZOZg zq9xJQ`xiZl=hDKn-fkhFXpWr9vJHDx|9$Ody>*_mY9iOyXy5CbdQW`@Kk3A1JyNA}= zugG^d8zInvDFnAIF;?`7)74`AJ{|=0zqRquuQ)M$HaSneEYkW)rX1|z+pX)QGn0DH zuK`R2NY0129jR+o@%)#e=t1a7K*^QwhdaVva#O zw3W?cR&<~rBr&n;MJ5#CQ8s>DSS4|jKH!TI#|1SEI*6QQ-?wUT&Y(=N{jB4GUxc9( zjL{69G_xG;l*WTO4}V8m2NdA9$JP%NEu3+r6_v9J^01bpbjY3>yw0aX>UB8K877;W zoRXx-uoOXISlE|hwCy+B4pa-*AK!~5@*g-?ZGQsb}ld@NFd1d+@ z`c&8C`+fH6nb(BbhM^zX30Vya~!T8YY zvgNlrJZDcAi4|LbTsvTN9ouINy$N5MX6Oi_=atOt&skXVJ4|+QczwLQC2%v1P#g;#4;W|$2Fm5VDfOAkz2(+aOu^v+p zx_9)<8#lLk%x3z-oEf|fu6{y_BT>V2cLpM*aPEFw|_i-(mN3Rc<3=e>H;OIw|A^ypV`Lm$?&87+$RJ!gM#A!aOYEa@fB`n?8pa;Pkj1a!<} zyuRW(o1VfL&pAfqK2<|JAV_(}2gGeEs@@B$J{J4kfaXquXscEcFn#g7;xbob*^jr< zDo=_iMt{9N4fi2R@xkP?-?pCqDZqb!GyU!(a-XpdbtfKlXc@s zR$3Vt&M8kqMsphmi*6`GwN!3mLrqSW%Sk>+8Q-nWG@>zuZ?y2J8SlG-bKB2ICIpm(5>trVVh)yZXv-VVhGeXv=ka1EPWx705hltBZbGTOR!ELTzv<#A!T^qM*x8&mKE77gb_VM}Y$zV!anR_X->8 ZUzu82& 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

    _V#8V{b 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%0D; z+6U?pk3Sd@N{+*U1cub|VUoXr#5W8h_a%d<;7FlkHH4wy}&A+c>z@zxtt$ zfMOfO$rlvVQ~!v#_LHzywf(D28qzOywQcR2_KzPy=Hpt(iYw01s>WlCKRUEWl+~t{ zCl^@zhS)dqG;hQLvUtO}ByX^bAAoNA8^r5|f)3EqxGa;vLkw&}fYeRsT(e|#R*OD} zI0K)03}V5gK~En7Bn3|8f=X$LeGy>VKL8Sxq~*qP4Adu{_DvmalXlDrX+uAPP>>Su zZfbJSsZU?pH_EjyC7=UF2_RAG#$qM8W|jiQllFSzo{*>QksyqNJuc!Pfb>fxnFXax zbr1joWOO?#){ivp0ZZ13kO9SjA?}06ej$0LQNnFu1k7dg8*@&x64-^)A|f%;z$EpgIfcg5UEVyNNO+Fk$s|X0Z5!}svm$v zf>qllPKatPs32o|x)X;w+9sk*$D};BkXS|ljEYZ8AU)H^BTn3@zcDxO3nzdHhz#td zv1$7QSRV%C{BX2*Kq>2o08EgQPr72EBH#j503yMS08fKngOq`#!6j+Hp>*)Y!G<-8 zR-Hb1KpH4f+)f<$NCT7Y(w;nkNb~7i16uirel*wx8g&`qw8O>a2ab@mjz{hI5l|c; z=tKQ+{KS#APaQ(Gqk6;%NwZzz+J^Q=apjYTlt-NHVf_Rl;K@zpo?qgWJCrt18MqqI z8pr}FjSB(?)U2Z(W(GvA&jF%B4PFiObifm*AGwXBHNeyDAo3_ diff --git a/BioTracker/CoreApp/BioTracker/resources/introduction/images/right_panel.png b/BioTracker/CoreApp/BioTracker/resources/introduction/images/right_panel.png index 56df172fda3aaa243381d634dc4735877b98aede..b776fc111bc70e89b6abdf0b1cf89ae9f2d19dc5 100644 GIT binary patch literal 60434 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 literal 37775 zcmb5WWk6J2_dYyycXx<@bW0o_5fWtGhYde^5X0 zl%{_ZyVcw4bs|;P-EeaF_xG9+PZf>AzZa3E

    Ki^vYEEvktR(@hRdH5 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 KEPV0$-TwmC!C2h@ diff --git a/BioTracker/CoreApp/BioTracker/resources/introduction/images/toolbars.png b/BioTracker/CoreApp/BioTracker/resources/introduction/images/toolbars.png index 9c59e825e9882baa15c56cd0a937a293197583f7..ee7ed9321e7f8eb206599d17bac8062f5dba9863 100644 GIT binary patch literal 64416 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 diff --git a/BioTracker/CoreApp/BioTracker/resources/introduction/images/tracking.png b/BioTracker/CoreApp/BioTracker/resources/introduction/images/tracking.png index 99d2adf12a952d3065787818ec4ccfbb8f1bc74a..01214da74883352329da14459a15d52e9b311e71 100644 GIT binary patch literal 345535 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

    -cywy;8!m@Dj&}Y%eTg7iV-0VR2lVq{C zi`W&5Jp%Iej0e!_(DU3b$0$9C+QMsHI98Y<_DEJ@=gvcfOS``5sTb{y`##vW`CqD7 z)2_}{@!4hQ{yyw~C25)cX8A1EzsUxFQok&}AEB9%n<VJI7utbH4>eNu?(RP z5cBO`K7qsL(Ow>M`0hmP0WXECe3ba@}zuB8xuneZ1CHdD)g*C++iPP_I>=z9NGC={wPha2V~glxq_D`g>q-zjR}x|{mV%TxXaNN z72k=vGFwC!hv@}cET|)cCBsKe8J~GfGzS2vfGIZt{`b&I_tSNs+6z2GV`>h9-N);)3MJ)2#Rd6_!0pQ%F5cl z`@@p(*=I{;3>R<{AFp<&To#IyN$MMjCwD7Jm!sGbo+#n)Q;2$D%h#m$bt7FYQm$H$ zLWb>~L`Z${F<2^1L!r(CdmqHtPr$%@V0jlVYj>3mrN`K7z+Io0pPWmS5h0WfmW~)h z2K#E#;lIdqbp4QKJ1EPTpI3CmAaQ21vP)0x{#e3gYb~i_205nO2_msR94qi}qTDnY z^8hM@N!$qzzN{R(Ted2fk!sOmvX7>N9mCUS3_HTbfQ`q7_rDk&La~WrawhTC!T0OW zMQ*Olm$PxQY5VhZ6hjAcfxFplrEXR#v8SJ=)4LToNGgVm9qOy|XiSwz$upiO_oxmK#l`-iE*q}w}LS%a7Vi#h=qVOjk( zqY)Q=m-Sbwzj&`j!*2L5r$24SgXM!;ERjhb66R5VPj>j<*dJW9d7ezHub2M<+PTi& zhIq0?cw;p>$@_E-5t9DDSx!wp^gis2{Qah?csi37ZI?94@LqX(VNp`wMWUMdDUA+# zPAWM3u>D61wEdp|$%EmW`B`k_royn>T-|VH$Wf2q>5N~wXi@TAU5l=qj8s0CKxuSF zj|Y?cClIHq+Ow32$(iA8b=I?h$GIvlF&B?j4*eJzC*E{dw=~SrkQ zh5fP#fAX8=C4}4U?7A(&KiWK*nR8O&F=R@5>u6@L=Iq^VFLL1qyLc#wHM;J#9Cb4b zZ2-EP3+4vyc}bs7UQW|AG6RL8_AYF5&5>R;<$%gjnOPN@K-DPml!jXr`)wC?`n*{Y zYB6><3dk4rfheMX0sNpah|eSHjno=L@guI8{=;b!p3c{}=@%$hg{TbC4q3C4p|)a? zD86PvG}K#R5Sx`HfLKMX%DnQCR%P}6g<2AA@}~57#*(J;E~C-^)J;+2;yHR{;RI_$eX{ z-=QoxY8efCRvTEV_gWLQ@DgK{OXIIC7?P9_I-CrKpxML*YnY?-wzi}0uJ$`;xt+W< zyFQVs$G;(wJ{M z_@C|5n6C=Ae{$oGuLa?F)VgX6Y-|Lt3bjZ0M>36^RU$U)`?{B`TXs4o9fh=|4ZPS} z%FoDGL8WRnxqDY)#GqF4c8&x@nb2YB!0*wLH2qDMHO${Y%ZJkoGv(gT5TYAn(cg;0 zRR$6Lt`+V{Pu8B+xzA6#kcmtw9?nsmu9KSv{*UM<^Yo`HgyXFn)#tf6Gd|8s(Wu)8 z4)4*~HTg9S3AMCbHqa+SUr9Y3g(sYlD~tmjPLAJl0(V}mB}z#5)x9)v z)Ffc|xrQCS zTg=|r#6ci-X$I^lK^2&aPL`XgTO=JM23b{_4?-s3?pb|^85@vYu^|^6&bs+A`#Y3O zeoc1gZV}Q8s<0Hs<^BnZ7BjZ&XJ8VAWAN5`BT$s$X==^EL)G-BWMtsXBBa@9nVz

    jsZB^g$x`L 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 literal 829202 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 z zn&xH$xZJAHV-NnkK3};QywKd0SRm3{S5;v$moi0vcz|&gMpG9RNGJx5} zETa_Qp4YrZ<}t^wfE89U$3A>k>AAqBZwLEHsf7)-_pDiu^E~5dbFL>2sICkKkG(1| zuffe{oS@e4b12(@ZmxLmF%277YrB?k{b$aj2rkYtzdru)k7K{zL0AjE$?U}d(gNtc7qbAsHU^6WydPjKvA@P~1LS1|WM6r_4)L;U>eWAl*bIS8 zrPEPu;<#LyFC~$addeuVh^sRP&^!rM`qNEuk`D@fQRFJNdt&N&JTZmx-TOCX8$=e<4Kkw?Fj&9roOPyo6aSH_@M(82#oO^Xd;EIQko`e zE>)Aaol`MZjmTP9i3y#FPy@qkE3(wWpEm_=@N$nD;AK{tGY-x%yC%|Ha7Kzbr8po* z#jd18pE_S7JhS)#(Y;HhHzU+Zr>orxrWDx9K1Cr-;+!K!Pv_}XM zfwh*o(QV5Nc(a2#F_W?yt6uXqmqi$=+;ZGG(APCOO%pDkJP9DfyJG>g=6Tlx+Lld5 zGIH+Qz^!YY4KzhnYjw(f@pEWem%50nJ5bnUh#9D-6?;e@*VK*)Q#DhulBCIXk72M2 zwZ*uAM1fUO zCD}xH=ew?oVcL+EY|i4$P4`(@lfGas0bUtXrc^Kt6AHD>(Aa0{PB3t!t(gs$FvAXY zek~Q0IT|Up3RNq09K=Y;4HmEl#Q?^UHYEx=5MCGa8#}y#F%0@>P@EZbYXDz^;`FSt zuxM$`F~hVL_icu;1=Dx~LI_yqSmgoge2tY2su=qm^Ju`C*~uwp

    Orp_=6|yWCm) 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
    L=>PGihS!PXIL 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

    (9B|0g(*Xf&kDXvgREkx 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�*V6_L45@; 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

    A_$b8Eq( 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%0A=>ajvdjXA{sB0K_qaA+uIYJEaq>oKm3 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 mat, QString name) = 0; + /** + * Will be sent when tracking is doen to multiple components of the core app + * An example is the visualisation which is then updated + */ virtual void emitTrackingDone(uint framenumber) = 0; virtual void emitChangeDisplayImage(QString str) = 0; virtual void emitCorePermission(std::pair) = 0; public Q_SLOTS: virtual void receiveCurrentFrameFromMainApp(std::shared_ptr mat, uint frameNumber) = 0; + /** + * Recieves area descriptor data for rectification (px to cm) and for tracking arena boundary + */ virtual void receiveAreaDescriptor(IModelAreaDescriptor *areaDescr); //private Q_SLOTS: diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IController/IController.h b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IController/IController.h index 706edae2..616c224d 100644 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IController/IController.h +++ b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IController/IController.h @@ -18,7 +18,7 @@ class IController : public QObject { explicit IController(QObject *parent = 0, IBioTrackerContext *context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); /** - * @brief Stores the current zoom and pan offsets. While panning, panState stores the last mouse cursor position. + * @brief */ void createComponents(); diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelDataExporter.h b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelDataExporter.h index 6425384d..c33168f4 100644 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelDataExporter.h +++ b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelDataExporter.h @@ -5,7 +5,11 @@ #include "Interfaces/IModel/IModelTrackedComponent.h" #include #include - +/** +* Interface for the data exporters in the core app +* Besides serializing to files also includes deserializing from files +* Current exporters are CSV, generic and JSON. +*/ class IModelDataExporter :public IModel { Q_OBJECT @@ -17,14 +21,14 @@ class IModelDataExporter :public IModel virtual void open(IModelTrackedTrajectory *root) = 0; virtual void write(int idx) = 0; virtual void writeAll(std::string f) = 0; - virtual void close() = 0; - virtual void finalizeAndReInit() = 0; + virtual void close() = 0; + virtual void finalizeAndReInit() = 0; void setFps(float fps) { _fps = fps; }; void setTitle(std::string title) { _title = title; }; - virtual void finalize() = 0; + virtual void finalize() = 0; - virtual void loadFile(std::string file) = 0; - virtual QString getSuffix() = 0; + virtual void loadFile(std::string file) = 0; + virtual QString getSuffix() = 0; public: IModelTrackedTrajectory *_root; @@ -32,6 +36,6 @@ class IModelDataExporter :public IModel std::string _title; signals: - void fileWritten(QFileInfo file); + void fileWritten(QFileInfo file); }; diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedComponent.h b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedComponent.h index dadfeb64..cc47f9d5 100644 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedComponent.h +++ b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedComponent.h @@ -26,6 +26,9 @@ class IModelTrackedComponent : public IModel { Q_OBJECT + /* + Q_PROPERTY-System: http://doc.qt.io/qt-5/properties.html + */ Q_PROPERTY(bool valid READ getValid() WRITE setValid STORED true) Q_PROPERTY(double id READ getId() WRITE setId STORED true) public: @@ -33,6 +36,9 @@ class IModelTrackedComponent : public IModel * The constructor of the IModelTrackedComponent class is able to receive a QObject as parent. */ IModelTrackedComponent(QObject *parent = 0); + /* + Getters, Setters & Checkers + */ virtual void setValid(bool v) { _valid = v; }; virtual void setId(int id) { _id = id; }; virtual void setFixed(bool fixed) { _fixed = fixed; }; @@ -47,22 +53,44 @@ class IModelTrackedComponent : public IModel virtual void operate() = 0; protected: - int _id; - bool _valid; - bool _fixed; - IModelTrackedComponent *_parentNode = nullptr; + int _id; /**< id of the component */ + bool _valid; /**< validity of the component; if invalid -> not visualized */ + bool _fixed; /**< fix status; if fixed the tracked should not change state*/ + IModelTrackedComponent *_parentNode = nullptr; /**< parent */ }; Q_DECLARE_METATYPE(QList) +/** +* Serialization operator for multiple components. +*/ QDataStream &operator<<(QDataStream &ds, const QList &data); +/** +* Deserialization operator for multiple components. +*/ QDataStream &operator>>(QDataStream &ds, QList &data); +/** +* Serialization operator for one component. +*/ QDataStream &operator<<(QDataStream &out, const IModelTrackedComponent &painting); +/** +* Deserialization operator for one component. +*/ QDataStream &operator>>(QDataStream &in, IModelTrackedComponent &painting); +/***************************************************************************//** +* This is a node of the Composite Pattern +* This class is derived from IModelTrackedComponent. +* It includes positional data like x,y-coordinates (in px and _coordinateUnit), the orientation in rad and deg +* and the width and height (in px and _coordinateUnit) +*******************************************************************************/ + class IModelComponentEuclidian2D : public IModelTrackedComponent { public: Q_OBJECT + /* + Q_PROPERTY-System: http://doc.qt.io/qt-5/properties.html + */ Q_PROPERTY(QString coordinateUnit READ getCoordinateUnit() WRITE setCoordinateUnit STORED true) Q_PROPERTY(float x READ getX() WRITE setX STORED hasX) Q_PROPERTY(float y READ getY() WRITE setY STORED hasY) @@ -76,6 +104,10 @@ class IModelComponentEuclidian2D : public IModelTrackedComponent { Q_PROPERTY(float ypx READ getYpx() WRITE setYpx STORED hasYpx) public: + /** + * The constructor of the IModelTrackedComponent class is able to receive a QObject as parent. + * It should not be implemented as it is a not a leaf or a composite + */ IModelComponentEuclidian2D(QObject *parent = 0); /* Returns a human-readable string about coordinate units. @@ -84,6 +116,9 @@ class IModelComponentEuclidian2D : public IModelTrackedComponent { virtual QString getCoordinateUnit() { return "cm"; }; virtual void setCoordinateUnit(QString c) { _coordinateUnit = c; }; + /* + Getters, Setters & Checkers + */ virtual void setX(float x) = 0; virtual void setY(float y) = 0; virtual void setW(float w) = 0; @@ -118,22 +153,31 @@ class IModelComponentEuclidian2D : public IModelTrackedComponent { virtual bool hasDeg() = 0; protected: - QString _coordinateUnit; - float _x; - float _y; - float _w; - float _h; - float _rad; - float _deg; - float _xpx; - float _ypx; - float _wpx; - float _hpx; + QString _coordinateUnit; /**< coordinate unit, will be saved in exported file */ + float _x; /**< x-coordinate in coordinate unit*/ + float _y; /**< y-coordinate in coordinate unit*/ + float _w; /**< width in coordinate unit*/ + float _h; /**< height in coordinate unit*/ + float _rad; /**< orientation in rad */ + float _deg; /**< orientation in deg */ + float _xpx; /**< x-coordinate in px */ + float _ypx; /**< y-coordinate in px */ + float _wpx; /**< width in px */ + float _hpx; /**< height in px */ }; +/***************************************************************************//** +* This is a node of the Composite Pattern +* This class is derived from IModelComponentEuclidian2D. +* It expands it from 2D to 3D. +* Reserved for future 3D tracking. +*******************************************************************************/ class IModelComponentEuclidian3D : public IModelComponentEuclidian2D { public: Q_OBJECT + /* + Q_PROPERTY-System: http://doc.qt.io/qt-5/properties.html + */ Q_PROPERTY(float z READ getZ() WRITE setZ STORED hasZ) Q_PROPERTY(float zpx READ getZpx() WRITE setZpx STORED hasZpx) Q_PROPERTY(float d READ getD() WRITE setD STORED hasD) @@ -142,6 +186,9 @@ class IModelComponentEuclidian3D : public IModelComponentEuclidian2D { Q_PROPERTY(float rada3 READ getRadAxis3() WRITE setRadAxis3 STORED hasRadAxis3) public: + /* + Getters, Setters & Checkers + */ virtual void setZ(float z) = 0; virtual void setZpx(float z) = 0; virtual void setD(float h) = 0; @@ -164,22 +211,38 @@ class IModelComponentEuclidian3D : public IModelComponentEuclidian2D { virtual bool hasRadAxis3() = 0; protected: - float _z; - float _zpx; - float _d; - float _dpx; - float _rada2; - float _rada3; + float _z; /**< z-coordinate in coordinate unit */ + float _zpx; /**< z-coordinate in px */ + float _d; /**< d in coordinate unit*/ + float _dpx; /**< d in px */ + float _rada2; /**< rotation two */ + float _rada3; /**< rotation three */ }; +/***************************************************************************//** +* This is a node of the Composite Pattern +* This class is derived from IModelComponentEuclidian2D. +* It expands it to 2D with timestamps. +*******************************************************************************/ class IModelComponentTemporal2D : public IModelComponentEuclidian2D { public: Q_OBJECT + /* + Q_PROPERTY-System: http://doc.qt.io/qt-5/properties.html + */ Q_PROPERTY(qint64 time READ getTime() WRITE setTime STORED hasTime) Q_PROPERTY(QString timeString READ getTimeString() WRITE setTimeString STORED hasTimeString) public: + /** + * The constructor of the IModelComponentTemporal2D class is able to receive a QObject as parent. + * It should not be implemented as it is a not a leaf nore a composite + */ IModelComponentTemporal2D(QObject *parent = 0); + + /* + Getters, Setters & Checkers + */ virtual void setTime(qint64 t) = 0; virtual qint64 getTime() = 0; virtual bool hasTime() = 0; @@ -188,17 +251,21 @@ class IModelComponentTemporal2D : public IModelComponentEuclidian2D { virtual bool hasTimeString() = 0; protected: - qint64 _time; - QString _timeString; + qint64 _time; /**< UNIX timestamp */ + QString _timeString; /**< timestamp a formatted as string */ }; -/* -* Point -*/ +/***************************************************************************//** +* This is a leaf of the Composite Pattern +* This class is derived from IModelComponentTemporal2D. +* It includes 2D and time data. +* This interface can be visualized in the core application if the tracking data implements it. +* A circular point will be visualized with the radius of min(width,height) +* The position is the center of the point. +*******************************************************************************/ class IModelTrackedPoint : public IModelComponentTemporal2D { Q_OBJECT - //Q_PROPERTY(double _time READ getTime() WRITE setTime) public: /** @@ -207,9 +274,13 @@ class IModelTrackedPoint : public IModelComponentTemporal2D IModelTrackedPoint(QObject *parent = 0); }; -/** -* Polygon -*/ +/***************************************************************************//** +* This is a leaf of the Composite Pattern +* This class is derived from IModelComponentTemporal2D. +* It includes 2D and time data and a polygon. +* This interface can be visualized in the core application if the tracking data implements it. +* An irregular polygon defined by a list of polygons will be visualized. +*******************************************************************************/ class IModelTrackedPolygon : public IModelComponentTemporal2D { @@ -222,20 +293,24 @@ class IModelTrackedPolygon : public IModelComponentTemporal2D */ IModelTrackedPolygon(QObject *parent = 0); - // TODO: check if overlapping needed? - // List of QPolygons; first one is the outer Polygon the others are inner Polygons (holes) + /* + Getters, Setters & Checkers + */ virtual void setPolygon(QList polygons) = 0; - - // Get list of Polygons; first one is the outer Polygon the others are inner Polygons (holes) virtual QList getPolygon() = 0; - - // Check if list of Polygons exists; first one is the outer Polygon the others are inner Polygons (holes) virtual float hasPolygon() = 0; protected: - QList _polygon; + QList _polygon; /**< List of polygons, all will be drawn when vizualized */ }; +/***************************************************************************//** +* This is a leaf of the Composite Pattern +* This class is derived from IModelComponentTemporal2D. +* It includes 2D and time data. +* This interface can be visualized in the core application if the tracking data implements it. +* An ellipse will be visualized. The position is the center of the ellipse. +*******************************************************************************/ class IModelTrackedEllipse : public IModelTrackedPoint { Q_OBJECT @@ -248,6 +323,13 @@ class IModelTrackedEllipse : public IModelTrackedPoint }; +/***************************************************************************//** +* This is a leaf of the Composite Pattern +* This class is derived from IModelComponentTemporal2D. +* It includes 2D and time data. +* This interface can be visualized in the core application if the tracking data implements it. +* A rectangle will be visualized. The position is the center of the rectangle. +*******************************************************************************/ class IModelTrackedRectangle : public IModelTrackedPoint { Q_OBJECT From 368a89a8adbc24268283553b51110896b7158e81 Mon Sep 17 00:00:00 2001 From: Dmitry Nikitin <41901895+failure-to-thrive@users.noreply.github.com> Date: Sat, 4 Aug 2018 20:22:17 +0300 Subject: [PATCH 033/171] Treat any nameless command line argument as a video file --- BioTracker/CoreApp/BioTracker/util/CLIcommands.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/BioTracker/CoreApp/BioTracker/util/CLIcommands.h b/BioTracker/CoreApp/BioTracker/util/CLIcommands.h index 105874da..cb206943 100644 --- a/BioTracker/CoreApp/BioTracker/util/CLIcommands.h +++ b/BioTracker/CoreApp/BioTracker/util/CLIcommands.h @@ -41,6 +41,10 @@ class CLI { // ("display", value(), "display to use") // ; + // For "Open with ..." + positional_options_description unnamed; + unnamed.add("video", 1); + // Declare an options description instance which will include // all the options options_description all("Allowed options"); @@ -53,7 +57,7 @@ class CLI { variables_map vm; - store(parse_command_line(ac, av, all), vm); + store(command_line_parser(ac, av).options(all).positional(unnamed).run(), vm); if (vm.count("help")) { std::cout << visible; From 7c63ca5853f0643ba7257fb2e0b7df36feef027a Mon Sep 17 00:00:00 2001 From: Hauke Moenck Date: Thu, 23 Aug 2018 11:36:10 +0200 Subject: [PATCH 034/171] Various fixes: MemLeak in recording, better CMake, better gitignore Some code to batchify recording Signed-off-by: Hauke Moenck --- .gitignore | 69 +-------------- BioTracker/CMakeLists.txt | 35 ++------ BioTracker/CoreApp/BioTracker/CMakeLists.txt | 88 +++++-------------- .../Controller/ControllerDataExporter.cpp | 8 +- .../Controller/ControllerMainWindow.cpp | 13 +-- .../Controller/ControllerMainWindow.h | 2 +- .../Controller/ControllerPlayer.cpp | 7 +- .../BioTracker/Controller/ControllerPlayer.h | 4 +- .../Model/AreaDescriptor/AreaInfo.cpp | 14 ++- .../Model/AreaDescriptor/AreaMemory.cpp | 10 ++- .../Model/AreaDescriptor/AreaMemory.h | 2 +- .../Model/DataExporters/DataExporterCSV.cpp | 2 +- .../CoreApp/BioTracker/Model/ImageStream.cpp | 20 +++-- .../CoreApp/BioTracker/Model/ImageStream.h | 2 +- .../CoreApp/BioTracker/Model/MediaPlayer.cpp | 12 ++- .../CoreApp/BioTracker/Model/MediaPlayer.h | 4 +- .../MediaPlayerStateMachine.cpp | 14 +-- .../MediaPlayerStateMachine.h | 4 +- .../BioTracker/View/ComponentShape.cpp | 20 ++++- .../CoreApp/BioTracker/View/MainWindow.cpp | 17 +++- .../CoreApp/BioTracker/View/MainWindow.h | 2 + .../CoreApp/BioTracker/View/MainWindow.ui | 42 +++++---- .../CoreApp/BioTracker/util/VideoCoder.cpp | 3 +- .../BioTrackerInterfaces/CMakeLists.txt | 33 +++---- .../BackgroundSubtraction/CMakeLists.txt | 72 ++++----------- BioTracker/Plugin/LukasKanade/CMakeLists.txt | 73 ++++----------- .../CMakeCommon/CMakeVSSugar.txt | 15 ++++ .../Utils/BioTrackerUtils/CMakeLists.txt | 65 ++++---------- 28 files changed, 245 insertions(+), 407 deletions(-) create mode 100644 BioTracker/Utils/BioTrackerUtils/CMakeCommon/CMakeVSSugar.txt diff --git a/.gitignore b/.gitignore index a28a6d99..129cebfa 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,3 @@ -BioTracker/Plugin/BackgroundSubtraction/BackgroundSubtraction.tracker_autogen -BioTracker/Plugin/BackgroundSubtraction/BackgroundSubtraction.tracker.dir -BioTracker/Plugin/build-BioTrackerPlugin-Desktop-Debug/ -BioTracker/Interfaces/build-BioTrackerInterfaces-Desktop-Debug/ -BioTracker/CoreApp/build-BioTracker-Desktop-Debug/ -BioTracker/Utils/build-BioTrackerPlugin-Desktop-Debug/ GeneratedFiles/ CMakeLists.txt.user desktop.ini @@ -22,9 +16,7 @@ desktop.ini .gitignore.swp *.bak_* *.ini -BioTracker.apparmor -CMakeLists.txt.user.3.2-pre1 -manifest.json +*.json # ignore editor ~ files .tags* @@ -66,63 +58,8 @@ doxygen_sqlite3.db *.db *.opendb CMakeFiles +*.txt /BioTracker/*.vspx -/BioTracker/CoreApp/BioTracker/AcqBench.txt -/BioTracker/CoreApp/BioTracker/PrcBenchPost.txt -/BioTracker/CoreApp/BioTracker/PrcBenchPre.txt -/BioTracker/CoreApp/BioTracker/Background.png -/BioTracker/CoreApp/BioTracker/Biotracker_core.dir/Debug/Biotracker_core.vcxprojResolveAssemblyReference.cache -/BioTracker/CoreApp/BioTracker/Biotracker_core.dir/Release/Biotracker_core.vcxprojResolveAssemblyReference.cache -/BioTracker/Plugin/BioTrackerPlugin/Biotracker_plugin.dir/Release/Biotracker_plugin.vcxprojResolveAssemblyReference.cache -/BioTracker/CoreApp/BioTracker/Biotracker_core_autogen/include/ui_CameraDevice.h -/BioTracker/CoreApp/BioTracker/Biotracker_core_autogen/include/ui_MainWindow.h -/BioTracker/CoreApp/BioTracker/Biotracker_core_autogen/include/ui_VideoControllWidget.h -/BioTracker/Plugin/BioTrackerPlugin/Biotracker_plugin_autogen/include/ui_TrackerParameterView.h -/BioTracker/Plugin/BioTrackerPlugin/Biotracker_plugin.dir/Debug/*.cache -/BioTracker/CoreApp/BioTracker/BioTracker.pro.user.b485f2d -/BioTracker/Plugin/BioTrackerPlugin/BioTrackerPlugin.pro.user.b485f2d -/BioTracker/CoreApp/BioTracker/BioTracker.pro.user.b485f2d -/BioTracker/Plugin/BioTrackerPlugin/BioTrackerPlugin.pro.user.b485f2d -/BioTracker/x64/Debug/ALL_BUILD/*.cache -/BioTracker/x64/Release/ALL_BUILD/*.cache -/BioTracker/CoreApp/BioTracker/TrackingOutput.txt -/BioTracker/CoreApp/BioTracker/ui_CameraDevice.h -/BioTracker/CoreApp/BioTracker/ui_MainWindow.h -/BioTracker/CoreApp/BioTracker/ui_VideoControllWidget.h -/BioTracker/Plugin/BioTrackerPlugin/ui_TrackerParameterView.h -/BioTracker/Utils/build-BioTrackerUtils-Desktop-Debug/*.o -/BioTracker/CoreApp/BioTracker/BlobtrackerConfig.ini -/BioTracker/CoreApp/BioTracker/test.txt -/BioTracker/CoreApp/BioTracker/test2.txt -/BioTracker/CoreApp/BioTracker/Release/*.ini -/BioTracker/CoreApp/BioTracker/Release/TrackingOutput.txt -/BioTracker/CoreApp/BioTracker/debug/BlobtrackerConfig.ini -/BioTracker/CoreApp/BioTracker/debug/TrackingOutput.txt -/BioTracker/CoreApp/BioTracker/BiotrackerCore.ini -/BioTracker/Plugin/Sample/Sample.tracker.dir/Release/*.cache -/BioTracker/CoreApp/BioTracker/Biotracker_core_autogen/include/ui_SettingsWindow.h -/BioTracker/CoreApp/BioTracker/Release.zip -/BioTracker/CoreApp/BioTracker/debug/placeholder -/BioTracker/CoreApp/BioTracker/ui_SettingsWindow.h -/BioTracker/CoreApp/BioTracker/Tracks -/BioTracker/CoreApp/BioTracker/BSTrackerConfig.ini -/BioTracker/CoreApp/BioTracker/Biotracker_core_autogen/EWIEGA46WW/qrc_guiresources.cpp -/BioTracker/Plugin/Sample/x64/Debug/Sample.tracker_autogen/*.cache *.cache *.csv -/BioTracker/CoreApp/BioTracker/Biotracker_core_autogen/mocs_compilation.cpp -/BioTracker/Interfaces/BioTrackerInterfaces/Biotracker_interfaces_autogen/mocs_compilation.cpp -/BioTracker/Plugin/Sample/Sample.tracker_autogen/include/ui_TrackerParameterView.h -/BioTracker/Plugin/Sample/Sample.tracker_autogen/mocs_compilation.cpp -/BioTracker/Utils/BioTrackerUtils/Biotracker_utility_autogen/mocs_compilation.cpp -/BioTracker/Plugin/FlyHeart -/home/jonas/git/biotracker_core/BiotrackerCore.ini -/home/jonas/git/biotracker_core/BSTrackerConfig.ini -/home/jonas/git/biotracker_core/.vscode -.vscode/settings.json -.vscode/tasks.json -.vscode/launch.json -.vscode/c_cpp_properties.json -.vscode/c_cpp_properties.json -.vscode/c_cpp_properties.json -Screenshots/ScreenshotThu_Feb_22_17_41_24_2018.png +build diff --git a/BioTracker/CMakeLists.txt b/BioTracker/CMakeLists.txt index bf670b4d..6f8c5806 100644 --- a/BioTracker/CMakeLists.txt +++ b/BioTracker/CMakeLists.txt @@ -1,35 +1,21 @@ -cmake_minimum_required(VERSION 2.6) +cmake_minimum_required(VERSION 3.0) #(Minimal benötigte CMake-Version wenn z.B. bestimmte CMake-Kommandos benutzt werden) -cmake_policy (SET CMP0020 NEW) +cmake_policy(SET CMP0020 NEW) +cmake_policy(SET CMP0054 NEW) # Der Projektname project(Biotracker) -set(CMAKE_CXX_FLAGS "-std=c++11" CACHE STRING "compile flags" FORCE) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) -set(CMAKE_INCLUDE_CURRENT_DIR ON) - -#Building for x64 -IF(CMAKE_CL_64) - find_package(Qt5 REQUIRED Core Gui Xml Network Widgets OpenGL Multimedia MultimediaWidgets PATHS $ENV{QT_DIR_CMAKE64}) - find_package(OpenCV REQUIRED PATHS $ENV{CV_DIR_CMAKE64}) - set (QT_DIR_CMAKE $ENV{QT_DIR_CMAKE64}) -ELSE() -#Building for x86 - find_package(Qt5 REQUIRED Core Gui Xml Network Widgets OpenGL Multimedia MultimediaWidgets PATHS $ENV{QT_DIR_CMAKE32}) - find_package(OpenCV REQUIRED PATHS $ENV{CV_DIR_CMAKE32}) - set (QT_DIR_CMAKE $ENV{QT_DIR_CMAKE32}) -ENDIF() +find_package(Qt5 REQUIRED Core Gui Xml Network Widgets OpenGL Multimedia MultimediaWidgets) +find_package(OpenCV REQUIRED) +set (QT_DIR_CMAKE $ENV{QT_DIR}) set(HMNVLibDir "Not Found" CACHE FILEPATH "") -IF("${HMNVLibDir}" MATCHES "Not Found") -ELSE() - add_definitions(-DWITH_CUDA) -ENDif() if(CMAKE_SYSTEM MATCHES "Windows") set(Boost_USE_STATIC_LIBS ON) @@ -37,15 +23,10 @@ if(CMAKE_SYSTEM MATCHES "Windows") endif() find_package(Boost REQUIRED system filesystem chrono thread timer program_options) - -exec_program( - "git" - ${CMAKE_CURRENT_SOURCE_DIR} - ARGS "log --pretty=format:%h -n 1" - OUTPUT_VARIABLE VERSION ) +exec_program("git" ${CMAKE_CURRENT_SOURCE_DIR} ARGS "log --pretty=format:%h -n 1" OUTPUT_VARIABLE VERSION ) add_definitions( -DGIT_HASH="${VERSION}" ) message(STATUS "Configured git hash=${VERSION}") -message(STATUS "Configured QT version=${Qt5Core_VERSION}") +message(STATUS "Configured CV version=${OpenCV_VERSION}") message(STATUS "Configured QT version=${Qt5Core_VERSION}") add_definitions( -DMyQT_VERSION="${Qt5Core_VERSION}" ) add_definitions( -DMyCV_VERSION="${OpenCV_VERSION}" ) diff --git a/BioTracker/CoreApp/BioTracker/CMakeLists.txt b/BioTracker/CoreApp/BioTracker/CMakeLists.txt index 3d3b0257..17fdb7da 100644 --- a/BioTracker/CoreApp/BioTracker/CMakeLists.txt +++ b/BioTracker/CoreApp/BioTracker/CMakeLists.txt @@ -2,77 +2,29 @@ #### Biotracker: Core ############################################################## -set(INCLUDE_DIRS - ${INCLUDE_DIRS} - ${CMAKE_SOURCE_DIR}/Interfaces/BioTrackerInterfaces/ - ${CMAKE_SOURCE_DIR}/Utils/BioTrackerUtils - ${CMAKE_SOURCE_DIR}/CoreApp/BioTracker/ - ${PROJECT_BINARY_DIR}/CoreApp/BioTracker/ - ${CMAKE_CURRENT_BINARY_DIR} - ${Boost_INCLUDE_DIRS} - ${OpenCV_INCLUDE_DIRS} - ${Qt5Core_INCLUDE_DIRS} - ${Qt5Gui_INCLUDE_DIRS} - ${Qt5Xml_INCLUDE_DIRS} - ${Qt5Network_INCLUDE_DIRS} - ${Qt5Widgets_INCLUDE_DIRS} - ${Qt5Multimedia_INCLUDE_DIRS} - ${Qt5MultimediaWidgets_INCLUDE_DIRS} - ${CMAKE_CURRENT_SOURCE_DIR} - ${HMNVLibDir}/inc/ - ) - -set(QTLIBS - Qt5::Core - Qt5::Gui - Qt5::Xml - Qt5::Network - Qt5::Widgets - Qt5::Multimedia - Qt5::MultimediaWidgets - Qt5::OpenGL - ) -set(LIBS - Biotracker_interfaces - Biotracker_utility - ${OpenCV_LIBRARIES} - ${Boost_LIBRARIES} - ${QTLIBS} - ) - -IF("${HMNVLibDir}" MATCHES "Not Found") -ELSE() -set(LIBS - ${LIBS} - ${HMNVLibDir}/lib/NvEncInterace.lib) -ENDIF() +list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/cmake) -# Visual studio out-of-source friendly source groups -set(_plugin_src_root_path ${CMAKE_CURRENT_SOURCE_DIR}) -file( - GLOB_RECURSE _plugin_source_list - LIST_DIRECTORIES false - "${_plugin_src_root_path}/*.c*" - "${_plugin_src_root_path}/*.h*" - "${_plugin_src_root_path}/*.ui*" -) -foreach(_plugin_source IN ITEMS ${_plugin_source_list}) - get_filename_component(_plugin_source_path "${_plugin_source}" PATH) - file(RELATIVE_PATH _plugin_source_path_rel "${_plugin_src_root_path}" "${_plugin_source_path}") - string(REPLACE "/" "\\" _plugin_group_path "${_plugin_source_path_rel}") - source_group("${_plugin_group_path}" FILES "${_plugin_source}") -endforeach() -set(CMAKE_INCLUDE_CURRENT_DIR OFF) - -include_directories(${INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR}) +# Visual studio out-of-source friendly source groups +include(${util_cmakes}CMakeVSSugar.txt) message("Configuring Biotracker_core..." ) set(EXE_NAME Biotracker_core) -add_executable(${EXE_NAME} ${_plugin_source_list} guiresources.qrc) -target_link_libraries(${EXE_NAME} ${LIBS}) -add_dependencies(${EXE_NAME} Biotracker_interfaces Biotracker_utility) - -# Make this target the default target for a MSVC solution. -set_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT ${EXE_NAME}) +add_executable(${EXE_NAME} ${_util_source_list} guiresources.qrc) +include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${Boost_INCLUDE_DIRS}) +target_link_libraries (${EXE_NAME} Qt5::Core Qt5::Gui Qt5::Xml Qt5::Network Qt5::Widgets) +target_link_libraries (${EXE_NAME} Qt5::Multimedia Qt5::MultimediaWidgets Qt5::OpenGL ) +target_link_libraries(${EXE_NAME} Biotracker_interfaces Biotracker_utility) +target_link_libraries(${EXE_NAME} ${OpenCV_LIBRARIES} ${Boost_LIBRARIES}) +IF("${HMNVLibDir}" MATCHES "Not Found") +ELSE() + target_link_libraries(${EXE_NAME} ${HMNVLibDir}/lib/NvEncInterace.lib) + target_compile_definitions(${EXE_NAME} PRIVATE WITH_CUDA=1) +ENDIF() +set_target_properties(${EXE_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON) +set_target_properties(${EXE_NAME} PROPERTIES + CXX_STANDARD 17 + CXX_STANDARD_REQUIRED YES + CXX_EXTENSIONS NO +) \ No newline at end of file diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.cpp b/BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.cpp index 47c1ef7e..528585ce 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.cpp +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.cpp @@ -1,6 +1,7 @@ #include "ControllerDataExporter.h" #include "Controller/ControllerCommands.h" #include "Controller/ControllerTrackedComponentCore.h" +#include "Controller/ControllerPlayer.h" #include "Model/DataExporters/DataExporterCSV.h" #include "Model/DataExporters/DataExporterSerialize.h" #include "Model/DataExporters/DataExporterJson.h" @@ -31,11 +32,14 @@ void ControllerDataExporter::connectControllerToController() { QObject::connect(this, &ControllerDataExporter::emitResetUndoStack, ctrcmd, &ControllerCommands::receiveClear, Qt::DirectConnection); //connect to view controller - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE - ); + IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); ControllerTrackedComponentCore *tccController = dynamic_cast(ctr); QObject::connect(this, &ControllerDataExporter::emitViewUpdate, tccController, &ControllerTrackedComponentCore::receiveUpdateView, Qt::DirectConnection); + + + ControllerPlayer* cPl = dynamic_cast(m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::PLAYER)); + QObject::connect(cPl, &ControllerPlayer::emitNextMediaInBatch, this, &ControllerDataExporter::receiveReset, Qt::DirectConnection); } void ControllerDataExporter::createModel() { diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerMainWindow.cpp b/BioTracker/CoreApp/BioTracker/Controller/ControllerMainWindow.cpp index 2a7fd785..6993944e 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerMainWindow.cpp +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerMainWindow.cpp @@ -25,12 +25,12 @@ ControllerMainWindow::ControllerMainWindow(QObject* parent, IBioTrackerContext* } -void ControllerMainWindow::loadVideo(QString str) { +void ControllerMainWindow::loadVideo(std::vector files) { - Q_EMIT emitOnLoadMedia(str.toStdString()); + Q_EMIT emitOnLoadMedia(files.front().string()); IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::PLAYER); - qobject_cast(ctr)->loadVideoStream(str); - Q_EMIT emitMediaLoaded(str.toStdString()); + qobject_cast(ctr)->loadVideoStream(files); + Q_EMIT emitMediaLoaded(files.front().string()); dynamic_cast(m_View)->checkMediaGroupBox(); } @@ -201,8 +201,9 @@ void ControllerMainWindow::connectControllerToController() { // BioTracker::Core::Settings *set = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); std::string *video = (std::string*)(set->readValue("video")); - if (video) - loadVideo(video->c_str()); + if (video) + loadVideo({ video->c_str() }); + } void ControllerMainWindow::receiveCursorPosition(QPoint pos) diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerMainWindow.h b/BioTracker/CoreApp/BioTracker/Controller/ControllerMainWindow.h index beb18155..75529e20 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerMainWindow.h +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerMainWindow.h @@ -28,7 +28,7 @@ class ControllerMainWindow : public IController { /** * Receives the a string containing the video file path from the MainWindow class. The string is then given to the ControllerPlayer class of the MediaPlayer-Component. */ - void loadVideo(QString str); + void loadVideo(std::vector files); /** * Receives the a string containing the Plugin file path from the MainWindow class. The string is then given to the BioTrackerContext class which will hand it over to the ControllerPlugin class. */ diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerPlayer.cpp b/BioTracker/CoreApp/BioTracker/Controller/ControllerPlayer.cpp index f384093c..35b0d3a7 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerPlayer.cpp +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerPlayer.cpp @@ -18,8 +18,8 @@ ControllerPlayer::~ControllerPlayer() { } -void ControllerPlayer::loadVideoStream(QString str) { - qobject_cast(m_Model)->loadVideoStream(str); +void ControllerPlayer::loadVideoStream(std::vector files) { + qobject_cast(m_Model)->loadVideoStream(files); emitPauseState(true); } @@ -136,7 +136,8 @@ void ControllerPlayer::connectModelToController() { QObject::connect(qobject_cast(m_Model), &MediaPlayer::trackCurrentImage, this, &ControllerPlayer::receiveImageToTracker); QObject::connect(this, &ControllerPlayer::emitPauseState, qobject_cast(m_Model), &MediaPlayer::rcvPauseState); QObject::connect(qobject_cast(m_Model), &MediaPlayer::signalVisualizeCurrentModel, this, &ControllerPlayer::receiveVisualizeCurrentModel); - QObject::connect(qobject_cast(m_Model), &MediaPlayer::signalCurrentFrameNumberToPlugin, this, &ControllerPlayer::receiveCurrentFrameNumberToPlugin); + QObject::connect(qobject_cast(m_Model), &MediaPlayer::signalCurrentFrameNumberToPlugin, this, &ControllerPlayer::receiveCurrentFrameNumberToPlugin); + QObject::connect(qobject_cast(m_Model), &MediaPlayer::emitNextMediaInBatch, this, &ControllerPlayer::emitNextMediaInBatch); } diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerPlayer.h b/BioTracker/CoreApp/BioTracker/Controller/ControllerPlayer.h index 9fb79c88..18867fe3 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerPlayer.h +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerPlayer.h @@ -24,7 +24,7 @@ class ControllerPlayer : public IController { /** * Hands over the file path of a video to the IModel class MediaPlayer. */ - void loadVideoStream(QString str); + void loadVideoStream(std::vector files); /** * Hands over the file path of pictures to the IModel class MediaPlayer. */ @@ -90,7 +90,7 @@ class ControllerPlayer : public IController { signals: void emitPauseState(bool state); void signalCurrentFrameNumberToPlugin(uint frameNumber); - + void emitNextMediaInBatch(); public Q_SLOTS: /** diff --git a/BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/AreaInfo.cpp b/BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/AreaInfo.cpp index 8395956a..3b13cbe1 100644 --- a/BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/AreaInfo.cpp +++ b/BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/AreaInfo.cpp @@ -54,14 +54,14 @@ void AreaInfo::reset(int w, int h) { { std::vector pts = toQPointVector(vertices[0]); std::vector pts2 = toQPointVector(vertices[1]); - _apperture->setVertices(QVecToCvVec(pts)); - _rect->setVertices(QVecToCvVec(pts2)); + _apperture->setVertices(QVecToCvVec(pts2)); + _rect->setVertices(QVecToCvVec(pts)); } } void AreaInfo::loadAreas() { - QVector pair = getVertices(_parms ? _parms->m_CurrentFilename : ""); + QVector pair = getVertices(_parms ? _parms->m_CurrentFilename : "", true); if (pair[1] == QString(DEFAULT_RECT)) { if (_parms) { @@ -118,7 +118,13 @@ void AreaInfo::updateRectification() { QVector{ cvPointsToString(_rect->getVertices()).c_str(), cvPointsToString(_apperture->getVertices()).c_str(), - QString(myType()), QString(vertices[3])}); //TODO + QString(myType()), QString(vertices[3]) }); + + setVertices("Last", + QVector{ + cvPointsToString(_rect->getVertices()).c_str(), + cvPointsToString(_apperture->getVertices()).c_str(), + QString(myType()), QString(vertices[3]) }); } } else { diff --git a/BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/AreaMemory.cpp b/BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/AreaMemory.cpp index d4f9aa3f..48df3267 100644 --- a/BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/AreaMemory.cpp +++ b/BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/AreaMemory.cpp @@ -16,7 +16,7 @@ namespace AreaMemory{ QMap> map; - QVector getVertices(QString file) { + QVector getVertices(QString file, bool useLast) { if (map.size() == 0) { std::ifstream o; o.open(CFG_AREA_DEFINITIONS, std::ifstream::in); @@ -40,8 +40,12 @@ namespace AreaMemory{ std::string f = file.toStdString(); if (map.contains(file)) return map.value(file); - else - return DEFAULT_PAIR; + else { + if (useLast && map.contains("Last")) { + return map.value("Last"); + }else + return DEFAULT_PAIR; + } } void setVertices(QString file, QVector values) { diff --git a/BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/AreaMemory.h b/BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/AreaMemory.h index 9ed1d73d..8e791132 100644 --- a/BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/AreaMemory.h +++ b/BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/AreaMemory.h @@ -11,7 +11,7 @@ namespace AreaMemory #define DEFAULT_AREA "10,10;10,100;100,100;100,10" #define DEFAULT_PAIR QVector{DEFAULT_AREA, DEFAULT_RECT, "0", "0"} - QVector getVertices(QString file); + QVector getVertices(QString file, bool useLast = false); void setVertices(QString file, QVector values); std::vector toQPointVector(QString vertices); }; diff --git a/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterCSV.cpp b/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterCSV.cpp index 061a2511..86c20911 100644 --- a/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterCSV.cpp +++ b/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterCSV.cpp @@ -226,7 +226,7 @@ void DataExporterCSV::writeAll(std::string f) { int max = getMaxLinecount(); //There is nothing to write - if (max <= 1) + if (max <= 0) { cleanup(); return; diff --git a/BioTracker/CoreApp/BioTracker/Model/ImageStream.cpp b/BioTracker/CoreApp/BioTracker/Model/ImageStream.cpp index bad616b5..a6bee67e 100644 --- a/BioTracker/CoreApp/BioTracker/Model/ImageStream.cpp +++ b/BioTracker/CoreApp/BioTracker/Model/ImageStream.cpp @@ -246,18 +246,22 @@ namespace BioTracker { * @brief ImageStreamVideo * @param filename path to the file */ - explicit ImageStream3Video(const boost::filesystem::path &filename) - : m_capture(filename.string()) + explicit ImageStream3Video(const std::vector &files) + : m_capture(files.front().string()) , m_num_frames(static_cast(m_capture.get(CV_CAP_PROP_FRAME_COUNT))) , m_fps(m_capture.get(CV_CAP_PROP_FPS)) - , m_fileName(filename.string()) { - if (!boost::filesystem::exists(filename)) { - throw file_not_found("Could not find file " + filename.string()); + , m_fileName(files.front().string()) { + + if (!boost::filesystem::exists(files.front())) { + throw file_not_found("Could not find file " + files.front().string()); } if (!m_capture.isOpened()) { throw video_open_error(":("); } + m_batch = files; + m_batch.erase(m_batch.begin(), m_batch.begin()+1); + //Grab the fps from config file BioTracker::Core::Settings *set = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); double fps = set->getValueOrDefault(CFG_RECORD_FPS, CFG_RECORD_FPS_VAL); @@ -325,6 +329,7 @@ namespace BioTracker { const size_t m_num_frames; const std::string m_fileName; std::shared_ptr vCoder; + std::vector m_batch; double m_fps; double m_w; double m_h; @@ -449,10 +454,9 @@ namespace BioTracker { return std::make_shared(std::move(filenames)); } - std::shared_ptr make_ImageStream3Video(const boost::filesystem::path - &filename) { + std::shared_ptr make_ImageStream3Video(const std::vector &files) { try { - return std::make_shared(filename); + return std::make_shared(files); } catch (const video_open_error &) { return make_ImageStream3NoMedia(); diff --git a/BioTracker/CoreApp/BioTracker/Model/ImageStream.h b/BioTracker/CoreApp/BioTracker/Model/ImageStream.h index 7063a317..1d40cea0 100644 --- a/BioTracker/CoreApp/BioTracker/Model/ImageStream.h +++ b/BioTracker/CoreApp/BioTracker/Model/ImageStream.h @@ -165,7 +165,7 @@ std::shared_ptr make_ImageStream3NoMedia(); std::shared_ptr make_ImageStream3Pictures( std::vector filenames); -std::shared_ptr make_ImageStream3Video(const boost::filesystem::path +std::shared_ptr make_ImageStream3Video(const std::vector &filename); std::shared_ptr make_ImageStream3Camera(CameraConfiguration conf); diff --git a/BioTracker/CoreApp/BioTracker/Model/MediaPlayer.cpp b/BioTracker/CoreApp/BioTracker/Model/MediaPlayer.cpp index 1cb82e4a..a0e22711 100644 --- a/BioTracker/CoreApp/BioTracker/Model/MediaPlayer.cpp +++ b/BioTracker/CoreApp/BioTracker/Model/MediaPlayer.cpp @@ -49,7 +49,7 @@ MediaPlayer::MediaPlayer(QObject* parent) : QObject::connect(this, &MediaPlayer::toggleRecordImageStreamCommand, m_Player, &MediaPlayerStateMachine::receivetoggleRecordImageStream); - // Handel PlayerStateMachine results + // Handle PlayerStateMachine results QObject::connect(m_Player, &MediaPlayerStateMachine::emitPlayerParameters, this, &MediaPlayer::receivePlayerParameters, Qt::BlockingQueuedConnection); QObject::connect(m_Player, &MediaPlayerStateMachine::emitPlayerParameters, this, &MediaPlayer::fwdPlayerParameters); @@ -57,6 +57,9 @@ MediaPlayer::MediaPlayer(QObject* parent) : QObject::connect(m_Player, &MediaPlayerStateMachine::emitPlayerOperationDone, this, &MediaPlayer::receivePlayerOperationDone); QObject::connect(this, &MediaPlayer::runPlayerOperation, m_Player, &MediaPlayerStateMachine::receiveRunPlayerOperation); + //Handle progressing in batch + QObject::connect(m_Player, &MediaPlayerStateMachine::emitNextMediaInBatch, this, &MediaPlayer::emitNextMediaInBatch); + // Move the PlayerStateMachine to the Thread m_Player->moveToThread(m_PlayerThread); @@ -191,7 +194,7 @@ void MediaPlayer::takeScreenshot(GraphicsView *gv) { //TODO duplicated code QRectF rscene = gv->sceneRect(); //0us QRectF rview = gv->rect(); //0us - QPixmap *pix; + QPixmap *pix = nullptr; if (!m_recordScaled) pix = new QPixmap(rscene.size().toSize()); //17us else @@ -207,6 +210,9 @@ void MediaPlayer::takeScreenshot(GraphicsView *gv) { QImage image = pix->toImage(); //8724us image.save(getTimeAndDate(CFG_DIR_SCREENSHOTS+std::string("/Screenshot"), ".png").c_str()); + + if (paint != nullptr) delete paint; + if (pix != nullptr) delete pix; } void MediaPlayer::receiveTrackingPaused() { @@ -267,6 +273,8 @@ void MediaPlayer::receivePlayerParameters(playerParameters* param) { cv::cvtColor(*mat, *mat, CV_BGR2RGB); m_videoc->add(mat,1); + if (paint != nullptr) delete paint; + if (pix != nullptr) delete pix; } Q_EMIT notifyView(); diff --git a/BioTracker/CoreApp/BioTracker/Model/MediaPlayer.h b/BioTracker/CoreApp/BioTracker/Model/MediaPlayer.h index ccb6e180..cc2f1396 100644 --- a/BioTracker/CoreApp/BioTracker/Model/MediaPlayer.h +++ b/BioTracker/CoreApp/BioTracker/Model/MediaPlayer.h @@ -36,7 +36,7 @@ class MediaPlayer : public IModel { /** * Emit the path to a video stream. This signal will be received by the MediaPlayerStateMachine which runns in a separate Thread. */ - void loadVideoStream(QString str); + void loadVideoStream(std::vector files); /** * Emit the path to pictures. This signal will be received by the MediaPlayerStateMachine which runns in a separate Thread. */ @@ -95,6 +95,8 @@ class MediaPlayer : public IModel { void fwdPlayerParameters(playerParameters* parameters); + void emitNextMediaInBatch(); + public: void setTrackingActive(); void setTrackingDeactive(); diff --git a/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.cpp b/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.cpp index fc102aea..c9442785 100644 --- a/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.cpp +++ b/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.cpp @@ -29,26 +29,28 @@ MediaPlayerStateMachine::MediaPlayerStateMachine(QObject* parent) : setNextState(IPlayerState::PLAYER_STATES::STATE_INITIAL); } +int x = 0; void MediaPlayerStateMachine::receiveRunPlayerOperation() { if (m_NextPlayerState != m_States.value(IPlayerState::PLAYER_STATES::STATE_WAIT)) { m_CurrentPlayerState = m_NextPlayerState; + x++; + if (x % 100 == 0) { + emitNextMediaInBatch(); + } + m_CurrentPlayerState->operate(); updatePlayerParameter(); emitSignals(); - } } -void MediaPlayerStateMachine::receiveLoadVideoCommand(QString fileDir) { - std::string filenameStr = fileDir.toStdString(); - - boost::filesystem::path filename{ filenameStr }; +void MediaPlayerStateMachine::receiveLoadVideoCommand(std::vector files) { - m_stream = BioTracker::Core::make_ImageStream3Video(filename); + m_stream = BioTracker::Core::make_ImageStream3Video(files); m_PlayerParameters->m_TotalNumbFrames = m_stream->numFrames(); diff --git a/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h b/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h index eb039df5..c9cb7462 100644 --- a/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h +++ b/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h @@ -51,7 +51,7 @@ class MediaPlayerStateMachine : public IModel { */ void receiveRunPlayerOperation(); - void receiveLoadVideoCommand(QString fileDir); + void receiveLoadVideoCommand(std::vector files); void receiveLoadPictures(std::vector files); void receiveLoadCameraDevice(CameraConfiguration conf); @@ -76,6 +76,8 @@ class MediaPlayerStateMachine : public IModel { */ void emitPlayerOperationDone(); + void emitNextMediaInBatch(); + private: void updatePlayerParameter(); void emitSignals(); diff --git a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp index afbc6d9d..d7dcc544 100644 --- a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp +++ b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp @@ -179,7 +179,19 @@ void ComponentShape::paint(QPainter * painter, const QStyleOptionGraphicsItem * // draw id in center if (m_showId){ - painter->drawText(this->boundingRect(), Qt::AlignCenter, QString::number(m_id)); + QFont font = painter->font(); + + /* twice the size than the current font size */ + font.setPointSize(font.pointSize() * 2); + + /* set the modified font to the painter */ + painter->setFont(font); + QPen penHText(QColor("#000000"));//Here lines are also drawn using this color + painter->setPen(penHText); + QRectF r = this->boundingRect(); + r.setWidth(100); + r.moveLeft(10); + painter->drawText(r, Qt::AlignCenter, "Tabeetha");// QString::number(m_id) } } @@ -336,7 +348,7 @@ void ComponentShape::trace() return; } - QPointF lastPointDifference = QPointF(0, 0) + QPointF(m_h / 2, m_w / 2); + QPointF lastPointDifference = QPointF(0, 0);// +QPointF(m_h / 2, m_w / 2); for (int i = 1; i <= m_tracingLength && i <= m_currentFramenumber; i += m_tracingSteps) { @@ -346,7 +358,8 @@ void ComponentShape::trace() //positioning QPointF historyPoint = QPointF(historyChild->getXpx(), historyChild->getYpx()); QPointF historyPointDifference = historyPoint - currentPoint; - QPointF adjustedHistoryPointDifference = historyPointDifference + QPointF(m_w / 2, m_h / 2); + //MARKER + QPointF adjustedHistoryPointDifference = historyPointDifference;// +QPointF(m_w / 2, m_h / 2); //time degradation colors QPen timeDegradationPen = QPen(m_penColor, m_penWidth, m_penStyle); @@ -390,6 +403,7 @@ void ComponentShape::trace() //PATH else if (m_tracingStyle == "Path") { + QColor timeDegradationBrushColor = QColor(0,255, 0, (200.0f - (200.0f / (float)m_tracingLength) * i) + 30); QLineF base = QLineF(lastPointDifference, adjustedHistoryPointDifference); QGraphicsLineItem* lineItem = new QGraphicsLineItem(base, m_tracingLayer); diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp index bf4cd7be..7a4b046d 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp @@ -397,7 +397,22 @@ void MainWindow::on_actionOpen_Video_triggered() { "Open video", "", videoFilter, 0); if (!filename.isEmpty()) { - dynamic_cast (getController())->loadVideo(filename); + dynamic_cast (getController())->loadVideo({ filename.toStdString().c_str()}); + } +} + +void MainWindow::on_actionOpen_Video_batch_triggered() { + static const QString videoFilter("Video files (*.avi *.wmv *.mp4 *.mkv *.mov)"); + + std::vector files; + + for (QString const& path : QFileDialog::getOpenFileNames(this, + "Open image files", "", videoFilter, 0)) { + files.push_back(boost::filesystem::path(path.toStdString())); + } + + if (!files.empty()) { + qobject_cast (getController())->loadVideo(files); } } diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.h b/BioTracker/CoreApp/BioTracker/View/MainWindow.h index 28bb1774..e74e131c 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.h +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.h @@ -63,6 +63,8 @@ class MainWindow : public IViewMainWindow { private Q_SLOTS: //menu->File void on_actionOpen_Video_triggered(); + + void on_actionOpen_Video_batch_triggered(); void on_actionLoad_Tracker_triggered(); diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.ui b/BioTracker/CoreApp/BioTracker/View/MainWindow.ui index 010819e6..274aceda 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.ui +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.ui @@ -425,8 +425,8 @@ 0 0 - 565 - 294 + 494 + 304 @@ -521,8 +521,8 @@ 0 0 - 565 - 294 + 98 + 87 @@ -578,19 +578,19 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Ubuntu'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">The BioTracker is a modular tracking software consisting of a core management framework and various trackers which you can 'plug in'. You can track on videos, picture and camera streams.</p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> -<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:large; font-weight:600;">Basic steps</span></p> -<ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Load a medium (video, picture or camera stream) </li> -<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Load a tracker (usually trackers are preloaded from the 'Plugins' directory) </li> -<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the desired tracker options </li> -<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Insert the objects to track if the tracker does not generate them automatically</li> -<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can manage the tracking and trials in the experiment tab</li> -<li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Start tracking!</li></ol> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:0px;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">More information on how to use the BioTracker can be found in the <a href="https://github.com/BioroboticsLab/biotracker_core/wiki"><span style=" text-decoration: underline; color:#0000ff;">user guide</span></a>.</p></body></html> +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:8.25pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:9pt;">The BioTracker is a modular tracking software consisting of a core management framework and various trackers which you can 'plug in'. You can track on videos, picture and camera streams.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Ubuntu'; font-size:9pt;"><br /></p> +<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:9pt; font-weight:600;">Basic steps</span></p> +<ol style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Load a medium (video, picture or camera stream) </li> +<li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Load a tracker (usually trackers are preloaded from the 'Plugins' directory) </li> +<li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the desired tracker options </li> +<li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Insert the objects to track if the tracker does not generate them automatically</li> +<li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can manage the tracking and trials in the experiment tab</li> +<li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Start tracking!</li></ol> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:0px; font-family:'Ubuntu'; font-size:9pt;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:9pt;"> </span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:9pt;">More information on how to use the BioTracker can be found in the </span><a href="https://github.com/BioroboticsLab/biotracker_core/wiki"><span style=" font-family:'Ubuntu'; font-size:9pt; text-decoration: underline; color:#0000ff;">user guide</span></a><span style=" font-family:'Ubuntu'; font-size:9pt;">.</span></p></body></html> true @@ -651,7 +651,7 @@ p, li { white-space: pre-wrap; } 0 0 845 - 18 + 21 @@ -659,6 +659,7 @@ p, li { white-space: pre-wrap; } &File + @@ -1238,6 +1239,11 @@ QToolButton { User guide + + + Open Video Batch... + + diff --git a/BioTracker/CoreApp/BioTracker/util/VideoCoder.cpp b/BioTracker/CoreApp/BioTracker/util/VideoCoder.cpp index ccfde785..29caf9d8 100644 --- a/BioTracker/CoreApp/BioTracker/util/VideoCoder.cpp +++ b/BioTracker/CoreApp/BioTracker/util/VideoCoder.cpp @@ -178,9 +178,10 @@ int VideoCoder::toggle(int w, int h, double fps) { //Check which one to use if (codecStr == "X264") { - int codec = CV_FOURCC('X', '2', '6', '4'); + int codec = CV_FOURCC('X', 'V', 'I', 'D'); vWriter = std::make_shared(getTimeAndDate(std::string(CFG_DIR_VIDEOS)+"CameraCapture", ".avi"), codec, fps, CvSize(w, h), 1); m_recording = vWriter->isOpened(); + vWriter->set(cv::VIDEOWRITER_PROP_QUALITY, 100); std::cout << "Video is open:" << m_recording << std::endl; m_recType = 2; int ok = start(); diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/CMakeLists.txt b/BioTracker/Interfaces/BioTrackerInterfaces/CMakeLists.txt index 207759f4..9b516426 100644 --- a/BioTracker/Interfaces/BioTrackerInterfaces/CMakeLists.txt +++ b/BioTracker/Interfaces/BioTrackerInterfaces/CMakeLists.txt @@ -1,10 +1,10 @@ ############################################################## #### Biotracker: Interfaces ############################################################## - + set(INCLUDE_DIRS ${INCLUDE_DIRS} - ${OpenCV_INCLUDE_DIRS} + ${OpenCV_INCLUDE_DIRS} ${Qt5Core_INCLUDE_DIRS} ${Qt5Gui_INCLUDE_DIRS} ${Qt5Xml_INCLUDE_DIRS} @@ -12,18 +12,6 @@ set(INCLUDE_DIRS ${Qt5Widgets_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR} ) - -set(QTLIBS - Qt5::Core - Qt5::Gui - Qt5::Xml - Qt5::Network - Qt5::Widgets - ) -set(LIBS - ${OpenCV_LIBRARIES} - ${QTLIBS} - ) # Visual studio out-of-source friendly source groups set(_plugin_src_root_path ${CMAKE_CURRENT_SOURCE_DIR}) @@ -41,14 +29,17 @@ foreach(_plugin_source IN ITEMS ${_plugin_source_list}) source_group("${_plugin_group_path}" FILES "${_plugin_source}") endforeach() -set(CMAKE_INCLUDE_CURRENT_DIR OFF) - -include_directories(${INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR}) - message("Configuring Biotracker_interfaces...") set(EXE_NAME Biotracker_interfaces) add_library(${EXE_NAME} STATIC ${_plugin_source_list} ) -target_link_libraries(${EXE_NAME} ${LIBS}) - - +target_include_directories(${EXE_NAME} PUBLIC ${INCLUDE_DIRS}) +target_link_libraries(${EXE_NAME} ${OpenCV_LIBRARIES}) +target_link_libraries(${EXE_NAME} Qt5::Core Qt5::Gui Qt5::Xml Qt5::Network Qt5::Widgets) + +set_target_properties(${EXE_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON) +set_target_properties(${EXE_NAME} PROPERTIES + CXX_STANDARD 17 + CXX_STANDARD_REQUIRED YES + CXX_EXTENSIONS NO +) diff --git a/BioTracker/Plugin/BackgroundSubtraction/CMakeLists.txt b/BioTracker/Plugin/BackgroundSubtraction/CMakeLists.txt index f06f4c86..62aa2ff0 100644 --- a/BioTracker/Plugin/BackgroundSubtraction/CMakeLists.txt +++ b/BioTracker/Plugin/BackgroundSubtraction/CMakeLists.txt @@ -1,67 +1,29 @@ ############################################################## #### Biotracker: BackgroundSubtraction ############################################################## - -set(INCLUDE_DIRS - ${INCLUDE_DIRS} - ${CMAKE_SOURCE_DIR}/Interfaces/BioTrackerInterfaces/ - ${CMAKE_SOURCE_DIR}/Utils/BioTrackerUtils - ${CMAKE_SOURCE_DIR}/Plugin/BackgroundSubtraction - ${PROJECT_BINARY_DIR}/Plugin/BackgroundSubtraction/ - ${Boost_INCLUDE_DIRS} - ${OpenCV_INCLUDE_DIRS} - ${Qt5Core_INCLUDE_DIRS} - ${Qt5Gui_INCLUDE_DIRS} - ${Qt5Xml_INCLUDE_DIRS} - ${Qt5Network_INCLUDE_DIRS} - ${Qt5Widgets_INCLUDE_DIRS} - ${Qt5Opengl_INCLUDE_DIRS} - ${CMAKE_CURRENT_SOURCE_DIR} - ) - -set(QTLIBS - Qt5::Core - Qt5::Gui - Qt5::Xml - Qt5::Network - Qt5::Widgets - ) -set(LIBS - Biotracker_interfaces - Biotracker_utility - ${OpenCV_LIBRARIES} - ${Boost_LIBRARIES} - ${QTLIBS} - ) add_definitions( -DBIOTRACKERPLUGIN_LIBRARY=1 ) -# Visual studio out-of-source friendly source groups -set(_plugin_src_root_path ${CMAKE_CURRENT_SOURCE_DIR}) -file( - GLOB_RECURSE _plugin_source_list - LIST_DIRECTORIES false - "${_plugin_src_root_path}/*.c*" - "${_plugin_src_root_path}/*.h*" - "${_plugin_src_root_path}/*.ui*" -) -foreach(_plugin_source IN ITEMS ${_plugin_source_list}) - get_filename_component(_plugin_source_path "${_plugin_source}" PATH) - file(RELATIVE_PATH _plugin_source_path_rel "${_plugin_src_root_path}" "${_plugin_source_path}") - string(REPLACE "/" "\\" _plugin_group_path "${_plugin_source_path_rel}") - source_group("${_plugin_group_path}" FILES "${_plugin_source}") -endforeach() +include(${util_cmakes}CMakeVSSugar.txt) -set(CMAKE_INCLUDE_CURRENT_DIR OFF) - -include_directories(${INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR}) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) message("Configuring BackgroundSubtraction...") set(EXE_NAME BackgroundSubtraction.tracker) -add_library(${EXE_NAME} SHARED ${_plugin_source_list} ) -target_link_libraries(${EXE_NAME} ${LIBS}) -add_dependencies(${EXE_NAME} Biotracker_interfaces Biotracker_utility) - - +add_library(${EXE_NAME} SHARED ${_util_source_list} ) +target_link_libraries(${EXE_NAME} ${LIBS}) +target_link_libraries (${EXE_NAME} Qt5::Core Qt5::Gui Qt5::Xml Qt5::Network Qt5::Widgets) +target_link_libraries (${EXE_NAME} Qt5::Multimedia Qt5::MultimediaWidgets Qt5::OpenGL ) +target_link_libraries(${EXE_NAME} Biotracker_interfaces Biotracker_utility) +target_link_libraries(${EXE_NAME} ${OpenCV_LIBRARIES} ${Boost_LIBRARIES}) + +include_directories(${Boost_INCLUDE_DIRS}) + +set_target_properties(${EXE_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON) +set_target_properties(${EXE_NAME} PROPERTIES + CXX_STANDARD 17 + CXX_STANDARD_REQUIRED YES + CXX_EXTENSIONS NO +) \ No newline at end of file diff --git a/BioTracker/Plugin/LukasKanade/CMakeLists.txt b/BioTracker/Plugin/LukasKanade/CMakeLists.txt index 80bc4097..fbcddc28 100644 --- a/BioTracker/Plugin/LukasKanade/CMakeLists.txt +++ b/BioTracker/Plugin/LukasKanade/CMakeLists.txt @@ -2,66 +2,29 @@ #### Biotracker: LukasKanade ############################################################## -set(INCLUDE_DIRS - ${INCLUDE_DIRS} - ${CMAKE_SOURCE_DIR}/Interfaces/BioTrackerInterfaces/ - ${CMAKE_SOURCE_DIR}/Utils/BioTrackerUtils - ${CMAKE_SOURCE_DIR}/Plugin/LukasKanade - ${PROJECT_BINARY_DIR}/Plugin/LukasKanade/ - ${Boost_INCLUDE_DIRS} - ${OpenCV_INCLUDE_DIRS} - ${Qt5Core_INCLUDE_DIRS} - ${Qt5Gui_INCLUDE_DIRS} - ${Qt5Xml_INCLUDE_DIRS} - ${Qt5Network_INCLUDE_DIRS} - ${Qt5Widgets_INCLUDE_DIRS} - ${Qt5Opengl_INCLUDE_DIRS} - ${CMAKE_CURRENT_SOURCE_DIR} - ) - -set(QTLIBS - Qt5::Core - Qt5::Gui - Qt5::Xml - Qt5::Network - Qt5::Widgets - ) -set(LIBS - Biotracker_interfaces - Biotracker_utility - ${OpenCV_LIBRARIES} - ${Boost_LIBRARIES} - ${QTLIBS} - ) - - add_definitions( -DBIOTRACKERPLUGIN_LIBRARY=1 ) - -# Visual studio out-of-source friendly source groups -set(_plugin_src_root_path ${CMAKE_CURRENT_SOURCE_DIR}) -file( - GLOB_RECURSE _plugin_source_list - LIST_DIRECTORIES false - "${_plugin_src_root_path}/*.c*" - "${_plugin_src_root_path}/*.h*" - "${_plugin_src_root_path}/*.ui*" -) -foreach(_plugin_source IN ITEMS ${_plugin_source_list}) - get_filename_component(_plugin_source_path "${_plugin_source}" PATH) - file(RELATIVE_PATH _plugin_source_path_rel "${_plugin_src_root_path}" "${_plugin_source_path}") - string(REPLACE "/" "\\" _plugin_group_path "${_plugin_source_path_rel}") - source_group("${_plugin_group_path}" FILES "${_plugin_source}") -endforeach() - -set(CMAKE_INCLUDE_CURRENT_DIR OFF) - -include_directories(${INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR}) +include(${util_cmakes}CMakeVSSugar.txt) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) message("Configuring LukasKanade...") set(EXE_NAME LukasKanade.tracker) -add_library(${EXE_NAME} SHARED ${_plugin_source_list} ) +add_library(${EXE_NAME} SHARED ${_util_source_list} ) + target_link_libraries(${EXE_NAME} ${LIBS}) -add_dependencies(${EXE_NAME} Biotracker_interfaces Biotracker_utility) +target_link_libraries (${EXE_NAME} Qt5::Core Qt5::Gui Qt5::Xml Qt5::Network Qt5::Widgets) +target_link_libraries (${EXE_NAME} Qt5::Multimedia Qt5::MultimediaWidgets Qt5::OpenGL ) +target_link_libraries(${EXE_NAME} Biotracker_interfaces Biotracker_utility) +target_link_libraries(${EXE_NAME} ${OpenCV_LIBRARIES} ${Boost_LIBRARIES}) + +include_directories(${Boost_INCLUDE_DIRS}) + +set_target_properties(${EXE_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON) +set_target_properties(${EXE_NAME} PROPERTIES + CXX_STANDARD 17 + CXX_STANDARD_REQUIRED YES + CXX_EXTENSIONS NO +) + diff --git a/BioTracker/Utils/BioTrackerUtils/CMakeCommon/CMakeVSSugar.txt b/BioTracker/Utils/BioTrackerUtils/CMakeCommon/CMakeVSSugar.txt new file mode 100644 index 00000000..7067153f --- /dev/null +++ b/BioTracker/Utils/BioTrackerUtils/CMakeCommon/CMakeVSSugar.txt @@ -0,0 +1,15 @@ +set(_util_src_root_path ${CMAKE_CURRENT_SOURCE_DIR}) +file( + GLOB_RECURSE _util_source_list + LIST_DIRECTORIES false + "${_util_src_root_path}/*.c*" + "${_util_src_root_path}/*.h*" + "${_util_src_root_path}/*.ui*" +) + +foreach(_util_source IN ITEMS ${_util_source_list}) + get_filename_component(_util_source_path "${_util_source}" PATH) + file(RELATIVE_PATH _util_source_path_rel "${_util_src_root_path}" "${_util_source_path}") + string(REPLACE "/" "\\" _util_group_path "${_util_source_path_rel}") + source_group("${_util_group_path}" FILES "${_util_source}") +endforeach() \ No newline at end of file diff --git a/BioTracker/Utils/BioTrackerUtils/CMakeLists.txt b/BioTracker/Utils/BioTrackerUtils/CMakeLists.txt index b3ec8d8f..2e293e1a 100644 --- a/BioTracker/Utils/BioTrackerUtils/CMakeLists.txt +++ b/BioTracker/Utils/BioTrackerUtils/CMakeLists.txt @@ -2,58 +2,23 @@ #### Biotracker: Utility ############################################################## -set(INCLUDE_DIRS - ${INCLUDE_DIRS} - ${CMAKE_SOURCE_DIR}/Interfaces/BioTrackerInterfaces/ - ${Boost_INCLUDE_DIRS} - ${OpenCV_INCLUDE_DIRS} - ${Qt5Core_INCLUDE_DIRS} - ${Qt5Gui_INCLUDE_DIRS} - ${Qt5Xml_INCLUDE_DIRS} - ${Qt5Network_INCLUDE_DIRS} - ${Qt5Widgets_INCLUDE_DIRS} - ${Qt5Opengl_INCLUDE_DIRS} - ${CMAKE_CURRENT_SOURCE_DIR} - ) - -set(QTLIBS - Qt5::Core - Qt5::Gui - Qt5::Xml - Qt5::Network - Qt5::Widgets - ) -set(LIBS - Biotracker_interfaces - ${OpenCV_LIBRARIES} - ${Boost_LIBRARIES} - ${QTLIBS} - ) - # Visual studio out-of-source friendly source groups -set(_plugin_src_root_path ${CMAKE_CURRENT_SOURCE_DIR}) -file( - GLOB_RECURSE _plugin_source_list - LIST_DIRECTORIES false - "${_plugin_src_root_path}/*.c*" - "${_plugin_src_root_path}/*.h*" - "${_plugin_src_root_path}/*.ui*" -) -foreach(_plugin_source IN ITEMS ${_plugin_source_list}) - get_filename_component(_plugin_source_path "${_plugin_source}" PATH) - file(RELATIVE_PATH _plugin_source_path_rel "${_plugin_src_root_path}" "${_plugin_source_path}") - string(REPLACE "/" "\\" _plugin_group_path "${_plugin_source_path_rel}") - source_group("${_plugin_group_path}" FILES "${_plugin_source}") -endforeach() - -set(CMAKE_INCLUDE_CURRENT_DIR OFF) +include(CMakeCommon/CMakeVSSugar.txt) -include_directories(${INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR}) +set(util_cmakes "${CMAKE_CURRENT_SOURCE_DIR}/CMakeCommon/" CACHE INTERNAL "util_cmakes") message("Configuring Biotracker_utility...") set(EXE_NAME Biotracker_utility) -add_library(${EXE_NAME} STATIC ${_plugin_source_list} ) -target_link_libraries(${EXE_NAME} ${LIBS}) - - - +add_library(${EXE_NAME} STATIC ${_util_source_list} ) +target_link_libraries(${EXE_NAME} Biotracker_interfaces) +target_link_libraries(${EXE_NAME} ${OpenCV_LIBRARIES} ${Boost_LIBRARIES}) +target_link_libraries(${EXE_NAME} Qt5::Core Qt5::Gui Qt5::Xml Qt5::Network Qt5::Widgets) +include_directories(${Boost_INCLUDE_DIRS}) +target_include_directories(${EXE_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + +set_target_properties(${EXE_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON) +set_target_properties(${EXE_NAME} PROPERTIES + CXX_STANDARD 17 + CXX_STANDARD_REQUIRED YES + CXX_EXTENSIONS NO +) \ No newline at end of file From 4ee254d5622b9d5213983b1551dc21c56069d057 Mon Sep 17 00:00:00 2001 From: Hauke Moenck Date: Tue, 18 Sep 2018 10:20:01 +0200 Subject: [PATCH 035/171] Added a nullptr as default value somewhere --- BioTracker/CoreApp/BioTracker/Model/MediaPlayer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BioTracker/CoreApp/BioTracker/Model/MediaPlayer.cpp b/BioTracker/CoreApp/BioTracker/Model/MediaPlayer.cpp index a0e22711..1f798138 100644 --- a/BioTracker/CoreApp/BioTracker/Model/MediaPlayer.cpp +++ b/BioTracker/CoreApp/BioTracker/Model/MediaPlayer.cpp @@ -252,7 +252,7 @@ void MediaPlayer::receivePlayerParameters(playerParameters* param) { //reopenVideoWriter(); //4us QRectF rscene = m_gv->sceneRect(); //0us QRectF rview = m_gv->rect(); //0us - QPixmap *pix; + QPixmap *pix = nullptr; if (!m_recordScaled) pix = new QPixmap(rscene.size().toSize()); //17us else From 9d8c6546f5e24d4de090cd1996f8625cc55d8ab9 Mon Sep 17 00:00:00 2001 From: Hauke Moenck Date: Tue, 18 Sep 2018 10:22:22 +0200 Subject: [PATCH 036/171] Rolled back as commented on b6af9f6 --- .../CoreApp/BioTracker/Model/DataExporters/DataExporterCSV.cpp | 2 +- BioTracker/CoreApp/BioTracker/Model/MediaPlayer.cpp | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterCSV.cpp b/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterCSV.cpp index 86c20911..061a2511 100644 --- a/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterCSV.cpp +++ b/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterCSV.cpp @@ -226,7 +226,7 @@ void DataExporterCSV::writeAll(std::string f) { int max = getMaxLinecount(); //There is nothing to write - if (max <= 0) + if (max <= 1) { cleanup(); return; diff --git a/BioTracker/CoreApp/BioTracker/Model/MediaPlayer.cpp b/BioTracker/CoreApp/BioTracker/Model/MediaPlayer.cpp index 6f8c0978..fafa9fdd 100644 --- a/BioTracker/CoreApp/BioTracker/Model/MediaPlayer.cpp +++ b/BioTracker/CoreApp/BioTracker/Model/MediaPlayer.cpp @@ -289,7 +289,6 @@ void MediaPlayer::rcvPauseState(bool state) { } } -int xxx = 0; void MediaPlayer::receivePlayerOperationDone() { // Only emit this SIGNAL when tracking is not active end = std::chrono::system_clock::now(); @@ -301,11 +300,9 @@ void MediaPlayer::receivePlayerOperationDone() { m_currentFPS = 0; } - if (xxx < 100) if(m_trackingDone == true || !m_TrackingIsActive) Q_EMIT runPlayerOperation(); - xxx++; start = std::chrono::system_clock::now(); } From ae51f5524026ba57f6685fe1f262ace439995538 Mon Sep 17 00:00:00 2001 From: Hauke Moenck Date: Tue, 18 Sep 2018 10:33:51 +0200 Subject: [PATCH 037/171] Reordered includes in cmake. The util project sets a variable which is used by the plugins. Hence include it first. --- BioTracker/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BioTracker/CMakeLists.txt b/BioTracker/CMakeLists.txt index 6f8c5806..0a111994 100644 --- a/BioTracker/CMakeLists.txt +++ b/BioTracker/CMakeLists.txt @@ -34,9 +34,9 @@ add_definitions( -DMyBT_VERSION="${Boost_LIB_VERSION}" ) add_subdirectory(Interfaces/BioTrackerInterfaces) +add_subdirectory(Utils/BioTrackerUtils) add_subdirectory(Plugin/BackgroundSubtraction) add_subdirectory(Plugin/LukasKanade) -add_subdirectory(Utils/BioTrackerUtils) add_subdirectory(CoreApp/BioTracker) From 369335daa60846b7773f80d89ee9116197dbd4a9 Mon Sep 17 00:00:00 2001 From: Hauke Moenck Date: Wed, 19 Sep 2018 13:30:28 +0200 Subject: [PATCH 038/171] Fixed issue #164 The problem was the shapes having their symbol type not set after loading: setData(1, "point"); Todo: Save view properties of objects in a separate file? See https://github.com/BioroboticsLab/biotracker_core/issues/164 --- .../Controller/ControllerTrackedComponentCore.cpp | 1 + BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp | 10 +++++----- .../CoreApp/BioTracker/View/TrackedComponentView.cpp | 4 ++-- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerTrackedComponentCore.cpp b/BioTracker/CoreApp/BioTracker/Controller/ControllerTrackedComponentCore.cpp index 2cadae7c..6bca699c 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerTrackedComponentCore.cpp +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerTrackedComponentCore.cpp @@ -82,6 +82,7 @@ void ControllerTrackedComponentCore::connectControllerToController() } void ControllerTrackedComponentCore::receiveOnPluginLoaded() { + receiveUpdateView(); } void ControllerTrackedComponentCore::setCorePermission(std::pair permission) diff --git a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp index 959ca253..abc84a67 100644 --- a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp +++ b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp @@ -29,7 +29,6 @@ #include #include #include -//#include /* @@ -42,6 +41,7 @@ ComponentShape::ComponentShape(QGraphicsObject* parent, QGraphicsObject(parent), m_trajectory(trajectory), m_id(id), m_parent(parent) { setData(0, m_id); + setData(1, "point"); m_polygons = QList(); m_useDefaultDimensions = true; @@ -94,7 +94,8 @@ QRectF ComponentShape::boundingRect() const return m_polygons[0].boundingRect(); } else { - qDebug() << "Could not create a bounding rect for current track" << m_id; + //Note: This log might not appear (on console) as the application dies of assert before the buffer is served + qDebug() << "Could not create a bounding rect for current track " << m_id; assert(0); } @@ -743,7 +744,7 @@ void ComponentShape::trace() return; } - QPointF lastPointDifference = QPointF(0, 0) + QPointF(m_h / 2, m_w / 2); + QPointF lastPointDifference = QPointF(0, 0);// + QPointF(m_h / 2, m_w / 2); //create each n'th (m_tracingSteps) tracer of tracing history (m_tracingLength) for (int i = 1; i <= m_tracingLength && i <= m_currentFramenumber; i += m_tracingSteps) { @@ -755,8 +756,7 @@ void ComponentShape::trace() //positioning QPointF historyPoint = QPointF(historyChild->getXpx(), historyChild->getYpx()); QPointF historyPointDifference = historyPoint - currentPoint; - QPointF adjustedHistoryPointDifference = historyPointDifference + - QPointF(m_w / 2, m_h / 2); + QPointF adjustedHistoryPointDifference = historyPointDifference; //time degradation colors QPen timeDegradationPen = QPen(m_penColor, m_penWidth, m_penStyle); diff --git a/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp b/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp index 40603a35..85cef70f 100644 --- a/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp +++ b/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp @@ -308,7 +308,7 @@ void TrackedComponentView::updateShapes(uint framenumber) { if (this->childItems().size() < all->size()) { //iterate over trajectories from back to increase performance - for (int i = all->size() - 1; i >= 0 && this->childItems().size() < all->size(); i--) { + for (int i = all->size() - 1; i >= 0 && this->childItems().size() <= all->size(); i--) { IModelTrackedTrajectory* trajectory = dynamic_cast(all->getChild(i)); //check if trajectory already has shape object @@ -322,7 +322,7 @@ void TrackedComponentView::updateShapes(uint framenumber) { //all trajectories already have shapes if (all->size() == this->childItems().size()) { - continue; + break; } } } From ad8db6d45f6e32b29bbba9e47cbd7d6c39952b26 Mon Sep 17 00:00:00 2001 From: Hauke Moenck Date: Fri, 21 Sep 2018 10:29:09 +0200 Subject: [PATCH 039/171] Fixed boost and opencv issues --- BioTracker/CMakeLists.txt | 1 - .../imageProcessor/cvblobs/BlobResult.h | 16 ++--- .../imageProcessor/cvblobs/blob.cpp | 69 ++++++++++--------- 3 files changed, 43 insertions(+), 43 deletions(-) diff --git a/BioTracker/CMakeLists.txt b/BioTracker/CMakeLists.txt index 0a111994..af22bbfe 100644 --- a/BioTracker/CMakeLists.txt +++ b/BioTracker/CMakeLists.txt @@ -18,7 +18,6 @@ set (QT_DIR_CMAKE $ENV{QT_DIR}) set(HMNVLibDir "Not Found" CACHE FILEPATH "") if(CMAKE_SYSTEM MATCHES "Windows") - set(Boost_USE_STATIC_LIBS ON) set(Boost_USE_MULTITHREADED ON) endif() find_package(Boost REQUIRED system filesystem chrono thread timer program_options) diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobResult.h b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobResult.h index a218c8b3..5d86142f 100644 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobResult.h +++ b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobResult.h @@ -1,9 +1,9 @@ /************************************************************************ BlobResult.h -FUNCIONALITAT: Definició de la classe CBlobResult +FUNCIONALITAT: Definici� de la classe CBlobResult AUTOR: Inspecta S.L. -MODIFICACIONS (Modificació, Autor, Data): +MODIFICACIONS (Modificaci�, Autor, Data): FUNCTIONALITY: Definition of the CBlobResult class AUTHOR: Inspecta S.L. @@ -62,12 +62,12 @@ MODIFICATIONS (Modification, Author, Date): Excepcions / Exceptions **************************************************************************/ -//! Excepcions llençades per les funcions: +//! Excepcions llen�ades per les funcions: #define EXCEPTION_BLOB_OUT_OF_BOUNDS 1000 #define EXCEPCIO_CALCUL_BLOBS 1001 /** - Classe que conté un conjunt de blobs i permet extreure'n propietats + Classe que cont� un conjunt de blobs i permet extreure'n propietats o filtrar-los segons determinats criteris. Class to calculate the blobs of an image and calculate some properties on them. Also, the class provides functions to filter the blobs using @@ -83,7 +83,7 @@ class CBlobResult //! constructor a partir d'una imatge //! Image constructor, it creates an object with the blobs of the image CBlobResult(IplImage *source, IplImage *mask, uchar backgroundColor); - //! constructor de còpia + //! constructor de c�pia //! Copy constructor CBlobResult( const CBlobResult &source ); //! Destructor @@ -122,11 +122,11 @@ class CBlobResult int filterAction, funcio_calculBlob *evaluador, int condition, double lowLimit, double highLimit = 0 ) const; - //! Retorna l'enèssim blob segons un determinat criteri + //! Retorna l'en�ssim blob segons un determinat criteri //! Sorts the blobs of the class acording to some criteria and returns the n-th blob void GetNthBlob( funcio_calculBlob *criteri, int nBlob, CBlob &dst ) const; - //! Retorna el blob enèssim + //! Retorna el blob en�ssim //! Gets the n-th blob of the class ( without sorting ) CBlob GetBlob(int indexblob) const; CBlob *GetBlob(int indexblob); @@ -152,7 +152,7 @@ class CBlobResult private: - //! Funció per gestionar els errors + //! Funci� per gestionar els errors //! Function to manage the errors void RaiseError(const int errorCode) const; diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/blob.cpp b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/blob.cpp index fd197466..596c9138 100644 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/blob.cpp +++ b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/blob.cpp @@ -1,9 +1,9 @@ /************************************************************************ Blob.cpp -- FUNCIONALITAT: Implementació de la classe CBlob +- FUNCIONALITAT: Implementaci� de la classe CBlob - AUTOR: Inspecta S.L. -MODIFICACIONS (Modificació, Autor, Data): +MODIFICACIONS (Modificaci�, Autor, Data): FUNCTIONALITY: Implementation of the CBlob class and some helper classes to perform @@ -15,6 +15,7 @@ MODIFICATIONS (Modification, Author, Date): #include "blob.h" +#include CBlob::CBlob() @@ -134,7 +135,7 @@ void CBlob::AddInternalContour( const CBlobContour &newContour ) m_internalContours.push_back(newContour); } -//! Indica si el blob està buit ( no té cap info associada ) +//! Indica si el blob est� buit ( no t� cap info associada ) //! Shows if the blob has associated information bool CBlob::IsEmpty() { @@ -142,17 +143,17 @@ bool CBlob::IsEmpty() } /** -- FUNCIÓ: Area +- FUNCI�: Area - FUNCIONALITAT: Get blob area, ie. external contour area minus internal contours area -- PARÀMETRES: +- PAR�METRES: - - RESULTAT: - - RESTRICCIONS: - - AUTOR: rborras -- DATA DE CREACIÓ: 2008/04/30 -- MODIFICACIÓ: Data. Autor. Descripció. +- DATA DE CREACI�: 2008/04/30 +- MODIFICACI�: Data. Autor. Descripci�. */ double CBlob::Area() { @@ -172,17 +173,17 @@ double CBlob::Area() } /** -- FUNCIÓ: Perimeter +- FUNCI�: Perimeter - FUNCIONALITAT: Get blob perimeter, ie. sum of the lenght of all the contours -- PARÀMETRES: +- PAR�METRES: - - RESULTAT: - - RESTRICCIONS: - - AUTOR: rborras -- DATA DE CREACIÓ: 2008/04/30 -- MODIFICACIÓ: Data. Autor. Descripció. +- DATA DE CREACI�: 2008/04/30 +- MODIFICACI�: Data. Autor. Descripci�. */ double CBlob::Perimeter() { @@ -203,9 +204,9 @@ double CBlob::Perimeter() } /** -- FUNCIÓ: Exterior +- FUNCI�: Exterior - FUNCIONALITAT: Return true for extern blobs -- PARÀMETRES: +- PAR�METRES: - xBorder: true to consider blobs touching horizontal borders as extern - yBorder: true to consider blobs touching vertical borders as extern - RESULTAT: @@ -213,8 +214,8 @@ double CBlob::Perimeter() - RESTRICCIONS: - - AUTOR: rborras -- DATA DE CREACIÓ: 2008/05/06 -- MODIFICACIÓ: Data. Autor. Descripció. +- DATA DE CREACI�: 2008/05/06 +- MODIFICACI�: Data. Autor. Descripci�. */ int CBlob::Exterior(IplImage *mask, bool xBorder /* = true */, bool yBorder /* = true */) { @@ -226,9 +227,9 @@ int CBlob::Exterior(IplImage *mask, bool xBorder /* = true */, bool yBorder /* = return 0; } /** -- FUNCIÓ: ExternPerimeter +- FUNCI�: ExternPerimeter - FUNCIONALITAT: Get extern perimeter (perimeter touching image borders) -- PARÀMETRES: +- PAR�METRES: - maskImage: if != NULL, counts maskImage black pixels as external pixels and contour points touching them are counted as external contour points. - xBorder: true to consider blobs touching horizontal borders as extern @@ -238,8 +239,8 @@ int CBlob::Exterior(IplImage *mask, bool xBorder /* = true */, bool yBorder /* = - RESTRICCIONS: - - AUTOR: rborras -- DATA DE CREACIÓ: 2008/05/05 -- MODIFICACIÓ: Data. Autor. Descripció. +- DATA DE CREACI�: 2008/05/05 +- MODIFICACI�: Data. Autor. Descripci�. - NOTA: If CBlobContour::GetContourPoints aproximates contours with a method different that NONE, this function will not give correct results */ @@ -394,17 +395,17 @@ double CBlob::Moment(int p, int q) } /** -- FUNCIÓ: Mean +- FUNCI�: Mean - FUNCIONALITAT: Get blob mean color in input image -- PARÀMETRES: +- PAR�METRES: - image: image from gray color are extracted - RESULTAT: - - RESTRICCIONS: - - AUTOR: rborras -- DATA DE CREACIÓ: 2008/05/06 -- MODIFICACIÓ: Data. Autor. Descripció. +- DATA DE CREACI�: 2008/05/06 +- MODIFICACI�: Data. Autor. Descripci�. */ double CBlob::Mean( IplImage *image ) { @@ -473,17 +474,17 @@ double CBlob::StdDev( IplImage *image ) return m_stdDevGray; } /** -- FUNCIÓ: GetBoundingBox +- FUNCI�: GetBoundingBox - FUNCIONALITAT: Get bounding box (without rotation) of a blob -- PARÀMETRES: +- PAR�METRES: - - RESULTAT: - - RESTRICCIONS: - - AUTOR: rborras -- DATA DE CREACIÓ: 2008/05/06 -- MODIFICACIÓ: Data. Autor. Descripció. +- DATA DE CREACI�: 2008/05/06 +- MODIFICACI�: Data. Autor. Descripci�. */ CvRect CBlob::GetBoundingBox() { @@ -539,17 +540,17 @@ CvRect CBlob::GetBoundingBox() } /** -- FUNCIÓ: GetEllipse +- FUNCI�: GetEllipse - FUNCIONALITAT: Calculates bounding ellipse of external contour points -- PARÀMETRES: +- PAR�METRES: - - RESULTAT: - - RESTRICCIONS: - - AUTOR: rborras -- DATA DE CREACIÓ: 2008/05/06 -- MODIFICACIÓ: Data. Autor. Descripció. +- DATA DE CREACI�: 2008/05/06 +- MODIFICACI�: Data. Autor. Descripci�. - NOTA: Calculation is made using second order moment aproximation */ CvBox2D CBlob::GetEllipse() @@ -642,7 +643,7 @@ CvBox2D CBlob::GetEllipse() - RESULT: - modifies input image and returns the seed point used to fill the blob - RESTRICTIONS: -- AUTHOR: Ricard Borràs +- AUTHOR: Ricard Borr�s - CREATION DATE: 25-05-2005. - MODIFICATION: Date. Author. Description. */ @@ -660,7 +661,7 @@ void CBlob::FillBlob( IplImage *imatge, CvScalar color, int offsetX /*=0*/, int - RESULT: - true if no error ocurred - RESTRICTIONS: -- AUTHOR: Ricard Borràs +- AUTHOR: Ricard Borr�s - CREATION DATE: 25-05-2005. - MODIFICATION: Date. Author. Description. */ @@ -683,7 +684,7 @@ t_PointList CBlob::GetConvexHull() - RESULT: - true if no error ocurred - RESTRICTIONS: Only external contours are added -- AUTHOR: Ricard Borràs +- AUTHOR: Ricard Borr�s - CREATION DATE: 25-05-2005. - MODIFICATION: Date. Author. Description. */ From db72deb4ec2fac6e61fbdc38b18f8c048895c389 Mon Sep 17 00:00:00 2001 From: Hauke Moenck Date: Mon, 24 Sep 2018 13:44:13 +0200 Subject: [PATCH 040/171] Build boost dynamic. When in doubt, use BRLab vcpkg for windows toolchaining --- BioTracker/CMakeLists.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/BioTracker/CMakeLists.txt b/BioTracker/CMakeLists.txt index af22bbfe..9e50bfda 100644 --- a/BioTracker/CMakeLists.txt +++ b/BioTracker/CMakeLists.txt @@ -17,9 +17,6 @@ set (QT_DIR_CMAKE $ENV{QT_DIR}) set(HMNVLibDir "Not Found" CACHE FILEPATH "") -if(CMAKE_SYSTEM MATCHES "Windows") - set(Boost_USE_MULTITHREADED ON) -endif() find_package(Boost REQUIRED system filesystem chrono thread timer program_options) exec_program("git" ${CMAKE_CURRENT_SOURCE_DIR} ARGS "log --pretty=format:%h -n 1" OUTPUT_VARIABLE VERSION ) From 1d0c437ef63eea66203ecce08fb1ee2745a8e98a Mon Sep 17 00:00:00 2001 From: Hauke Moenck Date: Mon, 24 Sep 2018 13:55:14 +0200 Subject: [PATCH 041/171] update readme --- README.md | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 4ab2352b..0b1d172b 100644 --- a/README.md +++ b/README.md @@ -14,25 +14,17 @@ Building the Biotracker 3 needs: ## Building Biotracker 3 (Windows x64) -Following example will use Visual Studio 2015, OpenCv 3.2, QT 5.9 and boost_1_64, all x64. -You will need to tell CMake where to find the libraries. You can do this via GUI when asked or set enviromental variables. - -Set: -- QT_DIR_CMAKE64, E.g. E:\Software\Libraries\QT\5.9\msvc2015_64\lib\cmake\Qt5 -- CV_DIR_CMAKE64, E.g. E:\Software\Libraries\opencv\build -- BOOST_LIBRARYDIR, E.g. E:\Software\Libraries\boost_1_65_1\stage64\lib -- BOOST_ROOT, E.g. E:\Software\Libraries\boost_1_65_1 -Note that your path's and library version may differ. - -Building with NVEnc is comming soon. Meanwhile ignore "HMNVLibDir=Not Found", it will build with CPU encoding only. - -Now configure, generate, open and build for Debug/Release. The build is dynamically linked, which means you will need to supply the DLL's to your newly build binary. Qt offers the windeployqt utility. Usage sample, console: -C:\Users\Hauke>E:\Software\Libraries\QT\5.9\msvc2015_64\bin\windeployqt.exe E:\Development\Hauke\biotracker_core\BioTracker\CoreApp\BioTracker\Release\Biotracker_core.exe -OpenCv does not come with such a utility and you need to copy the DLL's manually from e.g.: -E:\Software\Libraries\opencv\build\bin\Release (or Debug, respectively) -Boost libraries are not needed to be copied. - -Congratulations! You build the Biotracker 3! +Note: Building with NVEnc is comming soon. Meanwhile ignore "HMNVLibDir=Not Found", it will build with CPU encoding only. + +Install and configure the dependencies. E.g. use vcpkg: https://github.com/BioroboticsLab/RF_vcpkg +Get the boost packages: +vcpkg install boost-property-tree:x64-windows-14.13 boost-bimap:x64-windows-14.13 boost-assign:x64-windows-14.13 boost-system:x64-windows-14.13 boost-filesystem:x64-windows-14.13 boost-chrono:x64-windows-14.13 boost-timer:x64-windows-14.13 boost-program-options:x64-windows-14.13 +vcpkg install openblas:x64-windows-14.13 opencv[opengl,ffmpeg,ximea,cuda]:x64-windows-14.13 +... and Qt systemwide using Qt5_dir +Now call cmake with some switches to include vcpkg: -DCMAKE_TOOLCHAIN_FILE=C:/RF_vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-14.13 +... and build. You might need to copy flang DLL files, as their vcpkg integration is not yet complete. + +Congratulations! You build the Biotracker 3! ## Building Biotracker 3 (Linux) From 1e53ea1a7589217ad4bf4a768879e98dcc5cce8d Mon Sep 17 00:00:00 2001 From: Benjamin Wild Date: Mon, 29 Oct 2018 16:04:49 +0100 Subject: [PATCH 042/171] Fix return type of optionParser --- BioTracker/CoreApp/BioTracker/util/CLIcommands.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BioTracker/CoreApp/BioTracker/util/CLIcommands.h b/BioTracker/CoreApp/BioTracker/util/CLIcommands.h index cb206943..b2c0433c 100644 --- a/BioTracker/CoreApp/BioTracker/util/CLIcommands.h +++ b/BioTracker/CoreApp/BioTracker/util/CLIcommands.h @@ -19,7 +19,7 @@ class CLI { public: - static int optionParser(int ac, char* av[]) + static void optionParser(int ac, char* av[]) { BioTracker::Core::Settings *set = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); From e335be08702309788d563a627e7f45bb4ef8e2d3 Mon Sep 17 00:00:00 2001 From: Hauke Moenck Date: Wed, 31 Oct 2018 14:31:19 +0100 Subject: [PATCH 043/171] Restructuring - New config structure - CI/CD in yaml (see gitlab) - Config in userforlders (%APPDATA%) - MSI Installer and appimage as CI/CD products - Exploded Biotracker in multiple repos (interfaces, utility and trackers) --- .gitignore | 4 - .gitignore.save | 43 - .gitlab-ci.yml | 115 +++ .gitmodules | 0 BioTracker/CMakeLists.txt | 39 - BioTracker/CoreApp/BioTracker/BioTracker.pro | 146 --- BioTracker/CoreApp/BioTracker/CMakeLists.txt | 30 - .../BioTracker/Debug/BiotrackerCore.ini | 8 - .../CoreApp/BioTracker/Model/PluginLoader.cpp | 101 -- .../CoreApp/BioTracker/Model/PluginLoader.h | 95 -- .../View/AreaDesciptor/AreaDescriptor.cpp | 7 - .../BioTracker/View/SettingsWindow.cpp | 89 -- BioTracker/CoreApp/BioTracker/main.cpp | 46 - BioTracker/CoreApp/BioTracker/util/types.h | 94 -- .../BioTrackerInterfaces.pro | 53 - .../BioTrackerInterfaces/CMakeLists.txt | 45 - .../BioTrackerInterfaces/Interfaces/ENUMS.h | 45 - .../Interfaces/IBioTrackerContext.cpp | 38 - .../Interfaces/IBioTrackerContext.h | 34 - .../Interfaces/IBioTrackerPlugin.cpp | 9 - .../Interfaces/IBioTrackerPlugin.h | 70 -- .../Interfaces/IController/IController.cpp | 56 -- .../Interfaces/IController/IController.h | 56 -- .../Interfaces/IModel/IModel.cpp | 9 - .../Interfaces/IModel/IModel.h | 21 - .../IModel/IModelAreaDescriptor.cpp | 0 .../Interfaces/IModel/IModelAreaDescriptor.h | 35 - .../Interfaces/IModel/IModelDataExporter.cpp | 13 - .../Interfaces/IModel/IModelDataExporter.h | 41 - .../IModel/IModelTrackedComponent.cpp | 103 -- .../IModel/IModelTrackedComponent.h | 344 ------- .../IModel/IModelTrackedComponentFactory.cpp | 25 - .../IModel/IModelTrackedComponentFactory.h | 27 - .../IModel/IModelTrackedTrajectory.cpp | 16 - .../IModel/IModelTrackedTrajectory.h | 85 -- .../IModel/IModelTrackingAlgorithm.cpp | 27 - .../IModel/IModelTrackingAlgorithm.h | 21 - .../Interfaces/IModel/IObject.cpp | 6 - .../Interfaces/IModel/IObject.h | 14 - .../Interfaces/IModel/Serializable.cpp | 28 - .../Interfaces/IModel/Serializable.h | 14 - .../Interfaces/IView/IView.cpp | 37 - .../Interfaces/IView/IView.h | 29 - .../IView/IViewGraphicsPixmapItem.cpp | 24 - .../IView/IViewGraphicsPixmapItem.h | 22 - .../Interfaces/IView/IViewGraphicsScene.cpp | 18 - .../Interfaces/IView/IViewGraphicsScene.h | 24 - .../Interfaces/IView/IViewGraphicsView.cpp | 19 - .../Interfaces/IView/IViewGraphicsView.h | 24 - .../Interfaces/IView/IViewMainWindow.cpp | 20 - .../Interfaces/IView/IViewMainWindow.h | 17 - .../Interfaces/IView/IViewOpenGLWidget.cpp | 33 - .../Interfaces/IView/IViewOpenGLWidget.h | 25 - .../IView/IViewTrackedComponent.cpp | 23 - .../Interfaces/IView/IViewTrackedComponent.h | 35 - .../Interfaces/IView/IViewWidget.cpp | 18 - .../Interfaces/IView/IViewWidget.h | 21 - .../BioTrackerPlugin.cpp | 135 --- .../BackgroundSubtraction/BioTrackerPlugin.h | 81 -- .../BioTrackerPlugin.json | 6 - .../BioTrackerPlugin.pro | 70 -- .../BackgroundSubtraction/CMakeLists.txt | 29 - .../Controller/ControllerTrackedComponent.cpp | 172 ---- .../Controller/ControllerTrackedComponent.h | 45 - .../ControllerTrackingAlgorithm.cpp | 80 -- .../Controller/ControllerTrackingAlgorithm.h | 48 - .../Controller/null_Controller.cpp | 26 - .../Controller/null_Controller.h | 18 - .../Model/BioTrackerTrackingAlgorithm.cpp | 186 ---- .../Model/BioTrackerTrackingAlgorithm.h | 70 -- .../Model/Network/TcpListener.cpp | 67 -- .../Model/Network/TcpListener.h | 31 - .../TrackedComponentFactory.cpp | 36 - .../TrackedComponentFactory.h | 22 - .../TrackedComponents/TrackedElement.cpp | 184 ---- .../Model/TrackedComponents/TrackedElement.h | 91 -- .../TrackedComponents/TrackedTrajectory.cpp | 137 --- .../TrackedComponents/TrackedTrajectory.h | 46 - .../Model/TrackedComponents/pose/FishPose.cpp | 33 - .../Model/TrackedComponents/pose/FishPose.h | 133 --- .../Model/TrackedComponents/pose/IPose.h | 29 - .../Model/TrackerParameter.cpp | 54 - .../Model/TrackerParameter.h | 160 --- .../Model/TrackingAlgorithm/NN2dMapper.cpp | 326 ------ .../Model/TrackingAlgorithm/NN2dMapper.h | 33 - .../Model/TrackingAlgorithm/ParamNames.h | 86 -- .../imageProcessor/cvblobs/BlobContour.cpp | 257 ----- .../imageProcessor/cvblobs/BlobContour.h | 99 -- .../cvblobs/BlobLibraryConfiguration.h | 22 - .../imageProcessor/cvblobs/BlobOperators.cpp | 502 ---------- .../imageProcessor/cvblobs/BlobOperators.h | 754 -------------- .../imageProcessor/cvblobs/BlobProperties.cpp | 81 -- .../imageProcessor/cvblobs/BlobProperties.h | 70 -- .../imageProcessor/cvblobs/BlobResult.cpp | 943 ------------------ .../imageProcessor/cvblobs/BlobResult.h | 171 ---- .../cvblobs/ComponentLabeling.cpp | 630 ------------ .../cvblobs/ComponentLabeling.h | 30 - .../imageProcessor/cvblobs/blob.cpp | 707 ------------- .../imageProcessor/cvblobs/blob.h | 172 ---- .../imageProcessor/detector/IDetector.cpp | 26 - .../imageProcessor/detector/IDetector.h | 66 -- .../imageProcessor/detector/blob/BlobPose.cpp | 18 - .../imageProcessor/detector/blob/BlobPose.h | 86 -- .../detector/blob/cvBlob/BlobsDetector.cpp | 106 -- .../detector/blob/cvBlob/BlobsDetector.h | 55 - .../blob/simpleBlob/SimpleBlobsDetector.cpp | 104 -- .../blob/simpleBlob/SimpleBlobsDetector.h | 49 - .../detector/contour/ContourPose.cpp | 18 - .../detector/contour/ContourPose.h | 72 -- .../detector/contour/ContoursDetector.cpp | 68 -- .../detector/contour/ContoursDetector.h | 36 - .../preprocessor/ImagePreProcessor.cpp | 219 ---- .../preprocessor/ImagePreProcessor.h | 112 --- .../Model/null_Model.cpp | 6 - .../BackgroundSubtraction/Model/null_Model.h | 13 - .../BackgroundSubtraction/PluginContext.cpp | 34 - .../BackgroundSubtraction/PluginContext.h | 17 - .../View/TrackedElementView.cpp | 46 - .../View/TrackedElementView.h | 34 - .../View/TrackerParameterView.cpp | 82 -- .../View/TrackerParameterView.h | 43 - .../View/TrackerParameterView.ui | 421 -------- .../biotrackerplugin_global.h | 12 - .../BackgroundSubtraction/helper/CvHelper.cpp | 405 -------- .../BackgroundSubtraction/helper/CvHelper.h | 197 ---- .../helper/StringHelper.cpp | 105 -- .../helper/StringHelper.h | 80 -- .../Plugin/LukasKanade/BioTrackerPlugin.cpp | 134 --- .../Plugin/LukasKanade/BioTrackerPlugin.h | 81 -- .../Plugin/LukasKanade/BioTrackerPlugin.json | 6 - BioTracker/Plugin/LukasKanade/CMakeLists.txt | 30 - .../Controller/ControllerTrackedComponent.cpp | 163 --- .../Controller/ControllerTrackedComponent.h | 41 - .../ControllerTrackingAlgorithm.cpp | 80 -- .../Controller/ControllerTrackingAlgorithm.h | 48 - .../Controller/null_Controller.cpp | 26 - .../LukasKanade/Controller/null_Controller.h | 18 - .../Model/BioTrackerTrackingAlgorithm.cpp | 169 ---- .../Model/BioTrackerTrackingAlgorithm.h | 52 - .../Plugin/LukasKanade/Model/ParamNames.h | 60 -- .../LukasKanade/Model/TrackerParameter.cpp | 15 - .../LukasKanade/Model/TrackerParameter.h | 40 - .../Plugin/LukasKanade/Model/null_Model.cpp | 6 - .../Plugin/LukasKanade/Model/null_Model.h | 13 - .../Plugin/LukasKanade/PluginContext.cpp | 34 - BioTracker/Plugin/LukasKanade/PluginContext.h | 17 - .../LukasKanade/View/TrackedElementView.cpp | 45 - .../LukasKanade/View/TrackedElementView.h | 34 - .../LukasKanade/View/TrackerParameterView.cpp | 38 - .../LukasKanade/View/TrackerParameterView.h | 37 - .../LukasKanade/View/TrackerParameterView.ui | 169 ---- .../LukasKanade/biotrackerplugin_global.h | 12 - .../Utils/BioTrackerUtils/BioTrackerUtils.pro | 58 -- .../CMakeCommon/CMakeVSSugar.txt | 15 - .../Utils/BioTrackerUtils/CMakeLists.txt | 24 - .../TrackedComponentFactory.cpp | 36 - .../TrackedComponentFactory.h | 21 - .../TrackedComponents/TrackedElement.cpp | 65 -- .../TrackedComponents/TrackedElement.h | 107 -- .../TrackedComponents/TrackedTrajectory.cpp | 91 -- .../TrackedComponents/TrackedTrajectory.h | 44 - .../BioTrackerUtils/settings/ParamNames.h | 92 -- .../BioTrackerUtils/settings/Settings.cpp | 26 - .../Utils/BioTrackerUtils/settings/Settings.h | 234 ----- .../settings/StringTranslator.cpp | 14 - .../settings/StringTranslator.h | 53 - .../settings/SystemCompatibilityCheck.cpp | 7 - .../settings/SystemCompatibilityCheck.h | 12 - .../Utils/BioTrackerUtils/util/CvHelper.cpp | 51 - .../Utils/BioTrackerUtils/util/CvHelper.h | 71 -- .../Utils/BioTrackerUtils/util/Exceptions.h | 34 - .../Utils/BioTrackerUtils/util/MutexWrapper.h | 199 ---- .../Utils/BioTrackerUtils/util/PanZoomState.h | 32 - .../BioTrackerUtils/util/QtRaiiWrapper.hpp | 19 - .../Utils/BioTrackerUtils/util/ScreenHelper.h | 208 ---- .../util/imagePreProcessor/IImageProcessor.h | 29 - .../imagePreProcessor/ImagePreProcessor.h | 181 ---- .../Utils/BioTrackerUtils/util/misc.cpp | 95 -- BioTracker/Utils/BioTrackerUtils/util/misc.h | 14 - .../Utils/BioTrackerUtils/util/platform.h | 16 - .../Utils/BioTrackerUtils/util/singleton.h | 63 -- .../Utils/BioTrackerUtils/util/stdext.h | 47 - .../BioTrackerUtils/util/stringTools.cpp | 14 - .../Utils/BioTrackerUtils/util/stringTools.h | 47 - CMakeLists.txt | 30 + README.md | 30 +- Src/BioTracker.desktop | 8 + .../BioTracker => Src}/BioTracker3App.cpp | 0 .../BioTracker => Src}/BioTracker3App.h | 0 Src/CMakeLists.txt | 190 ++++ .../Controller/ControllerAnnotations.cpp | 2 +- .../Controller/ControllerAnnotations.h | 4 +- .../Controller/ControllerAreaDescriptor.cpp | 27 +- .../Controller/ControllerAreaDescriptor.h | 6 +- .../Controller/ControllerCommands.cpp | 2 +- .../Controller/ControllerCommands.h | 4 +- .../Controller/ControllerCoreParameter.cpp | 2 +- .../Controller/ControllerCoreParameter.h | 10 +- .../Controller/ControllerDataExporter.cpp | 20 +- .../Controller/ControllerDataExporter.h | 4 +- .../Controller/ControllerGraphicScene.cpp | 2 +- .../Controller/ControllerGraphicScene.h | 4 +- .../Controller/ControllerMainWindow.cpp | 18 +- .../Controller/ControllerMainWindow.h | 4 +- .../Controller/ControllerNotifications.cpp | 2 +- .../Controller/ControllerNotifications.h | 4 +- .../Controller/ControllerPlayer.cpp | 32 +- .../Controller/ControllerPlayer.h | 16 +- .../Controller/ControllerPlugin.cpp | 66 +- .../Controller/ControllerPlugin.h | 12 +- .../Controller/ControllerTextureObject.cpp | 2 +- .../Controller/ControllerTextureObject.h | 4 +- .../ControllerTrackedComponentCore.cpp | 3 +- .../ControllerTrackedComponentCore.h | 4 +- Src/Controller/IControllerCfg.cpp | 13 + Src/Controller/IControllerCfg.h | 31 + .../Controller/null_Controller.cpp | 0 .../Controller/null_Controller.h | 10 +- .../CoreApp/BioTracker => Src}/GuiContext.cpp | 18 +- .../CoreApp/BioTracker => Src}/GuiContext.h | 7 +- .../IStates/IPlayerState.cpp | 0 .../BioTracker => Src}/IStates/IPlayerState.h | 86 +- .../BioTracker => Src}/Model/Annotations.cpp | 0 .../BioTracker => Src}/Model/Annotations.h | 0 .../Model/AreaDescriptor/AreaInfo.cpp | 137 +-- .../Model/AreaDescriptor/AreaInfo.h | 4 +- .../Model/AreaDescriptor/AreaInfoElement.cpp | 0 .../Model/AreaDescriptor/AreaInfoElement.h | 0 .../Model/AreaDescriptor/AreaMemory.cpp | 10 +- .../Model/AreaDescriptor/AreaMemory.h | 4 +- .../Model/AreaDescriptor/Rectification.cpp | 19 +- .../Model/AreaDescriptor/Rectification.h | 6 +- .../Model/BioTracker3ProxyMat.cpp | 0 .../Model/BioTracker3ProxyMat.h | 0 .../Model/CoreParameter.cpp | 1 - .../BioTracker => Src}/Model/CoreParameter.h | 0 .../Model/DataExporters/DataExporterCSV.cpp | 22 +- .../Model/DataExporters/DataExporterCSV.h | 0 .../DataExporters/DataExporterGeneric.cpp | 16 +- .../Model/DataExporters/DataExporterGeneric.h | 5 +- .../Model/DataExporters/DataExporterJson.cpp | 5 +- .../Model/DataExporters/DataExporterJson.h | 0 .../DataExporters/DataExporterSerialize.cpp | 6 +- .../DataExporters/DataExporterSerialize.h | 0 .../BioTracker => Src}/Model/ImageStream.cpp | 161 +-- .../BioTracker => Src}/Model/ImageStream.h | 28 +- .../BioTracker => Src}/Model/MediaPlayer.cpp | 19 +- .../BioTracker => Src}/Model/MediaPlayer.h | 6 +- .../MediaPlayerStateMachine.cpp | 40 +- .../MediaPlayerStateMachine.h | 11 +- .../PlayerParameters.h | 1 + .../PlayerStates/PStateGoToFrame.cpp | 0 .../PlayerStates/PStateGoToFrame.h | 0 .../PlayerStates/PStateInitial.cpp | 0 .../PlayerStates/PStateInitial.h | 0 .../PlayerStates/PStateInitialStream.cpp | 0 .../PlayerStates/PStateInitialStream.h | 0 .../PlayerStates/PStatePause.cpp | 0 .../PlayerStates/PStatePause.h | 0 .../PlayerStates/PStatePlay.cpp | 12 +- .../PlayerStates/PStatePlay.h | 0 .../PlayerStates/PStateStepBack.cpp | 0 .../PlayerStates/PStateStepBack.h | 0 .../PlayerStates/PStateStepForw.cpp | 0 .../PlayerStates/PStateStepForw.h | 0 .../PlayerStates/PStateWait.cpp | 0 .../PlayerStates/PStateWait.h | 0 .../PlayerStates/PStateWaite.cpp.autosave | 0 .../PlayerStates/PStateWaite.h.autosave | 0 .../Model/TextureObject.cpp | 0 .../BioTracker => Src}/Model/TextureObject.h | 0 .../Model/UndoCommands/TrackCommands.cpp | 0 .../Model/UndoCommands/TrackCommands.h | 0 .../BioTracker => Src}/Model/null_Model.cpp | 0 .../BioTracker => Src}/Model/null_Model.h | 0 .../View/AnnotationsView.cpp | 0 .../BioTracker => Src}/View/AnnotationsView.h | 0 Src/View/AreaDesciptor/AreaDescriptor.cpp | 11 + .../View/AreaDesciptor/AreaDescriptor.h | 7 +- .../View/AreaDesciptor/EllipseDescriptor.cpp | 0 .../View/AreaDesciptor/EllipseDescriptor.h | 0 .../View/AreaDesciptor/RectDescriptor.cpp | 24 +- .../View/AreaDesciptor/RectDescriptor.h | 0 .../BioTracker => Src}/View/CameraDevice.cpp | 0 .../BioTracker => Src}/View/CameraDevice.h | 0 .../BioTracker => Src}/View/CameraDevice.ui | 0 .../View/ComponentShape.cpp | 0 .../BioTracker => Src}/View/ComponentShape.h | 0 .../View/CoreParameterView.cpp | 9 +- .../View/CoreParameterView.h | 6 +- .../View/CoreParameterView.ui | 0 .../BioTracker => Src}/View/GLVideoView.cpp | 0 .../BioTracker => Src}/View/GLVideoView.h | 0 .../BioTracker => Src}/View/GraphicsScene.cpp | 0 .../BioTracker => Src}/View/GraphicsScene.h | 0 .../BioTracker => Src}/View/GraphicsView.cpp | 0 .../BioTracker => Src}/View/GraphicsView.h | 0 .../BioTracker => Src}/View/MainWindow.cpp | 47 +- .../BioTracker => Src}/View/MainWindow.h | 4 + .../BioTracker => Src}/View/MainWindow.ui | 22 +- .../View/NotificationLogBrowser.cpp | 0 .../View/NotificationLogBrowser.h | 0 Src/View/SettingsWindow.cpp | 74 ++ .../BioTracker => Src}/View/SettingsWindow.h | 18 +- .../BioTracker => Src}/View/SettingsWindow.ui | 0 .../View/TextureObjectView.cpp | 0 .../View/TextureObjectView.h | 0 .../View/TrackedComponentView.cpp | 0 .../View/TrackedComponentView.h | 0 .../View/TrackedImageView.cpp | 0 .../View/TrackedImageView.h | 0 .../View/Utility/RotationHandle.cpp | 0 .../View/Utility/RotationHandle.h | 0 .../View/Utility/SwitchButton.cpp | 0 .../View/Utility/SwitchButton.h | 0 .../View/Utility/Tracer.cpp | 0 .../BioTracker => Src}/View/Utility/Tracer.h | 0 .../View/VideoControllWidget.cpp | 0 .../View/VideoControllWidget.h | 0 .../View/VideoControllWidget.ui | 0 Src/cmake/FindPylon5.cmake | 69 ++ Src/cmake/Locate.cmake | 86 ++ Src/cmake/WIX/WIX.template.in | 59 ++ Src/cmake/WIX/licence.rtf | 665 ++++++++++++ Src/cmake/WinDeployQt5.cmake | 81 ++ .../BioTracker => Src}/guiresources.qrc | 0 Src/main.cpp | 85 ++ .../resources/arrow-back.png | Bin .../resources/arrow-forward1.png | Bin .../resources/arrows-skip-back.png | Bin .../resources/arrows-skip-forward.png | Bin .../resources/fullscreen.png | Bin .../resources/introduction/context_menus.txt | 0 .../introduction/images/BioTracker.PNG | Bin .../introduction/images/context_entity.png | Bin .../introduction/images/context_video.png | Bin .../introduction/images/right_panel.png | Bin .../introduction/images/toolbars.png | Bin .../introduction/images/tracking.png | Bin .../resources/introduction/intro.txt | 0 .../resources/introduction/right_panel.txt | 0 .../resources/introduction/toolbars.txt | 0 .../resources/introduction/tracking.txt | 0 .../resources/left_toolbar/add-track.png | Bin .../resources/left_toolbar/anno-arrow.png | Bin .../resources/left_toolbar/anno-del.png | Bin .../resources/left_toolbar/anno-ellipse.png | Bin .../resources/left_toolbar/anno-label.png | Bin .../resources/left_toolbar/anno-rect.png | Bin .../resources/left_toolbar/color-border.png | Bin .../resources/left_toolbar/color-fill.png | Bin .../resources/left_toolbar/delete-track.png | Bin .../resources/left_toolbar/select-all.png | Bin .../resources/left_toolbar/swap.png | Bin .../logo/BT-3_non_transparent_rounded.ico | Bin .../logo/BT-3_non_transparent_rounded.png | Bin .../resources/logo/BT3-big.ico | Bin .../resources/logo/BT3-big.png | Bin .../logo/BT3-big_non_transparent.ico | Bin .../logo/BT3-big_non_transparent.png | Bin .../resources/logo/BT3-small.png | Bin .../resources/logo/firstlogo.ico | Bin .../resources/logo/firstlogo.png | Bin .../BioTracker => Src}/resources/panZoom.png | Bin .../resources/pause-sign.png | Bin .../BioTracker => Src}/resources/record.png | Bin .../resources/recordCam.png | Bin .../resources/recording.png | Bin .../resources/recordingCam.png | Bin .../resources/screenshot.png | Bin .../resources/shortcuts.txt | 0 .../BioTracker => Src}/resources/stop.png | Bin .../resources/upper_toolbar/download.png | Bin .../resources/upper_toolbar/file-picture.png | Bin .../resources/upper_toolbar/file-play.png | Bin .../upper_toolbar/icons8-video-camera-26.png | Bin .../resources/upper_toolbar/redo2.png | Bin .../resources/upper_toolbar/save.png | Bin .../resources/upper_toolbar/tracker.png | Bin .../resources/upper_toolbar/tracker2.png | Bin .../resources/upper_toolbar/tracker3.png | Bin .../resources/upper_toolbar/tracker4.png | Bin .../resources/upper_toolbar/tracker5.png | Bin .../resources/upper_toolbar/undo2.png | Bin .../resources/upper_toolbar/upload.png | Bin .../resources/upper_toolbar/video-camera.png | Bin .../BioTracker => Src}/util/CLIcommands.cpp | 0 .../BioTracker => Src}/util/CLIcommands.h | 19 +- Src/util/Config.cpp | 133 +++ Src/util/Config.h | 45 + .../BioTracker => Src}/util/Exceptions.h | 0 .../settings => Src/util}/Messages.h | 0 .../BioTracker => Src}/util/PanZoomState.h | 0 .../BioTracker => Src}/util/ParamNames.h | 0 .../BioTracker => Src}/util/ScreenHelper.h | 0 .../BioTracker => Src}/util/VideoCoder.cpp | 12 +- .../BioTracker => Src}/util/VideoCoder.h | 11 +- .../CoreApp/BioTracker => Src}/util/stdext.h | 0 Src/util/types.h | 63 ++ 399 files changed, 2385 insertions(+), 15585 deletions(-) delete mode 100644 .gitignore.save create mode 100644 .gitlab-ci.yml delete mode 100644 .gitmodules delete mode 100644 BioTracker/CMakeLists.txt delete mode 100644 BioTracker/CoreApp/BioTracker/BioTracker.pro delete mode 100644 BioTracker/CoreApp/BioTracker/CMakeLists.txt delete mode 100644 BioTracker/CoreApp/BioTracker/Debug/BiotrackerCore.ini delete mode 100644 BioTracker/CoreApp/BioTracker/Model/PluginLoader.cpp delete mode 100644 BioTracker/CoreApp/BioTracker/Model/PluginLoader.h delete mode 100644 BioTracker/CoreApp/BioTracker/View/AreaDesciptor/AreaDescriptor.cpp delete mode 100644 BioTracker/CoreApp/BioTracker/View/SettingsWindow.cpp delete mode 100644 BioTracker/CoreApp/BioTracker/main.cpp delete mode 100644 BioTracker/CoreApp/BioTracker/util/types.h delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/BioTrackerInterfaces.pro delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/CMakeLists.txt delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/ENUMS.h delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IBioTrackerContext.cpp delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IBioTrackerContext.h delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IBioTrackerPlugin.cpp delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IBioTrackerPlugin.h delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IController/IController.cpp delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IController/IController.h delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModel.cpp delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModel.h delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelAreaDescriptor.cpp delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelAreaDescriptor.h delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelDataExporter.cpp delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelDataExporter.h delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedComponent.cpp delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedComponent.h delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedComponentFactory.cpp delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedComponentFactory.h delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedTrajectory.cpp delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedTrajectory.h delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackingAlgorithm.cpp delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackingAlgorithm.h delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IObject.cpp delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IObject.h delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/Serializable.cpp delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/Serializable.h delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IView.cpp delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IView.h delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewGraphicsPixmapItem.cpp delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewGraphicsPixmapItem.h delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewGraphicsScene.cpp delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewGraphicsScene.h delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewGraphicsView.cpp delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewGraphicsView.h delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewMainWindow.cpp delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewMainWindow.h delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewOpenGLWidget.cpp delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewOpenGLWidget.h delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewTrackedComponent.cpp delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewTrackedComponent.h delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewWidget.cpp delete mode 100644 BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewWidget.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/BioTrackerPlugin.cpp delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/BioTrackerPlugin.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/BioTrackerPlugin.json delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/BioTrackerPlugin.pro delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/CMakeLists.txt delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Controller/ControllerTrackedComponent.cpp delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Controller/ControllerTrackedComponent.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Controller/ControllerTrackingAlgorithm.cpp delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Controller/ControllerTrackingAlgorithm.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Controller/null_Controller.cpp delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Controller/null_Controller.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/BioTrackerTrackingAlgorithm.cpp delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/BioTrackerTrackingAlgorithm.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/Network/TcpListener.cpp delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/Network/TcpListener.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/TrackedComponentFactory.cpp delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/TrackedComponentFactory.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/TrackedElement.cpp delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/TrackedElement.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/TrackedTrajectory.cpp delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/TrackedTrajectory.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/pose/FishPose.cpp delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/pose/FishPose.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/pose/IPose.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackerParameter.cpp delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackerParameter.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/NN2dMapper.cpp delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/NN2dMapper.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/ParamNames.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobContour.cpp delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobContour.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobLibraryConfiguration.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobOperators.cpp delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobOperators.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobProperties.cpp delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobProperties.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobResult.cpp delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobResult.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/ComponentLabeling.cpp delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/ComponentLabeling.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/blob.cpp delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/blob.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/IDetector.cpp delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/IDetector.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/blob/BlobPose.cpp delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/blob/BlobPose.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/blob/cvBlob/BlobsDetector.cpp delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/blob/cvBlob/BlobsDetector.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/blob/simpleBlob/SimpleBlobsDetector.cpp delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/blob/simpleBlob/SimpleBlobsDetector.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/contour/ContourPose.cpp delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/contour/ContourPose.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/contour/ContoursDetector.cpp delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/contour/ContoursDetector.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/preprocessor/ImagePreProcessor.cpp delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/preprocessor/ImagePreProcessor.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/null_Model.cpp delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/Model/null_Model.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/PluginContext.cpp delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/PluginContext.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/View/TrackedElementView.cpp delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/View/TrackedElementView.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/View/TrackerParameterView.cpp delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/View/TrackerParameterView.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/View/TrackerParameterView.ui delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/biotrackerplugin_global.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/helper/CvHelper.cpp delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/helper/CvHelper.h delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/helper/StringHelper.cpp delete mode 100644 BioTracker/Plugin/BackgroundSubtraction/helper/StringHelper.h delete mode 100644 BioTracker/Plugin/LukasKanade/BioTrackerPlugin.cpp delete mode 100644 BioTracker/Plugin/LukasKanade/BioTrackerPlugin.h delete mode 100644 BioTracker/Plugin/LukasKanade/BioTrackerPlugin.json delete mode 100644 BioTracker/Plugin/LukasKanade/CMakeLists.txt delete mode 100644 BioTracker/Plugin/LukasKanade/Controller/ControllerTrackedComponent.cpp delete mode 100644 BioTracker/Plugin/LukasKanade/Controller/ControllerTrackedComponent.h delete mode 100644 BioTracker/Plugin/LukasKanade/Controller/ControllerTrackingAlgorithm.cpp delete mode 100644 BioTracker/Plugin/LukasKanade/Controller/ControllerTrackingAlgorithm.h delete mode 100644 BioTracker/Plugin/LukasKanade/Controller/null_Controller.cpp delete mode 100644 BioTracker/Plugin/LukasKanade/Controller/null_Controller.h delete mode 100644 BioTracker/Plugin/LukasKanade/Model/BioTrackerTrackingAlgorithm.cpp delete mode 100644 BioTracker/Plugin/LukasKanade/Model/BioTrackerTrackingAlgorithm.h delete mode 100644 BioTracker/Plugin/LukasKanade/Model/ParamNames.h delete mode 100644 BioTracker/Plugin/LukasKanade/Model/TrackerParameter.cpp delete mode 100644 BioTracker/Plugin/LukasKanade/Model/TrackerParameter.h delete mode 100644 BioTracker/Plugin/LukasKanade/Model/null_Model.cpp delete mode 100644 BioTracker/Plugin/LukasKanade/Model/null_Model.h delete mode 100644 BioTracker/Plugin/LukasKanade/PluginContext.cpp delete mode 100644 BioTracker/Plugin/LukasKanade/PluginContext.h delete mode 100644 BioTracker/Plugin/LukasKanade/View/TrackedElementView.cpp delete mode 100644 BioTracker/Plugin/LukasKanade/View/TrackedElementView.h delete mode 100644 BioTracker/Plugin/LukasKanade/View/TrackerParameterView.cpp delete mode 100644 BioTracker/Plugin/LukasKanade/View/TrackerParameterView.h delete mode 100644 BioTracker/Plugin/LukasKanade/View/TrackerParameterView.ui delete mode 100644 BioTracker/Plugin/LukasKanade/biotrackerplugin_global.h delete mode 100644 BioTracker/Utils/BioTrackerUtils/BioTrackerUtils.pro delete mode 100644 BioTracker/Utils/BioTrackerUtils/CMakeCommon/CMakeVSSugar.txt delete mode 100644 BioTracker/Utils/BioTrackerUtils/CMakeLists.txt delete mode 100644 BioTracker/Utils/BioTrackerUtils/TrackedComponents/TrackedComponentFactory.cpp delete mode 100644 BioTracker/Utils/BioTrackerUtils/TrackedComponents/TrackedComponentFactory.h delete mode 100644 BioTracker/Utils/BioTrackerUtils/TrackedComponents/TrackedElement.cpp delete mode 100644 BioTracker/Utils/BioTrackerUtils/TrackedComponents/TrackedElement.h delete mode 100644 BioTracker/Utils/BioTrackerUtils/TrackedComponents/TrackedTrajectory.cpp delete mode 100644 BioTracker/Utils/BioTrackerUtils/TrackedComponents/TrackedTrajectory.h delete mode 100644 BioTracker/Utils/BioTrackerUtils/settings/ParamNames.h delete mode 100644 BioTracker/Utils/BioTrackerUtils/settings/Settings.cpp delete mode 100644 BioTracker/Utils/BioTrackerUtils/settings/Settings.h delete mode 100644 BioTracker/Utils/BioTrackerUtils/settings/StringTranslator.cpp delete mode 100644 BioTracker/Utils/BioTrackerUtils/settings/StringTranslator.h delete mode 100644 BioTracker/Utils/BioTrackerUtils/settings/SystemCompatibilityCheck.cpp delete mode 100644 BioTracker/Utils/BioTrackerUtils/settings/SystemCompatibilityCheck.h delete mode 100644 BioTracker/Utils/BioTrackerUtils/util/CvHelper.cpp delete mode 100644 BioTracker/Utils/BioTrackerUtils/util/CvHelper.h delete mode 100644 BioTracker/Utils/BioTrackerUtils/util/Exceptions.h delete mode 100644 BioTracker/Utils/BioTrackerUtils/util/MutexWrapper.h delete mode 100644 BioTracker/Utils/BioTrackerUtils/util/PanZoomState.h delete mode 100644 BioTracker/Utils/BioTrackerUtils/util/QtRaiiWrapper.hpp delete mode 100644 BioTracker/Utils/BioTrackerUtils/util/ScreenHelper.h delete mode 100644 BioTracker/Utils/BioTrackerUtils/util/imagePreProcessor/IImageProcessor.h delete mode 100644 BioTracker/Utils/BioTrackerUtils/util/imagePreProcessor/ImagePreProcessor.h delete mode 100644 BioTracker/Utils/BioTrackerUtils/util/misc.cpp delete mode 100644 BioTracker/Utils/BioTrackerUtils/util/misc.h delete mode 100644 BioTracker/Utils/BioTrackerUtils/util/platform.h delete mode 100644 BioTracker/Utils/BioTrackerUtils/util/singleton.h delete mode 100644 BioTracker/Utils/BioTrackerUtils/util/stdext.h delete mode 100644 BioTracker/Utils/BioTrackerUtils/util/stringTools.cpp delete mode 100644 BioTracker/Utils/BioTrackerUtils/util/stringTools.h create mode 100644 CMakeLists.txt create mode 100644 Src/BioTracker.desktop rename {BioTracker/CoreApp/BioTracker => Src}/BioTracker3App.cpp (100%) rename {BioTracker/CoreApp/BioTracker => Src}/BioTracker3App.h (100%) create mode 100644 Src/CMakeLists.txt rename {BioTracker/CoreApp/BioTracker => Src}/Controller/ControllerAnnotations.cpp (99%) rename {BioTracker/CoreApp/BioTracker => Src}/Controller/ControllerAnnotations.h (94%) rename {BioTracker/CoreApp/BioTracker => Src}/Controller/ControllerAreaDescriptor.cpp (92%) rename {BioTracker/CoreApp/BioTracker => Src}/Controller/ControllerAreaDescriptor.h (91%) rename {BioTracker/CoreApp/BioTracker => Src}/Controller/ControllerCommands.cpp (99%) rename {BioTracker/CoreApp/BioTracker => Src}/Controller/ControllerCommands.h (96%) rename {BioTracker/CoreApp/BioTracker => Src}/Controller/ControllerCoreParameter.cpp (99%) rename {BioTracker/CoreApp/BioTracker => Src}/Controller/ControllerCoreParameter.h (89%) rename {BioTracker/CoreApp/BioTracker => Src}/Controller/ControllerDataExporter.cpp (85%) rename {BioTracker/CoreApp/BioTracker => Src}/Controller/ControllerDataExporter.h (90%) rename {BioTracker/CoreApp/BioTracker => Src}/Controller/ControllerGraphicScene.cpp (97%) rename {BioTracker/CoreApp/BioTracker => Src}/Controller/ControllerGraphicScene.h (94%) rename {BioTracker/CoreApp/BioTracker => Src}/Controller/ControllerMainWindow.cpp (92%) rename {BioTracker/CoreApp/BioTracker => Src}/Controller/ControllerMainWindow.h (97%) rename {BioTracker/CoreApp/BioTracker => Src}/Controller/ControllerNotifications.cpp (96%) rename {BioTracker/CoreApp/BioTracker => Src}/Controller/ControllerNotifications.h (90%) rename {BioTracker/CoreApp/BioTracker => Src}/Controller/ControllerPlayer.cpp (82%) rename {BioTracker/CoreApp/BioTracker => Src}/Controller/ControllerPlayer.h (89%) rename {BioTracker/CoreApp/BioTracker => Src}/Controller/ControllerPlugin.cpp (88%) rename {BioTracker/CoreApp/BioTracker => Src}/Controller/ControllerPlugin.h (97%) rename {BioTracker/CoreApp/BioTracker => Src}/Controller/ControllerTextureObject.cpp (98%) rename {BioTracker/CoreApp/BioTracker => Src}/Controller/ControllerTextureObject.h (96%) rename {BioTracker/CoreApp/BioTracker => Src}/Controller/ControllerTrackedComponentCore.cpp (99%) rename {BioTracker/CoreApp/BioTracker => Src}/Controller/ControllerTrackedComponentCore.h (96%) create mode 100644 Src/Controller/IControllerCfg.cpp create mode 100644 Src/Controller/IControllerCfg.h rename {BioTracker/CoreApp/BioTracker => Src}/Controller/null_Controller.cpp (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Controller/null_Controller.h (77%) rename {BioTracker/CoreApp/BioTracker => Src}/GuiContext.cpp (91%) rename {BioTracker/CoreApp/BioTracker => Src}/GuiContext.h (81%) rename {BioTracker/CoreApp/BioTracker => Src}/IStates/IPlayerState.cpp (100%) rename {BioTracker/CoreApp/BioTracker => Src}/IStates/IPlayerState.h (55%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/Annotations.cpp (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/Annotations.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/AreaDescriptor/AreaInfo.cpp (82%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/AreaDescriptor/AreaInfo.h (92%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/AreaDescriptor/AreaInfoElement.cpp (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/AreaDescriptor/AreaInfoElement.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/AreaDescriptor/AreaMemory.cpp (87%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/AreaDescriptor/AreaMemory.h (75%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/AreaDescriptor/Rectification.cpp (87%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/AreaDescriptor/Rectification.h (96%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/BioTracker3ProxyMat.cpp (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/BioTracker3ProxyMat.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/CoreParameter.cpp (93%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/CoreParameter.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/DataExporters/DataExporterCSV.cpp (95%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/DataExporters/DataExporterCSV.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/DataExporters/DataExporterGeneric.cpp (75%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/DataExporters/DataExporterGeneric.h (86%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/DataExporters/DataExporterJson.cpp (98%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/DataExporters/DataExporterJson.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/DataExporters/DataExporterSerialize.cpp (95%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/DataExporters/DataExporterSerialize.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/ImageStream.cpp (77%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/ImageStream.h (89%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/MediaPlayer.cpp (89%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/MediaPlayer.h (94%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.cpp (85%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h (89%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/MediaPlayerStateMachine/PlayerParameters.h (95%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/MediaPlayerStateMachine/PlayerStates/PStateGoToFrame.cpp (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/MediaPlayerStateMachine/PlayerStates/PStateGoToFrame.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/MediaPlayerStateMachine/PlayerStates/PStateInitial.cpp (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/MediaPlayerStateMachine/PlayerStates/PStateInitial.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/MediaPlayerStateMachine/PlayerStates/PStateInitialStream.cpp (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/MediaPlayerStateMachine/PlayerStates/PStateInitialStream.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/MediaPlayerStateMachine/PlayerStates/PStatePause.cpp (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/MediaPlayerStateMachine/PlayerStates/PStatePause.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/MediaPlayerStateMachine/PlayerStates/PStatePlay.cpp (80%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/MediaPlayerStateMachine/PlayerStates/PStatePlay.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/MediaPlayerStateMachine/PlayerStates/PStateStepBack.cpp (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/MediaPlayerStateMachine/PlayerStates/PStateStepBack.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/MediaPlayerStateMachine/PlayerStates/PStateStepForw.cpp (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/MediaPlayerStateMachine/PlayerStates/PStateStepForw.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/MediaPlayerStateMachine/PlayerStates/PStateWait.cpp (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/MediaPlayerStateMachine/PlayerStates/PStateWait.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/MediaPlayerStateMachine/PlayerStates/PStateWaite.cpp.autosave (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/MediaPlayerStateMachine/PlayerStates/PStateWaite.h.autosave (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/TextureObject.cpp (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/TextureObject.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/UndoCommands/TrackCommands.cpp (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/UndoCommands/TrackCommands.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/null_Model.cpp (100%) rename {BioTracker/CoreApp/BioTracker => Src}/Model/null_Model.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/AnnotationsView.cpp (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/AnnotationsView.h (100%) create mode 100644 Src/View/AreaDesciptor/AreaDescriptor.cpp rename {BioTracker/CoreApp/BioTracker => Src}/View/AreaDesciptor/AreaDescriptor.h (79%) rename {BioTracker/CoreApp/BioTracker => Src}/View/AreaDesciptor/EllipseDescriptor.cpp (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/AreaDesciptor/EllipseDescriptor.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/AreaDesciptor/RectDescriptor.cpp (88%) rename {BioTracker/CoreApp/BioTracker => Src}/View/AreaDesciptor/RectDescriptor.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/CameraDevice.cpp (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/CameraDevice.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/CameraDevice.ui (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/ComponentShape.cpp (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/ComponentShape.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/CoreParameterView.cpp (96%) rename {BioTracker/CoreApp/BioTracker => Src}/View/CoreParameterView.h (98%) rename {BioTracker/CoreApp/BioTracker => Src}/View/CoreParameterView.ui (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/GLVideoView.cpp (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/GLVideoView.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/GraphicsScene.cpp (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/GraphicsScene.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/GraphicsView.cpp (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/GraphicsView.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/MainWindow.cpp (93%) rename {BioTracker/CoreApp/BioTracker => Src}/View/MainWindow.h (95%) rename {BioTracker/CoreApp/BioTracker => Src}/View/MainWindow.ui (99%) rename {BioTracker/CoreApp/BioTracker => Src}/View/NotificationLogBrowser.cpp (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/NotificationLogBrowser.h (100%) create mode 100644 Src/View/SettingsWindow.cpp rename {BioTracker/CoreApp/BioTracker => Src}/View/SettingsWindow.h (57%) rename {BioTracker/CoreApp/BioTracker => Src}/View/SettingsWindow.ui (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/TextureObjectView.cpp (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/TextureObjectView.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/TrackedComponentView.cpp (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/TrackedComponentView.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/TrackedImageView.cpp (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/TrackedImageView.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/Utility/RotationHandle.cpp (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/Utility/RotationHandle.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/Utility/SwitchButton.cpp (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/Utility/SwitchButton.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/Utility/Tracer.cpp (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/Utility/Tracer.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/VideoControllWidget.cpp (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/VideoControllWidget.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/View/VideoControllWidget.ui (100%) create mode 100644 Src/cmake/FindPylon5.cmake create mode 100644 Src/cmake/Locate.cmake create mode 100644 Src/cmake/WIX/WIX.template.in create mode 100644 Src/cmake/WIX/licence.rtf create mode 100644 Src/cmake/WinDeployQt5.cmake rename {BioTracker/CoreApp/BioTracker => Src}/guiresources.qrc (100%) create mode 100644 Src/main.cpp rename {BioTracker/CoreApp/BioTracker => Src}/resources/arrow-back.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/arrow-forward1.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/arrows-skip-back.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/arrows-skip-forward.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/fullscreen.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/introduction/context_menus.txt (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/introduction/images/BioTracker.PNG (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/introduction/images/context_entity.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/introduction/images/context_video.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/introduction/images/right_panel.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/introduction/images/toolbars.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/introduction/images/tracking.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/introduction/intro.txt (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/introduction/right_panel.txt (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/introduction/toolbars.txt (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/introduction/tracking.txt (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/left_toolbar/add-track.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/left_toolbar/anno-arrow.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/left_toolbar/anno-del.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/left_toolbar/anno-ellipse.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/left_toolbar/anno-label.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/left_toolbar/anno-rect.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/left_toolbar/color-border.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/left_toolbar/color-fill.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/left_toolbar/delete-track.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/left_toolbar/select-all.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/left_toolbar/swap.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/logo/BT-3_non_transparent_rounded.ico (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/logo/BT-3_non_transparent_rounded.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/logo/BT3-big.ico (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/logo/BT3-big.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/logo/BT3-big_non_transparent.ico (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/logo/BT3-big_non_transparent.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/logo/BT3-small.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/logo/firstlogo.ico (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/logo/firstlogo.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/panZoom.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/pause-sign.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/record.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/recordCam.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/recording.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/recordingCam.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/screenshot.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/shortcuts.txt (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/stop.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/upper_toolbar/download.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/upper_toolbar/file-picture.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/upper_toolbar/file-play.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/upper_toolbar/icons8-video-camera-26.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/upper_toolbar/redo2.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/upper_toolbar/save.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/upper_toolbar/tracker.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/upper_toolbar/tracker2.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/upper_toolbar/tracker3.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/upper_toolbar/tracker4.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/upper_toolbar/tracker5.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/upper_toolbar/undo2.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/upper_toolbar/upload.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/resources/upper_toolbar/video-camera.png (100%) rename {BioTracker/CoreApp/BioTracker => Src}/util/CLIcommands.cpp (100%) rename {BioTracker/CoreApp/BioTracker => Src}/util/CLIcommands.h (77%) create mode 100644 Src/util/Config.cpp create mode 100644 Src/util/Config.h rename {BioTracker/CoreApp/BioTracker => Src}/util/Exceptions.h (100%) rename {BioTracker/Utils/BioTrackerUtils/settings => Src/util}/Messages.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/util/PanZoomState.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/util/ParamNames.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/util/ScreenHelper.h (100%) rename {BioTracker/CoreApp/BioTracker => Src}/util/VideoCoder.cpp (88%) rename {BioTracker/CoreApp/BioTracker => Src}/util/VideoCoder.h (89%) rename {BioTracker/CoreApp/BioTracker => Src}/util/stdext.h (100%) create mode 100644 Src/util/types.h diff --git a/.gitignore b/.gitignore index 129cebfa..8b9398b8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ GeneratedFiles/ -CMakeLists.txt.user desktop.ini *.swp *.opensdf @@ -16,12 +15,10 @@ desktop.ini .gitignore.swp *.bak_* *.ini -*.json # ignore editor ~ files .tags* Doxyfile -CMakeCache.txt Makefile cmake_install.cmake doxygen_sqlite3.db @@ -58,7 +55,6 @@ doxygen_sqlite3.db *.db *.opendb CMakeFiles -*.txt /BioTracker/*.vspx *.cache *.csv diff --git a/.gitignore.save b/.gitignore.save deleted file mode 100644 index 48e435b2..00000000 --- a/.gitignore.save +++ /dev/null @@ -1,43 +0,0 @@ -BioTracker/Interfaces/build-BioTrackerInterfaces-BioTracker-Debug/ - -GeneratedFiles/ -CMakeLists.txt.user -desktop.ini -*.swp -*.opensdf -*.sdf -*.suo -*.exe -*.psess -*.vsp -*.ipch -*.sln -*.vcxproj -*.vcxproj.filters -*.vcxproj.vspscc -.gitignore.swp -*.bak_* -BioTracker.apparmor -CMakeLists.txt.user.3.2-pre1 -manifest.json - -# ignore editor ~ files -.tags* -Doxyfile -CMakeCache.txt -Makefile -cmake_install.cmake -doxygen_sqlite3.db -*~ -.idea/ - -/CMakeFiles -/doc -/html -/Debug -/Release -/build -*.kate-swp - -# astyle original files -*.orig diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 00000000..078bff54 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,115 @@ +stages: + - build + - package + +.base ubuntu-18.04: &base_ubuntu_18_04 + tags: [ linux, docker ] + image: git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker:ubuntu-18.04 + +.base windows: &base_windows + tags: [ windows, docker ] + image: git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker:windows + +build ubuntu-18.04: + stage: build + <<: *base_ubuntu_18_04 + variables: + CC: gcc-8 + CXX: g++-8 + artifacts: + paths: + - dependencies + - build + expire_in: 1 day + before_script: + - 'curl -o artifacts.zip --header "JOB-TOKEN: $CI_JOB_TOKEN" "https://git.imp.fu-berlin.de/api/v4/projects/3608/jobs/artifacts/master/download?job=package%20ubuntu-18.04"' + - 7z e artifacts.zip + - 'curl -o artifacts.zip --header "JOB-TOKEN: $CI_JOB_TOKEN" "https://git.imp.fu-berlin.de/api/v4/projects/3610/jobs/artifacts/master/download?job=package%20ubuntu-18.04"' + - 7z e artifacts.zip + - 'curl -o artifacts.zip --header "JOB-TOKEN: $CI_JOB_TOKEN" "https://git.imp.fu-berlin.de/api/v4/projects/3474/jobs/artifacts/master/download?job=package%20ubuntu-18.04"' + - 7z e artifacts.zip + - 7z e '*.tar.xz' -y; rm *.tar.xz; 7z x '*.tar'; rm *.tar + - mkdir dependencies + - name='BT_Interfaces'; mv $name-* dependencies/$name + - name='BT_Utility'; mv $name-* dependencies/$name + - name='RF_behavior_loader'; mv $name-* dependencies/$name + - export CMAKE_PREFIX_PATH="$(pwd)/dependencies" + script: + - cmake -Bbuild -H. -DCMAKE_BUILD_TYPE=Release -G Ninja -DCMAKE_PREFIX_PATH="dependencies" + - ninja -C build + +build windows: + stage: build + <<: *base_windows + artifacts: + paths: + - build + - dependencies + expire_in: 1 day + before_script: + - 'curl.exe -o artifacts.zip --header "JOB-TOKEN: $CI_JOB_TOKEN" "https://git.imp.fu-berlin.de/api/v4/projects/3608/jobs/artifacts/master/download?job=package%20windows"' + - 7z e artifacts.zip + - 'curl.exe -o artifacts.zip --header "JOB-TOKEN: $CI_JOB_TOKEN" "https://git.imp.fu-berlin.de/api/v4/projects/3610/jobs/artifacts/master/download?job=package%20windows"' + - 7z e artifacts.zip + - 'curl.exe -o artifacts.zip --header "JOB-TOKEN: $CI_JOB_TOKEN" "https://git.imp.fu-berlin.de/api/v4/projects/3474/jobs/artifacts/master/download?job=package%20windows"' + - 7z e artifacts.zip + - 7z e *.tar.xz; Remove-Item -Force *.tar.xz; 7z x *.tar; Remove-Item -Force *.tar + - New-Item -ItemType Directory -Force 'dependencies' + - $name='BT_Interfaces'; Move-Item -Force "$name-*" dependencies/$name + - $name='BT_Utility'; Move-Item -Force "$name-*" dependencies/$name + - $name='RF_behavior_loader'; Move-Item -Force "$name-*" dependencies/$name + - $env:PACKAGE_DIR = ("$env:TMP/pkg" -Replace "\\","/") + - $wd = (Get-Item -Path '.').FullName + - $env:CMAKE_PREFIX_PATH="$wd/dependencies;$env:VCPKG_INSTALL_DIR" + - $env:PATH += ";$env:VCPKG_INSTALL_DIR/bin;$wd/dependencies/BT_Interfaces/bin/" + - C:/VsDevEnv.ps1 -arch=amd64 + script: + - cmake -Bbuild "-H." -DCMAKE_BUILD_TYPE=Release -G Ninja -DCMAKE_PREFIX_PATH="$Env:VCPKG_INSTALL_DIR" -DCPACK_PACKAGE_DIRECTORY="$env:package_dir" -DPACKAGE_WINDOWS_MSI=ON -DINSTALL_SHARED_LIBRARIES='bt_interfaces;jpeg62;libpng16;tiff;flang;flangrti;libomp;zlib1;openblas;lzma;boost_system*;boost_program_options*;boost_filesystem*' -DINSTALL_OPENCV_COMPONENTS='calib3d;videoio;imgcodecs;imgproc;core;ffmpeg;features2d;flann' -DCMAKE_SUPPRESS_REGENERATION=ON -DCMAKE_SKIP_PACKAGE_ALL_DEPENDENCY=ON + - ninja -C build + +.package windows: &package_windows + stage: package + artifacts: + paths: + - build/*.msi + expire_in: 1 week + +package windows: + <<: *base_windows + dependencies: + - build windows + <<: *package_windows + before_script: + - $env:PACKAGE_DIR = ("$env:TMP/pkg" -Replace "\\","/") + - $wd = (Get-Item -Path '.').FullName + - $env:PATH += ";$env:VCPKG_INSTALL_DIR/bin;$wd/dependencies/BT_Interfaces/bin" + script: + - ninja -C build package + - Copy-Item "$env:package_dir/*" build -Recurse + + +package ubuntu-18.04: + stage: package + tags: [ linux, docker_privileged ] + image: git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker:ubuntu-18.04 + dependencies: + - build ubuntu-18.04 + artifacts: + paths: + - build/*.AppImage + expire_in: 1 week + before_script: + - apt-get update + - apt-get install -y fuse + - curl -sSL -o /usr/local/bin/linuxdeployqt https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage + - chmod +x /usr/local/bin/linuxdeployqt + script: + - mkdir -p build/appdir/usr/bin + - mkdir -p build/appdir/usr/share/applications + - mkdir -p build/appdir/usr/share/icons/hicolor/256x256 + - cp build/Src/BioTracker build/appdir/usr/bin + - cp Src/BioTracker.desktop build/appdir/usr/share/applications + - cp Src/resources/logo/BT3-big.png build/appdir/usr/share/icons/hicolor/256x256 + - cd build + - linuxdeployqt appdir/usr/share/applications/BioTracker.desktop -appimage -no-translations + diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index e69de29b..00000000 diff --git a/BioTracker/CMakeLists.txt b/BioTracker/CMakeLists.txt deleted file mode 100644 index 9e50bfda..00000000 --- a/BioTracker/CMakeLists.txt +++ /dev/null @@ -1,39 +0,0 @@ -cmake_minimum_required(VERSION 3.0) -#(Minimal benötigte CMake-Version wenn z.B. bestimmte CMake-Kommandos benutzt werden) - -cmake_policy(SET CMP0020 NEW) -cmake_policy(SET CMP0054 NEW) - -# Der Projektname -project(Biotracker) - -set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTOUIC ON) -set(CMAKE_AUTORCC ON) - -find_package(Qt5 REQUIRED Core Gui Xml Network Widgets OpenGL Multimedia MultimediaWidgets) -find_package(OpenCV REQUIRED) -set (QT_DIR_CMAKE $ENV{QT_DIR}) - -set(HMNVLibDir "Not Found" CACHE FILEPATH "") - -find_package(Boost REQUIRED system filesystem chrono thread timer program_options) - -exec_program("git" ${CMAKE_CURRENT_SOURCE_DIR} ARGS "log --pretty=format:%h -n 1" OUTPUT_VARIABLE VERSION ) -add_definitions( -DGIT_HASH="${VERSION}" ) -message(STATUS "Configured git hash=${VERSION}") -message(STATUS "Configured CV version=${OpenCV_VERSION}") -message(STATUS "Configured QT version=${Qt5Core_VERSION}") -add_definitions( -DMyQT_VERSION="${Qt5Core_VERSION}" ) -add_definitions( -DMyCV_VERSION="${OpenCV_VERSION}" ) -add_definitions( -DMyBT_VERSION="${Boost_LIB_VERSION}" ) - - -add_subdirectory(Interfaces/BioTrackerInterfaces) -add_subdirectory(Utils/BioTrackerUtils) -add_subdirectory(Plugin/BackgroundSubtraction) -add_subdirectory(Plugin/LukasKanade) -add_subdirectory(CoreApp/BioTracker) - - - diff --git a/BioTracker/CoreApp/BioTracker/BioTracker.pro b/BioTracker/CoreApp/BioTracker/BioTracker.pro deleted file mode 100644 index 57950d21..00000000 --- a/BioTracker/CoreApp/BioTracker/BioTracker.pro +++ /dev/null @@ -1,146 +0,0 @@ -#------------------------------------------------- -# -# Project created by QtCreator 2016-11-18T19:15:02 -# by Andreas Jörg -# -#------------------------------------------------- - -QT += core gui - -greaterThan(QT_MAJOR_VERSION, 4): QT += widgets -QT += opengl -QT += multimedia -QT += multimediawidgets - - -TARGET = BioTracker -TEMPLATE = app - -LIBS += -L/usr/include/boost -lboost_system -#LIBS += -L/usr/include/boost -lboost_chrono -#LIBS += -L/usr/include/boost -lboost_thread -#LIBS += -L/usr/include/boost -lboost_timer -LIBS += -L/usr/include/boost -lboost_filesystem - -INCLUDEPATH += /usr/local/include/opencv -LIBS += -L/usr/local/lib \ --lopencv_core \ --lopencv_imgproc \ --lopencv_highgui \ --lopencv_ml \ --lopencv_video \ --lopencv_features2d \ --lopencv_calib3d \ --lopencv_objdetect \ --lopencv_contrib \ --lopencv_legacy \ --lopencv_flann - - -SOURCES += main.cpp\ - BioTracker3App.cpp \ - GuiContext.cpp \ - Controller/ControllerGraphicScene.cpp \ - Controller/ControllerMainWindow.cpp \ - Controller/ControllerPlayer.cpp \ - Controller/ControllerTextureObject.cpp \ - Model/BioTracker3ProxyMat.cpp \ - Model/null_Model.cpp \ - View/GraphicsScene.cpp \ - View/GraphicsView.cpp \ - View/TrackedImageView.cpp \ - Model/PluginLoader.cpp \ - View/CameraDevice.cpp \ - Controller/null_Controller.cpp \ - Controller/ControllerPlugin.cpp \ - View/MainWindow.cpp \ - View/VideoControllWidget.cpp \ - View/GLVideoView.cpp \ - Model/ImageStream.cpp \ - Model/TextureObject.cpp \ - View/TextureObjectView.cpp \ - IStates/IPlayerState.cpp \ - Model/MediaPlayerStateMachine/PlayerStates/PStateGoToFrame.cpp \ - Model/MediaPlayerStateMachine/PlayerStates/PStateInitial.cpp \ - Model/MediaPlayerStateMachine/PlayerStates/PStateInitialStream.cpp \ - Model/MediaPlayerStateMachine/PlayerStates/PStatePause.cpp \ - Model/MediaPlayerStateMachine/PlayerStates/PStatePlay.cpp \ - Model/MediaPlayerStateMachine/PlayerStates/PStateStepBack.cpp \ - Model/MediaPlayerStateMachine/PlayerStates/PStateStepForw.cpp \ - Model/MediaPlayerStateMachine/PlayerStates/PStateWait.cpp \ - Model/MediaPlayerStateMachine/MediaPlayerStateMachine.cpp \ - Model/MediaPlayer.cpp - -HEADERS += BioTracker3App.h \ - GuiContext.h \ - Controller/ControllerGraphicScene.h \ - Controller/ControllerMainWindow.h \ - Controller/ControllerPlayer.h \ - Controller/ControllerTextureObject.h \ - Model/BioTracker3ProxyMat.h \ - Model/null_Model.h \ - View/GraphicsScene.h \ - View/GraphicsView.h \ - View/TrackedImageView.h \ - Model/PluginLoader.h \ - View/CameraDevice.h \ - Controller/null_Controller.h \ - Controller/ControllerPlugin.h \ - View/MainWindow.h \ - View/VideoControllWidget.h \ - View/GLVideoView.h \ - Model/ImageStream.h \ - Model/TextureObject.h \ - View/TextureObjectView.h \ - IStates/IPlayerState.h \ - Model/MediaPlayerStateMachine/PlayerStates/PStateGoToFrame.h \ - Model/MediaPlayerStateMachine/PlayerStates/PStateInitial.h \ - Model/MediaPlayerStateMachine/PlayerStates/PStateInitialStream.h \ - Model/MediaPlayerStateMachine/PlayerStates/PStatePause.h \ - Model/MediaPlayerStateMachine/PlayerStates/PStatePlay.h \ - Model/MediaPlayerStateMachine/PlayerStates/PStateStepBack.h \ - Model/MediaPlayerStateMachine/PlayerStates/PStateStepForw.h \ - Model/MediaPlayerStateMachine/PlayerStates/PStateWait.h \ - Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h \ - Model/MediaPlayer.h \ - Model/MediaPlayerStateMachine/PlayerParameters.h - -FORMS += \ - View/CameraDevice.ui \ - View/MainWindow.ui \ - View/VideoControllWidget.ui - -RESOURCES += \ - guiresources.qrc - - - -# Include the BioTrackerInterfaces Library -win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../Interfaces/build-BioTrackerInterfaces-Desktop-Debug/release/ -lBioTrackerInterfaces -else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../Interfaces/build-BioTrackerInterfaces-Desktop-Debug/debug/ -lBioTrackerInterfaces -else:unix: LIBS += -L$$PWD/../../Interfaces/build-BioTrackerInterfaces-Desktop-Debug/ -lBioTrackerInterfaces - -INCLUDEPATH += $$PWD/../../Interfaces/BioTrackerInterfaces -DEPENDPATH += $$PWD/../../Interfaces/BioTrackerInterfaces - -win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/../../Interfaces/build-BioTrackerInterfaces-Desktop-Debug/release/libBioTrackerInterfaces.a -else:win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/../../Interfaces/build-BioTrackerInterfaces-Desktop-Debug/debug/libBioTrackerInterfaces.a -else:win32:!win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/../../Interfaces/build-BioTrackerInterfaces-Desktop-Debug/release/BioTrackerInterfaces.lib -else:win32:!win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/../../Interfaces/build-BioTrackerInterfaces-Desktop-Debug/debug/BioTrackerInterfaces.lib -else:unix: PRE_TARGETDEPS += $$PWD/../../Interfaces/build-BioTrackerInterfaces-Desktop-Debug/libBioTrackerInterfaces.a - - -# Include the BioTrackerUtils Library - -win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../Utils/build-BioTrackerUtils-Desktop-Debug/release/ -lBioTrackerUtils -else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../Utils/build-BioTrackerUtils-Desktop-Debug/debug/ -lBioTrackerUtils -else:unix: LIBS += -L$$PWD/../../Utils/build-BioTrackerUtils-Desktop-Debug/ -lBioTrackerUtils - -INCLUDEPATH += $$PWD/../../Utils/BioTrackerUtils -DEPENDPATH += $$PWD/../../Utils/BioTrackerUtils - -win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/../../Utils/build-BioTrackerUtils-Desktop-Debug/release/libBioTrackerUtils.a -else:win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/../../Utils/build-BioTrackerUtils-Desktop-Debug/debug/libBioTrackerUtils.a -else:win32:!win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/../../Utils/build-BioTrackerUtils-Desktop-Debug/release/BioTrackerUtils.lib -else:win32:!win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/../../Utils/build-BioTrackerUtils-Desktop-Debug/debug/BioTrackerUtils.lib -else:unix: PRE_TARGETDEPS += $$PWD/../../Utils/build-BioTrackerUtils-Desktop-Debug/libBioTrackerUtils.a diff --git a/BioTracker/CoreApp/BioTracker/CMakeLists.txt b/BioTracker/CoreApp/BioTracker/CMakeLists.txt deleted file mode 100644 index 17fdb7da..00000000 --- a/BioTracker/CoreApp/BioTracker/CMakeLists.txt +++ /dev/null @@ -1,30 +0,0 @@ -############################################################## -#### Biotracker: Core -############################################################## - -list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/cmake) - - -# Visual studio out-of-source friendly source groups -include(${util_cmakes}CMakeVSSugar.txt) - -message("Configuring Biotracker_core..." ) -set(EXE_NAME Biotracker_core) -add_executable(${EXE_NAME} ${_util_source_list} guiresources.qrc) -include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${Boost_INCLUDE_DIRS}) -target_link_libraries (${EXE_NAME} Qt5::Core Qt5::Gui Qt5::Xml Qt5::Network Qt5::Widgets) -target_link_libraries (${EXE_NAME} Qt5::Multimedia Qt5::MultimediaWidgets Qt5::OpenGL ) -target_link_libraries(${EXE_NAME} Biotracker_interfaces Biotracker_utility) -target_link_libraries(${EXE_NAME} ${OpenCV_LIBRARIES} ${Boost_LIBRARIES}) -IF("${HMNVLibDir}" MATCHES "Not Found") -ELSE() - target_link_libraries(${EXE_NAME} ${HMNVLibDir}/lib/NvEncInterace.lib) - target_compile_definitions(${EXE_NAME} PRIVATE WITH_CUDA=1) -ENDIF() - -set_target_properties(${EXE_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON) -set_target_properties(${EXE_NAME} PROPERTIES - CXX_STANDARD 17 - CXX_STANDARD_REQUIRED YES - CXX_EXTENSIONS NO -) \ No newline at end of file diff --git a/BioTracker/CoreApp/BioTracker/Debug/BiotrackerCore.ini b/BioTracker/CoreApp/BioTracker/Debug/BiotrackerCore.ini deleted file mode 100644 index 7aac3255..00000000 --- a/BioTracker/CoreApp/BioTracker/Debug/BiotrackerCore.ini +++ /dev/null @@ -1,8 +0,0 @@ -{ - "BiotrackerCore\/DataExporter": "0", - "BiotrackerCore\/FrameStride": "1", - "BiotrackerCore\/CodecUsed": "0", - "BiotrackerCore\/DropFrames": "false", - "BiotrackerCore\/RecordScaledOutput": "false", - "BiotrackerCore\/GPU_QP": "15" -} diff --git a/BioTracker/CoreApp/BioTracker/Model/PluginLoader.cpp b/BioTracker/CoreApp/BioTracker/Model/PluginLoader.cpp deleted file mode 100644 index 9d5fa933..00000000 --- a/BioTracker/CoreApp/BioTracker/Model/PluginLoader.cpp +++ /dev/null @@ -1,101 +0,0 @@ -#include "PluginLoader.h" -#include "QDebug" -#include - -PluginLoader::PluginLoader(QObject* parent) : - IModel(parent) { - - m_isPluginLoaded = false; - m_currentPluginName = ""; - m_PluginLoader = new QPluginLoader(this); - - m_PluginListModel = new QStringListModel(); - m_PluginListModel->setStringList(m_PluginList); -} - -void PluginLoader::addToPluginList(QString filename) { - - bool isLib = QLibrary::isLibrary(filename); - - if (isLib) { - - QPluginLoader loader; - loader.setFileName(filename); - QJsonValue pluginMeda(loader.metaData().value("MetaData")); - QJsonObject metaObj = pluginMeda.toObject(); - QString mstring = metaObj.value("name").toString(); - if (!m_PluginList.contains(mstring)) - m_PluginList.append(mstring); - m_PluginListModel->setStringList(m_PluginList); - m_PluginMap.insert(std::pair(mstring, filename)); - } - else { - std::cout << "Error reading plugin: " << filename.toStdString() << std::endl; - } -} - -bool PluginLoader::loadPluginFromFilename(QString filename) { - bool retval = false; - - if (m_PluginLoader->isLoaded()) { - m_PluginLoader->unload(); - } - - bool isLib = QLibrary::isLibrary(filename); - - if (isLib) { - - m_PluginLoader->setFileName(filename); - QString name = readMetaDataFromPlugin(); - m_currentPluginName = name; - m_PluginMap.insert(std::pair(name, filename)); - retval = true; - } - else { - retval = false; - } - - qDebug() << "CORE: Plugin loaded: " << m_PluginLoader->fileName(); - - m_isPluginLoaded = retval; - - return retval; -} - -bool PluginLoader::loadPluginFromName(QString name) { - QString filename = m_PluginMap.find(name)->second; - return loadPluginFromFilename(filename); -} - -IBioTrackerPlugin* PluginLoader::getPluginInstance() { - return qobject_cast(m_PluginLoader->instance()); -} - -QStringListModel* PluginLoader::getPluginMetaData() { - return m_PluginListModel; -} - -bool PluginLoader::getIsPluginLoaded() { - return m_isPluginLoaded; -} - -QString PluginLoader::getCurrentPluginName() { - return m_currentPluginName; -} - -const std::map &PluginLoader::getPluginMap() const -{ - return m_PluginMap; -} - -QString PluginLoader::readMetaDataFromPlugin() { - QJsonValue pluginMeda(m_PluginLoader->metaData().value("MetaData")); - QJsonObject metaObj = pluginMeda.toObject(); - QString mstring = metaObj.value("name").toString(); - - if (!m_PluginList.contains(mstring)) - m_PluginList.append(mstring); - m_PluginListModel->setStringList(m_PluginList); - return mstring; -} - diff --git a/BioTracker/CoreApp/BioTracker/Model/PluginLoader.h b/BioTracker/CoreApp/BioTracker/Model/PluginLoader.h deleted file mode 100644 index f7e91037..00000000 --- a/BioTracker/CoreApp/BioTracker/Model/PluginLoader.h +++ /dev/null @@ -1,95 +0,0 @@ -/**************************************************************************** - ** - ** This file is part of the BioTracker Framework - ** by Andreas Jörg - ** - ****************************************************************************/ - -#ifndef PLUGINLOADER_H -#define PLUGINLOADER_H - -#include "Interfaces/IModel/IModel.h" -#include "QPluginLoader" -#include "QStringListModel" -#include "Interfaces/IBioTrackerPlugin.h" -#include "QPointer" - -/** - * The PluginLoader class is a IModel class. It is responsible for managing BioTracker Plugins. - * It can load them and it sends a list of all loaded Plugin names to the a selection box in the MainWindow. - */ -class PluginLoader : public IModel { - Q_OBJECT - public: - explicit PluginLoader(QObject* parent = 0); - - /** - * Loads a file as a QT plugin and reads it's name from the metadata. - * It will then be added to the stringlist and is selectable via "loadPluginFromName". - * This function does not actually set the plugin instance. - */ - void addToPluginList(QString p); - - /** - * Loads a BioTracker Plugin from a filpaht. It returns true if the Plugin could be loaded, otherwise false. - */ - bool loadPluginFromFilename(QString filename); - - /** - * Loads a plugin from it's name (given in the metadata) instead of the filename. - * Only works if it is already known to the pluginloader, i.e. was loaded manually or automatically before or - * or has been added to the pluginlist via "addToPluginList" - */ - bool loadPluginFromName(QString name); - - /** - * Returns the Instance of the BioTracker Plugin. - */ - IBioTrackerPlugin* getPluginInstance(); - - /** - * Returns a QStrinListModel with the names of all loaded Plugins. - */ - QStringListModel* getPluginMetaData(); - - // Is a plugin loaded or not? - bool getIsPluginLoaded(); - - // Gets the name of the currently loaded plugin - QString getCurrentPluginName(); - - /** - * Returns a map containing the mapping "plugin name -> filename" - */ - std::map const& getPluginMap() const; - -private: - - //a map containing the mapping "plugin name -> filename" - std::map m_PluginMap; - - //nomen est omen - bool m_isPluginLoaded; - - //Name of the currently loaded plugin - QString m_currentPluginName; - - /** - * Gets the metadata from the currently loaded plugin. - * Currently this is nothing but the advertised name of the plugin - */ - QString readMetaDataFromPlugin(); - - // The QT object to actually load the plugins - QPluginLoader* m_PluginLoader; - - // List of all available plugins - QStringList m_PluginList; - - // Entire ListModel of the metadata (actually containing all metadata, not only name) - QStringListModel* m_PluginListModel; - - -}; - -#endif // PLUGINLOADER_H diff --git a/BioTracker/CoreApp/BioTracker/View/AreaDesciptor/AreaDescriptor.cpp b/BioTracker/CoreApp/BioTracker/View/AreaDesciptor/AreaDescriptor.cpp deleted file mode 100644 index 1fa1420a..00000000 --- a/BioTracker/CoreApp/BioTracker/View/AreaDesciptor/AreaDescriptor.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#include "AreaDescriptor.h" - - - -AreaDescriptor::~AreaDescriptor() -{ -} diff --git a/BioTracker/CoreApp/BioTracker/View/SettingsWindow.cpp b/BioTracker/CoreApp/BioTracker/View/SettingsWindow.cpp deleted file mode 100644 index 2fa35b7e..00000000 --- a/BioTracker/CoreApp/BioTracker/View/SettingsWindow.cpp +++ /dev/null @@ -1,89 +0,0 @@ -#include "SettingsWindow.h" - -#include "settings/Settings.h" - -#include - -SettingsWindow::SettingsWindow(QWidget *parent) : - QWidget(parent), - ui(new Ui::SettingsForm) -{ - ui->setupUi(this); - - for (int i=0; icomboBoxVideoCodec->addItem(codecList[i].first.c_str()); - - BioTracker::Core::Settings *set = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); - int defaultIndex = set->getValueOrDefault(CFG_CODEC, 0); - ui->comboBoxVideoCodec->setCurrentIndex(defaultIndex); - - bool dropFrames = set->getValueOrDefault(CFG_DROPFRAMES, false); - ui->checkBoxDropFrames->setChecked(dropFrames); - - bool recordScaled = set->getValueOrDefault(CFG_RECORDSCALEDOUT, false); - ui->checkBox_scaledOutput->setChecked(recordScaled); - - - for (int i = 0; icomboBoxDefaultExporter->addItem(exporterList[i].c_str()); - - int exporter = set->getValueOrDefault(CFG_EXPORTER, 0); - ui->comboBoxDefaultExporter->setCurrentIndex(exporter); - - - ui->lineEdit_nthFrame->setValidator(new QIntValidator(this)); - int stride = set->getValueOrDefault(CFG_INPUT_FRAME_STRIDE, CFG_INPUT_FRAME_STRIDE_VAL); - ui->lineEdit_nthFrame->setText(std::to_string(stride).c_str()); - - ui->lineEdit_qp->setValidator(new QIntValidator(this)); - int qp = set->getValueOrDefault(CFG_GPU_QP, CFG_GPU_QP_VAL); - ui->lineEdit_qp->setText(std::to_string(qp).c_str()); - - std::string locStr= set->getValueOrDefault(CFG_DEFAULT_LOC_MAN_SAVE, CFG_DEFAULT_LOC_MAN_SAVE_VAL); - ui->lineEditLocationManSave->setText(QString::fromStdString(locStr)); - -#ifndef WITH_CUDA - ui->lineEdit_qp->setVisible(false); - ui->label_qp->setVisible(false); -#endif -} - -void SettingsWindow::on_buttonSaveClose_clicked() { - - BioTracker::Core::Settings *set = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); - bool recordScaled = ui->checkBox_scaledOutput->isChecked(); - set->setParam(CFG_RECORDSCALEDOUT, recordScaled); - - bool dropFrames = ui->checkBoxDropFrames->isChecked(); - set->setParam(CFG_DROPFRAMES, dropFrames); - - int codec = ui->comboBoxVideoCodec->currentIndex(); - set->setParam(CFG_CODEC, codec); - - int exporter = ui->comboBoxDefaultExporter->currentIndex(); - set->setParam(CFG_EXPORTER, exporter); - - int stride = (ui->lineEdit_nthFrame->text()).toInt(); - set->setParam(CFG_INPUT_FRAME_STRIDE, stride); - - int qp = (ui->lineEdit_qp->text()).toInt(); - set->setParam(CFG_GPU_QP, qp); - - std::string defaultManSave = (ui->lineEditLocationManSave->text()).toStdString(); - set->setParam(CFG_DEFAULT_LOC_MAN_SAVE, defaultManSave); - - this->close(); -} - -void SettingsWindow::on_pushButtonSetNewLocManSave_clicked() { - QString dirStr = QFileDialog::getExistingDirectory(this, tr("Select Directory"), "", QFileDialog::ShowDirsOnly); - if (dirStr != "") { - ui->lineEditLocationManSave->setText(dirStr); - } -} - - - -SettingsWindow::~SettingsWindow() -{ -} diff --git a/BioTracker/CoreApp/BioTracker/main.cpp b/BioTracker/CoreApp/BioTracker/main.cpp deleted file mode 100644 index f31faaa7..00000000 --- a/BioTracker/CoreApp/BioTracker/main.cpp +++ /dev/null @@ -1,46 +0,0 @@ -#include -#include "BioTracker3App.h" -#include "GuiContext.h" -#include "opencv2/core/core.hpp" -#include -#include "QVector" -#include "Model/MediaPlayerStateMachine/PlayerParameters.h" -#include "util/types.h" - -#include "util/CLIcommands.h" -#include "Interfaces/IModel/IModelTrackedComponent.h" - -//This will hide the console. -//See https://stackoverflow.com/questions/2139637/hide-console-of-windows-application -#ifdef _WIN32 -#pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup") -#endif - -int main(int argc, char* argv[]) { - QApplication app(argc, argv); - CLI::optionParser(argc, argv); - - qRegisterMetaType("cv::Mat"); - qRegisterMetaType>("std::shared_ptr"); - qRegisterMetaType("std::size_t"); - qRegisterMetaType("size_t"); - qRegisterMetaType>("std::vector"); - qRegisterMetaType("BiotrackerTypes::AreaType"); - qRegisterMetaType>("QVector"); - qRegisterMetaType("playerParameters*"); - qRegisterMetaType("CameraConfiguration"); - qRegisterMetaTypeStreamOperators>("QList"); - - boost::filesystem::create_directory(boost::filesystem::path(CFG_DIR_PLUGINS)); - boost::filesystem::create_directory(boost::filesystem::path(CFG_DIR_VIDEOS)); - boost::filesystem::create_directory(boost::filesystem::path(CFG_DIR_TRACKS)); - boost::filesystem::create_directory(boost::filesystem::path(CFG_DIR_TRIALS)); - boost::filesystem::create_directory(boost::filesystem::path(CFG_DIR_SCREENSHOTS)); - - BioTracker3App bioTracker3(&app); - GuiContext context(&bioTracker3); - bioTracker3.setBioTrackerContext(&context); - bioTracker3.runBioTracker(); - - app.exec(); -} diff --git a/BioTracker/CoreApp/BioTracker/util/types.h b/BioTracker/CoreApp/BioTracker/util/types.h deleted file mode 100644 index d119c62d..00000000 --- a/BioTracker/CoreApp/BioTracker/util/types.h +++ /dev/null @@ -1,94 +0,0 @@ -#pragma once - - -#include - -#ifndef CORE_CONFIGURATION -#define CORE_CONFIGURATION "BiotrackerCore.ini" -#define CFG_CODEC "BiotrackerCore/CodecUsed" -#define CFG_DROPFRAMES "BiotrackerCore/DropFrames" -#define CFG_DROPFRAMES_VAL false -#define CFG_RECORDSCALEDOUT "BiotrackerCore/RecordScaledOutput" -#define CFG_EXPORTER "BiotrackerCore/DataExporter" -#define CFG_RECORD_FPS "BiotrackerCore/Record_FPS" -#define CFG_RECORD_FPS_VAL -1 -#define CFG_CAMERA_DEFAULT_W "BiotrackerCore/CameraWidth" -#define CFG_CAMERA_DEFAULT_W_VAL -1 -#define CFG_CAMERA_DEFAULT_H "BiotrackerCore/CameraHeight" -#define CFG_CAMERA_DEFAULT_H_VAL -1 -#define CFG_INPUT_FRAME_STRIDE "BiotrackerCore/FrameStride" -#define CFG_INPUT_FRAME_STRIDE_VAL 1 -#define CFG_GPU_QP "BiotrackerCore/GPU_QP" -#define CFG_GPU_QP_VAL 15 -#define CFG_SER_CSVSEP "Serializers/CSV_SEPARATOR" -#define CFG_SER_CSVSEP_VAL ";" -#define CFG_DEFAULT_LOC_MAN_SAVE "BiotrackerCore/DefaultLocationManualSave" -#define CFG_DEFAULT_LOC_MAN_SAVE_VAL "" - - -#define CFG_DIR_PLUGINS "./Plugins/" -#define CFG_DIR_VIDEOS "./Videos/" -#define CFG_DIR_TRACKS "./Tracks/" -#define CFG_DIR_TRIALS "./Tracks/Trials/" -#define CFG_DIR_SCREENSHOTS "./Screenshots/" -#define CFG_DIR_TEMP "./temp/" -#define CFG_AREA_DEFINITIONS "./areas.csv" -#endif - -namespace BiotrackerTypes{ - enum AreaType { - NONE = -1, - RECT = 0, - APPERTURE = 1, - COMBINED = 2 - }; - -} - -namespace AREADESCRIPTOR -{ - const std::string CN_ARENA = "TRACKERPARAM/CN_CORNERS_ARENA"; - const std::string CN_APPERTURE = "TRACKERPARAM/CN_CORNERS_APPERTURE"; - const std::string CN_APPERTURE_TYPE = "TRACKERPARAM/CN_CORNERS_APPERTURE_TYPE"; - const std::string DISP_AREA = "TRACKERPARAM/DISPLAY_TRACKING_AREA"; - const std::string DISP_RECT = "TRACKERPARAM/DISPLAY_RECTIFICATION_AREA"; - const std::string RECT_W = "RECTIFICATION/WIDTH"; - const int RECT_W_DEFAULT = 100; - const std::string RECT_H = "RECTIFICATION/HEIGHT"; - const int RECT_H_DEFAULT = 100; -} - - -const std::vector> codecList = { - std::pair("X264 (CPU)", "X264"), -#ifdef WITH_CUDA - std::pair("X264 (GPU)", "X264GPU") -#endif -}; - -const std::vector exporterList = { - std::string("CSV"), - std::string("Serialize"), - std::string("Json") -}; - -class CameraConfiguration -{ -public: - CameraConfiguration() : - _id(0), _width(CFG_CAMERA_DEFAULT_W_VAL), _height(CFG_CAMERA_DEFAULT_H_VAL), _fps(CFG_RECORD_FPS_VAL), _recordInput(false), _fourcc("X264") { - } - CameraConfiguration(int p_id, int p_width, int p_height, double p_fps, bool p_recordInput, std::string p_fourcc) : - _id(p_id), _width(p_width), _height(p_height), _fps(p_fps), _recordInput(p_recordInput), _fourcc(p_fourcc) { - } - - int _id; - int _width; - int _height; - bool _recordInput; - double _fps; - std::string _fourcc; -}; - - - diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/BioTrackerInterfaces.pro b/BioTracker/Interfaces/BioTrackerInterfaces/BioTrackerInterfaces.pro deleted file mode 100644 index 0df957c2..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/BioTrackerInterfaces.pro +++ /dev/null @@ -1,53 +0,0 @@ -#------------------------------------------------- -# -# Project created by QtCreator 2016-12-01T17:31:27 -# -#------------------------------------------------- - -QT += widgets - -TARGET = BioTrackerInterfaces -TEMPLATE = lib -CONFIG += staticlib - -SOURCES += \ - Interfaces/IModel/IObject.cpp \ - Interfaces/IView/IView.cpp \ - Interfaces/IView/IViewGraphicsScene.cpp \ - Interfaces/IView/IViewMainWindow.cpp \ - Interfaces/IView/IViewOpenGLWidget.cpp \ - Interfaces/IView/IViewTrackedComponent.cpp \ - Interfaces/IView/IViewWidget.cpp \ - Interfaces/IBioTrackerContext.cpp \ - Interfaces/IController/IController.cpp \ - Interfaces/IModel/IModel.cpp \ - Interfaces/IView/IViewGraphicsPixmapItem.cpp \ - Interfaces/IView/IViewGraphicsView.cpp \ - Interfaces/IModel/IModelTrackedComponent.cpp \ - Interfaces/IModel/IModelTrackedComponentFactory.cpp \ - Interfaces/IModel/IModelTrackedTrajectory.cpp \ - Interfaces/IModel/IModelTrackingAlgorithm.cpp - -HEADERS += \ - Interfaces/IModel/IObject.h \ - Interfaces/IView/IView.h \ - Interfaces/IView/IViewGraphicsScene.h \ - Interfaces/IView/IViewMainWindow.h \ - Interfaces/IView/IViewOpenGLWidget.h \ - Interfaces/IView/IViewTrackedComponent.h \ - Interfaces/IView/IViewWidget.h \ - Interfaces/ENUMS.h \ - Interfaces/IBioTrackerContext.h \ - Interfaces/IBioTrackerPlugin.h \ - Interfaces/IController/IController.h \ - Interfaces/IModel/IModel.h \ - Interfaces/IView/IViewGraphicsPixmapItem.h \ - Interfaces/IView/IViewGraphicsView.h \ - Interfaces/IModel/IModelTrackedComponent.h \ - Interfaces/IModel/IModelTrackedComponentFactory.h \ - Interfaces/IModel/IModelTrackedTrajectory.h \ - Interfaces/IModel/IModelTrackingAlgorithm.h -unix { - target.path = /usr/lib - INSTALLS += target -} diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/CMakeLists.txt b/BioTracker/Interfaces/BioTrackerInterfaces/CMakeLists.txt deleted file mode 100644 index 9b516426..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/CMakeLists.txt +++ /dev/null @@ -1,45 +0,0 @@ -############################################################## -#### Biotracker: Interfaces -############################################################## - -set(INCLUDE_DIRS - ${INCLUDE_DIRS} - ${OpenCV_INCLUDE_DIRS} - ${Qt5Core_INCLUDE_DIRS} - ${Qt5Gui_INCLUDE_DIRS} - ${Qt5Xml_INCLUDE_DIRS} - ${Qt5Network_INCLUDE_DIRS} - ${Qt5Widgets_INCLUDE_DIRS} - ${CMAKE_CURRENT_SOURCE_DIR} - ) - -# Visual studio out-of-source friendly source groups -set(_plugin_src_root_path ${CMAKE_CURRENT_SOURCE_DIR}) -file( - GLOB_RECURSE _plugin_source_list - LIST_DIRECTORIES false - "${_plugin_src_root_path}/*.c*" - "${_plugin_src_root_path}/*.h*" - "${_plugin_src_root_path}/*.ui*" -) -foreach(_plugin_source IN ITEMS ${_plugin_source_list}) - get_filename_component(_plugin_source_path "${_plugin_source}" PATH) - file(RELATIVE_PATH _plugin_source_path_rel "${_plugin_src_root_path}" "${_plugin_source_path}") - string(REPLACE "/" "\\" _plugin_group_path "${_plugin_source_path_rel}") - source_group("${_plugin_group_path}" FILES "${_plugin_source}") -endforeach() - -message("Configuring Biotracker_interfaces...") -set(EXE_NAME Biotracker_interfaces) -add_library(${EXE_NAME} STATIC ${_plugin_source_list} ) -target_include_directories(${EXE_NAME} PUBLIC ${INCLUDE_DIRS}) -target_link_libraries(${EXE_NAME} ${OpenCV_LIBRARIES}) -target_link_libraries(${EXE_NAME} Qt5::Core Qt5::Gui Qt5::Xml Qt5::Network Qt5::Widgets) - -set_target_properties(${EXE_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON) -set_target_properties(${EXE_NAME} PROPERTIES - CXX_STANDARD 17 - CXX_STANDARD_REQUIRED YES - CXX_EXTENSIONS NO -) - diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/ENUMS.h b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/ENUMS.h deleted file mode 100644 index 26acd1a4..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/ENUMS.h +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef ENUMS_H -#define ENUMS_H - -#include - -class ENUMS : public QObject -{ - Q_OBJECT -public: - - - enum CONTROLLERTYPE { - NO_CTR, - MAINWINDOW, - TEXTUREOBJECT, - PLAYER, - COMPONENT, - TRACKING, - GRAPHICSVIEW, - TRACKEDCOMPONENTCORE, - PLUGIN, - DATAEXPORT, - ANNOTATIONS, - AREADESCRIPTOR, - COREPARAMETER, - COMMANDS, - NOTIFICATION - }; - - Q_ENUM(CONTROLLERTYPE) - enum COREPERMISSIONS { - COMPONENTVIEW, - COMPONENTMOVE, - COMPONENTREMOVE, - COMPONENTSWAP, - COMPONENTADD, - COMPONENTROTATE - }; - Q_ENUM(COREPERMISSIONS) - - explicit ENUMS(QObject *parent = 0); - -}; - -#endif // ENUMS_H diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IBioTrackerContext.cpp b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IBioTrackerContext.cpp deleted file mode 100644 index 9eb71ed0..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IBioTrackerContext.cpp +++ /dev/null @@ -1,38 +0,0 @@ -#include "IBioTrackerContext.h" -#include "Interfaces/IController/IController.h" - -#include "QDebug" - - -IBioTrackerContext::IBioTrackerContext(QObject *parent) : - QObject(parent) -{ - -} - -void IBioTrackerContext::createApplication() -{ - createAppController(); - connectController(); -} - - -void IBioTrackerContext::createAppController() -{ - -} - -IController *IBioTrackerContext::requestController(ENUMS::CONTROLLERTYPE ctrtype) -{ - return m_ControllersMap.value(ctrtype); -} - -void IBioTrackerContext::connectController() -{ - -} - -void IBioTrackerContext::addController(IController *ctr) -{ - m_ControllersMap.insert(ctr->getControllerType(), ctr); -} diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IBioTrackerContext.h b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IBioTrackerContext.h deleted file mode 100644 index c1ca6883..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IBioTrackerContext.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef IBIOTRACKERCONTEXT_H -#define IBIOTRACKERCONTEXT_H - -#include -#include "QMap" -#include "QString" -#include "Interfaces/ENUMS.h" - - -class IController; -class IBioTrackerContext : public QObject -{ - Q_OBJECT -public: - IBioTrackerContext(QObject *parent = 0); - ~IBioTrackerContext() {} - - void createApplication(); - - IController * requestController(ENUMS::CONTROLLERTYPE ctrtype); - -protected: - virtual void createAppController(); - virtual void connectController(); - - void addController(IController * ctr); -protected: - QMap m_ControllersMap; - - - -}; - -#endif // IBIOTRACKERCONTEXT_H diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IBioTrackerPlugin.cpp b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IBioTrackerPlugin.cpp deleted file mode 100644 index 6e00a551..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IBioTrackerPlugin.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include "IBioTrackerPlugin.h" - -IView *IBioTrackerPlugin::getTrackerParameterWidget() { return nullptr; }; -IView *IBioTrackerPlugin::getTrackerElementsWidget() { return nullptr; }; -IModel *IBioTrackerPlugin::getTrackerComponentModel() { return nullptr; }; -void IBioTrackerPlugin::sendCorePermissions() { return; }; -IModelTrackedComponentFactory *IBioTrackerPlugin::getComponentFactory() { return nullptr; }; -void IBioTrackerPlugin::connectInterfaces() { return; }; -void IBioTrackerPlugin::receiveAreaDescriptor(IModelAreaDescriptor *areaDescr) { return; }; \ No newline at end of file diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IBioTrackerPlugin.h b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IBioTrackerPlugin.h deleted file mode 100644 index 115eb82c..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IBioTrackerPlugin.h +++ /dev/null @@ -1,70 +0,0 @@ -#ifndef IBIOTRACKERPLUGIN_H -#define IBIOTRACKERPLUGIN_H - -#include "QObject" - -#include "Interfaces/IController/IController.h" -#include "Interfaces/IModel/IModelDataExporter.h" -#include "Interfaces/IModel/IModelAreaDescriptor.h" -#include "Interfaces/IModel/IModelTrackedComponentFactory.h" -#include "opencv2/core/core.hpp" -#include "memory" - -class IBioTrackerPlugin : public QObject -{ - Q_OBJECT -public: - ~IBioTrackerPlugin() {} - - virtual void createPlugin() = 0; - - /** - * Hook for the tracker options to add to the GUI - */ - virtual IView *getTrackerParameterWidget(); - /** - * Hook for the tracking data visualization of the tracker - */ - virtual IView *getTrackerElementsWidget(); - /** - * Hook for the tracking data to visualize and export in the core app - */ - virtual IModel *getTrackerComponentModel(); - /** - * Hook for the core permissions - */ - virtual void sendCorePermissions(); - /** - * Hook for the component factory to deserialize in the core app - */ - virtual IModelTrackedComponentFactory *getComponentFactory(); - -private: - virtual void connectInterfaces(); - -Q_SIGNALS: - virtual void emitCvMat(std::shared_ptr mat, QString name) = 0; - /** - * Will be sent when tracking is doen to multiple components of the core app - * An example is the visualisation which is then updated - */ - virtual void emitTrackingDone(uint framenumber) = 0; - virtual void emitChangeDisplayImage(QString str) = 0; - virtual void emitCorePermission(std::pair) = 0; - -public Q_SLOTS: - virtual void receiveCurrentFrameFromMainApp(std::shared_ptr mat, uint frameNumber) = 0; - /** - * Recieves area descriptor data for rectification (px to cm) and for tracking arena boundary - */ - virtual void receiveAreaDescriptor(IModelAreaDescriptor *areaDescr); - -//private Q_SLOTS: -// virtual void receiveCvMatFromController(std::shared_ptr mat, QString name) = 0; -}; - -#define IBioTrackerPlugin_iid "de.fu-berlin.mi.biorobotics.IBioTrackerPlugin" - -Q_DECLARE_INTERFACE(IBioTrackerPlugin, IBioTrackerPlugin_iid) - -#endif // IBIOTRACKERPLUGIN_H diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IController/IController.cpp b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IController/IController.cpp deleted file mode 100644 index 9c898cd9..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IController/IController.cpp +++ /dev/null @@ -1,56 +0,0 @@ -#include "IController.h" - - -IController::IController(QObject *parent, IBioTrackerContext *context, ENUMS::CONTROLLERTYPE ctr) : QObject(parent), - m_BioTrackerContext(context), - m_ControllerType(ctr) -{ - -} - -void IController::cleanup() { - -} - -IBioTrackerContext *IController::getBioTrackerContext() -{ - return m_BioTrackerContext.data(); -} - -void IController::connectModelToController() -{ - -} - -void IController::createComponents() -{ - createModel(); - createView(); - connectModelToController(); -} - -void IController::connectComponents() -{ - connectControllerToController(); -} - -void IController::addView(IView *view) { - m_View = view; -} - -void IController::addModel(IModel *model) { - m_Model = model; -} - -IModel *IController::getModel() { - return m_Model.data(); -} - -IView *IController::getView() { - return m_View; -} - -ENUMS::CONTROLLERTYPE IController::getControllerType() -{ - return m_ControllerType; -} diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IController/IController.h b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IController/IController.h deleted file mode 100644 index 616c224d..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IController/IController.h +++ /dev/null @@ -1,56 +0,0 @@ - -#ifndef ICONTROLLER_H -#define ICONTROLLER_H - -#include -#include "QMap" -#include "QPointer" - -#include "Interfaces/IView/IView.h" -#include "Interfaces/IModel/IModel.h" -#include "Interfaces/IBioTrackerContext.h" -#include "Interfaces/ENUMS.h" - - -class IController : public QObject { - Q_OBJECT - public: - explicit IController(QObject *parent = 0, IBioTrackerContext *context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); - - /** - * @brief - */ - void createComponents(); - - /** - * @brief connectComponents - */ - void connectComponents(); - - virtual void cleanup(); - - void addView(IView *view); - void addModel(IModel *model); - IModel *getModel(); - IView *getView(); - - ENUMS::CONTROLLERTYPE getControllerType(); - IBioTrackerContext *getBioTrackerContext(); - -protected: - virtual void createModel() = 0; - virtual void createView() = 0; - virtual void connectModelToController() = 0; - virtual void connectControllerToController() = 0; - -protected: - QPointer< IBioTrackerContext > m_BioTrackerContext; - - IView *m_View; - QPointer m_Model; - - ENUMS::CONTROLLERTYPE m_ControllerType; - -}; - -#endif // ICONTROLLER_H diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModel.cpp b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModel.cpp deleted file mode 100644 index 3de1fa44..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModel.cpp +++ /dev/null @@ -1,9 +0,0 @@ -#include "IModel.h" - -IModel::IModel(QObject *parent) : QObject(parent) { - -} - -IModel::~IModel() { - -} diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModel.h b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModel.h deleted file mode 100644 index 171e4731..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModel.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef IMODEL_H -#define IMODEL_H - -#include - -#include "memory" - -class IModel : public QObject { - Q_OBJECT - public: - explicit IModel(QObject *parent = 0); - ~IModel(); - - Q_SIGNALS: - - void notifyView(); - - public Q_SLOTS: -}; - -#endif // IMODEL_H diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelAreaDescriptor.cpp b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelAreaDescriptor.cpp deleted file mode 100644 index e69de29b..00000000 diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelAreaDescriptor.h b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelAreaDescriptor.h deleted file mode 100644 index 4f3efb48..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelAreaDescriptor.h +++ /dev/null @@ -1,35 +0,0 @@ -#pragma once - -#include "IModel.h" -#include -#include - -class IModelAreaDescriptor :public IModel -{ - Q_OBJECT - -public: - IModelAreaDescriptor(QObject *parent = 0) : IModel(parent) {}; - //~IModelAreaDescriptor(); - -public: - - virtual bool inTrackingArea(cv::Point2f point_cm) = 0; - - /** - * Transform the provided pixel coordinates into world coordinates and return world coordinates. - * @param: pixelCoords, a list of points. - * @return: world coordinates in as a list. - */ - virtual cv::Point2f pxToCm(cv::Point point_px) = 0; - - /** - * Transform the provided pixel point into world coordinates and return world point. - * @param: point, a pixel point, used opencv point - * @return: world point. - */ - virtual cv::Point2f cmToPx(cv::Point2f point_cm) = 0; -public: - -}; - diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelDataExporter.cpp b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelDataExporter.cpp deleted file mode 100644 index 672137e8..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelDataExporter.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include "IModelDataExporter.h" - - - -IModelDataExporter::IModelDataExporter(QObject *parent) : - IModel(parent) -{ -} - - -IModelDataExporter::~IModelDataExporter() -{ -} diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelDataExporter.h b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelDataExporter.h deleted file mode 100644 index c33168f4..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelDataExporter.h +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once - -#include "IModel.h" -#include "Interfaces/IModel/IModelTrackedTrajectory.h" -#include "Interfaces/IModel/IModelTrackedComponent.h" -#include -#include -/** -* Interface for the data exporters in the core app -* Besides serializing to files also includes deserializing from files -* Current exporters are CSV, generic and JSON. -*/ -class IModelDataExporter :public IModel -{ - Q_OBJECT - -public: - IModelDataExporter(QObject *parent = 0); - ~IModelDataExporter(); - - virtual void open(IModelTrackedTrajectory *root) = 0; - virtual void write(int idx) = 0; - virtual void writeAll(std::string f) = 0; - virtual void close() = 0; - virtual void finalizeAndReInit() = 0; - void setFps(float fps) { _fps = fps; }; - void setTitle(std::string title) { _title = title; }; - virtual void finalize() = 0; - - virtual void loadFile(std::string file) = 0; - virtual QString getSuffix() = 0; - -public: - IModelTrackedTrajectory *_root; - float _fps; - std::string _title; - -signals: - void fileWritten(QFileInfo file); -}; - diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedComponent.cpp b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedComponent.cpp deleted file mode 100644 index 1dd5f654..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedComponent.cpp +++ /dev/null @@ -1,103 +0,0 @@ -#include "IModelTrackedComponent.h" -#include -#include -#include "Interfaces/IModel/IModelTrackedComponentFactory.h" -#include "IModelTrackedTrajectory.h" - -IModelTrackedComponentFactory* factory = nullptr; - -IModelTrackedComponent::IModelTrackedComponent(QObject *parent) : - IModel(parent) -{ - -} - -IModelComponentEuclidian2D::IModelComponentEuclidian2D(QObject *parent) : - IModelTrackedComponent(parent) -{ - -} - -IModelComponentTemporal2D::IModelComponentTemporal2D(QObject *parent) : - IModelComponentEuclidian2D(parent) -{ - -} - -IModelTrackedPoint::IModelTrackedPoint(QObject *parent) : - IModelComponentTemporal2D(parent) -{ - -} - -IModelTrackedPolygon::IModelTrackedPolygon(QObject *parent) : - IModelComponentTemporal2D(parent) -{ - -} - -IModelTrackedEllipse::IModelTrackedEllipse(QObject *parent) : - IModelTrackedPoint(parent) -{ - -} - -IModelTrackedRectangle::IModelTrackedRectangle(QObject *parent) : - IModelTrackedPoint(parent) -{ - -} - -QDataStream &operator<<(QDataStream &ds, const QList &data) { - ds << qint64(data.size()); - for (int i = 0; imetaObject()->className()); - else - ds << QString("NULL"); - ds << *(data[i]); - } - return ds; -} - -QDataStream &operator >> (QDataStream &ds, QList &data) { - qint64 s; - ds >> s; - for (int i = 0; i> cn; - std::string sss = cn.toStdString(); - IModelTrackedComponent* cp = static_cast(factory->getNewTrackedElement(cn)); - ds >> (*cp); - data.append(cp); - } - return ds; -} - -QDataStream &operator<<(QDataStream &ds, const IModelTrackedComponent &data) { - for (int i = 0; ipropertyCount(); ++i) - { - if (data.metaObject()->property(i).isStored(&data)) - { - QVariant v = data.metaObject()->property(i).read(&data); - ds << data.metaObject()->property(i).read(&data); - } - } - return ds; -} - -QDataStream &operator>>(QDataStream &ds, IModelTrackedComponent &data) { - QVariant var; - for (int i = 0; ipropertyCount(); ++i) - { - if (data.metaObject()->property(i).isStored(&data)) - { - ds >> var; - data.metaObject()->property(i).write(&data, var); - } - } - return ds; -} - diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedComponent.h b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedComponent.h deleted file mode 100644 index cc47f9d5..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedComponent.h +++ /dev/null @@ -1,344 +0,0 @@ -#ifndef ITRACKEDCOMPONENT_H -#define ITRACKEDCOMPONENT_H - -#include "IModel.h" -#include - -#include -#include -#include -#include - - -/** -* This is the common interface for all TrackedComponents (IModelTrackedTrajectory and any leaf class). -* It is part of the Composite Pattern and is the equivalent to the abstract Component class. -* This class is derived from IModel from the Model-View-Controller structure. -* A TrackedComponent has a QObject as parent and it -* has a methode called operate() that needs to be implemented -* by all derivatives of this interface class. -*/ - -/* -* Blank component -*/ - -class IModelTrackedComponent : public IModel -{ - Q_OBJECT - /* - Q_PROPERTY-System: http://doc.qt.io/qt-5/properties.html - */ - Q_PROPERTY(bool valid READ getValid() WRITE setValid STORED true) - Q_PROPERTY(double id READ getId() WRITE setId STORED true) -public: - /** - * The constructor of the IModelTrackedComponent class is able to receive a QObject as parent. - */ - IModelTrackedComponent(QObject *parent = 0); - /* - Getters, Setters & Checkers - */ - virtual void setValid(bool v) { _valid = v; }; - virtual void setId(int id) { _id = id; }; - virtual void setFixed(bool fixed) { _fixed = fixed; }; - virtual void setParent(IModelTrackedComponent *p) { _parentNode = p; }; - virtual int getId() { return _id; }; - virtual bool getValid() { return _valid; }; - virtual bool getFixed() { return _fixed; }; - - /** - * The methode operate() must be implemented by every derivative of this class. - */ - virtual void operate() = 0; - -protected: - int _id; /**< id of the component */ - bool _valid; /**< validity of the component; if invalid -> not visualized */ - bool _fixed; /**< fix status; if fixed the tracked should not change state*/ - IModelTrackedComponent *_parentNode = nullptr; /**< parent */ -}; - - -Q_DECLARE_METATYPE(QList) -/** -* Serialization operator for multiple components. -*/ -QDataStream &operator<<(QDataStream &ds, const QList &data); -/** -* Deserialization operator for multiple components. -*/ -QDataStream &operator>>(QDataStream &ds, QList &data); -/** -* Serialization operator for one component. -*/ -QDataStream &operator<<(QDataStream &out, const IModelTrackedComponent &painting); -/** -* Deserialization operator for one component. -*/ -QDataStream &operator>>(QDataStream &in, IModelTrackedComponent &painting); - -/***************************************************************************//** -* This is a node of the Composite Pattern -* This class is derived from IModelTrackedComponent. -* It includes positional data like x,y-coordinates (in px and _coordinateUnit), the orientation in rad and deg -* and the width and height (in px and _coordinateUnit) -*******************************************************************************/ - -class IModelComponentEuclidian2D : public IModelTrackedComponent { -public: - Q_OBJECT - /* - Q_PROPERTY-System: http://doc.qt.io/qt-5/properties.html - */ - Q_PROPERTY(QString coordinateUnit READ getCoordinateUnit() WRITE setCoordinateUnit STORED true) - Q_PROPERTY(float x READ getX() WRITE setX STORED hasX) - Q_PROPERTY(float y READ getY() WRITE setY STORED hasY) - Q_PROPERTY(float w READ getW() WRITE setW STORED hasW) - Q_PROPERTY(float h READ getH() WRITE setH STORED hasH) - Q_PROPERTY(float wpx READ getWpx() WRITE setWpx STORED hasWpx) - Q_PROPERTY(float hpx READ getHpx() WRITE setHpx STORED hasHpx) - Q_PROPERTY(float rad READ getRad() WRITE setRad STORED hasRad) - Q_PROPERTY(float deg READ getDeg() WRITE setDeg STORED hasDeg) - Q_PROPERTY(float xpx READ getXpx() WRITE setXpx STORED hasXpx) - Q_PROPERTY(float ypx READ getYpx() WRITE setYpx STORED hasYpx) - -public: - /** - * The constructor of the IModelTrackedComponent class is able to receive a QObject as parent. - * It should not be implemented as it is a not a leaf or a composite - */ - IModelComponentEuclidian2D(QObject *parent = 0); - - /* Returns a human-readable string about coordinate units. - * Freely enter something like "px", "cm" or "um". This will be annotated in the output. - */ - virtual QString getCoordinateUnit() { return "cm"; }; - virtual void setCoordinateUnit(QString c) { _coordinateUnit = c; }; - - /* - Getters, Setters & Checkers - */ - virtual void setX(float x) = 0; - virtual void setY(float y) = 0; - virtual void setW(float w) = 0; - virtual void setH(float h) = 0; - virtual void setXpx(float h) = 0; - virtual void setYpx(float h) = 0; - virtual void setWpx(float h) = 0; - virtual void setHpx(float h) = 0; - virtual void setRad(float r) = 0; - virtual void setDeg(float d) = 0; - - virtual float getX() = 0; - virtual float getY() = 0; - virtual float getW() = 0; - virtual float getH() = 0; - virtual float getXpx() = 0; - virtual float getYpx() = 0; - virtual float getWpx() = 0; - virtual float getHpx() = 0; - virtual float getRad() = 0; - virtual float getDeg() = 0; - - virtual bool hasX() = 0; - virtual bool hasY() = 0; - virtual bool hasW() = 0; - virtual bool hasH() = 0; - virtual bool hasXpx() = 0; - virtual bool hasYpx() = 0; - virtual bool hasWpx() = 0; - virtual bool hasHpx() = 0; - virtual bool hasRad() = 0; - virtual bool hasDeg() = 0; - -protected: - QString _coordinateUnit; /**< coordinate unit, will be saved in exported file */ - float _x; /**< x-coordinate in coordinate unit*/ - float _y; /**< y-coordinate in coordinate unit*/ - float _w; /**< width in coordinate unit*/ - float _h; /**< height in coordinate unit*/ - float _rad; /**< orientation in rad */ - float _deg; /**< orientation in deg */ - float _xpx; /**< x-coordinate in px */ - float _ypx; /**< y-coordinate in px */ - float _wpx; /**< width in px */ - float _hpx; /**< height in px */ -}; - -/***************************************************************************//** -* This is a node of the Composite Pattern -* This class is derived from IModelComponentEuclidian2D. -* It expands it from 2D to 3D. -* Reserved for future 3D tracking. -*******************************************************************************/ -class IModelComponentEuclidian3D : public IModelComponentEuclidian2D { -public: - Q_OBJECT - /* - Q_PROPERTY-System: http://doc.qt.io/qt-5/properties.html - */ - Q_PROPERTY(float z READ getZ() WRITE setZ STORED hasZ) - Q_PROPERTY(float zpx READ getZpx() WRITE setZpx STORED hasZpx) - Q_PROPERTY(float d READ getD() WRITE setD STORED hasD) - Q_PROPERTY(float dpx READ getDpx() WRITE setDpx STORED hasDpx) - Q_PROPERTY(float rada2 READ getRadAxis2() WRITE setRadAxis2 STORED hasRadAxis2) - Q_PROPERTY(float rada3 READ getRadAxis3() WRITE setRadAxis3 STORED hasRadAxis3) - -public: - /* - Getters, Setters & Checkers - */ - virtual void setZ(float z) = 0; - virtual void setZpx(float z) = 0; - virtual void setD(float h) = 0; - virtual void setDpx(float d) = 0; - virtual void setRadAxis2(float r) = 0; - virtual void setRadAxis3(float r) = 0; - - virtual float getZ() = 0; - virtual float getZpx() = 0; - virtual float getD() = 0; - virtual float getDpx() = 0; - virtual float getRadAxis2() = 0; - virtual float getRadAxis3() = 0; - - virtual bool hasZ() = 0; - virtual bool hasD() = 0; - virtual bool hasZpx() = 0; - virtual bool hasDpx() = 0; - virtual bool hasRadAxis2() = 0; - virtual bool hasRadAxis3() = 0; - -protected: - float _z; /**< z-coordinate in coordinate unit */ - float _zpx; /**< z-coordinate in px */ - float _d; /**< d in coordinate unit*/ - float _dpx; /**< d in px */ - float _rada2; /**< rotation two */ - float _rada3; /**< rotation three */ -}; - -/***************************************************************************//** -* This is a node of the Composite Pattern -* This class is derived from IModelComponentEuclidian2D. -* It expands it to 2D with timestamps. -*******************************************************************************/ -class IModelComponentTemporal2D : public IModelComponentEuclidian2D { -public: - Q_OBJECT - /* - Q_PROPERTY-System: http://doc.qt.io/qt-5/properties.html - */ - Q_PROPERTY(qint64 time READ getTime() WRITE setTime STORED hasTime) - Q_PROPERTY(QString timeString READ getTimeString() WRITE setTimeString STORED hasTimeString) - -public: - /** - * The constructor of the IModelComponentTemporal2D class is able to receive a QObject as parent. - * It should not be implemented as it is a not a leaf nore a composite - */ - IModelComponentTemporal2D(QObject *parent = 0); - - /* - Getters, Setters & Checkers - */ - virtual void setTime(qint64 t) = 0; - virtual qint64 getTime() = 0; - virtual bool hasTime() = 0; - virtual void setTimeString(QString t) = 0; - virtual QString getTimeString() = 0; - virtual bool hasTimeString() = 0; - -protected: - qint64 _time; /**< UNIX timestamp */ - QString _timeString; /**< timestamp a formatted as string */ -}; - -/***************************************************************************//** -* This is a leaf of the Composite Pattern -* This class is derived from IModelComponentTemporal2D. -* It includes 2D and time data. -* This interface can be visualized in the core application if the tracking data implements it. -* A circular point will be visualized with the radius of min(width,height) -* The position is the center of the point. -*******************************************************************************/ -class IModelTrackedPoint : public IModelComponentTemporal2D -{ - Q_OBJECT - -public: - /** - * The constructor of the IModelTrackedPoint class is able to receive a QObject as parent. - */ - IModelTrackedPoint(QObject *parent = 0); -}; - -/***************************************************************************//** -* This is a leaf of the Composite Pattern -* This class is derived from IModelComponentTemporal2D. -* It includes 2D and time data and a polygon. -* This interface can be visualized in the core application if the tracking data implements it. -* An irregular polygon defined by a list of polygons will be visualized. -*******************************************************************************/ - -class IModelTrackedPolygon : public IModelComponentTemporal2D -{ - Q_OBJECT - -public: - - /** - * The constructor of the IModelTrackedPolygon class is able to receive a QObject as parent. - */ - IModelTrackedPolygon(QObject *parent = 0); - - /* - Getters, Setters & Checkers - */ - virtual void setPolygon(QList polygons) = 0; - virtual QList getPolygon() = 0; - virtual float hasPolygon() = 0; - -protected: - QList _polygon; /**< List of polygons, all will be drawn when vizualized */ -}; - -/***************************************************************************//** -* This is a leaf of the Composite Pattern -* This class is derived from IModelComponentTemporal2D. -* It includes 2D and time data. -* This interface can be visualized in the core application if the tracking data implements it. -* An ellipse will be visualized. The position is the center of the ellipse. -*******************************************************************************/ -class IModelTrackedEllipse : public IModelTrackedPoint -{ - Q_OBJECT - -public: - /** - * The constructor of the IModelTrackedEllipse class is able to receive a QObject as parent. - */ - IModelTrackedEllipse(QObject *parent = 0); - -}; - -/***************************************************************************//** -* This is a leaf of the Composite Pattern -* This class is derived from IModelComponentTemporal2D. -* It includes 2D and time data. -* This interface can be visualized in the core application if the tracking data implements it. -* A rectangle will be visualized. The position is the center of the rectangle. -*******************************************************************************/ -class IModelTrackedRectangle : public IModelTrackedPoint -{ - Q_OBJECT - -public: - /** - * The constructor of the IModelTrackedRectangle class is able to receive a QObject as parent. - */ - IModelTrackedRectangle(QObject *parent = 0); -}; - -#endif // ITRACKEDCOMPONENT_H diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedComponentFactory.cpp b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedComponentFactory.cpp deleted file mode 100644 index 454ef199..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedComponentFactory.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include "IModelTrackedComponentFactory.h" - -IModelTrackedComponentFactory::IModelTrackedComponentFactory() { - -} - -IModelTrackedComponentFactory::~IModelTrackedComponentFactory() -{ - -} - -IModelTrackedComponent *IModelTrackedComponentFactory::getNewTrackedElement(QString name) -{ - return createTrackedElement(name); -} - -IModelTrackedComponent *IModelTrackedComponentFactory::getNewTrackedObject(QString name) -{ - return createTrackedObject(name); -} - -IModelTrackedComponent *IModelTrackedComponentFactory::getNewTrackedTrajectory(QString name) -{ - return createTrackedTrajectory(name); -} diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedComponentFactory.h b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedComponentFactory.h deleted file mode 100644 index 4fe0b211..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedComponentFactory.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef ITRACKEDCOMPONENTFACTORY_H -#define ITRACKEDCOMPONENTFACTORY_H - -#include "Interfaces/IModel/IModel.h" -#include "Interfaces/IModel/IModelTrackedComponent.h" - -class IModelTrackedComponentFactory : public IModel -{ - Q_OBJECT - - public: - IModelTrackedComponentFactory(); - virtual ~IModelTrackedComponentFactory() = 0; - - IModelTrackedComponent *getNewTrackedElement(QString name); - IModelTrackedComponent *getNewTrackedObject(QString name); - IModelTrackedComponent *getNewTrackedTrajectory(QString name); - virtual QList getElementTypes() = 0; - -protected: - virtual IModelTrackedComponent *createTrackedElement(QString name) = 0; - virtual IModelTrackedComponent *createTrackedObject(QString name) = 0; - virtual IModelTrackedComponent *createTrackedTrajectory(QString name) = 0; - -}; - -#endif // ITRACKEDCOMPONENTFACTORY_H diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedTrajectory.cpp b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedTrajectory.cpp deleted file mode 100644 index bc869f68..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedTrajectory.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "IModelTrackedTrajectory.h" -#include "qdebug.h" - -int IModelTrackedTrajectory::nextID = -1; - -IModelTrackedTrajectory::IModelTrackedTrajectory(QObject *parent) : - IModelTrackedComponent(parent) -{ - _id = ++nextID; -} - -void IModelTrackedTrajectory::operate() -{ - // please implement this method in an TrackedObject class - -} diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedTrajectory.h b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedTrajectory.h deleted file mode 100644 index b6089721..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackedTrajectory.h +++ /dev/null @@ -1,85 +0,0 @@ -#ifndef ITRACKEDOTRAJECTORY_H -#define ITRACKEDOTRAJECTORY_H - -#include "Interfaces/IModel/IModelTrackedComponent.h" - -/** - * This interface class derives from IModelTrackedComponent. - * This class is part of the Composite Pattern and represents the the abstract Composite class. - * Its purpose is to define the responsibility - * for adding, deleting and returning leaf objects. - * - * - * Its the Plugin Developers full responsibility to choos an internal data structure. This could be e.g. Map, List or Vector. - */ -class IModelTrackedTrajectory : public IModelTrackedComponent -{ - Q_OBJECT - Q_PROPERTY(QList childNodes READ getChildNodes() WRITE setChildNodes STORED hasChildNodes); -public: - /** - * The constructor. - */ - IModelTrackedTrajectory(QObject *parent); - - /** - * This methode must be implemented by all derivatives. Its purpose is to provide a mechanism for adding Leaf components to this structure. - */ - virtual void add(IModelTrackedComponent *comp, int pos) = 0; - - /** - * This methode must be implemented by all derivatives. Its functionality shall be a mechanism for removing Leaf components from this structure. - */ - virtual bool remove(IModelTrackedComponent *comp) = 0; - - /** - * This methode must be implemented by all derivatives. Its functionality shall be a mechanism for removing all Leaf components from this structure. - */ - virtual void clear() = 0; - - /** - * This methode must be implemented by all derivatives. Its functionality shall be a mechanism for determining the count/number of children. - */ - virtual int size() = 0; - - /** - * This should simply return a child object by an index. - */ - virtual IModelTrackedComponent* getChild(int index) = 0; - - virtual IModelTrackedComponent* getValidChild(int index) = 0; - - virtual int validCount() = 0; - - - /** - * This shoudd simply return a last child object (highest index). - */ - virtual IModelTrackedComponent *getLastChild() = 0; - - void setTime(std::chrono::system_clock::time_point t) { _time = t; }; - std::chrono::system_clock::time_point getTime() { return _time; }; - - - QList getChildNodes() { - return _TrackedComponents; - } - void setChildNodes(QList n) { - _TrackedComponents = n; - } - bool hasChildNodes() { - return true; - } - - // ITrackedComponent interface -public: - void operate(); - std::chrono::system_clock::time_point _time; - -protected: - static int nextID; - - QList _TrackedComponents; -}; - -#endif // ITRACKEDOTRAJECTORY_H diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackingAlgorithm.cpp b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackingAlgorithm.cpp deleted file mode 100644 index cdf89f6c..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackingAlgorithm.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "IModelTrackingAlgorithm.h" - -IModelTrackingAlgorithm::IModelTrackingAlgorithm(QObject *parent) : - IModel(parent) -{ - -} - -//void ITrackingAlgorithm::setTrackedComponentFactory(ITrackedComponentFactory *factory) -//{ -// m_TrackedComponentFactory = factory; -//} - -//void ITrackingAlgorithm::setTrackedComponent(ITrackedComponent *trackedComponent) -//{ -// m_TrackedComponent = trackedComponent; -//} - -//ITrackedComponentFactory *ITrackingAlgorithm::getTrackedComponentFactory() -//{ -// return m_TrackedComponentFactory; -//} - -//ITrackedComponent *ITrackingAlgorithm::getTrackedComponent() -//{ -// return m_TrackedComponent; -//} diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackingAlgorithm.h b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackingAlgorithm.h deleted file mode 100644 index 722ffef6..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IModelTrackingAlgorithm.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef ITRACKINGALGORITHM_H -#define ITRACKINGALGORITHM_H - -#include "IModel.h" -#include "opencv2/core/core.hpp" - -class IModelTrackingAlgorithm :public IModel { - Q_OBJECT - public: - IModelTrackingAlgorithm(QObject *parent = 0); - - virtual void doTracking(std::shared_ptr image, uint frameNumber) = 0; - -signals: - void emitTrackingDone(); - void emitChangeDisplayImage(QString str); - - -}; - -#endif // ITRACKINGALGORITHM_H diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IObject.cpp b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IObject.cpp deleted file mode 100644 index 9f339496..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IObject.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "IObject.h" - -IObject::IObject() : - IModel(0) { - -} diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IObject.h b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IObject.h deleted file mode 100644 index 715e3894..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/IObject.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef IOBJECT_H -#define IOBJECT_H - -#include "Interfaces/IModel/IModel.h" - -// #include "biotracker/util/platform.h" - -class IObject : public IModel { - Q_OBJECT - public: - IObject(); -}; - -#endif // IOBJECT_H diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/Serializable.cpp b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/Serializable.cpp deleted file mode 100644 index 96c86e53..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/Serializable.cpp +++ /dev/null @@ -1,28 +0,0 @@ -#include "Serializable.h" - -#include -#include - - -QDataStream &operator<<(QDataStream &ds, const Serializable &data) { - for (int i = 0; ipropertyCount(); ++i) - { - if (data.metaObject()->property(i).isStored(&data)) - { - ds << data.metaObject()->property(i).read(&data); - } - } - return ds; -} -QDataStream &operator>>(QDataStream &ds, Serializable &data) { - QVariant var; - for (int i = 0; ipropertyCount(); ++i) - { - if (data.metaObject()->property(i).isStored(&data)) - { - ds >> var; - data.metaObject()->property(i).write(&data, var); - } - } - return ds; -} \ No newline at end of file diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/Serializable.h b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/Serializable.h deleted file mode 100644 index d7083b5e..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IModel/Serializable.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once -#include -#include -#include -#include -#include - -class Serializable : public QObject -{ - Q_OBJECT -}; - -QDataStream &operator<<(QDataStream &out, const Serializable &data); -QDataStream &operator>>(QDataStream &in, Serializable &data); diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IView.cpp b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IView.cpp deleted file mode 100644 index 5743123b..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IView.cpp +++ /dev/null @@ -1,37 +0,0 @@ -#include "IView.h" -#include "Interfaces/IController/IController.h" - -IView::IView(IController *controller, IModel *model): - mController(controller), - mModel(model) -{ - -} - -void IView::setModel(IModel *model) { - mModel = model; -} - -IView::~IView() { - -} - -IController *IView::getController() { - return mController; -} - -IModel *IView::getModel() { - return mModel; -} - -const IController *IView::getController() const { - return mController; -} - -const IModel *IView::getModel() const { - return mModel; -} - -void IView::setPermission(std::pair) { - -} diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IView.h b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IView.h deleted file mode 100644 index 554a7b32..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IView.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef IVIEW_H -#define IVIEW_H - -#include "Interfaces/IModel/IModel.h" -#include "Interfaces/ENUMS.h" - -class IController; -class IView { - - public: - IView(IController *controller = 0, IModel *model = 0); - virtual ~IView() = 0; - - virtual void setNewModel(IModel *model) = 0; - void setPermission(std::pair < ENUMS::COREPERMISSIONS, bool >); - - protected: - virtual void connectModelView() = 0; - void setModel(IModel *model); - IController *getController(); - const IController *getController() const; - IModel *getModel(); - const IModel *getModel() const; - private: - IController *mController; - IModel *mModel; -}; - -#endif // IVIEW_H diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewGraphicsPixmapItem.cpp b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewGraphicsPixmapItem.cpp deleted file mode 100644 index 372da22e..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewGraphicsPixmapItem.cpp +++ /dev/null @@ -1,24 +0,0 @@ -#include "IViewGraphicsPixmapItem.h" - -IViewGraphicsPixmapItem::IViewGraphicsPixmapItem(QObject *parent, IController *controller, IModel *model) : - QObject(parent), - IView(controller, model) -{ - -} - -void IViewGraphicsPixmapItem::setNewModel(IModel *model) -{ - if (getModel() != nullptr) { - QObject::disconnect(getModel(), 0, this, 0); - } - - setModel(model); - - if (getModel() != nullptr) { - connectModelView(); - } - - update(); -} - diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewGraphicsPixmapItem.h b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewGraphicsPixmapItem.h deleted file mode 100644 index 16cf08a9..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewGraphicsPixmapItem.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef IGRAPHICSPIXMAPITEM_H -#define IGRAPHICSPIXMAPITEM_H - -#include "IView.h" -#include "QObject" -#include "QGraphicsPixmapItem" - -class IViewGraphicsPixmapItem : public QObject, public QGraphicsPixmapItem, public IView -{ - Q_OBJECT -public: - IViewGraphicsPixmapItem(QObject *parent = 0, IController *controller = 0, IModel *model = 0); - - // IView interface -public: - void setNewModel(IModel *model) override; - -public Q_SLOTS: - virtual void getNotified() = 0; -}; - -#endif // IGRAPHICSPIXMAPITEM_H diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewGraphicsScene.cpp b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewGraphicsScene.cpp deleted file mode 100644 index c1bf252d..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewGraphicsScene.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include "IViewGraphicsScene.h" - -IViewGraphicsScene::IViewGraphicsScene(QObject *parent, IController *controller, IModel *model) : - QGraphicsScene(parent), - IView(controller, model) -{ - -} - -void IViewGraphicsScene::setNewModel(IModel *model) -{ - -} - -void IViewGraphicsScene::connectModelView() -{ - QObject::connect(getModel(), &IModel::notifyView, this, &IViewGraphicsScene::getNotified); -} diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewGraphicsScene.h b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewGraphicsScene.h deleted file mode 100644 index 6b2e0db6..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewGraphicsScene.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef IVIEWGRAPHICSSCENE_H -#define IVIEWGRAPHICSSCENE_H - -#include "QGraphicsScene" -#include "IView.h" - -class IViewGraphicsScene : public QGraphicsScene, public IView -{ - Q_OBJECT -public: - IViewGraphicsScene(QObject *parent = 0, IController *controller = 0, IModel *model = 0); - - // IView interface -public: - virtual void setNewModel(IModel *model) override; - -protected: - virtual void connectModelView() override; - -public Q_SLOTS: - virtual void getNotified() = 0; -}; - -#endif // IVIEWGRAPHICSSCENE_H diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewGraphicsView.cpp b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewGraphicsView.cpp deleted file mode 100644 index 1efd2407..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewGraphicsView.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include "IViewGraphicsView.h" - - -IViewGraphicsView::IViewGraphicsView(QWidget *parent, IController *controller, IModel *model) : - QGraphicsView(parent), - IView(controller, model) -{ - -} - -void IViewGraphicsView::setNewModel(IModel *model) -{ - -} - -void IViewGraphicsView::connectModelView() -{ - QObject::connect(getModel(), &IModel::notifyView, this, &IViewGraphicsView::getNotified); -} diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewGraphicsView.h b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewGraphicsView.h deleted file mode 100644 index 486288d8..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewGraphicsView.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef IGRAPHICSVIEW_H -#define IGRAPHICSVIEW_H - -#include "QGraphicsView" -#include "IView.h" - -class IViewGraphicsView : public QGraphicsView, public IView -{ - Q_OBJECT -public: - IViewGraphicsView(QWidget *parent = 0, IController *controller = 0, IModel *model = 0); - - // IView interface -public: - void setNewModel(IModel *model) override; - -protected: - void connectModelView() override; - -public Q_SLOTS: - virtual void getNotified() = 0; -}; - -#endif // IGRAPHICSVIEW_H diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewMainWindow.cpp b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewMainWindow.cpp deleted file mode 100644 index cea4f77e..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewMainWindow.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include "IViewMainWindow.h" - -IViewMainWindow::IViewMainWindow(QWidget *parent, IController *controller, IModel *model) : - QMainWindow(parent), - IView(controller, model) { - -} - -IViewMainWindow::~IViewMainWindow() { - -} - -void IViewMainWindow::setNewModel(IModel *model) { - model = nullptr; - setModel(model); -} - -void IViewMainWindow::connectModelView() { - // this function is not used in MainWindow -} diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewMainWindow.h b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewMainWindow.h deleted file mode 100644 index e61939e7..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewMainWindow.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef IVIEWMAINWINDOW_H -#define IVIEWMAINWINDOW_H - -#include -#include "Interfaces/IView/IView.h" - -class IViewMainWindow : public QMainWindow, public IView { - public: - IViewMainWindow(QWidget *parent = 0, IController *controller = 0, IModel *model = 0); - ~IViewMainWindow(); - - private: - void setNewModel(IModel *model); - void connectModelView(); -}; - -#endif // IVIEWMAINWINDOW_H diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewOpenGLWidget.cpp b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewOpenGLWidget.cpp deleted file mode 100644 index 2b799f3c..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewOpenGLWidget.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include "IViewOpenGLWidget.h" - -IViewOpenGLWidget::IViewOpenGLWidget(QWidget *parent, IController *controller, IModel *model) : - QOpenGLWidget(parent), - IView(controller) { - setNewModel(model); -} - -IViewOpenGLWidget::~IViewOpenGLWidget() { - -} - -void IViewOpenGLWidget::setNewModel(IModel *model) { - if (getModel() != nullptr) { - QObject::disconnect(getModel(), 0, this, 0); - } - - setModel(model); - - if (getModel() != nullptr) { - connectModelView(); - } - - update(); -} - -void IViewOpenGLWidget::connectModelView() { - QObject::connect(getModel(), &IModel::notifyView, this, &IViewOpenGLWidget::getNotified); -} - -void IViewOpenGLWidget::initializeGL() { - connectModelView(); -} diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewOpenGLWidget.h b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewOpenGLWidget.h deleted file mode 100644 index e3a23b47..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewOpenGLWidget.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef IVIEWOPENGLWIDGET_H -#define IVIEWOPENGLWIDGET_H - -#include "Interfaces/IView/IView.h" -#include -#include -#include - - -class IViewOpenGLWidget: public QOpenGLWidget, protected QOpenGLFunctions, public IView { - public: - IViewOpenGLWidget(QWidget *parent = 0, IController *controller = 0, IModel *model = 0); - ~IViewOpenGLWidget(); - - void setNewModel(IModel *model); - - public Q_SLOTS: - virtual void getNotified() = 0; - - protected: - void connectModelView(); - void initializeGL() override; -}; - -#endif // IVIEWOPENGLWIDGET_H diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewTrackedComponent.cpp b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewTrackedComponent.cpp deleted file mode 100644 index ec38b2cc..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewTrackedComponent.cpp +++ /dev/null @@ -1,23 +0,0 @@ -#include "IViewTrackedComponent.h" - -IViewTrackedComponent::IViewTrackedComponent(QGraphicsItem *parent, IController *controller, IModel *model) : - QGraphicsObject(parent), - IView(controller, model) -{ - -} - -IViewTrackedComponent::~IViewTrackedComponent() -{ - -} - -void IViewTrackedComponent::setNewModel(IModel *model) -{ - -} - -void IViewTrackedComponent::connectModelView() -{ - QObject::connect(getModel(), &IModel::notifyView, this, &IViewTrackedComponent::getNotified); -} diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewTrackedComponent.h b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewTrackedComponent.h deleted file mode 100644 index d2cc6df3..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewTrackedComponent.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef IVIEWTRACKEDCOMPONENT_H -#define IVIEWTRACKEDCOMPONENT_H - -#include "IView.h" -#include "QGraphicsObject" - -/** - * This is the common interface for all views representing a TrackedComponents class (IModelTrackedTrajectory and any leaf class). - * This class is derived from IView from the Model-View-Controller structure and visializes the data from its IModel object. - * A IViewTrackedComponent has a QGraphicsItem. - */ - -class IViewTrackedComponent : public QGraphicsObject, public IView -{ - Q_OBJECT -public: - /** - * The constructor hase a QGraphicsItem object as Parent, an IController object as its controller and an IModel object. - */ - IViewTrackedComponent(QGraphicsItem *parent = 0, IController *controller = 0, IModel *model = 0); - ~IViewTrackedComponent(); - - // IView interface -public: - void setNewModel(IModel *model) override; - -protected: - void connectModelView() override; - -public Q_SLOTS: - virtual void getNotified() = 0; - -}; - -#endif // IVIEWTRACKEDCOMPONENT_H diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewWidget.cpp b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewWidget.cpp deleted file mode 100644 index a0a81504..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewWidget.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include "IViewWidget.h" - -IViewWidget::IViewWidget(QWidget *parent, IController *controller, IModel *model): - QWidget(parent), - IView(controller) { - setNewModel(model); -} - -void IViewWidget::setNewModel(IModel *model) { - setModel(model); - if (getModel() != nullptr) { - connectModelView(); - } -} - -void IViewWidget::connectModelView() { - QObject::connect(getModel(), &IModel::notifyView, this, &IViewWidget::getNotified); -} diff --git a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewWidget.h b/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewWidget.h deleted file mode 100644 index 375ffd45..00000000 --- a/BioTracker/Interfaces/BioTrackerInterfaces/Interfaces/IView/IViewWidget.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef IVIEWWIDGET_H -#define IVIEWWIDGET_H - -#include -#include "Interfaces/IView/IView.h" - -class IViewWidget : public QWidget, public IView { - Q_OBJECT - public: - explicit IViewWidget(QWidget *parent = 0, IController *controller = 0, IModel *model = 0); - - void setNewModel(IModel *model); - - public Q_SLOTS: - virtual void getNotified() = 0; - - private: - void connectModelView(); -}; - -#endif // IVIEWWIDGET_H diff --git a/BioTracker/Plugin/BackgroundSubtraction/BioTrackerPlugin.cpp b/BioTracker/Plugin/BackgroundSubtraction/BioTrackerPlugin.cpp deleted file mode 100644 index fc69b1ce..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/BioTrackerPlugin.cpp +++ /dev/null @@ -1,135 +0,0 @@ -#include "BioTrackerPlugin.h" -#include "PluginContext.h" - -#include "Controller/ControllerTrackingAlgorithm.h" -#include "Controller/ControllerTrackedComponent.h" - -#include "util/singleton.h" -#include "settings/Settings.h" - -#include "View/TrackedElementView.h" -#include "Model/TrackedComponents/TrackedComponentFactory.h" - -BioTrackerPlugin::BioTrackerPlugin() { -} - -IView* BioTrackerPlugin::getTrackerParameterWidget() { - return qobject_cast (m_TrackerController)->getTrackingParameterWidget(); -} -IView *BioTrackerPlugin::getTrackerElementsWidget() -{ - return qobject_cast (m_ComponentController)->getTrackingElementsWidget(); -} - -// forwards tracked component model to coreApp -IModel* BioTrackerPlugin::getTrackerComponentModel() { - return qobject_cast (m_ComponentController)->getModel(); -} - -IModelTrackedComponentFactory *BioTrackerPlugin::getComponentFactory() { - return new TrackedComponentFactory(); -} - -#if QT_VERSION < 0x050000 -Q_EXPORT_PLUGIN2(BioTrackerPlugin, BioTrackerPlugin) -#endif // QT_VERSION < 0x050000 - - -void BioTrackerPlugin::createPlugin() { - m_PluginContext = new PluginContext(); - m_PluginContext->createApplication(); - - IController * ctr = m_PluginContext->requestController(ENUMS::CONTROLLERTYPE::COMPONENT); - m_ComponentController = qobject_cast(ctr); - - IController * ctr2 = m_PluginContext->requestController(ENUMS::CONTROLLERTYPE::TRACKING); - m_TrackerController = qobject_cast(ctr2); - - connectInterfaces(); -} - -void BioTrackerPlugin::connectInterfaces() { - ControllerTrackingAlgorithm* ctrAlg = qobject_cast (m_TrackerController); - ControllerTrackedComponent* ctrTrC = qobject_cast (m_ComponentController); - - //controllertrackingalgorithm - QObject::connect(ctrAlg, &ControllerTrackingAlgorithm::emitCvMat, this, &BioTrackerPlugin::receiveCvMatFromController); - QObject::connect(ctrAlg, &ControllerTrackingAlgorithm::emitTrackingDone, this, &BioTrackerPlugin::receiveTrackingDone); - QObject::connect(ctrAlg, &ControllerTrackingAlgorithm::emitChangeDisplayImage, this, &BioTrackerPlugin::receiveChangeDisplayImage); - QObject::connect(this, &BioTrackerPlugin::emitAreaDescriptorUpdate, ctrAlg, &ControllerTrackingAlgorithm::receiveAreaDescriptorUpdate); - //tracking algorithm - QObject::connect(static_cast(ctrAlg->getModel()), SIGNAL(emitDimensionUpdate(int, int)), this, SIGNAL(emitDimensionUpdate(int, int))); - //controllertrackedcomponents - QObject::connect(this, &BioTrackerPlugin::emitAddTrajectory, ctrTrC, &ControllerTrackedComponent::receiveAddTrajectory, Qt::DirectConnection); - QObject::connect(this, &BioTrackerPlugin::emitRemoveTrajectory, ctrTrC, &ControllerTrackedComponent::receiveRemoveTrajectory, Qt::DirectConnection); - QObject::connect(this, &BioTrackerPlugin::emitRemoveTrajectoryId, ctrTrC, &ControllerTrackedComponent::receiveRemoveTrajectoryId, Qt::DirectConnection); - QObject::connect(this, &BioTrackerPlugin::emitRemoveTrackEntity, ctrTrC, &ControllerTrackedComponent::receiveRemoveTrackEntity, Qt::DirectConnection); - QObject::connect(this, &BioTrackerPlugin::emitValidateTrajectory, ctrTrC, &ControllerTrackedComponent::receiveValidateTrajectory, Qt::DirectConnection); - QObject::connect(this, &BioTrackerPlugin::emitValidateEntity, ctrTrC, &ControllerTrackedComponent::receiveValidateEntity, Qt::DirectConnection); - QObject::connect(this, &BioTrackerPlugin::emitEntityRotation, ctrTrC, &ControllerTrackedComponent::receiveEntityRotation, Qt::DirectConnection); - //connect this to enable moving of elements -> we need pxtocm() to create new poses - QObject::connect(this, &BioTrackerPlugin::emitAreaDescriptorUpdate, ctrTrC, &ControllerTrackedComponent::receiveAreaDescriptorUpdate, Qt::DirectConnection); - QObject::connect(this, &BioTrackerPlugin::emitMoveElement, ctrTrC, &ControllerTrackedComponent::receiveMoveElement, Qt::DirectConnection); - QObject::connect(this, &BioTrackerPlugin::emitSwapIds, ctrTrC, &ControllerTrackedComponent::receiveSwapIds, Qt::DirectConnection); - QObject::connect(this, &BioTrackerPlugin::emitToggleFixTrack, ctrTrC, &ControllerTrackedComponent::receiveToggleFixTrack, Qt::DirectConnection); - QObject::connect(this, &BioTrackerPlugin::emitCurrentFrameNumber, ctrTrC, &ControllerTrackedComponent::receiveCurrentFrameNumber, Qt::DirectConnection); -} - - -void BioTrackerPlugin::receiveAreaDescriptor(IModelAreaDescriptor *areaDescr) { - Q_EMIT emitAreaDescriptorUpdate(areaDescr); -} - -void BioTrackerPlugin::receiveCurrentFrameFromMainApp(std::shared_ptr mat, uint frameNumber) { - qobject_cast (m_TrackerController)->doTracking(mat, frameNumber); - - Q_EMIT emitCurrentFrameNumber(frameNumber); -} - -void BioTrackerPlugin::receiveCurrentFrameNumberFromMainApp(uint frameNumber) { - Q_EMIT emitCurrentFrameNumber(frameNumber); -} - -void BioTrackerPlugin::receiveCvMatFromController(std::shared_ptr mat, QString name) { - Q_EMIT emitCvMat(mat, name); -} - -void BioTrackerPlugin::receiveTrackingDone(uint framenumber) { - Q_EMIT emitTrackingDone(framenumber); -} - -void BioTrackerPlugin::receiveChangeDisplayImage(QString str) { - Q_EMIT emitChangeDisplayImage(str); -} - -void BioTrackerPlugin::receiveRemoveTrajectory(IModelTrackedTrajectory* trajectory) { - Q_EMIT emitRemoveTrajectory(trajectory); -} - -void BioTrackerPlugin::receiveAddTrajectory(QPoint pos) { - Q_EMIT emitAddTrajectory(pos); -} - -void BioTrackerPlugin::receiveSwapIds(IModelTrackedTrajectory * trajectory0, IModelTrackedTrajectory * trajectory1) { - Q_EMIT emitSwapIds(trajectory0, trajectory1); -} - -void BioTrackerPlugin::sendCorePermissions() { - // get plugin settings - BioTracker::Core::Settings *pluginSettings = BioTracker::Util::TypedSingleton::getInstance(CONFIGPARAM::CONFIG_INI_FILE); - - // signal permissions - bool enableView = pluginSettings->getValueOrDefault(GUIPARAM::ENABLE_CORE_COMPONENT_VIEW, true); - Q_EMIT emitCorePermission(std::pair(ENUMS::COREPERMISSIONS::COMPONENTVIEW, enableView)); - bool enableMove = pluginSettings->getValueOrDefault(GUIPARAM::ENABLE_CORE_COMPONENT_MOVE, true); - Q_EMIT emitCorePermission(std::pair(ENUMS::COREPERMISSIONS::COMPONENTMOVE, enableMove)); - bool enableRemove = pluginSettings->getValueOrDefault(GUIPARAM::ENABLE_CORE_COMPONENT_REMOVE, true); - Q_EMIT emitCorePermission(std::pair(ENUMS::COREPERMISSIONS::COMPONENTREMOVE, enableRemove)); - bool enableSwap = pluginSettings->getValueOrDefault(GUIPARAM::ENABLE_CORE_COMPONENT_ID_SWAP, true); - Q_EMIT emitCorePermission(std::pair(ENUMS::COREPERMISSIONS::COMPONENTSWAP, enableSwap)); - bool enableAdd = pluginSettings->getValueOrDefault(GUIPARAM::ENABLE_CORE_COMPONENT_ADD, true); - Q_EMIT emitCorePermission(std::pair(ENUMS::COREPERMISSIONS::COMPONENTADD, enableAdd)); - bool enableRotate = pluginSettings->getValueOrDefault(GUIPARAM::ENABLE_CORE_COMPONENT_ROTATE, true); - Q_EMIT emitCorePermission(std::pair(ENUMS::COREPERMISSIONS::COMPONENTROTATE, enableRotate)); -} - diff --git a/BioTracker/Plugin/BackgroundSubtraction/BioTrackerPlugin.h b/BioTracker/Plugin/BackgroundSubtraction/BioTrackerPlugin.h deleted file mode 100644 index 488b9abe..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/BioTrackerPlugin.h +++ /dev/null @@ -1,81 +0,0 @@ -#ifndef BIOTRACKERPLUGIN_H -#define BIOTRACKERPLUGIN_H - -#include "biotrackerplugin_global.h" -#include "opencv2/core/core.hpp" -#include "Interfaces/IBioTrackerContext.h" - -#include "Interfaces/IBioTrackerPlugin.h" - - -#include "QPointer" -#include "memory" -#include "QPoint" - -class BIOTRACKERPLUGINSHARED_EXPORT BioTrackerPlugin : public IBioTrackerPlugin { - Q_OBJECT - Q_PLUGIN_METADATA(IID "de.fu-berlin.mi.biorobotics.BioTrackerPlugin" FILE "BioTrackerPlugin.json") - Q_INTERFACES(IBioTrackerPlugin) - - public: - BioTrackerPlugin(); - - // IBioTrackerPlugin interface - IView* getTrackerParameterWidget(); - IView *getTrackerElementsWidget(); - IModel* getTrackerComponentModel(); - IModelTrackedComponentFactory *getComponentFactory(); - - public: - void createPlugin(); - void receiveCurrentFrameFromMainApp(std::shared_ptr mat, uint frameNumber); - void sendCorePermissions(); - - private: - void connectInterfaces(); -signals: - void emitCvMat(std::shared_ptr mat, QString name); - void emitTrackingDone(uint framenumber); - void emitChangeDisplayImage(QString str); - void emitAreaDescriptorUpdate(IModelAreaDescriptor *areaDescr); - void emitCorePermission(std::pair permission); - void emitRemoveTrajectory(IModelTrackedTrajectory* trajectory); - void emitAddTrajectory(QPoint pos); - void emitRemoveTrajectoryId(int id); - void emitValidateTrajectory(int id); - void emitValidateEntity(IModelTrackedTrajectory* trajectory, uint frameNumber); - void emitRemoveTrackEntity(IModelTrackedTrajectory* trajectory, uint frameNumber); - void emitMoveElement(IModelTrackedTrajectory* trajectory, uint frameNumber, QPoint pos); - void emitSwapIds(IModelTrackedTrajectory* trajectory0, IModelTrackedTrajectory* trajectory1); - void emitCurrentFrameNumber(uint frameNumber); - void emitToggleFixTrack(IModelTrackedTrajectory* trajectory, bool toggle); - void emitEntityRotation(IModelTrackedTrajectory* trajectory, double angle, uint frameNumber); - - void emitDimensionUpdate(int x, int y); - -public slots: - void receiveRemoveTrajectory(IModelTrackedTrajectory* trajectory); - void receiveAddTrajectory(QPoint pos); - void receiveSwapIds(IModelTrackedTrajectory* trajectory0, IModelTrackedTrajectory* trajectory1); - void receiveCurrentFrameNumberFromMainApp(uint frameNumber); - -private slots: - void receiveCvMatFromController(std::shared_ptr mat, QString name); - void receiveTrackingDone(uint framenumber); - void receiveChangeDisplayImage(QString str); - void receiveAreaDescriptor(IModelAreaDescriptor *areaDescr); - -private: - IController *m_TrackerController; - IController *m_ComponentController; - IController *m_AreaDescrController; - - IBioTrackerContext *m_PluginContext; - -public: - QList m_CorePermissions; - - -}; - -#endif // BIOTRACKERPLUGIN_H diff --git a/BioTracker/Plugin/BackgroundSubtraction/BioTrackerPlugin.json b/BioTracker/Plugin/BackgroundSubtraction/BioTrackerPlugin.json deleted file mode 100644 index 4bf579c1..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/BioTrackerPlugin.json +++ /dev/null @@ -1,6 +0,0 @@ -{ "type" : "TrackingPlugin", - "name" : "Background Subtraction Tracker", - "longname" : "some long name", - "version" : "1.1", - "dependencies" : [] -} diff --git a/BioTracker/Plugin/BackgroundSubtraction/BioTrackerPlugin.pro b/BioTracker/Plugin/BackgroundSubtraction/BioTrackerPlugin.pro deleted file mode 100644 index 54ff62f5..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/BioTrackerPlugin.pro +++ /dev/null @@ -1,70 +0,0 @@ -#------------------------------------------------- -# -# Project created by QtCreator 2016-11-25T11:43:53 -# -#------------------------------------------------- - -QT += widgets - -TEMPLATE = lib -CONFIG += plugin -TARGET = $$qtLibraryTarget(IBioTrackerPlugin) - -INCLUDEPATH += ../../Interfaces/BioTrackerInterfaces/ -LIBS += ../../Interfaces/build-BioTrackerInterfaces-Desktop-Debug/libBioTrackerInterfaces.a - -DEFINES += BIOTRACKERPLUGIN_LIBRARY - -INCLUDEPATH += /usr/local/include/opencv -LIBS += -L/usr/local/lib \ --lopencv_core \ --lopencv_imgproc \ --lopencv_highgui \ --lopencv_ml \ --lopencv_video \ --lopencv_features2d \ --lopencv_calib3d \ --lopencv_objdetect \ --lopencv_contrib \ --lopencv_legacy \ --lopencv_flann - -SOURCES += BioTrackerPlugin.cpp \ - Model/TrackedComponents/TrackedComponentFactory.cpp \ - Model/TrackedComponents/TrackedElement.cpp \ - Model/TrackedComponents/TrackedTrajectory.cpp \ - Model/BioTrackerTrackingAlgorithm.cpp \ - Model/null_Model.cpp \ - Controller/ControllerTrackingAlgorithm.cpp \ - Controller/null_Controller.cpp \ - Controller/ControllerTrackedComponent.cpp \ - View/TrackedElementView.cpp \ - Model/TrackerParameter.cpp \ - View/TrackerParameterView.cpp - - -HEADERS += BioTrackerPlugin.h\ - biotrackerplugin_global.h \ - Model/TrackedComponents/TrackedComponentFactory.h \ - Model/TrackedComponents/TrackedElement.h \ - Model/TrackedComponents/TrackedTrajectory.h \ - Model/BioTrackerTrackingAlgorithm.h \ - Model/null_Model.h \ - Controller/ControllerTrackingAlgorithm.h \ - Controller/null_Controller.h \ - Controller/ControllerTrackedComponent.h \ - View/TrackedElementView.h \ - Model/TrackerParameter.h \ - View/TrackerParameterView.h - - -unix { - target.path = /usr/lib - INSTALLS += target -} - -DISTFILES += \ - BioTrackerPlugin.json - -FORMS += \ - View/TrackerParameterView.ui diff --git a/BioTracker/Plugin/BackgroundSubtraction/CMakeLists.txt b/BioTracker/Plugin/BackgroundSubtraction/CMakeLists.txt deleted file mode 100644 index 62aa2ff0..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/CMakeLists.txt +++ /dev/null @@ -1,29 +0,0 @@ -############################################################## -#### Biotracker: BackgroundSubtraction -############################################################## - - -add_definitions( -DBIOTRACKERPLUGIN_LIBRARY=1 ) - -include(${util_cmakes}CMakeVSSugar.txt) - -include_directories(${CMAKE_CURRENT_SOURCE_DIR}) - -message("Configuring BackgroundSubtraction...") -set(EXE_NAME BackgroundSubtraction.tracker) -add_library(${EXE_NAME} SHARED ${_util_source_list} ) - -target_link_libraries(${EXE_NAME} ${LIBS}) -target_link_libraries (${EXE_NAME} Qt5::Core Qt5::Gui Qt5::Xml Qt5::Network Qt5::Widgets) -target_link_libraries (${EXE_NAME} Qt5::Multimedia Qt5::MultimediaWidgets Qt5::OpenGL ) -target_link_libraries(${EXE_NAME} Biotracker_interfaces Biotracker_utility) -target_link_libraries(${EXE_NAME} ${OpenCV_LIBRARIES} ${Boost_LIBRARIES}) - -include_directories(${Boost_INCLUDE_DIRS}) - -set_target_properties(${EXE_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON) -set_target_properties(${EXE_NAME} PROPERTIES - CXX_STANDARD 17 - CXX_STANDARD_REQUIRED YES - CXX_EXTENSIONS NO -) \ No newline at end of file diff --git a/BioTracker/Plugin/BackgroundSubtraction/Controller/ControllerTrackedComponent.cpp b/BioTracker/Plugin/BackgroundSubtraction/Controller/ControllerTrackedComponent.cpp deleted file mode 100644 index 57b1ac92..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Controller/ControllerTrackedComponent.cpp +++ /dev/null @@ -1,172 +0,0 @@ -#include "ControllerTrackedComponent.h" -#include "Model/TrackedComponents/TrackedElement.h" -#include "Model/TrackedComponents/TrackedTrajectory.h" -#include "View/TrackedElementView.h" -#include "qdebug.h" -#include "qmath.h" - -ControllerTrackedComponent::ControllerTrackedComponent(QObject *parent, IBioTrackerContext *context, ENUMS::CONTROLLERTYPE ctr) : - IController(parent, context, ctr) -{ - m_currentFrameNumber = 0; -} - -void ControllerTrackedComponent::createView() -{ - m_View = new TrackedElementView(0, this, m_Model); -} - -void ControllerTrackedComponent::connectModelToController() -{ - -} - -void ControllerTrackedComponent::connectControllerToController() -{ -} - -void createTrajectories(int count, TrackedTrajectory* all) { -} - -void ControllerTrackedComponent::createModel() -{ - TrackedTrajectory *t = new TrackedTrajectory(this, "All"); - m_Model = t; -} - - -IView *ControllerTrackedComponent::getTrackingElementsWidget() -{ - return m_View; -} - -void ControllerTrackedComponent::receiveRemoveTrajectory(IModelTrackedTrajectory * trajectory) -{ - trajectory->setValid(false); - qDebug() << "TRACKER: Track" << trajectory->getId() << "set invalid"; -} - -void ControllerTrackedComponent::receiveRemoveTrajectoryId(int id) -{ - TrackedTrajectory* allTraj = qobject_cast(m_Model); - if (allTraj) { - IModelTrackedComponent* traj = allTraj->getChild(id - 1); - traj->setValid(false); - qDebug() << "TRACKER: Track" << id << "set invalid"; - } -} - -void ControllerTrackedComponent::receiveValidateTrajectory(int id) -{ - TrackedTrajectory* allTraj = qobject_cast(m_Model); - if (allTraj) { - IModelTrackedComponent* traj = allTraj->getChild(id - 1); - traj->setValid(true); - qDebug() << "TRACKER: Track" << id << "validated"; - } -} - -void ControllerTrackedComponent::receiveValidateEntity(IModelTrackedTrajectory * trajectory, uint frameNumber) -{ - trajectory->getChild(frameNumber)->setValid(true); - qDebug() << "TRACKER: Track " << trajectory->getId() << " entity #" << frameNumber << "set valid"; -} - -void ControllerTrackedComponent::receiveRemoveTrackEntity(IModelTrackedTrajectory * trajectory, uint frameNumber) -{ - trajectory->getChild(frameNumber)->setValid(false); - qDebug() << "TRACKER: Track " << trajectory->getId() << " entity #" << frameNumber << "deleted (set invalid)"; -} - -void ControllerTrackedComponent::receiveAddTrajectory(QPoint position) -{ - std::chrono::system_clock::time_point start = std::chrono::system_clock::now(); - - cv::Point newPosPx = cv::Point(position.x(), position.y()); - cv::Point2f newPosCm = m_areaDescr->pxToCm(newPosPx); - - TrackedTrajectory* newTraj = new TrackedTrajectory(); - TrackedElement* firstElem = new TrackedElement(newTraj, "n.a.", newTraj->getId()); - - FishPose newPose = FishPose(newPosCm, newPosPx, 0, 0, 20, 20, 0.0); - - firstElem->setFishPose(newPose); - - - firstElem->setTime(start); - newTraj->add(firstElem, m_currentFrameNumber); - TrackedTrajectory* allTraj = qobject_cast(m_Model); - if (allTraj) { - allTraj->add(newTraj); - qDebug() << "TRACKER: Trajectory added at" << firstElem->getXpx() << "," << firstElem->getYpx(); - } -} - -void ControllerTrackedComponent::receiveMoveElement(IModelTrackedTrajectory* trajectory, uint frameNumber, QPoint position) -{ - TrackedTrajectory* traj = dynamic_cast(trajectory); - // don't move when frame number under 0 and main trajectory (id's: 0)!! - if (!(traj->getId() == 0) && frameNumber >= 0) { - TrackedElement* element = dynamic_cast(traj->getChild(frameNumber)); - - //TODO rewrite this when default ipose is implemented... - FishPose oldPose = element->getFishPose(); - - cv::Point newPosPx = cv::Point(position.x(), position.y()); - cv::Point2f newPosCm = m_areaDescr->pxToCm(newPosPx); - // ignore blobs outside the tracking area - if (!m_areaDescr->inTrackingArea(newPosPx)) { - qDebug() << "Attention! You moved the entity outside of the tracking area!"; - } - - FishPose newPose = FishPose(newPosCm, newPosPx, oldPose.orientation_rad(), oldPose.orientation_deg(), oldPose.width(), oldPose.height(), oldPose.getScore()); - - element->setFishPose(newPose); - } -} - -void ControllerTrackedComponent::receiveSwapIds(IModelTrackedTrajectory * trajectory0, IModelTrackedTrajectory * trajectory1) -{ - TrackedTrajectory* traj0 = dynamic_cast(trajectory0); - TrackedTrajectory* traj1 = dynamic_cast(trajectory1); - - if (traj0 && traj1) { - if (traj0->getId() !=0 && traj1->getId() !=0) { - int traj0Id = traj0->getId(); - int traj1Id = traj1->getId(); - - traj0->setId(traj1Id); - traj1->setId(traj0Id); - - qDebug() << "TRACKER: Swap IDs " << traj0Id << "and " << traj1Id; - } - } -} - -void ControllerTrackedComponent::receiveToggleFixTrack(IModelTrackedTrajectory * trajectory, bool toggle) -{ - qDebug() << "TRACKER: Fix trajectory " << trajectory->getId(); - trajectory->setFixed(toggle); -} - -void ControllerTrackedComponent::receiveEntityRotation(IModelTrackedTrajectory * trajectory, double angle, uint frameNumber) -{ - TrackedTrajectory* traj = dynamic_cast(trajectory); - if (traj) { - IModelTrackedPoint* pointLike = dynamic_cast(traj->getChild(frameNumber)); - if (pointLike) { - pointLike->setDeg(float(angle)); - pointLike->setRad(float(qDegreesToRadians(angle))); - } - } -} - -void ControllerTrackedComponent::receiveCurrentFrameNumber(uint framenumber) -{ - m_currentFrameNumber = (int)framenumber; -} - -void ControllerTrackedComponent::receiveAreaDescriptorUpdate(IModelAreaDescriptor * areaDescr) -{ - m_areaDescr = areaDescr; -} diff --git a/BioTracker/Plugin/BackgroundSubtraction/Controller/ControllerTrackedComponent.h b/BioTracker/Plugin/BackgroundSubtraction/Controller/ControllerTrackedComponent.h deleted file mode 100644 index 355098dc..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Controller/ControllerTrackedComponent.h +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef CONTROLLERTRACKEDCOMPONENT_H -#define CONTROLLERTRACKEDCOMPONENT_H - -#include "Interfaces/IController/IController.h" -#include "QPoint" -#include "Interfaces/IModel/IModelTrackedTrajectory.h" -#include "Interfaces/IModel/IModelAreaDescriptor.h" - -class ControllerTrackedComponent : public IController -{ - Q_OBJECT -public: - ControllerTrackedComponent(QObject *parent = 0, IBioTrackerContext *context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::COMPONENT); - - IView *getTrackingElementsWidget(); -public Q_SLOTS: - void receiveAddTrajectory(QPoint position); - void receiveRemoveTrajectory(IModelTrackedTrajectory* trajectory); - void receiveRemoveTrajectoryId(int id); - void receiveRemoveTrackEntity(IModelTrackedTrajectory* trajectory, uint frameNumber); - void receiveValidateTrajectory(int id); - void receiveValidateEntity(IModelTrackedTrajectory* trajectory, uint frameNumber); - void receiveMoveElement(IModelTrackedTrajectory* trajectory, uint frameNumber, QPoint position); - /* TODO Swaps ID's of last elements (-> swap elements) or swap ID's of trajectories and all of its elements? - */ - void receiveSwapIds(IModelTrackedTrajectory* trajectory0, IModelTrackedTrajectory* trajectory1); - void receiveToggleFixTrack(IModelTrackedTrajectory* trajectory, bool toggle); - void receiveEntityRotation(IModelTrackedTrajectory* trajectory, double angle, uint frameNumber); - void receiveCurrentFrameNumber(uint framenumber); - - void receiveAreaDescriptorUpdate(IModelAreaDescriptor *areaDescr); - - // IController interface -protected: - void createModel() override; - void createView() override; - void connectModelToController() override; - void connectControllerToController() override; - - //members - int m_currentFrameNumber; - IModelAreaDescriptor* m_areaDescr; -}; - -#endif // CONTROLLERTRACKEDCOMPONENT_H diff --git a/BioTracker/Plugin/BackgroundSubtraction/Controller/ControllerTrackingAlgorithm.cpp b/BioTracker/Plugin/BackgroundSubtraction/Controller/ControllerTrackingAlgorithm.cpp deleted file mode 100644 index f33954a3..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Controller/ControllerTrackingAlgorithm.cpp +++ /dev/null @@ -1,80 +0,0 @@ -#include "ControllerTrackingAlgorithm.h" -#include "ControllerTrackedComponent.h" - -#include "Model/TrackerParameter.h" -#include "View/TrackerParameterView.h" -#include "View/TrackedElementView.h" - -ControllerTrackingAlgorithm::ControllerTrackingAlgorithm(QObject *parent, IBioTrackerContext *context, ENUMS::CONTROLLERTYPE ctr) : - IController(parent, context, ctr) -{ - m_BioTrackerContext = context; -} - -void ControllerTrackingAlgorithm::connectControllerToController() -{ - IController * ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::COMPONENT); - QPointer< ControllerTrackedComponent > ctrComponent = qobject_cast(ctr); - - m_TrackedTrajectoryMajor = ctrComponent->getModel(); -} - -void ControllerTrackingAlgorithm::doTracking(std::shared_ptr mat, uint number) -{ - qobject_cast(m_Model)->doTracking(mat, number); -} - -IView *ControllerTrackingAlgorithm::getTrackingParameterWidget() -{ - return m_View; -} - -void ControllerTrackingAlgorithm::createModel() -{ - connectControllerToController(); - - m_TrackingParameter = new TrackerParameter(this); - - m_Model = new BioTrackerTrackingAlgorithm(m_TrackingParameter, m_TrackedTrajectoryMajor); -} - -void ControllerTrackingAlgorithm::createView() -{ - m_View = new TrackerParameterView(0, this, m_TrackingParameter); -} - -void ControllerTrackingAlgorithm::connectModelToController() -{ - BioTrackerTrackingAlgorithm *trackingAlg = qobject_cast(m_Model); - QObject::connect(trackingAlg, &BioTrackerTrackingAlgorithm::emitCvMatA, this, &ControllerTrackingAlgorithm::receiveCvMatFromTrackingAlgorithm); - QObject::connect(trackingAlg, &BioTrackerTrackingAlgorithm::emitTrackingDone, this, &ControllerTrackingAlgorithm::receiveTrackingDone); - QObject::connect(trackingAlg, &BioTrackerTrackingAlgorithm::emitChangeDisplayImage, this, &ControllerTrackingAlgorithm::receiveChangeDisplayImage); - QObject::connect(this, &ControllerTrackingAlgorithm::emitAreaDescriptorUpdate, trackingAlg, &BioTrackerTrackingAlgorithm::receiveAreaDescriptorUpdate); - - QObject::connect(static_cast(m_View), &TrackerParameterView::parametersChanged, - trackingAlg, &BioTrackerTrackingAlgorithm::receiveParametersChanged); - - //enable the tracker to send video dimension updates to the views via signal - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::COMPONENT); - IView *v = qobject_cast(ctr)->getView(); - TrackedElementView *v2 = dynamic_cast(v); - QObject::connect(trackingAlg, SIGNAL(emitDimensionUpdate(int, int)), v2, SLOT(rcvDimensionUpdate(int, int))); -} - -void ControllerTrackingAlgorithm::receiveCvMatFromTrackingAlgorithm(std::shared_ptr mat, QString name) -{ - Q_EMIT emitCvMat(mat, name); -} - -void ControllerTrackingAlgorithm::receiveTrackingDone(uint framenumber) -{ - Q_EMIT emitTrackingDone(framenumber); -} - -void ControllerTrackingAlgorithm::receiveChangeDisplayImage(QString str) { - Q_EMIT emitChangeDisplayImage(str); -} - -void ControllerTrackingAlgorithm::receiveAreaDescriptorUpdate(IModelAreaDescriptor *areaDescr) { - Q_EMIT emitAreaDescriptorUpdate(areaDescr); -} diff --git a/BioTracker/Plugin/BackgroundSubtraction/Controller/ControllerTrackingAlgorithm.h b/BioTracker/Plugin/BackgroundSubtraction/Controller/ControllerTrackingAlgorithm.h deleted file mode 100644 index 75e565a4..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Controller/ControllerTrackingAlgorithm.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef CONTROLLERTRACKINGALGORITHM_H -#define CONTROLLERTRACKINGALGORITHM_H - -#include "Interfaces/IController/IController.h" -#include "Model/BioTrackerTrackingAlgorithm.h" -#include "Interfaces/IBioTrackerContext.h" -#include "Interfaces/IModel/IModelDataExporter.h" - - -class ControllerTrackingAlgorithm : public IController -{ - Q_OBJECT -public: - ControllerTrackingAlgorithm(QObject *parent = 0, IBioTrackerContext *context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); - - // IController interface -public: - void connectControllerToController() override; - - void doTracking(std::shared_ptr mat, uint number); - - IView *getTrackingParameterWidget(); - -public Q_SLOTS: - void receiveAreaDescriptorUpdate(IModelAreaDescriptor *areaDescr); - -protected: - void createModel() override; - void createView() override; - void connectModelToController() override; - -Q_SIGNALS: - void emitCvMat(std::shared_ptr mat, QString name); - void emitTrackingDone(uint framenumber); - void emitChangeDisplayImage(QString str); - void emitAreaDescriptorUpdate(IModelAreaDescriptor *areaDescr); - -private Q_SLOTS: - void receiveCvMatFromTrackingAlgorithm(std::shared_ptr mat, QString name); - void receiveTrackingDone(uint framenumber); - void receiveChangeDisplayImage(QString str); - -private: - IModel* m_TrackingParameter; - IModel *m_TrackedTrajectoryMajor; -}; - -#endif // CONTROLLERTRACKINGALGORITHM_H diff --git a/BioTracker/Plugin/BackgroundSubtraction/Controller/null_Controller.cpp b/BioTracker/Plugin/BackgroundSubtraction/Controller/null_Controller.cpp deleted file mode 100644 index 612c02f3..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Controller/null_Controller.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include "null_Controller.h" - -null_Controller::null_Controller() -{ - -} - -void null_Controller::createModel() -{ - -} - -void null_Controller::createView() -{ - -} - -void null_Controller::connectModelToController() -{ - -} - -void null_Controller::connectControllerToController() -{ - -} diff --git a/BioTracker/Plugin/BackgroundSubtraction/Controller/null_Controller.h b/BioTracker/Plugin/BackgroundSubtraction/Controller/null_Controller.h deleted file mode 100644 index a0fcc211..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Controller/null_Controller.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef NULL_CONTROLLER_H -#define NULL_CONTROLLER_H - -#include "Interfaces/IController/IController.h" -class null_Controller : public IController -{ -public: - null_Controller(); - - // IController interface -protected: - void createModel() override; - void createView() override; - void connectModelToController() override; - void connectControllerToController() override; -}; - -#endif // NULL_CONTROLLER_H diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/BioTrackerTrackingAlgorithm.cpp b/BioTracker/Plugin/BackgroundSubtraction/Model/BioTrackerTrackingAlgorithm.cpp deleted file mode 100644 index ec512b81..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/BioTrackerTrackingAlgorithm.cpp +++ /dev/null @@ -1,186 +0,0 @@ -#include "BioTrackerTrackingAlgorithm.h" -#include -#include "TrackedComponents/TrackedComponentFactory.h" -#include - -#include "settings/Settings.h" - -BioTrackerTrackingAlgorithm::BioTrackerTrackingAlgorithm(IModel *parameter, IModel *trajectory) : _ipp((TrackerParameter*)parameter) -{ - _TrackingParameter = (TrackerParameter*)parameter; - _TrackedTrajectoryMajor = (TrackedTrajectory*)trajectory; - _nn2d = std::make_shared(_TrackedTrajectoryMajor); - BioTracker::Core::Settings *set = _TrackingParameter->getSettings(); - - _noFish = -1; - - if (set->getValueOrDefault(FISHTANKPARAM::FISHTANK_ENABLE_NETWORKING, false)) { - _listener = new TcpListener(this); - _listener->listen(QHostAddress::Any, set->getValueOrDefault(FISHTANKPARAM::FISHTANK_NETWORKING_PORT, 54444)); - QObject::connect(_listener, SIGNAL(newConnection()), _listener, SLOT(acceptConnection())); - } - - - _lastImage = nullptr; - _lastFramenumber = -1; -} - - -void BioTrackerTrackingAlgorithm::receiveAreaDescriptorUpdate(IModelAreaDescriptor *areaDescr) { - _AreaInfo = areaDescr; - _bd.setAreaInfo(_AreaInfo); -} - -BioTrackerTrackingAlgorithm::~BioTrackerTrackingAlgorithm() -{ -} - -std::vector BioTrackerTrackingAlgorithm::getLastPositionsAsPose() { - //TODO: This seems kinda fragile: I just assume that the tree has this very certain structure: - // Trajectory -> M Trajectories -> N TrackedElements - // For every of M Trajectories grab the last (highest index) of TrackedElements. - //TODO: If we are tracking somewhere in the middle, this is bad. Do it by id! - std::vector last; - for (int i = 0; i < _TrackedTrajectoryMajor->size(); i++) { - TrackedTrajectory *t = dynamic_cast(_TrackedTrajectoryMajor->getChild(i)); - if (t && t->getValid() && !t->getFixed()) { - TrackedElement *e = (TrackedElement *)t->getLastChild(); - last.push_back(e->getFishPose()); - } - } - return last; -} - -void BioTrackerTrackingAlgorithm::refreshPolygon() { - -} - -void BioTrackerTrackingAlgorithm::receiveParametersChanged() { - if (_lastFramenumber >= 0 && _lastImage && !_lastImage->empty()) { - doTracking(_lastImage, _lastFramenumber); - } -} - -void BioTrackerTrackingAlgorithm::sendSelectedImage(std::map> *images) { - - std::shared_ptr sendImage; - //Send forth whatever the user selected - switch (_TrackingParameter->getSendImage()) { - case 0: //Send none - //sendImage = images.find(std::string("Original"))->second; - //Q_EMIT emitCvMatA(sendImage, QString("Original")); - Q_EMIT emitChangeDisplayImage("Original"); - break; - case 1: - sendImage = images->find(std::string("Binarized"))->second; - Q_EMIT emitCvMatA(sendImage, QString("Binarized")); - Q_EMIT emitChangeDisplayImage(QString("Binarized")); - break; - case 2: - sendImage = images->find(std::string("Eroded"))->second; - Q_EMIT emitCvMatA(sendImage, QString("Eroded")); - Q_EMIT emitChangeDisplayImage(QString("Eroded")); - break; - case 3: - sendImage = images->find(std::string("Dilated"))->second; - Q_EMIT emitCvMatA(sendImage, QString("Dilated")); - Q_EMIT emitChangeDisplayImage(QString("Dilated")); - break; - case 4: - sendImage = images->find(std::string("Difference"))->second; - Q_EMIT emitCvMatA(sendImage, QString("Difference")); - Q_EMIT emitChangeDisplayImage(QString("Difference")); - break; - case 5: - sendImage = images->find(std::string("Background"))->second; - Q_EMIT emitCvMatA(sendImage, QString("Background")); - Q_EMIT emitChangeDisplayImage(QString("Background")); - break; - } -} - -void BioTrackerTrackingAlgorithm::doTracking(std::shared_ptr p_image, uint framenumber) -{ - _ipp.m_TrackingParameter = _TrackingParameter; - _lastImage = p_image; - _lastFramenumber = framenumber; - - //dont do nothing if we ain't got an image - if (p_image->empty()) { - return; - } - - if (_imageX != p_image->size().width || _imageY != p_image->size().height) { - _imageX = p_image->size().width; - _imageY = p_image->size().height; - Q_EMIT emitDimensionUpdate(_imageX, _imageY); - } - - std::chrono::system_clock::time_point start = std::chrono::system_clock::now(); - - //Refuse to run tracking if we have no area info... - if (_AreaInfo == nullptr) { - Q_EMIT emitTrackingDone(framenumber); - return; - } - - //The user changed the # of fish. Reset the history and start over! - if (_noFish != _TrackedTrajectoryMajor->validCount()) { - _noFish = _TrackedTrajectoryMajor->validCount(); - //resetFishHistory(_noFish); - _nn2d = std::make_shared(_TrackedTrajectoryMajor); - } - - if (_TrackingParameter->getResetBackground()) { - _TrackingParameter->setResetBackground(false); - _ipp.resetBackgroundImage(); - } - - //Do the preprocessing - std::map> images = _ipp.preProcess(p_image); - std::shared_ptr dilated = images.find(std::string("Dilated"))->second; - std::shared_ptr greyMat = images.find(std::string("Greyscale"))->second; - - //Find blobs via ellipsefitting - _bd.setMaxBlobSize(_TrackingParameter->getMaxBlobSize()); - _bd.setMinBlobSize(_TrackingParameter->getMinBlobSize()); - std::vector blobs = _bd.getPoses(*dilated, *greyMat); - - // Never switch the position of the trajectories. The NN2d mapper relies on this! - // If you mess up the order, add or remove some t, then create a new mapper. - std::vector fish = getLastPositionsAsPose(); - - //Find new positions using 2D nearest neighbour - std::tuple, std::vector> poses = _nn2d->getNewPoses(_TrackedTrajectoryMajor, framenumber, blobs); - - //Insert new poses into data structure - int trajNumber = 0; - for (int i = 0; i < _TrackedTrajectoryMajor->size(); i++) { - TrackedTrajectory *t = dynamic_cast(_TrackedTrajectoryMajor->getChild(i)); - if (t && t->getValid() && !t->getFixed()) { - TrackedElement *e = new TrackedElement(t, "n.a.", t->getId()); - - e->setFishPose(std::get<0>(poses)[trajNumber]); - e->setTime(start); - t->add(e, framenumber); - trajNumber++; - } - } - - //Send forth new positions to the robotracker, if networking is enabled - if (_TrackingParameter->getDoNetwork()){ - std::vector ps = std::get<0>(poses); - _listener->sendPositions(framenumber, ps, std::vector(), start); - } - - sendSelectedImage(&images); - - //First the user still wants to see the original image, right? - if (framenumber==1) { - Q_EMIT emitChangeDisplayImage("Original"); - } - - std::string newSel = _TrackingParameter->getNewSelection(); - - Q_EMIT emitTrackingDone(framenumber); -} diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/BioTrackerTrackingAlgorithm.h b/BioTracker/Plugin/BackgroundSubtraction/Model/BioTrackerTrackingAlgorithm.h deleted file mode 100644 index edd23c64..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/BioTrackerTrackingAlgorithm.h +++ /dev/null @@ -1,70 +0,0 @@ -#ifndef BIOTRACKERTRACKINGALGORITHM_H -#define BIOTRACKERTRACKINGALGORITHM_H - - -#include "Interfaces/IModel/IModel.h" - -#include "TrackerParameter.h" - -#include -#include "Interfaces/IModel/IModelTrackingAlgorithm.h" -#include "Interfaces/IModel/IModelDataExporter.h" -#include "Model/TrackedComponents/TrackedElement.h" -#include "Model/TrackedComponents/TrackedTrajectory.h" -#include "Model/TrackingAlgorithm/imageProcessor/detector/blob/cvBlob/BlobsDetector.h" -#include "Model/TrackingAlgorithm/imageProcessor/preprocessor/ImagePreProcessor.h" -#include "Model/TrackingAlgorithm/NN2dMapper.h" -#include "Interfaces/IModel/IModelAreaDescriptor.h" -#include - -#include "Model/Network/TcpListener.h" - -class BioTrackerTrackingAlgorithm : public IModelTrackingAlgorithm -{ - Q_OBJECT -public: - BioTrackerTrackingAlgorithm(IModel* parameter, IModel* trajectory); - ~BioTrackerTrackingAlgorithm(); - -Q_SIGNALS: - void emitCvMatA(std::shared_ptr image, QString name); - void emitDimensionUpdate(int x, int y); - void emitTrackingDone(uint framenumber); - - // ITrackingAlgorithm interface -public Q_SLOTS: - void doTracking(std::shared_ptr image, uint framenumber) override; - void receiveAreaDescriptorUpdate(IModelAreaDescriptor *areaDescr); - void receiveParametersChanged(); - -private: - void refreshPolygon(); - void sendSelectedImage(std::map>* images); - - std::vector getLastPositionsAsPose(); - - TrackedTrajectory* _TrackedTrajectoryMajor; - TrackerParameter* _TrackingParameter; - IModelAreaDescriptor* _AreaInfo; - - TcpListener* _listener; - - ImagePreProcessor _ipp; - BlobsDetector _bd; - std::shared_ptr _nn2d; - - // background subtraction - cv::Ptr _pMOG; - - int _noFish; - - //std::ofstream _ofs; - - int _imageX; - int _imageY; - - std::shared_ptr _lastImage; - uint _lastFramenumber; -}; - -#endif // BIOTRACKERTRACKINGALGORITHM_H diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/Network/TcpListener.cpp b/BioTracker/Plugin/BackgroundSubtraction/Model/Network/TcpListener.cpp deleted file mode 100644 index be733377..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/Network/TcpListener.cpp +++ /dev/null @@ -1,67 +0,0 @@ -#include "TcpListener.h" - -#include - -TcpListener::TcpListener(QObject *parent) : QTcpServer(parent) -{ -} - -void TcpListener::acceptConnection() -{ - while (this->hasPendingConnections()) - { - QTcpSocket *socket = this->nextPendingConnection(); - _sockets.push_back(socket); - } -} - -void TcpListener::sendPositionsToSocket(std::string packet) -{ - - std::vector::iterator sock_it = _sockets.begin(); - for (sock_it = _sockets.begin(); sock_it != _sockets.end(); ++sock_it) - (*sock_it)->write(packet.c_str()); -} - -std::string TcpListener::sendPositions( - int frameNo, - const std::vector& poses, - const std::vector& polygon, - std::chrono::system_clock::time_point ts) -{ - std::stringstream str; - str << "frame:" << frameNo << ";"; - - str << "polygon:" << polygon.size() << ";"; - for (auto vertex = polygon.cbegin(); vertex != polygon.cend(); ++vertex) - { - str << vertex->x << "x" << vertex->y << ";"; - } - - int fishCount = poses.size(); - int fi = 0; - str << "fishcount:" << fishCount << ";"; - - for (int i=0; i < poses.size(); i++) - { - - str << i+1 << "," // the id of the fish - << poses[i].position_cm().x << "," // real position in cm - x-coordinate - << poses[i].position_cm().y << "," // real position in cm - y-coordinate - << poses[i].orientation_rad() << "," // orientation in radian - << poses[i].orientation_deg() << "," // orientation in degree - << poses[i].width() << "," // size of the fish blob: width - << poses[i].height() << "," // size of the fish blob: height - << long(std::chrono::duration_cast(ts.time_since_epoch()).count()) << "," // the time stamp - << "F" << (((i + 1) == poses.size()) ? ";" : "&"); // F: obsolete "isRobofish" flag (F: not a robofish) - } - str << "end\n"; - - //std::cout << str.str() << std::endl; - -#ifdef SAVETRACKINGPACKAGES - _trackingInfoOutputFile4Simulation << str.str(); -#endif - sendPositionsToSocket(str.str()); - return str.str(); -} diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/Network/TcpListener.h b/BioTracker/Plugin/BackgroundSubtraction/Model/Network/TcpListener.h deleted file mode 100644 index 635ca8f9..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/Network/TcpListener.h +++ /dev/null @@ -1,31 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include - -#include "Model/TrackedComponents/pose/FishPose.h" - -#include -#include - -class TcpListener : public QTcpServer -{ - Q_OBJECT - -public: - TcpListener(QObject *parent = 0); - -public slots: - void acceptConnection(); - void sendPositionsToSocket(std::string packet); - std::string sendPositions(int frameNo, - const std::vector& poses, - const std::vector& polygon, - std::chrono::system_clock::time_point ts); - -private: - std::vector _sockets; -}; diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/TrackedComponentFactory.cpp b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/TrackedComponentFactory.cpp deleted file mode 100644 index 6d78033c..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/TrackedComponentFactory.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include "TrackedComponentFactory.h" - -#include "TrackedTrajectory.h" -#include "TrackedElement.h" - -TrackedComponentFactory::TrackedComponentFactory() -{ - -} - -TrackedComponentFactory::~TrackedComponentFactory() -{ - -} - -QList TrackedComponentFactory::getElementTypes() { - return QList{ "TrackedElement" }; -} - -IModelTrackedComponent *TrackedComponentFactory::createTrackedElement(QString name) -{ - return new TrackedElement(this, "n.a."); -} - -IModelTrackedComponent *TrackedComponentFactory::createTrackedObject(QString name) -{ - TrackedTrajectory *t = new TrackedTrajectory(); - TrackedElement *e = new TrackedElement(this, "n.a.", 0); - t->add(e, 0); - return t; -} - -IModelTrackedComponent *TrackedComponentFactory::createTrackedTrajectory(QString name) -{ - return new TrackedTrajectory(); -} diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/TrackedComponentFactory.h b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/TrackedComponentFactory.h deleted file mode 100644 index 408d7232..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/TrackedComponentFactory.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef TRACKEDCOMPONENTFACTORY_H -#define TRACKEDCOMPONENTFACTORY_H - -#include "Interfaces/IModel/IModelTrackedComponentFactory.h" - -class TrackedComponentFactory : public IModelTrackedComponentFactory -{ - Q_OBJECT -public: - TrackedComponentFactory(); - ~TrackedComponentFactory(); - - QList getElementTypes() override; - - // ITrackedComponentFactory interface -protected: - IModelTrackedComponent *createTrackedElement(QString name) override; - IModelTrackedComponent *createTrackedObject(QString name) override; - IModelTrackedComponent *createTrackedTrajectory(QString name) override; -}; - -#endif // TRACKEDOBJECTFACTORY_H diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/TrackedElement.cpp b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/TrackedElement.cpp deleted file mode 100644 index 8b0795fc..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/TrackedElement.cpp +++ /dev/null @@ -1,184 +0,0 @@ -#include "TrackedElement.h" -#include "TrackedTrajectory.h" -#include "QDebug" -#include "QRect" -#include "QBrush" -#include "QPainter" -#include "QtMath" - -TrackedElement::TrackedElement(QObject *parent, QString name, int id) : - IModelTrackedPoint(parent) -{ - _x = 0; - _y = 0; - _id = id; - _deg = 0; - _rad = 0; - _valid = false; - _fixed = false; -} - -void TrackedElement::setValid(bool v) -{ - _valid = v; - if (_parentNode) { - TrackedTrajectory* n = dynamic_cast(_parentNode); - if (n) - n->triggerRecalcValid(); - } -} - - -QString TrackedElement::getName() -{ - return ""; -} - -void TrackedElement::setFishPose(FishPose p) -{ - _pose = p; - _x = p.position_cm().x; - _y = p.position_cm().y; - _deg = p.orientation_deg(); - _rad = p.orientation_rad(); - _ypx = p.position_px().y; - _xpx = p.position_px().x; - _valid = true; - Q_EMIT notifyView(); -} - -void TrackedElement::setTime(std::chrono::system_clock::time_point t) { - _timeSysclck = t; -}; - -void TrackedElement::setTime(qint64 t) { - _time = t; - std::string::size_type sz = 0; - long long ll = t / 1000; - long long remainder = t % 1000; - std::time_t tm(ll); - - _timeSysclck = std::chrono::system_clock::from_time_t(tm); - std::chrono::duration dur(remainder); - _timeSysclck += dur; -}; - -qint64 TrackedElement::getTime() { - qint64 q(std::chrono::duration_cast(_timeSysclck.time_since_epoch()).count()); - return q; -}; - -QString TrackedElement::getTimeString() { - std::time_t t = std::chrono::system_clock::to_time_t(_timeSysclck); - QDateTime dt; - dt.setTime_t(t); - _timeString = dt.toString(); - return _timeString; -}; - -FishPose TrackedElement::getFishPose() -{ - return _pose; -} - -void TrackedElement::setX(float val) { - _x = val; - FishPose pnew(cv::Point2f(_x, _pose.position_cm().y), cv::Point2f(-1, -1), _rad, _deg, _pose.width(), _pose.height(), _pose.getScore()); - _ypx = _pose.position_px().y; - _xpx = _pose.position_px().x; - _pose = pnew; -}; - -void TrackedElement::setY(float val) { - _y = val; - FishPose pnew(cv::Point2f(_pose.position_cm().x, _y), cv::Point2f(-1, -1), _rad, _deg, _pose.width(), _pose.height(), _pose.getScore()); - _ypx = _pose.position_px().y; - _xpx = _pose.position_px().x; - _pose = pnew; -}; - -void TrackedElement::setRad(float r) { - _rad = r; - FishPose pnew(_pose.position_cm(), _pose.position_px(), _rad, _deg, _pose.width(), _pose.height(), _pose.getScore()); - _pose = pnew; -}; - -void TrackedElement::setDeg(float d) { - _deg = d; - FishPose pnew(_pose.position_cm(), _pose.position_px(), _rad, _deg, _pose.width(), _pose.height(), _pose.getScore()); - _pose = pnew; - -}; - -void TrackedElement::setW(float w) { - _w = w; - FishPose pnew(_pose.position_cm(), _pose.position_px(), _rad, _deg, _w, _pose.height(), _pose.getScore()); - _pose = pnew; -} - -void TrackedElement::setH(float h) { - _h = h; - FishPose pnew(_pose.position_cm(), _pose.position_px(), _rad, _deg, _pose.width(), _h, _pose.getScore()); - _pose = pnew; -} - - -void TrackedElement::setXpx(float val) { - _xpx = val; -} - -void TrackedElement::setYpx(float val) { - _ypx = val; -} - -void TrackedElement::setWpx(float w) { - std::cout << "Stub..." << std::endl; -} - -void TrackedElement::setHpx(float h) { - std::cout << "Stub..." << std::endl; -} - -float TrackedElement::getX() { - return _pose.position_cm().x; -} - -float TrackedElement::getY() { - return _pose.position_cm().y; -} - -float TrackedElement::getXpx() { - return _xpx;// _pose.position_px().x; -} - -float TrackedElement::getYpx() { - return _ypx;// _pose.position_px().y; -} - -float TrackedElement::getDeg() { - return _pose.orientation_deg(); -} - -void TrackedElement::operate() -{ - qDebug() << "I am TrackedElement "; -} - -void TrackedElement::pressed() -{ - Q_EMIT notifyView(); - -} - -void TrackedElement::notPressed() -{ - Q_EMIT notifyView(); -} - -bool TrackedElement::getPressedStatus() -{ - return false; -} - - - diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/TrackedElement.h b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/TrackedElement.h deleted file mode 100644 index f1408a76..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/TrackedElement.h +++ /dev/null @@ -1,91 +0,0 @@ -#ifndef TRACKEDELEMENT_H -#define TRACKEDELEMENT_H - -#include "QGraphicsItem" -#include "Interfaces/IModel/IModelTrackedComponent.h" -#include "QString" -#include "Model/TrackedComponents/pose/FishPose.h" -#include - -/** -* This class is an example of how a TrackedComponent could be defined. -* This class inherits from the IModelTrackedComponent class and is therefor part of the Composite Pattern. -* This class represents the Leaf class in the Composite Pattern. -* Objects of this class have a QObject as parent. -*/ -class TrackedElement : public IModelTrackedPoint -{ - Q_OBJECT - -public: - TrackedElement(QObject *parent = 0, QString name = "n.a.", int id = 0); - - QString getName(); - QString getCoordinateUnit() override { return _unit; }; - void setCoordinateUnit(QString str) override { _unit = str; }; - - void setX(float val); - void setY(float val); - void setW(float w); - void setH(float h); - void setXpx(float val); - void setYpx(float val); - void setWpx(float w); - void setHpx(float h); - void setRad(float r); - void setDeg(float d); - void setId(int val) { _id = val; }; - void setTime(std::chrono::system_clock::time_point t); - void setTime(qint64 t); - void setTimeString(QString t) { _timeString = t; }; - void setValid(bool v); - void setFixed(bool f) { _fixed = f; }; - - - float getX(); - float getY(); - float getXpx(); - float getYpx(); - float getW() { return _w; }; - float getH() { return _h; }; - float getWpx() { return _w; }; - float getHpx() { return _h; }; - float getRad() { return _rad; }; - float getDeg(); - int getId() { return _id; }; - qint64 getTime(); - QString getTimeString(); - bool getValid() { return _valid; }; - bool getFixed() { return _fixed; }; - - bool hasX() { return true; }; - bool hasY() { return true; }; - bool hasW() { return false; }; - bool hasH() { return false; }; - bool hasXpx() { return true; }; - bool hasYpx() { return true; }; - bool hasWpx() { return false; }; - bool hasHpx() { return false; }; - bool hasRad() { return true; }; - bool hasDeg() { return true; }; - bool hasTime() { return true; }; - bool hasTimeString() { return true; }; - - void pressed(); - void notPressed(); - bool getPressedStatus(); - - void setFishPose(FishPose p); - FishPose getFishPose(); - - // ITrackedPoint interface -public: - void operate(); - -private: - std::chrono::system_clock::time_point _timeSysclck; - QString _unit = "cm"; - FishPose _pose; -}; - -#endif // TRACKEDELEMENT_H diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/TrackedTrajectory.cpp b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/TrackedTrajectory.cpp deleted file mode 100644 index 23d4318d..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/TrackedTrajectory.cpp +++ /dev/null @@ -1,137 +0,0 @@ -#include "TrackedTrajectory.h" -#include "QDebug" -#include "TrackedElement.h" - -void TrackedTrajectory::triggerRecalcValid() { - g_calcValid = 1; -} - -void TrackedTrajectory::setValid(bool v) { - _valid = v; - if (_parentNode) { - TrackedTrajectory* n = dynamic_cast(_parentNode); - if (n) - n->triggerRecalcValid(); - } -} - -TrackedTrajectory::TrackedTrajectory(QObject *parent, QString name) : - IModelTrackedTrajectory(parent), - name(name) -{ - setFixed(false); - g_calcValid = 1; - g_validCount = 0; - _size = 0; - _valid = true; -} - -void TrackedTrajectory::operate() -{ - qDebug() << "Printing all TrackedElements in TrackedObject " << name; - qDebug() << "========================= Begin =========================="; - for (int i = 0; i < _TrackedComponents.size(); ++i) { - dynamic_cast(_TrackedComponents.at(i))->operate(); - } - qDebug() << "======================== End ========================="; -} - -void TrackedTrajectory::add(IModelTrackedComponent *comp, int pos) -{ - - comp->setParent(this); - - if (pos < 0) { - _TrackedComponents.append(comp); - _size++; - g_validCount++; - } - else if (_size <= pos) { - while (_size < pos) - { - _TrackedComponents.append(nullptr); - _size++; - } - - _TrackedComponents.append(comp); - _size++; - g_validCount++; - } - else { - _TrackedComponents[pos] = comp; - } -} - -bool TrackedTrajectory::remove(IModelTrackedComponent *comp) -{ - g_calcValid = 1; - comp->setValid(false); - return true; -} - -void TrackedTrajectory::clear() -{ - g_calcValid = 1; - foreach(IModelTrackedComponent* el, _TrackedComponents) { - if (dynamic_cast(el)) - dynamic_cast(el)->clear(); - } - _TrackedComponents.clear(); - _size = 0; -} - -IModelTrackedComponent* TrackedTrajectory::getChild(int index) -{ - if (index < 0) - return nullptr; - - if (index == _size - 1) { - return _TrackedComponents.back(); - } - - return (_size > index ? _TrackedComponents.at(index) : nullptr); -} - -IModelTrackedComponent* TrackedTrajectory::getValidChild(int index) -{ - int c = 0; - foreach(IModelTrackedComponent* el, _TrackedComponents) { - if (el){ - if (c == index && el->getValid()) - return el; - c += el->getValid() ? 1 : 0; - } - } - - return nullptr; -} - -IModelTrackedComponent* TrackedTrajectory::getLastChild() -{ - if (_TrackedComponents.empty()) - return nullptr; - return _TrackedComponents.back(); -} - -int TrackedTrajectory::size() -{ - return (_size == 0 ? _size = _TrackedComponents.size() : _size); -} - -int TrackedTrajectory::validCount() -{ - if (g_calcValid == 1) { - int c = 0; - foreach(IModelTrackedComponent* el, _TrackedComponents) { - if (el) - c += el->getValid() ? 1 : 0; - } - - g_validCount = c; - g_calcValid = 0; - return c; - } - else { - return g_validCount; - } -} diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/TrackedTrajectory.h b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/TrackedTrajectory.h deleted file mode 100644 index cd454be1..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/TrackedTrajectory.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef TRACKEDOTRAJECTORY_H -#define TRACKEDOTRAJECTORY_H - -#include "Interfaces/IModel/IModelTrackedTrajectory.h" -#include "QList" -#include "QString" - -/** - * This class inherits from the IModelTrackedTrajectory class and is therefor part of the Composite Pattern. - * This class represents the Composite class. - * This class is responsibility for the handling of Leaf objects. - * Internaly this class uses a QList for storing Leaf object. - * - * Objects of this class have a QObject as parent. - */ -class TrackedTrajectory : public IModelTrackedTrajectory { - Q_OBJECT - - public: - TrackedTrajectory(QObject *parent = 0, QString name = "n.a."); - - // ITrackedComponent interface -public: - void operate(); - - // ITrackedObject interface -public: - void add(IModelTrackedComponent *comp, int pos = -1) override; - bool remove(IModelTrackedComponent *comp) override; - void clear() override; - IModelTrackedComponent *getChild(int index) override; - IModelTrackedComponent* getValidChild(int index) override; - IModelTrackedComponent *getLastChild() override; - int size() override; - int validCount() override; - void setValid(bool v) override; - void triggerRecalcValid(); - -private: - int g_calcValid = 1; - int g_validCount = 0; - int _size = 0; - QString name; -}; - -#endif // TRACKEDOTRAJECTORY_H diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/pose/FishPose.cpp b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/pose/FishPose.cpp deleted file mode 100644 index 8e13956f..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/pose/FishPose.cpp +++ /dev/null @@ -1,33 +0,0 @@ -#include "FishPose.h" -#include "helper/CvHelper.h" - -FishPose::FishPose(cv::Point2f pos_cm , cv::Point pos_px, float rad, float deg, float width, float height, float score) : - _position_cm(pos_cm), - _position_px(pos_px), - _radAngle(rad), - _degAngle(deg), - _width(width), - _height(height), - _score(score) -{ - assert(_degAngle >= -360.0f && _degAngle <= 360.0f); - time(&_timev); -} - - -std::string FishPose::toString(bool rectified) -{ - std::ostringstream out; - if(rectified == false) - out << _position_px.x << ";" << _position_px.y << ";" << _degAngle << ";" << _radAngle; - else - out << _position_cm.x << ";" << _position_cm.y << ";" << _degAngle << ";" << _radAngle; - return out.str(); -} - -float FishPose::calculateProbabilityOfIdentity(const FishPose &first, const FishPose &second, float angleImportance) -{ - //Preliminary method for calculating identity of entities. See Issue biotracker_core/issues/130 for a discussion of this topic. - float distance = CvHelper::getDistance(first.position_cm(), second.position_cm()); - return distance <= 0 ? std::numeric_limits::max() : 1.0/distance; -} diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/pose/FishPose.h b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/pose/FishPose.h deleted file mode 100644 index 849bb4cd..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/pose/FishPose.h +++ /dev/null @@ -1,133 +0,0 @@ -#pragma once - -#include "Model/TrackedComponents/pose/IPose.h" -#include -#include - -class FishPose : public IPose -{ -public: - /** - * The standard constructor. - */ - FishPose(cv::Point2f pos_cm = cv::Point2f(-1,-1), cv::Point pos_px = cv::Point(-1,-1), float rad = 0, float deg = 0, float width = 0, float height = 0, float score = 0.0); - - /** - * Copy constructor. - */ - FishPose(const FishPose &other) : FishPose(other._position_cm, other._position_px, other._radAngle, other._degAngle, other._width, other._height, other._score) - { - time(&_timev); - } - - /* Simple identity of fish poses, based on orientation, position and dimensions - */ - inline bool operator == (const FishPose &b) const{ - if (b.orientation_rad() == orientation_rad() && - b.position_cm() == position_cm() && - b.width() == width() && - b.height() == height()) - return true; - return false; - } - - /** - * Gets the position of the pose in cm. - * @return: position in cm. - */ - cv::Point2f position_cm() const { return _position_cm; } - - /** - * Gets the position of the pose in pixel. - * @return: position in px. - */ - cv::Point position_px() const { return _position_px; } - - /** - * Gets the position of the pose in pixel as floating point values. - * @return: position in px. - */ - cv::Point2f position_pxf() const { return cv::Point2f(_position_px.x, _position_px.y); } - - - /** - * Gets the orientation of the pose as degree. - * @return: orientation angle. - */ - float orientation_deg() const { return _degAngle; } - - /** - * Sets the orientation of the pose as degree. - * @param: degAngle, the orientation angle to set. - */ - void set_orientation_deg(float degAngle) { _degAngle = degAngle; time(&_timev); assert(_degAngle >= -360.0f && _degAngle <= 360.0f); } - - /** - * Gets the orientation of the pose as radian. - * @return: orientation angle. - */ - float orientation_rad() const { return _radAngle; } - - /** - * Sets the orientation of the pose as radian. - * @param: radAngle, the orientation angle to set. - */ - void set_orientation_rad(float radAngle) { _radAngle = radAngle; time(&_timev); } - - /** - * Gets the width pose. - * @return: width of the pose - */ - float width() const { return _width; } - - /** - * Gets the height pose. - * @return: height of the pose - */ - float height() const { return _height; } - - /** - * Checks if the fish pose is valid. Means, x-pos != -1 and y-pose != -1. - * @return: true if position is valid, false otherwise. - */ - bool isValid() { return (_position_px.x != -1 && _position_px.y != -1) ? true : false; } - - /** - * @return: the score of the fish that comes from the mapper - usually between 0 and 1 - */ - float getScore() { return _score; } - - /** - * Sets the score of the fish pose. Conventionally, it should be between 0 and 1. - */ - void setScore(float score) { _score = score; } - /** - * Gets the time stamp. - * - */ - time_t ts() { return _timev; } - - /** - * Converts a pose to standard string. - * @param: rectified, specified whether the position is rectified. - * @return: a position as a standard string. - */ - std::string toString(bool rectified = false); - - /** - * Calculates the probability that two poses are the same. - * The influence of the angle can be set by the parameter angleImportance. - * @return probability between 0 and 1 - */ - static float calculateProbabilityOfIdentity(const FishPose &first, const FishPose &second, float angleImportance = 0.2f); - -private: - cv::Point2f _position_cm; - cv::Point _position_px; - float _radAngle; - float _degAngle; - float _width; - float _height; - float _score; - time_t _timev; -}; diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/pose/IPose.h b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/pose/IPose.h deleted file mode 100644 index 1d315abc..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackedComponents/pose/IPose.h +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - -#include - -class IPose -{ -public: - virtual ~IPose() {} - - /** - * Gets the fish position as centimeter metric. - */ - virtual cv::Point2f position_cm() const = 0; - - /** - * Gets the fish position as pixel metric. - */ - virtual cv::Point position_px() const = 0; - - /** - * Gets the fish orientation in degree. - */ - virtual float orientation_deg() const = 0; - - /** - * Gets the fish orientation in radian. - */ - virtual float orientation_rad() const = 0; -}; diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackerParameter.cpp b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackerParameter.cpp deleted file mode 100644 index e837c065..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackerParameter.cpp +++ /dev/null @@ -1,54 +0,0 @@ -#include "TrackerParameter.h" -#include "util/singleton.h" - -TrackerParameter::TrackerParameter(QObject *parent) : - IModel(parent) -{ - _settings = BioTracker::Util::TypedSingleton::getInstance(CONFIGPARAM::CONFIG_INI_FILE); - //_settings = new BioTracker::Core::Settings(CONFIGPARAM::CONFIG_INI_FILE); - - _BinarizationThreshold = _settings->getValueOrDefault(TRACKERPARAM::THRESHOLD_BINARIZING, 40); - _SizeErode = _settings->getValueOrDefault(TRACKERPARAM::SIZE_ERODE, 8); - _SizeDilate = _settings->getValueOrDefault(TRACKERPARAM::SIZE_DILATE, 8); - _MinBlobSize = _settings->getValueOrDefault(TRACKERPARAM::MIN_BLOB_SIZE, 40); - _MaxBlobSize = _settings->getValueOrDefault(TRACKERPARAM::MAX_BLOB_SIZE, 999999); - - _mog2History = _settings->getValueOrDefault(TRACKERPARAM::BG_MOG2_HISTORY, 200); - _mog2VarThresh = _settings->getValueOrDefault(TRACKERPARAM::BG_MOG2_VAR_THRESHOLD, 64); - _mog2BackgroundRatio = _settings->getValueOrDefault(TRACKERPARAM::BG_MOG2_BACKGROUND_RATIO, 0.05); - - _doNetwork = _settings->getValueOrDefault(FISHTANKPARAM::FISHTANK_ENABLE_NETWORKING, false); - _networkPort = _settings->getValueOrDefault(FISHTANKPARAM::FISHTANK_NETWORKING_PORT, 54444); - - _Threshold = 12345; - - _doBackground = true; - _sendImage = 0; //Send no image - _resetBackground = false; - - Q_EMIT notifyView(); -} - -void TrackerParameter::setThreshold(int x) -{ - _Threshold = x; - - Q_EMIT notifyView(); -} - -int TrackerParameter::getThreshold() -{ - return _Threshold; -} - -void TrackerParameter::setBinarizationThreshold(int x) -{ - _BinarizationThreshold = x; - _settings->setParam(TRACKERPARAM::THRESHOLD_BINARIZING, x); - Q_EMIT notifyView(); -} - -int TrackerParameter::getBinarizationThreshold() -{ - return _BinarizationThreshold; -} \ No newline at end of file diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackerParameter.h b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackerParameter.h deleted file mode 100644 index abc7969b..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackerParameter.h +++ /dev/null @@ -1,160 +0,0 @@ -#ifndef TRACKERPARAMETER_H -#define TRACKERPARAMETER_H - - -#include "Interfaces/IModel/IModel.h" -#include "settings/Settings.h" -#include "Model/TrackingAlgorithm/ParamNames.h" - -class TrackerParameter : public IModel -{ - Q_OBJECT -public: - TrackerParameter(QObject *parent = 0); - - void setThreshold(int x); - - int getThreshold(); - - BioTracker::Core::Settings *getSettings() { return _settings; }; - - void setBinarizationThreshold(int x); - int getBinarizationThreshold(); - - int getSizeErode() { return _SizeErode; }; - void setSizeErode(int x) { - _SizeErode = x; - Q_EMIT notifyView(); - }; - - int getSizeDilate() { return _SizeDilate; }; - void setSizeDilate(int x) { - _SizeDilate = x; - Q_EMIT notifyView(); - }; - - int getmog2History() { return _mog2History; }; - void setmog2History(int x) { - _mog2History = x; - Q_EMIT notifyView(); - }; - - int getmog2VarThresh() { return _mog2VarThresh; }; - void setmog2VarThresh(int x) { - _mog2VarThresh = x; - Q_EMIT notifyView(); - }; - - double getmog2BackgroundRatio() { return _mog2BackgroundRatio; }; - void setmog2BackgroundRatio(double x) { - _mog2BackgroundRatio = x; - Q_EMIT notifyView(); - }; - - double getMinBlobSize() { return _MinBlobSize; }; - void setMinBlobSize(double x) { - _MinBlobSize = x; - Q_EMIT notifyView(); - }; - - double getMaxBlobSize() { return _MaxBlobSize; }; - void setMaxBlobSize(double x) { - _MaxBlobSize = x; - Q_EMIT notifyView(); - }; - - bool getDoBackground() { return _doBackground; }; - void setDoBackground(bool x) { - _doBackground = x; - Q_EMIT notifyView(); - }; - - bool getDoNetwork() { return _doNetwork; }; - void setDoNetwork(bool x) { - _doNetwork = x; - Q_EMIT notifyView(); - }; - - int getSendImage() { return _sendImage; }; - void setSendImage(int x) { - _sendImage = x; - Q_EMIT notifyView(); - }; - - bool getResetBackground() { return _resetBackground; }; - void setResetBackground(bool x) { - _resetBackground = x; - Q_EMIT notifyView(); - }; - - int getNoFish() { return _noFish; }; - void setNoFish(int x) { - _noFish = x; - _settings->setParam(FISHTANKPARAM::FISHTANK_FISH_AMOUNT, x); - Q_EMIT notifyView(); - }; - - std::string getNewSelection() { return _newSelection; }; - void setNewSelection(std::string x) { - _newSelection = x; - } - - - void setAll( - int Threshold, - int BinarizationThreshold, - int SizeErode, - int SizeDilate, - int mog2History, - int mog2VarThresh, - double mog2BackgroundRatio, - int minBlobSize, - int maxBlobSize) - { - _Threshold = Threshold; - _BinarizationThreshold = BinarizationThreshold; - _SizeErode = SizeErode; - _SizeDilate = SizeDilate; - _mog2History = mog2History; - _mog2VarThresh = mog2VarThresh; - _mog2BackgroundRatio = mog2BackgroundRatio; - _MinBlobSize = minBlobSize; - _MaxBlobSize = maxBlobSize; - _settings->setParam(TRACKERPARAM::THRESHOLD_BINARIZING, BinarizationThreshold); - _settings->setParam(TRACKERPARAM::SIZE_ERODE, SizeErode); - _settings->setParam(TRACKERPARAM::SIZE_DILATE, SizeDilate); - _settings->setParam(TRACKERPARAM::MIN_BLOB_SIZE, minBlobSize); - _settings->setParam(TRACKERPARAM::MAX_BLOB_SIZE, maxBlobSize); - _settings->setParam(TRACKERPARAM::BG_MOG2_HISTORY, mog2History); - _settings->setParam(TRACKERPARAM::BG_MOG2_VAR_THRESHOLD, mog2VarThresh); - _settings->setParam(TRACKERPARAM::BG_MOG2_BACKGROUND_RATIO, mog2BackgroundRatio); - Q_EMIT notifyView(); - }; - - - -private: - BioTracker::Core::Settings *_settings; - - int _Threshold; - int _BinarizationThreshold; - int _SizeErode; - int _SizeDilate; - int _mog2History; - int _mog2VarThresh; - double _mog2BackgroundRatio; - int _MinBlobSize; - int _MaxBlobSize; - - bool _doBackground; - int _sendImage; - bool _resetBackground; - int _noFish; - - int _networkPort; - bool _doNetwork; - - std::string _newSelection; -}; - -#endif // TRACKERPARAMETER_H diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/NN2dMapper.cpp b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/NN2dMapper.cpp deleted file mode 100644 index 96644a9d..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/NN2dMapper.cpp +++ /dev/null @@ -1,326 +0,0 @@ -#include "NN2dMapper.h" - -#include "helper/CvHelper.h" -#include -#include -#include - -float dif(float a, float b) { - return fmod((std::abs(b - a)), CV_PI); -} - -NN2dMapper::NN2dMapper(TrackedTrajectory *tree) { - _tree = tree; - - //Looks kinda complicated but is a rather simple thing: - //For every true trajectory below the tree's root (which are in fact, fish trajectories in out case) - //we want to arr a last confident angle to the map. - int cid = 0; - for (int i = 0; i < _tree->size(); i++) - { - TrackedTrajectory *t = dynamic_cast(_tree->getChild(i)); - if (t && t->getValid()){ - _mapLastConfidentAngle.insert(std::pair(cid, std::numeric_limits::quiet_NaN())); - cid++; - } - } -} - -// Functor to compare by the Mth element, as per https://stackoverflow.com/questions/23030267/custom-sorting-a-vector-of-tuples -struct TupleCompare -{ - bool operator()(std::tuple a, std::tuple b) const { - return std::get<0>(a) > std::get<0>(b); - } - -}; - -FishPose getFishpose(TrackedTrajectory* traj, uint frameid, uint id) { - IModelTrackedComponent* comp = traj->getValidChild(id); - TrackedTrajectory* ct = dynamic_cast(comp); - if (ct) { - TrackedElement *el = dynamic_cast(ct->getChild(frameid-1)); - if (el) - return el->getFishPose(); - } - return FishPose(); -} - -std::tuple, std::vector> NN2dMapper::getNewPoses(TrackedTrajectory* traj, uint frameid, std::vector blobPoses) { - /* The algorithm seems kinda inefficient, as there is many fish*blobs and fish*fish loops. - * But as N is expected to be pretty small (<10 for fish, <20 for blobs) this seems feasible. - */ - std::vector blobs = convertBlobPosesToFishPoses(blobPoses); - - int sizeF = traj->validCount(); - int sizeB = blobs.size(); - std::vector>> propMap; - - //Create propability matrix and sort it - for (int i = 0; i < sizeF ; i++) { - std::vector> currentFish; - FishPose cpose = getFishpose(traj, frameid, i); - for (int j = 0; j < sizeB ; j++) { - currentFish.push_back(std::tuple(FishPose::calculateProbabilityOfIdentity(cpose, blobs[j]), blobs[j])); - } - std::sort(begin(currentFish), end(currentFish), TupleCompare()); - propMap.push_back(currentFish); - } - - //I'm sorry for the goto/inefficient loop. But usually we will not have more than a - //hand full (<6) of blobs to walk through, so it's not worth the optimizing. - retry: - for (int i = 0; i < propMap.size(); i++) { - for (int j = 0; j < propMap.size(); j++) { - //Is this - if (!propMap[i].empty() && !propMap[j].empty() && i!=j) { - //Reads: If same blob, but i has higher props than j - bool samePose = std::get<1>(propMap[i][0]) == std::get<1>(propMap[j][0]); - bool propLess = std::get<0>(propMap[i][0]) <= std::get<0>(propMap[j][0]); - if (samePose && propLess) { - //...then remove the 0'th element from j and try again. - propMap[i].erase(propMap[i].begin()); - goto retry; - } - } - } - } - - - std::vector bestMatchesProps; - std::vector bestMatchesPoses; - for (int i = 0; i < propMap.size(); i++) { - if (propMap[i].size() > 0) { - bestMatchesProps.push_back(std::get<0>(propMap[i][0])); - bestMatchesPoses.push_back(std::get<1>(propMap[i][0])); - } - else { - bestMatchesPoses.push_back(getFishpose(traj, frameid, i)); - bestMatchesProps.push_back(100); - } - } - - for (int i = 0; i < bestMatchesPoses.size(); i++) { - - //Look at what the fish did in the last 10 frames - double historyDir; - { - double lookBack = 10; - cv::Point2f p = getFishpose(traj, frameid - lookBack, i).position_cm(); - cv::Point2f pnow = bestMatchesPoses[i].position_cm(); - while (CvHelper::getDistance(p, pnow) < 0.1 && lookBack < 100) { - lookBack += 10; - cv::Point2f p = getFishpose(traj, frameid - lookBack, i).position_cm(); - cv::Point2f pnow = bestMatchesPoses[i].position_cm(); - } - double dir = CvHelper::getAngleToTarget(p, pnow); - //correct some weird angle definition - historyDir = dir + CV_PI / 2; - } - - //The blob detection will come up with an ellipse orientation, where front and back are ambigious. - //So check the history for movement direction. Use the history as an indicator where front and back are. - //This might be unstable iff the fish didn't move at all. - double dif = CvHelper::angleDifference(bestMatchesPoses[i].orientation_rad(), historyDir); - if (std::abs(dif) > CV_PI / 2) { - double dir = bestMatchesPoses[i].orientation_rad() + CV_PI; - while (dir > 2 * CV_PI) dir -= 2 * CV_PI; - while (dir < -2 * CV_PI) dir += 2 * CV_PI; - bestMatchesPoses[i].set_orientation_rad(dir); - bestMatchesPoses[i].set_orientation_deg(dir * 180.0f / CV_PI); - } - - - //TODO move this to algorithm because this does not really take user manipulation into consideration - //TODO include difference between estimated and current - //simple smoothing out big angle jumps - float lastConfidentAngle = _mapLastConfidentAngle.at(i); //this is mot really working if we jump some frmae back/fwd - double dir = bestMatchesPoses[i].orientation_rad(); - if(!std::isnan(lastConfidentAngle)){ - const float deviationFromLast = CvHelper::angleDifference(lastConfidentAngle, dir); - if (std::abs(deviationFromLast) > CV_PI * 0.2 ){ // 36° - dir += deviationFromLast * 0.5; //reduce big jumps - } - else{ - dir += deviationFromLast * 0.1;//smooth out small changes - } - while (dir > 2 * CV_PI) dir -= 2 * CV_PI; - while (dir < -2 * CV_PI) dir += 2 * CV_PI; - bestMatchesPoses[i].set_orientation_rad(dir); - bestMatchesPoses[i].set_orientation_deg(dir * 180.0f / CV_PI); - } - _mapLastConfidentAngle[i] = dir; - } - return std::tuple, std::vector>(bestMatchesPoses,bestMatchesProps); -} - -bool NN2dMapper::correctAngle(int trackid, FishPose &pose) -{ - // the current angle is a decent estimation of the direction; however, it might point into the wrong hemisphere - const float poseOrientation = pose.orientation_rad(); - - // start with the pose orientation for our estimate - float proposedAngle = poseOrientation; - - // we have more historical data to correct the new angle to at least be more plausible - float confidence = 0.0f; - const float historyAngle = estimateOrientationRad(trackid, &confidence); - //const float lastConfidentAngle = fish.getLastConfidentOrientationRad(); - float lastConfidentAngle = _mapLastConfidentAngle.at(trackid); //TODO Hauke check if this is an ok thing to do... - - // the current history orientation has a stronger meaning and is preferred - const float comparisonOrientation = std::isnan(historyAngle) ? lastConfidentAngle : historyAngle; - // can't correct the angle? - if (std::isnan(comparisonOrientation)) return false; - - // panic mode - what if nothing was measured? - if (std::isnan(poseOrientation)) - { - pose.set_orientation_rad(comparisonOrientation); - pose.set_orientation_deg(comparisonOrientation * 180.0f / CV_PI); - return false; - } - - const float angleDifference = CvHelper::angleDifference(proposedAngle, comparisonOrientation); - - // if the angles do not lie on the same hemisphere, mirror the proposed angle - if (!std::isnan(angleDifference) && std::abs(angleDifference) > 0.5f * CV_PI) - { - proposedAngle += CV_PI; - } - - // the angle is corrected into the correct hemisphere now; - // now smooth the angle to reduce the impact of outliers or directly remove a zero-measurement. - - if (std::isnan(lastConfidentAngle)) // nothing to smooth? Then simply assume the movement-angle to be a good first estimate - proposedAngle = historyAngle; - else - { - // smooth the change in the angle iff the new angle deviates too much from the last one - const float deviationFromLast = CvHelper::angleDifference(lastConfidentAngle, proposedAngle); - assert(!std::isnan(deviationFromLast)); - - if (std::abs(deviationFromLast) > 0.2f * CV_PI) - { - if (poseOrientation == 0.0f) // deviation AND zero-angle? Most likely not a decent estimation. - proposedAngle = lastConfidentAngle; - else // smooth outliers by a fixed margin - proposedAngle = lastConfidentAngle - 0.1f * deviationFromLast; - } - } - // angle should be between 0� and 360� - if (proposedAngle > 2.0f * CV_PI) proposedAngle -= 2.0f * CV_PI; - else if (proposedAngle < 0.0f) proposedAngle += 2.0f * CV_PI; - assert(!std::isnan(proposedAngle)); - - pose.set_orientation_rad(proposedAngle); - pose.set_orientation_deg(proposedAngle * 180.0f / CV_PI); - - // did we have ANY confident correction? - if (!std::isnan(lastConfidentAngle)) // if we simply adjusted the last position, assume to be confident - return true; - // otherwise, we need to intialize the confident angle. - // do that when we really are "confident" for the first time.. - const float differenceToHistoryAngle = std::abs(CvHelper::angleDifference(proposedAngle, historyAngle)); - assert(!std::isnan(differenceToHistoryAngle)); - if (differenceToHistoryAngle < 0.25f * CV_PI) - return true; - // neither updating nor a good initialization? - return false; -} - -TrackedTrajectory* getChildOfType(TrackedTrajectory* tree, int tid) { - int cid = 0; - for (int i = 0; i < tree->size(); i++) { - TrackedTrajectory* t = dynamic_cast(tree->getChild(i)); - if (t && cid==tid && t->getValid()) { - return t; - }else if (t && t->getValid()) - cid++; - } - return 0; -} - -float NN2dMapper::estimateOrientationRad(int trackid, float *confidence) -{ - //Get corresponding trajectory - TrackedTrajectory* t = getChildOfType((TrackedTrajectory*)_tree, trackid); - //return 0; - - // can't give estimate if not enough poses available - if (t->size() < 3) return std::numeric_limits::quiet_NaN(); - - //std::deque::const_reverse_iterator iter = _histComponents.rbegin(); - int start = std::max(t->size()-20, 0); - TrackedElement* e = (TrackedElement*)t->getChild(start); - if (!e) - return std::numeric_limits::quiet_NaN(); - cv::Point2f nextPoint = e->getFishPose().position_cm(); - cv::Point2f positionDerivative(0.0f, 0.0f); - - // weights the last poses with falloff^k * pose[end - k] until falloff^k < falloffMargin - int posesUsed = 0; - float currentWeight = 1.0f; - float weightSum = 0.0f; - const float falloff = 0.9f; - const float falloffMargin = 0.4f; - - for (int i=start+1; isize(); i++) - { - TrackedElement* ecur = (TrackedElement*)t->getChild(i); - if (!ecur) - return std::numeric_limits::quiet_NaN(); - cv::Point2f currentPoint = ecur->getFishPose().position_cm(); - const cv::Point2f oneStepDerivative = nextPoint - currentPoint; - - positionDerivative += currentWeight * oneStepDerivative; - weightSum += currentWeight; - - currentWeight *= falloff; - if (currentWeight < falloffMargin) break; - - nextPoint = currentPoint; - ++posesUsed; - } - // calculate average (weighted) movement of the fish - if (weightSum != 0.0f) - { - positionDerivative.x /= weightSum; - positionDerivative.y /= weightSum; - } - // use the euclidian distance in cm - const float distance = std::sqrt(std::pow(positionDerivative.x, 2.0f) + std::pow(positionDerivative.y, 2.0f)); - // Calculate cm/s. - const float distanceNormalized = 1000.0f * distance / 33.3; // TODO Hauke static_cast(FishTrackerThread::instance()->getRealTimePerFrameMs()) - const float confidenceDistanceMinCm = 2.0f; - const float confidenceDistanceMaxCm = 6.0f; - // if we have either nearly no data or are very unsure (left movement offsets right movement f.e.), just return nothing - if (distanceNormalized < confidenceDistanceMinCm) - return std::numeric_limits::quiet_NaN(); - *confidence = std::min(distanceNormalized / confidenceDistanceMaxCm, 1.0f); - - // negative y coordinate to offset open cv coordinate system - return std::atan2(-positionDerivative.y, positionDerivative.x); -} - -std::vector NN2dMapper::convertBlobPosesToFishPoses(std::vector blobPoses) -{ - std::vector fishPoses; - fishPoses.reserve(blobPoses.size()); - - for (BlobPose & blobPose : blobPoses) - { - fishPoses.push_back( - FishPose( - blobPose.posCm(), - blobPose.posPx(), - CvHelper::degToRad(blobPose.angleDegree()), - blobPose.angleDegree(), - blobPose.width(), - blobPose.height() - ) - ); - } - - return fishPoses; -} diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/NN2dMapper.h b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/NN2dMapper.h deleted file mode 100644 index 5d2aa07b..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/NN2dMapper.h +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once - -#include -#include -#include -#include "Model/TrackedComponents/pose/FishPose.h" -#include -#include -#include "Model/TrackingAlgorithm/imageProcessor/detector/blob/cvBlob/BlobsDetector.h" - -class NN2dMapper -{ -public: - - /** - * The contructor with parameters. - */ - NN2dMapper(TrackedTrajectory *tree); - - ~NN2dMapper(void) {}; - - std::tuple, std::vector> getNewPoses(TrackedTrajectory* traj, uint frameid, std::vector blobPoses); - std::vector convertBlobPosesToFishPoses(std::vector blobPoses); - float estimateOrientationRad(int trackid, float *confidence); - bool correctAngle(int trackid, FishPose &pose); - - std::map _mapLastConfidentAngle; - TrackedTrajectory *_tree; - -protected: - -}; - diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/ParamNames.h b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/ParamNames.h deleted file mode 100644 index 7e7a5879..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/ParamNames.h +++ /dev/null @@ -1,86 +0,0 @@ -#pragma once - -#include -#include - - -namespace CONFIGPARAM -{ - // System config - const std::string CONFIG_INI_FILE = "./BSTrackerConfig.ini"; -} - -namespace APPLICATIONPARAM -{ - // System config - const std::string APP_VERSION = "APPLICATIONPARAM/APP_VERSION"; -} - -namespace TRACKERPARAM -{ - - // Parameter for the opencv BackgroundSubtractorMOG2 class - const std::string BG_MOG2_HISTORY = "TRACKERPARAM/BG_MOG2_HISTORY"; - const std::string BG_MOG2_VAR_THRESHOLD = "TRACKERPARAM/BG_MOG2_VAR_THRESHOLD"; - const std::string BG_MOG2_BACKGROUND_RATIO = "TRACKERPARAM/BG_MOG2_BACKGROUND_RATIO"; - - // Blob dectection issue - const std::string MAX_BLOB_SIZE = "TRACKERPARAM/MAX_BLOB_SIZE"; - const std::string MIN_BLOB_SIZE = "TRACKERPARAM/MIN_BLOB_SIZE"; - - // Parameters for image pre-processing step - const std::string SIZE_ERODE = "TRACKERPARAM/SIZE_ERODE"; - const std::string SIZE_DILATE = "TRACKERPARAM/SIZE_DILATE"; - const std::string THRESHOLD_BINARIZING = "TRACKERPARAM/THRESHOLD_BINARIZING"; - //const std::string GAUSSIAN_BLUR_SIZE = "TRACKERPARAM/GAUSSIAN_BLUR_SIZE"; -} - -namespace GUIPARAM -{ - // FPS label - const std::string ENABLE_LABEL_FPS = "GUIPARAM/ENABLE_LABEL_FPS"; - // Fish id label - const std::string ENABLE_LABEL_FISH_ID = "GUIPARAM/ENABLE_LABEL_FISH_ID"; - // Replica marker - const std::string ENABLE_LABEL_REPLICA = "GUIPARAM/ENABLE_LABEL_REPLICA"; - // Fish position - const std::string ENABLE_LABEL_FISH_POS = "GUIPARAM/ENABLE_LABEL_FISH_POS"; - // Fish orientation - const std::string ENABLE_LABEL_FISH_ORI = "GUIPARAM/ENABLE_LABEL_FISH_ORI"; - // Fish history - const std::string ENABLE_LABEL_FISH_HISTORY = "GUIPARAM/ENABLE_LABEL_FISH_HISTORY"; - // Blobs - const std::string ENABLE_SHOW_BLOBS = "GUIPARAM/ENABLE_SHOW_BLOBS"; - // Swap fish id - const std::string ENABLE_SWAP_FISH_ID = "GUIPARAM/ENABLE_SWAP_FISH_ID"; - - - - // Core view of tracked components - const std::string ENABLE_CORE_COMPONENT_VIEW = "GUIPARAM/ENABLE_CORE_COMPONENT_VIEW"; - // Move components in core view - const std::string ENABLE_CORE_COMPONENT_MOVE = "GUIPARAM/ENABLE_CORE_COMPONENT_MOVE"; - // Remove components in core view - const std::string ENABLE_CORE_COMPONENT_REMOVE = "GUIPARAM/ENABLE_CORE_COMPONENT_REMOVE"; - // Swap component id in core view - const std::string ENABLE_CORE_COMPONENT_ID_SWAP = "GUIPARAM/ENABLE_CORE_COMPONENT_ID_SWAP"; - // Add component in core view - const std::string ENABLE_CORE_COMPONENT_ADD = "GUIPARAM/ENABLE_CORE_COMPONENT_ADD"; - // Rotate component in core view - const std::string ENABLE_CORE_COMPONENT_ROTATE = "GUIPARAM/ENABLE_CORE_COMPONENT_ROTATE"; -} - -namespace FISHTANKPARAM -{ - // Tank area - const std::string FISHTANK_AREA_WIDTH = "FISHTANKPARAM/FISHTANK_AREA_WIDTH"; - const std::string FISHTANK_AREA_HEIGHT = "FISHTANKPARAM/FISHTANK_AREA_HEIGHT"; - const std::string FISHTANK_FISH_AMOUNT = "FISHTANKPARAM/FISHTANK_FISH_AMOUNT"; - const std::string FISHTANK_AREA_CORNER1 = "FISHTANKPARAM/FISHTANK_AREA_CORNER1"; - const std::string FISHTANK_AREA_CORNER2 = "FISHTANKPARAM/FISHTANK_AREA_CORNER2"; - const std::string FISHTANK_AREA_CORNER3 = "FISHTANKPARAM/FISHTANK_AREA_CORNER3"; - const std::string FISHTANK_AREA_CORNER4 = "FISHTANKPARAM/FISHTANK_AREA_CORNER4"; - const std::string FISHTANK_ENABLE_NETWORKING = "FISHTANKPARAM/FISHTANK_ENABLE_NETWORKING"; - const std::string FISHTANK_NETWORKING_PORT = "FISHTANKPARAM/FISHTANK_NETWORKING_PORT"; -} - diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobContour.cpp b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobContour.cpp deleted file mode 100644 index 7ea09b3e..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobContour.cpp +++ /dev/null @@ -1,257 +0,0 @@ -#include "BlobContour.h" - -CBlobContour::CBlobContour() -{ - m_startPoint.x = 0; - m_startPoint.y = 0; - m_area = -1; - m_perimeter = -1; - m_contourPoints = NULL; - m_moments.m00 = -1; - m_contour = NULL; - m_parentStorage = NULL; -} -CBlobContour::CBlobContour(CvPoint startPoint, CvMemStorage *storage ) -{ - m_startPoint.x = startPoint.x; - m_startPoint.y = startPoint.y; - m_area = -1; - m_perimeter = -1; - m_moments.m00 = -1; - - m_parentStorage = storage; - - m_contourPoints = NULL; - - // contour sequence: must be compatible with opencv functions - m_contour = cvCreateSeq( CV_SEQ_ELTYPE_CODE | CV_SEQ_KIND_CURVE | CV_SEQ_FLAG_CLOSED, - sizeof(CvContour), - sizeof(t_chainCode),m_parentStorage); - -} - - -//! Copy constructor -CBlobContour::CBlobContour( CBlobContour *source ) -{ - if (source != NULL ) - { - *this = *source; - } -} - -CBlobContour::~CBlobContour() -{ - // let parent blob deallocate all contour and contour point memory - m_contour = NULL; - m_contourPoints = NULL; -} - - -//! Copy operator -CBlobContour& CBlobContour::operator=( const CBlobContour &source ) -{ - if( this != &source ) - { - m_startPoint = source.m_startPoint; - - m_parentStorage = source.m_parentStorage; - - if (m_contour) - { - cvClearSeq( m_contour ); - } - - if (source.m_contour) - { - m_contour = cvCloneSeq( source.m_contour, m_parentStorage); - } - - if( source.m_contourPoints ) - { - if( m_contourPoints ) - cvClearSeq( m_contourPoints ); - m_contourPoints = cvCloneSeq( source.m_contourPoints, m_parentStorage); - } - - m_area = source.m_area; - m_perimeter = source.m_area; - m_moments = source.m_moments; - } - return *this; -} - - -/** -- FUNCIÓ: AddChainCode -- FUNCIONALITAT: Add chain code to contour -- PARÀMETRES: - - -- RESULTAT: - - -- RESTRICCIONS: - - -- AUTOR: rborras -- DATA DE CREACIÓ: 2008/05/06 -- MODIFICACIÓ: Data. Autor. Descripció. -*/ -void CBlobContour::AddChainCode(t_chainCode chaincode) -{ - cvSeqPush(m_contour, &chaincode); -} - -//! Clears chain code contour and points -void CBlobContour::ResetChainCode() -{ - if( m_contour ) - { - cvClearSeq( m_contour ); - m_contour = NULL; - } - if( m_contourPoints ) - { - cvClearSeq( m_contourPoints ); - m_contourPoints = NULL; - } -} - -/** -- FUNCIÓ: GetPerimeter -- FUNCIONALITAT: Get perimeter from chain code. Diagonals sum sqrt(2) and horizontal and vertical codes 1 -- PARÀMETRES: - - -- RESULTAT: - - -- RESTRICCIONS: - - -- AUTOR: rborras -- DATA DE CREACIÓ: 2008/04/30 -- MODIFICACIÓ: Data. Autor. Descripció. -- NOTA: Algorithm derived from "Methods to estimate area and perimeters of blob-like objects: A comparison", L.Yang -*/ -double CBlobContour::GetPerimeter() -{ - // is calculated? - if (m_perimeter != -1) - { - return m_perimeter; - } - - if( IsEmpty() ) - return 0; - - m_perimeter = cvContourPerimeter( GetContourPoints() ); - - return m_perimeter; -} - -/** -- FUNCIÓ: GetArea -- FUNCIONALITAT: Computes area from chain code -- PARÀMETRES: - - -- RESULTAT: - - May give negative areas for clock wise contours -- RESTRICCIONS: - - -- AUTOR: rborras -- DATA DE CREACIÓ: 2008/04/30 -- MODIFICACIÓ: Data. Autor. Descripció. -- NOTA: Algorithm derived from "Properties of contour codes", G.R. Wilson -*/ -double CBlobContour::GetArea() -{ - // is calculated? - if (m_area != -1) - { - return m_area; - } - - if( IsEmpty() ) - return 0; - - m_area = fabs( cvContourArea( GetContourPoints() )); - - return m_area; -} - -//! Get contour moment (p,q up to MAX_CALCULATED_MOMENTS) -double CBlobContour::GetMoment(int p, int q) -{ - // is a valid moment? - if ( p < 0 || q < 0 || p > MAX_MOMENTS_ORDER || q > MAX_MOMENTS_ORDER ) - { - return -1; - } - - if( IsEmpty() ) - return 0; - - // it is calculated? - if( m_moments.m00 == -1) - { - cvMoments( GetContourPoints(), &m_moments ); - } - - return cvGetSpatialMoment( &m_moments, p, q ); - - -} - -//! Calculate contour points from crack codes -t_PointList CBlobContour::GetContourPoints() -{ - // it is calculated? - if( m_contourPoints != NULL ) - return m_contourPoints; - - if ( m_contour == NULL || m_contour->total <= 0 ) - { - return NULL; - } - - CvSeq *tmpPoints; - CvSeqReader reader; - CvSeqWriter writer; - CvPoint actualPoint; - CvRect boundingBox; - - // if aproximation is different than simple extern perimeter will not work - tmpPoints = cvApproxChains( m_contour, m_parentStorage, CV_CHAIN_APPROX_NONE); - - - // apply an offset to contour points to recover real coordinates - - cvStartReadSeq( tmpPoints, &reader); - - m_contourPoints = cvCreateSeq( tmpPoints->flags, tmpPoints->header_size, tmpPoints->elem_size, m_parentStorage ); - cvStartAppendToSeq(m_contourPoints, &writer ); - - // also calculate bounding box of the contour to allow cvPointPolygonTest - // work correctly on the generated polygon - boundingBox.x = boundingBox.y = 10000; - boundingBox.width = boundingBox.height = 0; - - for( int i=0; i< tmpPoints->total; i++) - { - CV_READ_SEQ_ELEM( actualPoint, reader); - - actualPoint.x += m_startPoint.x; - actualPoint.y += m_startPoint.y; - - boundingBox.x = MIN( boundingBox.x, actualPoint.x ); - boundingBox.y = MIN( boundingBox.y, actualPoint.y ); - boundingBox.width = MAX( boundingBox.width, actualPoint.x ); - boundingBox.height = MAX( boundingBox.height, actualPoint.y ); - - CV_WRITE_SEQ_ELEM( actualPoint, writer ); - } - cvEndWriteSeq( &writer ); - cvClearSeq( tmpPoints ); - - // assign calculated bounding box - ((CvContour*)m_contourPoints)->rect = boundingBox; - - - return m_contourPoints; -} diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobContour.h b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobContour.h deleted file mode 100644 index b7fbcd7d..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobContour.h +++ /dev/null @@ -1,99 +0,0 @@ -#ifndef BLOBCONTOUR_H_INCLUDED -#define BLOBCONTOUR_H_INCLUDED - - -#include "list" -#include -//#include "cxtypes.h" //AO -#include // - -//! Type of chain codes -typedef unsigned char t_chainCode; -//! Type of list of chain codes -typedef CvSeq* t_chainCodeList; -//! Type of list of points -typedef CvSeq* t_PointList; - - -//! Max order of calculated moments -#define MAX_MOMENTS_ORDER 3 - - -//! Blob contour class (in crack code) -class CBlobContour -{ - friend class CBlob; - friend class CBlobProperties; //AO - -public: - //! Constructors - CBlobContour(); - CBlobContour(CvPoint startPoint, CvMemStorage *storage ); - //! Copy constructor - CBlobContour( CBlobContour *source ); - - ~CBlobContour(); - //! Assigment operator - CBlobContour& operator=( const CBlobContour &source ); - - //! Add chain code to contour - void AddChainCode(t_chainCode code); - - //! Return freeman chain coded contour - t_chainCodeList GetChainCode() - { - return m_contour; - } - - bool IsEmpty() - { - return m_contour == NULL || m_contour->total == 0; - } - - //! Return all contour points - t_chainCodeList GetContourPoints(); - -protected: - - CvPoint GetStartPoint() const - { - return m_startPoint; - } - - //! Clears chain code contour - void ResetChainCode(); - - - - //! Computes area from contour - double GetArea(); - //! Computes perimeter from contour - double GetPerimeter(); - //! Get contour moment (p,q up to MAX_CALCULATED_MOMENTS) - double GetMoment(int p, int q); - - //! Crack code list - t_chainCodeList m_contour; - -private: - //! Starting point of the contour - CvPoint m_startPoint; - //! All points from the contour - t_PointList m_contourPoints; - - - - //! Computed area from contour - double m_area; - //! Computed perimeter from contour - double m_perimeter; - //! Computed moments from contour - CvMoments m_moments; - - //! Pointer to storage - CvMemStorage *m_parentStorage; -}; - -#endif //!BLOBCONTOUR_H_INCLUDED - - diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobLibraryConfiguration.h b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobLibraryConfiguration.h deleted file mode 100644 index 55fd8a9f..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobLibraryConfiguration.h +++ /dev/null @@ -1,22 +0,0 @@ -/************************************************************************ - BlobLibraryConfiguration.h - -FUNCIONALITAT: Configuració del comportament global de la llibreria -AUTOR: Inspecta S.L. -MODIFICACIONS (Modificació, Autor, Data): - -FUNCTIONALITY: Global configuration of the library -AUTHOR: Inspecta S.L. -MODIFICATIONS (Modification, Author, Date): - -**************************************************************************/ - -//! Indica si es volen fer servir les MatrixCV o no -//! Use/Not use the MatrixCV class -//#define MATRIXCV_ACTIU - -//! Uses/not use the blob object factory -//#define BLOB_OBJECT_FACTORY - -//! Show/not show blob access errors -//#define _SHOW_ERRORS //AO: Only works for WIN. diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobOperators.cpp b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobOperators.cpp deleted file mode 100644 index 2974547a..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobOperators.cpp +++ /dev/null @@ -1,502 +0,0 @@ -#include -#include "BlobOperators.h" - -/*************************************************************************** - Implementació de les classes per al càlcul de característiques sobre el blob - - Implementation of the helper classes to perform operations on blobs -/**************************************************************************/ - -/** -- FUNCTION: Moment -- FUNCTIONALITY: Calculates the pq moment of the blob -- PARAMETERS: -- RESULT: - - returns the pq moment or 0 if the moment it is not implemented -- RESTRICTIONS: - - Currently, implemented moments up to 3 -- AUTHOR: Ricard Borràs -- CREATION DATE: 20-07-2004. -- MODIFICATION: Date. Author. Description. -*/ -double CBlobGetMoment::operator()(CBlob &blob) -{ - return blob.Moment(m_p, m_q); -} - -/** -- FUNCIÓ: HullPerimeter -- FUNCIONALITAT: Calcula la longitud del perimetre convex del blob. - Fa servir la funció d'OpenCV cvConvexHull2 per a - calcular el perimetre convex. - -- PARÀMETRES: -- RESULTAT: - - retorna la longitud del perímetre convex del blob. Si el blob no té coordenades - associades retorna el perímetre normal del blob. -- RESTRICCIONS: -- AUTOR: Ricard Borràs -- DATA DE CREACIÓ: 20-07-2004. -- MODIFICACIÓ: Data. Autor. Descripció. -*/ -/** -- FUNCTION: CBlobGetHullPerimeter -- FUNCTIONALITY: Calculates the convex hull perimeter of the blob -- PARAMETERS: -- RESULT: - - returns the convex hull perimeter of the blob or the perimeter if the - blob edges could not be retrieved -- RESTRICTIONS: -- AUTHOR: Ricard Borràs -- CREATION DATE: 25-05-2005. -- MODIFICATION: Date. Author. Description. -*/ -double CBlobGetHullPerimeter::operator()(CBlob &blob) -{ - CvSeq *convexHull; - double perimeter; - - convexHull = blob.GetConvexHull(); - - if( convexHull ) - perimeter = fabs(cvArcLength(convexHull,CV_WHOLE_SEQ,1)); - else - return 0; - - cvClearSeq(convexHull); - - return perimeter; -} - -double CBlobGetHullArea::operator()(CBlob &blob) -{ - CvSeq *convexHull; - double area; - - convexHull = blob.GetConvexHull(); - - if( convexHull ) - area = fabs(cvContourArea(convexHull)); - else - return 0; - - cvClearSeq(convexHull); - - return area; -} - -/** -- FUNCTION: CBlobGetMinXatMinY -- FUNCTIONALITY: Calculates the minimum X on the minimum Y -- PARAMETERS: -- RESULT: -- RESTRICTIONS: -- AUTHOR: Ricard Borràs -- CREATION DATE: 25-05-2005. -- MODIFICATION: Date. Author. Description. -*/ -double CBlobGetMinXatMinY::operator()(CBlob &blob) -{ - double result = LONG_MAX; - - CvSeqReader reader; - CvPoint actualPoint; - t_PointList externContour; - - externContour = blob.GetExternalContour()->GetContourPoints(); - if( !externContour ) return result; - cvStartReadSeq( externContour, &reader); - - for( int i=0; i< externContour->total; i++) - { - CV_READ_SEQ_ELEM( actualPoint, reader); - - if( (actualPoint.y == blob.MinY()) && (actualPoint.x < result) ) - { - result = actualPoint.x; - } - } - - return result; -} - -/** -- FUNCTION: CBlobGetMinXatMinY -- FUNCTIONALITY: Calculates the minimum Y on the maximum X -- PARAMETERS: -- RESULT: -- RESTRICTIONS: -- AUTHOR: Ricard Borràs -- CREATION DATE: 25-05-2005. -- MODIFICATION: Date. Author. Description. -*/ -double CBlobGetMinYatMaxX::operator()(CBlob &blob) -{ - double result = LONG_MAX; - - CvSeqReader reader; - CvPoint actualPoint; - t_PointList externContour; - - externContour = blob.GetExternalContour()->GetContourPoints(); - if( !externContour ) return result; - cvStartReadSeq( externContour, &reader); - - for( int i=0; i< externContour->total; i++) - { - CV_READ_SEQ_ELEM( actualPoint, reader); - - if( (actualPoint.x == blob.MaxX()) && (actualPoint.y < result) ) - { - result = actualPoint.y; - } - } - - return result; -} - -/** -- FUNCTION: CBlobGetMaxXatMaxY -- FUNCTIONALITY: Calculates the maximum X on the maximum Y -- PARAMETERS: -- RESULT: -- RESTRICTIONS: -- AUTHOR: Ricard Borràs -- CREATION DATE: 25-05-2005. -- MODIFICATION: Date. Author. Description. -*/ -double CBlobGetMaxXatMaxY::operator()(CBlob &blob) -{ - double result = LONG_MIN; - - CvSeqReader reader; - CvPoint actualPoint; - t_PointList externContour; - - externContour = blob.GetExternalContour()->GetContourPoints(); - if( !externContour ) return result; - - cvStartReadSeq( externContour, &reader); - - for( int i=0; i< externContour->total; i++) - { - CV_READ_SEQ_ELEM( actualPoint, reader); - - if( (actualPoint.y == blob.MaxY()) && (actualPoint.x > result) ) - { - result = actualPoint.x; - } - } - - return result; -} - -/** -- FUNCTION: CBlobGetMaxYatMinX -- FUNCTIONALITY: Calculates the maximum Y on the minimum X -- PARAMETERS: -- RESULT: -- RESTRICTIONS: -- AUTHOR: Ricard Borràs -- CREATION DATE: 25-05-2005. -- MODIFICATION: Date. Author. Description. -*/ -double CBlobGetMaxYatMinX::operator()(CBlob &blob) -{ - double result = LONG_MIN; - - CvSeqReader reader; - CvPoint actualPoint; - t_PointList externContour; - - externContour = blob.GetExternalContour()->GetContourPoints(); - if( !externContour ) return result; - - cvStartReadSeq( externContour, &reader); - - - for( int i=0; i< externContour->total; i++) - { - CV_READ_SEQ_ELEM( actualPoint, reader); - - if( (actualPoint.x == blob.MinX()) && (actualPoint.y > result) ) - { - result = actualPoint.y; - } - } - - return result; -} - - -/** -- FUNCTION: CBlobGetElongation -- FUNCTIONALITY: Calculates the elongation of the blob ( length/breadth ) -- PARAMETERS: -- RESULT: -- RESTRICTIONS: - - See below to see how the lenght and the breadth are aproximated -- AUTHOR: Ricard Borràs -- CREATION DATE: 25-05-2005. -- MODIFICATION: Date. Author. Description. -*/ -double CBlobGetElongation::operator()(CBlob &blob) -{ - double ampladaC,longitudC,amplada,longitud; - - double tmp; - - tmp = blob.Perimeter()*blob.Perimeter() - 16*blob.Area(); - - if( tmp > 0.0 ) - ampladaC = (double) (blob.Perimeter()+sqrt(tmp))/4; - // error intrínsec en els càlculs de l'àrea i el perímetre - else - ampladaC = (double) (blob.Perimeter())/4; - - if(ampladaC<=0.0) return 0; - longitudC=(double) blob.Area()/ampladaC; - - longitud=MAX( longitudC , ampladaC ); - amplada=MIN( longitudC , ampladaC ); - - return (double) longitud/amplada; -} - -/** - Retorna la compacitat del blob -*/ -/** -- FUNCTION: CBlobGetCompactness -- FUNCTIONALITY: Calculates the compactness of the blob - ( maximum for circle shaped blobs, minimum for the rest) -- PARAMETERS: -- RESULT: -- RESTRICTIONS: -- AUTHOR: Ricard Borràs -- CREATION DATE: 25-05-2005. -- MODIFICATION: Date. Author. Description. -*/ -double CBlobGetCompactness::operator()(CBlob &blob) -{ - if( blob.Area() != 0.0 ) - return (double) pow(blob.Perimeter(),2)/(4*CV_PI*blob.Area()); - else - return 0.0; -} - -/** - Retorna la rugositat del blob -*/ -/** -- FUNCTION: CBlobGetRoughness -- FUNCTIONALITY: Calculates the roughness of the blob - ( ratio between perimeter and convex hull perimeter) -- PARAMETERS: -- RESULT: -- RESTRICTIONS: -- AUTHOR: Ricard Borràs -- CREATION DATE: 25-05-2005. -- MODIFICATION: Date. Author. Description. -*/ -double CBlobGetRoughness::operator()(CBlob &blob) -{ - CBlobGetHullPerimeter getHullPerimeter = CBlobGetHullPerimeter(); - - double hullPerimeter = getHullPerimeter(blob); - - if( hullPerimeter != 0.0 ) - return blob.Perimeter() / hullPerimeter;//HullPerimeter(); - - return 0.0; -} - -/** - Retorna la longitud del blob -*/ -/** -- FUNCTION: CBlobGetLength -- FUNCTIONALITY: Calculates the lenght of the blob (the biggest axis of the blob) -- PARAMETERS: -- RESULT: -- RESTRICTIONS: - - The lenght is an aproximation to the real lenght -- AUTHOR: Ricard Borràs -- CREATION DATE: 25-05-2005. -- MODIFICATION: Date. Author. Description. -*/ -double CBlobGetLength::operator()(CBlob &blob) -{ - double ampladaC,longitudC; - double tmp; - - tmp = blob.Perimeter()*blob.Perimeter() - 16*blob.Area(); - - if( tmp > 0.0 ) - ampladaC = (double) (blob.Perimeter()+sqrt(tmp))/4; - // error intrínsec en els càlculs de l'àrea i el perímetre - else - ampladaC = (double) (blob.Perimeter())/4; - - if(ampladaC<=0.0) return 0; - longitudC=(double) blob.Area()/ampladaC; - - return MAX( longitudC , ampladaC ); -} - -/** - Retorna l'amplada del blob -*/ -/** -- FUNCTION: CBlobGetBreadth -- FUNCTIONALITY: Calculates the breadth of the blob (the smallest axis of the blob) -- PARAMETERS: -- RESULT: -- RESTRICTIONS: - - The breadth is an aproximation to the real breadth -- AUTHOR: Ricard Borràs -- CREATION DATE: 25-05-2005. -- MODIFICATION: Date. Author. Description. -*/ -double CBlobGetBreadth::operator()(CBlob &blob) -{ - double ampladaC,longitudC; - double tmp; - - tmp = blob.Perimeter()*blob.Perimeter() - 16*blob.Area(); - - if( tmp > 0.0 ) - ampladaC = (double) (blob.Perimeter()+sqrt(tmp))/4; - // error intrínsec en els càlculs de l'àrea i el perímetre - else - ampladaC = (double) (blob.Perimeter())/4; - - if(ampladaC<=0.0) return 0; - longitudC = (double) blob.Area()/ampladaC; - - return MIN( longitudC , ampladaC ); -} - -/** - Calcula la distància entre un punt i el centre del blob -*/ -/** -- FUNCTION: CBlobGetDistanceFromPoint -- FUNCTIONALITY: Calculates the euclidean distance between the blob center and - the point specified in the constructor -- PARAMETERS: -- RESULT: -- RESTRICTIONS: -- AUTHOR: Ricard Borràs -- CREATION DATE: 25-05-2005. -- MODIFICATION: Date. Author. Description. -*/ -double CBlobGetDistanceFromPoint::operator()(CBlob &blob) -{ - double xmitjana, ymitjana; - CBlobGetXCenter getXCenter; - CBlobGetYCenter getYCenter; - - xmitjana = m_x - getXCenter( blob ); - ymitjana = m_y - getYCenter( blob ); - - return sqrt((xmitjana*xmitjana)+(ymitjana*ymitjana)); -} - -/** -- FUNCTION: BlobGetXYInside -- FUNCTIONALITY: Calculates whether a point is inside the - rectangular bounding box of a blob -- PARAMETERS: -- RESULT: - - returns 1 if it is inside; o if not -- RESTRICTIONS: -- AUTHOR: Francesc Pinyol Margalef -- CREATION DATE: 16-01-2006. -- MODIFICATION: Date. Author. Description. -*/ -double CBlobGetXYInside::operator()(CBlob &blob) -{ - if( blob.GetExternalContour()->GetContourPoints() ) - { - return cvPointPolygonTest( blob.GetExternalContour()->GetContourPoints(), m_p,0) >= 0; - } - - return 0; -} -#ifdef BLOB_OBJECT_FACTORY - -/** -- FUNCIÓ: RegistraTotsOperadors -- FUNCIONALITAT: Registrar tots els operadors definits a blob.h -- PARÀMETRES: - - fabricaOperadorsBlob: fàbrica on es registraran els operadors -- RESULTAT: - - Modifica l'objecte fabricaOperadorsBlob -- RESTRICCIONS: - - Només es registraran els operadors de blob.h. Si se'n volen afegir, cal afegir-los amb - el mètode Register de la fàbrica. -- AUTOR: rborras -- DATA DE CREACIÓ: 2006/05/18 -- MODIFICACIÓ: Data. Autor. Descripció. -*/ -void RegistraTotsOperadors( t_OperadorBlobFactory &fabricaOperadorsBlob ) -{ - // blob shape - fabricaOperadorsBlob.Register( CBlobGetArea().GetNom(), Type2Type()); - fabricaOperadorsBlob.Register( CBlobGetBreadth().GetNom(), Type2Type()); - fabricaOperadorsBlob.Register( CBlobGetCompactness().GetNom(), Type2Type()); - fabricaOperadorsBlob.Register( CBlobGetElongation().GetNom(), Type2Type()); - fabricaOperadorsBlob.Register( CBlobGetExterior().GetNom(), Type2Type()); - fabricaOperadorsBlob.Register( CBlobGetLength().GetNom(), Type2Type()); - fabricaOperadorsBlob.Register( CBlobGetPerimeter().GetNom(), Type2Type()); - fabricaOperadorsBlob.Register( CBlobGetRoughness().GetNom(), Type2Type()); - - // blob color - fabricaOperadorsBlob.Register( CBlobGetMean(NULL).GetNom(), Type2Type()); - fabricaOperadorsBlob.Register( CBlobGetStdDev(NULL).GetNom(), Type2Type()); - - // extern pixels - fabricaOperadorsBlob.Register( CBlobGetExternPerimeterRatio().GetNom(), Type2Type()); - fabricaOperadorsBlob.Register( CBlobGetExternHullPerimeterRatio().GetNom(), Type2Type()); - fabricaOperadorsBlob.Register( CBlobGetExternPerimeter().GetNom(), Type2Type()); - - - // hull - fabricaOperadorsBlob.Register( CBlobGetHullPerimeter().GetNom(), Type2Type()); - fabricaOperadorsBlob.Register( CBlobGetHullArea().GetNom(), Type2Type()); - - - // elipse info - fabricaOperadorsBlob.Register( CBlobGetMajorAxisLength().GetNom(), Type2Type()); - fabricaOperadorsBlob.Register( CBlobGetMinorAxisLength().GetNom(), Type2Type()); - fabricaOperadorsBlob.Register( CBlobGetAxisRatio().GetNom(), Type2Type()); - fabricaOperadorsBlob.Register( CBlobGetOrientation().GetNom(), Type2Type()); - fabricaOperadorsBlob.Register( CBlobGetOrientationCos().GetNom(), Type2Type()); - fabricaOperadorsBlob.Register( CBlobGetAreaElipseRatio().GetNom(), Type2Type()); - - // min an max - fabricaOperadorsBlob.Register( CBlobGetMaxX().GetNom(), Type2Type()); - fabricaOperadorsBlob.Register( CBlobGetMaxY().GetNom(), Type2Type()); - fabricaOperadorsBlob.Register( CBlobGetMinX().GetNom(), Type2Type()); - fabricaOperadorsBlob.Register( CBlobGetMinY().GetNom(), Type2Type()); - - fabricaOperadorsBlob.Register( CBlobGetMaxXatMaxY().GetNom(), Type2Type()); - fabricaOperadorsBlob.Register( CBlobGetMaxYatMinX().GetNom(), Type2Type()); - fabricaOperadorsBlob.Register( CBlobGetMinXatMinY().GetNom(), Type2Type()); - fabricaOperadorsBlob.Register( CBlobGetMinYatMaxX().GetNom(), Type2Type()); - - // coordinate info - fabricaOperadorsBlob.Register( CBlobGetXYInside().GetNom(), Type2Type()); - fabricaOperadorsBlob.Register( CBlobGetDiffY().GetNom(), Type2Type()); - fabricaOperadorsBlob.Register( CBlobGetDiffX().GetNom(), Type2Type()); - fabricaOperadorsBlob.Register( CBlobGetXCenter().GetNom(), Type2Type()); - fabricaOperadorsBlob.Register( CBlobGetYCenter().GetNom(), Type2Type()); - fabricaOperadorsBlob.Register( CBlobGetDistanceFromPoint().GetNom(), Type2Type()); - - // moments - fabricaOperadorsBlob.Register( CBlobGetMoment().GetNom(), Type2Type()); - -} - -#endif //BLOB_OBJECT_FACTORY \ No newline at end of file diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobOperators.h b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobOperators.h deleted file mode 100644 index 4fbc1c81..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobOperators.h +++ /dev/null @@ -1,754 +0,0 @@ -#ifndef BLOB_OPERATORS_H_INCLUDED -#define BLOB_OPERATORS_H_INCLUDED - -#include "blob.h" - -/************************************************************************** - Definició de les classes per a fer operacions sobre els blobs - - Helper classes to perform operations on blobs -**************************************************************************/ - -//! Factor de conversió de graus a radians -#define DEGREE2RAD (CV_PI / 180.0) - - -//! Classe d'on derivarem totes les operacions sobre els blobs -//! Interface to derive all blob operations -class COperadorBlob -{ -public: - virtual ~COperadorBlob(){}; - - //! Aply operator to blob - virtual double operator()(CBlob &blob) = 0; - //! Get operator name - virtual const char *GetNom() = 0; - - operator COperadorBlob*() - { - return (COperadorBlob*)this; - } -}; - -typedef COperadorBlob funcio_calculBlob; - -#ifdef BLOB_OBJECT_FACTORY - /** - Funció per comparar dos identificadors dins de la fàbrica de COperadorBlobs - */ - struct functorComparacioIdOperador - { - bool operator()(const char* s1, const char* s2) const - { - return strcmp(s1, s2) < 0; - } - }; - - //! Definition of Object factory type for COperadorBlob objects - typedef ObjectFactory t_OperadorBlobFactory; - - //! Funció global per a registrar tots els operadors definits a blob.h - void RegistraTotsOperadors( t_OperadorBlobFactory &fabricaOperadorsBlob ); - -#endif - - -//! Classe per calcular l'etiqueta d'un blob -//! Class to get ID of a blob -class CBlobGetID : public COperadorBlob -{ -public: - double operator()(CBlob &blob) - { - return blob.GetID(); - } - const char *GetNom() - { - return "CBlobGetID"; - } -}; - - -//! Classe per calcular l'àrea d'un blob -//! Class to get the area of a blob -class CBlobGetArea : public COperadorBlob -{ -public: - double operator()(CBlob &blob) - { - return blob.Area(); - } - const char *GetNom() - { - return "CBlobGetArea"; - } -}; - -//! Classe per calcular el perimetre d'un blob -//! Class to get the perimeter of a blob -class CBlobGetPerimeter: public COperadorBlob -{ -public: - double operator()(CBlob &blob) - { - return blob.Perimeter(); - } - const char *GetNom() - { - return "CBlobGetPerimeter"; - } -}; - -//! Classe que diu si un blob és extern o no -//! Class to get the extern flag of a blob -class CBlobGetExterior: public COperadorBlob -{ -public: - CBlobGetExterior() - { - m_mask = NULL; - m_xBorder = false; - m_yBorder = false; - } - CBlobGetExterior(IplImage *mask, bool xBorder = true, bool yBorder = true) - { - m_mask = mask; - m_xBorder = xBorder; - m_yBorder = yBorder; - } - double operator()(CBlob &blob) - { - return blob.Exterior(m_mask, m_xBorder, m_yBorder); - } - const char *GetNom() - { - return "CBlobGetExterior"; - } -private: - IplImage *m_mask; - bool m_xBorder, m_yBorder; -}; - -//! Classe per calcular la mitjana de nivells de gris d'un blob -//! Class to get the mean grey level of a blob -class CBlobGetMean: public COperadorBlob -{ -public: - CBlobGetMean() - { - m_image = NULL; - } - CBlobGetMean( IplImage *image ) - { - m_image = image; - }; - - double operator()(CBlob &blob) - { - return blob.Mean(m_image); - } - const char *GetNom() - { - return "CBlobGetMean"; - } -private: - - IplImage *m_image; -}; - -//! Classe per calcular la desviació estàndard dels nivells de gris d'un blob -//! Class to get the standard deviation of the grey level values of a blob -class CBlobGetStdDev: public COperadorBlob -{ -public: - CBlobGetStdDev() - { - m_image = NULL; - } - CBlobGetStdDev( IplImage *image ) - { - m_image = image; - }; - double operator()(CBlob &blob) - { - return blob.StdDev(m_image); - } - const char *GetNom() - { - return "CBlobGetStdDev"; - } -private: - - IplImage *m_image; - -}; - -//! Classe per calcular la compacitat d'un blob -//! Class to calculate the compactness of a blob -class CBlobGetCompactness: public COperadorBlob -{ -public: - double operator()(CBlob &blob); - const char *GetNom() - { - return "CBlobGetCompactness"; - } -}; - -//! Classe per calcular la longitud d'un blob -//! Class to calculate the length of a blob -class CBlobGetLength: public COperadorBlob -{ -public: - double operator()(CBlob &blob); - const char *GetNom() - { - return "CBlobGetLength"; - } -}; - -//! Classe per calcular l'amplada d'un blob -//! Class to calculate the breadth of a blob -class CBlobGetBreadth: public COperadorBlob -{ -public: - double operator()(CBlob &blob); - const char *GetNom() - { - return "CBlobGetBreadth"; - } -}; - -//! Classe per calcular la diferència en X del blob -class CBlobGetDiffX: public COperadorBlob -{ -public: - double operator()(CBlob &blob) - { - return blob.GetBoundingBox().width; - } - const char *GetNom() - { - return "CBlobGetDiffX"; - } -}; - -//! Classe per calcular la diferència en X del blob -class CBlobGetDiffY: public COperadorBlob -{ -public: - double operator()(CBlob &blob) - { - return blob.GetBoundingBox().height; - } - const char *GetNom() - { - return "CBlobGetDiffY"; - } -}; - -//! Classe per calcular el moment PQ del blob -//! Class to calculate the P,Q moment of a blob -class CBlobGetMoment: public COperadorBlob -{ -public: - //! Constructor estàndard - //! Standard constructor (gets the 00 moment) - CBlobGetMoment() - { - m_p = m_q = 0; - } - //! Constructor: indiquem el moment p,q a calcular - //! Constructor: gets the PQ moment - CBlobGetMoment( int p, int q ) - { - m_p = p; - m_q = q; - }; - double operator()(CBlob &blob); - const char *GetNom() - { - return "CBlobGetMoment"; - } - -private: - //! moment que volem calcular - int m_p, m_q; -}; - -//! Classe per calcular el perimetre del poligon convex d'un blob -//! Class to calculate the convex hull perimeter of a blob -class CBlobGetHullPerimeter: public COperadorBlob -{ -public: - double operator()(CBlob &blob); - const char *GetNom() - { - return "CBlobGetHullPerimeter"; - } -}; - -//! Classe per calcular l'àrea del poligon convex d'un blob -//! Class to calculate the convex hull area of a blob -class CBlobGetHullArea: public COperadorBlob -{ -public: - double operator()(CBlob &blob); - const char *GetNom() - { - return "CBlobGetHullArea"; - } -}; - -//! Classe per calcular la x minima en la y minima -//! Class to calculate the minimum x on the minimum y -class CBlobGetMinXatMinY: public COperadorBlob -{ -public: - double operator()(CBlob &blob); - const char *GetNom() - { - return "CBlobGetMinXatMinY"; - } -}; - -//! Classe per calcular la y minima en la x maxima -//! Class to calculate the minimum y on the maximum x -class CBlobGetMinYatMaxX: public COperadorBlob -{ -public: - double operator()(CBlob &blob); - const char *GetNom() - { - return "CBlobGetMinYatMaxX"; - } -}; - -//! Classe per calcular la x maxima en la y maxima -//! Class to calculate the maximum x on the maximum y -class CBlobGetMaxXatMaxY: public COperadorBlob -{ -public: - double operator()(CBlob &blob); - const char *GetNom() - { - return "CBlobGetMaxXatMaxY"; - } -}; - -//! Classe per calcular la y maxima en la x minima -//! Class to calculate the maximum y on the minimum y -class CBlobGetMaxYatMinX: public COperadorBlob -{ -public: - double operator()(CBlob &blob); - const char *GetNom() - { - return "CBlobGetMaxYatMinX"; - } -}; - -//! Classe per a calcular la x mínima -//! Class to get the minimum x -class CBlobGetMinX: public COperadorBlob -{ -public: - double operator()(CBlob &blob) - { - return blob.MinX(); - } - const char *GetNom() - { - return "CBlobGetMinX"; - } -}; - -//! Classe per a calcular la x màxima -//! Class to get the maximum x -class CBlobGetMaxX: public COperadorBlob -{ -public: - double operator()(CBlob &blob) - { - return blob.MaxX(); - } - const char *GetNom() - { - return "CBlobGetMaxX"; - } -}; - -//! Classe per a calcular la y mínima -//! Class to get the minimum y -class CBlobGetMinY: public COperadorBlob -{ -public: - double operator()(CBlob &blob) - { - return blob.MinY(); - } - const char *GetNom() - { - return "CBlobGetMinY"; - } -}; - -//! Classe per a calcular la y màxima -//! Class to get the maximum y -class CBlobGetMaxY: public COperadorBlob -{ -public: - double operator()(CBlob &blob) - { - return blob.MaxY(); - } - const char *GetNom() - { - return "CBlobGetMaxY"; - } -}; - - -//! Classe per calcular l'elongacio d'un blob -//! Class to calculate the elongation of the blob -class CBlobGetElongation: public COperadorBlob -{ -public: - double operator()(CBlob &blob); - const char *GetNom() - { - return "CBlobGetElongation"; - } -}; - -//! Classe per calcular la rugositat d'un blob -//! Class to calculate the roughness of the blob -class CBlobGetRoughness: public COperadorBlob -{ -public: - double operator()(CBlob &blob); - const char *GetNom() - { - return "CBlobGetRoughness"; - } -}; - -//! Classe per calcular la distància entre el centre del blob i un punt donat -//! Class to calculate the euclidean distance between the center of a blob and a given point -class CBlobGetDistanceFromPoint: public COperadorBlob -{ -public: - //! Standard constructor (distance to point 0,0) - CBlobGetDistanceFromPoint() - { - m_x = m_y = 0.0; - } - //! Constructor (distance to point x,y) - CBlobGetDistanceFromPoint( const double x, const double y ) - { - m_x = x; - m_y = y; - } - - double operator()(CBlob &blob); - const char *GetNom() - { - return "CBlobGetDistanceFromPoint"; - } - -private: - // coordenades del punt on volem calcular la distància - double m_x, m_y; -}; - -//! Classe per calcular el nombre de pixels externs d'un blob -//! Class to get the number of extern pixels of a blob -class CBlobGetExternPerimeter: public COperadorBlob -{ -public: - CBlobGetExternPerimeter() - { - m_mask = NULL; - m_xBorder = false; - m_yBorder = false; - } - CBlobGetExternPerimeter( IplImage *mask, bool xBorder = true, bool yBorder = true ) - { - m_mask = mask; - m_xBorder = xBorder; - m_yBorder = yBorder; - } - double operator()(CBlob &blob) - { - return blob.ExternPerimeter(m_mask, m_xBorder, m_yBorder); - } - const char *GetNom() - { - return "CBlobGetExternPerimeter"; - } -private: - IplImage *m_mask; - bool m_xBorder, m_yBorder; -}; - -//! Classe per calcular el ratio entre el perimetre i nombre pixels externs -//! valors propers a 0 indiquen que la majoria del blob és intern -//! valors propers a 1 indiquen que la majoria del blob és extern -//! Class to calculate the ratio between the perimeter and the number of extern pixels -class CBlobGetExternPerimeterRatio: public COperadorBlob -{ -public: - CBlobGetExternPerimeterRatio() - { - m_mask = NULL; - m_xBorder = false; - m_yBorder = false; - } - CBlobGetExternPerimeterRatio( IplImage *mask, bool xBorder = true, bool yBorder = true ) - { - m_mask = mask; - m_xBorder = xBorder; - m_yBorder = yBorder; - } - double operator()(CBlob &blob) - { - if( blob.Perimeter() != 0 ) - return blob.ExternPerimeter(m_mask, m_xBorder, m_yBorder) / blob.Perimeter(); - else - return blob.ExternPerimeter(m_mask, m_xBorder, m_yBorder); - } - const char *GetNom() - { - return "CBlobGetExternPerimeterRatio"; - } -private: - IplImage *m_mask; - bool m_xBorder, m_yBorder; -}; - -//! Classe per calcular el ratio entre el perimetre convex i nombre pixels externs -//! valors propers a 0 indiquen que la majoria del blob és intern -//! valors propers a 1 indiquen que la majoria del blob és extern -//! Class to calculate the ratio between the perimeter and the number of extern pixels -class CBlobGetExternHullPerimeterRatio: public COperadorBlob -{ -public: - CBlobGetExternHullPerimeterRatio() - { - m_mask = NULL; - m_xBorder = false; - m_yBorder = false; - } - CBlobGetExternHullPerimeterRatio( IplImage *mask, bool xBorder = true, bool yBorder = true ) - { - m_mask = mask; - m_xBorder = xBorder; - m_yBorder = yBorder; - } - double operator()(CBlob &blob) - { - CBlobGetHullPerimeter getHullPerimeter; - double hullPerimeter; - - if( (hullPerimeter = getHullPerimeter( blob ) ) != 0 ) - return blob.ExternPerimeter(m_mask, m_xBorder, m_yBorder) / hullPerimeter; - else - return blob.ExternPerimeter(m_mask, m_xBorder, m_yBorder); - } - const char *GetNom() - { - return "CBlobGetExternHullPerimeterRatio"; - } -private: - IplImage *m_mask; - bool m_xBorder, m_yBorder; - -}; - -//! Classe per calcular el centre en el eix X d'un blob -//! Class to calculate the center in the X direction -class CBlobGetXCenter: public COperadorBlob -{ -public: - double operator()(CBlob &blob) - { - return blob.MinX() + (( blob.MaxX() - blob.MinX() ) / 2.0); - } - const char *GetNom() - { - return "CBlobGetXCenter"; - } -}; - -//! Classe per calcular el centre en el eix Y d'un blob -//! Class to calculate the center in the Y direction -class CBlobGetYCenter: public COperadorBlob -{ -public: - double operator()(CBlob &blob) - { - return blob.MinY() + (( blob.MaxY() - blob.MinY() ) / 2.0); - } - const char *GetNom() - { - return "CBlobGetYCenter"; - } -}; - -//! Classe per calcular la longitud de l'eix major d'un blob -//! Class to calculate the length of the major axis of the ellipse that fits the blob edges -class CBlobGetMajorAxisLength: public COperadorBlob -{ -public: - double operator()(CBlob &blob) - { - CvBox2D elipse = blob.GetEllipse(); - - return elipse.size.width; - } - const char *GetNom() - { - return "CBlobGetMajorAxisLength"; - } -}; - -//! Classe per calcular el ratio entre l'area de la elipse i la de la taca -//! Class -class CBlobGetAreaElipseRatio: public COperadorBlob -{ -public: - double operator()(CBlob &blob) - { - if( blob.Area()==0.0 ) return 0.0; - - CvBox2D elipse = blob.GetEllipse(); - double ratioAreaElipseAreaTaca = ( (elipse.size.width/2.0) - * - (elipse.size.height/2.0) - *CV_PI - ) - / - blob.Area(); - - return ratioAreaElipseAreaTaca; - } - const char *GetNom() - { - return "CBlobGetAreaElipseRatio"; - } -}; - -//! Classe per calcular la longitud de l'eix menor d'un blob -//! Class to calculate the length of the minor axis of the ellipse that fits the blob edges -class CBlobGetMinorAxisLength: public COperadorBlob -{ -public: - double operator()(CBlob &blob) - { - CvBox2D elipse = blob.GetEllipse(); - - return elipse.size.height; - } - const char *GetNom() - { - return "CBlobGetMinorAxisLength"; - } -}; - -//! Classe per calcular l'orientació de l'ellipse del blob en radians -//! Class to calculate the orientation of the ellipse that fits the blob edges in radians -class CBlobGetOrientation: public COperadorBlob -{ -public: - double operator()(CBlob &blob) - { - CvBox2D elipse = blob.GetEllipse(); -/* - if( elipse.angle > 180.0 ) - return (( elipse.angle - 180.0 )* DEGREE2RAD); - else - return ( elipse.angle * DEGREE2RAD); -*/ - return elipse.angle; - } - const char *GetNom() - { - return "CBlobGetOrientation"; - } -}; - -//! Classe per calcular el cosinus de l'orientació de l'ellipse del blob -//! Class to calculate the cosinus of the orientation of the ellipse that fits the blob edges -class CBlobGetOrientationCos: public COperadorBlob -{ -public: - double operator()(CBlob &blob) - { - CBlobGetOrientation getOrientation; - return fabs( cos( getOrientation(blob)*DEGREE2RAD )); - } - const char *GetNom() - { - return "CBlobGetOrientationCos"; - } -}; - - -//! Classe per calcular el ratio entre l'eix major i menor de la el·lipse -//! Class to calculate the ratio between both axes of the ellipse -class CBlobGetAxisRatio: public COperadorBlob -{ -public: - double operator()(CBlob &blob) - { - double major,minor; - CBlobGetMajorAxisLength getMajor; - CBlobGetMinorAxisLength getMinor; - - major = getMajor(blob); - minor = getMinor(blob); - - if( major != 0 ) - return minor / major; - else - return 0; - } - const char *GetNom() - { - return "CBlobGetAxisRatio"; - } -}; - - -//! Classe per calcular si un punt cau dins del blob -//! Class to calculate whether a point is inside a blob -class CBlobGetXYInside: public COperadorBlob -{ -public: - //! Constructor estàndard - //! Standard constructor - CBlobGetXYInside() - { - m_p.x = 0; - m_p.y = 0; - } - //! Constructor: indiquem el punt - //! Constructor: sets the point - CBlobGetXYInside( CvPoint2D32f p ) - { - m_p = p; - }; - double operator()(CBlob &blob); - const char *GetNom() - { - return "CBlobGetXYInside"; - } - -private: - //! punt que considerem - //! point to be considered - CvPoint2D32f m_p; -}; - -#endif //!BLOB_OPERATORS_H_INCLUDED diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobProperties.cpp b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobProperties.cpp deleted file mode 100644 index 64b72654..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobProperties.cpp +++ /dev/null @@ -1,81 +0,0 @@ -#include "BlobProperties.h" - - -/** -- FUNCIÓ: GetPerimeter -- FUNCIONALITAT: Get perimeter from chain code. Diagonals sum sqrt(2) and horizontal and vertical codes 1 -- PARÀMETRES: - - -- RESULTAT: - - -- RESTRICCIONS: - - -- AUTOR: rborras -- DATA DE CREACIÓ: 2008/04/30 -- MODIFICACIÓ: Data. Autor. Descripció. -- NOTA: Algorithm derived from "Methods to estimate area and perimeters of blob-like objects: A comparison", L.Yang -*/ -#define SQRT2 1.414213562 - -/** -- FUNCIÓ: GetPerimeter -- FUNCIONALITAT: Get blob area, ie. external contour area minus internal contours area -- PARÀMETRES: - - -- RESULTAT: - - -- RESTRICCIONS: - - -- AUTOR: rborras -- DATA DE CREACIÓ: 2008/04/30 -- MODIFICACIÓ: Data. Autor. Descripció. -*/ - -double CBlobProperties::GetArea() -{ - double area; - t_contourList::iterator itContour; - - area = m_externalContour.GetArea(); - - itContour = m_internalContours.begin(); - - while (itContour != m_internalContours.end() ) - { - area += (*itContour).GetArea(); - itContour++; - } - return area; -} - -/** -- FUNCIÓ: GetPerimeter -- FUNCIONALITAT: Get blob perimeter, ie. sum of the lenght of all the contours -- PARÀMETRES: - - -- RESULTAT: - - -- RESTRICCIONS: - - -- AUTOR: rborras -- DATA DE CREACIÓ: 2008/04/30 -- MODIFICACIÓ: Data. Autor. Descripció. -*/ -double CBlobProperties::GetPerimeter() -{ - double perimeter; - t_contourList::iterator itContour; - - perimeter = m_externalContour.GetPerimeter(); - - itContour = m_internalContours.begin(); - - while (itContour != m_internalContours.end() ) - { - perimeter += (*itContour).GetPerimeter(); - itContour++; - } - return perimeter; -} - - diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobProperties.h b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobProperties.h deleted file mode 100644 index 51c10172..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobProperties.h +++ /dev/null @@ -1,70 +0,0 @@ - -//! Disable warnings referred to 255 character truncation for the std:map -#pragma warning( disable : 4786 ) - -#ifndef BLOB_PROPERTIES_H_INCLUDED -#define BLOB_PROPERTIES_H_INCLUDED - -#include -#include "BlobLibraryConfiguration.h" -#include "BlobContour.h" - - -#ifdef BLOB_OBJECT_FACTORY - //! Object factory pattern implementation - #include "..\inspecta\DesignPatterns\ObjectFactory.h" -#endif - - -//! Type of labelled images -typedef unsigned int t_labelType; - -//! Max order of calculated moments -#define MAX_MOMENTS_ORDER 3 - - -//! Blob class -class CBlobProperties -{ - typedef std::list t_contourList; - -public: - - CBlobProperties(); - virtual ~CBlobProperties(); - - //! Get blob area - double GetArea(); - - //! Get blob perimeter - double GetPerimeter(); - - //! Get contour moment (p,q up to MAX_CALCULATED_MOMENTS) - double GetMoment(int p, int q); - - - ////////////////////////////////////////////////////////////////////////// - // Blob contours - ////////////////////////////////////////////////////////////////////////// - - - //! Contour storage memory - CvMemStorage *m_storage; - //! External contour of the blob (crack codes) - CBlobContour m_externalContour; - //! Internal contours (crack codes) - t_contourList m_internalContours; - -private: - - //! Computed area from blob - double m_area; - //! Computed perimeter from blob - double m_perimeter; - // Computed moment from the blob - double m_moment[MAX_MOMENTS_ORDER*MAX_MOMENTS_ORDER]; - -}; - -#endif //!BLOB_PROPERTIES_H_INCLUDED - diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobResult.cpp b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobResult.cpp deleted file mode 100644 index 09869837..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobResult.cpp +++ /dev/null @@ -1,943 +0,0 @@ -/************************************************************************ - BlobResult.cpp - -FUNCIONALITAT: Implementació de la classe CBlobResult -AUTOR: Inspecta S.L. -MODIFICACIONS (Modificació, Autor, Data): - -**************************************************************************/ - -#include -#include -#include -#include -#include "BlobResult.h" - -//! Show errors functions: only works for windows releases -#ifdef _SHOW_ERRORS - #include //suport per a CStrings - #include //suport per a AfxMessageBox -#endif - -/************************************************************************** - Constructors / Destructors -**************************************************************************/ - - -/** -- FUNCIÓ: CBlobResult -- FUNCIONALITAT: Constructor estandard. -- PARÀMETRES: -- RESULTAT: -- Crea un CBlobResult sense cap blob -- RESTRICCIONS: -- AUTOR: Ricard Borràs -- DATA DE CREACIÓ: 20-07-2004. -- MODIFICACIÓ: Data. Autor. Descripció. -*/ -/** -- FUNCTION: CBlobResult -- FUNCTIONALITY: Standard constructor -- PARAMETERS: -- RESULT: - - creates an empty set of blobs -- RESTRICTIONS: -- AUTHOR: Ricard Borràs -- CREATION DATE: 25-05-2005. -- MODIFICATION: Date. Author. Description. -*/ -CBlobResult::CBlobResult() -{ - m_blobs = Blob_vector(); -} - -/** -- FUNCIÓ: CBlobResult -- FUNCIONALITAT: Constructor a partir d'una imatge. Inicialitza la seqüència de blobs - amb els blobs resultants de l'anàlisi de blobs de la imatge. -- PARÀMETRES: - - source: imatge d'on s'extreuran els blobs - - mask: màscara a aplicar. Només es calcularan els blobs on la màscara sigui - diferent de 0. Els blobs que toquin a un pixel 0 de la màscara seran - considerats exteriors. - - threshold: llindar que s'aplicarà a la imatge source abans de calcular els blobs - - findmoments: indica si s'han de calcular els moments de cada blob - - blackBlobs: true per buscar blobs negres a la binaritzazió (it will join all extern white blobs). - false per buscar blobs negres a la binaritzazió (it will join all extern black blobs). - -- RESULTAT: - - objecte CBlobResult amb els blobs de la imatge source -- RESTRICCIONS: -- AUTOR: Ricard Borràs -- DATA DE CREACIÓ: 25-05-2005. -- MODIFICACIÓ: Data. Autor. Descripció. -*/ -/** -- FUNCTION: CBlob -- FUNCTIONALITY: Constructor from an image. Fills an object with all the blobs in - the image -- PARAMETERS: - - source: image to extract the blobs from - - mask: optional mask to apply. The blobs will be extracted where the mask is - not 0. All the neighbouring blobs where the mask is 0 will be extern blobs - - threshold: threshold level to apply to the image before computing blobs - - findmoments: true to calculate the blob moments (slower) (needed to calculate elipses!) - - blackBlobs: true to search for black blobs in the binarization (it will join all extern white blobs). - false to search for white blobs in the binarization (it will join all extern black blobs). -- RESULT: - - object with all the blobs in the image. It throws an EXCEPCIO_CALCUL_BLOBS - if some error appears in the BlobAnalysis function -- RESTRICTIONS: -- AUTHOR: Ricard Borràs -- CREATION DATE: 25-05-2005. -- MODIFICATION: Date. Author. Description. -*/ -CBlobResult::CBlobResult(IplImage *source, IplImage *mask, uchar backgroundColor ) -{ - bool success; - - try - { - success = ComponentLabeling( source, mask, backgroundColor, m_blobs ); - } - catch(...) - { - success = false; - } - - if( !success ) throw EXCEPCIO_CALCUL_BLOBS; -} - -/** -- FUNCIÓ: CBlobResult -- FUNCIONALITAT: Constructor de còpia. Inicialitza la seqüència de blobs - amb els blobs del paràmetre. -- PARÀMETRES: - - source: objecte que es copiarà -- RESULTAT: - - objecte CBlobResult amb els blobs de l'objecte source -- RESTRICCIONS: -- AUTOR: Ricard Borràs -- DATA DE CREACIÓ: 25-05-2005. -- MODIFICACIÓ: Data. Autor. Descripció. -*/ -/** -- FUNCTION: CBlobResult -- FUNCTIONALITY: Copy constructor -- PARAMETERS: - - source: object to copy -- RESULT: -- RESTRICTIONS: -- AUTHOR: Ricard Borràs -- CREATION DATE: 25-05-2005. -- MODIFICATION: Date. Author. Description. -*/ -CBlobResult::CBlobResult( const CBlobResult &source ) -{ - m_blobs = Blob_vector( source.GetNumBlobs() ); - - // creem el nou a partir del passat com a paràmetre - m_blobs = Blob_vector( source.GetNumBlobs() ); - // copiem els blobs de l'origen a l'actual - Blob_vector::const_iterator pBlobsSrc = source.m_blobs.begin(); - Blob_vector::iterator pBlobsDst = m_blobs.begin(); - - while( pBlobsSrc != source.m_blobs.end() ) - { - // no podem cridar a l'operador = ja que Blob_vector és un - // vector de CBlob*. Per tant, creem un blob nou a partir del - // blob original - *pBlobsDst = new CBlob(**pBlobsSrc); - pBlobsSrc++; - pBlobsDst++; - } -} - - - -/** -- FUNCIÓ: ~CBlobResult -- FUNCIONALITAT: Destructor estandard. -- PARÀMETRES: -- RESULTAT: - - Allibera la memòria reservada de cadascun dels blobs de la classe -- RESTRICCIONS: -- AUTOR: Ricard Borràs -- DATA DE CREACIÓ: 25-05-2005. -- MODIFICACIÓ: Data. Autor. Descripció. -*/ -/** -- FUNCTION: ~CBlobResult -- FUNCTIONALITY: Destructor -- PARAMETERS: -- RESULT: -- RESTRICTIONS: -- AUTHOR: Ricard Borràs -- CREATION DATE: 25-05-2005. -- MODIFICATION: Date. Author. Description. -*/ -CBlobResult::~CBlobResult() -{ - ClearBlobs(); -} - -/************************************************************************** - Operadors / Operators -**************************************************************************/ - - -/** -- FUNCIÓ: operador = -- FUNCIONALITAT: Assigna un objecte source a l'actual -- PARÀMETRES: - - source: objecte a assignar -- RESULTAT: - - Substitueix els blobs actuals per els de l'objecte source -- RESTRICCIONS: -- AUTOR: Ricard Borràs -- DATA DE CREACIÓ: 25-05-2005. -- MODIFICACIÓ: Data. Autor. Descripció. -*/ -/** -- FUNCTION: Assigment operator -- FUNCTIONALITY: -- PARAMETERS: -- RESULT: -- RESTRICTIONS: -- AUTHOR: Ricard Borràs -- CREATION DATE: 25-05-2005. -- MODIFICATION: Date. Author. Description. -*/ -CBlobResult& CBlobResult::operator=(const CBlobResult& source) -{ - // si ja són el mateix, no cal fer res - if (this != &source) - { - // alliberem el conjunt de blobs antic - for( int i = 0; i < GetNumBlobs(); i++ ) - { - delete m_blobs[i]; - } - m_blobs.clear(); - // creem el nou a partir del passat com a paràmetre - m_blobs = Blob_vector( source.GetNumBlobs() ); - // copiem els blobs de l'origen a l'actual - Blob_vector::const_iterator pBlobsSrc = source.m_blobs.begin(); - Blob_vector::iterator pBlobsDst = m_blobs.begin(); - - while( pBlobsSrc != source.m_blobs.end() ) - { - // no podem cridar a l'operador = ja que Blob_vector és un - // vector de CBlob*. Per tant, creem un blob nou a partir del - // blob original - *pBlobsDst = new CBlob(**pBlobsSrc); - pBlobsSrc++; - pBlobsDst++; - } - } - return *this; -} - - -/** -- FUNCIÓ: operador + -- FUNCIONALITAT: Concatena els blobs de dos CBlobResult -- PARÀMETRES: - - source: d'on s'agafaran els blobs afegits a l'actual -- RESULTAT: - - retorna un nou CBlobResult amb els dos CBlobResult concatenats -- RESTRICCIONS: -- AUTOR: Ricard Borràs -- DATA DE CREACIÓ: 25-05-2005. -- NOTA: per la implementació, els blobs del paràmetre es posen en ordre invers -- MODIFICACIÓ: Data. Autor. Descripció. -*/ -/** -- FUNCTION: + operator -- FUNCTIONALITY: Joins the blobs in source with the current ones -- PARAMETERS: - - source: object to copy the blobs -- RESULT: - - object with the actual blobs and the source blobs -- RESTRICTIONS: -- AUTHOR: Ricard Borràs -- CREATION DATE: 25-05-2005. -- MODIFICATION: Date. Author. Description. -*/ -CBlobResult CBlobResult::operator+( const CBlobResult& source ) const -{ - //creem el resultat a partir dels blobs actuals - CBlobResult resultat( *this ); - - // reservem memòria per als nous blobs - resultat.m_blobs.resize( resultat.GetNumBlobs() + source.GetNumBlobs() ); - - // declarem els iterador per recòrrer els blobs d'origen i desti - Blob_vector::const_iterator pBlobsSrc = source.m_blobs.begin(); - Blob_vector::iterator pBlobsDst = resultat.m_blobs.end(); - - // insertem els blobs de l'origen a l'actual - while( pBlobsSrc != source.m_blobs.end() ) - { - pBlobsDst--; - *pBlobsDst = new CBlob(**pBlobsSrc); - pBlobsSrc++; - } - - return resultat; -} - -/************************************************************************** - Operacions / Operations -**************************************************************************/ - -/** -- FUNCIÓ: AddBlob -- FUNCIONALITAT: Afegeix un blob al conjunt -- PARÀMETRES: - - blob: blob a afegir -- RESULTAT: - - modifica el conjunt de blobs actual -- RESTRICCIONS: -- AUTOR: Ricard Borràs -- DATA DE CREACIÓ: 2006/03/01 -- MODIFICACIÓ: Data. Autor. Descripció. -*/ -void CBlobResult::AddBlob( CBlob *blob ) -{ - if( blob != NULL ) - m_blobs.push_back( new CBlob( blob ) ); -} - - -#ifdef MATRIXCV_ACTIU - -/** -- FUNCIÓ: GetResult -- FUNCIONALITAT: Calcula el resultat especificat sobre tots els blobs de la classe -- PARÀMETRES: - - evaluador: Qualsevol objecte derivat de COperadorBlob -- RESULTAT: - - Retorna un array de double's amb el resultat per cada blob -- RESTRICCIONS: -- AUTOR: Ricard Borràs -- DATA DE CREACIÓ: 25-05-2005. -- MODIFICACIÓ: Data. Autor. Descripció. -*/ -/** -- FUNCTION: GetResult -- FUNCTIONALITY: Computes the function evaluador on all the blobs of the class - and returns a vector with the result -- PARAMETERS: - - evaluador: function to apply to each blob (any object derived from the - COperadorBlob class ) -- RESULT: - - vector with all the results in the same order as the blobs -- RESTRICTIONS: -- AUTHOR: Ricard Borràs -- CREATION DATE: 25-05-2005. -- MODIFICATION: Date. Author. Description. -*/ -double_vector CBlobResult::GetResult( funcio_calculBlob *evaluador ) const -{ - if( GetNumBlobs() <= 0 ) - { - return double_vector(); - } - - // definim el resultat - double_vector result = double_vector( GetNumBlobs() ); - // i iteradors sobre els blobs i el resultat - double_vector::iterator itResult = result.GetIterator(); - Blob_vector::const_iterator itBlobs = m_blobs.begin(); - - // avaluem la funció en tots els blobs - while( itBlobs != m_blobs.end() ) - { - *itResult = (*evaluador)(**itBlobs); - itBlobs++; - itResult++; - } - return result; -} -#endif - -/** -- FUNCIÓ: GetSTLResult -- FUNCIONALITAT: Calcula el resultat especificat sobre tots els blobs de la classe -- PARÀMETRES: - - evaluador: Qualsevol objecte derivat de COperadorBlob -- RESULTAT: - - Retorna un array de double's STL amb el resultat per cada blob -- RESTRICCIONS: -- AUTOR: Ricard Borràs -- DATA DE CREACIÓ: 25-05-2005. -- MODIFICACIÓ: Data. Autor. Descripció. -*/ -/** -- FUNCTION: GetResult -- FUNCTIONALITY: Computes the function evaluador on all the blobs of the class - and returns a vector with the result -- PARAMETERS: - - evaluador: function to apply to each blob (any object derived from the - COperadorBlob class ) -- RESULT: - - vector with all the results in the same order as the blobs -- RESTRICTIONS: -- AUTHOR: Ricard Borràs -- CREATION DATE: 25-05-2005. -- MODIFICATION: Date. Author. Description. -*/ -double_stl_vector CBlobResult::GetSTLResult( funcio_calculBlob *evaluador ) const -{ - if( GetNumBlobs() <= 0 ) - { - return double_stl_vector(); - } - - // definim el resultat - double_stl_vector result = double_stl_vector( GetNumBlobs() ); - // i iteradors sobre els blobs i el resultat - double_stl_vector::iterator itResult = result.begin(); - Blob_vector::const_iterator itBlobs = m_blobs.begin(); - - // avaluem la funció en tots els blobs - while( itBlobs != m_blobs.end() ) - { - *itResult = (*evaluador)(**itBlobs); - itBlobs++; - itResult++; - } - return result; -} - -/** -- FUNCIÓ: GetNumber -- FUNCIONALITAT: Calcula el resultat especificat sobre un únic blob de la classe -- PARÀMETRES: - - evaluador: Qualsevol objecte derivat de COperadorBlob - - indexblob: número de blob del que volem calcular el resultat. -- RESULTAT: - - Retorna un double amb el resultat -- RESTRICCIONS: -- AUTOR: Ricard Borràs -- DATA DE CREACIÓ: 25-05-2005. -- MODIFICACIÓ: Data. Autor. Descripció. -*/ -/** -- FUNCTION: GetNumber -- FUNCTIONALITY: Computes the function evaluador on a blob of the class -- PARAMETERS: - - indexBlob: index of the blob to compute the function - - evaluador: function to apply to each blob (any object derived from the - COperadorBlob class ) -- RESULT: -- RESTRICTIONS: -- AUTHOR: Ricard Borràs -- CREATION DATE: 25-05-2005. -- MODIFICATION: Date. Author. Description. -*/ -double CBlobResult::GetNumber( int indexBlob, funcio_calculBlob *evaluador ) const -{ - if( indexBlob < 0 || indexBlob >= GetNumBlobs() ) - RaiseError( EXCEPTION_BLOB_OUT_OF_BOUNDS ); - return (*evaluador)( *m_blobs[indexBlob] ); -} - -/////////////////////////// FILTRAT DE BLOBS //////////////////////////////////// - -/** -- FUNCIÓ: Filter -- FUNCIONALITAT: Filtra els blobs de la classe i deixa el resultat amb només - els blobs que han passat el filtre. - El filtrat es basa en especificar condicions sobre un resultat dels blobs - i seleccionar (o excloure) aquells blobs que no compleixen una determinada - condicio -- PARÀMETRES: - - dst: variable per deixar els blobs filtrats - - filterAction: acció de filtrat. Incloure els blobs trobats (B_INCLUDE), - o excloure els blobs trobats (B_EXCLUDE) - - evaluador: Funció per evaluar els blobs (qualsevol objecte derivat de COperadorBlob - - Condition: tipus de condició que ha de superar la mesura (FilterType) - sobre cada blob per a ser considerat. - B_EQUAL,B_NOT_EQUAL,B_GREATER,B_LESS,B_GREATER_OR_EQUAL, - B_LESS_OR_EQUAL,B_INSIDE,B_OUTSIDE - - LowLimit: valor numèric per a la comparació (Condition) de la mesura (FilterType) - - HighLimit: valor numèric per a la comparació (Condition) de la mesura (FilterType) - (només té sentit per a aquelles condicions que tenen dos valors - (B_INSIDE, per exemple). -- RESULTAT: - - Deixa els blobs resultants del filtrat a destination -- RESTRICCIONS: -- AUTOR: Ricard Borràs -- DATA DE CREACIÓ: 25-05-2005. -- MODIFICACIÓ: Data. Autor. Descripció. -*/ -/** -- FUNCTION: Filter -- FUNCTIONALITY: Get some blobs from the class based on conditions on measures - of the blobs. -- PARAMETERS: - - dst: where to store the selected blobs - - filterAction: B_INCLUDE: include the blobs which pass the filter in the result - B_EXCLUDE: exclude the blobs which pass the filter in the result - - evaluador: Object to evaluate the blob - - Condition: How to decide if the result returned by evaluador on each blob - is included or not. It can be: - B_EQUAL,B_NOT_EQUAL,B_GREATER,B_LESS,B_GREATER_OR_EQUAL, - B_LESS_OR_EQUAL,B_INSIDE,B_OUTSIDE - - LowLimit: numerical value to evaluate the Condition on evaluador(blob) - - HighLimit: numerical value to evaluate the Condition on evaluador(blob). - Only useful for B_INSIDE and B_OUTSIDE -- RESULT: - - It returns on dst the blobs that accomplish (B_INCLUDE) or discards (B_EXCLUDE) - the Condition on the result returned by evaluador on each blob -- RESTRICTIONS: -- AUTHOR: Ricard Borràs -- CREATION DATE: 25-05-2005. -- MODIFICATION: Date. Author. Description. -*/ -void CBlobResult::Filter(CBlobResult &dst, - int filterAction, - funcio_calculBlob *evaluador, - int condition, - double lowLimit, double highLimit /*=0*/) const - -{ - // do the job - DoFilter(dst, filterAction, evaluador, condition, lowLimit, highLimit ); -} - -/** -- FUNCIÓ: Filter (const version) -- FUNCIONALITAT: Filtra els blobs de la classe i deixa el resultat amb només - els blobs que han passat el filtre. - El filtrat es basa en especificar condicions sobre un resultat dels blobs - i seleccionar (o excloure) aquells blobs que no compleixen una determinada - condicio -- PARÀMETRES: - - dst: variable per deixar els blobs filtrats - - filterAction: acció de filtrat. Incloure els blobs trobats (B_INCLUDE), - o excloure els blobs trobats (B_EXCLUDE) - - evaluador: Funció per evaluar els blobs (qualsevol objecte derivat de COperadorBlob - - Condition: tipus de condició que ha de superar la mesura (FilterType) - sobre cada blob per a ser considerat. - B_EQUAL,B_NOT_EQUAL,B_GREATER,B_LESS,B_GREATER_OR_EQUAL, - B_LESS_OR_EQUAL,B_INSIDE,B_OUTSIDE - - LowLimit: valor numèric per a la comparació (Condition) de la mesura (FilterType) - - HighLimit: valor numèric per a la comparació (Condition) de la mesura (FilterType) - (només té sentit per a aquelles condicions que tenen dos valors - (B_INSIDE, per exemple). -- RESULTAT: - - Deixa els blobs resultants del filtrat a destination -- RESTRICCIONS: -- AUTOR: Ricard Borràs -- DATA DE CREACIÓ: 25-05-2005. -- MODIFICACIÓ: Data. Autor. Descripció. -*/ -/** -- FUNCTION: Filter (const version) -- FUNCTIONALITY: Get some blobs from the class based on conditions on measures - of the blobs. -- PARAMETERS: - - dst: where to store the selected blobs - - filterAction: B_INCLUDE: include the blobs which pass the filter in the result - B_EXCLUDE: exclude the blobs which pass the filter in the result - - evaluador: Object to evaluate the blob - - Condition: How to decide if the result returned by evaluador on each blob - is included or not. It can be: - B_EQUAL,B_NOT_EQUAL,B_GREATER,B_LESS,B_GREATER_OR_EQUAL, - B_LESS_OR_EQUAL,B_INSIDE,B_OUTSIDE - - LowLimit: numerical value to evaluate the Condition on evaluador(blob) - - HighLimit: numerical value to evaluate the Condition on evaluador(blob). - Only useful for B_INSIDE and B_OUTSIDE -- RESULT: - - It returns on dst the blobs that accomplish (B_INCLUDE) or discards (B_EXCLUDE) - the Condition on the result returned by evaluador on each blob -- RESTRICTIONS: -- AUTHOR: Ricard Borràs -- CREATION DATE: 25-05-2005. -- MODIFICATION: Date. Author. Description. -*/ -void CBlobResult::Filter(CBlobResult &dst, - int filterAction, - funcio_calculBlob *evaluador, - int condition, - double lowLimit, double highLimit /*=0*/) - -{ - int numBlobs = GetNumBlobs(); - - // do the job - DoFilter(dst, filterAction, evaluador, condition, lowLimit, highLimit ); - - // inline operation: remove previous blobs - if( &dst == this ) - { - // esborrem els primers blobs ( que són els originals ) - // ja que els tindrem replicats al final si passen el filtre - Blob_vector::iterator itBlobs = m_blobs.begin(); - for( int i = 0; i < numBlobs; i++ ) - { - delete *itBlobs; - itBlobs++; - } - m_blobs.erase( m_blobs.begin(), itBlobs ); - } -} - - -//! Does the Filter method job -void CBlobResult::DoFilter(CBlobResult &dst, int filterAction, funcio_calculBlob *evaluador, - int condition, double lowLimit, double highLimit/* = 0*/) const -{ - int i, numBlobs; - bool resultavaluacio; - double_stl_vector avaluacioBlobs; - double_stl_vector::iterator itavaluacioBlobs; - - if( GetNumBlobs() <= 0 ) return; - if( !evaluador ) return; - //avaluem els blobs amb la funció pertinent - avaluacioBlobs = GetSTLResult(evaluador); - itavaluacioBlobs = avaluacioBlobs.begin(); - numBlobs = GetNumBlobs(); - switch(condition) - { - case B_EQUAL: - for(i=0;i lowLimit; - if( ( resultavaluacio && filterAction == B_INCLUDE ) || - ( !resultavaluacio && filterAction == B_EXCLUDE )) - { - dst.m_blobs.push_back( new CBlob( GetBlob( i ) )); - } - } - break; - case B_LESS: - for(i=0;i= lowLimit; - if( ( resultavaluacio && filterAction == B_INCLUDE ) || - ( !resultavaluacio && filterAction == B_EXCLUDE )) - { - dst.m_blobs.push_back( new CBlob( GetBlob( i ) )); - } - } - break; - case B_LESS_OR_EQUAL: - for(i=0;i= lowLimit) && ( *itavaluacioBlobs <= highLimit); - if( ( resultavaluacio && filterAction == B_INCLUDE ) || - ( !resultavaluacio && filterAction == B_EXCLUDE )) - { - dst.m_blobs.push_back( new CBlob( GetBlob( i ) )); - } - } - break; - case B_OUTSIDE: - for(i=0;i highLimit); - if( ( resultavaluacio && filterAction == B_INCLUDE ) || - ( !resultavaluacio && filterAction == B_EXCLUDE )) - { - dst.m_blobs.push_back( new CBlob( GetBlob( i ) )); - } - } - break; - } -} -/** -- FUNCIÓ: GetBlob -- FUNCIONALITAT: Retorna un blob si aquest existeix (index != -1) -- PARÀMETRES: - - indexblob: index del blob a retornar -- RESULTAT: -- RESTRICCIONS: -- AUTOR: Ricard Borràs -- DATA DE CREACIÓ: 25-05-2005. -- MODIFICACIÓ: Data. Autor. Descripció. -*/ -/* -- FUNCTION: GetBlob -- FUNCTIONALITY: Gets the n-th blob (without ordering the blobs) -- PARAMETERS: - - indexblob: index in the blob array -- RESULT: -- RESTRICTIONS: -- AUTHOR: Ricard Borràs -- CREATION DATE: 25-05-2005. -- MODIFICATION: Date. Author. Description. -*/ -CBlob CBlobResult::GetBlob(int indexblob) const -{ - if( indexblob < 0 || indexblob >= GetNumBlobs() ) - RaiseError( EXCEPTION_BLOB_OUT_OF_BOUNDS ); - - return *m_blobs[indexblob]; -} -CBlob *CBlobResult::GetBlob(int indexblob) -{ - if( indexblob < 0 || indexblob >= GetNumBlobs() ) - RaiseError( EXCEPTION_BLOB_OUT_OF_BOUNDS ); - - return m_blobs[indexblob]; -} - -/** -- FUNCIÓ: GetNthBlob -- FUNCIONALITAT: Retorna l'enèssim blob segons un determinat criteri -- PARÀMETRES: - - criteri: criteri per ordenar els blobs (objectes derivats de COperadorBlob) - - nBlob: index del blob a retornar - - dst: on es retorna el resultat -- RESULTAT: - - retorna el blob nBlob a dst ordenant els blobs de la classe segons el criteri - en ordre DESCENDENT. Per exemple, per obtenir el blob major: - GetNthBlob( CBlobGetArea(), 0, blobMajor ); - GetNthBlob( CBlobGetArea(), 1, blobMajor ); (segon blob més gran) -- RESTRICCIONS: -- AUTOR: Ricard Borràs -- DATA DE CREACIÓ: 25-05-2005. -- MODIFICACIÓ: Data. Autor. Descripció. -*/ -/* -- FUNCTION: GetNthBlob -- FUNCTIONALITY: Gets the n-th blob ordering first the blobs with some criteria -- PARAMETERS: - - criteri: criteria to order the blob array - - nBlob: index of the returned blob in the ordered blob array - - dst: where to store the result -- RESULT: -- RESTRICTIONS: -- AUTHOR: Ricard Borràs -- CREATION DATE: 25-05-2005. -- MODIFICATION: Date. Author. Description. -*/ -void CBlobResult::GetNthBlob( funcio_calculBlob *criteri, int nBlob, CBlob &dst ) const -{ - // verifiquem que no estem accedint fora el vector de blobs - if( nBlob < 0 || nBlob >= GetNumBlobs() ) - { - //RaiseError( EXCEPTION_BLOB_OUT_OF_BOUNDS ); - dst = CBlob(); - return; - } - - double_stl_vector avaluacioBlobs, avaluacioBlobsOrdenat; - double valorEnessim; - - //avaluem els blobs amb la funció pertinent - avaluacioBlobs = GetSTLResult(criteri); - - avaluacioBlobsOrdenat = double_stl_vector( GetNumBlobs() ); - - // obtenim els nBlob primers resultats (en ordre descendent) - std::partial_sort_copy( avaluacioBlobs.begin(), - avaluacioBlobs.end(), - avaluacioBlobsOrdenat.begin(), - avaluacioBlobsOrdenat.end(), - std::greater() ); - - valorEnessim = avaluacioBlobsOrdenat[nBlob]; - - // busquem el primer blob que té el valor n-ssim - double_stl_vector::const_iterator itAvaluacio = avaluacioBlobs.begin(); - - bool trobatBlob = false; - int indexBlob = 0; - while( itAvaluacio != avaluacioBlobs.end() && !trobatBlob ) - { - if( *itAvaluacio == valorEnessim ) - { - trobatBlob = true; - dst = CBlob( GetBlob(indexBlob)); - } - itAvaluacio++; - indexBlob++; - } -} - -/** -- FUNCIÓ: ClearBlobs -- FUNCIONALITAT: Elimina tots els blobs de l'objecte -- PARÀMETRES: -- RESULTAT: - - Allibera tota la memòria dels blobs -- RESTRICCIONS: -- AUTOR: Ricard Borràs Navarra -- DATA DE CREACIÓ: 25-05-2005. -- MODIFICACIÓ: Data. Autor. Descripció. -*/ -/* -- FUNCTION: ClearBlobs -- FUNCTIONALITY: Clears all the blobs from the object and releases all its memory -- PARAMETERS: -- RESULT: -- RESTRICTIONS: -- AUTHOR: Ricard Borràs -- CREATION DATE: 25-05-2005. -- MODIFICATION: Date. Author. Description. -*/ -void CBlobResult::ClearBlobs() -{ - Blob_vector::iterator itBlobs = m_blobs.begin(); - while( itBlobs != m_blobs.end() ) - { - delete *itBlobs; - itBlobs++; - } - - m_blobs.clear(); -} - -/** -- FUNCIÓ: RaiseError -- FUNCIONALITAT: Funció per a notificar errors al l'usuari (en debug) i llença - les excepcions -- PARÀMETRES: - - errorCode: codi d'error -- RESULTAT: - - Ensenya un missatge a l'usuari (en debug) i llença una excepció -- RESTRICCIONS: -- AUTOR: Ricard Borràs Navarra -- DATA DE CREACIÓ: 25-05-2005. -- MODIFICACIÓ: Data. Autor. Descripció. -*/ -/* -- FUNCTION: RaiseError -- FUNCTIONALITY: Error handling function -- PARAMETERS: - - errorCode: reason of the error -- RESULT: - - in _SHOW_ERRORS version, shows a message box with the error. In release is silent. - In both cases throws an exception with the error. -- RESTRICTIONS: -- AUTHOR: Ricard Borràs -- CREATION DATE: 25-05-2005. -- MODIFICATION: Date. Author. Description. -*/ -void CBlobResult::RaiseError(const int errorCode) const -{ -//! Do we need to show errors? -#ifdef _SHOW_ERRORS - CString msg, format = "Error en CBlobResult: %s"; - - switch (errorCode) - { - case EXCEPTION_BLOB_OUT_OF_BOUNDS: - msg.Format(format, "Intentant accedir a un blob no existent"); - break; - default: - msg.Format(format, "Codi d'error desconegut"); - break; - } - - AfxMessageBox(msg); - -#endif - throw errorCode; -} - - - -/************************************************************************** - Auxiliars / Auxiliary functions -**************************************************************************/ - - -/** -- FUNCIÓ: PrintBlobs -- FUNCIONALITAT: Escriu els paràmetres (àrea, perímetre, exterior, mitjana) - de tots els blobs a un fitxer. -- PARÀMETRES: - - nom_fitxer: path complet del fitxer amb el resultat -- RESULTAT: -- RESTRICCIONS: -- AUTOR: Ricard Borràs -- DATA DE CREACIÓ: 25-05-2005. -- MODIFICACIÓ: Data. Autor. Descripció. -*/ -/* -- FUNCTION: PrintBlobs -- FUNCTIONALITY: Prints some blob features in an ASCII file -- PARAMETERS: - - nom_fitxer: full path + filename to generate -- RESULT: -- RESTRICTIONS: -- AUTHOR: Ricard Borràs -- CREATION DATE: 25-05-2005. -- MODIFICATION: Date. Author. Description. -*/ -void CBlobResult::PrintBlobs( char *nom_fitxer ) const -{ - double_stl_vector area, /*perimetre,*/ exterior, compacitat, longitud, - externPerimeter, perimetreConvex, perimetre; - int i; - FILE *fitxer_sortida; - - area = GetSTLResult( CBlobGetArea()); - perimetre = GetSTLResult( CBlobGetPerimeter()); - exterior = GetSTLResult( CBlobGetExterior()); - compacitat = GetSTLResult(CBlobGetCompactness()); - longitud = GetSTLResult( CBlobGetLength()); - externPerimeter = GetSTLResult( CBlobGetExternPerimeter()); - perimetreConvex = GetSTLResult( CBlobGetHullPerimeter()); - - fitxer_sortida = fopen( nom_fitxer, "w" ); - - for(i=0; i\t a=%7.0f\t p=%8.2f (%8.2f extern)\t pconvex=%8.2f\t ext=%.0f\t m=%7.2f\t c=%3.2f\t l=%8.2f\n", -// i, area[i], perimetre[i], externPerimeter[i], perimetreConvex[i], exterior[i], compacitat[i], longitud[i] ); - } - fclose( fitxer_sortida ); - -} diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobResult.h b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobResult.h deleted file mode 100644 index 5d86142f..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobResult.h +++ /dev/null @@ -1,171 +0,0 @@ -/************************************************************************ - BlobResult.h - -FUNCIONALITAT: Definici� de la classe CBlobResult -AUTOR: Inspecta S.L. -MODIFICACIONS (Modificaci�, Autor, Data): - -FUNCTIONALITY: Definition of the CBlobResult class -AUTHOR: Inspecta S.L. -MODIFICATIONS (Modification, Author, Date): - -**************************************************************************/ - - -#if !defined(_CLASSE_BLOBRESULT_INCLUDED) -#define _CLASSE_BLOBRESULT_INCLUDED - -#if _MSC_VER > 1000 -#pragma once -#endif // _MSC_VER > 1000 - -#include "BlobLibraryConfiguration.h" -#include -#include - -#ifdef MATRIXCV_ACTIU - #include "matrixCV.h" -#else - // llibreria STL - #include "vector" - //! Vector de doubles - typedef std::vector double_stl_vector; -#endif - -#include // vectors de la STL -#include -#include "blob.h" -#include "BlobOperators.h" -#include "ComponentLabeling.h" -/************************************************************************** - Filtres / Filters -**************************************************************************/ - -//! accions que es poden fer amb els filtres -//! Actions performed by a filter (include or exclude blobs) -#define B_INCLUDE 1L -#define B_EXCLUDE 2L - -//! condicions sobre els filtres -//! Conditions to apply the filters -#define B_EQUAL 3L -#define B_NOT_EQUAL 4L -#define B_GREATER 5L -#define B_LESS 6L -#define B_GREATER_OR_EQUAL 7L -#define B_LESS_OR_EQUAL 8L -#define B_INSIDE 9L -#define B_OUTSIDE 10L - - -/************************************************************************** - Excepcions / Exceptions -**************************************************************************/ - -//! Excepcions llen�ades per les funcions: -#define EXCEPTION_BLOB_OUT_OF_BOUNDS 1000 -#define EXCEPCIO_CALCUL_BLOBS 1001 - -/** - Classe que cont� un conjunt de blobs i permet extreure'n propietats - o filtrar-los segons determinats criteris. - Class to calculate the blobs of an image and calculate some properties - on them. Also, the class provides functions to filter the blobs using - some criteria. -*/ -class CBlobResult -{ -public: - - //! constructor estandard, crea un conjunt buit de blobs - //! Standard constructor, it creates an empty set of blobs - CBlobResult(); - //! constructor a partir d'una imatge - //! Image constructor, it creates an object with the blobs of the image - CBlobResult(IplImage *source, IplImage *mask, uchar backgroundColor); - //! constructor de c�pia - //! Copy constructor - CBlobResult( const CBlobResult &source ); - //! Destructor - virtual ~CBlobResult(); - - //! operador = per a fer assignacions entre CBlobResult - //! Assigment operator - CBlobResult& operator=(const CBlobResult& source); - //! operador + per concatenar dos CBlobResult - //! Addition operator to concatenate two sets of blobs - CBlobResult operator+( const CBlobResult& source ) const; - - //! Afegeix un blob al conjunt - //! Adds a blob to the set of blobs - void AddBlob( CBlob *blob ); - -#ifdef MATRIXCV_ACTIU - //! Calcula un valor sobre tots els blobs de la classe retornant una MatrixCV - //! Computes some property on all the blobs of the class - double_vector GetResult( funcio_calculBlob *evaluador ) const; -#endif - //! Calcula un valor sobre tots els blobs de la classe retornant un std::vector - //! Computes some property on all the blobs of the class - double_stl_vector GetSTLResult( funcio_calculBlob *evaluador ) const; - - //! Calcula un valor sobre un blob de la classe - //! Computes some property on one blob of the class - double GetNumber( int indexblob, funcio_calculBlob *evaluador ) const; - - //! Retorna aquells blobs que compleixen les condicions del filtre en el destination - //! Filters the blobs of the class using some property - void Filter(CBlobResult &dst, - int filterAction, funcio_calculBlob *evaluador, - int condition, double lowLimit, double highLimit = 0 ); - void Filter(CBlobResult &dst, - int filterAction, funcio_calculBlob *evaluador, - int condition, double lowLimit, double highLimit = 0 ) const; - - //! Retorna l'en�ssim blob segons un determinat criteri - //! Sorts the blobs of the class acording to some criteria and returns the n-th blob - void GetNthBlob( funcio_calculBlob *criteri, int nBlob, CBlob &dst ) const; - - //! Retorna el blob en�ssim - //! Gets the n-th blob of the class ( without sorting ) - CBlob GetBlob(int indexblob) const; - CBlob *GetBlob(int indexblob); - - //! Elimina tots els blobs de l'objecte - //! Clears all the blobs of the class - void ClearBlobs(); - - //! Escriu els blobs a un fitxer - //! Prints some features of all the blobs in a file - void PrintBlobs( char *nom_fitxer ) const; - - -//Metodes GET/SET - - //! Retorna el total de blobs - //! Gets the total number of blobs - int GetNumBlobs() const - { - return(m_blobs.size()); - } - - -private: - - //! Funci� per gestionar els errors - //! Function to manage the errors - void RaiseError(const int errorCode) const; - - //! Does the Filter method job - void DoFilter(CBlobResult &dst, - int filterAction, funcio_calculBlob *evaluador, - int condition, double lowLimit, double highLimit = 0) const; - -protected: - - //! Vector amb els blobs - //! Vector with all the blobs - Blob_vector m_blobs; -}; - -#endif // !defined(_CLASSE_BLOBRESULT_INCLUDED) diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/ComponentLabeling.cpp b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/ComponentLabeling.cpp deleted file mode 100644 index 5aff3125..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/ComponentLabeling.cpp +++ /dev/null @@ -1,630 +0,0 @@ - -#include "ComponentLabeling.h" - -#include -#include -#include -#include - -//! Conversion from freeman code to coordinate increments (counterclockwise) -static const CvPoint freemanCodeIncrement[8] = - { {1, 0}, {1, -1}, {0, -1}, {-1, -1}, {-1, 0}, {-1, 1}, {0, 1}, {1, 1} }; - - - -/** -- FUNCIÓ: -- FUNCIONALITAT: -- PARÀMETRES: - - -- RESULTAT: - - -- RESTRICCIONS: - - -- AUTOR: rborras -- DATA DE CREACIÓ: 2008/04/29 -- MODIFICACIÓ: Data. Autor. Descripció. -*/ -inline unsigned char GET_ABOVE_IMAGEPIXEL( unsigned char *currentPixel, IplImage *image ) -{ - return *(currentPixel - image->widthStep); -} -inline unsigned char GET_BELOW_IMAGEPIXEL( unsigned char *currentPixel, IplImage *image ) -{ - return *(currentPixel + image->widthStep); -} - - - -inline unsigned char GET_IMAGE_PIXEL( IplImage *image, CvPoint p ) -{ - return *(image->imageData + p.x + p.y *image->widthStep); -} - -inline bool GET_IMAGEMASK_PIXEL( IplImage *mask, CvPoint p ) -{ - if( mask != NULL ) - return ((unsigned char)*(mask->imageData + p.x + p.y *mask->widthStep)) > 0; - else - return true; -} -inline bool GET_BELOW_VISITEDPIXEL( bool *currentPixel, int imageWidth ) -{ - return *( currentPixel + imageWidth ); -} - -/** -- FUNCIÓ: ASSIGN_LABEL -- FUNCIONALITAT: Assigns label value to label image -- PARÀMETRES: - - -- RESULTAT: - - -- RESTRICCIONS: - - -- AUTOR: rborras -- DATA DE CREACIÓ: 2008/04/29 -- MODIFICACIÓ: Data. Autor. Descripció. -*/ -inline void ASSIGN_LABEL( CvPoint p, t_labelType *labels, int imageWidth, int newLabel ) -{ - *(labels + p.y * imageWidth + p.x) = newLabel; -} - - -inline void ASSIGN_VISITED( CvPoint p, bool *visitedPoints, int imageWidth ) -{ - *(visitedPoints + p.y * imageWidth + p.x) = true; -} - -/** -- FUNCIÓ: ComponentLabeling -- FUNCIONALITAT: Calcula els components binaris (blobs) d'una imatge amb connectivitat a 8 -- PARÀMETRES: - - inputImage: image to segment (pixel values different than blobColor are treated as background) - - maskImage: if not NULL, all the pixels equal to 0 in mask are skipped in input image - - backgroundColor: color of background (ignored pixels) - - blobs: blob vector destination -- RESULTAT: - - -- RESTRICCIONS: - - -- AUTOR: rborras -- DATA DE CREACIÓ: 2008/04/21 -- MODIFICACIÓ: Data. Autor. Descripció. -- NOTA: Algorithm based on "A linear-time component labeling algorithm using contour tracing technique", - F.Chang et al -*/ -bool ComponentLabeling( IplImage* inputImage, - IplImage* maskImage, - unsigned char backgroundColor, - Blob_vector &blobs ) -{ - // row major vector with visited points - bool internalContour, externalContour; - int imageWidth, imageHeight, currentLabel, contourLabel; - //! current blob pointer - CBlob *currentBlob; - CvSize imageSizes; - CvPoint currentPoint; - - // verify input image - if( !CV_IS_IMAGE( inputImage ) ) - return false; - - // verify that input image and mask image has same size - if( maskImage ) - { - if( !CV_IS_IMAGE(maskImage) || - maskImage->width != inputImage->width || - maskImage->height != inputImage->height ) - return false; - } - - imageSizes = cvSize(inputImage->width,inputImage->height); - - imageWidth = inputImage->width; - imageHeight = inputImage->height; - - // create auxiliary buffers that are initialized to 0 - t_labelType *labelledImage = (t_labelType*)calloc(inputImage->width * inputImage->height, sizeof(t_labelType)); - bool *visitedPoints = (bool*)calloc(inputImage->width * inputImage->height, sizeof(bool)); - - // Execute the POI detection parallel. - // This basically just filters out the background (which is the majority of points). - // The result will be an ordered list of non-background points for the blob-detector to work on. - std::vector foregroundPoints; - - const int totalRegionsX = 4; - const int totalRegionsY = 4; - const int totalRegions = totalRegionsX * totalRegionsY; - const int regionWidth = imageWidth / totalRegionsX; - const int regionHeight = imageHeight / totalRegionsY; - - // get the pixel data from an image at a certain position - auto getImageData = [](const IplImage * const & image, const int &row, const int &column) - { - return (unsigned char*)image->imageData + row * image->widthStep + column; - }; - - // to allow each thread to acces the main list directly (saves us some merging later) - std::mutex foregroundPointAccessMutex; - - auto workOnRegion = [&](int x, int y) { - const int startingX = x * regionWidth; - const int startingY = y * regionHeight; - - for (int j = 0; j < regionHeight; ++j) - for (int i = 0; i < regionWidth; ++i) - { - const int pointX = startingX + i; - const int pointY = startingY + j; - // ignore background pixels or 0 pixels in mask - const unsigned char * pInputImage = getImageData(inputImage, pointY, pointX); - if ((*pInputImage == backgroundColor) || (maskImage && *getImageData(maskImage, pointY, pointX) == 0)) - { - continue; - } - else // remember all non-background pixels - { - std::lock_guard lock(foregroundPointAccessMutex); - foregroundPoints.emplace_back(pointX, pointY); - } - } - }; - - // start one parallel thread for each region - std::vector> merger; - merger.reserve(totalRegions); - - for (int y = 0; y < totalRegionsY; ++y) - { - for (int x = 0; x < totalRegionsX; ++x) - { - merger.push_back(std::async([&, x, y] { workOnRegion(x, y); })); - } - } - - // and wait until all have completed; the results are alrady in the main list - for (const auto & asyncResult : merger) - { - asyncResult.wait(); - } - - // need to sort for coordinate as the loop below is written in a way that depends on the order - std::sort(foregroundPoints.begin(), foregroundPoints.end(), - [](const cv::Point2d & a, const cv::Point2d & b) -> bool - { - return (a.y < b.y) || (a.y == b.y && a.x < b.x); - } - ); - - // initialize pointers and label counter - currentLabel = 1; - - auto getImageDataVisited = [&](const int &row, const int &column) - { - return visitedPoints + row * inputImage->widthStep + column; - }; - - auto getImageDataLabelled = [&](const int &row, const int &column) - { - return labelledImage + row * inputImage->widthStep + column; - }; - - for (const cv::Point2d & point : foregroundPoints) - { - const int i = point.x; - const int j = point.y; - - t_labelType * pLabels = getImageDataLabelled(j, i); - bool * pVisitedPoints = getImageDataVisited(j, i); - - // new external contour: current label == 0 and above pixel is background - if( j > 0 ) - { - const unsigned char * pAboveInputImage = getImageData(inputImage, j - 1, i); - - externalContour = ((*pAboveInputImage == backgroundColor) || - (maskImage && *getImageData(maskImage, j - 1, i) == 0)) && - (*pLabels == 0); - } - else - externalContour = (*pLabels == 0); - - // new internal contour: below pixel is background and not visited - if( !externalContour && j < imageHeight - 1 ) - { - const unsigned char * pBelowInputImage = getImageData(inputImage, j + 1, i); - internalContour = *pBelowInputImage == backgroundColor && - !GET_BELOW_VISITEDPIXEL( pVisitedPoints, imageWidth); - } - else - { - internalContour = false; - } - - - if( externalContour ) - { - currentPoint = cvPoint(i,j); - // assign label to labelled image - *pLabels = currentLabel; - - // create new blob - currentBlob = new CBlob(currentLabel, currentPoint, imageSizes ); - - // contour tracing with currentLabel - contourTracing( inputImage, maskImage, currentPoint, - labelledImage, visitedPoints, - currentLabel, false, backgroundColor, currentBlob->GetExternalContour() ); - - // add new created blob - blobs.push_back(currentBlob); - - currentLabel++; - } - else - { - if( internalContour ) - { - currentPoint = cvPoint(i,j); - - if( *pLabels == 0 ) - { - // take left neightbour value as current - if( i > 0 ) - contourLabel = *(pLabels - 1); - } - else - { - contourLabel = *pLabels; - } - - if(contourLabel>0) - { - currentBlob = blobs[contourLabel-1]; - CBlobContour newContour(currentPoint, currentBlob->GetStorage()); - - - // contour tracing with contourLabel - contourTracing( inputImage, maskImage, currentPoint, labelledImage, visitedPoints, - contourLabel, true, backgroundColor, &newContour ); - - currentBlob->AddInternalContour( newContour ); - } - } - // neither internal nor external contour - else - { - // take left neightbour value as current if it is not labelled - if( i > 0 && *pLabels == 0 ) - *pLabels = *(pLabels - 1); - } - - } - } - - - // free auxiliary buffers - free( labelledImage ); - free( visitedPoints ); - - return true; -} - -/* Original code */ -/* -bool ComponentLabeling(IplImage* inputImage, - IplImage* maskImage, - unsigned char backgroundColor, - Blob_vector &blobs) -{ - int i, j; - // row major vector with visited points - bool *visitedPoints, *pVisitedPoints, internalContour, externalContour; - unsigned char *pInputImage, *pMask, *pAboveInputImage, *pBelowInputImage, - *pAboveMask, *pBelowMask; - int imageWidth, imageHeight, currentLabel, contourLabel; - // row major vector with labelled image - t_labelType *labelledImage, *pLabels; - //! current blob pointer - CBlob *currentBlob; - CvSize imageSizes; - CvPoint currentPoint; - - // verify input image - if (!CV_IS_IMAGE(inputImage)) - return false; - - // verify that input image and mask image has same size - if (maskImage) - { - if (!CV_IS_IMAGE(maskImage) || - maskImage->width != inputImage->width || - maskImage->height != inputImage->height) - return false; - } - else - { - pMask = NULL; - pAboveMask = NULL; - pBelowMask = NULL; - } - - imageSizes = cvSize(inputImage->width, inputImage->height); - - imageWidth = inputImage->width; - imageHeight = inputImage->height; - - // create auxiliary buffers - labelledImage = (t_labelType*)malloc(inputImage->width * inputImage->height * sizeof(t_labelType)); - visitedPoints = (bool*)malloc(inputImage->width * inputImage->height * sizeof(bool)); - - // initialize it to 0 - memset(labelledImage, 0, inputImage->width * inputImage->height * sizeof(t_labelType)); - memset(visitedPoints, false, inputImage->width * inputImage->height * sizeof(bool)); - - // initialize pointers and label counter - pLabels = labelledImage; - pVisitedPoints = visitedPoints; - currentLabel = 1; - - for (j = 0; j < imageHeight; j++) - { - // don't verify if we area on first or last row, it will verified on pointer access - pAboveInputImage = (unsigned char*)inputImage->imageData + (j - 1) * inputImage->widthStep; - pBelowInputImage = (unsigned char*)inputImage->imageData + (j + 1) * inputImage->widthStep; - - pInputImage = (unsigned char*)inputImage->imageData + j * inputImage->widthStep; - - if (maskImage) - { - pMask = (unsigned char*)maskImage->imageData + j * maskImage->widthStep; - // don't verify if we area on first or last row, it will verified on pointer access - pAboveMask = (unsigned char*)maskImage->imageData + (j - 1) * maskImage->widthStep; - pBelowMask = (unsigned char*)maskImage->imageData + (j + 1) * maskImage->widthStep; - - } - - for (i = 0; i < imageWidth; i++, pInputImage++, pMask++, pAboveInputImage++, pBelowInputImage++, - pAboveMask++, pBelowMask++) - { - // ignore background pixels or 0 pixels in mask - if ((*pInputImage == backgroundColor) || (maskImage && *pMask == 0)) - { - pLabels++; - pVisitedPoints++; - continue; - } - - // new external contour: current label == 0 and above pixel is background - if (j > 0) - { - externalContour = ((*pAboveInputImage == backgroundColor) || - (maskImage && *pAboveMask == 0)) && - (*pLabels == 0); - } - else - externalContour = (*pLabels == 0); - - // new internal contour: below pixel is background and not visited - if (!externalContour && j < imageHeight - 1) - { - internalContour = *pBelowInputImage == backgroundColor && - !GET_BELOW_VISITEDPIXEL(pVisitedPoints, imageWidth); - } - else - { - internalContour = false; - } - - - if (externalContour) - { - currentPoint = cvPoint(i, j); - // assign label to labelled image - *pLabels = currentLabel; - - // create new blob - currentBlob = new CBlob(currentLabel, currentPoint, imageSizes); - - // contour tracing with currentLabel - contourTracing(inputImage, maskImage, currentPoint, - labelledImage, visitedPoints, - currentLabel, false, backgroundColor, currentBlob->GetExternalContour()); - - // add new created blob - blobs.push_back(currentBlob); - - currentLabel++; - } - else - { - if (internalContour) - { - currentPoint = cvPoint(i, j); - - if (*pLabels == 0) - { - // take left neightbour value as current - if (i > 0) - contourLabel = *(pLabels - 1); - } - else - { - contourLabel = *pLabels; - } - - if (contourLabel>0) - { - currentBlob = blobs[contourLabel - 1]; - CBlobContour newContour(currentPoint, currentBlob->GetStorage()); - - - // contour tracing with contourLabel - contourTracing(inputImage, maskImage, currentPoint, labelledImage, visitedPoints, - contourLabel, true, backgroundColor, &newContour); - - currentBlob->AddInternalContour(newContour); - } - } - // neither internal nor external contour - else - { - // take left neightbour value as current if it is not labelled - if (i > 0 && *pLabels == 0) - *pLabels = *(pLabels - 1); - } - - } - - pLabels++; - pVisitedPoints++; - - } - } - - - // free auxiliary buffers - free(labelledImage); - free(visitedPoints); - - return true; -} -*/ - -/** -- FUNCIÓ: -- FUNCIONALITAT: -- PARÀMETRES: - - -- RESULTAT: - - -- RESTRICCIONS: - - -- AUTOR: rborras -- DATA DE CREACIÓ: 2008/04/29 -- MODIFICACIÓ: Data. Autor. Descripció. -*/ -void contourTracing( IplImage *image, - IplImage *maskImage, - CvPoint contourStart, t_labelType *labels, bool *visitedPoints, t_labelType label, - bool internalContour, unsigned char backgroundColor, CBlobContour *currentBlobcontour ) -{ - CvPoint t, tnext, tsecond; - short initialMovement, movement; - - if( internalContour ) - { - initialMovement = 7;//3; - } - else - { - initialMovement = 3;//7; - } - - tsecond = tracer( image, maskImage, contourStart, visitedPoints, initialMovement, - backgroundColor, movement ); - - // assign current label to tnext - ASSIGN_LABEL( contourStart, labels, image->width, label ); - - - // contour corresponds to isolated pixel? - if( tsecond.x == contourStart.x && tsecond.y == contourStart.y ) - { - // we are finished with the contour - return; - } - - // add chain code to current contour - currentBlobcontour->AddChainCode(movement); - - // assign label to next point - ASSIGN_LABEL( tsecond, labels, image->width, label ); - - tnext.x = tsecond.x; - tnext.y = tsecond.y; - t.x = tnext.x; - t.y = tnext.y; - - // while T is different than contourStart and Tnext is different than T - // follow contour until start point is reached again - while (!(t.x == contourStart.x && t.y == contourStart.y) - || !(tsecond.x == tnext.x && tsecond.y == tnext.y)) - { - - t.x = tnext.x; - t.y = tnext.y; - initialMovement = (movement + 5) % 8; - - // search for next contour point - tnext = tracer( image, maskImage, t, visitedPoints, initialMovement, - backgroundColor, movement ); - - // assign label to contour point - ASSIGN_LABEL( tnext, labels, image->width, label ); - - // add chain code to current contour - currentBlobcontour->AddChainCode(movement); - } - -} - -/** -- FUNCIÓ: tracer -- FUNCIONALITAT: Searches for next point of a contour -- PARÀMETRES: - - -- RESULTAT: - - -- RESTRICCIONS: - - -- AUTOR: rborras -- DATA DE CREACIÓ: 2008/04/30 -- MODIFICACIÓ: Data. Autor. Descripció. -*/ -CvPoint tracer( IplImage *image, IplImage *maskImage, CvPoint P, bool *visitedPoints, - short initialMovement, - unsigned char backgroundColor, short &movement ) -{ - int d; - CvPoint pNext; - - for (d = 0; d <= 7; d++ ) - { - movement = (initialMovement + d) % 8; - - pNext.x = P.x + freemanCodeIncrement[movement].x; - pNext.y = P.y + freemanCodeIncrement[movement].y; - - // the point is inside image ? - if( pNext.x < 0 || pNext.x >= image->width || - pNext.y < 0 || pNext.y >= image->height ) - { - // try other movement - continue; - } - - // image has blobColor value in the new point? - if( (GET_IMAGE_PIXEL( image, pNext ) != backgroundColor ) && GET_IMAGEMASK_PIXEL(maskImage, pNext ) ) - { - return pNext; - } - else - { - // mark point as visited - ASSIGN_VISITED( pNext, visitedPoints, image->width ); - } - } - - // no possible movement was found - movement = -1; - pNext.x = P.x; - pNext.y = P.y; - - return pNext; -} - - diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/ComponentLabeling.h b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/ComponentLabeling.h deleted file mode 100644 index d6e714e6..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/ComponentLabeling.h +++ /dev/null @@ -1,30 +0,0 @@ -#if !defined(_COMPONENT_LABELING_H_INCLUDED) -#define _CLASSE_BLOBRESULT_INCLUDED - -#include "vector" -#include "BlobContour.h" -#include "blob.h" - - -//! definició de que es un vector de blobs -typedef std::vector Blob_vector; - - - -bool ComponentLabeling( IplImage* inputImage, - IplImage* maskImage, - unsigned char backgroundColor, - Blob_vector &blobs ); - - -void contourTracing( IplImage *image, IplImage *mask, CvPoint contourStart, t_labelType *labels, - bool *visitedPoints, t_labelType label, - bool internalContour, unsigned char backgroundColor, - CBlobContour *currentBlobContour ); - -CvPoint tracer( IplImage *image, IplImage *mask, CvPoint P, bool *visitedPoints, - short initialMovement, - unsigned char backgroundColor, short &movement ); - - -#endif //!_CLASSE_BLOBRESULT_INCLUDED diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/blob.cpp b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/blob.cpp deleted file mode 100644 index 596c9138..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/blob.cpp +++ /dev/null @@ -1,707 +0,0 @@ -/************************************************************************ - Blob.cpp - -- FUNCIONALITAT: Implementaci� de la classe CBlob -- AUTOR: Inspecta S.L. -MODIFICACIONS (Modificaci�, Autor, Data): - - -FUNCTIONALITY: Implementation of the CBlob class and some helper classes to perform - some calculations on it -AUTHOR: Inspecta S.L. -MODIFICATIONS (Modification, Author, Date): - -**************************************************************************/ - - -#include "blob.h" -#include - - -CBlob::CBlob() -{ - m_area = m_perimeter = -1; - m_externPerimeter = m_meanGray = m_stdDevGray = -1; - m_boundingBox.width = -1; - m_ellipse.size.width = -1; - m_storage = NULL; - m_id = -1; -} -CBlob::CBlob( t_labelType id, CvPoint startPoint, CvSize originalImageSize ) -{ - m_id = id; - m_area = m_perimeter = -1; - m_externPerimeter = m_meanGray = m_stdDevGray = -1; - m_boundingBox.width = -1; - m_ellipse.size.width = -1; - m_storage = cvCreateMemStorage(); - m_externalContour = CBlobContour(startPoint, m_storage); - m_originalImageSize = originalImageSize; -} -//! Copy constructor -CBlob::CBlob( const CBlob &src ) -{ - m_storage = NULL; - *this = src; -} - -CBlob::CBlob( const CBlob *src ) -{ - if (src != NULL ) - { - m_storage = NULL; - *this = *src; - } -} - -CBlob& CBlob::operator=(const CBlob &src ) -{ - if( this != &src ) - { - m_id = src.m_id; - m_area = src.m_area; - m_perimeter = src.m_perimeter; - m_externPerimeter = src.m_externPerimeter; - m_meanGray = src.m_meanGray; - m_stdDevGray = src.m_stdDevGray; - m_boundingBox = src.m_boundingBox; - m_ellipse = src.m_ellipse; - m_originalImageSize = src.m_originalImageSize; - - // clear all current blob contours - ClearContours(); - - if( m_storage ) - cvReleaseMemStorage( &m_storage ); - - m_storage = cvCreateMemStorage(); - - m_externalContour = CBlobContour(src.m_externalContour.GetStartPoint(), m_storage ); - if( src.m_externalContour.m_contour ) - m_externalContour.m_contour = cvCloneSeq( src.m_externalContour.m_contour, m_storage); - m_internalContours.clear(); - - // copy all internal contours - if( src.m_internalContours.size() ) - { - m_internalContours = t_contourList( src.m_internalContours.size() ); - t_contourList::const_iterator itSrc; - t_contourList::iterator it; - - itSrc = src.m_internalContours.begin(); - it = m_internalContours.begin(); - - while (itSrc != src.m_internalContours.end()) - { - *it = CBlobContour((*itSrc).GetStartPoint(), m_storage); - if( (*itSrc).m_contour ) - (*it).m_contour = cvCloneSeq( (*itSrc).m_contour, m_storage); - - it++; - itSrc++; - } - } - } - - return *this; -} - -CBlob::~CBlob() -{ - ClearContours(); - - if( m_storage ) - cvReleaseMemStorage( &m_storage ); -} - -void CBlob::ClearContours() -{ - t_contourList::iterator it; - - it = m_internalContours.begin(); - - while (it != m_internalContours.end()) - { - (*it).ResetChainCode(); - it++; - } - m_internalContours.clear(); - - m_externalContour.ResetChainCode(); - -} -void CBlob::AddInternalContour( const CBlobContour &newContour ) -{ - m_internalContours.push_back(newContour); -} - -//! Indica si el blob est� buit ( no t� cap info associada ) -//! Shows if the blob has associated information -bool CBlob::IsEmpty() -{ - return GetExternalContour()->m_contour == NULL; -} - -/** -- FUNCI�: Area -- FUNCIONALITAT: Get blob area, ie. external contour area minus internal contours area -- PAR�METRES: - - -- RESULTAT: - - -- RESTRICCIONS: - - -- AUTOR: rborras -- DATA DE CREACI�: 2008/04/30 -- MODIFICACI�: Data. Autor. Descripci�. -*/ -double CBlob::Area() -{ - double area; - t_contourList::iterator itContour; - - area = m_externalContour.GetArea(); - - itContour = m_internalContours.begin(); - - while (itContour != m_internalContours.end() ) - { - area -= (*itContour).GetArea(); - itContour++; - } - return area; -} - -/** -- FUNCI�: Perimeter -- FUNCIONALITAT: Get blob perimeter, ie. sum of the lenght of all the contours -- PAR�METRES: - - -- RESULTAT: - - -- RESTRICCIONS: - - -- AUTOR: rborras -- DATA DE CREACI�: 2008/04/30 -- MODIFICACI�: Data. Autor. Descripci�. -*/ -double CBlob::Perimeter() -{ - double perimeter; - t_contourList::iterator itContour; - - perimeter = m_externalContour.GetPerimeter(); - - itContour = m_internalContours.begin(); - - while (itContour != m_internalContours.end() ) - { - perimeter += (*itContour).GetPerimeter(); - itContour++; - } - return perimeter; - -} - -/** -- FUNCI�: Exterior -- FUNCIONALITAT: Return true for extern blobs -- PAR�METRES: - - xBorder: true to consider blobs touching horizontal borders as extern - - yBorder: true to consider blobs touching vertical borders as extern -- RESULTAT: - - -- RESTRICCIONS: - - -- AUTOR: rborras -- DATA DE CREACI�: 2008/05/06 -- MODIFICACI�: Data. Autor. Descripci�. -*/ -int CBlob::Exterior(IplImage *mask, bool xBorder /* = true */, bool yBorder /* = true */) -{ - if (ExternPerimeter(mask, xBorder, yBorder ) > 0 ) - { - return 1; - } - - return 0; -} -/** -- FUNCI�: ExternPerimeter -- FUNCIONALITAT: Get extern perimeter (perimeter touching image borders) -- PAR�METRES: - - maskImage: if != NULL, counts maskImage black pixels as external pixels and contour points touching - them are counted as external contour points. - - xBorder: true to consider blobs touching horizontal borders as extern - - yBorder: true to consider blobs touching vertical borders as extern -- RESULTAT: - - -- RESTRICCIONS: - - -- AUTOR: rborras -- DATA DE CREACI�: 2008/05/05 -- MODIFICACI�: Data. Autor. Descripci�. -- NOTA: If CBlobContour::GetContourPoints aproximates contours with a method different that NONE, - this function will not give correct results -*/ -double CBlob::ExternPerimeter( IplImage *maskImage, bool xBorder /* = true */, bool yBorder /* = true */) -{ - t_PointList externContour, externalPoints; - CvSeqReader reader; - CvSeqWriter writer; - CvPoint actualPoint, previousPoint; - bool find = false; - int i,j; - int delta = 0; - - // it is calculated? - if( m_externPerimeter != -1 ) - { - return m_externPerimeter; - } - - // get contour pixels - externContour = m_externalContour.GetContourPoints(); - - m_externPerimeter = 0; - - // there are contour pixels? - if( externContour == NULL ) - { - return m_externPerimeter; - } - - cvStartReadSeq( externContour, &reader); - - // create a sequence with the external points of the blob - externalPoints = cvCreateSeq( externContour->flags, externContour->header_size, externContour->elem_size, - m_storage ); - cvStartAppendToSeq( externalPoints, &writer ); - previousPoint.x = -1; - - // which contour pixels touch border? - for( j=0; j< externContour->total; j++) - { - CV_READ_SEQ_ELEM( actualPoint, reader); - - find = false; - - // pixel is touching border? - if ( xBorder & ((actualPoint.x == 0) || (actualPoint.x == m_originalImageSize.width - 1 )) || - yBorder & ((actualPoint.y == 0) || (actualPoint.y == m_originalImageSize.height - 1 ))) - { - find = true; - } - else - { - if( maskImage != NULL ) - { - // verify if some of 8-connected neighbours is black in mask - char *pMask; - - pMask = (maskImage->imageData + actualPoint.x - 1 + (actualPoint.y - 1) * maskImage->widthStep); - - for ( i = 0; i < 3; i++, pMask++ ) - { - if(*pMask == 0 && !find ) - { - find = true; - break; - } - } - - if(!find) - { - pMask = (maskImage->imageData + actualPoint.x - 1 + (actualPoint.y ) * maskImage->widthStep); - - for ( i = 0; i < 3; i++, pMask++ ) - { - if(*pMask == 0 && !find ) - { - find = true; - break; - } - } - } - - if(!find) - { - pMask = (maskImage->imageData + actualPoint.x - 1 + (actualPoint.y + 1) * maskImage->widthStep); - - for ( i = 0; i < 3; i++, pMask++ ) - { - if(*pMask == 0 && !find ) - { - find = true; - break; - } - } - } - } - } - - if( find ) - { - if( previousPoint.x > 0 ) - delta = abs(previousPoint.x - actualPoint.x) + abs(previousPoint.y - actualPoint.y); - - // calculate separately each external contour segment - if( delta > 2 ) - { - cvEndWriteSeq( &writer ); - m_externPerimeter += cvArcLength( externalPoints, CV_WHOLE_SEQ, 0 ); - - cvClearSeq( externalPoints ); - cvStartAppendToSeq( externalPoints, &writer ); - delta = 0; - previousPoint.x = -1; - } - - CV_WRITE_SEQ_ELEM( actualPoint, writer ); - previousPoint = actualPoint; - } - - } - - cvEndWriteSeq( &writer ); - - m_externPerimeter += cvArcLength( externalPoints, CV_WHOLE_SEQ, 0 ); - - cvClearSeq( externalPoints ); - - // divide by two because external points have one side inside the blob and the other outside - // Perimeter of external points counts both sides, so it must be divided - m_externPerimeter /= 2.0; - - return m_externPerimeter; -} - -//! Compute blob's moment (p,q up to MAX_CALCULATED_MOMENTS) -double CBlob::Moment(int p, int q) -{ - double moment; - t_contourList::iterator itContour; - - moment = m_externalContour.GetMoment(p,q); - - itContour = m_internalContours.begin(); - - while (itContour != m_internalContours.end() ) - { - moment -= (*itContour).GetMoment(p,q); - itContour++; - } - return moment; -} - -/** -- FUNCI�: Mean -- FUNCIONALITAT: Get blob mean color in input image -- PAR�METRES: - - image: image from gray color are extracted -- RESULTAT: - - -- RESTRICCIONS: - - -- AUTOR: rborras -- DATA DE CREACI�: 2008/05/06 -- MODIFICACI�: Data. Autor. Descripci�. -*/ -double CBlob::Mean( IplImage *image ) -{ - // it is calculated? -/* if( m_meanGray != -1 ) - { - return m_meanGray; - } -*/ - // Create a mask with same size as blob bounding box - IplImage *mask; - CvScalar mean, std; - CvPoint offset; - - GetBoundingBox(); - - if (m_boundingBox.height == 0 ||m_boundingBox.width == 0 || !CV_IS_IMAGE( image )) - { - m_meanGray = 0; - return m_meanGray; - } - - // apply ROI and mask to input image to compute mean gray and standard deviation - mask = cvCreateImage( cvSize(m_boundingBox.width, m_boundingBox.height), IPL_DEPTH_8U, 1); - cvSetZero(mask); - - offset.x = -m_boundingBox.x; - offset.y = -m_boundingBox.y; - - // draw contours on mask - cvDrawContours( mask, m_externalContour.GetContourPoints(), CV_RGB(255,255,255), CV_RGB(255,255,255),0, CV_FILLED, 8, - offset ); - - // draw internal contours - t_contourList::iterator it = m_internalContours.begin(); - while(it != m_internalContours.end() ) - { - cvDrawContours( mask, (*it).GetContourPoints(), CV_RGB(0,0,0), CV_RGB(0,0,0),0, CV_FILLED, 8, - offset ); - it++; - } - - cvSetImageROI( image, m_boundingBox ); - cvAvgSdv( image, &mean, &std, mask ); - - m_meanGray = mean.val[0]; - m_stdDevGray = std.val[0]; - - cvReleaseImage( &mask ); - cvResetImageROI( image ); - - return m_meanGray; -} - -double CBlob::StdDev( IplImage *image ) -{ - // it is calculated? -/* if( m_stdDevGray != -1 ) - { - return m_stdDevGray; - } -*/ - // call mean calculation (where also standard deviation is calculated) - Mean( image ); - - return m_stdDevGray; -} -/** -- FUNCI�: GetBoundingBox -- FUNCIONALITAT: Get bounding box (without rotation) of a blob -- PAR�METRES: - - -- RESULTAT: - - -- RESTRICCIONS: - - -- AUTOR: rborras -- DATA DE CREACI�: 2008/05/06 -- MODIFICACI�: Data. Autor. Descripci�. -*/ -CvRect CBlob::GetBoundingBox() -{ - // it is calculated? - if( m_boundingBox.width != -1 ) - { - return m_boundingBox; - } - - t_PointList externContour; - CvSeqReader reader; - CvPoint actualPoint; - - // get contour pixels - externContour = m_externalContour.GetContourPoints(); - - // it is an empty blob? - if( !externContour ) - { - m_boundingBox.x = 0; - m_boundingBox.y = 0; - m_boundingBox.width = 0; - m_boundingBox.height = 0; - - return m_boundingBox; - } - - cvStartReadSeq( externContour, &reader); - - m_boundingBox.x = m_originalImageSize.width; - m_boundingBox.y = m_originalImageSize.height; - m_boundingBox.width = 0; - m_boundingBox.height = 0; - - for( int i=0; i< externContour->total; i++) - { - CV_READ_SEQ_ELEM( actualPoint, reader); - - m_boundingBox.x = MIN( actualPoint.x, m_boundingBox.x ); - m_boundingBox.y = MIN( actualPoint.y, m_boundingBox.y ); - - m_boundingBox.width = MAX( actualPoint.x, m_boundingBox.width ); - m_boundingBox.height = MAX( actualPoint.y, m_boundingBox.height ); - } - - //m_boundingBox.x = max( m_boundingBox.x , 0 ); - //m_boundingBox.y = max( m_boundingBox.y , 0 ); - - m_boundingBox.width -= m_boundingBox.x; - m_boundingBox.height -= m_boundingBox.y; - - return m_boundingBox; -} - -/** -- FUNCI�: GetEllipse -- FUNCIONALITAT: Calculates bounding ellipse of external contour points -- PAR�METRES: - - -- RESULTAT: - - -- RESTRICCIONS: - - -- AUTOR: rborras -- DATA DE CREACI�: 2008/05/06 -- MODIFICACI�: Data. Autor. Descripci�. -- NOTA: Calculation is made using second order moment aproximation -*/ -CvBox2D CBlob::GetEllipse() -{ - // it is calculated? - if( m_ellipse.size.width != -1 ) - return m_ellipse; - - double u00,u11,u01,u10,u20,u02, delta, num, den, temp; - - // central moments calculation - u00 = Moment(0,0); - - // empty blob? - if ( u00 <= 0 ) - { - m_ellipse.size.width = 0; - m_ellipse.size.height = 0; - m_ellipse.center.x = 0; - m_ellipse.center.y = 0; - m_ellipse.angle = 0; - return m_ellipse; - } - u10 = Moment(1,0) / u00; - u01 = Moment(0,1) / u00; - - u11 = -(Moment(1,1) - Moment(1,0) * Moment(0,1) / u00 ) / u00; - u20 = (Moment(2,0) - Moment(1,0) * Moment(1,0) / u00 ) / u00; - u02 = (Moment(0,2) - Moment(0,1) * Moment(0,1) / u00 ) / u00; - - - // elipse calculation - delta = sqrt( 4*u11*u11 + (u20-u02)*(u20-u02) ); - m_ellipse.center.x = float(u10); - m_ellipse.center.y = float(u01); - - temp = u20 + u02 + delta; - if( temp > 0 ) - { - m_ellipse.size.width = sqrt(float( 2*(u20 + u02 + delta ))); - } - else - { - m_ellipse.size.width = 0; - return m_ellipse; - } - - temp = u20 + u02 - delta; - if( temp > 0 ) - { - m_ellipse.size.height = sqrt(float( 2*(u20 + u02 - delta ) )); - } - else - { - m_ellipse.size.height = 0; - return m_ellipse; - } - - // elipse orientation - if (u20 > u02) - { - num = u02 - u20 + sqrt((u02 - u20)*(u02 - u20) + 4*u11*u11); - den = 2*u11; - } - else - { - num = 2*u11; - den = u20 - u02 + sqrt((u20 - u02)*(u20 - u02) + 4*u11*u11); - } - if( num != 0 && den != 00 ) - { - m_ellipse.angle = float( 180.0 + (180.0 / CV_PI) * atan( num / den ) ); - } - else - { - m_ellipse.angle = 0; - } - - return m_ellipse; - -} - -/** -- FUNCTION: FillBlob -- FUNCTIONALITY: - - Fills the blob with a specified colour -- PARAMETERS: - - imatge: where to paint - - color: colour to paint the blob -- RESULT: - - modifies input image and returns the seed point used to fill the blob -- RESTRICTIONS: -- AUTHOR: Ricard Borr�s -- CREATION DATE: 25-05-2005. -- MODIFICATION: Date. Author. Description. -*/ -void CBlob::FillBlob( IplImage *imatge, CvScalar color, int offsetX /*=0*/, int offsetY /*=0*/) -{ - cvDrawContours( imatge, m_externalContour.GetContourPoints(), color, color,0, CV_FILLED, 8 ); -} - - -/** -- FUNCTION: GetConvexHull -- FUNCTIONALITY: Calculates the convex hull polygon of the blob -- PARAMETERS: - - dst: where to store the result -- RESULT: - - true if no error ocurred -- RESTRICTIONS: -- AUTHOR: Ricard Borr�s -- CREATION DATE: 25-05-2005. -- MODIFICATION: Date. Author. Description. -*/ -t_PointList CBlob::GetConvexHull() -{ - CvSeq *convexHull = NULL; - - if( m_externalContour.GetContourPoints() ) - convexHull = cvConvexHull2( m_externalContour.GetContourPoints(), m_storage, - CV_COUNTER_CLOCKWISE, 1 ); - - return convexHull; -} - -/** -- FUNCTION: JoinBlob -- FUNCTIONALITY: Add's external contour to current external contour -- PARAMETERS: - - blob: blob from which extract the added external contour -- RESULT: - - true if no error ocurred -- RESTRICTIONS: Only external contours are added -- AUTHOR: Ricard Borr�s -- CREATION DATE: 25-05-2005. -- MODIFICATION: Date. Author. Description. -*/ -void CBlob::JoinBlob( CBlob *blob ) -{ - CvSeqWriter writer; - CvSeqReader reader; - t_chainCode chainCode; - - cvStartAppendToSeq( m_externalContour.GetChainCode(), &writer ); - cvStartReadSeq( blob->GetExternalContour()->GetChainCode(), &reader ); - - for (int i = 0; i < blob->GetExternalContour()->GetChainCode()->total; i++ ) - { - CV_READ_SEQ_ELEM( chainCode, reader ); - CV_WRITE_SEQ_ELEM( chainCode, writer ); - } - cvEndWriteSeq( &writer ); - -} diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/blob.h b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/blob.h deleted file mode 100644 index e4c80f83..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/cvblobs/blob.h +++ /dev/null @@ -1,172 +0,0 @@ -/************************************************************************ - Blob.h - -FUNCIONALITAT: Definició de la classe CBlob -AUTOR: Inspecta S.L. -MODIFICACIONS (Modificació, Autor, Data): - -FUNCTIONALITY: Definition of the CBlob class and some helper classes to perform - some calculations on it -AUTHOR: Inspecta S.L. -MODIFICATIONS (Modification, Author, Date): - -**************************************************************************/ - -//! Disable warnings referred to 255 character truncation for the std:map -#pragma warning( disable : 4786 ) - -#ifndef CBLOB_INSPECTA_INCLUDED -#define CBLOB_INSPECTA_INCLUDED - -#include -#include "BlobLibraryConfiguration.h" -#include "BlobContour.h" - - -#ifdef BLOB_OBJECT_FACTORY - //! Object factory pattern implementation - #include "..\inspecta\DesignPatterns\ObjectFactory.h" -#endif - - -//! Type of labelled images -typedef unsigned int t_labelType; - - -//! Blob class -class CBlob -{ - typedef std::list t_contourList; - -public: - CBlob(); - CBlob( t_labelType id, CvPoint startPoint, CvSize originalImageSize ); - ~CBlob(); - - //! Copy constructor - CBlob( const CBlob &src ); - CBlob( const CBlob *src ); - - //! Operador d'assignació - //! Assigment operator - CBlob& operator=(const CBlob &src ); - - //! Adds a new internal contour to the blob - void AddInternalContour( const CBlobContour &newContour ); - - //! Retrieves contour in Freeman's chain code - CBlobContour *GetExternalContour() - { - return &m_externalContour; - } - - //! Retrieves blob storage - CvMemStorage *GetStorage() - { - return m_storage; - } - - //! Get label ID - t_labelType GetID() - { - return m_id; - } - //! > 0 for extern blobs, 0 if not - int Exterior( IplImage *mask, bool xBorder = true, bool yBorder = true ); - //! Compute blob's area - double Area(); - //! Compute blob's perimeter - double Perimeter(); - //! Compute blob's moment (p,q up to MAX_CALCULATED_MOMENTS) - double Moment(int p, int q); - - //! Compute extern perimeter - double ExternPerimeter( IplImage *mask, bool xBorder = true, bool yBorder = true ); - - //! Get mean grey color - double Mean( IplImage *image ); - - //! Get standard deviation grey color - double StdDev( IplImage *image ); - - //! Indica si el blob està buit ( no té cap info associada ) - //! Shows if the blob has associated information - bool IsEmpty(); - - //! Retorna el poligon convex del blob - //! Calculates the convex hull of the blob - t_PointList GetConvexHull(); - - //! Pinta l'interior d'un blob d'un color determinat - //! Paints the blob in an image - void FillBlob( IplImage *imatge, CvScalar color, int offsetX = 0, int offsetY = 0 ); - - //! Join a blob to current one (add's contour - void JoinBlob( CBlob *blob ); - - //! Get bounding box - CvRect GetBoundingBox(); - //! Get bounding ellipse - CvBox2D GetEllipse(); - - //! Minimun X - double MinX() - { - return GetBoundingBox().x; - } - //! Minimun Y - double MinY() - { - return GetBoundingBox().y; - } - //! Maximun X - double MaxX() - { - return GetBoundingBox().x + GetBoundingBox().width; - } - //! Maximun Y - double MaxY() - { - return GetBoundingBox().y + GetBoundingBox().height; - } -private: - - //! Deallocates all contours - void ClearContours(); - ////////////////////////////////////////////////////////////////////////// - // Blob contours - ////////////////////////////////////////////////////////////////////////// - - - //! Contour storage memory - CvMemStorage *m_storage; - //! External contour of the blob (crack codes) - CBlobContour m_externalContour; - //! Internal contours (crack codes) - t_contourList m_internalContours; - - ////////////////////////////////////////////////////////////////////////// - // Blob features - ////////////////////////////////////////////////////////////////////////// - - //! Label number - t_labelType m_id; - //! Area - double m_area; - //! Perimeter - double m_perimeter; - //! Extern perimeter from blob - double m_externPerimeter; - //! Mean gray color - double m_meanGray; - //! Standard deviation from gray color blob distribution - double m_stdDevGray; - //! Bounding box - CvRect m_boundingBox; - //! Bounding ellipse - CvBox2D m_ellipse; - //! Sizes from image where blob is extracted - CvSize m_originalImageSize; -}; - -#endif //CBLOB_INSPECTA_INCLUDED diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/IDetector.cpp b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/IDetector.cpp deleted file mode 100644 index 01df0085..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/IDetector.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include "IDetector.h" - -#include "helper/CvHelper.h" -template - -std::vector IDetector::convertBlobPosesToFishPoses(std::vector blobPoses) -{ - std::vector fishPoses; - fishPoses.reserve(blobPoses.size()); - - for (BlobPose & blobPose : blobPoses) - { - fishPoses.push_back( - FishPose( - blobPose.posCm(), - blobPose.posPx(), - CvHelper::degToRad(blobPose.angleDegree()), - blobPose.angleDegree(), - blobPose.width(), - blobPose.height() - ) - ); - } - - return fishPoses; -} diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/IDetector.h b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/IDetector.h deleted file mode 100644 index 722b937e..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/IDetector.h +++ /dev/null @@ -1,66 +0,0 @@ -#pragma once - -#include "Model/TrackedComponents/pose/FishPose.h" -#include "Interfaces/IModel/IModelAreaDescriptor.h" -#include "Model/TrackingAlgorithm/imageProcessor/detector/blob/BlobPose.h" - -template -class IDetector -{ -public: - - /** - * The contructor with parameters. - * @param: rectification, the rectification object for calculation the real world coordinate. - * @param: systemProperty, the set of parameters for tracking property. - */ - IDetector(void) {} - - /** - * The standard abtract destructor. - */ - ~IDetector(void) {} - - /** - * Interface function to get the fish poses from a binarzied image. - * @param: binarized_image_mat, binarized image. - * @return: a list of fish poses. - */ - virtual std::vector getPoses(cv::Mat& binImage, cv::Mat& oriImage) = 0; - - - /** - * Convert vector of blob poses to fishes poses. - * @param: blobPoses, vector of blob poses, - * @return: vector of fish poses. - */ - static std::vector convertBlobPosesToFishPoses(std::vector blobPoses); - - /** - * Sets specified parameter with a double value. - * @param: spec_param, the specified parameter to set, - * @param: value, the value double to set, - * @return: void. - */ - virtual void setDouble(std::string spec_param, double value) = 0; - - /** - * Gets the specified parameter. - * @param: spec_param, the specified parameter to set, - * @return: the double value of the specifed paramter. - */ - //virtual void getDouble(std::string spec_param) = 0; - - /** - * - */ - void setAreaInfo(IModelAreaDescriptor* ai) { - _areaInfo = ai; - } - -private: - virtual std::vector findBlobs(const cv::Mat& binImage, const cv::Mat& oriImage) = 0; - -protected: - IModelAreaDescriptor* _areaInfo; -}; diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/blob/BlobPose.cpp b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/blob/BlobPose.cpp deleted file mode 100644 index aa7d449b..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/blob/BlobPose.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include "BlobPose.h" - -BlobPose::BlobPose(void) -{ -} - -BlobPose::BlobPose(cv::Point2f center_cm, cv::Point center_px, float angle_degree, float width, float height, bool use) : - _center_cm(center_cm), - _center_px(center_px), - _angle_degree(angle_degree), - _width(width), - _height(height), - _used(use) -{} - -BlobPose::~BlobPose(void) -{ -} diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/blob/BlobPose.h b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/blob/BlobPose.h deleted file mode 100644 index 4ebaf7b5..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/blob/BlobPose.h +++ /dev/null @@ -1,86 +0,0 @@ -#pragma once - -#include - -class BlobPose -{ -public: - /** - * The standard contructor. - */ - BlobPose(void); - - /** - * The contructor with parameters. - * @param: pos_cm, position in real world coordinate. - * @param: pos_px, position in pixel coordinate. - * @param: angle_degree, orientation angle in degree. - * @param: width, width in px. - * @param: height, height in px. - * @param: used, check if this blob pose is currently in use. - */ - BlobPose(cv::Point2f pos_cm, cv::Point pos_px, float angle_degree, float width, float height, bool use = false); - - /** - * The standard destructor. - */ - ~BlobPose(void); - - /** - * Gets the pixel position of the pose. - * @return pixel position. - */ - cv::Point posPx() { return _center_px; } - - /** - * Gets the real world position of the pose. - * @return real world position. - */ - cv::Point2f posCm() { return _center_cm; } - - /** - * Gets the orientation angle as degree of the pose. - * @return degree angle. - */ - float angleDegree() { return _angle_degree; } - - /** - * Gets the width of the blob pose. - * @return width in px. - */ - float width() { return _width; } - - /** - * Gets the height of the blob pose. - * @return height in px. - */ - float height() { return _height; } - - /** - * Gets the flag whether this pose blob is already in use. - * @return true if is used, false otherwise. - */ - bool isUsed() { return _used; } - - /** - * Sets the pixel position of the pose. - * @param int x, int y - * @return void. - */ - void setposPx(int x, int y) { cv::Point point(x,y); _center_px = point; } - - /** - * Sets the angle in degree. - * @param float angleDegree - * @return void. - */ - void setAngle(float angleDegree) { _angle_degree = angleDegree; } - -private: - bool _used; - cv::Point2f _center_cm; - cv::Point _center_px; - float _angle_degree; - float _width; - float _height; -}; diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/blob/cvBlob/BlobsDetector.cpp b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/blob/cvBlob/BlobsDetector.cpp deleted file mode 100644 index 731aaa2a..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/blob/cvBlob/BlobsDetector.cpp +++ /dev/null @@ -1,106 +0,0 @@ -#include "BlobsDetector.h" -#include "helper/CvHelper.h" - -#include -BlobsDetector::BlobsDetector(void) : - _mask(nullptr), - _minBlobSize(1), //TODO Min blob size - _maxBlobSize(99999) //TODO Max blob size -{} - - -void BlobsDetector::filterBlobsBySize(CBlobResult& blobs) -{ - //std::cout << "start blobs: " << blobs.GetNumBlobs() << std::endl; - // blobs smaller than the provided blob size - blobs.Filter( blobs, B_INCLUDE, CBlobGetArea(), B_GREATER_OR_EQUAL, minBlobSize()); - //std::cout << "min filtered blobs: " << blobs.GetNumBlobs() << " min: " << minBlobSize() << std::endl; - // blobs bigger than the provided blob size - blobs.Filter( blobs, B_INCLUDE, CBlobGetArea(), B_LESS_OR_EQUAL, maxBlobSize()); - //std::cout << "max filtered blobs: " << blobs.GetNumBlobs() << " max: " << maxBlobSize() << std::endl; -} - -bool isLeft(CvPoint a, CvPoint b, CvPoint c) { - return ((b.x - a.x)*(c.y - a.y) - (b.y - a.y)*(c.x - a.x)) > 0; -} - -std::vector BlobsDetector::findBlobs(const cv::Mat& processedImage, const cv::Mat& oriImage) -{ - std::vector blobPoses; - - IplImage iplBinImage(processedImage); - IplImage *img = 0; - if (_mask) - img = new IplImage(*_mask); - - CBlob *currentBlob; - CBlobResult blobs(&iplBinImage, img, 0); - delete img; - - // filter the blobs by size criteria - filterBlobsBySize(blobs); - - for (int i = 0; i < blobs.GetNumBlobs(); i++) - { - currentBlob = blobs.GetBlob(i); - - // gets blob center - int x = currentBlob->GetEllipse().center.x; - int y = currentBlob->GetEllipse().center.y; - cv::Point blobPose_px = cv::Point(x, y); - - // apply homography - cv::Point2f blobPose_cm =_areaInfo->pxToCm(blobPose_px); - - // ignore blobs outside the tracking area - if (!_areaInfo->inTrackingArea(blobPose_px)) - continue; - /* - CBlobContour * contour = currentBlob->GetExternalContour(); - t_PointList externContour = contour->GetContourPoints(); - CvMemStorage storage; - CvPoint actualPoint, previousPoint; - CvSeqReader reader; - cvStartReadSeq(externContour, &reader); - - // which contour pixels touch border? - for (int j = 0; j < externContour->total; j++) - { - CV_READ_SEQ_ELEM(actualPoint, reader); - if (j == 0) previousPoint = actualPoint; - //std::cout << actualPoint.x << "/" << actualPoint.y << std::endl; - //std::cout << isLeft(CvPoint a, CvPoint b, actualPoint) << std::endl; - - previousPoint = actualPoint; - }*/ - - float blobPose_angle_deg = currentBlob->GetEllipse().angle; - float blobPose_angle_rad = currentBlob->GetEllipse().angle * CV_PI / float(180.0); - assert(blobPose_angle_deg >= 0.0f && blobPose_angle_deg <= 360.0f); - //std::cout << "angle: " << blobPose_angle_deg << std::endl; - float blobPose_width = currentBlob->GetEllipse().size.width; - float blobPose_height = currentBlob->GetEllipse().size.height; - - blobPoses.push_back(BlobPose(blobPose_cm, blobPose_px, blobPose_angle_deg, blobPose_angle_rad, blobPose_width, blobPose_height)); - } - - return blobPoses; -} - -std::vector BlobsDetector::getPoses(cv::Mat& processedImage, cv::Mat& oriImage) -{ - return findBlobs(processedImage, oriImage); -} - -void BlobsDetector::setDouble(std::string spec_param, double value) -{ - if(spec_param.compare("1") == 0) { - this->setMinBlobSize(value); - } - else if (spec_param.compare("999999") == 0) { - this->setMaxBlobSize(value); - } - else { - std::cout << "BlobsDetector::Warning - Parameter: " << spec_param << " not found!" << std::endl; - } -} diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/blob/cvBlob/BlobsDetector.h b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/blob/cvBlob/BlobsDetector.h deleted file mode 100644 index 22b82fa4..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/blob/cvBlob/BlobsDetector.h +++ /dev/null @@ -1,55 +0,0 @@ -#pragma once - -#include "Model/TrackingAlgorithm/imageProcessor/detector/IDetector.h" - -#include "Model/TrackingAlgorithm/imageProcessor/detector/blob/BlobPose.h" -#include "Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobResult.h" - -class BlobsDetector : public IDetector -{ -public: - - /** - * The contructor with parameters. - * @param: rectification, the rectification object for calculation the real world coordinate. - * @param: systemProperty, the set of parameters for tracking property. - */ - BlobsDetector(void); - - virtual ~BlobsDetector(void) {} - - void setMask(cv::Mat *mask) { _mask = mask; } - - std::vector getPoses(cv::Mat& binImage, cv::Mat& oriImage); - - - void setDouble(std::string spec_param, double value); - - double minBlobSize() { return _minBlobSize; }; - double maxBlobSize() { return _maxBlobSize; }; - void setMinBlobSize(double x) { _minBlobSize = x; }; - void setMaxBlobSize(double x) { _maxBlobSize = x; }; - -private: - - /** - * Removes blobs, which are too big for the further hanlding. - * @param: blobs, all possible blobs with all possible size. - * @return: void. - */ - void filterBlobsBySize(CBlobResult& blobs); - - /** - * Find all blobs within an image. - * @param: binarized_image_mat, image contains blobs and is already binarized, - * @return: all found blobs within the image. - */ - - // TODO: can we make binImage a reference?? - std::vector findBlobs(const cv::Mat& binImage, const cv::Mat& oriImage); - - double _minBlobSize; - double _maxBlobSize; - - cv::Mat *_mask; -}; diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/blob/simpleBlob/SimpleBlobsDetector.cpp b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/blob/simpleBlob/SimpleBlobsDetector.cpp deleted file mode 100644 index 0faf91b7..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/blob/simpleBlob/SimpleBlobsDetector.cpp +++ /dev/null @@ -1,104 +0,0 @@ -#include "SimpleBlobsDetector.h" -#include "helper/CvHelper.h" -#include - -SimpleBlobsDetector::SimpleBlobsDetector(void) : _mask(nullptr) -{ - initParams(); -} - -void SimpleBlobsDetector::initParams() -{ - _params.minThreshold = 15;//SystemProperty::instance().getValueOfParam(TRACKERPARAM::THRESHOLD_BINARIZING); - _params.maxThreshold = 50;//SystemProperty::instance().getValueOfParam(TRACKERPARAM::THRESHOLD_BINARIZING); // THRESHOLD_BINARIZING=30 - _params.thresholdStep = 5; - - _params.filterByArea = true; - // blobs bigger than the provided blob size - _params.minArea = 1;//SystemProperty::instance().getValueOfParam(TRACKERPARAM::MIN_BLOB_SIZE); - _params.maxArea = 999999;//SystemProperty::instance().getValueOfParam(TRACKERPARAM::MAX_BLOB_SIZE); - - //_params.filterByConvexity = true; - //_params.minConvexity = SystemProperty::instance().getValueOfParam(TRACKERPARAM::MIN_BLOB_SIZE); - //_params.maxConvexity = SystemProperty::instance().getValueOfParam(TRACKERPARAM::MAX_BLOB_SIZE); - - _params.filterByInertia = false; - //_params.minInertiaRatio = 0.0f; - //_params.maxInertiaRatio = 1.0f; - - _params.filterByColor = true; - _params.blobColor = 255; - - _params.filterByCircularity = false; - - _params.minDistBetweenBlobs = 0; //std::numeric_limits::min(); -} - - -std::vector SimpleBlobsDetector::findBlobs(const cv::Mat& binImage, const cv::Mat& oriImage) -{ - std::vector blobPoses; - - std::vector keyPoints; - - cv::Ptr blobDetector = cv::SimpleBlobDetector::create(_params); - - blobDetector->detect( binImage, keyPoints); - - for (int i = 0; i < keyPoints.size(); i++) - { - // gets blob center - int x = keyPoints.at(i).pt.x; - int y = keyPoints.at(i).pt.y; - cv::Point blobPose_px = cv::Point(x, y); - - // apply homography - cv::Point2f blobPose_cm = _areaInfo->pxToCm(blobPose_px); - - if (!_areaInfo->inTrackingArea(blobPose_px)) - continue; - - float blobPose_angleDegree = keyPoints.at(i).angle; // as degree (0..360) - float blobPose_angleRadian = keyPoints.at(i).angle * float(CV_PI) / float(180.0); - float blobPose_width = keyPoints.at(i).size; - float blobPose_height = keyPoints.at(i).size; - - blobPoses.push_back(BlobPose(blobPose_cm, blobPose_px, blobPose_angleDegree, blobPose_angleRadian, blobPose_width, blobPose_height)); - } - - /*std::cout << keyPoints.size() << std::endl; - - cv::drawKeypoints( processedImage, keyPoints, out, CV_RGB(255,0,0),cv::DrawMatchesFlags::DEFAULT);*/ - - /*approxContours.resize( contours.size() ); - - for( int i = 0; i < contours.size(); ++i ) - { - cv::approxPolyDP( cv::Mat(contours[i]), approxContours[i], 4, 1 ); - cv::drawContours( out, contours, i, CV_RGB(rand()&255, rand()&255, rand()&255) ); - cv::drawContours( out, approxContours, i, CV_RGB(rand()&255, rand()&255, rand()&255) ); - }*/ - - return blobPoses; -} - - -std::vector SimpleBlobsDetector::getPoses(cv::Mat& binarized_image_mat, cv::Mat& original_image_mat) -{ - return findBlobs(binarized_image_mat,original_image_mat); -} - -void SimpleBlobsDetector::setDouble(std::string spec_param, double value) -{ - if(spec_param.compare("1") == 0) { //TRACKERPARAM::MIN_BLOB_SIZE - _params.minArea = value; - } else { - std::cout << "SimpleBlobsDetector::Warning - Parameter: " << spec_param << " not found!" << std::endl; - } - - if(spec_param.compare("999999") == 0) { //TRACKERPARAM::MAX_BLOB_SIZE - _params.maxArea = value; - } else { - std::cout << "SimpleBlobsDetector::Warning - Parameter: " << spec_param << " not found!" << std::endl; - } -} diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/blob/simpleBlob/SimpleBlobsDetector.h b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/blob/simpleBlob/SimpleBlobsDetector.h deleted file mode 100644 index 7946f10e..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/blob/simpleBlob/SimpleBlobsDetector.h +++ /dev/null @@ -1,49 +0,0 @@ -#pragma once - -#include "Model/TrackingAlgorithm/imageProcessor/detector/IDetector.h" - -#include "Model/TrackingAlgorithm/imageProcessor/detector/blob/BlobPose.h" -#include "Model/TrackingAlgorithm/imageProcessor/cvblobs/BlobResult.h" - -#include "opencv2/features2d/features2d.hpp" -#include "opencv2/objdetect/objdetect.hpp" - -class SimpleBlobsDetector : public IDetector -{ -public: - - /** - * The contructor with parameters. - */ - SimpleBlobsDetector(void); - - virtual ~SimpleBlobsDetector(void) {} - - void setMask(cv::Mat *mask) { _mask = mask; } - - std::vector getPoses(cv::Mat& binImage, cv::Mat& oriImage); - - void setDouble(std::string spec_param, double value); - -private: - - cv::Mat *_mask; - cv::SimpleBlobDetector::Params _params; - - /** - * Initialized the parameter for setting up the blob detector. - * @return: void. - */ - void initParams(); - - /** - * Find all blobs within an image. - * @param: binarized_image_mat, image contains blobs and is already binarized, - * @return: all found blobs within the image. - */ - - // TODO: can we make binImage a reference?? - std::vector findBlobs(const cv::Mat& binImage, const cv::Mat& oriImage); - - -}; diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/contour/ContourPose.cpp b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/contour/ContourPose.cpp deleted file mode 100644 index cd65b94f..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/contour/ContourPose.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include "ContourPose.h" - -ContourPose::ContourPose(void) -{ -} - -ContourPose::ContourPose(cv::Point2f center_cm, cv::Point center_px, float angle_degree, float width, float height, bool use) : - _center_cm(center_cm), - _center_px(center_px), - _angle_degree(angle_degree), - _width(width), - _height(height), - _used(use) -{} - -ContourPose::~ContourPose(void) -{ -} diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/contour/ContourPose.h b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/contour/ContourPose.h deleted file mode 100644 index 4e7e3da2..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/contour/ContourPose.h +++ /dev/null @@ -1,72 +0,0 @@ -#pragma once -#include - -class ContourPose -{ -public: - /** - * The standard contructor. - */ - ContourPose(void); - - /** - * The contructor with parameters. - * @param: pos_cm, position in real world coordinate. - * @param: pos_px, position in pixel coordinate. - * @param: angle_degree, orientation angle in degree. - * @param: width, width in px. - * @param: height, height in px. - * @param: used, check if this blob pose is currently in use. - */ - ContourPose(cv::Point2f pos_cm, cv::Point pos_px, float angle_degree, float width, float height, bool use = false); - - /** - * The standard destructor. - */ - ~ContourPose(void); - - /** - * Gets the pixel position of the pose. - * @return pixel position. - */ - cv::Point posPx() { return _center_px; } - - /** - * Gets the real world position of the pose. - * @return real world position. - */ - cv::Point2f posCm() { return _center_cm; } - - /** - * Gets the orientation angle as degree of the pose. - * @return degree angle. - */ - float angleDegree() { return _angle_degree; } - - /** - * Gets the width of the blob pose. - * @return width in px. - */ - float width() { return _width; } - - /** - * Gets the height of the blob pose. - * @return height in px. - */ - float height() { return _height; } - - /** - * Gets the flag whether this pose blob is already in use. - * @return true if is used, false otherwise. - */ - bool isUsed() { return _used; } - - -private: - bool _used; - cv::Point2f _center_cm; - cv::Point _center_px; - float _angle_degree; - float _width; - float _height; -}; diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/contour/ContoursDetector.cpp b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/contour/ContoursDetector.cpp deleted file mode 100644 index 3b2fa8d8..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/contour/ContoursDetector.cpp +++ /dev/null @@ -1,68 +0,0 @@ -#include "ContoursDetector.h" -#include "helper/CvHelper.h" - -std::vector ContoursDetector::findBlobs(const cv::Mat& binImage, const cv::Mat& oriImage) -{ - std::vector contourPoses; - - return contourPoses; -} - -std::vector ContoursDetector::findContours(const cv::Mat& binImage, const cv::Mat& oriImage) -{ - return findBlobs(binImage,oriImage); -} - -void ContoursDetector::createMask(std::vector points) -{} -// if (_xRes == 0 || _yRes == 0) -// return; -// -// mask = cvCreateImage(cvSize(_xRes, _yRes), IPL_DEPTH_8U,1);//erstellt schwarzweiß bild -// -// //folgender Block setzt die Pixel schwarz -// for( int y=0; yheight; y++ ) { -// uchar* ptr = (uchar*) ( mask->imageData + y * mask->widthStep ); -// for( int x=0; xwidth; x++ ) { -// ptr[x+2] = 0; -// } -// } -// -// CvPoint maskPoints[4]; -// -// for(int z=0;z<4;z++) -// { -// maskPoints[z] = points[z]; -// } -// -// //Array im Array von Polygonen. Hier Größe eins, da nur eins erzeugt wird -// CvPoint* contours[1]={ -// maskPoints, -// }; -// -// //Anzahl der Punkte der Polygone. Anzahl wie oben -// int contours_n[1]={ -// 4, -// }; -// -// //opencv Funktion zum erstellen und ausfüllen eines polygons in weiss -// cvFillPoly(mask, contours, contours_n, 1, cvScalar(255)); -// -// //Visualisierung zum Debuggen -// //cvNamedWindow("MyWindow",CV_WINDOW_AUTOSIZE); -// //cvShowImage("MyWindow", mask); -// //cvWaitKey(0); -// //cvReleaseImage(&mask); -// //cvDestroyWindow("MyWindow"); -//} - - -std::vector ContoursDetector::getPoses(cv::Mat& image_mat, cv::Mat& image_ori) -{ - return findContours(image_mat,image_ori); -} - -void ContoursDetector::setDouble(std::string spec_param, double value) -{ - std::cout << "ContoursDetector::Warning - Parameter: " << spec_param << " not found!" << std::endl; -} \ No newline at end of file diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/contour/ContoursDetector.h b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/contour/ContoursDetector.h deleted file mode 100644 index ecd46d54..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/detector/contour/ContoursDetector.h +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once - -#include "Model/TrackingAlgorithm/imageProcessor/detector/IDetector.h" - -#include "Model/TrackingAlgorithm/imageProcessor/detector/contour/ContourPose.h" - -class ContoursDetector : public IDetector -{ -public: - - /** - * The contructor with parameters. - */ - ContoursDetector(void) {} - - ~ContoursDetector(void) {} - - std::vector getPoses(cv::Mat& binImage, cv::Mat& oriImage); - - void setDouble(std::string spec_param, double value); - -private: - - /** - * Find all cntours within an image. - * @param: binarized_image_mat, image contains blobs and is already binarized, - * @return: all found blobs within the image. - */ - std::vector findBlobs(const cv::Mat& binImage, const cv::Mat& oriImage); - - std::vector findContours(const cv::Mat& binImage, const cv::Mat& oriImage); - - void createMask(std::vector points); - - cv::Mat _mask; -}; diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/preprocessor/ImagePreProcessor.cpp b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/preprocessor/ImagePreProcessor.cpp deleted file mode 100644 index bb9c66b3..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/preprocessor/ImagePreProcessor.cpp +++ /dev/null @@ -1,219 +0,0 @@ -#include "ImagePreProcessor.h" - -#include - -#include -#include - -QMutex bgsMutex; -QMutex oriImageMutex; -QMutex initBgkFrameNumMutex; -QMutex mog2Mutex; - -ImagePreProcessor::ImagePreProcessor(TrackerParameter* p_TrackingParameter) : - _maxBackgroundImageInitTime(0), //BG_MOG2_INIT_FRAME_NUMBER TODO - _bkgSubMethodMog2(false) -{ - _TrackingParameter = p_TrackingParameter; - init(); -} - -ImagePreProcessor::~ImagePreProcessor(void) -{ -} - -void ImagePreProcessor::setBkgFrameNum(int frameNum) -{ - QMutexLocker locker(&initBgkFrameNumMutex); - _maxBackgroundImageInitTime = frameNum; -} - -int ImagePreProcessor::getBkgFrameNum() -{ - QMutexLocker locker(&initBgkFrameNumMutex); - return _maxBackgroundImageInitTime; -} - - -void ImagePreProcessor::init() -{ - QMutexLocker locker(&bgsMutex); - - m_backgroundImage = std::make_shared(); - m_foregroundImage = std::make_shared(); - - _pMOG = cv::createBackgroundSubtractorMOG2( - _TrackingParameter->getmog2History(), - _TrackingParameter->getmog2VarThresh(), - true); //Shadow detection - - _backgroundSubtractionEnabled = true; - _backgroundEnabled = true; - _erodeEnabled = true; - _dilateEnabled = true; - _gaussianBlurEnabled = false; - _binarizeEnabled = true; - _resetBackgroundImageEnabled = false; -} - -cv::Mat ImagePreProcessor::binarize(cv::Mat& image) -{ - //cv::cvtColor( image, grayImage, CV_BGR2GRAY ); - - cv::Mat binarizedImage; - - if (image.channels() >= 3) - cv::cvtColor(image, binarizedImage, CV_BGR2GRAY); - else - image.copyTo(binarizedImage); - - if (binarizedImage.data) - cv::threshold(binarizedImage, binarizedImage, m_TrackingParameter->getBinarizationThreshold(), 255, cv::THRESH_BINARY); - - return binarizedImage; -} - -cv::Mat ImagePreProcessor::erode(cv::Mat& image) -{ - cv::Mat erodedImage; - cv::Mat erodeKernel; - int sizeErode = m_TrackingParameter->getSizeErode(); - if (sizeErode > 0) - { - erodeKernel = cv::getStructuringElement(cv::MORPH_CROSS, cv::Size(sizeErode, sizeErode)); - } - else { - return image; - } - if (image.data) - cv::erode(image, erodedImage, erodeKernel); - return erodedImage; -} - -cv::Mat ImagePreProcessor::dilate(cv::Mat& image) -{ - cv::Mat dilatedImage; - cv::Mat dilateKernel; - int sizeDilate = m_TrackingParameter->getSizeDilate(); - if (sizeDilate > 0) - { - dilateKernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(sizeDilate, sizeDilate)); - } - else { - return image; - } - if (image.data) - cv::dilate(image, dilatedImage, dilateKernel); - return dilatedImage; -} - -cv::Mat ImagePreProcessor::backgroundSubtraction(cv::Mat& image) -{ - if (false)//(isEnabledMog2()) - { - //QMutexLocker locker(&bgsMutex); - cv::Mat fgMaskMOG; - _pMOG->setBackgroundRatio(m_TrackingParameter->getmog2BackgroundRatio()); - - _pMOG->apply(image, fgMaskMOG); //fg mask generated by MOG method - _pMOG->getBackgroundImage(*m_backgroundImage); - return fgMaskMOG; - } - - // otherwise, custom background subtraction - - if (!m_backgroundImage->data) - image.copyTo(*m_backgroundImage); - - // calculate the image difference - const double alpha = m_TrackingParameter->getmog2BackgroundRatio(); - - const int &imageWidth = m_backgroundImage->cols; - const int &imageHeight = m_backgroundImage->rows; - const int totalRegionsX = 4; - const int totalRegionsY = 4; - const int totalRegions = totalRegionsX * totalRegionsY; - const int regionWidth = imageWidth / totalRegionsX; - const int regionHeight = imageHeight / totalRegionsY; - - cv::Mat results(imageHeight, imageWidth, image.type()); - - auto workOnRegion = [&](int x, int y) { - const int startingX = x * regionWidth; - const int startingY = y * regionHeight; - const cv::Rect subArea = cv::Rect(startingX, startingY, regionWidth, regionHeight); - cv::Mat subBackground = (*m_backgroundImage)(subArea); - cv::Mat subImage = image(subArea); - cv::Mat subResults = results(subArea); - - subResults = (subBackground - subImage); - subBackground = (1.0 - alpha) * subBackground + alpha * subImage; - }; - - std::vector> merger; - merger.reserve(totalRegions); - - for (int x = 0; x < totalRegionsX; ++x) - { - for (int y = 0; y < totalRegionsY; ++y) - { - merger.push_back(std::async([&, x, y] { workOnRegion(x, y); })); - } - } - - for (const auto & asyncResult : merger) - asyncResult.wait(); - - return results; -} - -std::map> ImagePreProcessor::preProcess(std::shared_ptr p_image) -{ - std::shared_ptr greyMat = std::make_shared(); - std::shared_ptr binarizedImage = std::make_shared(); - std::shared_ptr erodedImage = std::make_shared(); - std::shared_ptr dilatedImage = std::make_shared(); - //cv::Mat test; - - cv::cvtColor(*p_image, *greyMat, CV_BGR2GRAY); - //cv::cvtColor(*p_image, test, CV_BGR2GRAY); - - // 1. step: do the background subtraction - *m_foregroundImage = backgroundSubtraction(*greyMat); - - // 2. step: binarize the image - *binarizedImage = binarize(*m_foregroundImage); - - // 3. step: erode the image - *erodedImage = erode(*binarizedImage); - - // 4. step: dilate the image - *dilatedImage = dilate(*erodedImage); - - std::map> all; - all.insert(std::pair>(std::string("Greyscale"), greyMat)); - all.insert(std::pair>(std::string("Background"), m_backgroundImage)); - all.insert(std::pair>(std::string("Difference"), m_foregroundImage)); - all.insert(std::pair>(std::string("Binarized"), binarizedImage)); - all.insert(std::pair>(std::string("Eroded"), erodedImage)); - all.insert(std::pair>(std::string("Dilated"), dilatedImage)); - - return all; -} - -void ImagePreProcessor::resetBackgroundImage() -{ - // this will reset the background at the next opportunity - init(); -} - -bool ImagePreProcessor::isEnabledMog2() -{ - return _bkgSubMethodMog2; -} - -void ImagePreProcessor::setEnabledMog2(bool enable) -{ - QMutexLocker locker(&mog2Mutex); - _bkgSubMethodMog2 = enable; -} diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/preprocessor/ImagePreProcessor.h b/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/preprocessor/ImagePreProcessor.h deleted file mode 100644 index a0011b2e..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/TrackingAlgorithm/imageProcessor/preprocessor/ImagePreProcessor.h +++ /dev/null @@ -1,112 +0,0 @@ -#pragma once - -#include - - -#include - -#include "helper/StringHelper.h" -#include "Model/TrackerParameter.h" - - -class ImagePreProcessor -{ -public: - - /** - * The standard constructor. - */ - ImagePreProcessor(TrackerParameter* p_TrackingParameter); - - /** - * The standard destructor. - */ - ~ImagePreProcessor(void); - - /** - * Init function. Sets the property for the imge pre-processing. - * @return void. - */ - void init(); - - /** - * A computer vision method to binarize an image. - * @param: image, image to binarize, - * @return: a binarized image. - */ - cv::Mat binarize(cv::Mat& image); - - /** - * A mathematical morphology operation using in computer vision to erode an image. - * Erode image with 3x3 4-connectivity. - * @param: image, image to erode, - * @return: an eroded image. - */ - cv::Mat erode(cv::Mat& image); - - /** - * A mathematical morphology operation using in computer vision to dilate an image. - * Dilate image with 6x6 8-connectivity. - * @param: image, image to dilate, - * @return: a dilated image. - */ - cv::Mat dilate(cv::Mat& image); - - /** - * A computer vision methode to calculate the image difference. - * Background image subtracts the foreground image. - * @param: image, image to background subtract, - * @return: the background subtracted image. - */ - cv::Mat backgroundSubtraction(cv::Mat& image); - - /** - * Pre-process an image, if all methods enabled, this function: - * - does the background subtraction - * - erodes the image - * - dilates the image - * @param: image, image to process, - * @return: a pre-process image. - */ - std::map> preProcess(std::shared_ptr p_image); - - /** - * The method updates the image background. - * @return: void. - */ - void resetBackgroundImage(); - TrackerParameter* m_TrackingParameter; - -private: - - - cv::Mat _outputImage; - - int m_Mog2ShadowDetection = true; - std::shared_ptr m_backgroundImage; - std::shared_ptr m_foregroundImage; - - // background subtraction - cv::Ptr _pMOG; - - //parameters for image pre-processing - bool _backgroundSubtractionEnabled; - bool _backgroundEnabled; - bool _binarizeEnabled; - bool _erodeEnabled; - bool _dilateEnabled; - bool _gaussianBlurEnabled; - bool _resetBackgroundImageEnabled; - - int _maxBackgroundImageInitTime; - bool _bkgSubMethodMog2; - - TrackerParameter* _TrackingParameter; - - // functions - void setBkgFrameNum(int); - int getBkgFrameNum(); - - void setEnabledMog2(bool); - bool isEnabledMog2(); -}; diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/null_Model.cpp b/BioTracker/Plugin/BackgroundSubtraction/Model/null_Model.cpp deleted file mode 100644 index db2793d0..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/null_Model.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "null_Model.h" - -null_Model::null_Model() -{ - -} diff --git a/BioTracker/Plugin/BackgroundSubtraction/Model/null_Model.h b/BioTracker/Plugin/BackgroundSubtraction/Model/null_Model.h deleted file mode 100644 index 8dabf466..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/Model/null_Model.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef NULL_MODEL_H -#define NULL_MODEL_H - -#include "Interfaces/IModel/IModel.h" - -class null_Model : public IModel -{ - Q_OBJECT -public: - null_Model(); -}; - -#endif // NULL_MODEL_H diff --git a/BioTracker/Plugin/BackgroundSubtraction/PluginContext.cpp b/BioTracker/Plugin/BackgroundSubtraction/PluginContext.cpp deleted file mode 100644 index 52fea1ff..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/PluginContext.cpp +++ /dev/null @@ -1,34 +0,0 @@ -#include "PluginContext.h" - -#include "Controller/ControllerTrackingAlgorithm.h" -#include "Controller/ControllerTrackedComponent.h" - -PluginContext::PluginContext(QObject *parent) : - IBioTrackerContext(parent) -{ - QPointer< IController > ComponentController = new ControllerTrackedComponent(this, this, ENUMS::CONTROLLERTYPE::COMPONENT); - QPointer< IController > TrackingController = new ControllerTrackingAlgorithm(this, this, ENUMS::CONTROLLERTYPE::TRACKING); - - m_ControllersMap.insert(ENUMS::CONTROLLERTYPE::COMPONENT, ComponentController); - m_ControllersMap.insert(ENUMS::CONTROLLERTYPE::TRACKING, TrackingController); -} - -void PluginContext::createAppController() -{ - QMap::iterator i; - for (i = m_ControllersMap.begin(); i != m_ControllersMap.end(); ++i) - { - i.value()->createComponents(); - } -} - -void PluginContext::connectController() -{ - QMap::iterator i; - for (i = m_ControllersMap.begin(); i != m_ControllersMap.end(); ++i) - { - i.value()->connectComponents(); - } -} - - diff --git a/BioTracker/Plugin/BackgroundSubtraction/PluginContext.h b/BioTracker/Plugin/BackgroundSubtraction/PluginContext.h deleted file mode 100644 index aab040e7..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/PluginContext.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once -#include "Interfaces/IBioTrackerContext.h" -#include "Interfaces/IController/IController.h" - -class PluginContext : public IBioTrackerContext -{ - Q_OBJECT - -public: - PluginContext(QObject *parent = 0); - - // IBioTrackerContext interface -protected: - void createAppController() override; - void connectController() override; -}; - diff --git a/BioTracker/Plugin/BackgroundSubtraction/View/TrackedElementView.cpp b/BioTracker/Plugin/BackgroundSubtraction/View/TrackedElementView.cpp deleted file mode 100644 index 2703982e..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/View/TrackedElementView.cpp +++ /dev/null @@ -1,46 +0,0 @@ -#include "TrackedElementView.h" -#include "Model/TrackedComponents/TrackedElement.h" -#include "Model/TrackedComponents/TrackedTrajectory.h" -#include "QBrush" -#include "QPainter" -#include "QGraphicsScene" -#include -#include "settings/Settings.h" -#include "Model/TrackingAlgorithm/ParamNames.h" -#include "util/misc.h" -#include "QDebug" - -class QGraphicsSceneHoverEvent; - -TrackedElementView::TrackedElementView(QGraphicsItem *parent, IController *controller, IModel *model) : - IViewTrackedComponent(parent, controller, model) -{ - TrackedElement *elem = dynamic_cast(getModel()); - _boundingRect = QRectF(0,0, 100, 100); -} - -void TrackedElementView::rcvDimensionUpdate(int x, int y) { - _boundingRect = QRectF(0, 0, x, y); - update(); -} - -QRectF TrackedElementView::boundingRect() const -{ - - return _boundingRect; -} - - -void TrackedElementView::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) -{ - QGraphicsScene *scene = this->scene(); - - //Dev note: You could do some meaningful drawing here. - //So far, the core does everything we need. -} - -void TrackedElementView::getNotified() -{ - update(); -} - diff --git a/BioTracker/Plugin/BackgroundSubtraction/View/TrackedElementView.h b/BioTracker/Plugin/BackgroundSubtraction/View/TrackedElementView.h deleted file mode 100644 index 420fd769..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/View/TrackedElementView.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef TRACKEDELEMENTVIEW_H -#define TRACKEDELEMENTVIEW_H - -#include "Interfaces/IView/IViewTrackedComponent.h" - -/** - * This class is an example of how a TrackedElementView could be visualized. - * This class inherits from the IViewTrackedComponent class and is therefor part of the Composite Pattern. - */ -class TrackedElementView : public IViewTrackedComponent -{ - Q_OBJECT -public: - TrackedElementView(QGraphicsItem *parent = 0, IController *controller = 0, IModel *model = 0); - - // QGraphicsItem interface -public: - QRectF boundingRect() const override; - void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; - - // IViewTrackedComponent interface -public Q_SLOTS: - void getNotified() override; - void rcvDimensionUpdate(int x, int y); - -public Q_SIGNAL: - void emitUpdateCornersChanged(int id, int relX, int relY); - -private: - QRectF _boundingRect; - -}; - -#endif // TRACKEDELEMENTVIEW_H diff --git a/BioTracker/Plugin/BackgroundSubtraction/View/TrackerParameterView.cpp b/BioTracker/Plugin/BackgroundSubtraction/View/TrackerParameterView.cpp deleted file mode 100644 index 5c8ad730..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/View/TrackerParameterView.cpp +++ /dev/null @@ -1,82 +0,0 @@ -#include "TrackerParameterView.h" -#include "ui_TrackerParameterView.h" - -#include - -TrackerParameterView::TrackerParameterView(QWidget *parent, IController *controller, IModel *model) : - IViewWidget(parent, controller, model), - _ui(new Ui::TrackerParameterView) -{ - _ui->setupUi(this); - getNotified(); - - - QObject::connect(_ui->lineEdit_2_binThresh, SIGNAL(valueChanged(int)), this, SLOT(on_pushButton_clicked())); - QObject::connect(_ui->lineEdit_3_SizeErode, SIGNAL(valueChanged(int)), this, SLOT(on_pushButton_clicked())); - QObject::connect(_ui->lineEdit_4_SizeDilate, SIGNAL(valueChanged(int)), this, SLOT(on_pushButton_clicked())); - QObject::connect(_ui->lineEdit_8_MinBlob, SIGNAL(valueChanged(int)), this, SLOT(on_pushButton_clicked())); - QObject::connect(_ui->lineEdit_9MaxBlob, SIGNAL(valueChanged(int)), this, SLOT(on_pushButton_clicked())); - QObject::connect(_ui->lineEdit_7_MogBack, SIGNAL(valueChanged(double)), this, SLOT(on_pushButton_clicked())); - - _ui->pushButton->setVisible(false); -} - -TrackerParameterView::~TrackerParameterView() -{ - delete _ui; -} - -void TrackerParameterView::on_pushButtonResetBackground_clicked() { - TrackerParameter *parameter = qobject_cast(getModel()); - parameter->setResetBackground(true); -} - -void TrackerParameterView::on_comboBoxSendImage_currentIndexChanged(int v) { - TrackerParameter *parameter = qobject_cast(getModel()); - parameter->setSendImage(v); - parameter->setNewSelection(_ui->comboBoxSendImage->currentText().toStdString()); -} - - -void TrackerParameterView::on_pushButton_clicked() -{ - TrackerParameter *parameter = qobject_cast(getModel()); - - int setBinarizationThreshold = _ui->lineEdit_2_binThresh->text().toInt(); - int setSizeErode = _ui->lineEdit_3_SizeErode->text().toInt(); - int setSizeDilate = _ui->lineEdit_4_SizeDilate->text().toInt(); - int setmog2History = 0;// ui->lineEdit_5_MogHist->text().toInt(); - int setmog2VarThresh = 0;// ui->lineEdit_6_MogThresh->text().toInt(); - int setMinBlobSize = _ui->lineEdit_8_MinBlob->text().toInt(); - int setMaxBlobSize = _ui->lineEdit_9MaxBlob->text().toInt(); - - double setmog2BackgroundRatio = _ui->lineEdit_7_MogBack->value(); - - parameter->setAll(0, setBinarizationThreshold, setSizeErode, setSizeDilate, setmog2History, setmog2VarThresh, - setmog2BackgroundRatio, setMinBlobSize, setMaxBlobSize); - - Q_EMIT parametersChanged(); -} - -void TrackerParameterView::getNotified() -{ - TrackerParameter *parameter = qobject_cast(getModel()); - - int val = parameter->getBinarizationThreshold(); - _ui->lineEdit_2_binThresh->setValue(val); - - val = parameter->getSizeErode(); - _ui->lineEdit_3_SizeErode->setValue(val); - - val = parameter->getSizeDilate(); - _ui->lineEdit_4_SizeDilate->setValue(val); - - double dval = parameter->getmog2BackgroundRatio(); - _ui->lineEdit_7_MogBack->setValue(dval); - - val = parameter->getMinBlobSize(); - _ui->lineEdit_8_MinBlob->setValue(val); - - val = parameter->getMaxBlobSize(); - _ui->lineEdit_9MaxBlob->setValue(val); -} diff --git a/BioTracker/Plugin/BackgroundSubtraction/View/TrackerParameterView.h b/BioTracker/Plugin/BackgroundSubtraction/View/TrackerParameterView.h deleted file mode 100644 index 44296f02..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/View/TrackerParameterView.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef TRACKERPARAMETERVIEW_H -#define TRACKERPARAMETERVIEW_H - -#include "Interfaces/IView/IViewWidget.h" -#include "Model/TrackerParameter.h" - -namespace Ui { - class TrackerParameterView; -} - -class TrackerParameterView : public IViewWidget -{ - Q_OBJECT - -public: - explicit TrackerParameterView(QWidget *parent = 0, IController *controller = 0, IModel *model = 0); - ~TrackerParameterView(); - -private slots: - void on_pushButton_clicked(); - void on_pushButtonResetBackground_clicked(); - //void on_pushButtonNoFish_clicked(); - void on_comboBoxSendImage_currentIndexChanged(int v); - //void on_checkBoxNetwork_stateChanged(int v); - //void on_checkBoxBackground_stateChanged(int v); - //void on_checkBoxTrackingArea_stateChanged(int v); - - -public: - signals: - void trackingAreaType(int v); - void parametersChanged(); - -private: - Ui::TrackerParameterView *_ui; - - // IViewWidget interface -public slots: - - void getNotified(); -}; - -#endif // TRACKERPARAMETERVIEW_H diff --git a/BioTracker/Plugin/BackgroundSubtraction/View/TrackerParameterView.ui b/BioTracker/Plugin/BackgroundSubtraction/View/TrackerParameterView.ui deleted file mode 100644 index 5fc284f2..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/View/TrackerParameterView.ui +++ /dev/null @@ -1,421 +0,0 @@ - - - TrackerParameterView - - - - 0 - 0 - 304 - 481 - - - - Form - - - false - - - - 6 - - - 0 - - - 9 - - - 0 - - - 0 - - - - - false - - - QFrame::NoFrame - - - Qt::ScrollBarAsNeeded - - - Qt::ScrollBarAsNeeded - - - true - - - - - 0 - 0 - 304 - 472 - - - - - 9 - - - 0 - - - - - - - #frame{color: #e5e5e5;} - - - QFrame::Box - - - QFrame::Plain - - - - 3 - - - 5 - - - 5 - - - 5 - - - 5 - - - - - Set the binarization threshold - - - - - - Binarization Threshold - - - - - - - Set the binarization threshold - - - - - - - - - - color: #e5e5e5; - - - QFrame::Plain - - - Qt::Horizontal - - - - - - - Set the erosion size - - - - - - Size Erode - - - - - - - Set the erosion size - - - - - - - - - - color: #e5e5e5; - - - QFrame::Plain - - - Qt::Horizontal - - - - - - - Set the dilation size - - - - - - Size Dilate - - - - - - - Set the dilation size - - - - - - - - - - color: #e5e5e5; - - - QFrame::Plain - - - Qt::Horizontal - - - - - - - Set the background ratio - - - - - - Background Ratio - - - - - - - Set the background ratio - - - 6 - - - 1.000000000000000 - - - 0.001000000000000 - - - 0.001000000000000 - - - - - - - - - - color: #e5e5e5; - - - QFrame::Plain - - - Qt::Horizontal - - - - - - - Set the minimal blob size - - - - - - Min Blob Size - - - - - - - Set the minimal blob size - - - - - - - - - - color: #e5e5e5; - - - QFrame::Plain - - - Qt::Horizontal - - - - - - - Sets the maximum blob size - - - - - - Max Blob Size - - - - - - - Sets the maximum blob size - - - 10000 - - - - - - - - - - Set the parameters for the tracking plugin - - - Set Values - - - - - - - - - - Qt::Horizontal - - - - - - - - 0 - 0 - - - - Send Image: - - - - - - - Choose which image to display for the next frames. Tracking must be actived. - - - Original - - - - Original - - - - - Binarized - - - - - Eroded - - - - - Dilated - - - - - Difference - - - - - Background - - - - - - - - Reset the current background - - - Reset Background - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - - - - diff --git a/BioTracker/Plugin/BackgroundSubtraction/biotrackerplugin_global.h b/BioTracker/Plugin/BackgroundSubtraction/biotrackerplugin_global.h deleted file mode 100644 index 770f7d21..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/biotrackerplugin_global.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef BIOTRACKERPLUGIN_GLOBAL_H -#define BIOTRACKERPLUGIN_GLOBAL_H - -#include - -#if defined(BIOTRACKERPLUGIN_LIBRARY) -# define BIOTRACKERPLUGINSHARED_EXPORT Q_DECL_EXPORT -#else -# define BIOTRACKERPLUGINSHARED_EXPORT Q_DECL_IMPORT -#endif - -#endif // BIOTRACKERPLUGIN_GLOBAL_H diff --git a/BioTracker/Plugin/BackgroundSubtraction/helper/CvHelper.cpp b/BioTracker/Plugin/BackgroundSubtraction/helper/CvHelper.cpp deleted file mode 100644 index 49d6565a..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/helper/CvHelper.cpp +++ /dev/null @@ -1,405 +0,0 @@ -#include "CvHelper.h" - -#include "helper/StringHelper.h" - -CvPoint CvHelper::subtractTwoCvPoints(CvPoint a, CvPoint b) -{ - return cvPoint(a.x - b.x, a.y - b.y); -} - -CvPoint CvHelper::addTwoCvPoints(CvPoint a, CvPoint b) -{ - return cvPoint(a.x + b.x, a.y + b.y); -} - -CvPoint CvHelper::multCvPoint(double scalar, CvPoint p) -{ - return cvPoint(scalar * p.x, scalar * p.y); -} - -QPointF CvHelper::norm(double x, double y) -{ - double distance = qSqrt(x * x + y * y); - - if (distance == 0) { - return QPointF(0, 0); - } - return QPointF(x / distance, y / distance); -} - -QPointF CvHelper::norm(QPoint p) -{ - return CvHelper::norm((double) p.x(), (double) p.y()); -} - -QPointF CvHelper::norm(QPointF p) -{ - return CvHelper::norm(p.x(), p.y()); -} - -double CvHelper::getDistance(double x1, double y1, double x2, double y2) -{ - return qSqrt( ( (x1 - x2) * (x1 - x2) ) + ( (y1 - y2) * (y1 - y2) ) ); -} - -double CvHelper::getDistance(double x1, double y1, double z1, double x2, double y2, double z2 ) -{ - return qSqrt(((x1 - x2) * (x1 - x2)) + ((y1 - y2) * (y1 - y2)) + ((z1 - z2) * (z1 - z2))); -} - -double CvHelper::getSqDistance(double x1, double y1, double x2, double y2) -{ - return ( (x1 - x2) * (x1 - x2) ) + ( (y1 - y2) * (y1 - y2) ); -} - -double CvHelper::getSqDistance(double x1, double y1, double z1, double x2, double y2, double z2) -{ - return ((x1 - x2) * (x1 - x2)) + ((y1 - y2) * (y1 - y2)) + ((z1 - z2) * (z1 - z2)); -} - -double CvHelper::getDistance(QPoint p1, QPoint p2) -{ - return getDistance((double) p1.x(), (double) p1.y(), (double) p2.x(), (double) p2.y()); -} - -double CvHelper::getDistance(QPointF p1, QPointF p2) -{ - return getDistance(p1.x(), p1.y(), p2.x(), p2.y()); -} - -double CvHelper::getDistance(cv::Point2f p1, cv::Point2f p2) -{ - return getDistance(p1.x, p1.y, p2.x, p2.y); -} - -double CvHelper::getDistance(cv::Point3f p1, cv::Point3f p2) -{ - return getDistance(p1.x, p1.y, p1.z, p2.x, p2.y, p2.z); -} - -double CvHelper::getDistance(cv::Point p1, cv::Point p2) -{ - return sqrt(double((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y))); -} - -double CvHelper::getSqDistance(cv::Point2f p1, cv::Point2f p2) -{ - return getSqDistance(p1.x, p1.y, p2.x, p2.y); -} - -double CvHelper::getSqDistance(cv::Point3f p1, cv::Point3f p2) -{ - return getSqDistance(p1.x, p1.y, p1.z, p2.x, p2.y, p2.z); -} - -double CvHelper::orientation(cv::Point2f front, cv::Point2f back) -{ - cv::Point2f diff = front - back; - //return qAtan2(diff.x, diff.y); - - // need to check the origin of coorindiates - return qAtan2(diff.x, diff.y) + CV_PI / 2.0; -} - -double CvHelper::orientation(QPointF front, QPointF back) -{ - //QPointF diff = front - back; - //return qAtan2(diff.x(), diff.y()); - return orientation(cv::Point2f(front.x(),front.y()),cv::Point2f(back.x(),back.y())); -} - -float CvHelper::angleDifference(float alpha, float beta) -{ - float difference = alpha - beta; - while (difference < -CV_PI) difference += 2.0f * CV_PI; - while (difference > +CV_PI) difference -= 2.0f * CV_PI; - return difference; -} - -float CvHelper::findMin(float n1, float n2, float n3) { - return (n1 < n2 && n1 < n3) ? n1 : (n2 < n3 ? n2 : n3); -} - -float CvHelper::findMax(float n1, float n2, float n3) { - return (n1 > n2 && n1 > n3) ? n1 : (n2 > n3 ? n2 : n3); -} - -float CvHelper::normalDist(float x, float mean, float variance) { - return 1.0 / (variance *qSqrt(2*CV_PI)) * qExp(- ((x - mean) * (x - mean)) / (2 * variance * variance)); -} - -float CvHelper::sigmoid(float x, float shrink) { - return (2.0 / (1.0 + qExp(-x * shrink)) - 1.0); -} - -float CvHelper::sigmoidAbsInv(float x, float shrink) { - return 1.0 - qAbs((2.0 / (1.0 + qExp(-x * shrink)) - 1.0)); -} - -double CvHelper::getAngleDifference(double dirToTargetAsRad, double currOrientationAsRad) { - /*double angleDiff = dirToTargetAsRad - currOrientationAsRad + CV_PI / 2.0; - while (angleDiff < -CV_PI) angleDiff += 2 * CV_PI; - while (angleDiff > CV_PI) angleDiff -= 2 * CV_PI; - return angleDiff;*/ - - double a = dirToTargetAsRad - currOrientationAsRad; - a += (a > CV_PI) ? -(2*CV_PI) : (a < -CV_PI) ? (2*CV_PI) : 0; - return a; -} - -//double CvHelper::getAngleToTarget(cv::Point2f A, cv::Point2f B) { -// double ab = A.x*B.x + A.y*B.y; -// double a = qSqrt(A.x*A.x + A.y*A.y); -// double b = qSqrt(B.x*B.x + B.y*B.y); -// double cosT = ab / (a*b); -// return qAcos(cosT); -//} - -double CvHelper::getAngleToTarget(cv::Point2f currentPos, cv::Point2f targetPos) { - return qAtan2(targetPos.x - currentPos.x, targetPos.y - currentPos.y); -} - -std::deque CvHelper::convertMat2Point2fDeque(cv::Mat mat) -{ - std::deque point2fS; - - if(mat.cols != 2) - return point2fS; - - for (int row = 0; row < mat.rows; row++) - { - float x = mat.at(row,0); - float y = mat.at(row,1); - point2fS.push_back(cv::Point2f(x,y)); - } - - return point2fS; -} - -cv::Mat CvHelper::convertPoint2fDeque2Mat(std::deque points) -{ - cv::Mat mat; - - if(points.empty()) - return mat; - - mat = cv::Mat(points.size(), 2, CV_32F); - - for (int i = 0; i < points.size(); i++) - { - cv::Point2f p = points.at(i); - mat.at(i,0)= p.x; - mat.at(i,1)= p.y; - } - - return mat; -} - -QList> CvHelper::convertMatList2Point2fDequeList(QList mats) -{ - QList> pointList; - cv::Mat mat; - foreach (mat , mats) - { - pointList << CvHelper::convertMat2Point2fDeque(mat); - } - return pointList; -} - -cv::Point2f CvHelper::getMirrowPoint(cv::Point2f point2Mirror, cv::Point2f pointOfOrigin, float angelAsGrad) -{ - //Convert angelAsGrad to radian - float angelAsRadian = (angelAsGrad * CV_PI / 180.0); - - cv::Mat G = (cv::Mat_(2,2) << cos(2.0 * angelAsRadian), sin(2.0 * angelAsRadian), sin(2.0 * angelAsRadian), -cos(2.0 * angelAsRadian)); - - cv::Mat point2MirrorMat(1/*rows*/,2 /* cols */,CV_32F); - point2MirrorMat.at(0,0) = point2Mirror.x; - point2MirrorMat.at(0,1) = point2Mirror.y; - - cv::Mat pointOfOriginMat(1/*rows*/,2 /* cols */,CV_32F); - pointOfOriginMat.at(0,0) = pointOfOrigin.x; - pointOfOriginMat.at(0,1) = pointOfOrigin.y; - - cv::Mat point2MirrorFromOrigin = point2MirrorMat - pointOfOriginMat; - - cv::Mat point2MirrorMatT; - cv::transpose(point2MirrorFromOrigin, point2MirrorMatT); - - cv::Mat mirrowedPointMat = (G * point2MirrorMatT); - - cv::Mat mirrowedPointMatT; - cv::transpose(mirrowedPointMat, mirrowedPointMatT); - - cv::Mat finalMat = mirrowedPointMatT + pointOfOriginMat; - - return cv::Point2f(finalMat.at(0,0),finalMat.at(0,1)); -} - -std::deque CvHelper::getMirrowPoints(std::deque points2Mirror, cv::Point2f pointOfOrigin, float angelAsGrad) -{ - std::deque mirrowedPoints; - - for(int i = 0; i < points2Mirror.size(); i++) - { - cv::Point2f p = CvHelper::getMirrowPoint(points2Mirror.at(i), pointOfOrigin, angelAsGrad); - mirrowedPoints.push_back(p); - } - return mirrowedPoints; - -} - -std::deque CvHelper::getMirrowLine(cv::Point2f pointOfOrigin, float width, float height, float angelAsGrad) -{ - float angle = angelAsGrad * CV_PI / 180.0; - - float r = CvHelper::getDistance(pointOfOrigin, cv::Point2f(width, height)); - - float xOff1 = pointOfOrigin.x + r * cos(angle); - float yOff1 = pointOfOrigin.y + r * sin(angle); - - float xOff2 = pointOfOrigin.x - r * cos(angle); - float yOff2 = pointOfOrigin.y - r * sin(angle); - - cv::Point2f front(xOff2,yOff2); - cv::Point2f back(xOff1,yOff1); - - std::deque points; - - points.push_back(front); - points.push_back(back); - return points; -} - - -std::vector CvHelper::convertMat2Vector(cv::Mat mat) -{ - std::vector value(mat.rows); - for (int i = 0; i < value.size(); i++) - { - cv::Point p((int)mat.at(i,0),(int)mat.at(i,1)); - value.at(i) = p; - } - return value; -} - -cv::Mat CvHelper::convertVector2Mat(std::vector vect) -{ - cv::Mat mat(vect.size(),2,CV_32F); - for (int i = 0; i < vect.size(); i++) - { - mat.at(i,0) = (float)vect.at(i).x; - mat.at(i,1) = (float)vect.at(i).y; - } - return mat; -} - -float CvHelper::degToRad(float deg) -{ - return deg * CV_PI / 180.0; -} - -float CvHelper::radToDeg(float rad) -{ - return rad * 180.0 / CV_PI; -} - -int CvHelper::stdStringToInt(std::string string) -{ - int numb; - std::istringstream iss(string); - if (!(iss >> numb)) - { - throw "String cannot convert to float number!"; - } - return numb; -} - -float CvHelper::stdStringToFloat(std::string string) -{ - float numb; - std::istringstream iss(string); - if (!(iss >> numb)) - { - throw "String cannot convert to float number!"; - } - - return numb; -} - -std::string CvHelper::convertStdVectorCvPointToStdString(std::vector points) -{ - std::string pointListString; - for (int i = 0; i < points.size(); i++) - { - int x = points.at(i).x; - int y = points.at(i).y; - if(i < points.size() - 1) - pointListString.append(StringHelper::iToSS(x)).append(":").append(StringHelper::iToSS(y)).append(" "); - else - pointListString.append(StringHelper::iToSS(x)).append(":").append(StringHelper::iToSS(y)); - } - return pointListString; -} - -std::string CvHelper::convertCvScalarToStdString(cv::Scalar scalar) -{ - std::string scalarString; - - int r = scalar.val[0,0]; - int g = scalar.val[0,1]; - int b = scalar.val[0,2]; - - scalarString.append(StringHelper::iToSS(r)).append(" ").append(StringHelper::iToSS(g)).append(" ").append(StringHelper::iToSS(b)).append(" "); - - return scalarString; - -} - -std::string CvHelper::cvSizeToSS(cv::Size cvSize_value) -{ - std::string cvSizeString; - - int width = cvSize_value.width; - int height = cvSize_value.height; - - cvSizeString.append(StringHelper::iToSS(height)).append("x").append(StringHelper::iToSS(width)); - - return cvSizeString; -} - -std::string CvHelper::cvSize2fToSS(cv::Size2f cvSize2f_value) -{ - std::string cvSize2fString; - - float width = cvSize2f_value.width; - float height = cvSize2f_value.height; - - cvSize2fString.append(StringHelper::fToSS(height)).append("x").append(StringHelper::fToSS(width)); - - return cvSize2fString; -} - -std::string CvHelper::cvSize2fToSS(QString width, QString height) -{ - std::string cvSize2fString; - - cvSize2fString.append(height.toStdString()).append("x").append(width.toStdString()); - - return cvSize2fString; -} - -std::string CvHelper::getCurrentDatetimeAsStd() -{ - return QDateTime::currentDateTime().toString("_yyMMddThhmmss").toUtf8().constData(); -} - -bool CvHelper::isFrameSizeEqual(cv::Size o1, cv::Size o2) -{ - bool equal = false; - - if (o1.width == o2.width && o1.height == o2.height) - equal = true; - - return equal; -} \ No newline at end of file diff --git a/BioTracker/Plugin/BackgroundSubtraction/helper/CvHelper.h b/BioTracker/Plugin/BackgroundSubtraction/helper/CvHelper.h deleted file mode 100644 index c608a15d..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/helper/CvHelper.h +++ /dev/null @@ -1,197 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include - -#include - - -/** - * Computer vision helper class, contains only static methods - */ -namespace CvHelper -{ - /** - * Subtract operation for two CvPoints. - * @return: the difference of the CvPoints. - */ - CvPoint subtractTwoCvPoints(CvPoint a, CvPoint b); - - /** - * Add operation for two CvPoints. - * @return: the sum of the CvPoints. - */ - CvPoint addTwoCvPoints(CvPoint a, CvPoint b); - - CvPoint multCvPoint(double scalar, CvPoint p); - - /** - * Normalizes a coordinate point. - * @param x, the x coordinate. - * @param y, the y coordinate. - * @return the normlized point as floating number. - */ - QPointF norm(double x, double y); - - /** - * Normalizes a point. - * @param p, point to normalize. - * @return the normalized point as floating number. - */ - QPointF norm(QPoint p); - - /** - * Normalizes a floating number point. - * @param p, point to normalize. - * @return the normalized point as floating number. - */ - QPointF norm(QPointF p); - - /** - * Calculates the distance between two coordinates. - * @param x1, x-coordinate of the source point. - * @param y1, y-coordinate of the source point. - * @param x2, x-coordinate of the destination point. - * @param y2, y-coordinate of the destination point. - * @return the distance between the provided coordinates as floating number. - */ - double getDistance(double x1, double y1, double x2, double y2); - double getSqDistance(double x1, double y1, double x2, double y2); - - /** - * Calculates the distance between two coordinates. - * @param x1, x-coordinate of the source point. - * @param y1, y-coordinate of the source point. - * @param z1, z-coordinate of the source point. - * @param x2, x-coordinate of the destination point. - * @param y2, y-coordinate of the destination point. - * @param z2, y-coordinate of the destination point. - * @return the distance between the provided coordinates as floating number. - */ - double getDistance(double x1, double y1, double z1, double x2, double y2, double z2); - double getSqDistance(double x1, double y1, double z1, double x2, double y2, double z2); - - /** - * Calculates the distance between two points. - * @param p1, source point. - * @param p2, destination point. - * @return the distance between p1 and p2 as floating number. - */ - double getDistance(QPoint p1, QPoint p2); - - /** - * Calculates the distance between two floating number points. - * @param p1, source point. - * @param p2, destination point. - * @return the distance between p1 and p2 as floating number. - */ - double getDistance(QPointF p1, QPointF p2); - - double getDistance(cv::Point2f p1, cv::Point2f p2); - double getDistance(cv::Point p1, cv::Point p2); - double getSqDistance(cv::Point2f p1, cv::Point2f p2); - - double getDistance(cv::Point3f p1, cv::Point3f p2); - double getSqDistance(cv::Point3f p1, cv::Point3f p2); - - double orientation(cv::Point2f front, cv::Point2f back); - double orientation(QPointF front, QPointF back); - - float angleDifference(float alpha, float beta); - - /** - * Convert degree to radian. - * @param: deg, degree value, - * @return: rad value. - */ - float degToRad(float deg); - - /** - * Convert radian to degree. - * @param: rad, radian value, - * @return: degree value. - */ - float radToDeg(float rad); - - /** - * This function finds the minimal number of three numbers. - */ - float findMin(float n1, float n2, float n3); - - /** - * This function finds the maximal number of three numbers. - */ - float findMax(float n1, float n2, float n3); - - float normalDist(float x, float mean, float variance); - - float sigmoid(float x, float shrink); - - float sigmoidAbsInv(float x, float shrink); - - double getAngleDifference(double dirToTargetAsRad, double currOrientationAsRad); - double getAngleToTarget(cv::Point2f A, cv::Point2f B); - //double getAngleToTarget(cv::Point2f currentPos, cv::Point2f targetPos); - - cv::Point2f getMirrowPoint(cv::Point2f point2Mirror, cv::Point2f pointOfOrigin, float angelAsGrad); - std::deque getMirrowPoints(std::deque points2Mirror, cv::Point2f pointOfOrigin, float angelAsGrad); - std::deque getMirrowLine(cv::Point2f pointOfOrigin, float width, float height, float angelAsGrad); - - - std::deque convertMat2Point2fDeque(cv::Mat mat); - cv::Mat convertPoint2fDeque2Mat(std::deque points); - QList> convertMatList2Point2fDequeList(QList mats); - std::vector convertMat2Vector(cv::Mat mat); - cv::Mat convertVector2Mat(std::vector vect); - - /** - * Converts a string to an integer number. - * @param: string, a string containing a number. - * @return: a converted integer number. - */ - int stdStringToInt(std::string string); - - /** - * Converts a string to a float number. - * @param: string, a string containing a number. - * @return: a converted float number. - */ - float stdStringToFloat(std::string string); - - /** - * Converts a list of cv::Point to a proper string, which could be save into the config.ini file. - * @param: points, a list of cv::Point. - * @return: a converted formated string for the config.ini file. - */ - std::string convertStdVectorCvPointToStdString(std::vector points); - - /** - * Converts a cv::Scalar to a proper standard string, which could be save into the config.ini file. - * @param: scalar, a scalar. - * @return: a converted formated string for the config.ini file. - */ - std::string convertCvScalarToStdString(cv::Scalar scalar); - - /** - * Gets the current date time as std string. - * @return: the current formated date time as standard string. - */ - std::string getCurrentDatetimeAsStd(); - - std::string cvSizeToSS(cv::Size cvSize_value); - std::string cvSize2fToSS(cv::Size2f cvSize2f_value); - std::string cvSize2fToSS(QString width, QString height); - - - /** - * Checks if image sizes are equal. - * @param: size of first object - * @param: size of second object - * @return: true if equal, false otherwise - */ - bool isFrameSizeEqual(cv::Size o1, cv::Size o2); -} diff --git a/BioTracker/Plugin/BackgroundSubtraction/helper/StringHelper.cpp b/BioTracker/Plugin/BackgroundSubtraction/helper/StringHelper.cpp deleted file mode 100644 index 4f4b3f8d..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/helper/StringHelper.cpp +++ /dev/null @@ -1,105 +0,0 @@ -#include "StringHelper.h" - -#include -#include - - -bool StringHelper::hasEnding(std::string const &fullString, std::string const &ending) -{ - if (fullString.length() >= ending.length()) - return (0 == fullString.compare (fullString.length() - ending.length(), ending.length(), ending)); - else - return false; -} - - -bool StringHelper::startsWithDigit(std::string const &fullString) -{ - if(fullString.empty()) - return false; - - - if(isdigit(fullString.at(0))) - { - return true; - } - - return false; - -} - -bool StringHelper::startsWithDigitQ(QString fullString) -{ - return StringHelper::startsWithDigit(fullString.toLocal8Bit().data()); -} - -bool StringHelper::isNumber(QString fullStringQ) -{ - std::string fullString = fullStringQ.toLocal8Bit().data(); - - for(int i = 0; i < fullString.length(); i++) - { - if(isdigit(fullString.at(i))) - { - return true; - } - - } - - return false; -} - -std::string StringHelper::iToSS(int int_num) -{ - return QString::number(int_num).toUtf8().constData(); -} - -std::string StringHelper::boolToSS(bool bool_value) -{ - if(bool_value) - return std::string("true"); - return std::string("false"); -} - -std::string StringHelper::fToSS(float float_num) -{ - return QString::number(float_num).toUtf8().constData(); -} - - -std::string StringHelper::toStdString(QString qString) -{ - return qString.toUtf8().constData(); -} - -QString StringHelper::toQString(std::string stdString) -{ - return QString::fromUtf8(stdString.c_str()); -} - -std::string StringHelper::toLowerCase(std::string stringValue) -{ - std::string lowCaseString(stringValue); - std::transform(lowCaseString.begin(), lowCaseString.end(), lowCaseString.begin(), tolower); - return lowCaseString; -} - -int StringHelper::split(std::string &txt, std::vector &strs, char ch) -{ - std::string::size_type pos = txt.find( ch ); - std::string::size_type initialPos = 0; - strs.clear(); - - // Decompose statement - while( pos != std::string::npos ) { - strs.push_back( txt.substr( initialPos, pos - initialPos ) ); - initialPos = pos + 1; - - pos = txt.find( ch, initialPos ); - } - - // Add the last one - strs.push_back(txt.substr(initialPos, std::min(pos, txt.size()) - initialPos + 1)); - - return strs.size(); -} \ No newline at end of file diff --git a/BioTracker/Plugin/BackgroundSubtraction/helper/StringHelper.h b/BioTracker/Plugin/BackgroundSubtraction/helper/StringHelper.h deleted file mode 100644 index 10f05d6a..00000000 --- a/BioTracker/Plugin/BackgroundSubtraction/helper/StringHelper.h +++ /dev/null @@ -1,80 +0,0 @@ -#pragma once - -#include -#include -#include - -/** - * String handling helper class - */ -class StringHelper -{ -public: - StringHelper(void) {} - ~StringHelper(void) {} - - /** - * This method is used to check whether the full string contains the provided ending. - * @param: fullString, the specifies the string which needs to be checked. - * @param: ending, string specifes the ending string. - * @return: true if ending string is at the end of fullString, otherwise false - */ - static bool hasEnding(std::string const &fullString, std::string const &ending); - - - static bool startsWithDigitQ(QString fullString); - static bool startsWithDigit(std::string const &fullString); - - static bool isNumber(QString fullString); - - /** - * Convert QString to standard string. - * @param: qString, the string to convert, - * @return: a standard string. - */ - static std::string toStdString(QString qString); - - /** - * Convert standard string to QString - * @param: stdString, the string to convert, - * @return: a qt string. - */ - static QString toQString(std::string stdString); - - /** - * Convert integer to standard string. - * @param: int_num, integer number to convert, - * @return: a standard string. - */ - static std::string iToSS(int int_num); - - /** - * Convert a bool to standard string. - * @param: bool_value, bool valueto convert, - * @return: a standard string. - */ - static std::string boolToSS(bool bool_value); - - /** - * Convert float to standard string. - * @param: float_num, float number to convert, - * @return: a standard string. - */ - static std::string fToSS(float float_num); - - /** - * Convert a given string to lower case string. - * @param: stringValue, string to convert, - * @return: a standard string. - */ - static std::string toLowerCase(std::string stringValue); - - /** - * Use from here: http://stackoverflow.com/questions/5888022/split-string-by-single-spaces - * Method to split a string by a given character. - * @param: txt, a reference to the string, which will be split, - * @param: strs, a reference to a vector containing the splitted result, - * @param: ch, the split character. - **/ - static int split(std::string &txt, std::vector &strs, char ch); -}; diff --git a/BioTracker/Plugin/LukasKanade/BioTrackerPlugin.cpp b/BioTracker/Plugin/LukasKanade/BioTrackerPlugin.cpp deleted file mode 100644 index 47bec0a0..00000000 --- a/BioTracker/Plugin/LukasKanade/BioTrackerPlugin.cpp +++ /dev/null @@ -1,134 +0,0 @@ -#include "BioTrackerPlugin.h" -#include "PluginContext.h" - -#include "Controller/ControllerTrackingAlgorithm.h" -#include "Controller/ControllerTrackedComponent.h" - -#include "util/singleton.h" -#include "settings/Settings.h" - -#include "View/TrackedElementView.h" -#include "TrackedComponents/TrackedComponentFactory.h" - -BioTrackerPlugin::BioTrackerPlugin() { -} - -IView* BioTrackerPlugin::getTrackerParameterWidget() { - return qobject_cast (m_TrackerController)->getTrackingParameterWidget(); -} -IView *BioTrackerPlugin::getTrackerElementsWidget() -{ - return qobject_cast (m_ComponentController)->getTrackingElementsWidget(); -} - -// forwards tracked component model to coreApp -IModel* BioTrackerPlugin::getTrackerComponentModel() { - return qobject_cast (m_ComponentController)->getModel(); -} - -IModelTrackedComponentFactory *BioTrackerPlugin::getComponentFactory() { - return new TrackedComponentFactory(); -} - -#if QT_VERSION < 0x050000 -Q_EXPORT_PLUGIN2(BioTrackerPlugin, BioTrackerPlugin) -#endif // QT_VERSION < 0x050000 - - -void BioTrackerPlugin::createPlugin() { - m_PluginContext = new PluginContext(); - m_PluginContext->createApplication(); - - IController * ctr = m_PluginContext->requestController(ENUMS::CONTROLLERTYPE::COMPONENT); - m_ComponentController = qobject_cast(ctr); - - IController * ctr2 = m_PluginContext->requestController(ENUMS::CONTROLLERTYPE::TRACKING); - m_TrackerController = qobject_cast(ctr2); - - connectInterfaces(); -} - -void BioTrackerPlugin::connectInterfaces() { - ControllerTrackingAlgorithm* ctrAlg = qobject_cast (m_TrackerController); - ControllerTrackedComponent* ctrTrC = qobject_cast (m_ComponentController); - - //controllertrackingalgorithm - QObject::connect(ctrAlg, &ControllerTrackingAlgorithm::emitCvMat, this, &BioTrackerPlugin::receiveCvMatFromController); - QObject::connect(ctrAlg, &ControllerTrackingAlgorithm::emitTrackingDone, this, &BioTrackerPlugin::receiveTrackingDone); - QObject::connect(ctrAlg, &ControllerTrackingAlgorithm::emitChangeDisplayImage, this, &BioTrackerPlugin::receiveChangeDisplayImage); - QObject::connect(this, &BioTrackerPlugin::emitAreaDescriptorUpdate, ctrAlg, &ControllerTrackingAlgorithm::receiveAreaDescriptorUpdate); - //tracking algorithm - QObject::connect(static_cast(ctrAlg->getModel()), SIGNAL(emitDimensionUpdate(int, int)), this, SIGNAL(emitDimensionUpdate(int, int))); - //controllertrackedcomponents - QObject::connect(this, &BioTrackerPlugin::emitAddTrajectory, ctrTrC, &ControllerTrackedComponent::receiveAddTrajectory, Qt::DirectConnection); - QObject::connect(this, &BioTrackerPlugin::emitRemoveTrajectory, ctrTrC, &ControllerTrackedComponent::receiveRemoveTrajectory, Qt::DirectConnection); - QObject::connect(this, &BioTrackerPlugin::emitRemoveTrajectoryId, ctrTrC, &ControllerTrackedComponent::receiveRemoveTrajectoryId, Qt::DirectConnection); - QObject::connect(this, &BioTrackerPlugin::emitRemoveTrackEntity, ctrTrC, &ControllerTrackedComponent::receiveRemoveTrackEntity, Qt::DirectConnection); - QObject::connect(this, &BioTrackerPlugin::emitValidateTrajectory, ctrTrC, &ControllerTrackedComponent::receiveValidateTrajectory, Qt::DirectConnection); - QObject::connect(this, &BioTrackerPlugin::emitValidateEntity, ctrTrC, &ControllerTrackedComponent::receiveValidateEntity, Qt::DirectConnection); - QObject::connect(this, &BioTrackerPlugin::emitEntityRotation, ctrTrC, &ControllerTrackedComponent::receiveEntityRotation, Qt::DirectConnection); - //connect this to enable moving of elements -> we need pxtocm() to create new poses - QObject::connect(this, &BioTrackerPlugin::emitMoveElement, ctrTrC, &ControllerTrackedComponent::receiveMoveElement, Qt::DirectConnection); - QObject::connect(this, &BioTrackerPlugin::emitSwapIds, ctrTrC, &ControllerTrackedComponent::receiveSwapIds, Qt::DirectConnection); - QObject::connect(this, &BioTrackerPlugin::emitToggleFixTrack, ctrTrC, &ControllerTrackedComponent::receiveToggleFixTrack, Qt::DirectConnection); - QObject::connect(this, &BioTrackerPlugin::emitCurrentFrameNumber, ctrTrC, &ControllerTrackedComponent::receiveCurrentFrameNumber, Qt::DirectConnection); -} - - -void BioTrackerPlugin::receiveAreaDescriptor(IModelAreaDescriptor *areaDescr) { - Q_EMIT emitAreaDescriptorUpdate(areaDescr); -} - -void BioTrackerPlugin::receiveCurrentFrameFromMainApp(std::shared_ptr mat, uint frameNumber) { - qobject_cast (m_TrackerController)->doTracking(mat, frameNumber); - - Q_EMIT emitCurrentFrameNumber(frameNumber); -} - -void BioTrackerPlugin::receiveCurrentFrameNumberFromMainApp(uint frameNumber) { - Q_EMIT emitCurrentFrameNumber(frameNumber); -} - -void BioTrackerPlugin::receiveCvMatFromController(std::shared_ptr mat, QString name) { - Q_EMIT emitCvMat(mat, name); -} - -void BioTrackerPlugin::receiveTrackingDone(uint framenumber) { - Q_EMIT emitTrackingDone(framenumber); -} - -void BioTrackerPlugin::receiveChangeDisplayImage(QString str) { - Q_EMIT emitChangeDisplayImage(str); -} - -void BioTrackerPlugin::receiveRemoveTrajectory(IModelTrackedTrajectory* trajectory) { - Q_EMIT emitRemoveTrajectory(trajectory); -} - -void BioTrackerPlugin::receiveAddTrajectory(QPoint pos) { - Q_EMIT emitAddTrajectory(pos); -} - -void BioTrackerPlugin::receiveSwapIds(IModelTrackedTrajectory * trajectory0, IModelTrackedTrajectory * trajectory1) { - Q_EMIT emitSwapIds(trajectory0, trajectory1); -} - -void BioTrackerPlugin::sendCorePermissions() { - // get plugin settings - BioTracker::Core::Settings *pluginSettings = BioTracker::Util::TypedSingleton::getInstance(LUKASKANADE::CONFIGPARAM::CONFIG_INI_FILE); - - // signal permissions - bool enableView = pluginSettings->getValueOrDefault(LUKASKANADE::GUIPARAM::ENABLE_CORE_COMPONENT_VIEW, true); - Q_EMIT emitCorePermission(std::pair(ENUMS::COREPERMISSIONS::COMPONENTVIEW, enableView)); - bool enableMove = pluginSettings->getValueOrDefault(LUKASKANADE::GUIPARAM::ENABLE_CORE_COMPONENT_MOVE, true); - Q_EMIT emitCorePermission(std::pair(ENUMS::COREPERMISSIONS::COMPONENTMOVE, enableMove)); - bool enableRemove = pluginSettings->getValueOrDefault(LUKASKANADE::GUIPARAM::ENABLE_CORE_COMPONENT_REMOVE, true); - Q_EMIT emitCorePermission(std::pair(ENUMS::COREPERMISSIONS::COMPONENTREMOVE, enableRemove)); - bool enableSwap = pluginSettings->getValueOrDefault(LUKASKANADE::GUIPARAM::ENABLE_CORE_COMPONENT_ID_SWAP, true); - Q_EMIT emitCorePermission(std::pair(ENUMS::COREPERMISSIONS::COMPONENTSWAP, enableSwap)); - bool enableAdd = pluginSettings->getValueOrDefault(LUKASKANADE::GUIPARAM::ENABLE_CORE_COMPONENT_ADD, true); - Q_EMIT emitCorePermission(std::pair(ENUMS::COREPERMISSIONS::COMPONENTADD, enableAdd)); - bool enableRotate = pluginSettings->getValueOrDefault(LUKASKANADE::GUIPARAM::ENABLE_CORE_COMPONENT_ROTATE, false); - Q_EMIT emitCorePermission(std::pair(ENUMS::COREPERMISSIONS::COMPONENTROTATE, enableRotate)); -} - diff --git a/BioTracker/Plugin/LukasKanade/BioTrackerPlugin.h b/BioTracker/Plugin/LukasKanade/BioTrackerPlugin.h deleted file mode 100644 index 5ffb1261..00000000 --- a/BioTracker/Plugin/LukasKanade/BioTrackerPlugin.h +++ /dev/null @@ -1,81 +0,0 @@ -#ifndef BIOTRACKERPLUGIN_H -#define BIOTRACKERPLUGIN_H - -#include "biotrackerplugin_global.h" -#include "opencv2/core/core.hpp" -#include "Interfaces/IBioTrackerContext.h" - -#include "Interfaces/IBioTrackerPlugin.h" -#include "TrackedComponents/TrackedComponentFactory.h" - -#include "QPointer" -#include "memory" -#include "QPoint" - -class BIOTRACKERPLUGINSHARED_EXPORT BioTrackerPlugin : public IBioTrackerPlugin { - Q_OBJECT - Q_PLUGIN_METADATA(IID "de.fu-berlin.mi.biorobotics.BioTrackerPlugin" FILE "BioTrackerPlugin.json") - Q_INTERFACES(IBioTrackerPlugin) - - public: - BioTrackerPlugin(); - - // IBioTrackerPlugin interface - IView* getTrackerParameterWidget(); - IView *getTrackerElementsWidget(); - IModel* getTrackerComponentModel(); - IModelTrackedComponentFactory *getComponentFactory(); - - public: - void createPlugin(); - void receiveCurrentFrameFromMainApp(std::shared_ptr mat, uint frameNumber); - void sendCorePermissions(); - - private: - void connectInterfaces(); -signals: - void emitCvMat(std::shared_ptr mat, QString name); - void emitTrackingDone(uint framenumber); - void emitChangeDisplayImage(QString str); - void emitAreaDescriptorUpdate(IModelAreaDescriptor *areaDescr); - void emitCorePermission(std::pair permission); - void emitRemoveTrajectory(IModelTrackedTrajectory* trajectory); - void emitAddTrajectory(QPoint pos); - void emitRemoveTrajectoryId(int id); - void emitValidateTrajectory(int id); - void emitValidateEntity(IModelTrackedTrajectory* trajectory, uint frameNumber); - void emitRemoveTrackEntity(IModelTrackedTrajectory* trajectory, uint frameNumber); - void emitMoveElement(IModelTrackedTrajectory* trajectory, uint frameNumber, QPoint pos); - void emitSwapIds(IModelTrackedTrajectory* trajectory0, IModelTrackedTrajectory* trajectory1); - void emitCurrentFrameNumber(uint frameNumber); - void emitToggleFixTrack(IModelTrackedTrajectory* trajectory, bool toggle); - void emitEntityRotation(IModelTrackedTrajectory* trajectory, double angle, uint frameNumber); - - void emitDimensionUpdate(int x, int y); - -public slots: - void receiveRemoveTrajectory(IModelTrackedTrajectory* trajectory); - void receiveAddTrajectory(QPoint pos); - void receiveSwapIds(IModelTrackedTrajectory* trajectory0, IModelTrackedTrajectory* trajectory1); - void receiveCurrentFrameNumberFromMainApp(uint frameNumber); - -private slots: - void receiveCvMatFromController(std::shared_ptr mat, QString name); - void receiveTrackingDone(uint framenumber); - void receiveChangeDisplayImage(QString str); - void receiveAreaDescriptor(IModelAreaDescriptor *areaDescr); - -private: - IController *m_TrackerController; - IController *m_ComponentController; - IController *m_AreaDescrController; - - IBioTrackerContext *m_PluginContext; - -public: - QList m_CorePermissions; - - -}; - -#endif // BIOTRACKERPLUGIN_H diff --git a/BioTracker/Plugin/LukasKanade/BioTrackerPlugin.json b/BioTracker/Plugin/LukasKanade/BioTrackerPlugin.json deleted file mode 100644 index 60679d9b..00000000 --- a/BioTracker/Plugin/LukasKanade/BioTrackerPlugin.json +++ /dev/null @@ -1,6 +0,0 @@ -{ "type" : "TrackingPlugin", - "name" : "Lukas Kanade Tracker", - "longname" : "some long name", - "version" : "1.1", - "dependencies" : [] -} diff --git a/BioTracker/Plugin/LukasKanade/CMakeLists.txt b/BioTracker/Plugin/LukasKanade/CMakeLists.txt deleted file mode 100644 index fbcddc28..00000000 --- a/BioTracker/Plugin/LukasKanade/CMakeLists.txt +++ /dev/null @@ -1,30 +0,0 @@ -############################################################## -#### Biotracker: LukasKanade -############################################################## - -add_definitions( -DBIOTRACKERPLUGIN_LIBRARY=1 ) -include(${util_cmakes}CMakeVSSugar.txt) -include_directories(${CMAKE_CURRENT_SOURCE_DIR}) - -message("Configuring LukasKanade...") -set(EXE_NAME LukasKanade.tracker) -add_library(${EXE_NAME} SHARED ${_util_source_list} ) - -target_link_libraries(${EXE_NAME} ${LIBS}) -target_link_libraries (${EXE_NAME} Qt5::Core Qt5::Gui Qt5::Xml Qt5::Network Qt5::Widgets) -target_link_libraries (${EXE_NAME} Qt5::Multimedia Qt5::MultimediaWidgets Qt5::OpenGL ) -target_link_libraries(${EXE_NAME} Biotracker_interfaces Biotracker_utility) -target_link_libraries(${EXE_NAME} ${OpenCV_LIBRARIES} ${Boost_LIBRARIES}) - -include_directories(${Boost_INCLUDE_DIRS}) - -set_target_properties(${EXE_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON) -set_target_properties(${EXE_NAME} PROPERTIES - CXX_STANDARD 17 - CXX_STANDARD_REQUIRED YES - CXX_EXTENSIONS NO -) - - - - diff --git a/BioTracker/Plugin/LukasKanade/Controller/ControllerTrackedComponent.cpp b/BioTracker/Plugin/LukasKanade/Controller/ControllerTrackedComponent.cpp deleted file mode 100644 index fe71f80a..00000000 --- a/BioTracker/Plugin/LukasKanade/Controller/ControllerTrackedComponent.cpp +++ /dev/null @@ -1,163 +0,0 @@ -#include "ControllerTrackedComponent.h" -#include "TrackedComponents/TrackedElement.h" -#include "TrackedComponents/TrackedTrajectory.h" -#include "View/TrackedElementView.h" -#include "qdebug.h" -#include "qmath.h" - -ControllerTrackedComponent::ControllerTrackedComponent(QObject *parent, IBioTrackerContext *context, ENUMS::CONTROLLERTYPE ctr) : - IController(parent, context, ctr) -{ - m_currentFrameNumber = 0; -} - -void ControllerTrackedComponent::createView() -{ - m_View = new TrackedElementView(0, this, m_Model); -} - -void ControllerTrackedComponent::connectModelToController() -{ - -} - -void ControllerTrackedComponent::connectControllerToController() -{ -} - -void createTrajectories(int count, TrackedTrajectory* all) { - //This should be done using a factory, right? - for (int i = 0; i < count; i++) { - TrackedTrajectory *t = new TrackedTrajectory(); - t->setValid(true); - TrackedElement *e = new TrackedElement(t, "n.a.", t->getId()); - t->add(e); - all->add(t, i); - } -} - -void ControllerTrackedComponent::createModel() -{ - TrackedTrajectory *t = new TrackedTrajectory(this, "All"); - - m_Model = t; -} - - -IView *ControllerTrackedComponent::getTrackingElementsWidget() -{ - return m_View; -} - -void ControllerTrackedComponent::receiveRemoveTrajectory(IModelTrackedTrajectory * trajectory) -{ - trajectory->setValid(false); - qDebug() << "TRACKER: Trajectory" << trajectory->getId() << "set invalid"; -} - -void ControllerTrackedComponent::receiveRemoveTrajectoryId(int id) -{ - TrackedTrajectory* allTraj = qobject_cast(m_Model); - if (allTraj) { - IModelTrackedComponent* traj = allTraj->getChild(id - 1); - traj->setValid(false); - qDebug() << "TRACKER: Track" << id << "set invalid"; - } -} - -void ControllerTrackedComponent::receiveValidateTrajectory(int id) -{ - TrackedTrajectory* allTraj = qobject_cast(m_Model); - if (allTraj) { - IModelTrackedComponent* traj = allTraj->getChild(id - 1); - traj->setValid(true); - qDebug() << "TRACKER: Track" << id << "validated"; - } -} - -void ControllerTrackedComponent::receiveValidateEntity(IModelTrackedTrajectory * trajectory, uint frameNumber) -{ - trajectory->getChild(frameNumber)->setValid(true); - qDebug() << "TRACKER: Track " << trajectory->getId() << " entity #" << frameNumber << "set valid"; -} - -void ControllerTrackedComponent::receiveRemoveTrackEntity(IModelTrackedTrajectory * trajectory, uint frameNumber) -{ - trajectory->getChild(frameNumber)->setValid(false); - qDebug() << "TRACKER: Track " << trajectory->getId() << " entity #" << frameNumber << "set invalid"; -} - -void ControllerTrackedComponent::receiveAddTrajectory(QPoint position) -{ - std::chrono::system_clock::time_point start = std::chrono::system_clock::now(); - - TrackedTrajectory* newTraj = new TrackedTrajectory(); - TrackedElement* firstElem = new TrackedElement(newTraj, "n.a.", newTraj->getId()); - firstElem->setX(position.x()); - firstElem->setY(position.y()); - firstElem->setTime(start); - firstElem->setValid(true); - newTraj->add(firstElem, m_currentFrameNumber); - TrackedTrajectory* allTraj = qobject_cast(m_Model); - if (allTraj) { - allTraj->add(newTraj); - qDebug() << "TRACKER: Track added at" << firstElem->getX() << "," << firstElem->getY(); - } -} - -void ControllerTrackedComponent::receiveMoveElement(IModelTrackedTrajectory* trajectory, uint frameNumber, QPoint position) -{ - TrackedTrajectory* traj = dynamic_cast(trajectory); - if (!(traj->getId() == 0) && frameNumber >= 0) { - TrackedElement* element = dynamic_cast(traj->getChild(frameNumber)); - //TODO setX, setY do not work correctly as pose not yet accessible - if (element) { - element->setX(position.x()); - element->setY(position.y()); - //qDebug() << "plugin-pos:" << position; - } - else { - qDebug() << "TRACKER: Entity to move not found (moved and deleted?): " << position; - } - } -} - -void ControllerTrackedComponent::receiveSwapIds(IModelTrackedTrajectory * trajectory0, IModelTrackedTrajectory * trajectory1) -{ - //TODO do this, not just nothing - TrackedTrajectory* traj0 = dynamic_cast(trajectory0); - TrackedTrajectory* traj1 = dynamic_cast(trajectory1); - - // dont't move main trajectory (id's: 0)!! - if (!(traj0->getId() == 0) && !(traj1->getId() == 0)) { - int traj0Id = traj0->getId(); - int traj1Id = traj1->getId(); - - traj0->setId(traj1Id); - traj1->setId(traj0Id); - - qDebug() << "TRACKER: Swap IDs " << traj0Id << "and " << traj1Id; - } -} - -void ControllerTrackedComponent::receiveToggleFixTrack(IModelTrackedTrajectory * trajectory, bool toggle) -{ - trajectory->setFixed(toggle); -} - -void ControllerTrackedComponent::receiveEntityRotation(IModelTrackedTrajectory * trajectory, double angle, uint frameNumber) -{ - TrackedTrajectory* traj = dynamic_cast(trajectory); - if (traj) { - IModelTrackedPoint* pointLike = dynamic_cast(traj->getChild(frameNumber)); - if (pointLike) { - pointLike->setDeg(float(angle)); - pointLike->setRad(float(qDegreesToRadians(angle))); - } - } -} - -void ControllerTrackedComponent::receiveCurrentFrameNumber(uint framenumber) -{ - m_currentFrameNumber = (int)framenumber; -} diff --git a/BioTracker/Plugin/LukasKanade/Controller/ControllerTrackedComponent.h b/BioTracker/Plugin/LukasKanade/Controller/ControllerTrackedComponent.h deleted file mode 100644 index 5424e95c..00000000 --- a/BioTracker/Plugin/LukasKanade/Controller/ControllerTrackedComponent.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef CONTROLLERTRACKEDCOMPONENT_H -#define CONTROLLERTRACKEDCOMPONENT_H - -#include "Interfaces/IController/IController.h" -#include "QPoint" -#include "Interfaces/IModel/IModelTrackedTrajectory.h" - -class ControllerTrackedComponent : public IController -{ - Q_OBJECT -public: - ControllerTrackedComponent(QObject *parent = 0, IBioTrackerContext *context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::COMPONENT); - - IView *getTrackingElementsWidget(); -public Q_SLOTS: - void receiveAddTrajectory(QPoint position); - void receiveRemoveTrajectory(IModelTrackedTrajectory* trajectory); - void receiveRemoveTrajectoryId(int id); - void receiveRemoveTrackEntity(IModelTrackedTrajectory* trajectory, uint frameNumber); - void receiveValidateTrajectory(int id); - void receiveValidateEntity(IModelTrackedTrajectory* trajectory, uint frameNumber); - void receiveMoveElement(IModelTrackedTrajectory* trajectory, uint frameNumber, QPoint position); - /* TODO Swaps ID's of last elements (-> swap elements) or swap ID's of trajectories and all of its elements? - */ - void receiveSwapIds(IModelTrackedTrajectory* trajectory0, IModelTrackedTrajectory* trajectory1); - void receiveToggleFixTrack(IModelTrackedTrajectory* trajectory, bool toggle); - void receiveEntityRotation(IModelTrackedTrajectory* trajectory, double angle, uint frameNumber); - void receiveCurrentFrameNumber(uint framenumber); - - // IController interface -protected: - void createModel() override; - void createView() override; - void connectModelToController() override; - void connectControllerToController() override; - - //members - int m_currentFrameNumber; -}; - -#endif // CONTROLLERTRACKEDCOMPONENT_H diff --git a/BioTracker/Plugin/LukasKanade/Controller/ControllerTrackingAlgorithm.cpp b/BioTracker/Plugin/LukasKanade/Controller/ControllerTrackingAlgorithm.cpp deleted file mode 100644 index 6e4973a3..00000000 --- a/BioTracker/Plugin/LukasKanade/Controller/ControllerTrackingAlgorithm.cpp +++ /dev/null @@ -1,80 +0,0 @@ -#include "ControllerTrackingAlgorithm.h" -#include "ControllerTrackedComponent.h" - -#include "Model/TrackerParameter.h" -#include "View/TrackerParameterView.h" -#include "View/TrackedElementView.h" - -ControllerTrackingAlgorithm::ControllerTrackingAlgorithm(QObject *parent, IBioTrackerContext *context, ENUMS::CONTROLLERTYPE ctr) : - IController(parent, context, ctr) -{ - m_BioTrackerContext = context; -} - -void ControllerTrackingAlgorithm::connectControllerToController() -{ - IController * ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::COMPONENT); - QPointer< ControllerTrackedComponent > ctrComponent = qobject_cast(ctr); - - m_TrackedTrajectoryMajor = ctrComponent->getModel(); -} - -void ControllerTrackingAlgorithm::doTracking(std::shared_ptr mat, uint number) -{ - qobject_cast(m_Model)->doTracking(mat, number); -} - -IView *ControllerTrackingAlgorithm::getTrackingParameterWidget() -{ - return m_View; -} - -void ControllerTrackingAlgorithm::createModel() -{ - connectControllerToController(); - - m_TrackingParameter = new TrackerParameter(this); - - m_Model = new BioTrackerTrackingAlgorithm(m_TrackingParameter, m_TrackedTrajectoryMajor); -} - -void ControllerTrackingAlgorithm::createView() -{ - m_View = new TrackerParameterView(0, this, m_TrackingParameter); -} - -void ControllerTrackingAlgorithm::connectModelToController() -{ - BioTrackerTrackingAlgorithm *trackingAlg = qobject_cast(m_Model); - QObject::connect(trackingAlg, &BioTrackerTrackingAlgorithm::emitCvMatA, this, &ControllerTrackingAlgorithm::receiveCvMatFromTrackingAlgorithm); - QObject::connect(trackingAlg, &BioTrackerTrackingAlgorithm::emitTrackingDone, this, &ControllerTrackingAlgorithm::receiveTrackingDone); - QObject::connect(trackingAlg, &BioTrackerTrackingAlgorithm::emitChangeDisplayImage, this, &ControllerTrackingAlgorithm::receiveChangeDisplayImage); - QObject::connect(this, &ControllerTrackingAlgorithm::emitAreaDescriptorUpdate, trackingAlg, &BioTrackerTrackingAlgorithm::receiveAreaDescriptorUpdate); - - QObject::connect(static_cast(m_View), &TrackerParameterView::parametersChanged, - trackingAlg, &BioTrackerTrackingAlgorithm::receiveParametersChanged); - - //enable the tracker to send video dimension updates to the view via signal - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::COMPONENT); - IView *v = qobject_cast(ctr)->getView(); - TrackedElementView *v2 = dynamic_cast(v); - QObject::connect(trackingAlg, SIGNAL(emitDimensionUpdate(int, int)), v2, SLOT(rcvDimensionUpdate(int, int))); -} - -void ControllerTrackingAlgorithm::receiveCvMatFromTrackingAlgorithm(std::shared_ptr mat, QString name) -{ - Q_EMIT emitCvMat(mat, name); -} - -void ControllerTrackingAlgorithm::receiveTrackingDone(uint framenumber) -{ - Q_EMIT emitTrackingDone(framenumber); -} - -void ControllerTrackingAlgorithm::receiveChangeDisplayImage(QString str) { - Q_EMIT emitChangeDisplayImage(str); -} - -void ControllerTrackingAlgorithm::receiveAreaDescriptorUpdate(IModelAreaDescriptor *areaDescr) { - Q_EMIT emitAreaDescriptorUpdate(areaDescr); -} diff --git a/BioTracker/Plugin/LukasKanade/Controller/ControllerTrackingAlgorithm.h b/BioTracker/Plugin/LukasKanade/Controller/ControllerTrackingAlgorithm.h deleted file mode 100644 index 75e565a4..00000000 --- a/BioTracker/Plugin/LukasKanade/Controller/ControllerTrackingAlgorithm.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef CONTROLLERTRACKINGALGORITHM_H -#define CONTROLLERTRACKINGALGORITHM_H - -#include "Interfaces/IController/IController.h" -#include "Model/BioTrackerTrackingAlgorithm.h" -#include "Interfaces/IBioTrackerContext.h" -#include "Interfaces/IModel/IModelDataExporter.h" - - -class ControllerTrackingAlgorithm : public IController -{ - Q_OBJECT -public: - ControllerTrackingAlgorithm(QObject *parent = 0, IBioTrackerContext *context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); - - // IController interface -public: - void connectControllerToController() override; - - void doTracking(std::shared_ptr mat, uint number); - - IView *getTrackingParameterWidget(); - -public Q_SLOTS: - void receiveAreaDescriptorUpdate(IModelAreaDescriptor *areaDescr); - -protected: - void createModel() override; - void createView() override; - void connectModelToController() override; - -Q_SIGNALS: - void emitCvMat(std::shared_ptr mat, QString name); - void emitTrackingDone(uint framenumber); - void emitChangeDisplayImage(QString str); - void emitAreaDescriptorUpdate(IModelAreaDescriptor *areaDescr); - -private Q_SLOTS: - void receiveCvMatFromTrackingAlgorithm(std::shared_ptr mat, QString name); - void receiveTrackingDone(uint framenumber); - void receiveChangeDisplayImage(QString str); - -private: - IModel* m_TrackingParameter; - IModel *m_TrackedTrajectoryMajor; -}; - -#endif // CONTROLLERTRACKINGALGORITHM_H diff --git a/BioTracker/Plugin/LukasKanade/Controller/null_Controller.cpp b/BioTracker/Plugin/LukasKanade/Controller/null_Controller.cpp deleted file mode 100644 index 612c02f3..00000000 --- a/BioTracker/Plugin/LukasKanade/Controller/null_Controller.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include "null_Controller.h" - -null_Controller::null_Controller() -{ - -} - -void null_Controller::createModel() -{ - -} - -void null_Controller::createView() -{ - -} - -void null_Controller::connectModelToController() -{ - -} - -void null_Controller::connectControllerToController() -{ - -} diff --git a/BioTracker/Plugin/LukasKanade/Controller/null_Controller.h b/BioTracker/Plugin/LukasKanade/Controller/null_Controller.h deleted file mode 100644 index a0fcc211..00000000 --- a/BioTracker/Plugin/LukasKanade/Controller/null_Controller.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef NULL_CONTROLLER_H -#define NULL_CONTROLLER_H - -#include "Interfaces/IController/IController.h" -class null_Controller : public IController -{ -public: - null_Controller(); - - // IController interface -protected: - void createModel() override; - void createView() override; - void connectModelToController() override; - void connectControllerToController() override; -}; - -#endif // NULL_CONTROLLER_H diff --git a/BioTracker/Plugin/LukasKanade/Model/BioTrackerTrackingAlgorithm.cpp b/BioTracker/Plugin/LukasKanade/Model/BioTrackerTrackingAlgorithm.cpp deleted file mode 100644 index 8817d87e..00000000 --- a/BioTracker/Plugin/LukasKanade/Model/BioTrackerTrackingAlgorithm.cpp +++ /dev/null @@ -1,169 +0,0 @@ -#include "BioTrackerTrackingAlgorithm.h" -#include -#include "TrackedComponents/TrackedComponentFactory.h" -#include - -#include "settings/Settings.h" - -BioTrackerTrackingAlgorithm::BioTrackerTrackingAlgorithm(IModel *parameter, IModel *trajectory) -{ - _TrackingParameter = (TrackerParameter*)parameter; - _TrackedTrajectoryMajor = (TrackedTrajectory*)trajectory; - BioTracker::Core::Settings *set = _TrackingParameter->getSettings(); - - _lastImage = nullptr; - _lastFramenumber = -1; -} - - -void BioTrackerTrackingAlgorithm::receiveAreaDescriptorUpdate(IModelAreaDescriptor *areaDescr) { - _AreaInfo = areaDescr; -} - -BioTrackerTrackingAlgorithm::~BioTrackerTrackingAlgorithm() -{ -} - -void BioTrackerTrackingAlgorithm::receiveParametersChanged() { - if (_lastFramenumber >= 0 && _lastImage && !_lastImage->empty()) { - doTracking(_lastImage, _lastFramenumber); - } -} - - -void clampPosition(std::vector &pos, int w, int h) { - // When points are outside the image boarders they cannot be rescued anymore - // This function clamps them to be inside the image again which is actually not - // very nice. See: https://github.com/BioroboticsLab/biotracker_lucasKanade/issues/8 - for (cv::Point2f &p : pos) { - if (p.x < 0) { - p.x = 0; - } - else if (p.x > w) { - p.x = w - 1; - } - if (p.y < 0) { - p.y = 0; - } - else if (p.y > h) { - p.y = h - 1; - } - } -} - -std::vector getPoints(TrackedTrajectory* trackedTrajectoryMajor, int frameNo) { - - std::vector points; - int trajNumber = 0; - for (int i = 0; i < trackedTrajectoryMajor->size(); i++) { - TrackedTrajectory *t = dynamic_cast(trackedTrajectoryMajor->getChild(i)); - if (t && t->getValid() && !t->getFixed()) { - IModelTrackedPoint* p = dynamic_cast(t->getChild(frameNo)); - if (p != nullptr) { - points.push_back(cv::Point2f(p->getX(), p->getY())); - } - else { - points.push_back(cv::Point2f(100, 100)); - } - - trajNumber++; - } - } - return points; -} - -void setPoints(TrackedTrajectory* trackedTrajectoryMajor, int frameNo, std::vector points) { - - int trajNumber = 0; - for (int i = 0; i < trackedTrajectoryMajor->size(); i++) { - TrackedTrajectory *t = dynamic_cast(trackedTrajectoryMajor->getChild(i)); - if (t && t->getValid() && !points.empty() && !t->getFixed()) { - cv::Point2f p = points[0]; - points.erase(points.begin()); - TrackedElement *e = new TrackedElement(t, "n.a.", t->getId()); - e->setPoint(p); - t->add(e, frameNo); - - trajNumber++; - } - } -} - - -void BioTrackerTrackingAlgorithm::doTracking(std::shared_ptr p_image, uint framenumber) -{ - - //dont do nothing if we ain't got an image - if (p_image->empty()) { - return; - } - - if (_imageX != p_image->size().width || _imageY != p_image->size().height) { - _imageX = p_image->size().width; - _imageY = p_image->size().height; - Q_EMIT emitDimensionUpdate(_imageX, _imageY); - } - -// std::chrono::system_clock::time_point start = std::chrono::system_clock::now(); - - int noFish = _TrackedTrajectoryMajor->validCount(); - cv::Mat gray; - cv::cvtColor(*p_image, gray, cv::COLOR_BGR2GRAY); - int wndSizeInt = _TrackingParameter->getWndSize(); - cv::Size wndSize = cv::Size(wndSizeInt, wndSizeInt); - cv::TermCriteria termcrit(cv::TermCriteria::COUNT | cv::TermCriteria::EPS, 20, 0.03); - - //if current frame is first frame return - if (framenumber == 0) { - Q_EMIT emitTrackingDone(framenumber); - return; - } - - std::vector prevPts = getPoints(_TrackedTrajectoryMajor, framenumber-1); - - if (_lastImage == nullptr || _lastImage->empty()) { - _lastImage = p_image; - } - - if (!prevPts.empty()){ - std::vector err; - - // calculate pyramids: - const size_t maxLevel = 10; - std::vector prevPyr; - cv::buildOpticalFlowPyramid(*_lastImage, prevPyr, wndSize, maxLevel); - - std::vector pyr; - cv::buildOpticalFlowPyramid(*p_image, pyr, wndSize, maxLevel); - - std::vector newPoints; - std::vector status; - cv::calcOpticalFlowPyrLK( - prevPyr, /* prev */ - pyr, /* next */ - prevPts, /* prevPts */ - newPoints, /* nextPts */ - status, /* status */ - err /* err */ - , wndSize, /* winSize */ - maxLevel, /* maxLevel */ - termcrit, /* criteria */ - 0, /* flags */ - 0.001 /* minEigThreshold */ - ); - - clampPosition(newPoints, p_image->size().width, p_image->size().height); - setPoints(_TrackedTrajectoryMajor, framenumber, newPoints); - } - - - Q_EMIT emitCvMatA(p_image, QString("Original")); - Q_EMIT emitChangeDisplayImage("Original"); - - - Q_EMIT emitTrackingDone(framenumber); - - _lastImage = p_image; - _lastFramenumber = framenumber; -} - diff --git a/BioTracker/Plugin/LukasKanade/Model/BioTrackerTrackingAlgorithm.h b/BioTracker/Plugin/LukasKanade/Model/BioTrackerTrackingAlgorithm.h deleted file mode 100644 index a59879e2..00000000 --- a/BioTracker/Plugin/LukasKanade/Model/BioTrackerTrackingAlgorithm.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef BIOTRACKERTRACKINGALGORITHM_H -#define BIOTRACKERTRACKINGALGORITHM_H - - -#include "Interfaces/IModel/IModel.h" - -#include "TrackerParameter.h" - -#include -#include "Interfaces/IModel/IModelTrackingAlgorithm.h" -#include "Interfaces/IModel/IModelDataExporter.h" -#include "TrackedComponents/TrackedElement.h" -#include "TrackedComponents/TrackedTrajectory.h" -#include "Interfaces/IModel/IModelAreaDescriptor.h" -#include - -class BioTrackerTrackingAlgorithm : public IModelTrackingAlgorithm -{ - Q_OBJECT -public: - BioTrackerTrackingAlgorithm(IModel* parameter, IModel* trajectory); - ~BioTrackerTrackingAlgorithm(); - -Q_SIGNALS: - void emitCvMatA(std::shared_ptr image, QString name); - void emitDimensionUpdate(int x, int y); - void emitTrackingDone(uint framenumber); - - // ITrackingAlgorithm interface -public Q_SLOTS: - void doTracking(std::shared_ptr image, uint framenumber) override; - void receiveAreaDescriptorUpdate(IModelAreaDescriptor *areaDescr); - void receiveParametersChanged(); - -private: - void refreshPolygon(); - void sendSelectedImage(std::map>* images); - - void resetFishHistory(int noFish); - - TrackedTrajectory* _TrackedTrajectoryMajor; - TrackerParameter* _TrackingParameter; - IModelAreaDescriptor* _AreaInfo; - - int _imageX; - int _imageY; - - std::shared_ptr _lastImage; - uint _lastFramenumber; -}; - -#endif // BIOTRACKERTRACKINGALGORITHM_H diff --git a/BioTracker/Plugin/LukasKanade/Model/ParamNames.h b/BioTracker/Plugin/LukasKanade/Model/ParamNames.h deleted file mode 100644 index 102b4752..00000000 --- a/BioTracker/Plugin/LukasKanade/Model/ParamNames.h +++ /dev/null @@ -1,60 +0,0 @@ -#pragma once - -#include -#include - -namespace LUKASKANADE { - - namespace CONFIGPARAM - { - // System config - const std::string CONFIG_INI_FILE = "./LKTrackerConfig.ini"; - } - - namespace APPLICATIONPARAM - { - // System config - const std::string APP_VERSION = "APPLICATIONPARAM/APP_VERSION"; - } - - namespace TRACKERPARAM - { - const std::string WNDSIZE = "TRACKERPARAM/WNDSIZE"; - - } - - namespace GUIPARAM - { - // FPS label - const std::string ENABLE_LABEL_FPS = "GUIPARAM/ENABLE_LABEL_FPS"; - // Fish id label - const std::string ENABLE_LABEL_FISH_ID = "GUIPARAM/ENABLE_LABEL_FISH_ID"; - // Replica marker - const std::string ENABLE_LABEL_REPLICA = "GUIPARAM/ENABLE_LABEL_REPLICA"; - // Fish position - const std::string ENABLE_LABEL_FISH_POS = "GUIPARAM/ENABLE_LABEL_FISH_POS"; - // Fish orientation - const std::string ENABLE_LABEL_FISH_ORI = "GUIPARAM/ENABLE_LABEL_FISH_ORI"; - // Fish history - const std::string ENABLE_LABEL_FISH_HISTORY = "GUIPARAM/ENABLE_LABEL_FISH_HISTORY"; - // Blobs - const std::string ENABLE_SHOW_BLOBS = "GUIPARAM/ENABLE_SHOW_BLOBS"; - // Swap fish id - const std::string ENABLE_SWAP_FISH_ID = "GUIPARAM/ENABLE_SWAP_FISH_ID"; - - // Core view of tracked components - const std::string ENABLE_CORE_COMPONENT_VIEW = "GUIPARAM/ENABLE_CORE_COMPONENT_VIEW"; - // Move components in core view - const std::string ENABLE_CORE_COMPONENT_MOVE = "GUIPARAM/ENABLE_CORE_COMPONENT_MOVE"; - // Remove components in core view - const std::string ENABLE_CORE_COMPONENT_REMOVE = "GUIPARAM/ENABLE_CORE_COMPONENT_REMOVE"; - // Swap component id in core view - const std::string ENABLE_CORE_COMPONENT_ID_SWAP = "GUIPARAM/ENABLE_CORE_COMPONENT_ID_SWAP"; - // Add component in core view - const std::string ENABLE_CORE_COMPONENT_ADD = "GUIPARAM/ENABLE_CORE_COMPONENT_ADD"; - // Rotate component in core view - const std::string ENABLE_CORE_COMPONENT_ROTATE = "GUIPARAM/ENABLE_CORE_COMPONENT_ROTATE"; - } - -} - diff --git a/BioTracker/Plugin/LukasKanade/Model/TrackerParameter.cpp b/BioTracker/Plugin/LukasKanade/Model/TrackerParameter.cpp deleted file mode 100644 index 41eda3e3..00000000 --- a/BioTracker/Plugin/LukasKanade/Model/TrackerParameter.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "TrackerParameter.h" -#include "util/singleton.h" -#include "Model/ParamNames.h" - -TrackerParameter::TrackerParameter(QObject *parent) : - IModel(parent) -{ - _settings = BioTracker::Util::TypedSingleton::getInstance(LUKASKANADE::CONFIGPARAM::CONFIG_INI_FILE); - //_settings = new BioTracker::Core::Settings(CONFIGPARAM::CONFIG_INI_FILE); - - m_wndSize = _settings->getValueOrDefault(LUKASKANADE::TRACKERPARAM::WNDSIZE, 31); - - - Q_EMIT notifyView(); -} diff --git a/BioTracker/Plugin/LukasKanade/Model/TrackerParameter.h b/BioTracker/Plugin/LukasKanade/Model/TrackerParameter.h deleted file mode 100644 index ebf1f600..00000000 --- a/BioTracker/Plugin/LukasKanade/Model/TrackerParameter.h +++ /dev/null @@ -1,40 +0,0 @@ -#ifndef TRACKERPARAMETER_H -#define TRACKERPARAMETER_H - - -#include "Interfaces/IModel/IModel.h" -#include "settings/Settings.h" -#include "Model/ParamNames.h" - -class TrackerParameter : public IModel -{ - Q_OBJECT -public: - TrackerParameter(QObject *parent = 0); - - BioTracker::Core::Settings *getSettings() { return _settings; }; - - int getWndSize() { return m_wndSize; }; - void setWndSize(int x) { - m_wndSize = x; - Q_EMIT notifyView(); - }; - - void setAll( - int wndSize) - { - m_wndSize = wndSize; - _settings->setParam(LUKASKANADE::TRACKERPARAM::WNDSIZE, wndSize); - Q_EMIT notifyView(); - }; - - - -private: - BioTracker::Core::Settings *_settings; - - int m_wndSize; - -}; - -#endif // TRACKERPARAMETER_H diff --git a/BioTracker/Plugin/LukasKanade/Model/null_Model.cpp b/BioTracker/Plugin/LukasKanade/Model/null_Model.cpp deleted file mode 100644 index db2793d0..00000000 --- a/BioTracker/Plugin/LukasKanade/Model/null_Model.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "null_Model.h" - -null_Model::null_Model() -{ - -} diff --git a/BioTracker/Plugin/LukasKanade/Model/null_Model.h b/BioTracker/Plugin/LukasKanade/Model/null_Model.h deleted file mode 100644 index 8dabf466..00000000 --- a/BioTracker/Plugin/LukasKanade/Model/null_Model.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef NULL_MODEL_H -#define NULL_MODEL_H - -#include "Interfaces/IModel/IModel.h" - -class null_Model : public IModel -{ - Q_OBJECT -public: - null_Model(); -}; - -#endif // NULL_MODEL_H diff --git a/BioTracker/Plugin/LukasKanade/PluginContext.cpp b/BioTracker/Plugin/LukasKanade/PluginContext.cpp deleted file mode 100644 index 52fea1ff..00000000 --- a/BioTracker/Plugin/LukasKanade/PluginContext.cpp +++ /dev/null @@ -1,34 +0,0 @@ -#include "PluginContext.h" - -#include "Controller/ControllerTrackingAlgorithm.h" -#include "Controller/ControllerTrackedComponent.h" - -PluginContext::PluginContext(QObject *parent) : - IBioTrackerContext(parent) -{ - QPointer< IController > ComponentController = new ControllerTrackedComponent(this, this, ENUMS::CONTROLLERTYPE::COMPONENT); - QPointer< IController > TrackingController = new ControllerTrackingAlgorithm(this, this, ENUMS::CONTROLLERTYPE::TRACKING); - - m_ControllersMap.insert(ENUMS::CONTROLLERTYPE::COMPONENT, ComponentController); - m_ControllersMap.insert(ENUMS::CONTROLLERTYPE::TRACKING, TrackingController); -} - -void PluginContext::createAppController() -{ - QMap::iterator i; - for (i = m_ControllersMap.begin(); i != m_ControllersMap.end(); ++i) - { - i.value()->createComponents(); - } -} - -void PluginContext::connectController() -{ - QMap::iterator i; - for (i = m_ControllersMap.begin(); i != m_ControllersMap.end(); ++i) - { - i.value()->connectComponents(); - } -} - - diff --git a/BioTracker/Plugin/LukasKanade/PluginContext.h b/BioTracker/Plugin/LukasKanade/PluginContext.h deleted file mode 100644 index aab040e7..00000000 --- a/BioTracker/Plugin/LukasKanade/PluginContext.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once -#include "Interfaces/IBioTrackerContext.h" -#include "Interfaces/IController/IController.h" - -class PluginContext : public IBioTrackerContext -{ - Q_OBJECT - -public: - PluginContext(QObject *parent = 0); - - // IBioTrackerContext interface -protected: - void createAppController() override; - void connectController() override; -}; - diff --git a/BioTracker/Plugin/LukasKanade/View/TrackedElementView.cpp b/BioTracker/Plugin/LukasKanade/View/TrackedElementView.cpp deleted file mode 100644 index 9f120c73..00000000 --- a/BioTracker/Plugin/LukasKanade/View/TrackedElementView.cpp +++ /dev/null @@ -1,45 +0,0 @@ -#include "TrackedElementView.h" -#include "TrackedComponents/TrackedElement.h" -#include "TrackedComponents/TrackedTrajectory.h" -#include "QBrush" -#include "QPainter" -#include "QGraphicsScene" -#include -#include "settings/Settings.h" -#include "Model/ParamNames.h" -#include "util/misc.h" - -class QGraphicsSceneHoverEvent; - -TrackedElementView::TrackedElementView(QGraphicsItem *parent, IController *controller, IModel *model) : - IViewTrackedComponent(parent, controller, model) -{ - TrackedElement *elem = dynamic_cast(getModel()); - _boundingRect = QRectF(0,0, 100, 100); -} - -void TrackedElementView::rcvDimensionUpdate(int x, int y) { - _boundingRect = QRectF(0, 0, x, y); - update(); -} - -QRectF TrackedElementView::boundingRect() const -{ - - return _boundingRect; -} - - -void TrackedElementView::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) -{ - QGraphicsScene *scene = this->scene(); - - //Dev note: You could do some meaningful drawing here. - //So far, the core does everything we need. -} - -void TrackedElementView::getNotified() -{ - update(); -} - diff --git a/BioTracker/Plugin/LukasKanade/View/TrackedElementView.h b/BioTracker/Plugin/LukasKanade/View/TrackedElementView.h deleted file mode 100644 index 420fd769..00000000 --- a/BioTracker/Plugin/LukasKanade/View/TrackedElementView.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef TRACKEDELEMENTVIEW_H -#define TRACKEDELEMENTVIEW_H - -#include "Interfaces/IView/IViewTrackedComponent.h" - -/** - * This class is an example of how a TrackedElementView could be visualized. - * This class inherits from the IViewTrackedComponent class and is therefor part of the Composite Pattern. - */ -class TrackedElementView : public IViewTrackedComponent -{ - Q_OBJECT -public: - TrackedElementView(QGraphicsItem *parent = 0, IController *controller = 0, IModel *model = 0); - - // QGraphicsItem interface -public: - QRectF boundingRect() const override; - void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; - - // IViewTrackedComponent interface -public Q_SLOTS: - void getNotified() override; - void rcvDimensionUpdate(int x, int y); - -public Q_SIGNAL: - void emitUpdateCornersChanged(int id, int relX, int relY); - -private: - QRectF _boundingRect; - -}; - -#endif // TRACKEDELEMENTVIEW_H diff --git a/BioTracker/Plugin/LukasKanade/View/TrackerParameterView.cpp b/BioTracker/Plugin/LukasKanade/View/TrackerParameterView.cpp deleted file mode 100644 index 5a78eceb..00000000 --- a/BioTracker/Plugin/LukasKanade/View/TrackerParameterView.cpp +++ /dev/null @@ -1,38 +0,0 @@ -#include "TrackerParameterView.h" -#include "ui_TrackerParameterView.h" - -#include - -TrackerParameterView::TrackerParameterView(QWidget *parent, IController *controller, IModel *model) : - IViewWidget(parent, controller, model), - ui(new Ui::TrackerParameterView) -{ - ui->setupUi(this); - - QObject::connect(ui->lineEdit_wndSize, SIGNAL(valueChanged(int)), this, SLOT(on_pushButton_clicked())); - getNotified(); -} - -TrackerParameterView::~TrackerParameterView() -{ - delete ui; -} - -void TrackerParameterView::on_pushButton_clicked() -{ - TrackerParameter *parameter = qobject_cast(getModel()); - - int setWndSize = ui->lineEdit_wndSize->text().toInt(); - - parameter->setAll(setWndSize); - - Q_EMIT parametersChanged(); -} - -void TrackerParameterView::getNotified() -{ - TrackerParameter *parameter = qobject_cast(getModel()); - - int val = parameter->getWndSize(); - ui->lineEdit_wndSize->setValue(val); -} diff --git a/BioTracker/Plugin/LukasKanade/View/TrackerParameterView.h b/BioTracker/Plugin/LukasKanade/View/TrackerParameterView.h deleted file mode 100644 index 427f2542..00000000 --- a/BioTracker/Plugin/LukasKanade/View/TrackerParameterView.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef TRACKERPARAMETERVIEW_H -#define TRACKERPARAMETERVIEW_H - -#include "Interfaces/IView/IViewWidget.h" -#include "Model/TrackerParameter.h" - -namespace Ui { - class TrackerParameterView; -} - -class TrackerParameterView : public IViewWidget -{ - Q_OBJECT - -public: - explicit TrackerParameterView(QWidget *parent = 0, IController *controller = 0, IModel *model = 0); - ~TrackerParameterView(); - -private slots: - void on_pushButton_clicked(); - - -public: - signals: - void trackingAreaType(int v); - void parametersChanged(); - -private: - Ui::TrackerParameterView *ui; - - // IViewWidget interface -public slots: - - void getNotified(); -}; - -#endif // TRACKERPARAMETERVIEW_H diff --git a/BioTracker/Plugin/LukasKanade/View/TrackerParameterView.ui b/BioTracker/Plugin/LukasKanade/View/TrackerParameterView.ui deleted file mode 100644 index fc761172..00000000 --- a/BioTracker/Plugin/LukasKanade/View/TrackerParameterView.ui +++ /dev/null @@ -1,169 +0,0 @@ - - - TrackerParameterView - - - - 0 - 0 - 304 - 481 - - - - Form - - - false - - - - 6 - - - 0 - - - 9 - - - 0 - - - 0 - - - - - false - - - Qt::ScrollBarAsNeeded - - - Qt::ScrollBarAsNeeded - - - true - - - - - 0 - 0 - 302 - 470 - - - - - 9 - - - 0 - - - - - - - - - Window size - - - - - - - Set the window size - - - 3 - - - 255 - - - 2 - - - 17 - - - - - - - - - - - Iteration count - - - - - - - - - - - - - - Accuracy (eps) - - - - - - - - - - - - - - the algorithm calculates the minimum eigen value of a 2x2 normal matrix of optical flow equations (this matrix is called a spatial gradient matrix in [Bouguet00]), divided by number of pixels in a window; if this value is less than minEigThreshold, then a corresponding feature is filtered out and its flow is not processed, so it allows to remove bad points and get a performance boost. - - - minEigThreshold - - - - - - - the algorithm calculates the minimum eigen value of a 2x2 normal matrix of optical flow equations (this matrix is called a spatial gradient matrix in [Bouguet00]), divided by number of pixels in a window; if this value is less than minEigThreshold, then a corresponding feature is filtered out and its flow is not processed, so it allows to remove bad points and get a performance boost. - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - - - - diff --git a/BioTracker/Plugin/LukasKanade/biotrackerplugin_global.h b/BioTracker/Plugin/LukasKanade/biotrackerplugin_global.h deleted file mode 100644 index 770f7d21..00000000 --- a/BioTracker/Plugin/LukasKanade/biotrackerplugin_global.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef BIOTRACKERPLUGIN_GLOBAL_H -#define BIOTRACKERPLUGIN_GLOBAL_H - -#include - -#if defined(BIOTRACKERPLUGIN_LIBRARY) -# define BIOTRACKERPLUGINSHARED_EXPORT Q_DECL_EXPORT -#else -# define BIOTRACKERPLUGINSHARED_EXPORT Q_DECL_IMPORT -#endif - -#endif // BIOTRACKERPLUGIN_GLOBAL_H diff --git a/BioTracker/Utils/BioTrackerUtils/BioTrackerUtils.pro b/BioTracker/Utils/BioTrackerUtils/BioTrackerUtils.pro deleted file mode 100644 index 6f612020..00000000 --- a/BioTracker/Utils/BioTrackerUtils/BioTrackerUtils.pro +++ /dev/null @@ -1,58 +0,0 @@ -#------------------------------------------------- -# -# Project created by QtCreator 2016-12-08T10:23:47 -# -#------------------------------------------------- - -QT += widgets -QT += opengl - -TARGET = BioTrackerUtils -TEMPLATE = lib -CONFIG += staticlib - -INCLUDEPATH += /usr/local/include/opencv -LIBS += -L/usr/local/lib \ --lopencv_core \ --lopencv_imgproc \ --lopencv_highgui \ --lopencv_ml \ --lopencv_video \ --lopencv_features2d \ --lopencv_calib3d \ --lopencv_objdetect \ --lopencv_contrib \ --lopencv_legacy \ --lopencv_flann - - -SOURCES += \ - src/settings/Settings.cpp \ - src/settings/StringTranslator.cpp \ - src/settings/SystemCompatibilityCheck.cpp \ - src/util/imagePreProcessor/ImagePreProcessor.cpp \ - src/util/CvHelper.cpp \ - src/util/stringTools.cpp - -HEADERS += \ - settings/Messages.h \ - settings/ParamNames.h \ - settings/Settings.h \ - settings/StringTranslator.h \ - settings/SystemCompatibilityCheck.h \ - util/imagePreProcessor/IImageProcessor.h \ - util/imagePreProcessor/ImagePreProcessor.h \ - util/CvHelper.h \ - util/MutexWrapper.h \ - util/platform.h \ - util/QtRaiiWrapper.hpp \ - util/ScreenHelper.h \ - util/singleton.h \ - util/stdext.h \ - util/stringTools.h \ - Exceptions.h \ - PanZoomState.h -unix { - target.path = /usr/lib - INSTALLS += target -} diff --git a/BioTracker/Utils/BioTrackerUtils/CMakeCommon/CMakeVSSugar.txt b/BioTracker/Utils/BioTrackerUtils/CMakeCommon/CMakeVSSugar.txt deleted file mode 100644 index 7067153f..00000000 --- a/BioTracker/Utils/BioTrackerUtils/CMakeCommon/CMakeVSSugar.txt +++ /dev/null @@ -1,15 +0,0 @@ -set(_util_src_root_path ${CMAKE_CURRENT_SOURCE_DIR}) -file( - GLOB_RECURSE _util_source_list - LIST_DIRECTORIES false - "${_util_src_root_path}/*.c*" - "${_util_src_root_path}/*.h*" - "${_util_src_root_path}/*.ui*" -) - -foreach(_util_source IN ITEMS ${_util_source_list}) - get_filename_component(_util_source_path "${_util_source}" PATH) - file(RELATIVE_PATH _util_source_path_rel "${_util_src_root_path}" "${_util_source_path}") - string(REPLACE "/" "\\" _util_group_path "${_util_source_path_rel}") - source_group("${_util_group_path}" FILES "${_util_source}") -endforeach() \ No newline at end of file diff --git a/BioTracker/Utils/BioTrackerUtils/CMakeLists.txt b/BioTracker/Utils/BioTrackerUtils/CMakeLists.txt deleted file mode 100644 index 2e293e1a..00000000 --- a/BioTracker/Utils/BioTrackerUtils/CMakeLists.txt +++ /dev/null @@ -1,24 +0,0 @@ -############################################################## -#### Biotracker: Utility -############################################################## - -# Visual studio out-of-source friendly source groups -include(CMakeCommon/CMakeVSSugar.txt) - -set(util_cmakes "${CMAKE_CURRENT_SOURCE_DIR}/CMakeCommon/" CACHE INTERNAL "util_cmakes") - -message("Configuring Biotracker_utility...") -set(EXE_NAME Biotracker_utility) -add_library(${EXE_NAME} STATIC ${_util_source_list} ) -target_link_libraries(${EXE_NAME} Biotracker_interfaces) -target_link_libraries(${EXE_NAME} ${OpenCV_LIBRARIES} ${Boost_LIBRARIES}) -target_link_libraries(${EXE_NAME} Qt5::Core Qt5::Gui Qt5::Xml Qt5::Network Qt5::Widgets) -include_directories(${Boost_INCLUDE_DIRS}) -target_include_directories(${EXE_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) - -set_target_properties(${EXE_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON) -set_target_properties(${EXE_NAME} PROPERTIES - CXX_STANDARD 17 - CXX_STANDARD_REQUIRED YES - CXX_EXTENSIONS NO -) \ No newline at end of file diff --git a/BioTracker/Utils/BioTrackerUtils/TrackedComponents/TrackedComponentFactory.cpp b/BioTracker/Utils/BioTrackerUtils/TrackedComponents/TrackedComponentFactory.cpp deleted file mode 100644 index f0641538..00000000 --- a/BioTracker/Utils/BioTrackerUtils/TrackedComponents/TrackedComponentFactory.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include "TrackedComponentFactory.h" - -#include "TrackedTrajectory.h" -#include "TrackedElement.h" - -TrackedComponentFactory::TrackedComponentFactory() -{ - -} - -TrackedComponentFactory::~TrackedComponentFactory() -{ - -} - -QList TrackedComponentFactory::getElementTypes() { - return QList{ "TrackedElement" }; -} - -IModelTrackedComponent *TrackedComponentFactory::createTrackedElement(QString name) -{ - return new TrackedElement(this, "n.a."); -} - -IModelTrackedComponent *TrackedComponentFactory::createTrackedObject(QString name) -{ - TrackedTrajectory *t = new TrackedTrajectory(); - TrackedElement *e = new TrackedElement(this, "n.a.", 0); - t->add(e, 0); - return t; -} - -IModelTrackedComponent *TrackedComponentFactory::createTrackedTrajectory(QString name) -{ - return new TrackedTrajectory(); -} diff --git a/BioTracker/Utils/BioTrackerUtils/TrackedComponents/TrackedComponentFactory.h b/BioTracker/Utils/BioTrackerUtils/TrackedComponents/TrackedComponentFactory.h deleted file mode 100644 index 70b0d8ee..00000000 --- a/BioTracker/Utils/BioTrackerUtils/TrackedComponents/TrackedComponentFactory.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef TRACKEDCOMPONENTFACTORY_H -#define TRACKEDCOMPONENTFACTORY_H - -#include "Interfaces/IModel/IModelTrackedComponentFactory.h" - -class TrackedComponentFactory : public IModelTrackedComponentFactory -{ - Q_OBJECT -public: - TrackedComponentFactory(); - ~TrackedComponentFactory(); - - QList getElementTypes() override; - // ITrackedComponentFactory interface -protected: - IModelTrackedComponent *createTrackedElement(QString name) override; - IModelTrackedComponent *createTrackedObject(QString name) override; - IModelTrackedComponent *createTrackedTrajectory(QString name) override; -}; - -#endif // TRACKEDOBJECTFACTORY_H diff --git a/BioTracker/Utils/BioTrackerUtils/TrackedComponents/TrackedElement.cpp b/BioTracker/Utils/BioTrackerUtils/TrackedComponents/TrackedElement.cpp deleted file mode 100644 index 9d7d35f0..00000000 --- a/BioTracker/Utils/BioTrackerUtils/TrackedComponents/TrackedElement.cpp +++ /dev/null @@ -1,65 +0,0 @@ -#include "TrackedElement.h" -#include "QDebug" -#include "QRect" -#include "QBrush" -#include "QPainter" - -TrackedElement::TrackedElement(QObject *parent, QString name, int id) : - IModelTrackedPoint(parent), - _name(name), - _id(id) -{ - _x = 0; - _y = 0; - _valid = false; - _fixed = false; -} - -QString TrackedElement::getName() -{ - return _name; -} - -void TrackedElement::setPoint(cv::Point2f p) -{ - _x = p.x; - _y = p.y; - _valid = true; - Q_EMIT notifyView(); -} - -cv::Point2f TrackedElement::getPoint() -{ - return cv::Point2f(_x, _y); -} - -void TrackedElement::setX(float val) { - _x = val; -}; - -void TrackedElement::setY(float val) { - _y = val; -}; - -float TrackedElement::getX() { - return _x; -} - -float TrackedElement::getY() { - return _y; -} - -float TrackedElement::getXpx() { - return _x; -} - -float TrackedElement::getYpx() { - return _y; -} - -void TrackedElement::operate() -{ - qDebug() << "I am TrackedElement " << _name; -} - - diff --git a/BioTracker/Utils/BioTrackerUtils/TrackedComponents/TrackedElement.h b/BioTracker/Utils/BioTrackerUtils/TrackedComponents/TrackedElement.h deleted file mode 100644 index fa8b9f9f..00000000 --- a/BioTracker/Utils/BioTrackerUtils/TrackedComponents/TrackedElement.h +++ /dev/null @@ -1,107 +0,0 @@ -#ifndef TRACKEDELEMENT_H -#define TRACKEDELEMENT_H - -#include "QGraphicsItem" -#include "Interfaces/IModel/IModelTrackedComponent.h" -#include "QString" -#include -#include -#include - -/** -* This class is an example of how a TrackedComponent could be defined. -* This class inherits from the IModelTrackedComponent class and is therefor part of the Composite Pattern. -* This class represents the Leaf class in the Composite Pattern. -* Objects of this class have a QObject as parent. -*/ -class TrackedElement : public IModelTrackedPoint -{ - Q_OBJECT - -public: - TrackedElement(QObject *parent = 0, QString name = "n.a.", int id = 0); - - QString getName(); - QString getCoordinateUnit() override { return "px"; }; - - void setX(float val); - void setY(float val); - void setW(float w) {}; - void setH(float h) {}; - void setXpx(float val) {}; - void setYpx(float val) {}; - void setWpx(float w) {}; - void setHpx(float h) {}; - void setRad(float r) {}; - void setDeg(float d) {}; - void setId(int val) { _id = val; }; - void setTime(std::chrono::system_clock::time_point t) { - _timeSysclck = t; - }; - void setTime(qint64 t) { - _time = t; - std::string::size_type sz = 0; - long long ll = t / 1000; - std::time_t tm(ll); - _timeSysclck = std::chrono::system_clock::from_time_t(tm); - }; - void setTimeString(QString t) { _timeString = t; }; - void setValid(bool v) { _valid = v; }; - void setFixed(bool f) { _fixed = f; }; - - float getX(); - float getY(); - float getXpx(); - float getYpx(); - float getW() { return 0; }; - float getH() { return 0; }; - float getWpx() { return 0; }; - float getHpx() { return 0; }; - float getRad() { return 0; }; - float getDeg() { return 0; }; - int getId() { return _id; }; - qint64 getTime() { - qint64 q(std::chrono::duration_cast(_timeSysclck.time_since_epoch()).count()); - return q; - }; - QString getTimeString() { - std::time_t t = std::chrono::system_clock::to_time_t(_timeSysclck); - QDateTime dt; - dt.setTime_t(t); - _timeString = dt.toString(); - return _timeString; - }; - bool getValid() { return _valid; }; - bool getFixed() { return _fixed; }; - - bool hasX() { return true; }; - bool hasY() { return true; }; - bool hasW() { return false; }; - bool hasH() { return false; }; - bool hasXpx() { return false; }; - bool hasYpx() { return false; }; - bool hasWpx() { return false; }; - bool hasHpx() { return false; }; - bool hasRad() { return false; }; - bool hasDeg() { return false; }; - bool hasTime() { return true; }; - bool hasTimeString() { return true; }; - - void setPoint(cv::Point2f p); - cv::Point2f getPoint(); - - // ITrackedPoint interface -public: - void operate(); - -private: - std::chrono::system_clock::time_point _timeSysclck; - QString _name; - float _x; - float _y; - int _id; - bool _valid; - bool _fixed; -}; - -#endif // TRACKEDELEMENT_H diff --git a/BioTracker/Utils/BioTrackerUtils/TrackedComponents/TrackedTrajectory.cpp b/BioTracker/Utils/BioTrackerUtils/TrackedComponents/TrackedTrajectory.cpp deleted file mode 100644 index bb118ebd..00000000 --- a/BioTracker/Utils/BioTrackerUtils/TrackedComponents/TrackedTrajectory.cpp +++ /dev/null @@ -1,91 +0,0 @@ -#include "TrackedTrajectory.h" -#include "QDebug" -#include "TrackedElement.h" - -TrackedTrajectory::TrackedTrajectory(QObject *parent, QString name) : - IModelTrackedTrajectory(parent), - name(name) -{ - setFixed(false); - setValid(true); -} - -void TrackedTrajectory::operate() -{ - qDebug() << "Printing all TrackedElements in TrackedObject " << name; - qDebug() << "========================= Begin =========================="; - for (int i = 0; i < _TrackedComponents.size(); ++i) { - dynamic_cast(_TrackedComponents.at(i))->operate(); - } - qDebug() << "======================== End ========================="; -} - -void TrackedTrajectory::add(IModelTrackedComponent *comp, int pos) -{ - if (pos < 0) { - _TrackedComponents.append(comp); - } - else if (_TrackedComponents.size() <= pos) { - while (_TrackedComponents.size() < pos) - _TrackedComponents.append(0); - - _TrackedComponents.append(comp); - } - else { - _TrackedComponents[pos] = comp; - } -} - -bool TrackedTrajectory::remove(IModelTrackedComponent *comp) -{ - return _TrackedComponents.removeOne(comp); //Do not actually remove, just invalidate / replace by dummy -} - -void TrackedTrajectory::clear() -{ - foreach(IModelTrackedComponent* el, _TrackedComponents) { - if (dynamic_cast(el)) - dynamic_cast(el)->clear(); - } - _TrackedComponents.clear(); -} - -IModelTrackedComponent* TrackedTrajectory::getChild(int index) -{ - return (_TrackedComponents.size() > index ? _TrackedComponents.at(index) : nullptr); -} - -IModelTrackedComponent* TrackedTrajectory::getLastChild() -{ - return _TrackedComponents.at(_TrackedComponents.size()-1); -} - -IModelTrackedComponent* TrackedTrajectory::getValidChild(int index) -{ - int c = 0; - foreach(IModelTrackedComponent* el, _TrackedComponents) { - if (el) { - if (c == index && el->getValid()) - return el; - c += el->getValid() ? 1 : 0; - } - } - - return nullptr; -} - -int TrackedTrajectory::size() -{ - return _TrackedComponents.size(); -} - -int TrackedTrajectory::validCount() -{ - int c = 0; - foreach(IModelTrackedComponent* el, _TrackedComponents){ - if (el) - c += el->getValid() ? 1 : 0; - } - - return c; -} diff --git a/BioTracker/Utils/BioTrackerUtils/TrackedComponents/TrackedTrajectory.h b/BioTracker/Utils/BioTrackerUtils/TrackedComponents/TrackedTrajectory.h deleted file mode 100644 index 11710c76..00000000 --- a/BioTracker/Utils/BioTrackerUtils/TrackedComponents/TrackedTrajectory.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef TRACKEDOTRAJECTORY_H -#define TRACKEDOTRAJECTORY_H - -#include "Interfaces/IModel/IModelTrackedTrajectory.h" -#include "QList" -#include "QString" - -/** - * This class inherits from the IModelTrackedTrajectory class and is therefor part of the Composite Pattern. - * This class represents the Composite class. - * This class is responsibility for the handling of Leaf objects. - * Internaly this class uses a QList for storing Leaf object. - * - * Objects of this class have a QObject as parent. - */ -class TrackedTrajectory : public IModelTrackedTrajectory { - Q_OBJECT - - public: - TrackedTrajectory(QObject *parent = 0, QString name = "n.a."); - - // ITrackedComponent interface -public: - void operate(); - - // ITrackedObject interface -public: - void add(IModelTrackedComponent *comp, int pos = -1) override; - bool remove(IModelTrackedComponent *comp) override; - void clear() override; - IModelTrackedComponent *getChild(int index) override; - IModelTrackedComponent *getValidChild(int index) override; - IModelTrackedComponent *getLastChild() override; - - int size() override; - int validCount(); - -private: - QList _TrackedComponents; - - QString name; -}; - -#endif // TRACKEDOTRAJECTORY_H diff --git a/BioTracker/Utils/BioTrackerUtils/settings/ParamNames.h b/BioTracker/Utils/BioTrackerUtils/settings/ParamNames.h deleted file mode 100644 index 72b2d583..00000000 --- a/BioTracker/Utils/BioTrackerUtils/settings/ParamNames.h +++ /dev/null @@ -1,92 +0,0 @@ -#pragma once - -#include // std::string - -#include - -#include -#include - -namespace ConfigParam { -static const boost::filesystem::path CONFIG_PATH = boost::filesystem::path( - QDir::toNativeSeparators( - QStandardPaths::writableLocation(QStandardPaths::ConfigLocation)).toStdString()); -static const boost::filesystem::path BASE_PATH = CONFIG_PATH / "BioTracker"; -static const boost::filesystem::path CONFIGURATION_FILE = BASE_PATH / "config.json"; -static const boost::filesystem::path GEOMETRY_FILE = BASE_PATH / "geometry.cfg"; -static const boost::filesystem::path STATE_FILE = BASE_PATH / "state.cfg"; -static const boost::filesystem::path MODULE_PATH = BASE_PATH / "modules"; -} - -namespace TrackerParam { -static const std::string TRACKING_ENABLED = "TRACKERPARAM.TRACKING_ENABLED"; - -static const std::string SELECTED_TRACKER = "TRACKERPARAM.SELECTED_TRACKER"; -} - -namespace GuiParam { -enum class MediaType : uint8_t { - NoMedia = 0, - Video, - Images, - Camera -}; - -enum class VideoMode : uint8_t { - Playing = 0, - Paused, - Stopped, - Init -}; - - -static const std::string MEDIA_TYPE = "GUIPARAM.MEDIA_TYPE"; -static const std::string SHORTCUT_PLAY = "GUIPARAM.SHORTCUT_PLAY"; -static const std::string SHORTCUT_NEXT = "GUIPARAM.SHORTCUT_NEXT"; -static const std::string SHORTCUT_PREV = "GUIPARAM.SHORTCUT_PREV"; -static const std::string SHORTCUT_ZOOM = "GUIPARAM.SHORTCUT_ZOOM"; -static const std::string SHORTCUT_TRACKING = "GUIPARAM.SHORTCUT_TRACKING"; - -static const std::string PAUSED_AT_FRAME = "GUIPARAM.PAUSED_AT_FRAME"; -} - -namespace PictureParam { -//path to picture -static const std::string PICTURE_FILES = "PICTUREPARAM.PICTURE_FILES"; -} - -namespace CaptureParam { -// Video path -static const std::string CAP_VIDEO_FILE = "CAPTUREPARAM.CAP_VIDEO_FILE"; -static const std::string CAP_SCREENSHOT_PATH = - "CAPTUREPARAM.CAP_SCREENSHOT_PATH"; -static const std::string CAP_CAMERA_ID = "CAPTUREPARAM.CAP_CAMERA_ID"; - -// Video paths -static const std::string ENABLE_RECORD_RAW = - "CAPTUREPARAM.ENABLE_RECORD_RAW"; -static const std::string ENABLE_RECORD_TRACKING = - "CAPTUREPARAM.ENABLE_RECORD_TRACKING"; -static const std::string ENABLE_RECORD_TRACK_INFO = - "CAPTUREPARAM.ENABLE_RECORD_TRACK_INFO"; - -static const std::string RECORDING_TRACKING_PATH = - "CAPTUREPARAM.RECORDING_TRACKING_PATH"; -static const std::string RECORDING_RAW_PATH = - "CAPTUREPARAM.RECORDING_RAW_PATH"; -static const std::string TRACKING_INFO_OUTPUT_PATH = - "CAPTUREPARAM.TRACKING_INFO_OUTPUT_PATH"; - -enum CAP_TYPE_ENUM { - CAP_FROM_CAM = 0, - CAP_FROM_FILE = 1 -}; - -enum CAP_STATE_ENUM { - CAP_FINISHED = 0, - CAP_PAUSE = 1, - CAP_AVAILABLE = 2, - CAP_EXITED = 3 -}; -} - diff --git a/BioTracker/Utils/BioTrackerUtils/settings/Settings.cpp b/BioTracker/Utils/BioTrackerUtils/settings/Settings.cpp deleted file mode 100644 index 032891d7..00000000 --- a/BioTracker/Utils/BioTrackerUtils/settings/Settings.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include "settings/Settings.h" - -#include - -#include -#include - -#include "util/Exceptions.h" -#include "settings/Messages.h" - - -namespace boost { - void throw_exception(std::exception const & e) {}; -} - -namespace BioTracker { -namespace Core { - -const boost::property_tree::ptree Settings::getDefaultParams() { - boost::property_tree::ptree pt; - - return pt; -} - -} -} diff --git a/BioTracker/Utils/BioTrackerUtils/settings/Settings.h b/BioTracker/Utils/BioTrackerUtils/settings/Settings.h deleted file mode 100644 index 3a61e29a..00000000 --- a/BioTracker/Utils/BioTrackerUtils/settings/Settings.h +++ /dev/null @@ -1,234 +0,0 @@ -#pragma once - -#include -#include - -#include -#include -#include - -#include "../util/stringTools.h" // (un)escape_non_ascii -#include "StringTranslator.h" -#include "ParamNames.h" -#include -#include "util/singleton.h" - -#define GET_CORESETTINGS BioTracker::Util::TypedSingleton::getInstance - -namespace { -template class Ref> -struct is_specialization : std::false_type {}; - -template class Ref, typename... Args> -struct is_specialization, Ref>: std::true_type {}; -} - -namespace BioTracker { -namespace Core { - -class Settings { -private: - std::string _confFile; - std::mutex _m; - std::map _dataStore; - -public: - - /* This is a singleton. Get it using something like: - * SettingsIAC *myInstance = SettingsIAC::getInstance(); - */ - Settings(std::string config) { - //_m.lock(); - //Setting default file, if unset - if (config == "") _confFile = "config.ini"; - else _confFile = config; - - std::ifstream conf(_confFile.c_str()); - if (conf.good()) - { - boost::property_tree::read_json(_confFile, _ptree); - } - else { - _ptree = getDefaultParams(); - boost::property_tree::write_json(_confFile, _ptree); - } - //_m.unlock(); - } - - void storeValue(std::string key, void* value) { - _dataStore.insert(std::pair(key, value)); - } - - void* readValue(std::string key) { - std::map::iterator it = _dataStore.find(key); - if (it != _dataStore.end()) { - return it->second; - } - return nullptr; - } - - // C++ 11 style - // ======= - Settings(Settings const&) = delete; - void operator=(Settings const&) = delete; - - /** - * Sets the parameter. - * @param paramName name of the parameter, - * @param paramValue value of the parameter, - */ - template - void setParam(std::string const ¶mName, T &¶mValue) { - //_m.lock(); - _ptree.put(paramName, preprocess_value(std::forward(paramValue))); - boost::property_tree::write_json(_confFile, _ptree); - //_m.unlock(); - } - - /** - * Sets the vector of values of a parameter. - * @param paramName name of the parameter, - * @param paramVector vector of values of the parameter, - */ - template - void setParam(std::string const ¶mName, std::vector &¶mVector) { - //_m.lock(); - boost::property_tree::ptree subtree; - for (T &value : paramVector) { - boost::property_tree::ptree valuetree; - valuetree.put("", value); - subtree.push_back(std::make_pair("", valuetree)); - } - _ptree.put_child(paramName, subtree); - boost::property_tree::write_json(_confFile, _ptree); - //_m.unlock(); - } - - /** - * Gets the parameter value provided by parameter name. - * @param paramName the parameter name, - * @return the value of the parameter as the specified type. - */ - template - typename std::enable_if::value, T>::type - getValueOfParam(const std::string ¶mName) const { - //_m.lock(); - auto a = postprocess_value(_ptree.get(paramName)); - //_m.unlock(); - return a; - } - - /** - * Gets the vector of values provided by parameter name. - * - * Throws an boost exception if parameter does not exist. - * - * @param paramName the parameter name, - * @return the vector of values of the parameter with the specified type. - */ - template - typename std::enable_if::value, T>::type - getValueOfParam(const std::string ¶mName) const { - //_m.lock(); - T result; - for (auto &item : _ptree.get_child(paramName)) { - result.push_back(postprocess_value( - item.second.get_value())); - } - //_m.unlock(); - return result; - } - - /** - * Gets either the parameter value provided by parameter name, if it - * exists, or a empty boost::optional otherwise. - * @param paramName the parameter name, - * @return the value of the parameter wrapped in a boost::optional. - */ - template - boost::optional maybeGetValueOfParam(const std::string ¶mName) { - //_m.lock(); - auto a = _ptree.get_optional(paramName); - //_m.unlock(); - return a; - } - - /** - * Gets the parameter value provided by parameter name. - * If the parameter is not set yet, set to default value and return it. - * @param paramName the parameter name, - * @param defaultValue the default parameter value, - * @return the value of the parameter as the specified type. - */ - template - T getValueOrDefault(const std::string ¶mName, const T &defaultValue) { - //_m.lock(); - boost::optional value = maybeGetValueOfParam(paramName); - T t; - if (value) { - t = value.get(); - } else { - setParam(paramName, defaultValue); - t = defaultValue; - } - //_m.unlock(); - return t; - } - - private: - boost::property_tree::ptree _ptree; - - static const boost::property_tree::ptree getDefaultParams(); - - /** - * preprocesses paramValue before it's stored in the boost config tree - * - * default implementation: forward value - * - */ - template - static T preprocess_value(T &¶mValue) { - return std::forward(paramValue); - } - - /** - * postprocesses paramValue after it's extracted from the boost config tree - * - * default implementation: forward value - * - */ - template - static T postprocess_value(T &¶mValue) { - return std::forward(paramValue); - } - -}; - -/** - * std::string specialisation as a workaround for a bug in boost's config tree - * - * this function escapes every non-ASCII character - * - * (the tree correctly escapes non-ASCII characters and stores them - * as "\u00XX" where XX is the character's hex value, but it can't read these - * values correctly) - * - */ -template<> -inline std::string Settings::preprocess_value(std::string &¶mValue) { - return Util::escape_non_ascii(paramValue); -} - -/** - * std::string specialisation as a workaround for a bug in boost's config tree - * - * (the tree converts escaped non-ASCII characters ("\u00XX") to "\xFF") - * - */ -template<> -inline std::string Settings::postprocess_value(std::string &¶mValue) { - return Util::unescape_non_ascii(paramValue); -} - -} -} diff --git a/BioTracker/Utils/BioTrackerUtils/settings/StringTranslator.cpp b/BioTracker/Utils/BioTrackerUtils/settings/StringTranslator.cpp deleted file mode 100644 index 7b91e3e3..00000000 --- a/BioTracker/Utils/BioTrackerUtils/settings/StringTranslator.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "settings/StringTranslator.h" - -namespace { -typedef GuiParam::MediaType EnumType; -} - -namespace StringTranslator { -template<> -const BiMapContainer::bm_type BiMapContainer::value = - boost::assign::list_of::bm_type::relation> - (EnumType::NoMedia, "NoMedia") - (EnumType::Images, "Images") - (EnumType::Video, "Video"); -} diff --git a/BioTracker/Utils/BioTrackerUtils/settings/StringTranslator.h b/BioTracker/Utils/BioTrackerUtils/settings/StringTranslator.h deleted file mode 100644 index 7a64c709..00000000 --- a/BioTracker/Utils/BioTrackerUtils/settings/StringTranslator.h +++ /dev/null @@ -1,53 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -#include "ParamNames.h" - -namespace StringTranslator { - -template -struct BiMapContainer { - typedef boost::bimap bm_type; - typename bm_type::relation bm_relation; - static const bm_type value; -}; - -// enables conversion from/to an arbitrary type and an std::string by using -// a boost::bimap. Requires a template specialization of BiMapContainer with -// external_type. -template -struct StringTranslator { - typedef std::string internal_type; - typename BiMapContainer::bm_type bm_type; - - const boost::bimap bimap = - BiMapContainer::value; - - boost::optional get_value(const internal_type &internal) { - return boost::optional(bimap.right.at(internal)); - } - - boost::optional put_value(const external_type &external) { - return boost::optional(bimap.left.at(external)); - } -}; - -} - -namespace boost { -namespace property_tree { - -// template specialization for EnumTranslator for GUIPARAM::MediaType -// this allows boost::property_tree to store a string representation of -// MediaType in the settings file -template<> -struct translator_between { - typedef StringTranslator::StringTranslator type; -}; - -} -} diff --git a/BioTracker/Utils/BioTrackerUtils/settings/SystemCompatibilityCheck.cpp b/BioTracker/Utils/BioTrackerUtils/settings/SystemCompatibilityCheck.cpp deleted file mode 100644 index 4db315bf..00000000 --- a/BioTracker/Utils/BioTrackerUtils/settings/SystemCompatibilityCheck.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#include "settings/SystemCompatibilityCheck.h" - -//#include - -bool SystemCompatibilityCheck::checkOpenGLSupport() { - return true;//QGLFormat::hasOpenGL(); -} diff --git a/BioTracker/Utils/BioTrackerUtils/settings/SystemCompatibilityCheck.h b/BioTracker/Utils/BioTrackerUtils/settings/SystemCompatibilityCheck.h deleted file mode 100644 index 829f1af1..00000000 --- a/BioTracker/Utils/BioTrackerUtils/settings/SystemCompatibilityCheck.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once - -#include "util/platform.h" - -namespace SystemCompatibilityCheck { -/** - * Check the system supports openGL. - * @return true, system supports openGL, false otherwise. - */ -bool BIOTRACKER_DLLEXPORT checkOpenGLSupport(); -} - diff --git a/BioTracker/Utils/BioTrackerUtils/util/CvHelper.cpp b/BioTracker/Utils/BioTrackerUtils/util/CvHelper.cpp deleted file mode 100644 index bc0146bc..00000000 --- a/BioTracker/Utils/BioTrackerUtils/util/CvHelper.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/* - * CvHelper.cpp - * - * Created on: May 12, 2015 - * Author: tobias - */ - -#include "util/CvHelper.h" - -namespace BioTracker { -namespace Core { -namespace CvHelper { - -std::string cvDataType2str(int type) { - const int depth = CV_MAT_DEPTH(type); - const int cn = CV_MAT_CN(type); - std::string result = "CV_"; - - switch (depth) { - case CV_8U: - result += "8U"; - break; - case CV_8S: - result += "8S"; - break; - case CV_16U: - result += "16U"; - break; - case CV_16S: - result += "16S"; - break; - case CV_32S: - result += "32S"; - break; - case CV_32F: - result += "32F"; - break; - case CV_64F: - result += "64F"; - break; - default: - result += "UNKOWN"; - break; - } - result += "C" + std::to_string(cn); - return result; -} - -} -} -} diff --git a/BioTracker/Utils/BioTrackerUtils/util/CvHelper.h b/BioTracker/Utils/BioTrackerUtils/util/CvHelper.h deleted file mode 100644 index 606e9984..00000000 --- a/BioTracker/Utils/BioTrackerUtils/util/CvHelper.h +++ /dev/null @@ -1,71 +0,0 @@ -#pragma once - -#include // cv::Point, cv::Rect -#include // QRect -#include // QPoint -#include // std::string; std::to_string(int) - -/** - * Computer vision helper functions - */ -namespace BioTracker { -namespace Core { -namespace CvHelper { -struct cv_point_compare_less_x { - template - bool operator()(const CV_POINT &lhs, const CV_POINT &rhs) const { - return lhs.x < rhs.x; - } -}; - -struct cv_point_compare_less_y { - template - bool operator()(const CV_POINT &lhs, const CV_POINT &rhs) const { - return lhs.y < rhs.y; - } -}; - -inline cv::Rect toCv(const QRect &rect) { - return cv::Rect(rect.x(), rect.y(), rect.width(), rect.height()); -} - -inline QRect toQt(const cv::Rect &rect) { - return QRect(rect.x,rect.y,rect.width,rect.height); -} - -inline QPoint toQt(const cv::Point &point) { - return QPoint(point.x, point.y); -} - -/** - * @see: http://en.cppreference.com/w/cpp/algorithm/lexicographical_compare - */ -struct cv_vec_compare_less_lexicographically { - template - bool operator()(const CV_VEC &lhs, const CV_VEC &rhs) const { - for (int i = 0; i < CV_VEC::channels; ++i) { - if (lhs[i] < rhs[i]) { - return true; - } - if (rhs[i] < lhs[i]) { - return false; - } - } - return false; - } -}; - -/** - * converts an opencv data type value (int) to the name of the corresponding macro i.e. "CV_\d+[UFS]C\d" - * - * @see: cv::DataType::type - * - * @example: - * CvHelper::cvDataType2str( CV_8UC3 ) --> std::string( "CV_8UC3" ) - * - */ -std::string cvDataType2str(int type); - -} -} -} diff --git a/BioTracker/Utils/BioTrackerUtils/util/Exceptions.h b/BioTracker/Utils/BioTrackerUtils/util/Exceptions.h deleted file mode 100644 index d31b8df8..00000000 --- a/BioTracker/Utils/BioTrackerUtils/util/Exceptions.h +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -#include - - -namespace BioTracker { -namespace Core { - -struct video_open_error : std::invalid_argument { - using std::invalid_argument::invalid_argument; -}; - -struct file_not_found : std::invalid_argument { - using std::invalid_argument::invalid_argument; -}; - -struct directory_not_found : std::invalid_argument { - using std::invalid_argument::invalid_argument; -}; - -struct device_open_error : std::invalid_argument { - using std::invalid_argument::invalid_argument; -}; - -struct invalid_tracker_lib_error : std::invalid_argument { - using std::invalid_argument::invalid_argument; -}; - -struct path_creation_error : std::runtime_error { - using std::runtime_error::runtime_error; -}; - -} -} diff --git a/BioTracker/Utils/BioTrackerUtils/util/MutexWrapper.h b/BioTracker/Utils/BioTrackerUtils/util/MutexWrapper.h deleted file mode 100644 index 760626cd..00000000 --- a/BioTracker/Utils/BioTrackerUtils/util/MutexWrapper.h +++ /dev/null @@ -1,199 +0,0 @@ -#ifndef THREAD_SAFETY_ANALYSIS_MUTEX_H -#define THREAD_SAFETY_ANALYSIS_MUTEX_H - -#include - -// Enable thread safety attributes only with clang. -// The attributes can be safely erased when compiling with other compilers. -#if defined(__clang__) && (!defined(SWIG)) -#define THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x)) -#else -#define THREAD_ANNOTATION_ATTRIBUTE__(x) // no-op -#endif - -#define CAPABILITY(x) \ - THREAD_ANNOTATION_ATTRIBUTE__(capability(x)) - -#define SCOPED_CAPABILITY \ - THREAD_ANNOTATION_ATTRIBUTE__(scoped_lockable) - -#define GUARDED_BY(x) \ - THREAD_ANNOTATION_ATTRIBUTE__(guarded_by(x)) - -#define PT_GUARDED_BY(x) \ - THREAD_ANNOTATION_ATTRIBUTE__(pt_guarded_by(x)) - -#define ACQUIRED_BEFORE(...) \ - THREAD_ANNOTATION_ATTRIBUTE__(acquired_before(__VA_ARGS__)) - -#define ACQUIRED_AFTER(...) \ - THREAD_ANNOTATION_ATTRIBUTE__(acquired_after(__VA_ARGS__)) - -#define REQUIRES(...) \ - THREAD_ANNOTATION_ATTRIBUTE__(requires_capability(__VA_ARGS__)) - -#define REQUIRES_SHARED(...) \ - THREAD_ANNOTATION_ATTRIBUTE__(requires_shared_capability(__VA_ARGS__)) - -#define ACQUIRE(...) \ - THREAD_ANNOTATION_ATTRIBUTE__(acquire_capability(__VA_ARGS__)) - -#define ACQUIRE_SHARED(...) \ - THREAD_ANNOTATION_ATTRIBUTE__(acquire_shared_capability(__VA_ARGS__)) - -#define RELEASE(...) \ - THREAD_ANNOTATION_ATTRIBUTE__(release_capability(__VA_ARGS__)) - -#define RELEASE_SHARED(...) \ - THREAD_ANNOTATION_ATTRIBUTE__(release_shared_capability(__VA_ARGS__)) - -#define TRY_ACQUIRE(...) \ - THREAD_ANNOTATION_ATTRIBUTE__(try_acquire_capability(__VA_ARGS__)) - -#define TRY_ACQUIRE_SHARED(...) \ - THREAD_ANNOTATION_ATTRIBUTE__(try_acquire_shared_capability(__VA_ARGS__)) - -#define EXCLUDES(...) \ - THREAD_ANNOTATION_ATTRIBUTE__(locks_excluded(__VA_ARGS__)) - -#define ASSERT_CAPABILITY(x) \ - THREAD_ANNOTATION_ATTRIBUTE__(assert_capability(x)) - -#define ASSERT_SHARED_CAPABILITY(x) \ - THREAD_ANNOTATION_ATTRIBUTE__(assert_shared_capability(x)) - -#define RETURN_CAPABILITY(x) \ - THREAD_ANNOTATION_ATTRIBUTE__(lock_returned(x)) - -#define NO_THREAD_SAFETY_ANALYSIS \ - THREAD_ANNOTATION_ATTRIBUTE__(no_thread_safety_analysis) - - -// Defines an annotated interface for mutexes. -// These methods can be implemented to use any internal mutex implementation. -class CAPABILITY("mutex") Mutex { - public: - // Acquire/lock this mutex exclusively. Only one thread can have exclusive - // access at any one time. Write operations to guarded data require an - // exclusive lock. - void Lock() ACQUIRE() { - mutex.lock(); - } - - // Acquire/lock this mutex for read operations, which require only a shared - // lock. This assumes a multiple-reader, single writer semantics. Multiple - // threads may acquire the mutex simultaneously as readers, but a writer - // must wait for all of them to release the mutex before it can acquire it - // exclusively. - void ReaderLock() ACQUIRE_SHARED(); - - // Release/unlock an exclusive mutex. - void Unlock() RELEASE() { - mutex.unlock(); - } - - // Release/unlock a shared mutex. - void ReaderUnlock() RELEASE_SHARED(); - - // Try to acquire the mutex. Returns true on success, and false on failure. - bool TryLock() TRY_ACQUIRE(true) { - return mutex.try_lock(); - } - - // Try to acquire the mutex for read operations. - bool ReaderTryLock() TRY_ACQUIRE_SHARED(true); - - // Assert that this mutex is currently held by the calling thread. - void AssertHeld() ASSERT_CAPABILITY(this); - - // Assert that is mutex is currently held for read operations. - void AssertReaderHeld() ASSERT_SHARED_CAPABILITY(this); - private: - std::mutex mutex; -}; - - -// MutexLocker is an RAII class that acquires a mutex in its constructor, and -// releases it in its destructor. -class SCOPED_CAPABILITY MutexLocker { - private: - Mutex &mutex; - - public: - MutexLocker(Mutex &mu) ACQUIRE(mu) : mutex(mu) { - mutex.Lock(); - } - ~MutexLocker() RELEASE() { - mutex.Unlock(); - } -}; - - -#ifdef USE_LOCK_STYLE_THREAD_SAFETY_ATTRIBUTES -// The original version of thread safety analysis the following attribute -// definitions. These use a lock-based terminology. They are still in use -// by existing thread safety code, and will continue to be supported. - -// Deprecated. -#define PT_GUARDED_VAR \ - THREAD_ANNOTATION_ATTRIBUTE__(pt_guarded) - -// Deprecated. -#define GUARDED_VAR \ - THREAD_ANNOTATION_ATTRIBUTE__(guarded) - -// Replaced by REQUIRES -#define EXCLUSIVE_LOCKS_REQUIRED(...) \ - THREAD_ANNOTATION_ATTRIBUTE__(exclusive_locks_required(__VA_ARGS__)) - -// Replaced by REQUIRES_SHARED -#define SHARED_LOCKS_REQUIRED(...) \ - THREAD_ANNOTATION_ATTRIBUTE__(shared_locks_required(__VA_ARGS__)) - -// Replaced by CAPABILITY -#define LOCKABLE \ - THREAD_ANNOTATION_ATTRIBUTE__(lockable) - -// Replaced by SCOPED_CAPABILITY -#define SCOPED_LOCKABLE \ - THREAD_ANNOTATION_ATTRIBUTE__(scoped_lockable) - -// Replaced by ACQUIRE -#define EXCLUSIVE_LOCK_FUNCTION(...) \ - THREAD_ANNOTATION_ATTRIBUTE__(exclusive_lock_function(__VA_ARGS__)) - -// Replaced by ACQUIRE_SHARED -#define SHARED_LOCK_FUNCTION(...) \ - THREAD_ANNOTATION_ATTRIBUTE__(shared_lock_function(__VA_ARGS__)) - -// Replaced by RELEASE and RELEASE_SHARED -#define UNLOCK_FUNCTION(...) \ - THREAD_ANNOTATION_ATTRIBUTE__(unlock_function(__VA_ARGS__)) - -// Replaced by TRY_ACQUIRE -#define EXCLUSIVE_TRYLOCK_FUNCTION(...) \ - THREAD_ANNOTATION_ATTRIBUTE__(exclusive_trylock_function(__VA_ARGS__)) - -// Replaced by TRY_ACQUIRE_SHARED -#define SHARED_TRYLOCK_FUNCTION(...) \ - THREAD_ANNOTATION_ATTRIBUTE__(shared_trylock_function(__VA_ARGS__)) - -// Replaced by ASSERT_CAPABILITY -#define ASSERT_EXCLUSIVE_LOCK(...) \ - THREAD_ANNOTATION_ATTRIBUTE__(assert_exclusive_lock(__VA_ARGS__)) - -// Replaced by ASSERT_SHARED_CAPABILITY -#define ASSERT_SHARED_LOCK(...) \ - THREAD_ANNOTATION_ATTRIBUTE__(assert_shared_lock(__VA_ARGS__)) - -// Replaced by EXCLUDE_CAPABILITY. -#define LOCKS_EXCLUDED(...) \ - THREAD_ANNOTATION_ATTRIBUTE__(locks_excluded(__VA_ARGS__)) - -// Replaced by RETURN_CAPABILITY -#define LOCK_RETURNED(x) \ - THREAD_ANNOTATION_ATTRIBUTE__(lock_returned(x)) - -#endif // USE_LOCK_STYLE_THREAD_SAFETY_ATTRIBUTES - -#endif // THREAD_SAFETY_ANALYSIS_MUTEX_H diff --git a/BioTracker/Utils/BioTrackerUtils/util/PanZoomState.h b/BioTracker/Utils/BioTrackerUtils/util/PanZoomState.h deleted file mode 100644 index e273fc3d..00000000 --- a/BioTracker/Utils/BioTrackerUtils/util/PanZoomState.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once - -#include "boost/optional.hpp" - -namespace BioTracker { -namespace Core { - -/** -* @brief Used to store mouse cursor offsets while panning. -*/ -struct CurrentPanState { - QPointF lastPos; - - CurrentPanState(const QPointF lastPos) - : lastPos(lastPos) { - } -}; - -/** - * @brief Stores the current zoom and pan offsets. While panning, panState stores the last mouse cursor position. - */ -struct PanZoomState { - float zoomFactor = 0.f; - float panX = 0.f; - float panY = 0.f; - bool isChanged = false; - - boost::optional panState; -}; - -} -} diff --git a/BioTracker/Utils/BioTrackerUtils/util/QtRaiiWrapper.hpp b/BioTracker/Utils/BioTrackerUtils/util/QtRaiiWrapper.hpp deleted file mode 100644 index cc4b626f..00000000 --- a/BioTracker/Utils/BioTrackerUtils/util/QtRaiiWrapper.hpp +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once - -namespace BioTracker { -namespace Util { - -/** - * source: http://stackoverflow.com/a/28125217 - */ -template class QtRaiiWrapper : public UiClass -{ -public: - QtRaiiWrapper(ParentClass *parent) - { - this->setupUi(parent); - } -}; - -} -} diff --git a/BioTracker/Utils/BioTrackerUtils/util/ScreenHelper.h b/BioTracker/Utils/BioTrackerUtils/util/ScreenHelper.h deleted file mode 100644 index ee8496ad..00000000 --- a/BioTracker/Utils/BioTrackerUtils/util/ScreenHelper.h +++ /dev/null @@ -1,208 +0,0 @@ -#pragma once - -#include // QRect -#include // QPoint -#include "PanZoomState.h" -#include "math.h" - -/** - * Screen helper functions - */ -namespace BioTracker { -namespace Core { -namespace ScreenHelper { - -/** - * @brief calculate_viewport - * @param im_w width of the image - * @param im_h height of the image - * @param w width of the videoview - * @param h height of the videoview - * @param window OUT parameter - * @param viewport OUT parameter - */ -inline float calculate_viewport( - const int im_w, const int im_h, - const int w, const int h, - QRect &window, QRect &viewport) { - - // We use setWindow and setViewport to fit the video into the - // given video widget frame (with width "w" and height "h") - // we later need to adjust an offset caused the use of different - // dimensions for window and viewport. - const float im_wf = static_cast(im_w); - const float im_hf = static_cast(im_h); - const float w_f = static_cast(w); - const float h_f = static_cast(h); - - float ratio = 0; - int offset_top = 0; - int offset_left = 0; - - if ((im_wf/im_hf) > (w_f/h_f)) { - // image ratio is bigger (wider image than window) - ratio = im_wf / w_f; - const float px = w_f / im_wf; - const float px_im_hf = px * im_hf; - offset_top = h/2 - static_cast(px_im_hf / 2); - } else { - // window ratio is bigger (narrow image) - ratio = im_hf / h_f; - const float px = h_f / im_hf; - const float px_im_wf = px * im_wf; - offset_left = w/2 - static_cast(px_im_wf / 2); - } - - const int screen_w = static_cast(im_wf * ratio); - const int screen_h = static_cast(im_hf * ratio); - - window.setX(0); - window.setY(0); - window.setWidth(screen_w); - window.setHeight(screen_h); - - viewport.setX(offset_left); - viewport.setY(offset_top); - viewport.setWidth(im_w); - viewport.setHeight(im_h); - - // adjust the panning as the viewport is potentially scewed - // and mouse movements given by the window are not translated - // one-to-one anymore - return screen_w / im_wf; -} - -/** - * @brief getImDimsInScreenCoords - * Calculates the actual dimension of the image with all zoom, pan and - * viewport transformations applied - * @return a rectangle that represents the position and dimension of the - * image in the videoview element - */ -inline QRect getImDimsInScreenCoords( - const PanZoomState zoomState, - const int im_w, const int im_h, - const int w, const int h) { - - QRect viewport, window; - const float viewportRatio = calculate_viewport(im_w, im_h, w, h, window, viewport); - const float zoom = 1 + zoomState.zoomFactor; - // back-translate the pan to non-zoomed coordinate space - float realPanX = -zoomState.panX; - float realPanY = -zoomState.panY; - realPanX += (viewport.x()); - realPanY += (viewport.y()); - - // The image in screen coords - QRect actualIm( - static_cast(realPanX), static_cast(realPanY), - static_cast((im_w / viewportRatio) * zoom), - static_cast((im_h / viewportRatio) * zoom) - ); - return actualIm; -} - -/** - * @brief imageToScreenCoords - */ -inline QPoint imageToScreenCoords( - const PanZoomState zoomState, - const int im_w, const int im_h, - const int w, const int h, - const QPoint poi) { - QPoint result; - const QRect actualIm = getImDimsInScreenCoords(zoomState, im_w, im_h, w, h); - const float one_step_x = actualIm.width() / static_cast(im_w); - const float one_step_y = actualIm.height() / static_cast(im_h); - const int actualPosXInIm = static_cast(round(poi.x() * one_step_x)); - const int actualPosYInIm = static_cast(round(poi.y() * one_step_y)); - result.setX(actualPosXInIm + actualIm.x()); - result.setY(actualPosYInIm + actualIm.y()); - return result; -} - -/** - * @brief screenToImageCoords - * Translate the window coordinates to the actual image coords - * @param im_w image width - * @param im_h image height - * @param w width of the videoview - * @param h height of the videoview - * @param poi Point in Screen Coords - */ -inline QPoint screenToImageCoords( - const BioTracker::Core::PanZoomState zoomState, - const int im_w, const int im_h, - const int w, const int h, - QPoint poi) { - QPoint result(0, 0); - - // The image in screen coords - QRect actualIm = getImDimsInScreenCoords(zoomState, im_w, im_h, w, h); - - const float im_wf = static_cast(im_w); - const float im_hf = static_cast(im_h); - const float one_step_x = im_wf / actualIm.width(); - const float one_step_y = im_hf / actualIm.height(); - - const float transformedX = (-actualIm.x() + poi.x()) * one_step_x; - const float transformedY = (-actualIm.y() + poi.y()) * one_step_y; - - result.setX(static_cast(round(transformedX))); - result.setY(static_cast(round(transformedY))); - - return result; -} - -/** - * @brief zoomTo - * Modifies the panzoomstate so that the cursor (zoomCenter) will point to the same - * location in the image as prior to the zoom - * @param im_w width of the image (in px) - * @param im_h height of the image (in px) - * @param w width of the videoview element - * @param h height of the videoview element - */ -inline PanZoomState zoomTo( - PanZoomState state, - const int im_w, - const int im_h, - const int w, - const int h, - const float deltaZoom, - const QPoint zoomCenter) { - - const QPoint imPos = screenToImageCoords(state, im_w, im_h, w, h, zoomCenter); - - const float oldZoomFactor = state.zoomFactor; - const float newZoomFactor = state.zoomFactor - (deltaZoom/2000); - - if (newZoomFactor <= -1.0f) { - // MAX VALUE - return state; - } - - const float zoom = 1 + newZoomFactor; - - const float oldPanX = state.panX / (1 + oldZoomFactor); - const float oldPanY = state.panY / (1 + oldZoomFactor); - - // zoom with origin in (0/0) - state.panX = oldPanX * zoom; - state.panY = oldPanY * zoom; - state.zoomFactor = newZoomFactor; - - // As we do not want to zoom to (0/0) but rather keep the focus on the chosen - // image position (zoomCenter) we now have to "back-translate" to our initial - // position - const QPoint translatedZoomCenter = imageToScreenCoords(state, im_w, im_h, w, h, imPos); - const QPoint translate = translatedZoomCenter - zoomCenter; - state.panX += translate.x(); - state.panY += translate.y(); - state.isChanged = true; - return state; -} - -} -} -} diff --git a/BioTracker/Utils/BioTrackerUtils/util/imagePreProcessor/IImageProcessor.h b/BioTracker/Utils/BioTrackerUtils/util/imagePreProcessor/IImageProcessor.h deleted file mode 100644 index 6845a963..00000000 --- a/BioTracker/Utils/BioTrackerUtils/util/imagePreProcessor/IImageProcessor.h +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - -#include - -class Rectification; -class Settings; - - -class IImageProcessor { - public: - IImageProcessor(Rectification &rectification, Settings &settings) : - _rectification(rectification), - _settings(settings) { - } - - virtual ~IImageProcessor(void) {} - - /** - * This method processed the image and detects the found object. - * @param image, the image to process, - * @return void. - */ - virtual void process(cv::Mat image) = 0; - - protected: - const Rectification &_rectification; - Settings &_settings; -}; - diff --git a/BioTracker/Utils/BioTrackerUtils/util/imagePreProcessor/ImagePreProcessor.h b/BioTracker/Utils/BioTrackerUtils/util/imagePreProcessor/ImagePreProcessor.h deleted file mode 100644 index 25718b69..00000000 --- a/BioTracker/Utils/BioTrackerUtils/util/imagePreProcessor/ImagePreProcessor.h +++ /dev/null @@ -1,181 +0,0 @@ -#pragma once - -#include - -#include "util/stdext.h" - -namespace BioTracker { -namespace Core { - -namespace PREPROCESSORPARAM { -// Parameter for the opencv BackgroundSubtractorMOG2 class -static const std::string BG_MOG2_HISTORY = - "TRACKERPARAM.BG_MOG2_HISTORY"; -static const std::string BG_MOG2_VAR_THRESHOLD = - "TRACKERPARAM.BG_MOG2_VAR_THRESHOLD"; -static const std::string BG_MOG2_SHADOW_DETECTION = - "TRACKERPARAM.BG_MOG2_SHADOW_DETECTION"; -static const std::string BG_MOG2_BACKGROUND_RATIO = - "TRACKERPARAM.BG_MOG2_BACKGROUND_RATIO"; - -// Parameters for enabling methods -static const std::string ENABLE_BG_SUBTRACTION = - "TRACKERPARAM.ENABLE_BG_SUBTRACTION"; -static const std::string ENABLE_BG_IMAGE = - "TRACKERPARAM.ENABLE_BG_IMAGE"; -static const std::string ENABLE_BINARIZING = - "TRACKERPARAM.ENABLE_BINARIZING"; -static const std::string ENABLE_ERODE = - "TRACKERPARAM.ENABLE_ERODE"; -static const std::string ENABLE_DILATE = - "TRACKERPARAM.ENABLE_DILATE"; -static const std::string IMAGE_VIEW_TYPE = - "TRACKERPARAM.IMAGE_VIEW_TYPE"; - -// Mapping issue -static const std::string MAX_MAPPED_DISTANCE_PX = - "TRACKERPARAM.MAX_MAPPED_DISTANCE_PX"; -static const std::string MAX_MAPPED_DISTANCE_CM = - "TRACKERPARAM.MAX_MAPPED_DISTANCE_CM"; - -// Blob dectection issue -static const std::string MAX_BLOB_SIZE = - "TRACKERPARAM.MAX_BLOB_SIZE"; -static const std::string MIN_BLOB_SIZE = - "TRACKERPARAM.MIN_BLOB_SIZE"; - -// Parameters for image pre-processing step -static const std::string SIZE_ERODE = "TRACKERPARAM.SIZE_ERODE"; -static const std::string SIZE_DILATE = - "TRACKERPARAM.SIZE_DILATE"; -static const std::string THRESHOLD_BINARIZING = - "TRACKERPARAM.THRESHOLD_BINARIZING"; - -// Image processing type -enum IMAGE_DISPLAY_TYPE { - IMAGE_OR = 0, - IMAGE_BI = 1, - IMAGE_ER = 2, - IMAGE_DI = 3, - IMAGE_FG = 4, - IMAGE_BG = 5, - IMAGE_PP = 6, -}; -} - -class Settings; - -class ImagePreProcessor { - public: - - /** - * The constructor with provided parameters. - * @param settings reference to the biotracker settings object - */ - ImagePreProcessor(Settings &settings); - - /** - * Init function. Sets the property for the imge pre-processing. - */ - void init(); - - /** - * A computer vision method to binarize an image. - * @param image image to binarize, - * @return a binarized image. - */ - cv::Mat binarize(cv::Mat image); - - /** - * Sets the threshold value for a parameter - * @param paramName the parameter name, - * @param threshValue threshold value, - */ - void setThreshold(std::string paramName, std::string threshValue); - - /** - * A mathematical morphology operation using in computer vision to erode an image. - * Erode image with 3x3 4-connectivity. - * @param image image to erode, - * @return an eroded image. - */ - cv::Mat erode(cv::Mat image); - - /** - * A mathematical morphology operation using in computer vision to dilate an image. - * Dilate image with 6x6 8-connectivity. - * @param image image to dilate, - * @return a dilated image. - */ - cv::Mat dilate(cv::Mat image); - - /** - * A computer vision methode to calculate the image difference. - * Background image subtracts the foreground image. - * @param image image to background subtract, - * @return the background subtracted image. - */ - cv::Mat backgroundSubtraction(cv::Mat image); - - /** - * Pre-process an image, if all methods enabled, this function: - * - does the background subtraction - * - erodes the image - * - dilates the image - * @param image image to process, - */ - void preProcess(cv::Mat image); - - /** - * The method updates the image background. - */ - void resetBackgroundImage(); - - /** - * Method to enable image pre-processing methods - * @param enableProcess specifies the process to enable or disable, - * @param enable true to enable, false to disable. - */ - void setEnable(std::string enableProcess, bool enable = true); - - /** - * Gets displayed image type for displaying it. - * @param imageDisplayType kind of image need to retrieve. - * Hint: IMAGE_BI, binarized image, - * IMAGE_ER, eroded image, - * IMAGE_DI, dilated image, - * IMAGE_FG, foreground mask image, - * IMAGE_BG, background image, - * IMAGE_PP, final proceedied image, - * @return type of image. - */ - cv::Mat imageDisplayType(PREPROCESSORPARAM::IMAGE_DISPLAY_TYPE - imageDisplayType); - - private: - // System properties - Settings &_settings; - - // variable of the various processing image - cv::Mat _original; - cv::Mat _proceededImage; - cv::Mat _fgMaskMOG; - cv::Mat _backgroundImage; - cv::Mat _binarizedImage; - cv::Mat _erodedImage; - cv::Mat _dilatedImage; - - // background subtraction - std::unique_ptr _pMOG; - - //parameters for image pre-processing - bool _backgroundSubtractionEnabled; - bool _backgroundEnabled; - bool _binarizeEnabled; - bool _erodeEnabled; - bool _dilateEnabled; -}; - -} -} - diff --git a/BioTracker/Utils/BioTrackerUtils/util/misc.cpp b/BioTracker/Utils/BioTrackerUtils/util/misc.cpp deleted file mode 100644 index 6fcf6deb..00000000 --- a/BioTracker/Utils/BioTrackerUtils/util/misc.cpp +++ /dev/null @@ -1,95 +0,0 @@ -#include "util/misc.h" - -#include // QPoint -#include -#include - -int split(std::string &txt, std::vector &strs, char ch) -{ - std::string::size_type pos = txt.find(ch); - std::string::size_type initialPos = 0; - strs.clear(); - - // Decompose statement - while (pos != std::string::npos) { - strs.push_back(txt.substr(initialPos, pos - initialPos)); - initialPos = pos + 1; - - pos = txt.find(ch, initialPos); - } - - // Add the last one - strs.push_back(txt.substr(initialPos, std::min(pos, txt.size()) - initialPos + 1)); - - return strs.size(); -} - -std::string getTimeAndDate(std::string prefix, std::string suffix) -{ - // time_t timetitle; - // std::string timeInfo = prefix; - // time(&timetitle); - // std::string t = ctime(&timetitle); - // for (int i = 0; i < t.size(); i++) - // if (t[i] == ' ' || t[i] == ':') - // t[i] = '_'; - // timeInfo += t.substr(0, t.size() - 1); - // timeInfo += suffix; - // return timeInfo; - - - - - time_t rawtime; - struct tm * timeinfo; - - time ( &rawtime ); - timeinfo = localtime ( &rawtime ); - - char t[30]; - strftime(t, 30, "%Y-%m-%dT%H_%M_%S", timeinfo); // - - std::string out = prefix; - - std::string timeStampF(t); - - out += timeStampF; - out += suffix; - - return out; -} - -std::vector stringToCVPointVec(std::string arena) { - std::vector pts; - - QString qarena(arena.c_str()); - QStringList corners = qarena.split(";"); - for (int i = 0; i < corners.size(); i++) { - QString cur = corners.at(i); - QStringList p = cur.split(","); - pts.push_back(cv::Point(p.at(0).toInt(), p.at(1).toInt())); - } - return pts; -} - - -std::vector QVecToCvVec(std::vector q) { - std::vector v; - for (int i = 0; i < q.size(); i++) - v.push_back(cv::Point(q[i].x(), q[i].y())); - return v; -} -std::vector CvVecToQVec(std::vector q) { - std::vector v; - for (int i = 0; i < q.size(); i++) - v.push_back(QPoint(q[i].x, q[i].y)); - return v; -} - -std::string cvPointsToString(std::vector ac) { - - std::string arena = ""; - for (int i = 0; i < ac.size(); i++) - arena += (std::to_string(ac[i].x) + "," + std::to_string(ac[i].y) + ";"); - return arena.substr(0, arena.size() - 1); -} diff --git a/BioTracker/Utils/BioTrackerUtils/util/misc.h b/BioTracker/Utils/BioTrackerUtils/util/misc.h deleted file mode 100644 index dc685031..00000000 --- a/BioTracker/Utils/BioTrackerUtils/util/misc.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef MISC_H -#define MISC_H -#include -#include -#include -#include - -int split(std::string &txt, std::vector &strs, char ch); -std::string getTimeAndDate(std::string prefix, std::string suffix); -std::vector stringToCVPointVec(std::string arena); -std::vector QVecToCvVec(std::vector q); -std::string cvPointsToString(std::vector ac); -std::vector CvVecToQVec(std::vector q); -#endif \ No newline at end of file diff --git a/BioTracker/Utils/BioTrackerUtils/util/platform.h b/BioTracker/Utils/BioTrackerUtils/util/platform.h deleted file mode 100644 index 53dd43b0..00000000 --- a/BioTracker/Utils/BioTrackerUtils/util/platform.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -/* -This macro must be used to mark all symbols that should be exported to a DLL. -*/ -#ifdef _MSC_VER -#ifdef BUILD_BIOTRACKER_DLL -#define BIOTRACKER_DLLEXPORT __declspec(dllexport) -#define BIOTRACKER_EXPIMP_TEMPLATE -#else -#define BIOTRACKER_DLLEXPORT __declspec(dllimport) -#define BIOTRACKER_EXPIMP_TEMPLATE extern -#endif -#else -#define BIOTRACKER_DLLEXPORT -#endif diff --git a/BioTracker/Utils/BioTrackerUtils/util/singleton.h b/BioTracker/Utils/BioTrackerUtils/util/singleton.h deleted file mode 100644 index d171b6b9..00000000 --- a/BioTracker/Utils/BioTrackerUtils/util/singleton.h +++ /dev/null @@ -1,63 +0,0 @@ -#pragma once -#include -#include "settings/Settings.h" - -namespace BioTracker { -namespace Util { - -template -class Singleton { - - protected: - Singleton() {} - ~Singleton() {} - Singleton(const Singleton &) = delete; - Singleton &operator=(const Singleton &) = delete; - - public: - static T &getInstance(); - -}; - -template -T &Singleton::getInstance() { - static T instance; - return instance; -} - -/* - * Just like Singleton, but I want to have several different singleton instances of the same type which I can address by name. - * Example is the Settings class, which is also threadsafe by plastering it with mutexes. - * This way you can access everywhere in the application the current configuration from different threads without worries. - * Only recommendet, as performance is not relevant when accessing configuration. -*/ -template -class TypedSingleton { - -protected: - TypedSingleton() {} - ~TypedSingleton() {} - TypedSingleton(const TypedSingleton &) = delete; - TypedSingleton &operator=(const TypedSingleton &) = delete; - -public: - static T *getInstance(std::string s); - -}; - -template -T *TypedSingleton::getInstance(std::string s) { - static std::map instance; - if (instance.find(s) != instance.end()) { - return instance.find(s)->second; - } - else { - T* t = new T(s); - instance.insert(std::pair(s, t)); - return t; - } - return 0; -} - -} -} diff --git a/BioTracker/Utils/BioTrackerUtils/util/stdext.h b/BioTracker/Utils/BioTrackerUtils/util/stdext.h deleted file mode 100644 index ada7c5d7..00000000 --- a/BioTracker/Utils/BioTrackerUtils/util/stdext.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef STDEXT_H -#define STDEXT_H - -/* implementation of std::make_unique for c++<14 - * implementation according to N3656 - * see: http://isocpp.org/files/papers/N3656.txt - */ - -#include -#if (!defined(_MSC_VER) && __cplusplus <= 201103L) || (defined(_MSC_VER) && _MSC_VER < 1800) -#include -#include -#include - -namespace std { -template struct _Unique_if { - typedef unique_ptr _Single_object; -}; - -template struct _Unique_if { - typedef unique_ptr _Unknown_bound; -}; - -template struct _Unique_if { - typedef void _Known_bound; -}; - -template -typename _Unique_if::_Single_object -make_unique(Args &&... args) { - return unique_ptr(new T(std::forward(args)...)); -} - -template -typename _Unique_if::_Unknown_bound -make_unique(size_t n) { - typedef typename remove_extent::type U; - return unique_ptr(new U[n]()); -} - -template -typename _Unique_if::_Known_bound -make_unique(Args &&...) = delete; -} -#endif - -#endif diff --git a/BioTracker/Utils/BioTrackerUtils/util/stringTools.cpp b/BioTracker/Utils/BioTrackerUtils/util/stringTools.cpp deleted file mode 100644 index 6365a622..00000000 --- a/BioTracker/Utils/BioTrackerUtils/util/stringTools.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include -#include - -#include // std::string -#include // std::invalid_argument - -#include "util/platform.h" - -namespace BioTracker { -namespace Util { - - -} -} diff --git a/BioTracker/Utils/BioTrackerUtils/util/stringTools.h b/BioTracker/Utils/BioTrackerUtils/util/stringTools.h deleted file mode 100644 index 2334a24d..00000000 --- a/BioTracker/Utils/BioTrackerUtils/util/stringTools.h +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once - -#include - -namespace BioTracker { -namespace Util { - -/** - * replaces every non-ASCII character in s with an escape sequence containing the hexadecimal representation of it's value. - * - * Additionally backslashes are escaped too, since this character is used to initiate an escape sequence. - * - * The value of a valid ASCII is [0, 127]. - * - * replacement map: - * ---------------- - * "\" --> "\\" - * non-ASCII --> "\x{2 digit hex value}" - * ASCII --> ASCII - * - */ -std::string escape_non_ascii(const std::string &s); - - -/** - * unescapes escaped (non-)ASCII characters. - * - * replacement map: - * ---------------- - * "\\" --> "\" - * "\x{2 hex digits}" --> character - * ASCII --> ASCII - * everything else --> exception - * - * @see escape_non_ascii - * - */ -std::string unescape_non_ascii(const std::string &s); - -/** - * @brief stem_filename - * stems the filename from a path - */ -std::string stem_filename(const std::string &s); - -} -} diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..03e71982 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,30 @@ +cmake_minimum_required(VERSION 3.12) + +cmake_policy(SET CMP0020 NEW) +cmake_policy(SET CMP0054 NEW) + +exec_program("git" ${CMAKE_CURRENT_SOURCE_DIR} ARGS "log --pretty=format:%h -n 1" OUTPUT_VARIABLE GIT_HASH) +exec_program("git" ${CMAKE_CURRENT_SOURCE_DIR} ARGS "describe --tags --abbrev=0" OUTPUT_VARIABLE GIT_TAG) + +project(BioTracker + VERSION ${GIT_TAG} + LANGUAGES CXX +) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTORCC ON) + +set(HMNVLibDir "Not Found" CACHE FILEPATH "") + +find_package(BT_Utility 0.1.1 REQUIRED) +find_package(RF_behavior_loader 0.1.1 REQUIRED) + +add_subdirectory(Src) + + + diff --git a/README.md b/README.md index 0b1d172b..4ab2352b 100644 --- a/README.md +++ b/README.md @@ -14,17 +14,25 @@ Building the Biotracker 3 needs: ## Building Biotracker 3 (Windows x64) -Note: Building with NVEnc is comming soon. Meanwhile ignore "HMNVLibDir=Not Found", it will build with CPU encoding only. - -Install and configure the dependencies. E.g. use vcpkg: https://github.com/BioroboticsLab/RF_vcpkg -Get the boost packages: -vcpkg install boost-property-tree:x64-windows-14.13 boost-bimap:x64-windows-14.13 boost-assign:x64-windows-14.13 boost-system:x64-windows-14.13 boost-filesystem:x64-windows-14.13 boost-chrono:x64-windows-14.13 boost-timer:x64-windows-14.13 boost-program-options:x64-windows-14.13 -vcpkg install openblas:x64-windows-14.13 opencv[opengl,ffmpeg,ximea,cuda]:x64-windows-14.13 -... and Qt systemwide using Qt5_dir -Now call cmake with some switches to include vcpkg: -DCMAKE_TOOLCHAIN_FILE=C:/RF_vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-14.13 -... and build. You might need to copy flang DLL files, as their vcpkg integration is not yet complete. - -Congratulations! You build the Biotracker 3! +Following example will use Visual Studio 2015, OpenCv 3.2, QT 5.9 and boost_1_64, all x64. +You will need to tell CMake where to find the libraries. You can do this via GUI when asked or set enviromental variables. + +Set: +- QT_DIR_CMAKE64, E.g. E:\Software\Libraries\QT\5.9\msvc2015_64\lib\cmake\Qt5 +- CV_DIR_CMAKE64, E.g. E:\Software\Libraries\opencv\build +- BOOST_LIBRARYDIR, E.g. E:\Software\Libraries\boost_1_65_1\stage64\lib +- BOOST_ROOT, E.g. E:\Software\Libraries\boost_1_65_1 +Note that your path's and library version may differ. + +Building with NVEnc is comming soon. Meanwhile ignore "HMNVLibDir=Not Found", it will build with CPU encoding only. + +Now configure, generate, open and build for Debug/Release. The build is dynamically linked, which means you will need to supply the DLL's to your newly build binary. Qt offers the windeployqt utility. Usage sample, console: +C:\Users\Hauke>E:\Software\Libraries\QT\5.9\msvc2015_64\bin\windeployqt.exe E:\Development\Hauke\biotracker_core\BioTracker\CoreApp\BioTracker\Release\Biotracker_core.exe +OpenCv does not come with such a utility and you need to copy the DLL's manually from e.g.: +E:\Software\Libraries\opencv\build\bin\Release (or Debug, respectively) +Boost libraries are not needed to be copied. + +Congratulations! You build the Biotracker 3! ## Building Biotracker 3 (Linux) diff --git a/Src/BioTracker.desktop b/Src/BioTracker.desktop new file mode 100644 index 00000000..53eb90c6 --- /dev/null +++ b/Src/BioTracker.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Type=Application +Name=BioTracker +Exec=BioTracker +Icon=BT3-big +Comment=Tracking application +Terminal=true +Categories=Science; \ No newline at end of file diff --git a/BioTracker/CoreApp/BioTracker/BioTracker3App.cpp b/Src/BioTracker3App.cpp similarity index 100% rename from BioTracker/CoreApp/BioTracker/BioTracker3App.cpp rename to Src/BioTracker3App.cpp diff --git a/BioTracker/CoreApp/BioTracker/BioTracker3App.h b/Src/BioTracker3App.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/BioTracker3App.h rename to Src/BioTracker3App.h diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt new file mode 100644 index 00000000..e269b2e8 --- /dev/null +++ b/Src/CMakeLists.txt @@ -0,0 +1,190 @@ +############################################################## +#### BioTracker Core +############################################################## + +list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/cmake) + +include(BT_Utility/VSSugar) +VSSourceGroups(${CMAKE_CURRENT_LIST_DIR}) + +add_definitions(-DBIORACKER_GIT_HASH="${GIT_HASH}") +add_definitions(-DBIOTRACKER_GIT_TAG="${GIT_TAG}") + +set(TN BioTracker) +add_executable (${TN}) + +target_include_directories(${TN} PUBLIC ${CMAKE_CURRENT_LIST_DIR}) + +target_link_libraries (${TN} BT_Utility) +target_link_libraries (${TN} RF_behavior_loader) + +find_package(Qt5 REQUIRED COMPONENTS Core Gui Xml Network Widgets Multimedia MultimediaWidgets OpenGL) +target_link_libraries (${TN} Qt5::Core Qt5::Gui Qt5::Xml Qt5::Network Qt5::Widgets) +target_link_libraries (${TN} Qt5::Multimedia Qt5::MultimediaWidgets Qt5::OpenGL ) + +find_package(Boost REQUIRED system filesystem chrono thread timer program_options) +target_link_libraries(${TN} + ${Boost_PROGRAM_OPTIONS_LIBRARY} +) + +option(WITH_PYLON5 "Support Pylon 5 cameras" OFF) +if(WITH_PYLON5) + find_package(Pylon5) + if(Pylon5_FOUND) + message("Pylon5 support enabled") + target_compile_definitions(${TN} PRIVATE HAS_PYLON=1) + target_link_libraries(${TN} Pylon5::Base Pylon5::Utility Pylon5::GenAPI Pylon5::GCBase) + endif() +endif() + +IF("${HMNVLibDir}" MATCHES "Not Found") +ELSE() + target_link_libraries(${TN} ${HMNVLibDir}/lib/NvEncInterace.lib) + target_compile_definitions(${TN} PRIVATE WITH_CUDA=1) +ENDIF() + +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") + target_link_libraries(${TN} stdc++fs) +endif() + + +message(STATUS "Configured CV version=${OpenCV_VERSION}") +message(STATUS "Configured QT version=${Qt5Core_VERSION}") +message(STATUS "Configured Boost version=${Boost_LIB_VERSION}") +add_definitions( -DMyQT_VERSION="${Qt5Core_VERSION}" ) +add_definitions( -DMyCV_VERSION="${OpenCV_VERSION}" ) +add_definitions( -DMyBT_VERSION="${Boost_LIB_VERSION}" ) + +include(Locate) +if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") + install(TARGETS ${TN} DESTINATION .) + + option(INSTALL_REQUIRED_SYSTEM_LIBRARIES "Install required system libraries" OFF) + if(INSTALL_REQUIRED_SYSTEM_LIBRARIES) + set(CMAKE_INSTALL_UCRT_LIBRARIES TRUE) + set(CMAKE_INSTALL_SYSTEM_RUNTIME_DESTINATION .) + include(InstallRequiredSystemLibraries) + endif() + + include(WinDeployQt5) + deploy_qt5(${TN} DESTINATION .) + + #boost_program_options;boost_filesystem;bt_interfaces; + #calib3d;videoio;imgcodecs;imgproc;core; + set(INSTALL_CUDA_COMPONENTS "" CACHE STRING "CUDA components to install") + locate_cuda(shared_libraries COMPONENTS ${INSTALL_CUDA_COMPONENTS}) + + set(INSTALL_OPENCV_COMPONENTS "" CACHE STRING "OpenCV components to install") + locate_opencv(shared_libraries COMPONENTS ${INSTALL_OPENCV_COMPONENTS}) + + set(INSTALL_SHARED_LIBRARIES "" CACHE STRING "Additional shared libraries to install") + locate_shared_library(shared_libraries ${INSTALL_SHARED_LIBRARIES}) + + locate_shared_library(shared_libraries bt_interfaces) + + install(FILES ${shared_libraries} DESTINATION .) +endif() + +set(CPACK_PACKAGE_NAME "${TN}") +set(CPACK_PACKAGE_VENDOR "Biorobotics Lab / FU Berlin") + +set(CPACK_PACKAGE_VERSION ${GIT_TAG}) + +if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") + option(PACKAGE_WINDOWS_MSI "Create .msi package" OFF) + if(PACKAGE_WINDOWS_MSI) + set(CPACK_GENERATOR "WIX") + set(CPACK_WIX_UPGRADE_GUID "e47473db-3d71-4c42-8a58-d3eac87aa0bd") + + set(CPACK_PACKAGE_INSTALL_DIRECTORY "RoboFish/${TN}") + + set(CPACK_WIX_PROGRAM_MENU_FOLDER "RoboFish") + + set_property(INSTALL "$" + PROPERTY CPACK_START_MENU_SHORTCUTS "${TN}" + ) + + set_property(INSTALL "$" + PROPERTY CPACK_DESKTOP_SHORTCUTS "${TN}" + ) + + set(CPACK_WIX_LICENSE_RTF ${CMAKE_SOURCE_DIR}/Src/cmake/WIX/licence.rtf) + set(CPACK_WIX_TEMPLATE "${CMAKE_SOURCE_DIR}/Src/cmake/WIX/WIX.template.in") + endif() +endif() + +include(CPack) + +target_sources(${TN} +PRIVATE + "${CMAKE_CURRENT_LIST_DIR}/BioTracker3App.cpp" + "${CMAKE_CURRENT_LIST_DIR}/GuiContext.cpp" + "${CMAKE_CURRENT_LIST_DIR}/main.cpp" + "${CMAKE_CURRENT_LIST_DIR}/guiresources.qrc" + "${CMAKE_CURRENT_LIST_DIR}/Controller/IControllerCfg.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Controller/ControllerAnnotations.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Controller/ControllerAreaDescriptor.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Controller/ControllerCommands.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Controller/ControllerCoreParameter.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Controller/ControllerDataExporter.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Controller/ControllerGraphicScene.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Controller/ControllerMainWindow.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Controller/ControllerNotifications.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Controller/ControllerPlayer.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Controller/ControllerPlugin.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Controller/ControllerTextureObject.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Controller/ControllerTrackedComponentCore.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Controller/null_Controller.cpp" + "${CMAKE_CURRENT_LIST_DIR}/IStates/IPlayerState.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Model/AreaDescriptor/AreaInfo.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Model/AreaDescriptor/AreaInfoElement.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Model/AreaDescriptor/AreaMemory.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Model/AreaDescriptor/Rectification.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Model/DataExporters/DataExporterCSV.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Model/DataExporters/DataExporterGeneric.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Model/DataExporters/DataExporterJson.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Model/DataExporters/DataExporterSerialize.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Model/MediaPlayerStateMachine/PlayerStates/PStateGoToFrame.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Model/MediaPlayerStateMachine/PlayerStates/PStateInitial.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Model/MediaPlayerStateMachine/PlayerStates/PStateInitialStream.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Model/MediaPlayerStateMachine/PlayerStates/PStatePause.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Model/MediaPlayerStateMachine/PlayerStates/PStatePlay.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Model/MediaPlayerStateMachine/PlayerStates/PStateStepBack.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Model/MediaPlayerStateMachine/PlayerStates/PStateStepForw.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Model/MediaPlayerStateMachine/PlayerStates/PStateWait.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Model/UndoCommands/TrackCommands.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Model/Annotations.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Model/BioTracker3ProxyMat.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Model/CoreParameter.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Model/ImageStream.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Model/MediaPlayer.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Model/null_Model.cpp" + "${CMAKE_CURRENT_LIST_DIR}/Model/TextureObject.cpp" + "${CMAKE_CURRENT_LIST_DIR}/util/CLIcommands.cpp" + "${CMAKE_CURRENT_LIST_DIR}/util/VideoCoder.cpp" + "${CMAKE_CURRENT_LIST_DIR}/util/Config.cpp" + "${CMAKE_CURRENT_LIST_DIR}/View/AreaDesciptor/AreaDescriptor.cpp" + "${CMAKE_CURRENT_LIST_DIR}/View/AreaDesciptor/EllipseDescriptor.cpp" + "${CMAKE_CURRENT_LIST_DIR}/View/AreaDesciptor/RectDescriptor.cpp" + "${CMAKE_CURRENT_LIST_DIR}/View/AnnotationsView.cpp" + "${CMAKE_CURRENT_LIST_DIR}/View/CameraDevice.cpp" + "${CMAKE_CURRENT_LIST_DIR}/View/ComponentShape.cpp" + "${CMAKE_CURRENT_LIST_DIR}/View/CoreParameterView.cpp" + "${CMAKE_CURRENT_LIST_DIR}/View/GLVideoView.cpp" + "${CMAKE_CURRENT_LIST_DIR}/View/GraphicsScene.cpp" + "${CMAKE_CURRENT_LIST_DIR}/View/GraphicsView.cpp" + "${CMAKE_CURRENT_LIST_DIR}/View/MainWindow.cpp" + "${CMAKE_CURRENT_LIST_DIR}/View/NotificationLogBrowser.cpp" + "${CMAKE_CURRENT_LIST_DIR}/View/SettingsWindow.cpp" + "${CMAKE_CURRENT_LIST_DIR}/View/TextureObjectView.cpp" + "${CMAKE_CURRENT_LIST_DIR}/View/TrackedComponentView.cpp" + "${CMAKE_CURRENT_LIST_DIR}/View/TrackedImageView.cpp" + "${CMAKE_CURRENT_LIST_DIR}/View/VideoControllWidget.cpp" + "${CMAKE_CURRENT_LIST_DIR}/View/Utility/RotationHandle.cpp" + "${CMAKE_CURRENT_LIST_DIR}/View/Utility/SwitchButton.cpp" + "${CMAKE_CURRENT_LIST_DIR}/View/Utility/Tracer.cpp" +) + + + diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.cpp b/Src/Controller/ControllerAnnotations.cpp similarity index 99% rename from BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.cpp rename to Src/Controller/ControllerAnnotations.cpp index d3487918..db4cca65 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.cpp +++ b/Src/Controller/ControllerAnnotations.cpp @@ -27,7 +27,7 @@ void ControllerAnnotations::reset(std::string filepath) } ControllerAnnotations::ControllerAnnotations(QObject* parent, IBioTrackerContext* context, ENUMS::CONTROLLERTYPE ctr) : - IController(parent, context, ctr) { + IControllerCfg(parent, context, ctr) { } void ControllerAnnotations::connectControllerToController() { diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.h b/Src/Controller/ControllerAnnotations.h similarity index 94% rename from BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.h rename to Src/Controller/ControllerAnnotations.h index 0e6d0905..3202916a 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.h +++ b/Src/Controller/ControllerAnnotations.h @@ -1,6 +1,6 @@ #pragma once -#include "Interfaces/IController/IController.h" +#include "IControllerCfg.h" #include "QString" #include #include @@ -13,7 +13,7 @@ struct playerParameters; * It is the management unit of the annotation component. * It controls user input -> creates new annotations in model, forwards moves and deletes them */ -class ControllerAnnotations : public IController +class ControllerAnnotations : public IControllerCfg { Q_OBJECT public: diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerAreaDescriptor.cpp b/Src/Controller/ControllerAreaDescriptor.cpp similarity index 92% rename from BioTracker/CoreApp/BioTracker/Controller/ControllerAreaDescriptor.cpp rename to Src/Controller/ControllerAreaDescriptor.cpp index 8c5d3410..6e2b0af1 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerAreaDescriptor.cpp +++ b/Src/Controller/ControllerAreaDescriptor.cpp @@ -4,7 +4,6 @@ #include "View/AreaDesciptor/AreaDescriptor.h" #include "View/AreaDesciptor/RectDescriptor.h" #include "View/AreaDesciptor/EllipseDescriptor.h" -#include "settings/Settings.h" #include "util/types.h" #include "ControllerGraphicScene.h" @@ -14,12 +13,12 @@ #include "Controller/ControllerCoreParameter.h" #include - + #include "Model/AreaDescriptor/AreaMemory.h" using namespace AreaMemory; ControllerAreaDescriptor::ControllerAreaDescriptor(QObject *parent, IBioTrackerContext *context, ENUMS::CONTROLLERTYPE ctr) : - IController(parent, context, ctr) + IControllerCfg(parent, context, ctr) { _watchingVertice = -1; _watchingVerticeType = BiotrackerTypes::AreaType::NONE; @@ -47,10 +46,8 @@ void ControllerAreaDescriptor::createView() AreaInfo* area = dynamic_cast(getModel()); - BioTracker::Core::Settings *_settings = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); - int v = _settings->getValueOrDefault(AREADESCRIPTOR::CN_APPERTURE_TYPE, 0); + int v = _cfg->AppertureType; trackingAreaType(v); - } void ControllerAreaDescriptor::connectModelToController() @@ -72,13 +69,12 @@ void ControllerAreaDescriptor::trackingAreaType(int v) { delete m_ViewApperture; } - BioTracker::Core::Settings *_settings = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); if (v == 0) { m_ViewApperture = new RectDescriptor(this, area->_apperture.get()); area->_apperture->setType(0); static_cast(m_ViewApperture)->setBrush(QBrush(Qt::red)); QObject::connect(this, &ControllerAreaDescriptor::currentVectorDrag, static_cast(m_ViewApperture), &RectDescriptor::receiveDragUpdate); - _settings->setParam(AREADESCRIPTOR::CN_APPERTURE_TYPE, 0); + _cfg->AppertureType = 0; } else if (v > 0) { m_ViewApperture = new EllipseDescriptor(this, area->_apperture.get()); @@ -86,7 +82,7 @@ void ControllerAreaDescriptor::trackingAreaType(int v) { static_cast(m_ViewApperture)->setBrush(QBrush(Qt::red)); static_cast(m_ViewApperture)->setDimensions(_w, _h); QObject::connect(this, &ControllerAreaDescriptor::currentVectorDrag, static_cast(m_ViewApperture), &EllipseDescriptor::receiveDragUpdate); - _settings->setParam(AREADESCRIPTOR::CN_APPERTURE_TYPE, 1); + _cfg->AppertureType = 1; } if (!_visibleApperture) @@ -95,8 +91,8 @@ void ControllerAreaDescriptor::trackingAreaType(int v) { static_cast(m_View)->hide(); gview->addGraphicsItem(static_cast(m_ViewApperture)); -} - +} + void ControllerAreaDescriptor::rcvPlayerParameters(playerParameters* parameters) { //Best effort to save performance... @@ -113,7 +109,7 @@ void ControllerAreaDescriptor::rcvPlayerParameters(playerParameters* parameters) _h = m->size().height; ad->setDimensions(_w, _h); } - QVector v = getVertices(_currentFilename); + QVector v = getVertices(_currentFilename, _cfg->AreaDefinitions); if (!v.empty()) { changeAreaDescriptorType(v[2]); } @@ -165,7 +161,7 @@ void ControllerAreaDescriptor::connectControllerToController() void ControllerAreaDescriptor::createModel() { - m_Model = new AreaInfo(0); + m_Model = new AreaInfo(this); } void ControllerAreaDescriptor::updateView() { @@ -256,9 +252,8 @@ void ControllerAreaDescriptor::mouseMoveEvent(QMouseEvent*event, const QPoint &p void ControllerAreaDescriptor::setRectificationDimensions(double w, double h) { - BioTracker::Core::Settings *_settings = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); - _settings->setParam(AREADESCRIPTOR::RECT_W, w); - _settings->setParam(AREADESCRIPTOR::RECT_H, h); + _cfg->RectificationHeight = h; + _cfg->RectificationWidth = w; AreaInfo* area = static_cast(getModel()); area->setRectificationDimensions(w, h); diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerAreaDescriptor.h b/Src/Controller/ControllerAreaDescriptor.h similarity index 91% rename from BioTracker/CoreApp/BioTracker/Controller/ControllerAreaDescriptor.h rename to Src/Controller/ControllerAreaDescriptor.h index 1e96dbcf..dc885d19 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerAreaDescriptor.h +++ b/Src/Controller/ControllerAreaDescriptor.h @@ -1,13 +1,13 @@ #pragma once -#include "Interfaces/IController/IController.h" +#include "IControllerCfg.h" #include "Interfaces/IModel/IModelAreaDescriptor.h" #include #include -#include "util/types.h" +#include "util/types.h" #include "Model/MediaPlayerStateMachine/PlayerParameters.h" -class ControllerAreaDescriptor : public IController +class ControllerAreaDescriptor : public IControllerCfg { Q_OBJECT public: diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerCommands.cpp b/Src/Controller/ControllerCommands.cpp similarity index 99% rename from BioTracker/CoreApp/BioTracker/Controller/ControllerCommands.cpp rename to Src/Controller/ControllerCommands.cpp index e8da6014..542447e1 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerCommands.cpp +++ b/Src/Controller/ControllerCommands.cpp @@ -2,7 +2,7 @@ #include "QDebug" ControllerCommands::ControllerCommands(QObject *parent, IBioTrackerContext *context, ENUMS::CONTROLLERTYPE ctr) : - IController(parent, context, ctr) + IControllerCfg(parent, context, ctr) { } diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerCommands.h b/Src/Controller/ControllerCommands.h similarity index 96% rename from BioTracker/CoreApp/BioTracker/Controller/ControllerCommands.h rename to Src/Controller/ControllerCommands.h index 65c0ea77..99754025 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerCommands.h +++ b/Src/Controller/ControllerCommands.h @@ -2,7 +2,7 @@ #define CONTROLLERCOMMANDS_H #pragma once -#include "Interfaces/IController/IController.h" +#include "IControllerCfg.h" #include "Interfaces/IModel/IModelTrackedTrajectory.h" #include "Model/UndoCommands/TrackCommands.h" #include "QUndoStack" @@ -13,7 +13,7 @@ * http://doc.qt.io/qt-5/qundo.html * The commands component controls the commands on an undo/redo stack (model) and the undo view */ -class ControllerCommands : public IController { +class ControllerCommands : public IControllerCfg { Q_OBJECT public: ControllerCommands(QObject* parent = 0, IBioTrackerContext* context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerCoreParameter.cpp b/Src/Controller/ControllerCoreParameter.cpp similarity index 99% rename from BioTracker/CoreApp/BioTracker/Controller/ControllerCoreParameter.cpp rename to Src/Controller/ControllerCoreParameter.cpp index cc1ba3cd..abad2f57 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerCoreParameter.cpp +++ b/Src/Controller/ControllerCoreParameter.cpp @@ -11,7 +11,7 @@ #include "Model/CoreParameter.h" ControllerCoreParameter::ControllerCoreParameter(QObject *parent, IBioTrackerContext *context, ENUMS::CONTROLLERTYPE ctr) : - IController(parent, context, ctr) + IControllerCfg(parent, context, ctr) { } diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerCoreParameter.h b/Src/Controller/ControllerCoreParameter.h similarity index 89% rename from BioTracker/CoreApp/BioTracker/Controller/ControllerCoreParameter.h rename to Src/Controller/ControllerCoreParameter.h index a1627b13..87e5c093 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerCoreParameter.h +++ b/Src/Controller/ControllerCoreParameter.h @@ -1,11 +1,11 @@ #pragma once -#include "Interfaces/IController/IController.h" +#include "IControllerCfg.h" #include "Interfaces/IModel/IModelAreaDescriptor.h" #include #include -class ControllerCoreParameter : public IController +class ControllerCoreParameter : public IControllerCfg { Q_OBJECT public: @@ -25,9 +25,9 @@ class ControllerCoreParameter : public IController public slots: void setCorePermission(std::pair permission); - void changeAreaDescriptorType(QString type); - void receiveResetTrial(); - + void changeAreaDescriptorType(QString type); + void receiveResetTrial(); + //Forwarded from data exporter int getTrialNumber(); diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.cpp b/Src/Controller/ControllerDataExporter.cpp similarity index 85% rename from BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.cpp rename to Src/Controller/ControllerDataExporter.cpp index c4436669..40870293 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.cpp +++ b/Src/Controller/ControllerDataExporter.cpp @@ -5,14 +5,14 @@ #include "Model/DataExporters/DataExporterCSV.h" #include "Model/DataExporters/DataExporterSerialize.h" #include "Model/DataExporters/DataExporterJson.h" -#include "settings/Settings.h" #include "util/types.h" #include #include "QDesktopServices" +using namespace BioTrackerUtilsMisc; //split ControllerDataExporter::ControllerDataExporter(QObject *parent, IBioTrackerContext *context, ENUMS::CONTROLLERTYPE ctr) : - IController(parent, context, ctr) + IControllerCfg(parent, context, ctr) { } @@ -39,8 +39,8 @@ void ControllerDataExporter::connectControllerToController() { QObject::connect(this, &ControllerDataExporter::emitViewUpdate, tccController, &ControllerTrackedComponentCore::receiveUpdateView, Qt::DirectConnection); - ControllerPlayer* cPl = dynamic_cast(m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::PLAYER)); - QObject::connect(cPl, &ControllerPlayer::emitNextMediaInBatch, this, &ControllerDataExporter::receiveReset, Qt::DirectConnection); + // ControllerPlayer* cPl = dynamic_cast(m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::PLAYER)); + // QObject::connect(cPl, &ControllerPlayer::emitNextMediaInBatch, this, &ControllerDataExporter::receiveReset, Qt::DirectConnection); } void ControllerDataExporter::createModel() { @@ -85,8 +85,7 @@ void ControllerDataExporter::setDataStructure(IModel* exp) { delete getModel(); //Grab the codec from config file - BioTracker::Core::Settings *set = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); - std::string exporter = exporterList[set->getValueOrDefault(CFG_EXPORTER, 0)]; + std::string exporter = exporterList[_cfg->DataExporter]; if (exporter == "CSV") m_Model = new DataExporterCSV(this); else if (exporter == "Serialize") @@ -150,7 +149,7 @@ void ControllerDataExporter::rcvPlayerParameters(playerParameters* parameters) { int ControllerDataExporter::getNumber(bool trial) { //Get all existing files of trial or track directory and parse highest export number - QString basePath = trial ? CFG_DIR_TRIALS : CFG_DIR_TRACKS; + QString basePath = trial ? _cfg->DirTrials : _cfg->DirTracks; QStringList allFiles = QDir(basePath).entryList(QDir::NoDotAndDotDot | QDir::Files); int maxVal = 0; @@ -165,9 +164,9 @@ int ControllerDataExporter::getNumber(bool trial) { QString ControllerDataExporter::generateBasename(bool temporaryFile) { - QString resultPath = (_trialStarted ? CFG_DIR_TRIALS : CFG_DIR_TRACKS); + QString resultPath = (_trialStarted ?_cfg->DirTrials : _cfg->DirTracks); - QString path = (temporaryFile ? CFG_DIR_TEMP : resultPath); + QString path = (temporaryFile ? _cfg->DirTemp : resultPath); int maxVal = getNumber(_trialStarted ? true : false); std::string current = "Export_"+std::to_string(maxVal+1)+"_"; @@ -179,9 +178,6 @@ void ControllerDataExporter::receiveFileWritten(QFileInfo fname) { QString str = "Exported file:\n"; str += fname.absoluteFilePath(); -// int ret = QMessageBox::information(nullptr, QString("Trajectory Exporting"), -// str, -// QMessageBox::Ok); QMessageBox msgBox; msgBox.setText("File saved!"); msgBox.setInformativeText(str); diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.h b/Src/Controller/ControllerDataExporter.h similarity index 90% rename from BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.h rename to Src/Controller/ControllerDataExporter.h index ea71cb3c..a3af361e 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerDataExporter.h +++ b/Src/Controller/ControllerDataExporter.h @@ -1,6 +1,6 @@ #pragma once -#include "Interfaces/IController/IController.h" +#include "IControllerCfg.h" #include "Interfaces/IBioTrackerPlugin.h" #include "Interfaces/IModel/IModelTrackedComponentFactory.h" #include "QPointer" @@ -13,7 +13,7 @@ struct SourceVideoMetadata { std::string fps; }; -class ControllerDataExporter : public IController { +class ControllerDataExporter : public IControllerCfg { Q_OBJECT public: ControllerDataExporter(QObject* parent = 0, IBioTrackerContext* context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerGraphicScene.cpp b/Src/Controller/ControllerGraphicScene.cpp similarity index 97% rename from BioTracker/CoreApp/BioTracker/Controller/ControllerGraphicScene.cpp rename to Src/Controller/ControllerGraphicScene.cpp index 24ac9fb8..e2e133af 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerGraphicScene.cpp +++ b/Src/Controller/ControllerGraphicScene.cpp @@ -5,7 +5,7 @@ #include "View/MainWindow.h" ControllerGraphicScene::ControllerGraphicScene(QObject *parent, IBioTrackerContext *context, ENUMS::CONTROLLERTYPE ctr) : - IController(parent, context, ctr) + IControllerCfg(parent, context, ctr) { m_Element = NULL; m_GraphicsView = NULL; diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerGraphicScene.h b/Src/Controller/ControllerGraphicScene.h similarity index 94% rename from BioTracker/CoreApp/BioTracker/Controller/ControllerGraphicScene.h rename to Src/Controller/ControllerGraphicScene.h index 84972cd1..75b9d003 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerGraphicScene.h +++ b/Src/Controller/ControllerGraphicScene.h @@ -8,7 +8,7 @@ #ifndef CONTROLLERGRAPHICSCENE_H #define CONTROLLERGRAPHICSCENE_H -#include "Interfaces/IController/IController.h" +#include "IControllerCfg.h" #include "QGraphicsObject" #include "QPointer" @@ -18,7 +18,7 @@ * The GraphicsItem represents the compositum structure of IViewTrackedComponent classes. These structure comes from the ControllerTrackedComponentCore or the Plugin and handed over by the PluginController of the MainApplication. * */ -class ControllerGraphicScene : public IController { +class ControllerGraphicScene : public IControllerCfg { Q_OBJECT public: ControllerGraphicScene(QObject* parent = 0, IBioTrackerContext* context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerMainWindow.cpp b/Src/Controller/ControllerMainWindow.cpp similarity index 92% rename from BioTracker/CoreApp/BioTracker/Controller/ControllerMainWindow.cpp rename to Src/Controller/ControllerMainWindow.cpp index 225dbbd8..d0673501 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerMainWindow.cpp +++ b/Src/Controller/ControllerMainWindow.cpp @@ -22,7 +22,7 @@ ControllerMainWindow::ControllerMainWindow(QObject* parent, IBioTrackerContext* context, ENUMS::CONTROLLERTYPE ctr) : - IController(parent, context, ctr) { + IControllerCfg(parent, context, ctr) { } @@ -150,7 +150,6 @@ void ControllerMainWindow::connectModelToController() { ControllerDataExporter *contrl = static_cast(ctr2); QObject::connect(this, &ControllerMainWindow::emitOnLoadMedia, contrl, &ControllerDataExporter::receiveFinalizeExperiment, Qt::DirectConnection); QObject::connect(this, &ControllerMainWindow::emitOnLoadPlugin, contrl, &ControllerDataExporter::receiveReset, Qt::DirectConnection); - } void ControllerMainWindow::connectControllerToController() { @@ -208,12 +207,15 @@ void ControllerMainWindow::connectControllerToController() { QObject::connect(this, &ControllerMainWindow::emitOnLoadMedia, ctrcpv, &ControllerCoreParameter::receiveResetTrial, Qt::DirectConnection); QObject::connect(this, &ControllerMainWindow::emitOnLoadPlugin, ctrcpv, &ControllerCoreParameter::receiveResetTrial, Qt::DirectConnection); - // - BioTracker::Core::Settings *set = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); - std::string *video = (std::string*)(set->readValue("video")); - if (video) - loadVideo({ video->c_str() }); - + // batch media signals + IController* ctr3 = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::PLAYER); + ControllerPlayer *cont3 = static_cast(ctr3); + QObject::connect(cont3, &ControllerPlayer::emitNextMediaInBatch, this, &ControllerMainWindow::emitOnLoadMedia, Qt::DirectConnection); + QObject::connect(cont3, &ControllerPlayer::emitNextMediaInBatchLoaded, this, &ControllerMainWindow::emitMediaLoaded, Qt::DirectConnection); + + //Load video as per CLI + if (!_cfg->LoadVideo.isEmpty()) + loadVideo({ _cfg->LoadVideo.toStdString().c_str() }); } void ControllerMainWindow::receiveCursorPosition(QPoint pos) diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerMainWindow.h b/Src/Controller/ControllerMainWindow.h similarity index 97% rename from BioTracker/CoreApp/BioTracker/Controller/ControllerMainWindow.h rename to Src/Controller/ControllerMainWindow.h index 548cedc6..84e59595 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerMainWindow.h +++ b/Src/Controller/ControllerMainWindow.h @@ -8,7 +8,7 @@ #ifndef CONTROLLERMAINWINDOW_H #define CONTROLLERMAINWINDOW_H -#include "Interfaces/IController/IController.h" +#include "IControllerCfg.h" #include "QPointer" #include "QStringListModel" #include "boost/filesystem.hpp" @@ -20,7 +20,7 @@ * All user interactions done through the MainWindow class are delegated to the controllers of the component that concerns them. * Other components can place their IView Widgets on the MainWindow. */ -class ControllerMainWindow : public IController { +class ControllerMainWindow : public IControllerCfg { Q_OBJECT public: ControllerMainWindow(QObject* parent = 0, IBioTrackerContext* context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerNotifications.cpp b/Src/Controller/ControllerNotifications.cpp similarity index 96% rename from BioTracker/CoreApp/BioTracker/Controller/ControllerNotifications.cpp rename to Src/Controller/ControllerNotifications.cpp index cdb59a49..07295117 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerNotifications.cpp +++ b/Src/Controller/ControllerNotifications.cpp @@ -6,7 +6,7 @@ IView* view; ControllerNotifications::ControllerNotifications(QObject* parent, IBioTrackerContext* context, ENUMS::CONTROLLERTYPE ctr) : - IController(parent, context, ctr) { + IControllerCfg(parent, context, ctr) { } diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerNotifications.h b/Src/Controller/ControllerNotifications.h similarity index 90% rename from BioTracker/CoreApp/BioTracker/Controller/ControllerNotifications.h rename to Src/Controller/ControllerNotifications.h index b5533d53..19a73f54 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerNotifications.h +++ b/Src/Controller/ControllerNotifications.h @@ -3,7 +3,7 @@ #ifndef CONTROLLERNOTIFICATIONS_H #define CONTROLLERNOTIFICATIONS_H -#include "Interfaces/IController/IController.h" +#include "IControllerCfg.h" /** * This class inherits from IController. @@ -13,7 +13,7 @@ * This text browser is displayed in the 'Notifications' tab in the GUI. * QDebug reference: http://doc.qt.io/qt-5/qdebug.html */ -class ControllerNotifications : public IController { +class ControllerNotifications : public IControllerCfg { Q_OBJECT public: ControllerNotifications(QObject* parent = 0, IBioTrackerContext* context = 0, diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerPlayer.cpp b/Src/Controller/ControllerPlayer.cpp similarity index 82% rename from BioTracker/CoreApp/BioTracker/Controller/ControllerPlayer.cpp rename to Src/Controller/ControllerPlayer.cpp index 2a8191a1..2789dc85 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerPlayer.cpp +++ b/Src/Controller/ControllerPlayer.cpp @@ -11,7 +11,7 @@ #include ControllerPlayer::ControllerPlayer(QObject *parent, IBioTrackerContext *context, ENUMS::CONTROLLERTYPE ctr) : - IController(parent, context, ctr) + IControllerCfg(parent, context, ctr) { } @@ -144,10 +144,38 @@ void ControllerPlayer::connectModelToController() { QObject::connect(this, &ControllerPlayer::emitPauseState, qobject_cast(m_Model), &MediaPlayer::rcvPauseState); QObject::connect(qobject_cast(m_Model), &MediaPlayer::signalVisualizeCurrentModel, this, &ControllerPlayer::receiveVisualizeCurrentModel); QObject::connect(qobject_cast(m_Model), &MediaPlayer::signalCurrentFrameNumberToPlugin, this, &ControllerPlayer::receiveCurrentFrameNumberToPlugin); - QObject::connect(qobject_cast(m_Model), &MediaPlayer::emitNextMediaInBatch, this, &ControllerPlayer::emitNextMediaInBatch); + QObject::connect(qobject_cast(m_Model), &MediaPlayer::emitNextMediaInBatch, this, &ControllerPlayer::receiveNextMediaInBatch, Qt::DirectConnection); + QObject::connect(qobject_cast(m_Model), &MediaPlayer::emitNextMediaInBatchLoaded, this, &ControllerPlayer::receiveNextMediaInBatchLoaded, Qt::DirectConnection); + + + IController* ctrTRCC = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); + QPointer< ControllerTrackedComponentCore > trCC = qobject_cast(ctrTRCC); + + QObject::connect(trCC, &ControllerTrackedComponentCore::emitTrackNumber, this, &ControllerPlayer::receiveTrackCount, Qt::DirectConnection); + +} + +void ControllerPlayer::receiveNextMediaInBatch(const std::string path){ + _trackCountEndOfBatch = _trackCount; + Q_EMIT emitNextMediaInBatch(path); } +void ControllerPlayer::receiveNextMediaInBatchLoaded(const std::string path){ + Q_EMIT emitNextMediaInBatchLoaded(path); + + IController* ctrTRCC = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); + QPointer< ControllerTrackedComponentCore > trCC = qobject_cast(ctrTRCC); + for(int i=0; i<_trackCountEndOfBatch; i++){ + trCC->emitAddTrack(); + } +} + +void ControllerPlayer::receiveTrackCount(int trackNo){ + _trackCount = trackNo; +} + + void ControllerPlayer::receiveVisualizeCurrentModel(uint frameNumber) { IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerPlayer.h b/Src/Controller/ControllerPlayer.h similarity index 89% rename from BioTracker/CoreApp/BioTracker/Controller/ControllerPlayer.h rename to Src/Controller/ControllerPlayer.h index b139a531..50ca447d 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerPlayer.h +++ b/Src/Controller/ControllerPlayer.h @@ -7,7 +7,7 @@ #ifndef CONTROLLERPLAYER_H #define CONTROLLERPLAYER_H -#include "Interfaces/IController/IController.h" +#include "IControllerCfg.h" #include "Model/MediaPlayer.h" #include "QPointer" #include "util/types.h" @@ -15,7 +15,7 @@ /** * The ControllerPlayer class it the controller of the MediaPlayer-Component. This controller creates and controlls the IModel class MediaPlayer and the IView class VideoControllWidget. */ -class ControllerPlayer : public IController { +class ControllerPlayer : public IControllerCfg { Q_OBJECT public: ControllerPlayer(QObject* parent = 0, IBioTrackerContext* context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); @@ -86,7 +86,8 @@ class ControllerPlayer : public IController { signals: void emitPauseState(bool state); void signalCurrentFrameNumberToPlugin(uint frameNumber); - void emitNextMediaInBatch(); + void emitNextMediaInBatch(const std::string path); + void emitNextMediaInBatchLoaded(const std::string path); public Q_SLOTS: /** @@ -110,10 +111,19 @@ class ControllerPlayer : public IController { */ void setGoToFrame(int frame); + + void receiveNextMediaInBatch(const std::string path); + void receiveNextMediaInBatchLoaded(const std::string path); + void receiveTrackCount(int trackNo); + protected: void createModel() override; void createView() override; void connectModelToController() override; + + private: + int _trackCount = 0; + int _trackCountEndOfBatch = 0; }; #endif // CONTROLLERPLAYER_H diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerPlugin.cpp b/Src/Controller/ControllerPlugin.cpp similarity index 88% rename from BioTracker/CoreApp/BioTracker/Controller/ControllerPlugin.cpp rename to Src/Controller/ControllerPlugin.cpp index b776af30..ebd67e91 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerPlugin.cpp +++ b/Src/Controller/ControllerPlugin.cpp @@ -5,17 +5,17 @@ #include "Controller/ControllerTrackedComponentCore.h" #include "ControllerMainWindow.h" #include "QDebug" -#include "Model/PluginLoader.h" -#include "settings/Settings.h" #include "util/types.h" #include "ControllerDataExporter.h" #include "ControllerAreaDescriptor.h" #include "Controller/ControllerCoreParameter.h" #include "Controller/ControllerCommands.h" +#define REGISTRY_PATH "SOFTWARE\\FUBioroboticsLab\\Robofish\\BioTracker\\Plugins" +#define TRACKER_SUFFIX ".bio_tracker" ControllerPlugin::ControllerPlugin(QObject* parent, IBioTrackerContext* context, ENUMS::CONTROLLERTYPE ctr) : - IController(parent, context, ctr) { + IControllerCfg(parent, context, ctr) { m_BioTrackerPlugin = NULL; m_TrackingThread = new QThread(this); @@ -23,6 +23,13 @@ ControllerPlugin::ControllerPlugin(QObject* parent, IBioTrackerContext* context, } ControllerPlugin::~ControllerPlugin() { + + //They might not exist (no plugins available!) + if(m_BioTrackerPlugin) + delete m_BioTrackerPlugin; + if(pluginLoader) + delete pluginLoader; + m_TrackingThread->quit(); m_TrackingThread->wait(); @@ -30,30 +37,29 @@ ControllerPlugin::~ControllerPlugin() { void ControllerPlugin::addToPluginList(QString str) { - PluginLoader* loader = qobject_cast(m_Model); - loader->addToPluginList(str); + std::string s = str.toStdString(); + pluginLoader->addToPluginList(str, TRACKER_SUFFIX); // Add Plugin name to Main Window IController* ctrA = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::MAINWINDOW); QPointer< ControllerMainWindow > ctrMainWindow = qobject_cast(ctrA); - ctrMainWindow->setTrackerList(qobject_cast(m_Model)->getPluginMetaData(), - qobject_cast(m_Model)->getCurrentPluginName()); + ctrMainWindow->setTrackerList(pluginLoader->getPluginList(), + pluginLoader->getCurrentPluginName()); } void ControllerPlugin::loadPluginFromFileName(QString str) { - PluginLoader* loader = qobject_cast(m_Model); - - if (loader->loadPluginFromFilename(str)) { + if (pluginLoader->loadPluginFromFilename(str)) { + m_BioTrackerPlugin = qobject_cast(pluginLoader->getPluginInstance()); createPlugin(); // Add Plugin name to Main Window IController* ctrA = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::MAINWINDOW); QPointer< ControllerMainWindow > ctrMainWindow = qobject_cast(ctrA); - ctrMainWindow->setTrackerList(qobject_cast(m_Model)->getPluginMetaData(), - qobject_cast(m_Model)->getCurrentPluginName()); + ctrMainWindow->setTrackerList(pluginLoader->getPluginList(), + pluginLoader->getCurrentPluginName()); //Add Tracker Parameter to Main Window IView *parms = m_BioTrackerPlugin->getTrackerParameterWidget(); @@ -77,21 +83,22 @@ void ControllerPlugin::loadPluginFromFileName(QString str) { ctrDataExp->setComponentFactory(m_BioTrackerPlugin->getComponentFactory()); m_BioTrackerPlugin->sendCorePermissions(); - + }else{ + qWarning() << "Failed to load plugin from filename!"; } } void ControllerPlugin::selectPlugin(QString str) { if (str.isEmpty()) return; - PluginLoader* loader = qobject_cast(m_Model); - if (loader->getCurrentPluginName() != str) - loadPluginFromFileName(loader->getPluginMap().find(str)->second); + if (pluginLoader->getCurrentPluginName() != str) + loadPluginFromFileName(pluginLoader->getPluginMap().find(str)->second); } void ControllerPlugin::createModel() { - m_Model = new PluginLoader(this); + m_Model = nullptr; + pluginLoader = new PluginLoader(this); } void ControllerPlugin::createView() { @@ -103,22 +110,27 @@ void ControllerPlugin::connectModelToController() { void ControllerPlugin::loadPluginsFromPluginSubfolder() { ////////////// - QDir d(CFG_DIR_PLUGINS); + QDir d(_cfg->DirPlugins); d.setFilter(QDir::Filter::Files); QStringList nameFilter; QFileInfoList fl = d.entryInfoList(nameFilter, QDir::Filter::Files); + + //Grab list of behaviours from config & registry + std::vector list = _cfg->UseRegistryLocations==true ? PluginLoader::queryRegistryBehaviors(REGISTRY_PATH) : std::vector(); + //Search directories + std::vector filesFromFolders = PluginLoader::searchDirectoriesForPlugins(list, TRACKER_SUFFIX); + for(auto x: filesFromFolders) + addToPluginList(x.c_str()); + foreach(QFileInfo fi, fl) { QString s = fi.absoluteFilePath(); - std::string asdf = s.toStdString(); addToPluginList(s); } - BioTracker::Core::Settings *set = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); - std::string *usePlugins = (std::string*)(set->readValue("usePlugins")); - if (usePlugins) { - addToPluginList(usePlugins->c_str()); + //Load plugins as per CLI + if (!_cfg->UsePlugins.isEmpty()) { + addToPluginList(_cfg->UsePlugins.toStdString().c_str()); } - } void ControllerPlugin::connectControllerToController() { @@ -176,7 +188,10 @@ void ControllerPlugin::connectControllerToController() { } void ControllerPlugin::createPlugin() { - m_BioTrackerPlugin = qobject_cast(m_Model)->getPluginInstance(); + m_BioTrackerPlugin = qobject_cast(pluginLoader->getPluginInstance()); + if (!m_BioTrackerPlugin){ + qFatal("Error at loading plugin."); + } m_BioTrackerPlugin->createPlugin(); m_BioTrackerPlugin->moveToThread(m_TrackingThread); @@ -495,3 +510,4 @@ void ControllerPlugin::receiveCurrentFrameNumberToPlugin(uint frameNumber) void ControllerPlugin::receiveTrackingDone() { } + diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerPlugin.h b/Src/Controller/ControllerPlugin.h similarity index 97% rename from BioTracker/CoreApp/BioTracker/Controller/ControllerPlugin.h rename to Src/Controller/ControllerPlugin.h index ea0028e1..4d0239a0 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerPlugin.h +++ b/Src/Controller/ControllerPlugin.h @@ -8,9 +8,9 @@ #ifndef CONTROLLERPLUGIN_H #define CONTROLLERPLUGIN_H - -#include "Interfaces/IController/IController.h" +#include "IControllerCfg.h" #include "Interfaces/IBioTrackerPlugin.h" +#include "PluginLoader.h" #include "QThread" #include "QQueue" #include "QPoint" @@ -38,7 +38,7 @@ struct queueElement { * either the tracking is paused or the tracker is done with tracking the previous frame. The plgin then sends the commands first and afterward * the next image to track. This avoids a race condition. */ -class ControllerPlugin : public IController { +class ControllerPlugin : public IControllerCfg { Q_OBJECT public: ControllerPlugin(QObject* parent = 0, IBioTrackerContext* context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); @@ -165,6 +165,8 @@ class ControllerPlugin : public IController { QPointer< QThread > m_TrackingThread; + PluginLoader* pluginLoader; + bool m_paused = true; uint m_currentFrameNumber = 0; @@ -173,4 +175,8 @@ class ControllerPlugin : public IController { }; + + + + #endif // CONTROLLERPLUGIN_H diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerTextureObject.cpp b/Src/Controller/ControllerTextureObject.cpp similarity index 98% rename from BioTracker/CoreApp/BioTracker/Controller/ControllerTextureObject.cpp rename to Src/Controller/ControllerTextureObject.cpp index 13cd5869..bf8132a7 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerTextureObject.cpp +++ b/Src/Controller/ControllerTextureObject.cpp @@ -7,7 +7,7 @@ #include "View/TextureObjectView.h" ControllerTextureObject::ControllerTextureObject(QObject* parent, IBioTrackerContext* context, ENUMS::CONTROLLERTYPE ctr) : - IController(parent, context, ctr) { + IControllerCfg(parent, context, ctr) { m_TextureViewNamesModel = new QStringListModel(); m_TextureViewNamesModel->setStringList(m_TextureViewNames); } diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerTextureObject.h b/Src/Controller/ControllerTextureObject.h similarity index 96% rename from BioTracker/CoreApp/BioTracker/Controller/ControllerTextureObject.h rename to Src/Controller/ControllerTextureObject.h index ca1c80f3..cdcc50f2 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerTextureObject.h +++ b/Src/Controller/ControllerTextureObject.h @@ -9,7 +9,7 @@ #ifndef CONTROLLERTEXTUREOBJECT_H #define CONTROLLERTEXTUREOBJECT_H -#include "Interfaces/IController/IController.h" +#include "IControllerCfg.h" #include "opencv2/core/core.hpp" #include "QString" #include "Model/TextureObject.h" @@ -25,7 +25,7 @@ * send that cv::Mat to this component. The Parameter name will be listed in the combobox widget on the MainWindow widget. * The ControllerTextureObject class controlls the of the TrextureObject Component. */ -class ControllerTextureObject : public IController { +class ControllerTextureObject : public IControllerCfg { Q_OBJECT public: ControllerTextureObject(QObject* parent = 0, IBioTrackerContext* context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerTrackedComponentCore.cpp b/Src/Controller/ControllerTrackedComponentCore.cpp similarity index 99% rename from BioTracker/CoreApp/BioTracker/Controller/ControllerTrackedComponentCore.cpp rename to Src/Controller/ControllerTrackedComponentCore.cpp index 6bca699c..82d02e82 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerTrackedComponentCore.cpp +++ b/Src/Controller/ControllerTrackedComponentCore.cpp @@ -6,7 +6,6 @@ #include "Model/CoreParameter.h" #include "View/TrackedComponentView.h" #include "View/CoreParameterView.h" -#include "settings/Settings.h" #include "util/types.h" #include "qdebug.h" #include "Interfaces/IModel/IModelTrackedTrajectory.h" @@ -15,7 +14,7 @@ ControllerTrackedComponentCore::ControllerTrackedComponentCore(QObject *parent, IBioTrackerContext *context, ENUMS::CONTROLLERTYPE ctr) : - IController(parent, context, ctr) + IControllerCfg(parent, context, ctr) { m_View = nullptr; m_Model = nullptr; diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerTrackedComponentCore.h b/Src/Controller/ControllerTrackedComponentCore.h similarity index 96% rename from BioTracker/CoreApp/BioTracker/Controller/ControllerTrackedComponentCore.h rename to Src/Controller/ControllerTrackedComponentCore.h index 3cb7b758..69e335d9 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerTrackedComponentCore.h +++ b/Src/Controller/ControllerTrackedComponentCore.h @@ -1,7 +1,7 @@ #ifndef CONTROLLERTRACKEDCOMPONENTCORE_H #define CONTROLLERTRACKEDCOMPONENTCORE_H -#include "Interfaces/IController/IController.h" +#include "IControllerCfg.h" #include "Interfaces/IModel/IModelTrackedTrajectory.h" @@ -10,7 +10,7 @@ * It is basically a forwarder for permissions, user interaction signals (including tracking data manipulation). */ -class ControllerTrackedComponentCore : public IController +class ControllerTrackedComponentCore : public IControllerCfg { Q_OBJECT public: diff --git a/Src/Controller/IControllerCfg.cpp b/Src/Controller/IControllerCfg.cpp new file mode 100644 index 00000000..ce211b4f --- /dev/null +++ b/Src/Controller/IControllerCfg.cpp @@ -0,0 +1,13 @@ +#include "IControllerCfg.h" + +IControllerCfg::IControllerCfg(QObject* parent, IBioTrackerContext* context, ENUMS::CONTROLLERTYPE ctr) : + IController(parent, context, ctr) { +} + +void IControllerCfg::setConfig(Config *cfg){ + _cfg=cfg; +} + +Config *IControllerCfg::getConfig(){ + return _cfg; +} \ No newline at end of file diff --git a/Src/Controller/IControllerCfg.h b/Src/Controller/IControllerCfg.h new file mode 100644 index 00000000..14012c0a --- /dev/null +++ b/Src/Controller/IControllerCfg.h @@ -0,0 +1,31 @@ +/**************************************************************************** + ** + ** This file is part of the BioTracker Framework + ** by Andreas Jörg + ** + ****************************************************************************/ + +#ifndef NULL_CONTROLLER_H +#define NULL_CONTROLLER_H + +#include "Interfaces/IController/IController.h" +#include "Interfaces/ENUMS.h" +#include "util/Config.h" + +/** + * The null_Controller class is for initialisation of IController classes instead of using Null Pointers. + */ +class IControllerCfg : public IController { + +public: + IControllerCfg(QObject* parent = 0, IBioTrackerContext* context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); + + void setConfig(Config *cfg); + + Config *getConfig(); + +protected: + Config *_cfg; +}; + +#endif // NULL_CONTROLLER_H diff --git a/BioTracker/CoreApp/BioTracker/Controller/null_Controller.cpp b/Src/Controller/null_Controller.cpp similarity index 100% rename from BioTracker/CoreApp/BioTracker/Controller/null_Controller.cpp rename to Src/Controller/null_Controller.cpp diff --git a/BioTracker/CoreApp/BioTracker/Controller/null_Controller.h b/Src/Controller/null_Controller.h similarity index 77% rename from BioTracker/CoreApp/BioTracker/Controller/null_Controller.h rename to Src/Controller/null_Controller.h index 9fdba1b3..a3d813cb 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/null_Controller.h +++ b/Src/Controller/null_Controller.h @@ -4,16 +4,14 @@ ** by Andreas Jörg ** ****************************************************************************/ +#pragma once -#ifndef NULL_CONTROLLER_H -#define NULL_CONTROLLER_H - -#include "Interfaces/IController/IController.h" +#include "IControllerCfg.h" /** * The null_Controller class is for initialisation of IController classes instead of using Null Pointers. */ -class null_Controller : public IController { +class null_Controller : public IControllerCfg { public: null_Controller(); @@ -24,5 +22,3 @@ class null_Controller : public IController { void connectModelToController() override; void connectControllerToController() override; }; - -#endif // NULL_CONTROLLER_H diff --git a/BioTracker/CoreApp/BioTracker/GuiContext.cpp b/Src/GuiContext.cpp similarity index 91% rename from BioTracker/CoreApp/BioTracker/GuiContext.cpp rename to Src/GuiContext.cpp index 3c1fbd4b..fcaf0914 100644 --- a/BioTracker/CoreApp/BioTracker/GuiContext.cpp +++ b/Src/GuiContext.cpp @@ -18,9 +18,10 @@ #include "QDebug" -GuiContext::GuiContext(QObject *parent) : +GuiContext::GuiContext(QObject *parent, Config *cfg) : IBioTrackerContext(parent) { + _cfg = cfg; QPointer< IController > MainWindowController = new ControllerMainWindow(this, this, ENUMS::CONTROLLERTYPE::MAINWINDOW); QPointer< IController > PlayerController = new ControllerPlayer(this, this, ENUMS::CONTROLLERTYPE::PLAYER); QPointer< IController > TextureObjectController = new ControllerTextureObject(this, this, ENUMS::CONTROLLERTYPE::TEXTUREOBJECT); @@ -47,7 +48,10 @@ GuiContext::GuiContext(QObject *parent) : m_ControllersMap.insert(ENUMS::CONTROLLERTYPE::COMMANDS, CommandsController); m_ControllersMap.insert(ENUMS::CONTROLLERTYPE::NOTIFICATION, NotificationController); - + for (auto x: m_ControllersMap){ + auto c = static_cast(x); + c->setConfig(_cfg); + } } void GuiContext::loadBioTrackerPlugin(QString str) @@ -75,16 +79,18 @@ void GuiContext::connectController() void GuiContext::exit() { + QString cfgLoc = _cfg->CfgCustomLocation.isEmpty()?Config::configLocation:_cfg->CfgCustomLocation; + _cfg->save(cfgLoc, "config.ini"); QMap::iterator i; for (i = m_ControllersMap.begin(); i != m_ControllersMap.end(); ++i) { i.value()->cleanup(); } - //for (auto&& i : m_ControllersMap) - //{ - // delete i; - //} + for (auto&& i : m_ControllersMap) + { + delete i; + } qApp->exit(); std::exit(0); diff --git a/BioTracker/CoreApp/BioTracker/GuiContext.h b/Src/GuiContext.h similarity index 81% rename from BioTracker/CoreApp/BioTracker/GuiContext.h rename to Src/GuiContext.h index 93fc3b68..31944c92 100644 --- a/BioTracker/CoreApp/BioTracker/GuiContext.h +++ b/Src/GuiContext.h @@ -3,16 +3,14 @@ #include "Interfaces/IBioTrackerContext.h" #include "Interfaces/IController/IController.h" - - - +#include "util/Config.h" class GuiContext : public IBioTrackerContext { Q_OBJECT public: - GuiContext(QObject *parent = 0); + GuiContext(QObject *parent = 0, Config *cfg = nullptr); ~GuiContext() { exit(); } @@ -25,6 +23,7 @@ class GuiContext : public IBioTrackerContext protected: void createAppController() override; void connectController() override; + Config *_cfg; }; #endif // GUICONTEXT_H diff --git a/BioTracker/CoreApp/BioTracker/IStates/IPlayerState.cpp b/Src/IStates/IPlayerState.cpp similarity index 100% rename from BioTracker/CoreApp/BioTracker/IStates/IPlayerState.cpp rename to Src/IStates/IPlayerState.cpp diff --git a/BioTracker/CoreApp/BioTracker/IStates/IPlayerState.h b/Src/IStates/IPlayerState.h similarity index 55% rename from BioTracker/CoreApp/BioTracker/IStates/IPlayerState.h rename to Src/IStates/IPlayerState.h index eab5a681..d47d81df 100644 --- a/BioTracker/CoreApp/BioTracker/IStates/IPlayerState.h +++ b/Src/IStates/IPlayerState.h @@ -42,57 +42,69 @@ class MediaPlayerStateMachine; * */ class IPlayerState : public IModel { - Q_OBJECT - public: - explicit IPlayerState(MediaPlayerStateMachine* player, std::shared_ptr imageStream); - enum PLAYER_STATES {STATE_INITIAL, STATE_INITIAL_STREAM, STATE_PLAY, STATE_STEP_FORW, - STATE_STEP_BACK, STATE_PAUSE, STATE_WAIT, STATE_GOTOFRAME - }; - Q_ENUM(PLAYER_STATES) - - - public: - /** - * If the user changes the Image Source all states will be informed throught this method. - */ - void changeImageStream(std::shared_ptr imageStream); - - /** - * Must be implemented by any state. Implement here the ImageStream manipulation. - */ - virtual void operate() = 0; - - /** - * Returns the State Parameters for the ImageStream controlls in the VideoViewWidget. - */ - stateParameters getStateParameters(); + Q_OBJECT + +public: + explicit IPlayerState(MediaPlayerStateMachine* player, std::shared_ptr imageStream); + enum PLAYER_STATES {STATE_INITIAL, STATE_INITIAL_STREAM, STATE_PLAY, STATE_STEP_FORW, + STATE_STEP_BACK, STATE_PAUSE, STATE_WAIT, STATE_GOTOFRAME + }; + Q_ENUM(PLAYER_STATES) + + +public: + /** + * If the user changes the Image Source all states will be informed throught this method. + */ + void changeImageStream(std::shared_ptr imageStream); + + /** + * Must be implemented by any state. Implement here the ImageStream manipulation. + */ + virtual void operate() = 0; + + /** + * Returns the State Parameters for the ImageStream controlls in the VideoViewWidget. + */ + stateParameters getStateParameters(); + /** * Returns the current filename of the ImageStream. */ QString getCurrentFileName(); + /** * Returns the current title of the ImageStream. */ std::string getCurrentTitle() { return m_ImageStream->getTitle(); }; - /** - * Returns the current cv::Mat of the ImageStream. - */ - std::shared_ptr getCurrentFrame(); - /** - * Returns the current frame number of the ImageStream. - */ - size_t getCurrentFrameNumber(); + + std::vector getBatchItems() { return m_ImageStream->getBatchItems(); }; + + /** + * Returns the current cv::Mat of the ImageStream. + */ + std::shared_ptr getCurrentFrame(); + + /** + * Returns the current frame number of the ImageStream. + */ + size_t getCurrentFrameNumber(); //TODO: The Media player does not hold a valid imagestream. Hence use the current state's stream to grab details std::shared_ptr m_ImageStream; - protected: - MediaPlayerStateMachine* m_Player; + +Q_SIGNALS: + void emitNextMediaInBatch(const std::string path); + void emitNextMediaInBatchLoaded(const std::string path); + +protected: + MediaPlayerStateMachine* m_Player; - stateParameters m_StateParameters; + stateParameters m_StateParameters; - std::shared_ptr m_Mat; - size_t m_FrameNumber; + std::shared_ptr m_Mat; + size_t m_FrameNumber; std::fstream fs; QString m_currentFileName; diff --git a/BioTracker/CoreApp/BioTracker/Model/Annotations.cpp b/Src/Model/Annotations.cpp similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/Annotations.cpp rename to Src/Model/Annotations.cpp diff --git a/BioTracker/CoreApp/BioTracker/Model/Annotations.h b/Src/Model/Annotations.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/Annotations.h rename to Src/Model/Annotations.h diff --git a/BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/AreaInfo.cpp b/Src/Model/AreaDescriptor/AreaInfo.cpp similarity index 82% rename from BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/AreaInfo.cpp rename to Src/Model/AreaDescriptor/AreaInfo.cpp index 3b13cbe1..083b6a26 100644 --- a/BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/AreaInfo.cpp +++ b/Src/Model/AreaDescriptor/AreaInfo.cpp @@ -1,67 +1,69 @@ #include "AreaInfo.h" - -#include "Rectification.h" -#include "settings/Settings.h" +#include "Rectification.h" + #include "util/misc.h" #include -#include "AreaMemory.h" - -using namespace AreaMemory; +#include "AreaMemory.h" + +using namespace AreaMemory; +using namespace BioTrackerUtilsMisc; AreaInfo::AreaInfo(QObject *parent) : IModelAreaDescriptor(parent) { _parms = nullptr; + _areaInfoCache = static_cast(parent)->getConfig()->AreaDefinitions; _rect = std::make_shared(); _rect->setShowNumbers(true); _rect->setAreaType(BiotrackerTypes::AreaType::RECT); _apperture = std::make_shared(); _apperture->setAreaType(BiotrackerTypes::AreaType::APPERTURE); + _useEntireScreen = true; loadAreas(); - -} - -QString AreaInfo::myType(){ - if (_apperture != nullptr) { - return QString::number(_apperture->getType()); - } - return "0"; -} - -void AreaInfo::reset(int w, int h) { - _useEntireScreen = true; - _rectInitialized = false; - _vdimX = w; - _vdimY = h; - - - QVector vertices = _parms != nullptr ? getVertices(_parms->m_CurrentFilename) : QVector(); - - if ( vertices == DEFAULT_PAIR //couldn't find entry - || vertices.empty()) //biotracker just started - { - std::vector v{ - cv::Point(0,0), - cv::Point(0,_vdimY), - cv::Point(_vdimX,_vdimY), - cv::Point(_vdimX,0) - }; - _apperture->setVertices(v); - _rect->setVertices(v); + updateRectification(); +} + +QString AreaInfo::myType(){ + if (_apperture != nullptr) { + return QString::number(_apperture->getType()); + } + return "0"; +} + +void AreaInfo::reset(int w, int h) { + _useEntireScreen = true; + _rectInitialized = false; + _vdimX = w; + _vdimY = h; + + + QVector vertices = _parms != nullptr ? getVertices(_parms->m_CurrentFilename, _areaInfoCache) : QVector(); + + if ( vertices == DEFAULT_PAIR //couldn't find entry + || vertices.empty()) //biotracker just started + { + std::vector v{ + cv::Point(0,0), + cv::Point(0,_vdimY), + cv::Point(_vdimX,_vdimY), + cv::Point(_vdimX,0) + }; + _apperture->setVertices(v); + _rect->setVertices(v); } else { std::vector pts = toQPointVector(vertices[0]); - std::vector pts2 = toQPointVector(vertices[1]); - _apperture->setVertices(QVecToCvVec(pts2)); - _rect->setVertices(QVecToCvVec(pts)); - } + std::vector pts2 = toQPointVector(vertices[1]); + _apperture->setVertices(QVecToCvVec(pts2)); + _rect->setVertices(QVecToCvVec(pts)); + } } void AreaInfo::loadAreas() { - QVector pair = getVertices(_parms ? _parms->m_CurrentFilename : "", true); + QVector pair = getVertices(_parms ? _parms->m_CurrentFilename : "", _areaInfoCache, true); if (pair[1] == QString(DEFAULT_RECT)) { if (_parms) { @@ -79,38 +81,38 @@ void AreaInfo::loadAreas() { p = stringToCVPointVec(pair[1].toStdString());; _apperture->setVertices(p); -} - -void AreaInfo::rcvPlayerParameters(playerParameters* parameters) -{ - if (_parms == nullptr || _parms->m_CurrentFilename != parameters->m_CurrentFilename) { - _rectInitialized = false; - } - if (parameters->m_CurrentFrame == nullptr) { - return; - } - - _parms = parameters; - std::shared_ptr m = parameters->m_CurrentFrame; - if ((m->size().width != _vdimX || m->size().height != _vdimY) && - _useEntireScreen) { - reset(m->size().width, m->size().height); - loadAreas(); - updateRectification(); - } +} + +void AreaInfo::rcvPlayerParameters(playerParameters* parameters) +{ + if (_parms == nullptr || _parms->m_CurrentFilename != parameters->m_CurrentFilename) { + _rectInitialized = false; + } + if (parameters->m_CurrentFrame == nullptr) { + return; + } + + _parms = parameters; + std::shared_ptr m = parameters->m_CurrentFrame; + if ((m->size().width != _vdimX || m->size().height != _vdimY) && + _useEntireScreen) { //TODO: _useEntireScreen? if we do not update stuff in the very beginning, tracking rectification will break + reset(m->size().width, m->size().height); + loadAreas(); + updateRectification(); + } } void AreaInfo::updateRectification() { if (_parms) { if (!_rectInitialized) { - QVector vertices = getVertices(_parms->m_CurrentFilename); + QVector vertices = getVertices(_parms->m_CurrentFilename, _areaInfoCache); std::vector pts = toQPointVector(vertices[0]); Rectification::instance().setArea(pts); Rectification::instance().setupRecitification(100, 100, _vdimX, _vdimY); _rectInitialized = true; } else { - QVector vertices = getVertices(_parms->m_CurrentFilename); + QVector vertices = getVertices(_parms->m_CurrentFilename, _areaInfoCache); Rectification::instance().setArea(_rect->getQVertices()); Rectification::instance().setupRecitification(100, 100, _vdimX, _vdimY); @@ -118,13 +120,15 @@ void AreaInfo::updateRectification() { QVector{ cvPointsToString(_rect->getVertices()).c_str(), cvPointsToString(_apperture->getVertices()).c_str(), - QString(myType()), QString(vertices[3]) }); + QString(myType()), QString(vertices[3]) }, + _areaInfoCache); setVertices("Last", QVector{ cvPointsToString(_rect->getVertices()).c_str(), cvPointsToString(_apperture->getVertices()).c_str(), - QString(myType()), QString(vertices[3]) }); + QString(myType()), QString(vertices[3]) }, + _areaInfoCache); } } else { @@ -139,14 +143,15 @@ void AreaInfo::setRectificationDimensions(double w, double h) { void AreaInfo::updateApperture() { if (_parms && _rectInitialized) { - QVector vertices = getVertices(_parms->m_CurrentFilename); + QVector vertices = getVertices(_parms->m_CurrentFilename, _areaInfoCache); std::vector p = _apperture->getVertices(); setVertices(_parms->m_CurrentFilename, QVector{ cvPointsToString(_rect->getVertices()).c_str(), cvPointsToString(p).c_str(), - QString(myType()), QString(vertices[3]) }); //TODO + QString(myType()), QString(vertices[3]) }, + _areaInfoCache); //TODO } } diff --git a/BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/AreaInfo.h b/Src/Model/AreaDescriptor/AreaInfo.h similarity index 92% rename from BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/AreaInfo.h rename to Src/Model/AreaDescriptor/AreaInfo.h index ee3881de..530f38aa 100644 --- a/BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/AreaInfo.h +++ b/Src/Model/AreaDescriptor/AreaInfo.h @@ -1,8 +1,9 @@ #pragma once #include "Interfaces/IModel/IModelAreaDescriptor.h" #include "Interfaces/IModel/IModel.h" +#include "Controller/IControllerCfg.h" #include "AreaInfoElement.h" -#include "util/types.h" +#include "util/types.h" #include "Model/MediaPlayerStateMachine/PlayerParameters.h" class AreaInfo : public IModelAreaDescriptor @@ -51,6 +52,7 @@ class AreaInfo : public IModelAreaDescriptor int _vdimY = 1; playerParameters* _parms; bool _rectInitialized = false; + QString _areaInfoCache; public Q_SLOTS: void rcvPlayerParameters(playerParameters* parameters); diff --git a/BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/AreaInfoElement.cpp b/Src/Model/AreaDescriptor/AreaInfoElement.cpp similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/AreaInfoElement.cpp rename to Src/Model/AreaDescriptor/AreaInfoElement.cpp diff --git a/BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/AreaInfoElement.h b/Src/Model/AreaDescriptor/AreaInfoElement.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/AreaInfoElement.h rename to Src/Model/AreaDescriptor/AreaInfoElement.h diff --git a/BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/AreaMemory.cpp b/Src/Model/AreaDescriptor/AreaMemory.cpp similarity index 87% rename from BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/AreaMemory.cpp rename to Src/Model/AreaDescriptor/AreaMemory.cpp index 48df3267..95cb0ee6 100644 --- a/BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/AreaMemory.cpp +++ b/Src/Model/AreaDescriptor/AreaMemory.cpp @@ -12,14 +12,16 @@ TODO: This is still rather prototype'ish. */ #include + +using namespace BioTrackerUtilsMisc; //split namespace AreaMemory{ QMap> map; - QVector getVertices(QString file, bool useLast) { + QVector getVertices(QString file, QString areaFile, bool useLast) { if (map.size() == 0) { std::ifstream o; - o.open(CFG_AREA_DEFINITIONS, std::ifstream::in); + o.open(areaFile.toStdString(), std::ifstream::in); if (o.is_open()) { while (!o.eof()) { std::string line = ""; @@ -48,14 +50,14 @@ namespace AreaMemory{ } } - void setVertices(QString file, QVector values) { + void setVertices(QString file, QVector values, QString areaFile) { if (file.size() <= 1) { return; } map[file] = values; std::ofstream o; - o.open(CFG_AREA_DEFINITIONS, std::ofstream::out); + o.open(areaFile.toStdString(), std::ofstream::out); if (o.is_open()) { QMapIterator> i(map); diff --git a/BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/AreaMemory.h b/Src/Model/AreaDescriptor/AreaMemory.h similarity index 75% rename from BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/AreaMemory.h rename to Src/Model/AreaDescriptor/AreaMemory.h index 8e791132..93a086b0 100644 --- a/BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/AreaMemory.h +++ b/Src/Model/AreaDescriptor/AreaMemory.h @@ -11,8 +11,8 @@ namespace AreaMemory #define DEFAULT_AREA "10,10;10,100;100,100;100,10" #define DEFAULT_PAIR QVector{DEFAULT_AREA, DEFAULT_RECT, "0", "0"} - QVector getVertices(QString file, bool useLast = false); - void setVertices(QString file, QVector values); + QVector getVertices(QString file, QString areaFile, bool useLast = false); + void setVertices(QString file, QVector values, QString areaFile); std::vector toQPointVector(QString vertices); }; diff --git a/BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/Rectification.cpp b/Src/Model/AreaDescriptor/Rectification.cpp similarity index 87% rename from BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/Rectification.cpp rename to Src/Model/AreaDescriptor/Rectification.cpp index ceba5dc5..c589068f 100644 --- a/BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/Rectification.cpp +++ b/Src/Model/AreaDescriptor/Rectification.cpp @@ -3,15 +3,13 @@ #include #include -#include "settings/Settings.h" #include "util/misc.h" #include "util/types.h" +#include "util/Config.h" -Rectification::Rectification() { - - BioTracker::Core::Settings *_settings = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); - double w = std::max(_settings->getValueOrDefault(AREADESCRIPTOR::RECT_W, AREADESCRIPTOR::RECT_W_DEFAULT), std::numeric_limits::epsilon()); - double h = std::max(_settings->getValueOrDefault(AREADESCRIPTOR::RECT_H, AREADESCRIPTOR::RECT_H_DEFAULT), std::numeric_limits::epsilon()); +using namespace BioTrackerUtilsMisc; //split + +Rectification::Rectification(float w, float h) { initRecitification(w,h); setupRecitification(0,0,0,0); } @@ -54,9 +52,8 @@ void Rectification::setArea(std::vector areaCoordinates) { } std::vector Rectification::getDefaultArena() { - BioTracker::Core::Settings *_settings = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); - std::string arena = _settings->getValueOrDefault(AREADESCRIPTOR::CN_ARENA, "10,10;10,100;100,100;100,10"); - return stringToCVPointVec(arena); + std::string s = (Config::DefaultArena).toStdString(); + return stringToCVPointVec(s); } void Rectification::setArea() @@ -75,8 +72,8 @@ void Rectification::setupRecitification(int frameDisplayWidthPx, int frameDispla _frameDisplayWidthPx = frameDisplayWidthPx; _frameDisplayHeightPx = frameDisplayHeightPx; - _camCaptureWidth_px = camImageWidth; - _camCaptureHeight_px = camImageHeight; + _camCaptureWidth_px = frameDisplayWidthPx; + _camCaptureHeight_px = frameDisplayHeightPx; if (_rectifiedAreaCoordinates.size() > 0) { _rectifiedAreaCoordinates.clear(); diff --git a/BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/Rectification.h b/Src/Model/AreaDescriptor/Rectification.h similarity index 96% rename from BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/Rectification.h rename to Src/Model/AreaDescriptor/Rectification.h index dce3a190..f8eb8962 100644 --- a/BioTracker/CoreApp/BioTracker/Model/AreaDescriptor/Rectification.h +++ b/Src/Model/AreaDescriptor/Rectification.h @@ -7,13 +7,13 @@ /** * Rectification class normalizing the tracking image */ -class Rectification +class Rectification { public: static Rectification& instance() { - static Rectification _instance; // Guaranteed to be destroyed. + static Rectification _instance(100,100); // Guaranteed to be destroyed. // Instantiated on first use. return _instance; } @@ -25,7 +25,7 @@ class Rectification /** * The standard constructor. */ - Rectification(); + Rectification(float w, float h); Rectification(const Rectification&); /* verhindert, dass eine weitere Instanz via Kopier-Konstruktor erstellt werden kann */ diff --git a/BioTracker/CoreApp/BioTracker/Model/BioTracker3ProxyMat.cpp b/Src/Model/BioTracker3ProxyMat.cpp similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/BioTracker3ProxyMat.cpp rename to Src/Model/BioTracker3ProxyMat.cpp diff --git a/BioTracker/CoreApp/BioTracker/Model/BioTracker3ProxyMat.h b/Src/Model/BioTracker3ProxyMat.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/BioTracker3ProxyMat.h rename to Src/Model/BioTracker3ProxyMat.h diff --git a/BioTracker/CoreApp/BioTracker/Model/CoreParameter.cpp b/Src/Model/CoreParameter.cpp similarity index 93% rename from BioTracker/CoreApp/BioTracker/Model/CoreParameter.cpp rename to Src/Model/CoreParameter.cpp index 9f0df116..5ffe5f58 100644 --- a/BioTracker/CoreApp/BioTracker/Model/CoreParameter.cpp +++ b/Src/Model/CoreParameter.cpp @@ -1,5 +1,4 @@ #include "CoreParameter.h" -#include "util/singleton.h" CoreParameter::CoreParameter(QObject *parent) : IModel(parent) diff --git a/BioTracker/CoreApp/BioTracker/Model/CoreParameter.h b/Src/Model/CoreParameter.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/CoreParameter.h rename to Src/Model/CoreParameter.h diff --git a/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterCSV.cpp b/Src/Model/DataExporters/DataExporterCSV.cpp similarity index 95% rename from BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterCSV.cpp rename to Src/Model/DataExporters/DataExporterCSV.cpp index d116e1c5..fcbd7325 100644 --- a/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterCSV.cpp +++ b/Src/Model/DataExporters/DataExporterCSV.cpp @@ -1,17 +1,18 @@ #include "DataExporterCSV.h" -#include "Controller/ControllerDataExporter.h" #include "util/types.h" #include "util/misc.h" #include #include #include + +using namespace BioTrackerUtilsMisc; //split + DataExporterCSV::DataExporterCSV(QObject *parent) : DataExporterGeneric(parent) { - _root = 0; - BioTracker::Core::Settings *settings = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); - _separator = settings->getValueOrDefault(CFG_SER_CSVSEP, CFG_SER_CSVSEP_VAL); + _root = nullptr; + _separator = _cfg->CsvSeperator.toStdString(); } @@ -300,11 +301,10 @@ void DataExporterCSV::writeAll(std::string f) { } void DataExporterCSV::close() { - _ofs.close(); - - if (!_root || _root->size() == 0) { - //Remove temporary file - QFile file(_tmpFile.c_str()); - file.remove(); - } + if(_ofs.is_open()) + _ofs.close(); + + //Remove temporary file + QFile file(_tmpFile.c_str()); + file.remove(); } diff --git a/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterCSV.h b/Src/Model/DataExporters/DataExporterCSV.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterCSV.h rename to Src/Model/DataExporters/DataExporterCSV.h diff --git a/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterGeneric.cpp b/Src/Model/DataExporters/DataExporterGeneric.cpp similarity index 75% rename from BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterGeneric.cpp rename to Src/Model/DataExporters/DataExporterGeneric.cpp index 42faffa8..76a4ca0d 100644 --- a/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterGeneric.cpp +++ b/Src/Model/DataExporters/DataExporterGeneric.cpp @@ -1,5 +1,4 @@ #include "DataExporterGeneric.h" -#include "Controller/ControllerDataExporter.h" #include "util/types.h" #include "util/misc.h" #include @@ -9,19 +8,24 @@ DataExporterGeneric::DataExporterGeneric(QObject *parent) : IModelDataExporter(parent) { - _parent = parent; + _parent = static_cast(parent); + _cfg = static_cast(parent)->getConfig(); + _root = 0; } void DataExporterGeneric::open(IModelTrackedTrajectory *root) { _root = root; - _tmpFile = dynamic_cast(_parent)->generateBasename(true).toStdString() + ".tmp" + getSuffix().toStdString(); - _finalFile = dynamic_cast(_parent)->generateBasename(false).toStdString() + getSuffix().toStdString(); + _tmpFile = _parent->generateBasename(true).toStdString() + ".tmp" + getSuffix().toStdString(); + _finalFile = _parent->generateBasename(false).toStdString() + getSuffix().toStdString(); _ofs.open(_tmpFile, std::ofstream::out); } int DataExporterGeneric::getMaxLinecount() { + if (_root == nullptr) + return 0; + int max = 0; for (int i = 0; i < _root->size(); i++) { IModelTrackedTrajectory *t = dynamic_cast(_root->getChild(i)); @@ -53,6 +57,6 @@ void DataExporterGeneric::cleanup() void DataExporterGeneric::finalize() { close(); - writeAll(""); - cleanup(); + writeAll(""); + cleanup(); }; diff --git a/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterGeneric.h b/Src/Model/DataExporters/DataExporterGeneric.h similarity index 86% rename from BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterGeneric.h rename to Src/Model/DataExporters/DataExporterGeneric.h index 34e9627a..fbed180e 100644 --- a/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterGeneric.h +++ b/Src/Model/DataExporters/DataExporterGeneric.h @@ -3,6 +3,8 @@ #include "Interfaces/IModel/IModelTrackedTrajectory.h" #include "Interfaces/IModel/IModelTrackedComponent.h" #include "Interfaces/IModel/IModelTrackedComponentFactory.h" +#include "Controller/ControllerDataExporter.h" +#include "util/Config.h" #include #include @@ -26,7 +28,8 @@ class DataExporterGeneric : public IModelDataExporter void cleanup(); - QObject *_parent = nullptr; + ControllerDataExporter *_parent = nullptr; + Config *_cfg; std::ofstream _ofs; diff --git a/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterJson.cpp b/Src/Model/DataExporters/DataExporterJson.cpp similarity index 98% rename from BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterJson.cpp rename to Src/Model/DataExporters/DataExporterJson.cpp index 0a3337ed..42e836b5 100644 --- a/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterJson.cpp +++ b/Src/Model/DataExporters/DataExporterJson.cpp @@ -15,7 +15,8 @@ #include #include #include - +#include +#include namespace DataExporterJsonUtil { @@ -149,7 +150,7 @@ void DataExporterJson::loadFile(std::string file) { boost::property_tree::ptree ptRoot; boost::property_tree::read_json(file, ptRoot); - ControllerDataExporter *ctr = dynamic_cast(_parent); + ControllerDataExporter *ctr = _parent; IModelTrackedComponentFactory* factory = ctr ? ctr->getComponentFactory() : nullptr; if (!factory) { return; diff --git a/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterJson.h b/Src/Model/DataExporters/DataExporterJson.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterJson.h rename to Src/Model/DataExporters/DataExporterJson.h diff --git a/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterSerialize.cpp b/Src/Model/DataExporters/DataExporterSerialize.cpp similarity index 95% rename from BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterSerialize.cpp rename to Src/Model/DataExporters/DataExporterSerialize.cpp index 9f74d0f9..24c09976 100644 --- a/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterSerialize.cpp +++ b/Src/Model/DataExporters/DataExporterSerialize.cpp @@ -45,12 +45,10 @@ void DataExporterSerialize::finalizeAndReInit() { open(_root); } -extern IModelTrackedComponentFactory* factory; - void DataExporterSerialize::loadFile(std::string file){ - ControllerDataExporter *ctr = dynamic_cast(_parent); - factory = ctr ? ctr->getComponentFactory() : nullptr; + ControllerDataExporter *ctr = _parent; + IModelTrackedComponentFactory* factory = ctr ? ctr->getComponentFactory() : nullptr; if (!factory) { return; } diff --git a/BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterSerialize.h b/Src/Model/DataExporters/DataExporterSerialize.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/DataExporters/DataExporterSerialize.h rename to Src/Model/DataExporters/DataExporterSerialize.h diff --git a/BioTracker/CoreApp/BioTracker/Model/ImageStream.cpp b/Src/Model/ImageStream.cpp similarity index 77% rename from BioTracker/CoreApp/BioTracker/Model/ImageStream.cpp rename to Src/Model/ImageStream.cpp index a6bee67e..d7d05854 100644 --- a/BioTracker/CoreApp/BioTracker/Model/ImageStream.cpp +++ b/Src/Model/ImageStream.cpp @@ -8,23 +8,21 @@ #include "util/Exceptions.h" #include "QSharedPointer" -#include "settings/Settings.h" #include "util/misc.h" - #include "View/CameraDevice.h" -#include "util/types.h" -#include "util/singleton.h" -#include "settings/Settings.h" #include "util/VideoCoder.h" +#include "Controller/IControllerCfg.h" + namespace BioTracker { namespace Core { - ImageStream::ImageStream(QObject *parent) : QObject(parent), + ImageStream::ImageStream(QObject *parent, Config *cfg) : QObject(parent), m_current_frame(new cv::Mat(cv::Size(0, 0), CV_8UC3)), - m_current_frame_number(0), - m_frame_stride(BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION)-> - getValueOrDefault(CFG_INPUT_FRAME_STRIDE, CFG_INPUT_FRAME_STRIDE_VAL)) { + m_current_frame_number(0) { + _cfg = cfg; + if (cfg) + m_frame_stride = cfg->FrameStride; } size_t ImageStream::currentFrameNumber() const { @@ -114,6 +112,17 @@ namespace BioTracker { return this->setFrameNumber_impl(new_frame_number); } + bool ImageStream::hasNextInBatch(){ + return false; + } + + void ImageStream::stepToNextInBatch(){ + } + + std::vector ImageStream::getBatchItems(){ + return {}; + } + ImageStream::~ImageStream() = default; @@ -122,7 +131,7 @@ namespace BioTracker { class ImageStream3NoMedia : public ImageStream { public: - explicit ImageStream3NoMedia() = default; + explicit ImageStream3NoMedia() = default ; virtual GuiParam::MediaType type() const override { return GuiParam::MediaType::NoMedia; } @@ -151,12 +160,12 @@ namespace BioTracker { class ImageStream3Pictures : public ImageStream { public: - explicit ImageStream3Pictures(std::vector picture_files) - : m_picture_files(std::move(picture_files)), m_currentFrame(0) { + explicit ImageStream3Pictures(Config *cfg, std::vector picture_files) + : ImageStream(0, cfg) + ,m_picture_files(std::move(picture_files)), m_currentFrame(0) { //Grab the codec from config file - BioTracker::Core::Settings *set = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); - double fps = set->getValueOrDefault(CFG_RECORD_FPS, CFG_RECORD_FPS_VAL); + double fps = _cfg->RecordFPS; if (fps > 0) { m_fps = fps; } @@ -173,7 +182,7 @@ namespace BioTracker { m_w = new_frame->size().width; m_h = new_frame->size().height; m_recording = false; - vCoder = std::make_shared(); + vCoder = std::make_shared(m_fps, _cfg); } } @@ -246,11 +255,59 @@ namespace BioTracker { * @brief ImageStreamVideo * @param filename path to the file */ - explicit ImageStream3Video(const std::vector &files) - : m_capture(files.front().string()) - , m_num_frames(static_cast(m_capture.get(CV_CAP_PROP_FRAME_COUNT))) - , m_fps(m_capture.get(CV_CAP_PROP_FPS)) - , m_fileName(files.front().string()) { + explicit ImageStream3Video(Config *cfg, const std::vector &files) + : ImageStream(0, cfg) + { + openMedia(files); + } + virtual GuiParam::MediaType type() const override { + return GuiParam::MediaType::Video; + } + virtual size_t numFrames() const override { + return m_num_frames; + } + virtual bool toggleRecord() override { + if (!m_capture.isOpened()) { + return false; + } + m_recording = vCoder->toggle(m_w, m_h, m_fps); + + return m_recording; + } + virtual double fps() const override { + return m_fps; + } + virtual std::string currentFilename() const override { + return m_fileName; + } + + virtual bool hasNextInBatch() override{ + return !(m_batch.empty()); + } + + virtual void stepToNextInBatch() override{ + if (m_batch.empty()) { + throw video_open_error("batch is empty"); + } + openMedia(m_batch); + } + + virtual std::vector getBatchItems() override{ + std::vector batchItems; + for (auto x: m_batch){ + batchItems.push_back(x.string()); + } + return batchItems; + } + + private: + + void openMedia(std::vector files){ + + m_capture.open(files.front().string()); + m_num_frames = static_cast(m_capture.get(CV_CAP_PROP_FRAME_COUNT)); + m_fps = m_capture.get(CV_CAP_PROP_FPS); + m_fileName = files.front().string(); if (!boost::filesystem::exists(files.front())) { throw file_not_found("Could not find file " + files.front().string()); @@ -263,8 +320,7 @@ namespace BioTracker { m_batch.erase(m_batch.begin(), m_batch.begin()+1); //Grab the fps from config file - BioTracker::Core::Settings *set = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); - double fps = set->getValueOrDefault(CFG_RECORD_FPS, CFG_RECORD_FPS_VAL); + double fps = _cfg->RecordFPS; if (fps != -1) { m_fps = fps; } @@ -272,35 +328,16 @@ namespace BioTracker { m_w = m_capture.get(CV_CAP_PROP_FRAME_WIDTH); m_h = m_capture.get(CV_CAP_PROP_FRAME_HEIGHT); m_recording = false; - vCoder = std::make_shared(); + vCoder = std::make_shared(m_fps, _cfg); // load first image if (this->numFrames() > 0) { this->nextFrame_impl(); } - } - virtual GuiParam::MediaType type() const override { - return GuiParam::MediaType::Video; - } - virtual size_t numFrames() const override { - return m_num_frames; - } - virtual bool toggleRecord() override { - if (!m_capture.isOpened()) { - return false; - } - m_recording = vCoder->toggle(m_w, m_h, m_fps); - return m_recording; - } - virtual double fps() const override { - return m_fps; - } - virtual std::string currentFilename() const override { - return m_fileName; + m_current_frame_number = 0; } - private: virtual bool nextFrame_impl() override { cv::Mat new_frame; for (int i = 0; i vCoder; std::vector m_batch; double m_fps; @@ -338,7 +375,6 @@ namespace BioTracker { /*********************************************************/ -#include class ImageStream3Camera : public ImageStream { public: /** @@ -347,8 +383,9 @@ namespace BioTracker { * @brief ImageStreamCamera * @param device_id according to the VideoCapture class of OpenCV */ - explicit ImageStream3Camera(CameraConfiguration conf) - : m_capture(conf._id) + explicit ImageStream3Camera(Config *cfg, CameraConfiguration conf) + : ImageStream(0, cfg) + , m_capture(conf._id) , m_fps(m_capture.get(CV_CAP_PROP_FPS)) { // Give the camera some extra time to get ready: // Somehow opening it on first try sometimes does not succeed. @@ -356,14 +393,12 @@ namespace BioTracker { // So, stubbornly try it a few times until it works. std::this_thread::sleep_for(std::chrono::milliseconds(1000)); - Settings *set = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); - - std::cout << "\nStarting to record on camera no. " << conf._id << std::endl; - m_w = conf._width == -1 ? set->getValueOrDefault(CFG_CAMERA_DEFAULT_W, CFG_CAMERA_DEFAULT_W_VAL) : conf._width; - m_h = conf._height == -1 ? set->getValueOrDefault(CFG_CAMERA_DEFAULT_H, CFG_CAMERA_DEFAULT_H_VAL) : conf._height; - m_fps = conf._fps == -1 ? set->getValueOrDefault(CFG_RECORD_FPS, CFG_RECORD_FPS_VAL) : conf._fps; + qDebug() << "\nStarting to record on camera no. " << conf._id; + m_w = conf._width == -1 ? _cfg->CameraWidth : conf._width; + m_h = conf._height == -1 ? _cfg->CameraHeight : conf._height; + m_fps = conf._fps == -1 ? _cfg->RecordFPS : conf._fps; m_recording = false; - vCoder = std::make_shared(m_fps); + vCoder = std::make_shared(m_fps, _cfg); int fails = 0; while (!m_capture.isOpened() && fails < 5) { @@ -373,7 +408,7 @@ namespace BioTracker { } if (!m_capture.isOpened()) { - std::cout << "Unable to open camera!" << std::endl; + qWarning() << "Unable to open camera!"; throw device_open_error(":("); } @@ -384,7 +419,7 @@ namespace BioTracker { m_w = m_capture.get(CV_CAP_PROP_FRAME_WIDTH); m_h = m_capture.get(CV_CAP_PROP_FRAME_HEIGHT); m_fps = m_capture.get(CV_CAP_PROP_FPS); - std::cout << "Cam open: " << m_capture.isOpened() << " w/h:" << m_w << "/" << m_h << " fps:" << m_fps << std::endl; + qDebug() << "Cam open: " << m_capture.isOpened() << " w/h:" << m_w << "/" << m_h << " fps:" << m_fps; // load first image if (this->numFrames() > 0) { this->nextFrame_impl(); @@ -449,23 +484,23 @@ namespace BioTracker { return std::make_shared(); } - std::shared_ptr make_ImageStream3Pictures( + std::shared_ptr make_ImageStream3Pictures(Config *cfg, std::vector filenames) { - return std::make_shared(std::move(filenames)); + return std::make_shared(cfg, std::move(filenames)); } - std::shared_ptr make_ImageStream3Video(const std::vector &files) { + std::shared_ptr make_ImageStream3Video(Config *cfg, const std::vector &files) { try { - return std::make_shared(files); + return std::make_shared(cfg, files); } catch (const video_open_error &) { return make_ImageStream3NoMedia(); } } - std::shared_ptr make_ImageStream3Camera(CameraConfiguration conf) { + std::shared_ptr make_ImageStream3Camera(Config *cfg, CameraConfiguration conf) { try { - return std::make_shared(conf); + return std::make_shared(cfg, conf); } catch (const device_open_error &) { return make_ImageStream3NoMedia(); diff --git a/BioTracker/CoreApp/BioTracker/Model/ImageStream.h b/Src/Model/ImageStream.h similarity index 89% rename from BioTracker/CoreApp/BioTracker/Model/ImageStream.h rename to Src/Model/ImageStream.h index 1d40cea0..af20825c 100644 --- a/BioTracker/CoreApp/BioTracker/Model/ImageStream.h +++ b/Src/Model/ImageStream.h @@ -16,8 +16,9 @@ #include #include "QSharedPointer" -#include "settings/ParamNames.h" // GUIPARAM::MediaType +#include "util/ParamNames.h" // GUIPARAM::MediaType #include "util/types.h" +#include "util/Config.h" namespace BioTracker { namespace Core { @@ -28,7 +29,7 @@ namespace Core { class ImageStream : public QObject { Q_OBJECT public: - explicit ImageStream(QObject* parent = 0); + explicit ImageStream(QObject* parent = 0, Config *cfg = nullptr); /** * @return the stream's MediaType i.e. "Video", "Images", "NoMedia" @@ -108,6 +109,12 @@ class ImageStream : public QObject { */ std::string getTitle(); + virtual bool hasNextInBatch(); + + virtual void stepToNextInBatch(); + + virtual std::vector getBatchItems(); + virtual ~ImageStream(); protected: @@ -129,7 +136,12 @@ class ImageStream : public QObject { /** * The stride of the image stream. Think of it as "use only every n'th frame". */ - const size_t m_frame_stride; + size_t m_frame_stride; + + std::shared_ptr m_current_frame; + size_t m_current_frame_number; + std::string m_title; + Config *_cfg; private: /** @@ -154,21 +166,17 @@ class ImageStream : public QObject { * - m_current_frame_number is updated afterwards */ virtual bool previousFrame_impl(); - - std::shared_ptr m_current_frame; - size_t m_current_frame_number; - std::string m_title; }; std::shared_ptr make_ImageStream3NoMedia(); -std::shared_ptr make_ImageStream3Pictures( +std::shared_ptr make_ImageStream3Pictures(Config *cfg, std::vector filenames); -std::shared_ptr make_ImageStream3Video(const std::vector +std::shared_ptr make_ImageStream3Video(Config *cfg, const std::vector &filename); -std::shared_ptr make_ImageStream3Camera(CameraConfiguration conf); +std::shared_ptr make_ImageStream3Camera(Config *cfg, CameraConfiguration conf); } } diff --git a/BioTracker/CoreApp/BioTracker/Model/MediaPlayer.cpp b/Src/Model/MediaPlayer.cpp similarity index 89% rename from BioTracker/CoreApp/BioTracker/Model/MediaPlayer.cpp rename to Src/Model/MediaPlayer.cpp index 6985a67e..47bf0632 100644 --- a/BioTracker/CoreApp/BioTracker/Model/MediaPlayer.cpp +++ b/Src/Model/MediaPlayer.cpp @@ -4,11 +4,13 @@ //Settings related #include "util/types.h" -#include "util/singleton.h" -#include "settings/Settings.h" +#include "Controller/IControllerCfg.h" + +using namespace BioTrackerUtilsMisc; //getTimeAndDate MediaPlayer::MediaPlayer(QObject* parent) : IModel(parent) { + _cfg = static_cast(parent)->getConfig(); m_trackingDone = true; m_currentFPS = 0; m_fpsOfSourceFile = 0; @@ -17,7 +19,7 @@ MediaPlayer::MediaPlayer(QObject* parent) : m_useCuda = false; m_RecI = false; m_RecO = false; - m_videoc = std::make_shared(); + m_videoc = std::make_shared(_cfg->RecordFPS, _cfg); m_NameOfCvMat = "Original"; m_TrackingIsActive = false; @@ -28,6 +30,7 @@ MediaPlayer::MediaPlayer(QObject* parent) : m_PlayerThread = new QThread(this); m_Player = new MediaPlayerStateMachine(); + m_Player->setConfig(_cfg); // Connect MediaPlayer with PlayerStateMachine @@ -57,6 +60,9 @@ MediaPlayer::MediaPlayer(QObject* parent) : QObject::connect(m_Player, &MediaPlayerStateMachine::emitPlayerOperationDone, this, &MediaPlayer::receivePlayerOperationDone); QObject::connect(this, &MediaPlayer::runPlayerOperation, m_Player, &MediaPlayerStateMachine::receiveRunPlayerOperation); + QObject::connect(m_Player, &MediaPlayerStateMachine::emitNextMediaInBatch, this, &MediaPlayer::emitNextMediaInBatch, Qt::DirectConnection); + QObject::connect(m_Player, &MediaPlayerStateMachine::emitNextMediaInBatchLoaded, this, &MediaPlayer::emitNextMediaInBatchLoaded, Qt::DirectConnection); + // Move the PlayerStateMachine to the Thread m_Player->moveToThread(m_PlayerThread); @@ -156,7 +162,7 @@ int MediaPlayer::reopenVideoWriter() { _imagew = r.width(); _imageh = r.height(); - m_videoc = std::make_shared(); + m_videoc = std::make_shared(_cfg->RecordFPS, _cfg); EncodeConfig *cfg = m_videoc->m_nvEncoder->getEncodeConfig(); cfg->width = _imagew; cfg->height = _imageh; @@ -206,7 +212,7 @@ QString MediaPlayer::takeScreenshot(GraphicsView *gv) { QImage image = pix->toImage(); //8724us - QString filePath = getTimeAndDate(CFG_DIR_SCREENSHOTS+std::string("/Screenshot"), ".png").c_str(); + QString filePath = getTimeAndDate(_cfg->DirScreenshots.toStdString(), ".png").c_str(); image.save(filePath); @@ -326,8 +332,7 @@ int MediaPlayer::toggleRecordGraphicsScenes(GraphicsView *gv) { QRectF rview = m_gv->rect(); //0us QSize s1 = rscene.size().toSize(); //0us QSize s2 = rview.size().toSize(); //0us - BioTracker::Core::Settings *set = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); - m_recordScaled = set->getValueOrDefault(CFG_RECORDSCALEDOUT, false); + m_recordScaled = _cfg->RecordScaledOutput; if (!m_recordScaled) m_recd = m_videoc->toggle(s1.width(), s1.height(), 30); else diff --git a/BioTracker/CoreApp/BioTracker/Model/MediaPlayer.h b/Src/Model/MediaPlayer.h similarity index 94% rename from BioTracker/CoreApp/BioTracker/Model/MediaPlayer.h rename to Src/Model/MediaPlayer.h index f95803a0..7143a23a 100644 --- a/BioTracker/CoreApp/BioTracker/Model/MediaPlayer.h +++ b/Src/Model/MediaPlayer.h @@ -18,6 +18,7 @@ #include #include "util/types.h" #include "util/VideoCoder.h" +#include "util/Config.h" /** * The MediaPlayer class is an IModel class an part of the MediaPlayer component. This class creats a MediaPlayerStateMachine object and moves it to a QThread. @@ -95,7 +96,8 @@ class MediaPlayer : public IModel { void fwdPlayerParameters(playerParameters* parameters); - void emitNextMediaInBatch(); + void emitNextMediaInBatch(const std::string path); + void emitNextMediaInBatchLoaded(const std::string path); public: void setTrackingActive(); @@ -156,7 +158,6 @@ class MediaPlayer : public IModel { void receiveChangeDisplayImage(QString str); - private: //TODO Refactor members to _ instead of m_ @@ -166,6 +167,7 @@ class MediaPlayer : public IModel { int reopenVideoWriter(); int _imagew; int _imageh; + Config *_cfg; QPointer< QThread > m_PlayerThread; QPointer< MediaPlayerStateMachine > m_Player; diff --git a/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.cpp b/Src/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.cpp similarity index 85% rename from BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.cpp rename to Src/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.cpp index c9442785..9b5fe35b 100644 --- a/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.cpp +++ b/Src/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.cpp @@ -26,22 +26,23 @@ MediaPlayerStateMachine::MediaPlayerStateMachine(QObject* parent) : m_States.insert(IPlayerState::PLAYER_STATES::STATE_WAIT, (new PStateWait(this, m_ImageStream))); m_States.insert(IPlayerState::PLAYER_STATES::STATE_GOTOFRAME, (new PStateGoToFrame(this, m_ImageStream))); + QMap::iterator i; + for (i = m_States.begin(); i != m_States.end(); i++) { + QObject::connect(i.value(), &IPlayerState::emitNextMediaInBatch, this, &MediaPlayerStateMachine::emitNextMediaInBatch); + QObject::connect(i.value(), &IPlayerState::emitNextMediaInBatchLoaded, this, &MediaPlayerStateMachine::emitNextMediaInBatchLoaded); + } + setNextState(IPlayerState::PLAYER_STATES::STATE_INITIAL); } -int x = 0; + void MediaPlayerStateMachine::receiveRunPlayerOperation() { if (m_NextPlayerState != m_States.value(IPlayerState::PLAYER_STATES::STATE_WAIT)) { m_CurrentPlayerState = m_NextPlayerState; - - x++; - if (x % 100 == 0) { - emitNextMediaInBatch(); - } - m_CurrentPlayerState->operate(); + updatePlayerParameter(); emitSignals(); } @@ -50,13 +51,12 @@ void MediaPlayerStateMachine::receiveRunPlayerOperation() { void MediaPlayerStateMachine::receiveLoadVideoCommand(std::vector files) { - m_stream = BioTracker::Core::make_ImageStream3Video(files); + m_stream = BioTracker::Core::make_ImageStream3Video(_cfg, files); m_PlayerParameters->m_TotalNumbFrames = m_stream->numFrames(); - - QMap::iterator i; - for (i = m_States.begin(); i != m_States.end(); i++) { - i.value()->changeImageStream(m_stream); + + for (auto x: m_States) { + x->changeImageStream(m_stream); } setNextState(IPlayerState::STATE_INITIAL_STREAM); @@ -64,13 +64,12 @@ void MediaPlayerStateMachine::receiveLoadVideoCommand(std::vector files) { - m_stream = BioTracker::Core::make_ImageStream3Pictures(files); + m_stream = BioTracker::Core::make_ImageStream3Pictures(_cfg, files); m_PlayerParameters->m_TotalNumbFrames = m_stream->numFrames(); - QMap::iterator i; - for (i = m_States.begin(); i != m_States.end(); i++) { - i.value()->changeImageStream(m_stream); + for (auto x: m_States) { + x->changeImageStream(m_stream); } setNextState(IPlayerState::STATE_INITIAL_STREAM); @@ -78,13 +77,12 @@ void MediaPlayerStateMachine::receiveLoadPictures(std::vectorm_TotalNumbFrames = m_stream->numFrames(); - QMap::iterator i; - for (i = m_States.begin(); i != m_States.end(); i++) { - i.value()->changeImageStream(m_stream); + for (auto x: m_States) { + x->changeImageStream(m_stream); } setNextState(IPlayerState::STATE_INITIAL_STREAM); @@ -141,10 +139,12 @@ void MediaPlayerStateMachine::updatePlayerParameter() { m_PlayerParameters->m_Stop = stateParam.m_Stop; m_PlayerParameters->m_CurrentFilename = m_CurrentPlayerState->getCurrentFileName(); + m_PlayerParameters->m_TotalNumbFrames = m_CurrentPlayerState->m_ImageStream->numFrames(); m_PlayerParameters->m_CurrentFrame = m_CurrentPlayerState->getCurrentFrame(); m_PlayerParameters->m_CurrentFrameNumber = m_CurrentPlayerState->getCurrentFrameNumber(); m_PlayerParameters->m_fpsSourceVideo = m_CurrentPlayerState->m_ImageStream->fps(); + m_PlayerParameters->m_batchItems = m_CurrentPlayerState->getBatchItems(); } void MediaPlayerStateMachine::emitSignals() { diff --git a/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h b/Src/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h similarity index 89% rename from BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h rename to Src/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h index c9cb7462..1d0bbe28 100644 --- a/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h +++ b/Src/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h @@ -27,6 +27,7 @@ #include "PlayerParameters.h" #include "View/CameraDevice.h" +#include "util/Config.h" /** * The MediaPlayerStateMachine class is an IModel class and is responsible for the executing and setting Player Stats. The instance of this class runns in a separate Thread. @@ -43,7 +44,7 @@ class MediaPlayerStateMachine : public IModel { IPlayerState::PLAYER_STATES getState(); - //IPlayerState::PLAYER_STATES getState(); + void setConfig(Config* cfg) { _cfg = cfg;}; public Q_SLOTS: /** @@ -63,7 +64,7 @@ class MediaPlayerStateMachine : public IModel { void receiveGoToFrame(int frame); void receiveTargetFps(double fps); - void receivetoggleRecordImageStream(); + void receivetoggleRecordImageStream(); Q_SIGNALS: /** @@ -76,7 +77,8 @@ class MediaPlayerStateMachine : public IModel { */ void emitPlayerOperationDone(); - void emitNextMediaInBatch(); + void emitNextMediaInBatch(const std::string path); + void emitNextMediaInBatchLoaded(const std::string path); private: void updatePlayerParameter(); @@ -91,7 +93,8 @@ class MediaPlayerStateMachine : public IModel { std::shared_ptr m_ImageStream; playerParameters* m_PlayerParameters; - std::shared_ptr m_stream; + std::shared_ptr m_stream; + Config *_cfg; }; diff --git a/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerParameters.h b/Src/Model/MediaPlayerStateMachine/PlayerParameters.h similarity index 95% rename from BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerParameters.h rename to Src/Model/MediaPlayerStateMachine/PlayerParameters.h index 3904819c..9b180289 100644 --- a/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerParameters.h +++ b/Src/Model/MediaPlayerStateMachine/PlayerParameters.h @@ -30,6 +30,7 @@ struct playerParameters { std::shared_ptr m_CurrentFrame; double m_fpsSourceVideo; double m_fpsTarget; + std::vector m_batchItems; }; #endif // PLAYERPARAMETERS_H diff --git a/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStateGoToFrame.cpp b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateGoToFrame.cpp similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStateGoToFrame.cpp rename to Src/Model/MediaPlayerStateMachine/PlayerStates/PStateGoToFrame.cpp diff --git a/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStateGoToFrame.h b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateGoToFrame.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStateGoToFrame.h rename to Src/Model/MediaPlayerStateMachine/PlayerStates/PStateGoToFrame.h diff --git a/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStateInitial.cpp b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateInitial.cpp similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStateInitial.cpp rename to Src/Model/MediaPlayerStateMachine/PlayerStates/PStateInitial.cpp diff --git a/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStateInitial.h b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateInitial.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStateInitial.h rename to Src/Model/MediaPlayerStateMachine/PlayerStates/PStateInitial.h diff --git a/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStateInitialStream.cpp b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateInitialStream.cpp similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStateInitialStream.cpp rename to Src/Model/MediaPlayerStateMachine/PlayerStates/PStateInitialStream.cpp diff --git a/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStateInitialStream.h b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateInitialStream.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStateInitialStream.h rename to Src/Model/MediaPlayerStateMachine/PlayerStates/PStateInitialStream.h diff --git a/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStatePause.cpp b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStatePause.cpp similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStatePause.cpp rename to Src/Model/MediaPlayerStateMachine/PlayerStates/PStatePause.cpp diff --git a/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStatePause.h b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStatePause.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStatePause.h rename to Src/Model/MediaPlayerStateMachine/PlayerStates/PStatePause.h diff --git a/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStatePlay.cpp b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStatePlay.cpp similarity index 80% rename from BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStatePlay.cpp rename to Src/Model/MediaPlayerStateMachine/PlayerStates/PStatePlay.cpp index 269721cf..737c9994 100644 --- a/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStatePlay.cpp +++ b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStatePlay.cpp @@ -39,8 +39,18 @@ void PStatePlay::operate() { m_Mat = m_ImageStream->currentFrame(); m_FrameNumber = m_ImageStream->currentFrameNumber(); nextState = IPlayerState::STATE_PLAY; - } else { + } else if (m_ImageStream->hasNextInBatch()){ + Q_EMIT emitNextMediaInBatch("Samplestring"); + m_ImageStream->stepToNextInBatch(); + m_ImageStream->nextFrame(); + m_Mat = m_ImageStream->currentFrame(); + m_FrameNumber = m_ImageStream->currentFrameNumber(); + nextState = IPlayerState::STATE_PLAY; + Q_EMIT emitNextMediaInBatchLoaded("Samplestring"); + } else + { nextState = IPlayerState::STATE_INITIAL_STREAM; + } //If fps is limited, wait the neccessary time diff --git a/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStatePlay.h b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStatePlay.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStatePlay.h rename to Src/Model/MediaPlayerStateMachine/PlayerStates/PStatePlay.h diff --git a/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStateStepBack.cpp b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateStepBack.cpp similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStateStepBack.cpp rename to Src/Model/MediaPlayerStateMachine/PlayerStates/PStateStepBack.cpp diff --git a/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStateStepBack.h b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateStepBack.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStateStepBack.h rename to Src/Model/MediaPlayerStateMachine/PlayerStates/PStateStepBack.h diff --git a/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStateStepForw.cpp b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateStepForw.cpp similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStateStepForw.cpp rename to Src/Model/MediaPlayerStateMachine/PlayerStates/PStateStepForw.cpp diff --git a/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStateStepForw.h b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateStepForw.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStateStepForw.h rename to Src/Model/MediaPlayerStateMachine/PlayerStates/PStateStepForw.h diff --git a/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStateWait.cpp b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateWait.cpp similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStateWait.cpp rename to Src/Model/MediaPlayerStateMachine/PlayerStates/PStateWait.cpp diff --git a/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStateWait.h b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateWait.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStateWait.h rename to Src/Model/MediaPlayerStateMachine/PlayerStates/PStateWait.h diff --git a/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStateWaite.cpp.autosave b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateWaite.cpp.autosave similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStateWaite.cpp.autosave rename to Src/Model/MediaPlayerStateMachine/PlayerStates/PStateWaite.cpp.autosave diff --git a/BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStateWaite.h.autosave b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateWaite.h.autosave similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/MediaPlayerStateMachine/PlayerStates/PStateWaite.h.autosave rename to Src/Model/MediaPlayerStateMachine/PlayerStates/PStateWaite.h.autosave diff --git a/BioTracker/CoreApp/BioTracker/Model/TextureObject.cpp b/Src/Model/TextureObject.cpp similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/TextureObject.cpp rename to Src/Model/TextureObject.cpp diff --git a/BioTracker/CoreApp/BioTracker/Model/TextureObject.h b/Src/Model/TextureObject.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/TextureObject.h rename to Src/Model/TextureObject.h diff --git a/BioTracker/CoreApp/BioTracker/Model/UndoCommands/TrackCommands.cpp b/Src/Model/UndoCommands/TrackCommands.cpp similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/UndoCommands/TrackCommands.cpp rename to Src/Model/UndoCommands/TrackCommands.cpp diff --git a/BioTracker/CoreApp/BioTracker/Model/UndoCommands/TrackCommands.h b/Src/Model/UndoCommands/TrackCommands.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/UndoCommands/TrackCommands.h rename to Src/Model/UndoCommands/TrackCommands.h diff --git a/BioTracker/CoreApp/BioTracker/Model/null_Model.cpp b/Src/Model/null_Model.cpp similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/null_Model.cpp rename to Src/Model/null_Model.cpp diff --git a/BioTracker/CoreApp/BioTracker/Model/null_Model.h b/Src/Model/null_Model.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/Model/null_Model.h rename to Src/Model/null_Model.h diff --git a/BioTracker/CoreApp/BioTracker/View/AnnotationsView.cpp b/Src/View/AnnotationsView.cpp similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/AnnotationsView.cpp rename to Src/View/AnnotationsView.cpp diff --git a/BioTracker/CoreApp/BioTracker/View/AnnotationsView.h b/Src/View/AnnotationsView.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/AnnotationsView.h rename to Src/View/AnnotationsView.h diff --git a/Src/View/AreaDesciptor/AreaDescriptor.cpp b/Src/View/AreaDesciptor/AreaDescriptor.cpp new file mode 100644 index 00000000..61616564 --- /dev/null +++ b/Src/View/AreaDesciptor/AreaDescriptor.cpp @@ -0,0 +1,11 @@ +#include "AreaDescriptor.h" +#include "Controller/IControllerCfg.h" + +AreaDescriptor::AreaDescriptor(IController *controller, IModel *model) : + IView(controller, model) { + _cfg = static_cast(controller)->getConfig(); +}; + +AreaDescriptor::~AreaDescriptor() +{ +} diff --git a/BioTracker/CoreApp/BioTracker/View/AreaDesciptor/AreaDescriptor.h b/Src/View/AreaDesciptor/AreaDescriptor.h similarity index 79% rename from BioTracker/CoreApp/BioTracker/View/AreaDesciptor/AreaDescriptor.h rename to Src/View/AreaDesciptor/AreaDescriptor.h index 05ca62dd..8a2e198c 100644 --- a/BioTracker/CoreApp/BioTracker/View/AreaDesciptor/AreaDescriptor.h +++ b/Src/View/AreaDesciptor/AreaDescriptor.h @@ -2,13 +2,13 @@ #include "Interfaces/IView/IViewTrackedComponent.h" #include +#include "util/Config.h" class AreaDescriptor : public QObject, public IView, public QGraphicsItem { Q_OBJECT public: - AreaDescriptor(IController *controller, IModel *model) : - IView(controller, model) {}; + AreaDescriptor(IController *controller, IModel *model); ~AreaDescriptor(); virtual void setBrush(QBrush brush) = 0; @@ -17,12 +17,13 @@ class AreaDescriptor : public QObject, public IView, public QGraphicsItem virtual void updateRect() = 0; void setDimensions(int x, int y) { - _vdimX = x; + _vdimX = x; _vdimY = y; } protected: int _vdimX = 1; int _vdimY = 1; + Config *_cfg; }; diff --git a/BioTracker/CoreApp/BioTracker/View/AreaDesciptor/EllipseDescriptor.cpp b/Src/View/AreaDesciptor/EllipseDescriptor.cpp similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/AreaDesciptor/EllipseDescriptor.cpp rename to Src/View/AreaDesciptor/EllipseDescriptor.cpp diff --git a/BioTracker/CoreApp/BioTracker/View/AreaDesciptor/EllipseDescriptor.h b/Src/View/AreaDesciptor/EllipseDescriptor.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/AreaDesciptor/EllipseDescriptor.h rename to Src/View/AreaDesciptor/EllipseDescriptor.h diff --git a/BioTracker/CoreApp/BioTracker/View/AreaDesciptor/RectDescriptor.cpp b/Src/View/AreaDesciptor/RectDescriptor.cpp similarity index 88% rename from BioTracker/CoreApp/BioTracker/View/AreaDesciptor/RectDescriptor.cpp rename to Src/View/AreaDesciptor/RectDescriptor.cpp index a2b79385..555b59d6 100644 --- a/BioTracker/CoreApp/BioTracker/View/AreaDesciptor/RectDescriptor.cpp +++ b/Src/View/AreaDesciptor/RectDescriptor.cpp @@ -8,19 +8,17 @@ #include "Model/AreaDescriptor/AreaInfoElement.h" #include "Model/AreaDescriptor/AreaInfo.h" #include -#include "settings/Settings.h" -double orientation(cv::Point2f p1, cv::Point2f p2) -{ - cv::Point2f diff = p1 - p2; - // need to check the origin of coorindiates - return std::atan2(p1.y - p2.y, p1.x - p2.x); +double orientation(cv::Point2f p1, cv::Point2f p2) +{ + cv::Point2f diff = p1 - p2; + // need to check the origin of coorindiates + return std::atan2(p1.y - p2.y, p1.x - p2.x); } RectDescriptor::RectDescriptor(IController *controller, IModel *model) : AreaDescriptor(controller, model) -{ - BioTracker::Core::Settings *settings = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); +{ _dragVectorId = -1; _dragType = BiotrackerTypes::AreaType::NONE; setAcceptHoverEvents(true); @@ -59,8 +57,6 @@ void RectDescriptor::setRect(std::vector rect) { std::vector> rectification; std::vector> rectificationLines; std::vector> rectificationNumbers; - - BioTracker::Core::Settings *settings = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); _v = (dynamic_cast(getModel()))->getVertices(); @@ -88,12 +84,12 @@ void RectDescriptor::setRect(std::vector rect) { rectificationLines.push_back(ri); if ((dynamic_cast(getModel()))->getShowNumbers()) { std::string label = "???"; - if (i % 2 == 0) { - label = std::to_string(settings->getValueOrDefault(AREADESCRIPTOR::RECT_H, AREADESCRIPTOR::RECT_H_DEFAULT)); + if (i % 2 == 0) { + label = std::to_string(_cfg->RectificationHeight); label.erase(label.find_last_not_of('0') + 1, std::string::npos); } - else { - label = std::to_string(settings->getValueOrDefault(AREADESCRIPTOR::RECT_W, AREADESCRIPTOR::RECT_W_DEFAULT)); + else { + label = std::to_string(_cfg->RectificationWidth); label.erase(label.find_last_not_of('0') + 1, std::string::npos); } std::shared_ptr ti = std::make_shared(label.c_str(), this); diff --git a/BioTracker/CoreApp/BioTracker/View/AreaDesciptor/RectDescriptor.h b/Src/View/AreaDesciptor/RectDescriptor.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/AreaDesciptor/RectDescriptor.h rename to Src/View/AreaDesciptor/RectDescriptor.h diff --git a/BioTracker/CoreApp/BioTracker/View/CameraDevice.cpp b/Src/View/CameraDevice.cpp similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/CameraDevice.cpp rename to Src/View/CameraDevice.cpp diff --git a/BioTracker/CoreApp/BioTracker/View/CameraDevice.h b/Src/View/CameraDevice.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/CameraDevice.h rename to Src/View/CameraDevice.h diff --git a/BioTracker/CoreApp/BioTracker/View/CameraDevice.ui b/Src/View/CameraDevice.ui similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/CameraDevice.ui rename to Src/View/CameraDevice.ui diff --git a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp b/Src/View/ComponentShape.cpp similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp rename to Src/View/ComponentShape.cpp diff --git a/BioTracker/CoreApp/BioTracker/View/ComponentShape.h b/Src/View/ComponentShape.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/ComponentShape.h rename to Src/View/ComponentShape.h diff --git a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp b/Src/View/CoreParameterView.cpp similarity index 96% rename from BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp rename to Src/View/CoreParameterView.cpp index 8813a8f7..4b0eb379 100644 --- a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp +++ b/Src/View/CoreParameterView.cpp @@ -4,26 +4,25 @@ #include "Model/CoreParameter.h" #include -#include "settings/Settings.h" #include "util/types.h" #include #include "Controller/ControllerCoreParameter.h" #include #include +#include "Controller/IControllerCfg.h" CoreParameterView::CoreParameterView(QWidget *parent, IController *controller, IModel *model) : IViewWidget(parent, controller, model), ui(new Ui::CoreParameterView) { + _cfg = static_cast(controller)->getConfig(); ui->setupUi(this); ui->lineEditRectWidth->setValidator(new QDoubleValidator(this)); ui->lineEditRectHeight->setValidator(new QDoubleValidator(this)); - BioTracker::Core::Settings *settings = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); - double asdf = settings->getValueOrDefault(AREADESCRIPTOR::RECT_H, AREADESCRIPTOR::RECT_H_DEFAULT); //TODO1111 - double h = std::max(settings->getValueOrDefault(AREADESCRIPTOR::RECT_H, AREADESCRIPTOR::RECT_H_DEFAULT), std::numeric_limits::epsilon()); - double w = std::max(settings->getValueOrDefault(AREADESCRIPTOR::RECT_W, AREADESCRIPTOR::RECT_W_DEFAULT), std::numeric_limits::epsilon()); + double h = std::max(_cfg->RectificationHeight, std::numeric_limits::epsilon()); + double w = std::max(_cfg->RectificationWidth, std::numeric_limits::epsilon()); std::string sw = std::to_string(w); std::string sh = std::to_string(h); sh.erase(sh.find_last_not_of('0') + 1, std::string::npos); diff --git a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.h b/Src/View/CoreParameterView.h similarity index 98% rename from BioTracker/CoreApp/BioTracker/View/CoreParameterView.h rename to Src/View/CoreParameterView.h index b34d7473..430e0de4 100644 --- a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.h +++ b/Src/View/CoreParameterView.h @@ -3,9 +3,8 @@ #include "Interfaces/IView/IViewWidget.h" #include "View/Utility/SwitchButton.h" -//TODO add default parameters accesible via config -//#include "Model/CoreViewParameter.h" #include "Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h" +#include "util/Config.h" namespace Ui { class CoreParameterView; @@ -181,6 +180,8 @@ class CoreParameterView : public IViewWidget bool _trialStarted = false; /**< was trial started? */ QString _currentFile = "No Media"; /**< show media name in experiment tab */ + Config *_cfg; + // IViewWidget interface public slots: @@ -192,7 +193,6 @@ class CoreParameterView : public IViewWidget /// styles the "visualisation options" tab void setStyle(); void resetTrial(); - }; #endif // COREPARAMETERVIEW_H diff --git a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui b/Src/View/CoreParameterView.ui similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui rename to Src/View/CoreParameterView.ui diff --git a/BioTracker/CoreApp/BioTracker/View/GLVideoView.cpp b/Src/View/GLVideoView.cpp similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/GLVideoView.cpp rename to Src/View/GLVideoView.cpp diff --git a/BioTracker/CoreApp/BioTracker/View/GLVideoView.h b/Src/View/GLVideoView.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/GLVideoView.h rename to Src/View/GLVideoView.h diff --git a/BioTracker/CoreApp/BioTracker/View/GraphicsScene.cpp b/Src/View/GraphicsScene.cpp similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/GraphicsScene.cpp rename to Src/View/GraphicsScene.cpp diff --git a/BioTracker/CoreApp/BioTracker/View/GraphicsScene.h b/Src/View/GraphicsScene.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/GraphicsScene.h rename to Src/View/GraphicsScene.h diff --git a/BioTracker/CoreApp/BioTracker/View/GraphicsView.cpp b/Src/View/GraphicsView.cpp similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/GraphicsView.cpp rename to Src/View/GraphicsView.cpp diff --git a/BioTracker/CoreApp/BioTracker/View/GraphicsView.h b/Src/View/GraphicsView.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/GraphicsView.h rename to Src/View/GraphicsView.h diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp b/Src/View/MainWindow.cpp similarity index 93% rename from BioTracker/CoreApp/BioTracker/View/MainWindow.cpp rename to Src/View/MainWindow.cpp index 7930c5ec..a143fa84 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp +++ b/Src/View/MainWindow.cpp @@ -2,8 +2,6 @@ #include "ui_MainWindow.h" #include "util/types.h" -#include "util/singleton.h" -#include "settings/Settings.h" #include "Controller/ControllerMainWindow.h" #include "View/CoreParameterView.h" @@ -33,6 +31,7 @@ MainWindow::MainWindow(QWidget* parent, IController* controller, IModel* model) : IViewMainWindow(parent, controller, model), ui(new Ui::MainWindow) { + _cfg = static_cast(controller)->getConfig(); _previouslySelectedTracker = ""; _currentParameterView = 0; _currentCoreParameterView = 0; @@ -328,8 +327,7 @@ void MainWindow::createIntroductionWizard() { m_introWiz = new QWizard; //BioTracker::Core::Settings *disableIntroWiz = GET_CORESETTINGS(CORE_CONFIGURATION); - BioTracker::Core::Settings *set = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); - bool disabled = set->getValueOrDefault("BiotrackerCore/Disable_Wizard", false); + bool disabled = _cfg->DisableWizard; //dont show again checkbox QCheckBox* noShowCheck = new QCheckBox("Don't show this again"); @@ -654,8 +652,7 @@ void MainWindow::saveDataToFile() { boost::filesystem::path file; - BioTracker::Core::Settings *set = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); - std::string locStr = set->getValueOrDefault(CFG_DEFAULT_LOC_MAN_SAVE, ""); + std::string locStr = _cfg->DefaultLocationManualSave.toStdString(); QString locStrQ = QString::fromStdString(locStr); QString f = QFileDialog::getSaveFileName(this, "Save trajectory data to file", locStrQ, fileFilter, 0); @@ -668,9 +665,7 @@ void MainWindow::saveDataToFile() { ////////////////////////////////////////////////SLOTS///////////////////////////////////// void MainWindow::toggleNoShowWiz(bool toggle) { - - BioTracker::Core::Settings *disableIntroWiz = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); - disableIntroWiz->setParam("BiotrackerCore/Disable_Wizard", toggle); + _cfg->DisableWizard = toggle;//Todo implicit cast bool->int } void MainWindow::receiveSelectedCameraDevice(CameraConfiguration conf) { @@ -786,8 +781,23 @@ void MainWindow::on_actionOpen_Video_triggered() { } } +void MainWindow::on_actionOpen_Video_batch_triggered() { + static const QString videoFilter("Video files (*.avi *.wmv *.mp4 *.mkv *.mov)"); + + std::vector files; + + for (QString const& path : QFileDialog::getOpenFileNames(this, + "Open image files", "", videoFilter, 0)) { + files.push_back(boost::filesystem::path(path.toStdString())); + } + + if (!files.empty()) { + qobject_cast (getController())->loadVideo(files); + } +} + void MainWindow::on_actionLoad_Tracker_triggered() { - static const QString pluginFilter("BioTracker Tracking Plugin files (*.tracker.so *.tracker.dll *.tracker.dylib)"); + static const QString pluginFilter("BioTracker Tracking Plugin files (*.bio_tracker.so *.bio_tracker.dll *.bio_tracker.dylib)"); QString filename = QFileDialog::getOpenFileName(this, "Open BioTracker Tracking Plugin", "", pluginFilter, 0); @@ -861,7 +871,7 @@ void MainWindow::on_actionShowActionList_triggered() } void MainWindow::on_actionSettings_triggered() { - m_SettingsWindow = new SettingsWindow(); + m_SettingsWindow = new SettingsWindow(0, _cfg); m_SettingsWindow->show(); } @@ -922,19 +932,19 @@ void MainWindow::on_actionToggle_fullscreen_triggered() { //////////////////////////////////menu->Go to slots////////////////////////////////// void MainWindow::on_actionOpen_Plugins_directory_triggered() { - QDesktopServices::openUrl(QUrl::fromLocalFile(CFG_DIR_PLUGINS)); + QDesktopServices::openUrl(QUrl::fromLocalFile(_cfg->DirPlugins)); } void MainWindow::on_actionOpen_Track_directory_triggered() { - QDesktopServices::openUrl(QUrl::fromLocalFile(CFG_DIR_TRACKS)); + QDesktopServices::openUrl(QUrl::fromLocalFile(_cfg->DirTracks)); } void MainWindow::on_actionOpen_Trial_directory_triggered() { - QDesktopServices::openUrl(QUrl::fromLocalFile(CFG_DIR_TRIALS)); + QDesktopServices::openUrl(QUrl::fromLocalFile(_cfg->DirTrials)); } void MainWindow::on_actionOpen_Screenshot_directory_triggered() { - QDesktopServices::openUrl(QUrl::fromLocalFile(CFG_DIR_SCREENSHOTS)); + QDesktopServices::openUrl(QUrl::fromLocalFile(_cfg->DirScreenshots)); } void MainWindow::on_actionOpen_Videos_directory_triggered() { - QDesktopServices::openUrl(QUrl::fromLocalFile(CFG_DIR_VIDEOS)); + QDesktopServices::openUrl(QUrl::fromLocalFile(_cfg->DirVideos)); } @@ -949,7 +959,10 @@ void MainWindow::on_actionAbout_triggered() { version = "BioTracker3

      "; version = "Version: "; - version += GIT_HASH; + version += BIOTRACKER_GIT_TAG; + version += " ("; + version += BIORACKER_GIT_HASH; + version += ")"; version += +"

      "; version += "External libraries used:

      "; diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.h b/Src/View/MainWindow.h similarity index 95% rename from BioTracker/CoreApp/BioTracker/View/MainWindow.h rename to Src/View/MainWindow.h index aab0b64e..831789e3 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.h +++ b/Src/View/MainWindow.h @@ -17,6 +17,7 @@ #include "QWizard" #include "Utility/SwitchButton.h" +#include "Controller/IControllerCfg.h" namespace Ui { class MainWindow; @@ -80,6 +81,8 @@ class MainWindow : public IViewMainWindow { //menu->File void on_actionOpen_Video_triggered(); + + void on_actionOpen_Video_batch_triggered(); void on_actionLoad_Tracker_triggered(); @@ -182,6 +185,7 @@ class MainWindow : public IViewMainWindow { QGroupBox* _trackerBox; /**< media groupbox in menu toolbar */ QWizard* m_introWiz; /**< introduction wizard-dialog */ + Config *_cfg; }; #endif // BIOTRACKER3MAINWINDOW_H diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.ui b/Src/View/MainWindow.ui similarity index 99% rename from BioTracker/CoreApp/BioTracker/View/MainWindow.ui rename to Src/View/MainWindow.ui index 18665ead..de7321a3 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.ui +++ b/Src/View/MainWindow.ui @@ -446,8 +446,8 @@ 0 0 - 98 - 28 + 743 + 304 @@ -469,8 +469,8 @@ 0 0 - 98 - 50 + 743 + 304 @@ -515,8 +515,8 @@ 0 0 - 98 - 28 + 743 + 304 @@ -641,8 +641,8 @@ p, li { white-space: pre-wrap; } 0 0 - 98 - 28 + 743 + 304 @@ -699,6 +699,7 @@ p, li { white-space: pre-wrap; } &File + @@ -1363,6 +1364,11 @@ QToolButton { Open Plugins directory + + + Open Video Batch... + + diff --git a/BioTracker/CoreApp/BioTracker/View/NotificationLogBrowser.cpp b/Src/View/NotificationLogBrowser.cpp similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/NotificationLogBrowser.cpp rename to Src/View/NotificationLogBrowser.cpp diff --git a/BioTracker/CoreApp/BioTracker/View/NotificationLogBrowser.h b/Src/View/NotificationLogBrowser.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/NotificationLogBrowser.h rename to Src/View/NotificationLogBrowser.h diff --git a/Src/View/SettingsWindow.cpp b/Src/View/SettingsWindow.cpp new file mode 100644 index 00000000..d76d20fc --- /dev/null +++ b/Src/View/SettingsWindow.cpp @@ -0,0 +1,74 @@ +#include "SettingsWindow.h" + +#include "util/Config.h" + +#include + +SettingsWindow::SettingsWindow(QWidget *parent, Config *cfg) : + QWidget(parent), + ui(new Ui::SettingsForm) +{ + _cfg = cfg; + ui->setupUi(this); + + for (int i=0; icomboBoxVideoCodec->addItem(codecList[i].first.c_str()); + + int defaultIndex = _cfg->VideoCodecUsed; + ui->comboBoxVideoCodec->setCurrentIndex(defaultIndex); + + bool dropFrames = _cfg->DropFrames; + ui->checkBoxDropFrames->setChecked(dropFrames); + + bool recordScaled = _cfg->RecordScaledOutput; + ui->checkBox_scaledOutput->setChecked(recordScaled); + + + for (int i = 0; icomboBoxDefaultExporter->addItem(exporterList[i].c_str()); + + int exporter = _cfg->DataExporter; + ui->comboBoxDefaultExporter->setCurrentIndex(exporter); + + + ui->lineEdit_nthFrame->setValidator(new QIntValidator(this)); + int stride = _cfg->FrameStride; + ui->lineEdit_nthFrame->setText(std::to_string(stride).c_str()); + + ui->lineEdit_qp->setValidator(new QIntValidator(this)); + int qp = _cfg->GpuQp; + ui->lineEdit_qp->setText(std::to_string(qp).c_str()); + + ui->lineEditLocationManSave->setText(_cfg->DefaultLocationManualSave); + +#ifndef WITH_CUDA + ui->lineEdit_qp->setVisible(false); + ui->label_qp->setVisible(false); +#endif +} + +void SettingsWindow::on_buttonSaveClose_clicked() { + + _cfg->RecordScaledOutput = ui->checkBox_scaledOutput->isChecked(); + _cfg->DropFrames = ui->checkBoxDropFrames->isChecked(); + _cfg->VideoCodecUsed = ui->comboBoxVideoCodec->currentIndex(); + _cfg->DataExporter = ui->comboBoxDefaultExporter->currentIndex(); + _cfg->FrameStride = (ui->lineEdit_nthFrame->text()).toInt(); + _cfg->GpuQp = (ui->lineEdit_qp->text()).toInt(); + _cfg->DefaultLocationManualSave = (ui->lineEditLocationManSave->text()); + + this->close(); +} + +void SettingsWindow::on_pushButtonSetNewLocManSave_clicked() { + QString dirStr = QFileDialog::getExistingDirectory(this, tr("Select Directory"), "", QFileDialog::ShowDirsOnly); + if (dirStr != "") { + ui->lineEditLocationManSave->setText(dirStr); + } +} + + + +SettingsWindow::~SettingsWindow() +{ +} diff --git a/BioTracker/CoreApp/BioTracker/View/SettingsWindow.h b/Src/View/SettingsWindow.h similarity index 57% rename from BioTracker/CoreApp/BioTracker/View/SettingsWindow.h rename to Src/View/SettingsWindow.h index 46a12ec8..430de2d0 100644 --- a/BioTracker/CoreApp/BioTracker/View/SettingsWindow.h +++ b/Src/View/SettingsWindow.h @@ -8,6 +8,7 @@ #include "util/types.h" #include #include "ui_SettingsWindow.h" +#include "Controller/IControllerCfg.h" namespace Ui { class SettingsWindow; @@ -18,24 +19,13 @@ class SettingsWindow : public QWidget Q_OBJECT public: - explicit SettingsWindow(QWidget *parent = 0); + explicit SettingsWindow(QWidget *parent, Config *cfg); ~SettingsWindow(); - private Q_SLOTS: - //void on_buttonBox_accepted(); - - //void on_pushButton_clicked(); +private Q_SLOTS: void on_buttonSaveClose_clicked(); - void on_pushButtonSetNewLocManSave_clicked(); - - //void on_comboBox_currentIndexChanged(int index); - -Q_SIGNALS: - //void emitSelectedCameraDevice(CameraConfiguration conf); - -private: - private: Ui::SettingsForm *ui; + Config *_cfg; }; \ No newline at end of file diff --git a/BioTracker/CoreApp/BioTracker/View/SettingsWindow.ui b/Src/View/SettingsWindow.ui similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/SettingsWindow.ui rename to Src/View/SettingsWindow.ui diff --git a/BioTracker/CoreApp/BioTracker/View/TextureObjectView.cpp b/Src/View/TextureObjectView.cpp similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/TextureObjectView.cpp rename to Src/View/TextureObjectView.cpp diff --git a/BioTracker/CoreApp/BioTracker/View/TextureObjectView.h b/Src/View/TextureObjectView.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/TextureObjectView.h rename to Src/View/TextureObjectView.h diff --git a/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp b/Src/View/TrackedComponentView.cpp similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp rename to Src/View/TrackedComponentView.cpp diff --git a/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.h b/Src/View/TrackedComponentView.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/TrackedComponentView.h rename to Src/View/TrackedComponentView.h diff --git a/BioTracker/CoreApp/BioTracker/View/TrackedImageView.cpp b/Src/View/TrackedImageView.cpp similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/TrackedImageView.cpp rename to Src/View/TrackedImageView.cpp diff --git a/BioTracker/CoreApp/BioTracker/View/TrackedImageView.h b/Src/View/TrackedImageView.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/TrackedImageView.h rename to Src/View/TrackedImageView.h diff --git a/BioTracker/CoreApp/BioTracker/View/Utility/RotationHandle.cpp b/Src/View/Utility/RotationHandle.cpp similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/Utility/RotationHandle.cpp rename to Src/View/Utility/RotationHandle.cpp diff --git a/BioTracker/CoreApp/BioTracker/View/Utility/RotationHandle.h b/Src/View/Utility/RotationHandle.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/Utility/RotationHandle.h rename to Src/View/Utility/RotationHandle.h diff --git a/BioTracker/CoreApp/BioTracker/View/Utility/SwitchButton.cpp b/Src/View/Utility/SwitchButton.cpp similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/Utility/SwitchButton.cpp rename to Src/View/Utility/SwitchButton.cpp diff --git a/BioTracker/CoreApp/BioTracker/View/Utility/SwitchButton.h b/Src/View/Utility/SwitchButton.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/Utility/SwitchButton.h rename to Src/View/Utility/SwitchButton.h diff --git a/BioTracker/CoreApp/BioTracker/View/Utility/Tracer.cpp b/Src/View/Utility/Tracer.cpp similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/Utility/Tracer.cpp rename to Src/View/Utility/Tracer.cpp diff --git a/BioTracker/CoreApp/BioTracker/View/Utility/Tracer.h b/Src/View/Utility/Tracer.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/Utility/Tracer.h rename to Src/View/Utility/Tracer.h diff --git a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp b/Src/View/VideoControllWidget.cpp similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp rename to Src/View/VideoControllWidget.cpp diff --git a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.h b/Src/View/VideoControllWidget.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/VideoControllWidget.h rename to Src/View/VideoControllWidget.h diff --git a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.ui b/Src/View/VideoControllWidget.ui similarity index 100% rename from BioTracker/CoreApp/BioTracker/View/VideoControllWidget.ui rename to Src/View/VideoControllWidget.ui diff --git a/Src/cmake/FindPylon5.cmake b/Src/cmake/FindPylon5.cmake new file mode 100644 index 00000000..00628630 --- /dev/null +++ b/Src/cmake/FindPylon5.cmake @@ -0,0 +1,69 @@ + +if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") + if(${CMAKE_SIZEOF_VOID_P} EQUAL 8) + set(Pylon5_LIBRARY_DIR "/opt/pylon5/lib64") + else() + set(Pylon5_LIBRARY_DIR "/opt/pylon5/lib32") + endif() +elseif(${CMAKE_SYSTEM_NAME} MATCHES "Windows") + if(${CMAKE_SIZEOF_VOID_P} EQUAL 8) + set(Pylon5_LIBRARY_DIR "$ENV{PYLON5_DIR}/lib/x64") + else() + set(Pylon5_LIBRARY_DIR "$ENV{PYLON5_DIR}/lib/Win32") + endif() +endif() + +find_path(Pylon5_INCLUDE_DIR pylon/PylonBase.h + PATHS + /opt/pylon5/include + "$ENV{PYLON5_DIR}/include") + +find_library(Pylon5_Base_LIBRARY + NAMES + pylonbase + PylonBase_MD_VC120_v5_0 PylonBase_v5_1 + PATHS ${Pylon5_LIBRARY_DIR}) + +find_library(Pylon5_Utility_LIBRARY + NAMES + pylonutility + PylonUtility_MD_VC120_v5_0 PylonUtility_v5_1 + PATHS ${Pylon5_LIBRARY_DIR}) + +find_library(Pylon5_GenAPI_LIBRARY + NAMES + GenApi_gcc_v3_0_Basler_pylon_v5_0 + GenApi_MD_VC120_v3_0_Basler_pylon_v5_0 GenApi_MD_VC141_v3_1_Basler_pylon_v5_1 + PATHS ${Pylon5_LIBRARY_DIR}) + +find_library(Pylon5_GCBase_LIBRARY + NAMES + GCBase_gcc_v3_0_Basler_pylon_v5_0 + GCBase_MD_VC120_v3_0_Basler_pylon_v5_0 GCBase_MD_VC141_v3_1_Basler_pylon_v5_1 + PATHS ${Pylon5_LIBRARY_DIR}) + +include(FindPackageHandleStandardArgs) + +find_package_handle_standard_args(Pylon5 DEFAULT_MSG + Pylon5_INCLUDE_DIR Pylon5_Base_LIBRARY Pylon5_Utility_LIBRARY Pylon5_GenAPI_LIBRARY Pylon5_GCBase_LIBRARY) + +mark_as_advanced(Pylon5_INCLUDE_DIR Pylon5_Base_LIBRARY Pylon5_Utility_LIBRARY Pylon5_GenAPI_LIBRARY Pylon5_GCBase_LIBRARY) + +set(Pylon5_LIBRARIES ${Pylon5_Base_LIBRARY} ${Pylon5_Utility_LIBRARY} ${Pylon5_GenAPI_LIBRARY} ${Pylon5_GCBase_LIBRARY}) +set(Pylon5_INCLUDE_DIRS ${Pylon5_INCLUDE_DIR}) + +add_library(Pylon5::Base UNKNOWN IMPORTED) +set_target_properties (Pylon5::Base PROPERTIES IMPORTED_LOCATION ${Pylon5_Base_LIBRARY}) +set_target_properties (Pylon5::Base PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${Pylon5_INCLUDE_DIRS}) + +add_library(Pylon5::Utility UNKNOWN IMPORTED) +set_target_properties (Pylon5::Utility PROPERTIES IMPORTED_LOCATION ${Pylon5_Utility_LIBRARY}) +set_target_properties (Pylon5::Utility PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${Pylon5_INCLUDE_DIRS}) + +add_library(Pylon5::GenAPI UNKNOWN IMPORTED) +set_target_properties (Pylon5::GenAPI PROPERTIES IMPORTED_LOCATION ${Pylon5_GenAPI_LIBRARY}) +set_target_properties (Pylon5::GenAPI PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${Pylon5_INCLUDE_DIRS}) + +add_library(Pylon5::GCBase UNKNOWN IMPORTED) +set_target_properties (Pylon5::GCBase PROPERTIES IMPORTED_LOCATION ${Pylon5_GCBase_LIBRARY}) +set_target_properties (Pylon5::GCBase PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${Pylon5_INCLUDE_DIRS}) \ No newline at end of file diff --git a/Src/cmake/Locate.cmake b/Src/cmake/Locate.cmake new file mode 100644 index 00000000..6da6860c --- /dev/null +++ b/Src/cmake/Locate.cmake @@ -0,0 +1,86 @@ + +function(locate_shared_library VAR) + foreach(name ${ARGN}) + set(_filename "${CMAKE_SHARED_LIBRARY_PREFIX}${name}${CMAKE_SHARED_LIBRARY_SUFFIX}") + message(STATUS "Locating ${_filename}") + if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") + execute_process( + COMMAND where.exe "${_filename}" + OUTPUT_VARIABLE _matches + OUTPUT_STRIP_TRAILING_WHITESPACE + RESULT_VARIABLE _res + ) + if(NOT "${_res}" STREQUAL "0") + message(FATAL_ERROR "Could not locate ${_filename}") + endif() + string(REGEX REPLACE "\n" ";" _matches "${_matches}") + list(GET _matches 0 _match) + string(REGEX REPLACE "\\\\" "/" _match "${_match}") + + if(DEFINED ${VAR}) + list(APPEND ${VAR} "${_match}") + set(${VAR} ${${VAR}} PARENT_SCOPE) + else() + set(${VAR} "${_match}" PARENT_SCOPE) + endif() + else() + message(FATAL_ERROR "Platform not supported") + endif() + endforeach() +endfunction() + +function(locate_opencv VAR) + cmake_parse_arguments(ARG "" "" "COMPONENTS" ${ARGN}) + + if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") + set(suffix "${OpenCV_VERSION_MAJOR}${OpenCV_VERSION_MINOR}${OpenCV_VERSION_PATCH}") + set(suffixX64 "${OpenCV_VERSION_MAJOR}${OpenCV_VERSION_MINOR}${OpenCV_VERSION_PATCH}_64") + + foreach(component ${ARG_COMPONENTS}) + if("${component}" STREQUAL "ffmpeg") + locate_shared_library(${VAR} "opencv_${component}${suffixX64}") + else() + locate_shared_library(${VAR} "opencv_${component}${suffix}") + endif() + endforeach() + set(${VAR} ${${VAR}} PARENT_SCOPE) + else() + message(FATAL_ERROR "Platform not supported") + endif() +endfunction() + +function(locate_cuda VAR) + cmake_parse_arguments(ARG "" "" "COMPONENTS" ${ARGN}) + + if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") + if(${CMAKE_SIZEOF_VOID_P} EQUAL 8) + set(suffix "64_${CUDA_VERSION_MAJOR}${CUDA_VERSION_MINOR}") + else() + set(suffix "32_${CUDA_VERSION_MAJOR}${CUDA_VERSION_MINOR}") + endif() + + foreach(component ${ARG_COMPONENTS}) + locate_shared_library(${VAR} "${component}${suffix}") + endforeach() + set(${VAR} ${${VAR}} PARENT_SCOPE) + else() + message(FATAL_ERROR "Platform not supported") + endif() +endfunction() + +function(locate_cudnn VAR) + cmake_parse_arguments(ARG "" "" "COMPONENTS" ${ARGN}) + + if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") + if(${CMAKE_SIZEOF_VOID_P} EQUAL 8) + set(suffix "64_${version}") + else() + set(suffix "32_${version}") + endif() + + locate_shared_library(${VAR} "cudnn${suffix}") + set(${VAR} ${${VAR}} PARENT_SCOPE) + else() + message(FATAL_ERROR "Platform not supported") + endif() +endfunction() diff --git a/Src/cmake/WIX/WIX.template.in b/Src/cmake/WIX/WIX.template.in new file mode 100644 index 00000000..aae0e719 --- /dev/null +++ b/Src/cmake/WIX/WIX.template.in @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + ProductIcon.ico + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Src/cmake/WIX/licence.rtf b/Src/cmake/WIX/licence.rtf new file mode 100644 index 00000000..4a4d654a --- /dev/null +++ b/Src/cmake/WIX/licence.rtf @@ -0,0 +1,665 @@ +{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 Calibri;}} +{\colortbl ;\red0\green0\blue255;} +{\*\generator Msftedit 5.41.21.2510;}\viewkind4\uc1\pard\sa200\sl276\slmult1\lang7\f0\fs22 GNU AFFERO GENERAL PUBLIC LICENSE\par + Version 3, 19 November 2007\par +\par + Copyright (C) 2007 Free Software Foundation, Inc. <{\field{\*\fldinst{HYPERLINK "https://fsf.org/"}}{\fldrslt{\ul\cf1 https://fsf.org/}}}\f0\fs22 >\par + Everyone is permitted to copy and distribute verbatim copies\par + of this license document, but changing it is not allowed.\par +\par + Preamble\par +\par + The GNU Affero General Public License is a free, copyleft license for\par +software and other kinds of works, specifically designed to ensure\par +cooperation with the community in the case of network server software.\par +\par + The licenses for most software and other practical works are designed\par +to take away your freedom to share and change the works. By contrast,\par +our General Public Licenses are intended to guarantee your freedom to\par +share and change all versions of a program--to make sure it remains free\par +software for all its users.\par +\par + When we speak of free software, we are referring to freedom, not\par +price. Our General Public Licenses are designed to make sure that you\par +have the freedom to distribute copies of free software (and charge for\par +them if you wish), that you receive source code or can get it if you\par +want it, that you can change the software or use pieces of it in new\par +free programs, and that you know you can do these things.\par +\par + Developers that use our General Public Licenses protect your rights\par +with two steps: (1) assert copyright on the software, and (2) offer\par +you this License which gives you legal permission to copy, distribute\par +and/or modify the software.\par +\par + A secondary benefit of defending all users' freedom is that\par +improvements made in alternate versions of the program, if they\par +receive widespread use, become available for other developers to\par +incorporate. Many developers of free software are heartened and\par +encouraged by the resulting cooperation. However, in the case of\par +software used on network servers, this result may fail to come about.\par +The GNU General Public License permits making a modified version and\par +letting the public access it on a server without ever releasing its\par +source code to the public.\par +\par + The GNU Affero General Public License is designed specifically to\par +ensure that, in such cases, the modified source code becomes available\par +to the community. It requires the operator of a network server to\par +provide the source code of the modified version running there to the\par +users of that server. Therefore, public use of a modified version, on\par +a publicly accessible server, gives the public access to the source\par +code of the modified version.\par +\par + An older license, called the Affero General Public License and\par +published by Affero, was designed to accomplish similar goals. This is\par +a different license, not a version of the Affero GPL, but Affero has\par +released a new version of the Affero GPL which permits relicensing under\par +this license.\par +\par + The precise terms and conditions for copying, distribution and\par +modification follow.\par +\par + TERMS AND CONDITIONS\par +\par + 0. Definitions.\par +\par + "This License" refers to version 3 of the GNU Affero General Public License.\par +\par + "Copyright" also means copyright-like laws that apply to other kinds of\par +works, such as semiconductor masks.\par +\par + "The Program" refers to any copyrightable work licensed under this\par +License. Each licensee is addressed as "you". "Licensees" and\par +"recipients" may be individuals or organizations.\par +\par + To "modify" a work means to copy from or adapt all or part of the work\par +in a fashion requiring copyright permission, other than the making of an\par +exact copy. The resulting work is called a "modified version" of the\par +earlier work or a work "based on" the earlier work.\par +\par + A "covered work" means either the unmodified Program or a work based\par +on the Program.\par +\par + To "propagate" a work means to do anything with it that, without\par +permission, would make you directly or secondarily liable for\par +infringement under applicable copyright law, except executing it on a\par +computer or modifying a private copy. Propagation includes copying,\par +distribution (with or without modification), making available to the\par +public, and in some countries other activities as well.\par +\par + To "convey" a work means any kind of propagation that enables other\par +parties to make or receive copies. Mere interaction with a user through\par +a computer network, with no transfer of a copy, is not conveying.\par +\par + An interactive user interface displays "Appropriate Legal Notices"\par +to the extent that it includes a convenient and prominently visible\par +feature that (1) displays an appropriate copyright notice, and (2)\par +tells the user that there is no warranty for the work (except to the\par +extent that warranties are provided), that licensees may convey the\par +work under this License, and how to view a copy of this License. If\par +the interface presents a list of user commands or options, such as a\par +menu, a prominent item in the list meets this criterion.\par +\par + 1. Source Code.\par +\par + The "source code" for a work means the preferred form of the work\par +for making modifications to it. "Object code" means any non-source\par +form of a work.\par +\par + A "Standard Interface" means an interface that either is an official\par +standard defined by a recognized standards body, or, in the case of\par +interfaces specified for a particular programming language, one that\par +is widely used among developers working in that language.\par +\par + The "System Libraries" of an executable work include anything, other\par +than the work as a whole, that (a) is included in the normal form of\par +packaging a Major Component, but which is not part of that Major\par +Component, and (b) serves only to enable use of the work with that\par +Major Component, or to implement a Standard Interface for which an\par +implementation is available to the public in source code form. A\par +"Major Component", in this context, means a major essential component\par +(kernel, window system, and so on) of the specific operating system\par +(if any) on which the executable work runs, or a compiler used to\par +produce the work, or an object code interpreter used to run it.\par +\par + The "Corresponding Source" for a work in object code form means all\par +the source code needed to generate, install, and (for an executable\par +work) run the object code and to modify the work, including scripts to\par +control those activities. However, it does not include the work's\par +System Libraries, or general-purpose tools or generally available free\par +programs which are used unmodified in performing those activities but\par +which are not part of the work. For example, Corresponding Source\par +includes interface definition files associated with source files for\par +the work, and the source code for shared libraries and dynamically\par +linked subprograms that the work is specifically designed to require,\par +such as by intimate data communication or control flow between those\par +subprograms and other parts of the work.\par +\par + The Corresponding Source need not include anything that users\par +can regenerate automatically from other parts of the Corresponding\par +Source.\par +\par + The Corresponding Source for a work in source code form is that\par +same work.\par +\par + 2. Basic Permissions.\par +\par + All rights granted under this License are granted for the term of\par +copyright on the Program, and are irrevocable provided the stated\par +conditions are met. This License explicitly affirms your unlimited\par +permission to run the unmodified Program. The output from running a\par +covered work is covered by this License only if the output, given its\par +content, constitutes a covered work. This License acknowledges your\par +rights of fair use or other equivalent, as provided by copyright law.\par +\par + You may make, run and propagate covered works that you do not\par +convey, without conditions so long as your license otherwise remains\par +in force. You may convey covered works to others for the sole purpose\par +of having them make modifications exclusively for you, or provide you\par +with facilities for running those works, provided that you comply with\par +the terms of this License in conveying all material for which you do\par +not control copyright. Those thus making or running the covered works\par +for you must do so exclusively on your behalf, under your direction\par +and control, on terms that prohibit them from making any copies of\par +your copyrighted material outside their relationship with you.\par +\par + Conveying under any other circumstances is permitted solely under\par +the conditions stated below. Sublicensing is not allowed; section 10\par +makes it unnecessary.\par +\par + 3. Protecting Users' Legal Rights From Anti-Circumvention Law.\par +\par + No covered work shall be deemed part of an effective technological\par +measure under any applicable law fulfilling obligations under article\par +11 of the WIPO copyright treaty adopted on 20 December 1996, or\par +similar laws prohibiting or restricting circumvention of such\par +measures.\par +\par + When you convey a covered work, you waive any legal power to forbid\par +circumvention of technological measures to the extent such circumvention\par +is effected by exercising rights under this License with respect to\par +the covered work, and you disclaim any intention to limit operation or\par +modification of the work as a means of enforcing, against the work's\par +users, your or third parties' legal rights to forbid circumvention of\par +technological measures.\par +\par + 4. Conveying Verbatim Copies.\par +\par + You may convey verbatim copies of the Program's source code as you\par +receive it, in any medium, provided that you conspicuously and\par +appropriately publish on each copy an appropriate copyright notice;\par +keep intact all notices stating that this License and any\par +non-permissive terms added in accord with section 7 apply to the code;\par +keep intact all notices of the absence of any warranty; and give all\par +recipients a copy of this License along with the Program.\par +\par + You may charge any price or no price for each copy that you convey,\par +and you may offer support or warranty protection for a fee.\par +\par + 5. Conveying Modified Source Versions.\par +\par + You may convey a work based on the Program, or the modifications to\par +produce it from the Program, in the form of source code under the\par +terms of section 4, provided that you also meet all of these conditions:\par +\par + a) The work must carry prominent notices stating that you modified\par + it, and giving a relevant date.\par +\par + b) The work must carry prominent notices stating that it is\par + released under this License and any conditions added under section\par + 7. This requirement modifies the requirement in section 4 to\par + "keep intact all notices".\par +\par + c) You must license the entire work, as a whole, under this\par + License to anyone who comes into possession of a copy. This\par + License will therefore apply, along with any applicable section 7\par + additional terms, to the whole of the work, and all its parts,\par + regardless of how they are packaged. This License gives no\par + permission to license the work in any other way, but it does not\par + invalidate such permission if you have separately received it.\par +\par + d) If the work has interactive user interfaces, each must display\par + Appropriate Legal Notices; however, if the Program has interactive\par + interfaces that do not display Appropriate Legal Notices, your\par + work need not make them do so.\par +\par + A compilation of a covered work with other separate and independent\par +works, which are not by their nature extensions of the covered work,\par +and which are not combined with it such as to form a larger program,\par +in or on a volume of a storage or distribution medium, is called an\par +"aggregate" if the compilation and its resulting copyright are not\par +used to limit the access or legal rights of the compilation's users\par +beyond what the individual works permit. Inclusion of a covered work\par +in an aggregate does not cause this License to apply to the other\par +parts of the aggregate.\par +\par + 6. Conveying Non-Source Forms.\par +\par + You may convey a covered work in object code form under the terms\par +of sections 4 and 5, provided that you also convey the\par +machine-readable Corresponding Source under the terms of this License,\par +in one of these ways:\par +\par + a) Convey the object code in, or embodied in, a physical product\par + (including a physical distribution medium), accompanied by the\par + Corresponding Source fixed on a durable physical medium\par + customarily used for software interchange.\par +\par + b) Convey the object code in, or embodied in, a physical product\par + (including a physical distribution medium), accompanied by a\par + written offer, valid for at least three years and valid for as\par + long as you offer spare parts or customer support for that product\par + model, to give anyone who possesses the object code either (1) a\par + copy of the Corresponding Source for all the software in the\par + product that is covered by this License, on a durable physical\par + medium customarily used for software interchange, for a price no\par + more than your reasonable cost of physically performing this\par + conveying of source, or (2) access to copy the\par + Corresponding Source from a network server at no charge.\par +\par + c) Convey individual copies of the object code with a copy of the\par + written offer to provide the Corresponding Source. This\par + alternative is allowed only occasionally and noncommercially, and\par + only if you received the object code with such an offer, in accord\par + with subsection 6b.\par +\par + d) Convey the object code by offering access from a designated\par + place (gratis or for a charge), and offer equivalent access to the\par + Corresponding Source in the same way through the same place at no\par + further charge. You need not require recipients to copy the\par + Corresponding Source along with the object code. If the place to\par + copy the object code is a network server, the Corresponding Source\par + may be on a different server (operated by you or a third party)\par + that supports equivalent copying facilities, provided you maintain\par + clear directions next to the object code saying where to find the\par + Corresponding Source. Regardless of what server hosts the\par + Corresponding Source, you remain obligated to ensure that it is\par + available for as long as needed to satisfy these requirements.\par +\par + e) Convey the object code using peer-to-peer transmission, provided\par + you inform other peers where the object code and Corresponding\par + Source of the work are being offered to the general public at no\par + charge under subsection 6d.\par +\par + A separable portion of the object code, whose source code is excluded\par +from the Corresponding Source as a System Library, need not be\par +included in conveying the object code work.\par +\par + A "User Product" is either (1) a "consumer product", which means any\par +tangible personal property which is normally used for personal, family,\par +or household purposes, or (2) anything designed or sold for incorporation\par +into a dwelling. In determining whether a product is a consumer product,\par +doubtful cases shall be resolved in favor of coverage. For a particular\par +product received by a particular user, "normally used" refers to a\par +typical or common use of that class of product, regardless of the status\par +of the particular user or of the way in which the particular user\par +actually uses, or expects or is expected to use, the product. A product\par +is a consumer product regardless of whether the product has substantial\par +commercial, industrial or non-consumer uses, unless such uses represent\par +the only significant mode of use of the product.\par +\par + "Installation Information" for a User Product means any methods,\par +procedures, authorization keys, or other information required to install\par +and execute modified versions of a covered work in that User Product from\par +a modified version of its Corresponding Source. The information must\par +suffice to ensure that the continued functioning of the modified object\par +code is in no case prevented or interfered with solely because\par +modification has been made.\par +\par + If you convey an object code work under this section in, or with, or\par +specifically for use in, a User Product, and the conveying occurs as\par +part of a transaction in which the right of possession and use of the\par +User Product is transferred to the recipient in perpetuity or for a\par +fixed term (regardless of how the transaction is characterized), the\par +Corresponding Source conveyed under this section must be accompanied\par +by the Installation Information. But this requirement does not apply\par +if neither you nor any third party retains the ability to install\par +modified object code on the User Product (for example, the work has\par +been installed in ROM).\par +\par + The requirement to provide Installation Information does not include a\par +requirement to continue to provide support service, warranty, or updates\par +for a work that has been modified or installed by the recipient, or for\par +the User Product in which it has been modified or installed. Access to a\par +network may be denied when the modification itself materially and\par +adversely affects the operation of the network or violates the rules and\par +protocols for communication across the network.\par +\par + Corresponding Source conveyed, and Installation Information provided,\par +in accord with this section must be in a format that is publicly\par +documented (and with an implementation available to the public in\par +source code form), and must require no special password or key for\par +unpacking, reading or copying.\par +\par + 7. Additional Terms.\par +\par + "Additional permissions" are terms that supplement the terms of this\par +License by making exceptions from one or more of its conditions.\par +Additional permissions that are applicable to the entire Program shall\par +be treated as though they were included in this License, to the extent\par +that they are valid under applicable law. If additional permissions\par +apply only to part of the Program, that part may be used separately\par +under those permissions, but the entire Program remains governed by\par +this License without regard to the additional permissions.\par +\par + When you convey a copy of a covered work, you may at your option\par +remove any additional permissions from that copy, or from any part of\par +it. (Additional permissions may be written to require their own\par +removal in certain cases when you modify the work.) You may place\par +additional permissions on material, added by you to a covered work,\par +for which you have or can give appropriate copyright permission.\par +\par + Notwithstanding any other provision of this License, for material you\par +add to a covered work, you may (if authorized by the copyright holders of\par +that material) supplement the terms of this License with terms:\par +\par + a) Disclaiming warranty or limiting liability differently from the\par + terms of sections 15 and 16 of this License; or\par +\par + b) Requiring preservation of specified reasonable legal notices or\par + author attributions in that material or in the Appropriate Legal\par + Notices displayed by works containing it; or\par +\par + c) Prohibiting misrepresentation of the origin of that material, or\par + requiring that modified versions of such material be marked in\par + reasonable ways as different from the original version; or\par +\par + d) Limiting the use for publicity purposes of names of licensors or\par + authors of the material; or\par +\par + e) Declining to grant rights under trademark law for use of some\par + trade names, trademarks, or service marks; or\par +\par + f) Requiring indemnification of licensors and authors of that\par + material by anyone who conveys the material (or modified versions of\par + it) with contractual assumptions of liability to the recipient, for\par + any liability that these contractual assumptions directly impose on\par + those licensors and authors.\par +\par + All other non-permissive additional terms are considered "further\par +restrictions" within the meaning of section 10. If the Program as you\par +received it, or any part of it, contains a notice stating that it is\par +governed by this License along with a term that is a further\par +restriction, you may remove that term. If a license document contains\par +a further restriction but permits relicensing or conveying under this\par +License, you may add to a covered work material governed by the terms\par +of that license document, provided that the further restriction does\par +not survive such relicensing or conveying.\par +\par + If you add terms to a covered work in accord with this section, you\par +must place, in the relevant source files, a statement of the\par +additional terms that apply to those files, or a notice indicating\par +where to find the applicable terms.\par +\par + Additional terms, permissive or non-permissive, may be stated in the\par +form of a separately written license, or stated as exceptions;\par +the above requirements apply either way.\par +\par + 8. Termination.\par +\par + You may not propagate or modify a covered work except as expressly\par +provided under this License. Any attempt otherwise to propagate or\par +modify it is void, and will automatically terminate your rights under\par +this License (including any patent licenses granted under the third\par +paragraph of section 11).\par +\par + However, if you cease all violation of this License, then your\par +license from a particular copyright holder is reinstated (a)\par +provisionally, unless and until the copyright holder explicitly and\par +finally terminates your license, and (b) permanently, if the copyright\par +holder fails to notify you of the violation by some reasonable means\par +prior to 60 days after the cessation.\par +\par + Moreover, your license from a particular copyright holder is\par +reinstated permanently if the copyright holder notifies you of the\par +violation by some reasonable means, this is the first time you have\par +received notice of violation of this License (for any work) from that\par +copyright holder, and you cure the violation prior to 30 days after\par +your receipt of the notice.\par +\par + Termination of your rights under this section does not terminate the\par +licenses of parties who have received copies or rights from you under\par +this License. If your rights have been terminated and not permanently\par +reinstated, you do not qualify to receive new licenses for the same\par +material under section 10.\par +\par + 9. Acceptance Not Required for Having Copies.\par +\par + You are not required to accept this License in order to receive or\par +run a copy of the Program. Ancillary propagation of a covered work\par +occurring solely as a consequence of using peer-to-peer transmission\par +to receive a copy likewise does not require acceptance. However,\par +nothing other than this License grants you permission to propagate or\par +modify any covered work. These actions infringe copyright if you do\par +not accept this License. Therefore, by modifying or propagating a\par +covered work, you indicate your acceptance of this License to do so.\par +\par + 10. Automatic Licensing of Downstream Recipients.\par +\par + Each time you convey a covered work, the recipient automatically\par +receives a license from the original licensors, to run, modify and\par +propagate that work, subject to this License. You are not responsible\par +for enforcing compliance by third parties with this License.\par +\par + An "entity transaction" is a transaction transferring control of an\par +organization, or substantially all assets of one, or subdividing an\par +organization, or merging organizations. If propagation of a covered\par +work results from an entity transaction, each party to that\par +transaction who receives a copy of the work also receives whatever\par +licenses to the work the party's predecessor in interest had or could\par +give under the previous paragraph, plus a right to possession of the\par +Corresponding Source of the work from the predecessor in interest, if\par +the predecessor has it or can get it with reasonable efforts.\par +\par + You may not impose any further restrictions on the exercise of the\par +rights granted or affirmed under this License. For example, you may\par +not impose a license fee, royalty, or other charge for exercise of\par +rights granted under this License, and you may not initiate litigation\par +(including a cross-claim or counterclaim in a lawsuit) alleging that\par +any patent claim is infringed by making, using, selling, offering for\par +sale, or importing the Program or any portion of it.\par +\par + 11. Patents.\par +\par + A "contributor" is a copyright holder who authorizes use under this\par +License of the Program or a work on which the Program is based. The\par +work thus licensed is called the contributor's "contributor version".\par +\par + A contributor's "essential patent claims" are all patent claims\par +owned or controlled by the contributor, whether already acquired or\par +hereafter acquired, that would be infringed by some manner, permitted\par +by this License, of making, using, or selling its contributor version,\par +but do not include claims that would be infringed only as a\par +consequence of further modification of the contributor version. For\par +purposes of this definition, "control" includes the right to grant\par +patent sublicenses in a manner consistent with the requirements of\par +this License.\par +\par + Each contributor grants you a non-exclusive, worldwide, royalty-free\par +patent license under the contributor's essential patent claims, to\par +make, use, sell, offer for sale, import and otherwise run, modify and\par +propagate the contents of its contributor version.\par +\par + In the following three paragraphs, a "patent license" is any express\par +agreement or commitment, however denominated, not to enforce a patent\par +(such as an express permission to practice a patent or covenant not to\par +sue for patent infringement). To "grant" such a patent license to a\par +party means to make such an agreement or commitment not to enforce a\par +patent against the party.\par +\par + If you convey a covered work, knowingly relying on a patent license,\par +and the Corresponding Source of the work is not available for anyone\par +to copy, free of charge and under the terms of this License, through a\par +publicly available network server or other readily accessible means,\par +then you must either (1) cause the Corresponding Source to be so\par +available, or (2) arrange to deprive yourself of the benefit of the\par +patent license for this particular work, or (3) arrange, in a manner\par +consistent with the requirements of this License, to extend the patent\par +license to downstream recipients. "Knowingly relying" means you have\par +actual knowledge that, but for the patent license, your conveying the\par +covered work in a country, or your recipient's use of the covered work\par +in a country, would infringe one or more identifiable patents in that\par +country that you have reason to believe are valid.\par +\par + If, pursuant to or in connection with a single transaction or\par +arrangement, you convey, or propagate by procuring conveyance of, a\par +covered work, and grant a patent license to some of the parties\par +receiving the covered work authorizing them to use, propagate, modify\par +or convey a specific copy of the covered work, then the patent license\par +you grant is automatically extended to all recipients of the covered\par +work and works based on it.\par +\par + A patent license is "discriminatory" if it does not include within\par +the scope of its coverage, prohibits the exercise of, or is\par +conditioned on the non-exercise of one or more of the rights that are\par +specifically granted under this License. You may not convey a covered\par +work if you are a party to an arrangement with a third party that is\par +in the business of distributing software, under which you make payment\par +to the third party based on the extent of your activity of conveying\par +the work, and under which the third party grants, to any of the\par +parties who would receive the covered work from you, a discriminatory\par +patent license (a) in connection with copies of the covered work\par +conveyed by you (or copies made from those copies), or (b) primarily\par +for and in connection with specific products or compilations that\par +contain the covered work, unless you entered into that arrangement,\par +or that patent license was granted, prior to 28 March 2007.\par +\par + Nothing in this License shall be construed as excluding or limiting\par +any implied license or other defenses to infringement that may\par +otherwise be available to you under applicable patent law.\par +\par + 12. No Surrender of Others' Freedom.\par +\par + If conditions are imposed on you (whether by court order, agreement or\par +otherwise) that contradict the conditions of this License, they do not\par +excuse you from the conditions of this License. If you cannot convey a\par +covered work so as to satisfy simultaneously your obligations under this\par +License and any other pertinent obligations, then as a consequence you may\par +not convey it at all. For example, if you agree to terms that obligate you\par +to collect a royalty for further conveying from those to whom you convey\par +the Program, the only way you could satisfy both those terms and this\par +License would be to refrain entirely from conveying the Program.\par +\par + 13. Remote Network Interaction; Use with the GNU General Public License.\par +\par + Notwithstanding any other provision of this License, if you modify the\par +Program, your modified version must prominently offer all users\par +interacting with it remotely through a computer network (if your version\par +supports such interaction) an opportunity to receive the Corresponding\par +Source of your version by providing access to the Corresponding Source\par +from a network server at no charge, through some standard or customary\par +means of facilitating copying of software. This Corresponding Source\par +shall include the Corresponding Source for any work covered by version 3\par +of the GNU General Public License that is incorporated pursuant to the\par +following paragraph.\par +\par + Notwithstanding any other provision of this License, you have\par +permission to link or combine any covered work with a work licensed\par +under version 3 of the GNU General Public License into a single\par +combined work, and to convey the resulting work. The terms of this\par +License will continue to apply to the part which is the covered work,\par +but the work with which it is combined will remain governed by version\par +3 of the GNU General Public License.\par +\par + 14. Revised Versions of this License.\par +\par + The Free Software Foundation may publish revised and/or new versions of\par +the GNU Affero General Public License from time to time. Such new versions\par +will be similar in spirit to the present version, but may differ in detail to\par +address new problems or concerns.\par +\par + Each version is given a distinguishing version number. If the\par +Program specifies that a certain numbered version of the GNU Affero General\par +Public License "or any later version" applies to it, you have the\par +option of following the terms and conditions either of that numbered\par +version or of any later version published by the Free Software\par +Foundation. If the Program does not specify a version number of the\par +GNU Affero General Public License, you may choose any version ever published\par +by the Free Software Foundation.\par +\par + If the Program specifies that a proxy can decide which future\par +versions of the GNU Affero General Public License can be used, that proxy's\par +public statement of acceptance of a version permanently authorizes you\par +to choose that version for the Program.\par +\par + Later license versions may give you additional or different\par +permissions. However, no additional obligations are imposed on any\par +author or copyright holder as a result of your choosing to follow a\par +later version.\par +\par + 15. Disclaimer of Warranty.\par +\par + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\par +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\par +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY\par +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\par +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\par +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\par +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\par +ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\par +\par + 16. Limitation of Liability.\par +\par + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\par +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\par +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\par +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\par +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\par +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\par +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\par +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\par +SUCH DAMAGES.\par +\par + 17. Interpretation of Sections 15 and 16.\par +\par + If the disclaimer of warranty and limitation of liability provided\par +above cannot be given local legal effect according to their terms,\par +reviewing courts shall apply local law that most closely approximates\par +an absolute waiver of all civil liability in connection with the\par +Program, unless a warranty or assumption of liability accompanies a\par +copy of the Program in return for a fee.\par +\par + END OF TERMS AND CONDITIONS\par +\par + How to Apply These Terms to Your New Programs\par +\par + If you develop a new program, and you want it to be of the greatest\par +possible use to the public, the best way to achieve this is to make it\par +free software which everyone can redistribute and change under these terms.\par +\par + To do so, attach the following notices to the program. It is safest\par +to attach them to the start of each source file to most effectively\par +state the exclusion of warranty; and each file should have at least\par +the "copyright" line and a pointer to where the full notice is found.\par +\par + \par + Copyright (C) \par +\par + This program is free software: you can redistribute it and/or modify\par + it under the terms of the GNU Affero General Public License as published by\par + the Free Software Foundation, either version 3 of the License, or\par + (at your option) any later version.\par +\par + This program is distributed in the hope that it will be useful,\par + but WITHOUT ANY WARRANTY; without even the implied warranty of\par + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\par + GNU Affero General Public License for more details.\par +\par + You should have received a copy of the GNU Affero General Public License\par + along with this program. If not, see <{\field{\*\fldinst{HYPERLINK "https://www.gnu.org/licenses/"}}{\fldrslt{\ul\cf1 https://www.gnu.org/licenses/}}}\f0\fs22 >.\par +\par +Also add information on how to contact you by electronic and paper mail.\par +\par + If your software can interact with users remotely through a computer\par +network, you should also make sure that it provides a way for users to\par +get its source. For example, if your program is a web application, its\par +interface could display a "Source" link that leads users to an archive\par +of the code. There are many ways you could offer source, and different\par +solutions will be better for different programs; see section 13 for the\par +specific requirements.\par +\par + You should also get your employer (if you work as a programmer) or school,\par +if any, to sign a "copyright disclaimer" for the program, if necessary.\par +For more information on this, and how to apply and follow the GNU AGPL, see\par +<{\field{\*\fldinst{HYPERLINK "https://www.gnu.org/licenses/"}}{\fldrslt{\ul\cf1 https://www.gnu.org/licenses/}}}\f0\fs22 >.\par +} + \ No newline at end of file diff --git a/Src/cmake/WinDeployQt5.cmake b/Src/cmake/WinDeployQt5.cmake new file mode 100644 index 00000000..9a95ef5c --- /dev/null +++ b/Src/cmake/WinDeployQt5.cmake @@ -0,0 +1,81 @@ +# The MIT License (MIT) +# +# Copyright (c) 2017 Nathan Osman +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +find_package(Qt5Core REQUIRED) + +# Retrieve the absolute path to qmake and then use that path to find +# the windeployqt binary +get_target_property(_qmake_executable Qt5::qmake IMPORTED_LOCATION) +get_filename_component(_qt_bin_dir "${_qmake_executable}" DIRECTORY) +find_program(WINDEPLOYQT_EXECUTABLE windeployqt HINTS "${_qt_bin_dir}") + +# Running this with MSVC 2015 requires CMake 3.6+ +if((MSVC_VERSION VERSION_EQUAL 1900 OR MSVC_VERSION VERSION_GREATER 1900) + AND CMAKE_VERSION VERSION_LESS "3.6") + message(FATAL_ERROR "Deploying with MSVC 2015+ requires CMake 3.6+") +endif() + +function(deploy_qt5 target) + cmake_parse_arguments(ARG "" "DESTINATION" "" ${ARGN}) + + # install(CODE ...) does not support generator expressions, but file(GENERATE ...) does -> store the path in a file + file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${target}_path" + CONTENT "$" + ) + + # Before installation, run a series of commands that copy each of the Qt + # runtime files to the appropriate directory for installation + install(CODE + " + file(READ \"${CMAKE_CURRENT_BINARY_DIR}/${target}_path\" _file) + execute_process( + COMMAND \"${CMAKE_COMMAND}\" -E + env PATH=\"${_qt_bin_dir}\" \"${WINDEPLOYQT_EXECUTABLE}\" + --dry-run + --no-compiler-runtime + --no-angle + --no-opengl-sw + --list mapping + \${_file} + OUTPUT_VARIABLE _output + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + separate_arguments(_files WINDOWS_COMMAND \${_output}) + while(_files) + list(GET _files 0 _src) + list(GET _files 1 _dest) + if(\"${ARG_DESTINATION}\" STREQUAL \"\") + set(_dest \"\${CMAKE_INSTALL_PREFIX}/\${_dest}\") + else() + set(_dest \"\${CMAKE_INSTALL_PREFIX}/${ARG_DESTINATION}/\${_dest}\") + endif() + execute_process( + COMMAND \"${CMAKE_COMMAND}\" -E + copy \${_src} \"\${_dest}\" + ) + list(REMOVE_AT _files 0 1) + endwhile() + " + ) +endfunction() + +mark_as_advanced(WINDEPLOYQT_EXECUTABLE) diff --git a/BioTracker/CoreApp/BioTracker/guiresources.qrc b/Src/guiresources.qrc similarity index 100% rename from BioTracker/CoreApp/BioTracker/guiresources.qrc rename to Src/guiresources.qrc diff --git a/Src/main.cpp b/Src/main.cpp new file mode 100644 index 00000000..f9034afa --- /dev/null +++ b/Src/main.cpp @@ -0,0 +1,85 @@ +#include +#include "BioTracker3App.h" +#include "GuiContext.h" +#include "opencv2/core/core.hpp" +#include +#include +#include +#include +#include +#include "Model/MediaPlayerStateMachine/PlayerParameters.h" +#include "util/types.h" + +#include "util/CLIcommands.h" +#include "Interfaces/IModel/IModelTrackedComponent.h" +#include "util/Config.h" +#include + +//This will hide the console. +//See https://stackoverflow.com/questions/2139637/hide-console-of-windows-application +#ifdef _WIN32 +//#pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup") +#endif + +// Get the default Qt message handler. +static const QtMessageHandler QT_DEFAULT_MESSAGE_HANDLER = qInstallMessageHandler(0); + +void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg) +{ + if (type == QtMsgType::QtInfoMsg) + return; + + QString fmsg = qFormatLogMessage(type, context, msg); + QString outf = IConfig::dataLocation+"/log.txt"; + std::string debugs = outf.toStdString(); + QFile outFile(outf); + outFile.open(QIODevice::WriteOnly | QIODevice::Append); + QTextStream ts(&outFile); + ts << fmsg << endl; + + (*QT_DEFAULT_MESSAGE_HANDLER)(type, context, msg); +} + +int main(int argc, char* argv[]) { + QApplication app(argc, argv); + + app.setOrganizationName("FU Berlin"); + app.setApplicationName("BioTracker"); + IConfig::configLocation = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation); + IConfig::dataLocation = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); + Config *cfg = new Config(); + CLI::optionParser(argc, argv, cfg); + QString cfgLoc = cfg->CfgCustomLocation.isEmpty()?Config::configLocation:cfg->CfgCustomLocation; + cfg->load(cfgLoc, "config.ini"); + cfg->save(cfgLoc, "config.ini"); + + qRegisterMetaType("cv::Mat"); + qRegisterMetaType>("std::shared_ptr"); + qRegisterMetaType("std::size_t"); + qRegisterMetaType("size_t"); + qRegisterMetaType>("std::vector"); + qRegisterMetaType("BiotrackerTypes::AreaType"); + qRegisterMetaType>("QVector"); + qRegisterMetaType("playerParameters*"); + qRegisterMetaType("CameraConfiguration"); + qRegisterMetaTypeStreamOperators>("QList"); + + qInstallMessageHandler(myMessageOutput); + + QDir qd; + qd.mkpath(IConfig::configLocation); + qd.mkpath(IConfig::dataLocation); + qd.mkpath(cfg->DirPlugins); + qd.mkpath(cfg->DirVideos); + qd.mkpath(cfg->DirTracks); + qd.mkpath(cfg->DirTrials); + qd.mkpath(cfg->DirScreenshots); + qd.mkpath(cfg->DirTemp); + + BioTracker3App bioTracker3(&app); + GuiContext context(&bioTracker3, cfg); + bioTracker3.setBioTrackerContext(&context); + bioTracker3.runBioTracker(); + + app.exec(); +} diff --git a/BioTracker/CoreApp/BioTracker/resources/arrow-back.png b/Src/resources/arrow-back.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/arrow-back.png rename to Src/resources/arrow-back.png diff --git a/BioTracker/CoreApp/BioTracker/resources/arrow-forward1.png b/Src/resources/arrow-forward1.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/arrow-forward1.png rename to Src/resources/arrow-forward1.png diff --git a/BioTracker/CoreApp/BioTracker/resources/arrows-skip-back.png b/Src/resources/arrows-skip-back.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/arrows-skip-back.png rename to Src/resources/arrows-skip-back.png diff --git a/BioTracker/CoreApp/BioTracker/resources/arrows-skip-forward.png b/Src/resources/arrows-skip-forward.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/arrows-skip-forward.png rename to Src/resources/arrows-skip-forward.png diff --git a/BioTracker/CoreApp/BioTracker/resources/fullscreen.png b/Src/resources/fullscreen.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/fullscreen.png rename to Src/resources/fullscreen.png diff --git a/BioTracker/CoreApp/BioTracker/resources/introduction/context_menus.txt b/Src/resources/introduction/context_menus.txt similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/introduction/context_menus.txt rename to Src/resources/introduction/context_menus.txt diff --git a/BioTracker/CoreApp/BioTracker/resources/introduction/images/BioTracker.PNG b/Src/resources/introduction/images/BioTracker.PNG similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/introduction/images/BioTracker.PNG rename to Src/resources/introduction/images/BioTracker.PNG diff --git a/BioTracker/CoreApp/BioTracker/resources/introduction/images/context_entity.png b/Src/resources/introduction/images/context_entity.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/introduction/images/context_entity.png rename to Src/resources/introduction/images/context_entity.png diff --git a/BioTracker/CoreApp/BioTracker/resources/introduction/images/context_video.png b/Src/resources/introduction/images/context_video.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/introduction/images/context_video.png rename to Src/resources/introduction/images/context_video.png diff --git a/BioTracker/CoreApp/BioTracker/resources/introduction/images/right_panel.png b/Src/resources/introduction/images/right_panel.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/introduction/images/right_panel.png rename to Src/resources/introduction/images/right_panel.png diff --git a/BioTracker/CoreApp/BioTracker/resources/introduction/images/toolbars.png b/Src/resources/introduction/images/toolbars.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/introduction/images/toolbars.png rename to Src/resources/introduction/images/toolbars.png diff --git a/BioTracker/CoreApp/BioTracker/resources/introduction/images/tracking.png b/Src/resources/introduction/images/tracking.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/introduction/images/tracking.png rename to Src/resources/introduction/images/tracking.png diff --git a/BioTracker/CoreApp/BioTracker/resources/introduction/intro.txt b/Src/resources/introduction/intro.txt similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/introduction/intro.txt rename to Src/resources/introduction/intro.txt diff --git a/BioTracker/CoreApp/BioTracker/resources/introduction/right_panel.txt b/Src/resources/introduction/right_panel.txt similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/introduction/right_panel.txt rename to Src/resources/introduction/right_panel.txt diff --git a/BioTracker/CoreApp/BioTracker/resources/introduction/toolbars.txt b/Src/resources/introduction/toolbars.txt similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/introduction/toolbars.txt rename to Src/resources/introduction/toolbars.txt diff --git a/BioTracker/CoreApp/BioTracker/resources/introduction/tracking.txt b/Src/resources/introduction/tracking.txt similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/introduction/tracking.txt rename to Src/resources/introduction/tracking.txt diff --git a/BioTracker/CoreApp/BioTracker/resources/left_toolbar/add-track.png b/Src/resources/left_toolbar/add-track.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/left_toolbar/add-track.png rename to Src/resources/left_toolbar/add-track.png diff --git a/BioTracker/CoreApp/BioTracker/resources/left_toolbar/anno-arrow.png b/Src/resources/left_toolbar/anno-arrow.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/left_toolbar/anno-arrow.png rename to Src/resources/left_toolbar/anno-arrow.png diff --git a/BioTracker/CoreApp/BioTracker/resources/left_toolbar/anno-del.png b/Src/resources/left_toolbar/anno-del.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/left_toolbar/anno-del.png rename to Src/resources/left_toolbar/anno-del.png diff --git a/BioTracker/CoreApp/BioTracker/resources/left_toolbar/anno-ellipse.png b/Src/resources/left_toolbar/anno-ellipse.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/left_toolbar/anno-ellipse.png rename to Src/resources/left_toolbar/anno-ellipse.png diff --git a/BioTracker/CoreApp/BioTracker/resources/left_toolbar/anno-label.png b/Src/resources/left_toolbar/anno-label.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/left_toolbar/anno-label.png rename to Src/resources/left_toolbar/anno-label.png diff --git a/BioTracker/CoreApp/BioTracker/resources/left_toolbar/anno-rect.png b/Src/resources/left_toolbar/anno-rect.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/left_toolbar/anno-rect.png rename to Src/resources/left_toolbar/anno-rect.png diff --git a/BioTracker/CoreApp/BioTracker/resources/left_toolbar/color-border.png b/Src/resources/left_toolbar/color-border.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/left_toolbar/color-border.png rename to Src/resources/left_toolbar/color-border.png diff --git a/BioTracker/CoreApp/BioTracker/resources/left_toolbar/color-fill.png b/Src/resources/left_toolbar/color-fill.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/left_toolbar/color-fill.png rename to Src/resources/left_toolbar/color-fill.png diff --git a/BioTracker/CoreApp/BioTracker/resources/left_toolbar/delete-track.png b/Src/resources/left_toolbar/delete-track.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/left_toolbar/delete-track.png rename to Src/resources/left_toolbar/delete-track.png diff --git a/BioTracker/CoreApp/BioTracker/resources/left_toolbar/select-all.png b/Src/resources/left_toolbar/select-all.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/left_toolbar/select-all.png rename to Src/resources/left_toolbar/select-all.png diff --git a/BioTracker/CoreApp/BioTracker/resources/left_toolbar/swap.png b/Src/resources/left_toolbar/swap.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/left_toolbar/swap.png rename to Src/resources/left_toolbar/swap.png diff --git a/BioTracker/CoreApp/BioTracker/resources/logo/BT-3_non_transparent_rounded.ico b/Src/resources/logo/BT-3_non_transparent_rounded.ico similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/logo/BT-3_non_transparent_rounded.ico rename to Src/resources/logo/BT-3_non_transparent_rounded.ico diff --git a/BioTracker/CoreApp/BioTracker/resources/logo/BT-3_non_transparent_rounded.png b/Src/resources/logo/BT-3_non_transparent_rounded.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/logo/BT-3_non_transparent_rounded.png rename to Src/resources/logo/BT-3_non_transparent_rounded.png diff --git a/BioTracker/CoreApp/BioTracker/resources/logo/BT3-big.ico b/Src/resources/logo/BT3-big.ico similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/logo/BT3-big.ico rename to Src/resources/logo/BT3-big.ico diff --git a/BioTracker/CoreApp/BioTracker/resources/logo/BT3-big.png b/Src/resources/logo/BT3-big.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/logo/BT3-big.png rename to Src/resources/logo/BT3-big.png diff --git a/BioTracker/CoreApp/BioTracker/resources/logo/BT3-big_non_transparent.ico b/Src/resources/logo/BT3-big_non_transparent.ico similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/logo/BT3-big_non_transparent.ico rename to Src/resources/logo/BT3-big_non_transparent.ico diff --git a/BioTracker/CoreApp/BioTracker/resources/logo/BT3-big_non_transparent.png b/Src/resources/logo/BT3-big_non_transparent.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/logo/BT3-big_non_transparent.png rename to Src/resources/logo/BT3-big_non_transparent.png diff --git a/BioTracker/CoreApp/BioTracker/resources/logo/BT3-small.png b/Src/resources/logo/BT3-small.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/logo/BT3-small.png rename to Src/resources/logo/BT3-small.png diff --git a/BioTracker/CoreApp/BioTracker/resources/logo/firstlogo.ico b/Src/resources/logo/firstlogo.ico similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/logo/firstlogo.ico rename to Src/resources/logo/firstlogo.ico diff --git a/BioTracker/CoreApp/BioTracker/resources/logo/firstlogo.png b/Src/resources/logo/firstlogo.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/logo/firstlogo.png rename to Src/resources/logo/firstlogo.png diff --git a/BioTracker/CoreApp/BioTracker/resources/panZoom.png b/Src/resources/panZoom.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/panZoom.png rename to Src/resources/panZoom.png diff --git a/BioTracker/CoreApp/BioTracker/resources/pause-sign.png b/Src/resources/pause-sign.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/pause-sign.png rename to Src/resources/pause-sign.png diff --git a/BioTracker/CoreApp/BioTracker/resources/record.png b/Src/resources/record.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/record.png rename to Src/resources/record.png diff --git a/BioTracker/CoreApp/BioTracker/resources/recordCam.png b/Src/resources/recordCam.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/recordCam.png rename to Src/resources/recordCam.png diff --git a/BioTracker/CoreApp/BioTracker/resources/recording.png b/Src/resources/recording.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/recording.png rename to Src/resources/recording.png diff --git a/BioTracker/CoreApp/BioTracker/resources/recordingCam.png b/Src/resources/recordingCam.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/recordingCam.png rename to Src/resources/recordingCam.png diff --git a/BioTracker/CoreApp/BioTracker/resources/screenshot.png b/Src/resources/screenshot.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/screenshot.png rename to Src/resources/screenshot.png diff --git a/BioTracker/CoreApp/BioTracker/resources/shortcuts.txt b/Src/resources/shortcuts.txt similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/shortcuts.txt rename to Src/resources/shortcuts.txt diff --git a/BioTracker/CoreApp/BioTracker/resources/stop.png b/Src/resources/stop.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/stop.png rename to Src/resources/stop.png diff --git a/BioTracker/CoreApp/BioTracker/resources/upper_toolbar/download.png b/Src/resources/upper_toolbar/download.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/upper_toolbar/download.png rename to Src/resources/upper_toolbar/download.png diff --git a/BioTracker/CoreApp/BioTracker/resources/upper_toolbar/file-picture.png b/Src/resources/upper_toolbar/file-picture.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/upper_toolbar/file-picture.png rename to Src/resources/upper_toolbar/file-picture.png diff --git a/BioTracker/CoreApp/BioTracker/resources/upper_toolbar/file-play.png b/Src/resources/upper_toolbar/file-play.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/upper_toolbar/file-play.png rename to Src/resources/upper_toolbar/file-play.png diff --git a/BioTracker/CoreApp/BioTracker/resources/upper_toolbar/icons8-video-camera-26.png b/Src/resources/upper_toolbar/icons8-video-camera-26.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/upper_toolbar/icons8-video-camera-26.png rename to Src/resources/upper_toolbar/icons8-video-camera-26.png diff --git a/BioTracker/CoreApp/BioTracker/resources/upper_toolbar/redo2.png b/Src/resources/upper_toolbar/redo2.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/upper_toolbar/redo2.png rename to Src/resources/upper_toolbar/redo2.png diff --git a/BioTracker/CoreApp/BioTracker/resources/upper_toolbar/save.png b/Src/resources/upper_toolbar/save.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/upper_toolbar/save.png rename to Src/resources/upper_toolbar/save.png diff --git a/BioTracker/CoreApp/BioTracker/resources/upper_toolbar/tracker.png b/Src/resources/upper_toolbar/tracker.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/upper_toolbar/tracker.png rename to Src/resources/upper_toolbar/tracker.png diff --git a/BioTracker/CoreApp/BioTracker/resources/upper_toolbar/tracker2.png b/Src/resources/upper_toolbar/tracker2.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/upper_toolbar/tracker2.png rename to Src/resources/upper_toolbar/tracker2.png diff --git a/BioTracker/CoreApp/BioTracker/resources/upper_toolbar/tracker3.png b/Src/resources/upper_toolbar/tracker3.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/upper_toolbar/tracker3.png rename to Src/resources/upper_toolbar/tracker3.png diff --git a/BioTracker/CoreApp/BioTracker/resources/upper_toolbar/tracker4.png b/Src/resources/upper_toolbar/tracker4.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/upper_toolbar/tracker4.png rename to Src/resources/upper_toolbar/tracker4.png diff --git a/BioTracker/CoreApp/BioTracker/resources/upper_toolbar/tracker5.png b/Src/resources/upper_toolbar/tracker5.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/upper_toolbar/tracker5.png rename to Src/resources/upper_toolbar/tracker5.png diff --git a/BioTracker/CoreApp/BioTracker/resources/upper_toolbar/undo2.png b/Src/resources/upper_toolbar/undo2.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/upper_toolbar/undo2.png rename to Src/resources/upper_toolbar/undo2.png diff --git a/BioTracker/CoreApp/BioTracker/resources/upper_toolbar/upload.png b/Src/resources/upper_toolbar/upload.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/upper_toolbar/upload.png rename to Src/resources/upper_toolbar/upload.png diff --git a/BioTracker/CoreApp/BioTracker/resources/upper_toolbar/video-camera.png b/Src/resources/upper_toolbar/video-camera.png similarity index 100% rename from BioTracker/CoreApp/BioTracker/resources/upper_toolbar/video-camera.png rename to Src/resources/upper_toolbar/video-camera.png diff --git a/BioTracker/CoreApp/BioTracker/util/CLIcommands.cpp b/Src/util/CLIcommands.cpp similarity index 100% rename from BioTracker/CoreApp/BioTracker/util/CLIcommands.cpp rename to Src/util/CLIcommands.cpp diff --git a/BioTracker/CoreApp/BioTracker/util/CLIcommands.h b/Src/util/CLIcommands.h similarity index 77% rename from BioTracker/CoreApp/BioTracker/util/CLIcommands.h rename to Src/util/CLIcommands.h index b2c0433c..f47154c0 100644 --- a/BioTracker/CoreApp/BioTracker/util/CLIcommands.h +++ b/Src/util/CLIcommands.h @@ -14,16 +14,13 @@ #include #include -#include "settings/Settings.h" #include "util/types.h" +#include "util/Config.h" class CLI { public: - static void optionParser(int ac, char* av[]) + static int optionParser(int ac, char* av[], Config* cfg) { - - BioTracker::Core::Settings *set = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); - //Taken from http://www.boost.org/doc/libs/1_64_0/libs/program_options/example/option_groups.cpp using namespace boost; using namespace boost::program_options; @@ -34,6 +31,7 @@ class CLI { ("help", "Produce this help message") ("usePlugin", value(), "Uses plugin from given filepath") ("video", value(), "Loads a video from given filepath") + ("cfg", value(), "Provide custom path to a config file") ; options_description gui("GUI options"); @@ -64,14 +62,13 @@ class CLI { exit(0); } if (vm.count("usePlugin")) { - const std::string& s = vm["usePlugin"].as(); - std::string *usePlugins = new std::string(s); - set->storeValue("usePlugins", (void*)usePlugins); + cfg->UsePlugins = QString(vm["usePlugin"].as().c_str()); } if (vm.count("video")) { - const std::string& s = vm["video"].as(); - std::string *video = new std::string(s); - set->storeValue("video", (void*)video); + cfg->LoadVideo = QString(vm["video"].as().c_str()); + } + if (vm.count("cfg")) { + cfg->CfgCustomLocation = QString(vm["cfg"].as().c_str()); } } catch (std::exception& e) { diff --git a/Src/util/Config.cpp b/Src/util/Config.cpp new file mode 100644 index 00000000..8076e959 --- /dev/null +++ b/Src/util/Config.cpp @@ -0,0 +1,133 @@ +#include "Config.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +const QString Config::DefaultArena = "10,10;10,100;100,100;100,10"; + +template +Stream &operator>>(Stream& s, QString& q) +{ + std::string tmp; + s >> tmp; + q = tmp.data(); + return s; +} + +template +Stream &operator<<(Stream& s, QString const& q) +{ + return s << q.toStdString(); +} + + + +void workMap(boost::property_tree::basic_ptree *tree, + std::string rep, + std::map *mp){ + + auto bakCM = *mp; + mp->clear(); + + for (auto kv : *tree) { + if (boost::starts_with(kv.first, rep)){ + for (auto xx : kv.second) { + std::string snd = tree->get(rep+"."+xx.first); + std::string fst = xx.first; + (*mp)[fst]=snd; + } + } + } + + if (mp->empty()) + *mp = bakCM; +} + +void Config::load(QString dir, QString file) +{ + using namespace boost::property_tree; + + auto tree = ptree{}; + QDir d(dir); + d.mkpath(dir); + QFile fin(dir + "/" + file); + + if(!fin.exists()) + { + fin.open(QIODevice::ReadWrite); + fin.close(); + } + + read_ini((dir + "/" + file).toStdString(), tree); + + Config* config = this; + + std::string globalPrefix = "General."; + config->DisableWizard = tree.get(globalPrefix+"DisableWizard",config->DisableWizard); + config->FrameStride = tree.get(globalPrefix+"FrameStride",config->FrameStride); + config->RectificationHeight = tree.get(globalPrefix+"RectificationHeight",config->RectificationHeight); + config->RectificationWidth = tree.get(globalPrefix+"RectificationWidth",config->RectificationWidth); + config->AppertureType = tree.get(globalPrefix+"AppertureType",config->AppertureType); + config->CsvSeperator = tree.get(globalPrefix+"CsvSeperator",config->CsvSeperator); + config->CoreConfigFile = tree.get(globalPrefix+"CoreConfigFile",config->CoreConfigFile); + config->VideoCodecUsed = tree.get(globalPrefix+"VideoCodecUsed",config->VideoCodecUsed); + config->DropFrames = tree.get(globalPrefix+"DropFrames",config->DropFrames); + config->RecordScaledOutput = tree.get(globalPrefix+"RecordScaledOutput",config->RecordScaledOutput); + config->DataExporter = tree.get(globalPrefix+"DataExporter",config->DataExporter); + config->RecordFPS = tree.get(globalPrefix+"RecordFPS",config->RecordFPS); + config->CameraWidth = tree.get(globalPrefix+"CameraWidth",config->CameraWidth); + config->CameraHeight = tree.get(globalPrefix+"CameraHeight",config->CameraHeight); + config->GpuQp = tree.get(globalPrefix+"GpuQp",config->GpuQp); + config->DefaultLocationManualSave = tree.get(globalPrefix+"DefaultLocationManualSave",config->DefaultLocationManualSave); + config->DirPlugins = tree.get(globalPrefix+"DirPlugins",config->DirPlugins); + config->DirVideos = tree.get(globalPrefix+"DirVideos",config->DirVideos); + config->DirTracks = tree.get(globalPrefix+"DirTracks",config->DirTracks); + config->DirTrials = tree.get(globalPrefix+"DirTrials",config->DirTrials); + config->DirScreenshots = tree.get(globalPrefix+"DirScreenshots",config->DirScreenshots); + config->DirTemp = tree.get(globalPrefix+"DirTemp",config->DirTemp); + config->AreaDefinitions = tree.get(globalPrefix+"AreaDefinitions",config->AreaDefinitions); + config->UseRegistryLocations = tree.get(globalPrefix+"UseRegistryLocations",config->UseRegistryLocations); +} + +void Config::save(QString dir, QString file) +{ + using namespace boost::property_tree; + + auto tree = ptree{}; + Config *config = this; + + std::string globalPrefix = "General."; + tree.put(globalPrefix+"DisableWizard", config->DisableWizard); + tree.put(globalPrefix+"FrameStride", config->FrameStride); + tree.put(globalPrefix+"RectificationHeight", config->RectificationHeight); + tree.put(globalPrefix+"RectificationWidth", config->RectificationWidth); + tree.put(globalPrefix+"AppertureType", config->AppertureType); + tree.put(globalPrefix+"CsvSeperator", config->CsvSeperator); + tree.put(globalPrefix+"CoreConfigFile", config->CoreConfigFile); + tree.put(globalPrefix+"VideoCodecUsed", config->VideoCodecUsed); + tree.put(globalPrefix+"DropFrames", config->DropFrames); + tree.put(globalPrefix+"RecordScaledOutput", config->RecordScaledOutput); + tree.put(globalPrefix+"DataExporter", config->DataExporter); + tree.put(globalPrefix+"RecordFPS", config->RecordFPS); + tree.put(globalPrefix+"CameraWidth", config->CameraWidth); + tree.put(globalPrefix+"CameraHeight", config->CameraHeight); + tree.put(globalPrefix+"GpuQp", config->GpuQp); + tree.put(globalPrefix+"DefaultLocationManualSave", config->DefaultLocationManualSave); + tree.put(globalPrefix+"DirPlugins", config->DirPlugins); + tree.put(globalPrefix+"DirVideos", config->DirVideos); + tree.put(globalPrefix+"DirTracks", config->DirTracks); + tree.put(globalPrefix+"DirTrials", config->DirTrials); + tree.put(globalPrefix+"DirScreenshots", config->DirScreenshots); + tree.put(globalPrefix+"DirTemp", config->DirTemp); + tree.put(globalPrefix+"AreaDefinitions", config->AreaDefinitions); + tree.put(globalPrefix+"UseRegistryLocations", config->UseRegistryLocations); + + write_ini((dir + "/" + file).toStdString(), tree); +} diff --git a/Src/util/Config.h b/Src/util/Config.h new file mode 100644 index 00000000..4765f076 --- /dev/null +++ b/Src/util/Config.h @@ -0,0 +1,45 @@ +#pragma once + +#include "IConfig.h" +#include +#include + +class Config : public IConfig +{ +public: + + int DisableWizard = 0; + int FrameStride = 1; + double RectificationHeight = 100; + double RectificationWidth = 100; + int AppertureType = 0; + QString CsvSeperator = ";"; + QString CoreConfigFile = "BiotrackerCore.ini"; + int VideoCodecUsed = 0; + int DropFrames = 0; + int RecordScaledOutput = 0; + int DataExporter = 0; + int RecordFPS = -1; + int CameraWidth = -1; + int CameraHeight = -1; + double GpuQp = 20; + int UseRegistryLocations = true; + QString DefaultLocationManualSave = ""; + QString DirPlugins = IConfig::dataLocation + "/Plugins/"; + QString DirVideos = IConfig::dataLocation + "/Videos/"; + QString DirTracks = IConfig::dataLocation + "/Tracks/"; + QString DirTrials = IConfig::dataLocation + "/Tracks/Trials/"; + QString DirScreenshots = IConfig::dataLocation + "/Screenshots/"; + QString DirTemp = IConfig::dataLocation + "/temp/"; + QString AreaDefinitions = IConfig::configLocation + "/areas.csv"; + + // Temporary CLI configuration + QString LoadVideo = ""; + QString UsePlugins = ""; + QString CfgCustomLocation = ""; + + void load(QString dir, QString file = "config.ini") override; + void save(QString dir, QString file) override; + + static const QString DefaultArena; +}; diff --git a/BioTracker/CoreApp/BioTracker/util/Exceptions.h b/Src/util/Exceptions.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/util/Exceptions.h rename to Src/util/Exceptions.h diff --git a/BioTracker/Utils/BioTrackerUtils/settings/Messages.h b/Src/util/Messages.h similarity index 100% rename from BioTracker/Utils/BioTrackerUtils/settings/Messages.h rename to Src/util/Messages.h diff --git a/BioTracker/CoreApp/BioTracker/util/PanZoomState.h b/Src/util/PanZoomState.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/util/PanZoomState.h rename to Src/util/PanZoomState.h diff --git a/BioTracker/CoreApp/BioTracker/util/ParamNames.h b/Src/util/ParamNames.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/util/ParamNames.h rename to Src/util/ParamNames.h diff --git a/BioTracker/CoreApp/BioTracker/util/ScreenHelper.h b/Src/util/ScreenHelper.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/util/ScreenHelper.h rename to Src/util/ScreenHelper.h diff --git a/BioTracker/CoreApp/BioTracker/util/VideoCoder.cpp b/Src/util/VideoCoder.cpp similarity index 88% rename from BioTracker/CoreApp/BioTracker/util/VideoCoder.cpp rename to Src/util/VideoCoder.cpp index 29caf9d8..cb4f4ded 100644 --- a/BioTracker/CoreApp/BioTracker/util/VideoCoder.cpp +++ b/Src/util/VideoCoder.cpp @@ -7,6 +7,8 @@ #include #endif +using namespace BioTrackerUtilsMisc; //getTimeAndDate + #define mySleep(x) std::this_thread::sleep_for(std::chrono::milliseconds(x)); void MutexLinkedList::push(std::shared_ptr imbuffer, bool dropFrames) { @@ -163,10 +165,10 @@ void Worker::run() { int VideoCoder::toggle(int w, int h, double fps) { //Grab the codec from config file - BioTracker::Core::Settings *set = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); - std::string codecStr = codecList[set->getValueOrDefault(CFG_CODEC, 0)].second; - m_dropFrames = set->getValueOrDefault(CFG_DROPFRAMES, CFG_DROPFRAMES_VAL); - m_qp = set->getValueOrDefault(CFG_GPU_QP, CFG_GPU_QP_VAL); + std::string codecStr = codecList[_cfg->VideoCodecUsed].second; + std::string videoDir = _cfg->DirVideos.toStdString(); + m_dropFrames = _cfg->DropFrames; + m_qp = _cfg->GpuQp; if (fps == -1) { fps = m_fps; } @@ -179,7 +181,7 @@ int VideoCoder::toggle(int w, int h, double fps) { //Check which one to use if (codecStr == "X264") { int codec = CV_FOURCC('X', 'V', 'I', 'D'); - vWriter = std::make_shared(getTimeAndDate(std::string(CFG_DIR_VIDEOS)+"CameraCapture", ".avi"), codec, fps, CvSize(w, h), 1); + vWriter = std::make_shared(getTimeAndDate(videoDir+"CameraCapture", ".avi"), codec, fps, CvSize(w, h), 1); m_recording = vWriter->isOpened(); vWriter->set(cv::VIDEOWRITER_PROP_QUALITY, 100); std::cout << "Video is open:" << m_recording << std::endl; diff --git a/BioTracker/CoreApp/BioTracker/util/VideoCoder.h b/Src/util/VideoCoder.h similarity index 89% rename from BioTracker/CoreApp/BioTracker/util/VideoCoder.h rename to Src/util/VideoCoder.h index 979f577d..9aa4cccb 100644 --- a/BioTracker/CoreApp/BioTracker/util/VideoCoder.h +++ b/Src/util/VideoCoder.h @@ -5,14 +5,16 @@ #include #include +#include +#include #include "util/misc.h" #ifdef WITH_CUDA #include "EncoderInterface.h" #endif -#include "settings/Settings.h" #include "util/types.h" +#include "util/Config.h" #define MAXIMUMQUEUE 30 @@ -105,7 +107,7 @@ class VideoCoder : public QObject Q_OBJECT public: - VideoCoder(double fps) { + VideoCoder(double fps, Config *cfg) { #ifdef WITH_CUDA m_nvEncoder = std::make_shared(); #endif @@ -113,11 +115,9 @@ class VideoCoder : public QObject m_recording = false; m_dropFrames = false; m_fps = fps; + _cfg = cfg; } - VideoCoder() : VideoCoder(1) { - } - ~VideoCoder() { stop(); } @@ -141,6 +141,7 @@ class VideoCoder : public QObject bool m_dropFrames; int m_qp; double m_fps; + Config *_cfg; signals: void operate(const QString &); }; diff --git a/BioTracker/CoreApp/BioTracker/util/stdext.h b/Src/util/stdext.h similarity index 100% rename from BioTracker/CoreApp/BioTracker/util/stdext.h rename to Src/util/stdext.h diff --git a/Src/util/types.h b/Src/util/types.h new file mode 100644 index 00000000..872a452e --- /dev/null +++ b/Src/util/types.h @@ -0,0 +1,63 @@ +#pragma once + + +#include +#include + +namespace BiotrackerTypes{ + enum AreaType { + NONE = -1, + RECT = 0, + APPERTURE = 1, + COMBINED = 2 + }; + +} + +namespace AREADESCRIPTOR +{ + const std::string CN_ARENA = "TRACKERPARAM/CN_CORNERS_ARENA"; + const std::string CN_APPERTURE = "TRACKERPARAM/CN_CORNERS_APPERTURE"; + const std::string CN_APPERTURE_TYPE = "TRACKERPARAM/CN_CORNERS_APPERTURE_TYPE"; + const std::string DISP_AREA = "TRACKERPARAM/DISPLAY_TRACKING_AREA"; + const std::string DISP_RECT = "TRACKERPARAM/DISPLAY_RECTIFICATION_AREA"; + const std::string RECT_W = "RECTIFICATION/WIDTH"; + const int RECT_W_DEFAULT = 100; + const std::string RECT_H = "RECTIFICATION/HEIGHT"; + const int RECT_H_DEFAULT = 100; +} + + +const std::vector> codecList = { + std::pair("X264 (CPU)", "X264"), +#ifdef WITH_CUDA + std::pair("X264 (GPU)", "X264GPU") +#endif +}; + +const std::vector exporterList = { + std::string("CSV"), + std::string("Serialize"), + std::string("Json") +}; + +class CameraConfiguration +{ +public: + CameraConfiguration() : + _id(0), _width(-1), _height(-1), _fps(30), _recordInput(false), _fourcc("X264") { + } + CameraConfiguration(int p_id, int p_width, int p_height, double p_fps, bool p_recordInput, std::string p_fourcc) : + _id(p_id), _width(p_width), _height(p_height), _fps(p_fps), _recordInput(p_recordInput), _fourcc(p_fourcc) { + } + + int _id; + int _width; + int _height; + bool _recordInput; + double _fps; + std::string _fourcc; +}; + + + From a4c2f8da825a8d3534e8205645a3513391901584 Mon Sep 17 00:00:00 2001 From: Hauke Moenck Date: Wed, 31 Oct 2018 18:39:26 +0100 Subject: [PATCH 044/171] Adapted new "Utility" prefix. --- Src/Model/AreaDescriptor/AreaInfo.cpp | 2 +- Src/Model/AreaDescriptor/AreaMemory.cpp | 2 +- Src/Model/AreaDescriptor/Rectification.cpp | 2 +- Src/Model/DataExporters/DataExporterCSV.cpp | 2 +- Src/Model/DataExporters/DataExporterGeneric.cpp | 2 +- Src/Model/DataExporters/DataExporterJson.cpp | 2 +- Src/Model/DataExporters/DataExporterSerialize.cpp | 2 +- Src/Model/ImageStream.cpp | 2 +- Src/Model/MediaPlayer.cpp | 2 +- Src/View/AreaDesciptor/EllipseDescriptor.cpp | 8 ++++---- Src/View/AreaDesciptor/RectDescriptor.cpp | 2 +- Src/util/Config.h | 2 +- Src/util/VideoCoder.h | 6 +++--- 13 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Src/Model/AreaDescriptor/AreaInfo.cpp b/Src/Model/AreaDescriptor/AreaInfo.cpp index 083b6a26..93951475 100644 --- a/Src/Model/AreaDescriptor/AreaInfo.cpp +++ b/Src/Model/AreaDescriptor/AreaInfo.cpp @@ -2,7 +2,7 @@ #include "Rectification.h" -#include "util/misc.h" +#include "Utility/misc.h" #include #include "AreaMemory.h" diff --git a/Src/Model/AreaDescriptor/AreaMemory.cpp b/Src/Model/AreaDescriptor/AreaMemory.cpp index 95cb0ee6..6efe106b 100644 --- a/Src/Model/AreaDescriptor/AreaMemory.cpp +++ b/Src/Model/AreaDescriptor/AreaMemory.cpp @@ -1,6 +1,6 @@ #include "AreaMemory.h" -#include "util/misc.h" +#include "Utility/misc.h" #include #include diff --git a/Src/Model/AreaDescriptor/Rectification.cpp b/Src/Model/AreaDescriptor/Rectification.cpp index c589068f..f4541402 100644 --- a/Src/Model/AreaDescriptor/Rectification.cpp +++ b/Src/Model/AreaDescriptor/Rectification.cpp @@ -3,7 +3,7 @@ #include #include -#include "util/misc.h" +#include "Utility/misc.h" #include "util/types.h" #include "util/Config.h" diff --git a/Src/Model/DataExporters/DataExporterCSV.cpp b/Src/Model/DataExporters/DataExporterCSV.cpp index fcbd7325..11036757 100644 --- a/Src/Model/DataExporters/DataExporterCSV.cpp +++ b/Src/Model/DataExporters/DataExporterCSV.cpp @@ -1,6 +1,6 @@ #include "DataExporterCSV.h" #include "util/types.h" -#include "util/misc.h" +#include "Utility/misc.h" #include #include #include diff --git a/Src/Model/DataExporters/DataExporterGeneric.cpp b/Src/Model/DataExporters/DataExporterGeneric.cpp index 76a4ca0d..950b659a 100644 --- a/Src/Model/DataExporters/DataExporterGeneric.cpp +++ b/Src/Model/DataExporters/DataExporterGeneric.cpp @@ -1,6 +1,6 @@ #include "DataExporterGeneric.h" #include "util/types.h" -#include "util/misc.h" +#include "Utility/misc.h" #include #include #include diff --git a/Src/Model/DataExporters/DataExporterJson.cpp b/Src/Model/DataExporters/DataExporterJson.cpp index 42e836b5..da0d2e99 100644 --- a/Src/Model/DataExporters/DataExporterJson.cpp +++ b/Src/Model/DataExporters/DataExporterJson.cpp @@ -1,6 +1,6 @@ #include "DataExporterJson.h" #include "util/types.h" -#include "util/misc.h" +#include "Utility/misc.h" #include #include diff --git a/Src/Model/DataExporters/DataExporterSerialize.cpp b/Src/Model/DataExporters/DataExporterSerialize.cpp index 24c09976..a6742207 100644 --- a/Src/Model/DataExporters/DataExporterSerialize.cpp +++ b/Src/Model/DataExporters/DataExporterSerialize.cpp @@ -1,6 +1,6 @@ #include "DataExporterSerialize.h" #include "util/types.h" -#include "util/misc.h" +#include "Utility/misc.h" #include #include diff --git a/Src/Model/ImageStream.cpp b/Src/Model/ImageStream.cpp index d7d05854..d48be68b 100644 --- a/Src/Model/ImageStream.cpp +++ b/Src/Model/ImageStream.cpp @@ -8,7 +8,7 @@ #include "util/Exceptions.h" #include "QSharedPointer" -#include "util/misc.h" +#include "Utility/misc.h" #include "View/CameraDevice.h" #include "util/VideoCoder.h" diff --git a/Src/Model/MediaPlayer.cpp b/Src/Model/MediaPlayer.cpp index 47bf0632..e2e7e034 100644 --- a/Src/Model/MediaPlayer.cpp +++ b/Src/Model/MediaPlayer.cpp @@ -1,5 +1,5 @@ #include "MediaPlayer.h" -#include "util/misc.h" +#include "Utility/misc.h" //Settings related diff --git a/Src/View/AreaDesciptor/EllipseDescriptor.cpp b/Src/View/AreaDesciptor/EllipseDescriptor.cpp index 7540be26..9ce177bf 100644 --- a/Src/View/AreaDesciptor/EllipseDescriptor.cpp +++ b/Src/View/AreaDesciptor/EllipseDescriptor.cpp @@ -1,6 +1,6 @@ #include "EllipseDescriptor.h" #include "Model/AreaDescriptor/AreaInfoElement.h" -#include "util/misc.h" +#include "Utility/misc.h" #include "QBrush" #include "QPainter" @@ -102,9 +102,9 @@ void EllipseDescriptor::paint(QPainter *painter, const QStyleOptionGraphicsItem init(); //TODO remove hardcoding and code duplication - if (_dragVectorId >= 0) { - QColor transparentGray = Qt::gray; - transparentGray.setAlphaF(0.75); + if (_dragVectorId >= 0) { + QColor transparentGray = Qt::gray; + transparentGray.setAlphaF(0.75); painter->setPen(QPen(transparentGray, 1, Qt::SolidLine)); painter->drawRect(_drag.x(), _drag.y(), 10, 10); diff --git a/Src/View/AreaDesciptor/RectDescriptor.cpp b/Src/View/AreaDesciptor/RectDescriptor.cpp index 555b59d6..06501cc5 100644 --- a/Src/View/AreaDesciptor/RectDescriptor.cpp +++ b/Src/View/AreaDesciptor/RectDescriptor.cpp @@ -4,7 +4,7 @@ #include "QPainter" #include -#include "util/misc.h" +#include "Utility/misc.h" #include "Model/AreaDescriptor/AreaInfoElement.h" #include "Model/AreaDescriptor/AreaInfo.h" #include diff --git a/Src/util/Config.h b/Src/util/Config.h index 4765f076..bcdd3be0 100644 --- a/Src/util/Config.h +++ b/Src/util/Config.h @@ -1,6 +1,6 @@ #pragma once -#include "IConfig.h" +#include "Utility/IConfig.h" #include #include diff --git a/Src/util/VideoCoder.h b/Src/util/VideoCoder.h index 9aa4cccb..1084c4f8 100644 --- a/Src/util/VideoCoder.h +++ b/Src/util/VideoCoder.h @@ -8,13 +8,13 @@ #include #include -#include "util/misc.h" +#include "Utility/misc.h" #ifdef WITH_CUDA #include "EncoderInterface.h" #endif -#include "util/types.h" -#include "util/Config.h" +#include "types.h" +#include "Config.h" #define MAXIMUMQUEUE 30 From 7faf208770e3091a07702212155049d71139812c Mon Sep 17 00:00:00 2001 From: David Dormagen Date: Tue, 6 Nov 2018 14:25:03 +0100 Subject: [PATCH 045/171] enable building as part of a superproject --- CMakeLists.txt | 6 ++++-- Src/CMakeLists.txt | 7 +++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 03e71982..159b0cac 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,8 +21,10 @@ set(CMAKE_AUTORCC ON) set(HMNVLibDir "Not Found" CACHE FILEPATH "") -find_package(BT_Utility 0.1.1 REQUIRED) -find_package(RF_behavior_loader 0.1.1 REQUIRED) +if( CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR ) + find_package(BT_Utility 0.1.1 REQUIRED) + find_package(RF_behavior_loader 0.1.1 REQUIRED) +endif() add_subdirectory(Src) diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index e269b2e8..02129a3f 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -3,8 +3,11 @@ ############################################################## list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/cmake) - -include(BT_Utility/VSSugar) +if( CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR ) + include(BT_Utility/VSSugar) +else() + include(${BT_Utility_SOURCE_DIR}/cmake/VSSugar.cmake) +endif() VSSourceGroups(${CMAKE_CURRENT_LIST_DIR}) add_definitions(-DBIORACKER_GIT_HASH="${GIT_HASH}") From cdb8e1ec35bb10498d4bacf4dd539d2cadd2d57d Mon Sep 17 00:00:00 2001 From: David Dormagen Date: Tue, 6 Nov 2018 14:55:43 +0100 Subject: [PATCH 046/171] CMake: fix subproject check Using PROJECT_SOURCE_DIR instead of CMAKE_CURRENT_SOURCE_DIR makes sure that the check functions inside of the Src subfolder. --- CMakeLists.txt | 2 +- Src/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 159b0cac..a4c725fa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,7 +21,7 @@ set(CMAKE_AUTORCC ON) set(HMNVLibDir "Not Found" CACHE FILEPATH "") -if( CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR ) +if( CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR ) find_package(BT_Utility 0.1.1 REQUIRED) find_package(RF_behavior_loader 0.1.1 REQUIRED) endif() diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index 02129a3f..99fa4673 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -3,7 +3,7 @@ ############################################################## list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/cmake) -if( CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR ) +if( CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR ) include(BT_Utility/VSSugar) else() include(${BT_Utility_SOURCE_DIR}/cmake/VSSugar.cmake) From 6952a6904a14f526763bdd818107648d67a30af0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hauke=20J=C3=BCrgen=20M=C3=B6nck?= Date: Wed, 7 Nov 2018 13:04:50 +0100 Subject: [PATCH 047/171] Added build status badge --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4ab2352b..2945f9b8 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # README +[![Build Status](https://git.imp.fu-berlin.de/bioroboticslab/biotracker/biotracker/badges/master/build.svg)](https://git.imp.fu-berlin.de/bioroboticslab/biotracker/biotracker/pipelines) + ## Running Biotracker 3 from prebuild binaries: Binaries are distributed via Github: https://github.com/BioroboticsLab/biotracker_core/releases @@ -46,4 +48,4 @@ make ## Building Biotracker 3 (OSX) -Technically the Biotracker should build using the CMake toolchain and run on OSX. This is not officially supported, though. \ No newline at end of file +Technically the Biotracker should build using the CMake toolchain and run on OSX. This is not officially supported, though. From bca63430f23c241ab367cd9a8e223ec79c2bcaa6 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Mon, 26 Nov 2018 15:06:53 +0100 Subject: [PATCH 048/171] Update CI/CD --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 078bff54..d5db36aa 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -62,7 +62,8 @@ build windows: - $wd = (Get-Item -Path '.').FullName - $env:CMAKE_PREFIX_PATH="$wd/dependencies;$env:VCPKG_INSTALL_DIR" - $env:PATH += ";$env:VCPKG_INSTALL_DIR/bin;$wd/dependencies/BT_Interfaces/bin/" - - C:/VsDevEnv.ps1 -arch=amd64 + - . /Library.ps1 + - VSDevEnv -arch=amd64 -vcvars_ver="14.15" script: - cmake -Bbuild "-H." -DCMAKE_BUILD_TYPE=Release -G Ninja -DCMAKE_PREFIX_PATH="$Env:VCPKG_INSTALL_DIR" -DCPACK_PACKAGE_DIRECTORY="$env:package_dir" -DPACKAGE_WINDOWS_MSI=ON -DINSTALL_SHARED_LIBRARIES='bt_interfaces;jpeg62;libpng16;tiff;flang;flangrti;libomp;zlib1;openblas;lzma;boost_system*;boost_program_options*;boost_filesystem*' -DINSTALL_OPENCV_COMPONENTS='calib3d;videoio;imgcodecs;imgproc;core;ffmpeg;features2d;flann' -DCMAKE_SUPPRESS_REGENERATION=ON -DCMAKE_SKIP_PACKAGE_ALL_DEPENDENCY=ON - ninja -C build From 101a1a182982b0bbcaa698779a11a02a3232651a Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Sun, 16 Dec 2018 16:16:16 +0100 Subject: [PATCH 049/171] behaviour -> behavior --- Src/Controller/ControllerPlugin.cpp | 2 +- Src/View/TrackedComponentView.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Src/Controller/ControllerPlugin.cpp b/Src/Controller/ControllerPlugin.cpp index ebd67e91..0a82aa6d 100644 --- a/Src/Controller/ControllerPlugin.cpp +++ b/Src/Controller/ControllerPlugin.cpp @@ -115,7 +115,7 @@ void ControllerPlugin::loadPluginsFromPluginSubfolder() { QStringList nameFilter; QFileInfoList fl = d.entryInfoList(nameFilter, QDir::Filter::Files); - //Grab list of behaviours from config & registry + //Grab list of behaviors from config & registry std::vector list = _cfg->UseRegistryLocations==true ? PluginLoader::queryRegistryBehaviors(REGISTRY_PATH) : std::vector(); //Search directories std::vector filesFromFolders = PluginLoader::searchDirectoriesForPlugins(list, TRACKER_SUFFIX); diff --git a/Src/View/TrackedComponentView.cpp b/Src/View/TrackedComponentView.cpp index 85cef70f..9454444f 100644 --- a/Src/View/TrackedComponentView.cpp +++ b/Src/View/TrackedComponentView.cpp @@ -90,7 +90,7 @@ QVariant TrackedComponentView::itemChange(GraphicsItemChange change, const QVari } void TrackedComponentView::mousePressEvent(QGraphicsSceneMouseEvent *event) { - // right clicking the view unselects all selected items so do this to avoid this behaviour + // right clicking the view unselects all selected items so do this to avoid this behavior if (event->button() != Qt::LeftButton) { event->accept(); return; From 2b2a9028133dd26426bb8904f5946ada73505299 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Sun, 16 Dec 2018 16:24:07 +0100 Subject: [PATCH 050/171] Update toolchaining & ci/cd --- .gitlab-ci.yml | 164 +++++++++++++++++++++++++-------------------- CMakeLists.txt | 2 +- Src/CMakeLists.txt | 2 +- 3 files changed, 92 insertions(+), 76 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d5db36aa..98772151 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,109 +1,106 @@ stages: - build - package - -.base ubuntu-18.04: &base_ubuntu_18_04 + - deploy + + +.ubuntu-18.04: tags: [ linux, docker ] - image: git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker:ubuntu-18.04 + image: git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker:devel-ubuntu18.04 -.base windows: &base_windows +.windows: tags: [ windows, docker ] - image: git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker:windows + image: git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker:devel-windows -build ubuntu-18.04: +.windows[cuda]: + tags: [ windows, docker ] + image: git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker:cuda-devel-windows + + +.gcc8: &gcc8 + CC: gcc-8 + CXX: g++-8 + +.msvc15.9: &msvc15_9 + VSDevEnv -arch=amd64 -vcvars_ver="14.16" + +.pylon5: &pylon5 + WITH_PYLON5: 1 + +.debug: &debug + CMAKE_BUILD_TYPE: Debug + +.release: &release + CMAKE_BUILD_TYPE: Release + + +.build ubuntu-18.04: + extends: .ubuntu-18.04 stage: build - <<: *base_ubuntu_18_04 - variables: - CC: gcc-8 - CXX: g++-8 artifacts: paths: - - dependencies + - vendor - build expire_in: 1 day - before_script: - - 'curl -o artifacts.zip --header "JOB-TOKEN: $CI_JOB_TOKEN" "https://git.imp.fu-berlin.de/api/v4/projects/3608/jobs/artifacts/master/download?job=package%20ubuntu-18.04"' - - 7z e artifacts.zip - - 'curl -o artifacts.zip --header "JOB-TOKEN: $CI_JOB_TOKEN" "https://git.imp.fu-berlin.de/api/v4/projects/3610/jobs/artifacts/master/download?job=package%20ubuntu-18.04"' - - 7z e artifacts.zip - - 'curl -o artifacts.zip --header "JOB-TOKEN: $CI_JOB_TOKEN" "https://git.imp.fu-berlin.de/api/v4/projects/3474/jobs/artifacts/master/download?job=package%20ubuntu-18.04"' - - 7z e artifacts.zip - - 7z e '*.tar.xz' -y; rm *.tar.xz; 7z x '*.tar'; rm *.tar - - mkdir dependencies - - name='BT_Interfaces'; mv $name-* dependencies/$name - - name='BT_Utility'; mv $name-* dependencies/$name - - name='RF_behavior_loader'; mv $name-* dependencies/$name - - export CMAKE_PREFIX_PATH="$(pwd)/dependencies" script: - - cmake -Bbuild -H. -DCMAKE_BUILD_TYPE=Release -G Ninja -DCMAKE_PREFIX_PATH="dependencies" + - cmake -Bbuild -H. -DCMAKE_BUILD_TYPE="$CMAKE_BUILD_TYPE" -G Ninja -DCMAKE_SUPPRESS_REGENERATION=ON -DCMAKE_SKIP_PACKAGE_ALL_DEPENDENCY=ON - ninja -C build -build windows: +.build windows: + extends: .windows stage: build - <<: *base_windows artifacts: paths: + - vendor - build - - dependencies expire_in: 1 day - before_script: - - 'curl.exe -o artifacts.zip --header "JOB-TOKEN: $CI_JOB_TOKEN" "https://git.imp.fu-berlin.de/api/v4/projects/3608/jobs/artifacts/master/download?job=package%20windows"' - - 7z e artifacts.zip - - 'curl.exe -o artifacts.zip --header "JOB-TOKEN: $CI_JOB_TOKEN" "https://git.imp.fu-berlin.de/api/v4/projects/3610/jobs/artifacts/master/download?job=package%20windows"' - - 7z e artifacts.zip - - 'curl.exe -o artifacts.zip --header "JOB-TOKEN: $CI_JOB_TOKEN" "https://git.imp.fu-berlin.de/api/v4/projects/3474/jobs/artifacts/master/download?job=package%20windows"' - - 7z e artifacts.zip - - 7z e *.tar.xz; Remove-Item -Force *.tar.xz; 7z x *.tar; Remove-Item -Force *.tar - - New-Item -ItemType Directory -Force 'dependencies' - - $name='BT_Interfaces'; Move-Item -Force "$name-*" dependencies/$name - - $name='BT_Utility'; Move-Item -Force "$name-*" dependencies/$name - - $name='RF_behavior_loader'; Move-Item -Force "$name-*" dependencies/$name - - $env:PACKAGE_DIR = ("$env:TMP/pkg" -Replace "\\","/") - - $wd = (Get-Item -Path '.').FullName - - $env:CMAKE_PREFIX_PATH="$wd/dependencies;$env:VCPKG_INSTALL_DIR" - - $env:PATH += ";$env:VCPKG_INSTALL_DIR/bin;$wd/dependencies/BT_Interfaces/bin/" - - . /Library.ps1 - - VSDevEnv -arch=amd64 -vcvars_ver="14.15" script: - - cmake -Bbuild "-H." -DCMAKE_BUILD_TYPE=Release -G Ninja -DCMAKE_PREFIX_PATH="$Env:VCPKG_INSTALL_DIR" -DCPACK_PACKAGE_DIRECTORY="$env:package_dir" -DPACKAGE_WINDOWS_MSI=ON -DINSTALL_SHARED_LIBRARIES='bt_interfaces;jpeg62;libpng16;tiff;flang;flangrti;libomp;zlib1;openblas;lzma;boost_system*;boost_program_options*;boost_filesystem*' -DINSTALL_OPENCV_COMPONENTS='calib3d;videoio;imgcodecs;imgproc;core;ffmpeg;features2d;flann' -DCMAKE_SUPPRESS_REGENERATION=ON -DCMAKE_SKIP_PACKAGE_ALL_DEPENDENCY=ON + - cmake -Bbuild "-H." -DCMAKE_BUILD_TYPE="$CMAKE_BUILD_TYPE" -G Ninja -DPACKAGE_WINDOWS_MSI=ON -DINSTALL_REQUIRED_SYSTEM_LIBRARIES=ON -DINSTALL_SHARED_LIBRARIES='flang;flangrti;libomp;zlib1;tiff;tiffxx;jpeg62;libpng16;lzma;openblas' -DINSTALL_OPENCV_COMPONENTS='core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab' -DCMAKE_TOOLCHAIN_FILE="$env:VCPKG_DIR/scripts/buildsystems/vcpkg.cmake" -DVCPKG_TARGET_TRIPLET="$env:VCPKG_TRIPLET" -DCMAKE_SUPPRESS_REGENERATION=ON -DCMAKE_SKIP_PACKAGE_ALL_DEPENDENCY=ON -DCPACK_PACKAGE_DIRECTORY="${env:PACKAGE_DIR}" - ninja -C build - -.package windows: &package_windows - stage: package - artifacts: - paths: - - build/*.msi - expire_in: 1 week -package windows: - <<: *base_windows - dependencies: - - build windows - <<: *package_windows +build ubuntu-18.04: + extends: .build ubuntu-18.04 + variables: + <<: [ *gcc8, *release ] before_script: - - $env:PACKAGE_DIR = ("$env:TMP/pkg" -Replace "\\","/") - - $wd = (Get-Item -Path '.').FullName - - $env:PATH += ";$env:VCPKG_INSTALL_DIR/bin;$wd/dependencies/BT_Interfaces/bin" - script: - - ninja -C build package - - Copy-Item "$env:package_dir/*" build -Recurse - + - . /etc/profile.d/robofish.sh + - gitlab-fetch-artifacts bioroboticslab%2biotracker%2Finterfaces master package%20ubuntu-18.04 + - cmake-integrate-package BT_Interfaces + - gitlab-fetch-artifacts bioroboticslab%2Fbiotracker%2Futility master package%20ubuntu-18.04 + - cmake-integrate-package BT_Utility + - gitlab-fetch-artifacts bioroboticslab%2Fbiotracker%2Fbehavior_loader master package%20ubuntu-18.04 + - cmake-integrate-package robofish-behavior_loader +build windows: + extends: .build windows + variables: + <<: [ *release ] + before_script: + - . $Profile + - *msvc15_9 + - GitLab-Fetch-Artifacts bioroboticslab%2biotracker%2Finterfaces master package%20windows + - CMake-Integrate-Package BT_Interfaces + - GitLab-Fetch-Artifacts bioroboticslab%2Fbiotracker%2Futility master package%20windows + - CMake-Integrate-Package BT_Utility + - GitLab-Fetch-Artifacts bioroboticslab%2Fbiotracker%2Fbehavior_loader master package%20windows + - CMake-Integrate-Package robofish-behavior_loader + - $env:PACKAGE_DIR = ("${env:TMP}/pkg" -Replace "\\","/") + - $env:PATH += ";${env:VCPKG_INSTALL_DIR}/bin" + - $env:PATH += ";$(resolve-path vendor/robofish-interfaces/bin)" + package ubuntu-18.04: - stage: package - tags: [ linux, docker_privileged ] - image: git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker:ubuntu-18.04 + extends: .ubuntu-18.04 dependencies: - build ubuntu-18.04 + stage: package + tags: [ linux, docker_privileged ] artifacts: paths: - build/*.AppImage expire_in: 1 week before_script: - - apt-get update - - apt-get install -y fuse - - curl -sSL -o /usr/local/bin/linuxdeployqt https://github.com/probonopd/linuxdeployqt/releases/download/continuous/linuxdeployqt-continuous-x86_64.AppImage - - chmod +x /usr/local/bin/linuxdeployqt + - . /etc/profile.d/robofish.sh + - cmake-enable-package-discovery BT_Interfaces script: - mkdir -p build/appdir/usr/bin - mkdir -p build/appdir/usr/share/applications @@ -113,4 +110,23 @@ package ubuntu-18.04: - cp Src/resources/logo/BT3-big.png build/appdir/usr/share/icons/hicolor/256x256 - cd build - linuxdeployqt appdir/usr/share/applications/BioTracker.desktop -appimage -no-translations - + +.package windows: + extends: .windows + stage: package + artifacts: + paths: + - build/*.msi + expire_in: 1 week + script: + - ninja -C build package + - Copy-Item "$env:PACKAGE_DIR/*" build -Recurse + +package windows: + extends: .package windows + dependencies: + - build windows + before_script: + - $env:PACKAGE_DIR = ("${env:TMP}/pkg" -Replace "\\","/") + - $env:PATH += ";${env:VCPKG_INSTALL_DIR}/bin" + - $env:PATH += ";$(resolve-path vendor/robofish-interfaces/bin)" diff --git a/CMakeLists.txt b/CMakeLists.txt index a4c725fa..7a49db40 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,7 +23,7 @@ set(HMNVLibDir "Not Found" CACHE FILEPATH "") if( CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR ) find_package(BT_Utility 0.1.1 REQUIRED) - find_package(RF_behavior_loader 0.1.1 REQUIRED) + find_package(robofish-behavior_loader 0.1.1 REQUIRED) endif() add_subdirectory(Src) diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index 99fa4673..51eb729d 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -19,7 +19,7 @@ add_executable (${TN}) target_include_directories(${TN} PUBLIC ${CMAKE_CURRENT_LIST_DIR}) target_link_libraries (${TN} BT_Utility) -target_link_libraries (${TN} RF_behavior_loader) +target_link_libraries (${TN} robofish-behavior_loader) find_package(Qt5 REQUIRED COMPONENTS Core Gui Xml Network Widgets Multimedia MultimediaWidgets OpenGL) target_link_libraries (${TN} Qt5::Core Qt5::Gui Qt5::Xml Qt5::Network Qt5::Widgets) From ce097b737dd6d6049e21033a2ae0eedba43465da Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Mon, 17 Dec 2018 10:27:10 +0100 Subject: [PATCH 051/171] Tasty pasta --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 98772151..bd5dc06e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -64,7 +64,7 @@ build ubuntu-18.04: <<: [ *gcc8, *release ] before_script: - . /etc/profile.d/robofish.sh - - gitlab-fetch-artifacts bioroboticslab%2biotracker%2Finterfaces master package%20ubuntu-18.04 + - gitlab-fetch-artifacts bioroboticslab%2Fbiotracker%2Finterfaces master package%20ubuntu-18.04 - cmake-integrate-package BT_Interfaces - gitlab-fetch-artifacts bioroboticslab%2Fbiotracker%2Futility master package%20ubuntu-18.04 - cmake-integrate-package BT_Utility @@ -78,7 +78,7 @@ build windows: before_script: - . $Profile - *msvc15_9 - - GitLab-Fetch-Artifacts bioroboticslab%2biotracker%2Finterfaces master package%20windows + - GitLab-Fetch-Artifacts bioroboticslab%2Fbiotracker%2Finterfaces master package%20windows - CMake-Integrate-Package BT_Interfaces - GitLab-Fetch-Artifacts bioroboticslab%2Fbiotracker%2Futility master package%20windows - CMake-Integrate-Package BT_Utility From f2c01d7f596302c04cedadb29ffe96dec310f45c Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Mon, 17 Dec 2018 10:44:06 +0100 Subject: [PATCH 052/171] Less whitespace --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index bd5dc06e..e37e486e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -87,7 +87,7 @@ build windows: - $env:PACKAGE_DIR = ("${env:TMP}/pkg" -Replace "\\","/") - $env:PATH += ";${env:VCPKG_INSTALL_DIR}/bin" - $env:PATH += ";$(resolve-path vendor/robofish-interfaces/bin)" - + package ubuntu-18.04: extends: .ubuntu-18.04 dependencies: From f7764d5900cfdbea6858ebe83e6d21c55700f1fc Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Mon, 17 Dec 2018 10:46:32 +0100 Subject: [PATCH 053/171] Fix path --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e37e486e..66229662 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -86,7 +86,7 @@ build windows: - CMake-Integrate-Package robofish-behavior_loader - $env:PACKAGE_DIR = ("${env:TMP}/pkg" -Replace "\\","/") - $env:PATH += ";${env:VCPKG_INSTALL_DIR}/bin" - - $env:PATH += ";$(resolve-path vendor/robofish-interfaces/bin)" + - $env:PATH += ";$(resolve-path vendor/BT_Interfaces/bin)" package ubuntu-18.04: extends: .ubuntu-18.04 @@ -129,4 +129,4 @@ package windows: before_script: - $env:PACKAGE_DIR = ("${env:TMP}/pkg" -Replace "\\","/") - $env:PATH += ";${env:VCPKG_INSTALL_DIR}/bin" - - $env:PATH += ";$(resolve-path vendor/robofish-interfaces/bin)" + - $env:PATH += ";$(resolve-path vendor/BT_Interfaces/bin)" From c9a15cf5bfa9bc39e4537f46d27d67954201d942 Mon Sep 17 00:00:00 2001 From: Hauke Moenck Date: Wed, 19 Dec 2018 11:05:59 +0100 Subject: [PATCH 054/171] Updated naming scheme, toolchain and versioning Signed-off-by: Hauke Moenck --- .gitlab-ci.yml | 17 ++--- CMakeLists.txt | 12 ++- Src/CMakeLists.txt | 187 ++++++++++++++++++++++----------------------- version.txt | 1 + 4 files changed, 106 insertions(+), 111 deletions(-) create mode 100644 version.txt diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 66229662..4076bfc4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,7 +3,6 @@ stages: - package - deploy - .ubuntu-18.04: tags: [ linux, docker ] image: git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker:devel-ubuntu18.04 @@ -16,7 +15,6 @@ stages: tags: [ windows, docker ] image: git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker:cuda-devel-windows - .gcc8: &gcc8 CC: gcc-8 CXX: g++-8 @@ -33,7 +31,6 @@ stages: .release: &release CMAKE_BUILD_TYPE: Release - .build ubuntu-18.04: extends: .ubuntu-18.04 stage: build @@ -65,9 +62,9 @@ build ubuntu-18.04: before_script: - . /etc/profile.d/robofish.sh - gitlab-fetch-artifacts bioroboticslab%2Fbiotracker%2Finterfaces master package%20ubuntu-18.04 - - cmake-integrate-package BT_Interfaces + - cmake-integrate-package biotracker-interfaces - gitlab-fetch-artifacts bioroboticslab%2Fbiotracker%2Futility master package%20ubuntu-18.04 - - cmake-integrate-package BT_Utility + - cmake-integrate-package biotracker-utility - gitlab-fetch-artifacts bioroboticslab%2Fbiotracker%2Fbehavior_loader master package%20ubuntu-18.04 - cmake-integrate-package robofish-behavior_loader @@ -79,14 +76,14 @@ build windows: - . $Profile - *msvc15_9 - GitLab-Fetch-Artifacts bioroboticslab%2Fbiotracker%2Finterfaces master package%20windows - - CMake-Integrate-Package BT_Interfaces + - CMake-Integrate-Package biotracker-interfaces - GitLab-Fetch-Artifacts bioroboticslab%2Fbiotracker%2Futility master package%20windows - - CMake-Integrate-Package BT_Utility + - CMake-Integrate-Package biotracker-utility - GitLab-Fetch-Artifacts bioroboticslab%2Fbiotracker%2Fbehavior_loader master package%20windows - CMake-Integrate-Package robofish-behavior_loader - $env:PACKAGE_DIR = ("${env:TMP}/pkg" -Replace "\\","/") - $env:PATH += ";${env:VCPKG_INSTALL_DIR}/bin" - - $env:PATH += ";$(resolve-path vendor/BT_Interfaces/bin)" + - $env:PATH += ";$(resolve-path vendor/biotracker-interfaces/bin)" package ubuntu-18.04: extends: .ubuntu-18.04 @@ -100,7 +97,7 @@ package ubuntu-18.04: expire_in: 1 week before_script: - . /etc/profile.d/robofish.sh - - cmake-enable-package-discovery BT_Interfaces + - cmake-enable-package-discovery biotracker-interfaces script: - mkdir -p build/appdir/usr/bin - mkdir -p build/appdir/usr/share/applications @@ -129,4 +126,4 @@ package windows: before_script: - $env:PACKAGE_DIR = ("${env:TMP}/pkg" -Replace "\\","/") - $env:PATH += ";${env:VCPKG_INSTALL_DIR}/bin" - - $env:PATH += ";$(resolve-path vendor/BT_Interfaces/bin)" + - $env:PATH += ";$(resolve-path vendor/biotracker-interfaces/bin)" diff --git a/CMakeLists.txt b/CMakeLists.txt index 7a49db40..e18a949d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,13 +1,11 @@ -cmake_minimum_required(VERSION 3.12) - -cmake_policy(SET CMP0020 NEW) -cmake_policy(SET CMP0054 NEW) +cmake_minimum_required(VERSION 3.13) +file(READ version.txt Version) exec_program("git" ${CMAKE_CURRENT_SOURCE_DIR} ARGS "log --pretty=format:%h -n 1" OUTPUT_VARIABLE GIT_HASH) exec_program("git" ${CMAKE_CURRENT_SOURCE_DIR} ARGS "describe --tags --abbrev=0" OUTPUT_VARIABLE GIT_TAG) project(BioTracker - VERSION ${GIT_TAG} + VERSION ${Version} LANGUAGES CXX ) @@ -22,8 +20,8 @@ set(CMAKE_AUTORCC ON) set(HMNVLibDir "Not Found" CACHE FILEPATH "") if( CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR ) - find_package(BT_Utility 0.1.1 REQUIRED) - find_package(robofish-behavior_loader 0.1.1 REQUIRED) + find_package(biotracker-utility 0.2 REQUIRED) + find_package(robofish-behavior_loader 0.2 REQUIRED) endif() add_subdirectory(Src) diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index 51eb729d..b178dd3f 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -4,29 +4,29 @@ list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/cmake) if( CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR ) - include(BT_Utility/VSSugar) + include(biotracker-utility/VSSugar) else() - include(${BT_Utility_SOURCE_DIR}/cmake/VSSugar.cmake) + include(${biotracker-utility_SOURCE_DIR}/cmake/VSSugar.cmake) endif() VSSourceGroups(${CMAKE_CURRENT_LIST_DIR}) add_definitions(-DBIORACKER_GIT_HASH="${GIT_HASH}") add_definitions(-DBIOTRACKER_GIT_TAG="${GIT_TAG}") -set(TN BioTracker) -add_executable (${TN}) +set(target BioTracker) +add_executable (${target}) +set_target_properties(${target} PROPERTIES OUTPUT_NAME BioTracker) -target_include_directories(${TN} PUBLIC ${CMAKE_CURRENT_LIST_DIR}) +target_include_directories(${target} PUBLIC ${CMAKE_CURRENT_LIST_DIR}) -target_link_libraries (${TN} BT_Utility) -target_link_libraries (${TN} robofish-behavior_loader) +target_link_libraries (${target} biotracker-utility) +target_link_libraries (${target} robofish-behavior_loader) find_package(Qt5 REQUIRED COMPONENTS Core Gui Xml Network Widgets Multimedia MultimediaWidgets OpenGL) -target_link_libraries (${TN} Qt5::Core Qt5::Gui Qt5::Xml Qt5::Network Qt5::Widgets) -target_link_libraries (${TN} Qt5::Multimedia Qt5::MultimediaWidgets Qt5::OpenGL ) +target_link_libraries (${target} Qt5::Core Qt5::Gui Qt5::Xml Qt5::Network Qt5::Widgets Qt5::Multimedia Qt5::MultimediaWidgets Qt5::OpenGL) find_package(Boost REQUIRED system filesystem chrono thread timer program_options) -target_link_libraries(${TN} +target_link_libraries(${target} ${Boost_PROGRAM_OPTIONS_LIBRARY} ) @@ -35,22 +35,21 @@ if(WITH_PYLON5) find_package(Pylon5) if(Pylon5_FOUND) message("Pylon5 support enabled") - target_compile_definitions(${TN} PRIVATE HAS_PYLON=1) - target_link_libraries(${TN} Pylon5::Base Pylon5::Utility Pylon5::GenAPI Pylon5::GCBase) + target_compile_definitions(${target} PRIVATE HAS_PYLON=1) + target_link_libraries(${target} Pylon5::Base Pylon5::Utility Pylon5::GenAPI Pylon5::GCBase) endif() endif() IF("${HMNVLibDir}" MATCHES "Not Found") ELSE() - target_link_libraries(${TN} ${HMNVLibDir}/lib/NvEncInterace.lib) - target_compile_definitions(${TN} PRIVATE WITH_CUDA=1) + target_link_libraries(${target} ${HMNVLibDir}/lib/NvEncInterace.lib) + target_compile_definitions(${target} PRIVATE WITH_CUDA=1) ENDIF() if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") - target_link_libraries(${TN} stdc++fs) + target_link_libraries(${target} stdc++fs) endif() - message(STATUS "Configured CV version=${OpenCV_VERSION}") message(STATUS "Configured QT version=${Qt5Core_VERSION}") message(STATUS "Configured Boost version=${Boost_LIB_VERSION}") @@ -60,7 +59,7 @@ add_definitions( -DMyBT_VERSION="${Boost_LIB_VERSION}" ) include(Locate) if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") - install(TARGETS ${TN} DESTINATION .) + install(TARGETS ${target} DESTINATION .) option(INSTALL_REQUIRED_SYSTEM_LIBRARIES "Install required system libraries" OFF) if(INSTALL_REQUIRED_SYSTEM_LIBRARIES) @@ -70,7 +69,7 @@ if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") endif() include(WinDeployQt5) - deploy_qt5(${TN} DESTINATION .) + deploy_qt5(${target} DESTINATION .) #boost_program_options;boost_filesystem;bt_interfaces; #calib3d;videoio;imgcodecs;imgproc;core; @@ -83,15 +82,15 @@ if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") set(INSTALL_SHARED_LIBRARIES "" CACHE STRING "Additional shared libraries to install") locate_shared_library(shared_libraries ${INSTALL_SHARED_LIBRARIES}) - locate_shared_library(shared_libraries bt_interfaces) + locate_shared_library(shared_libraries biotracker-interfaces) install(FILES ${shared_libraries} DESTINATION .) endif() -set(CPACK_PACKAGE_NAME "${TN}") +set(CPACK_PACKAGE_NAME "${target}") set(CPACK_PACKAGE_VENDOR "Biorobotics Lab / FU Berlin") -set(CPACK_PACKAGE_VERSION ${GIT_TAG}) +set(CPACK_PACKAGE_VERSION ${Version}) if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") option(PACKAGE_WINDOWS_MSI "Create .msi package" OFF) @@ -99,16 +98,16 @@ if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") set(CPACK_GENERATOR "WIX") set(CPACK_WIX_UPGRADE_GUID "e47473db-3d71-4c42-8a58-d3eac87aa0bd") - set(CPACK_PACKAGE_INSTALL_DIRECTORY "RoboFish/${TN}") + set(CPACK_PACKAGE_INSTALL_DIRECTORY "RoboFish/${target}") set(CPACK_WIX_PROGRAM_MENU_FOLDER "RoboFish") - set_property(INSTALL "$" - PROPERTY CPACK_START_MENU_SHORTCUTS "${TN}" + set_property(INSTALL "$" + PROPERTY CPACK_START_MENU_SHORTCUTS "${target}" ) - set_property(INSTALL "$" - PROPERTY CPACK_DESKTOP_SHORTCUTS "${TN}" + set_property(INSTALL "$" + PROPERTY CPACK_DESKTOP_SHORTCUTS "${target}" ) set(CPACK_WIX_LICENSE_RTF ${CMAKE_SOURCE_DIR}/Src/cmake/WIX/licence.rtf) @@ -118,75 +117,75 @@ endif() include(CPack) -target_sources(${TN} +target_sources(${target} PRIVATE - "${CMAKE_CURRENT_LIST_DIR}/BioTracker3App.cpp" - "${CMAKE_CURRENT_LIST_DIR}/GuiContext.cpp" - "${CMAKE_CURRENT_LIST_DIR}/main.cpp" - "${CMAKE_CURRENT_LIST_DIR}/guiresources.qrc" - "${CMAKE_CURRENT_LIST_DIR}/Controller/IControllerCfg.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Controller/ControllerAnnotations.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Controller/ControllerAreaDescriptor.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Controller/ControllerCommands.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Controller/ControllerCoreParameter.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Controller/ControllerDataExporter.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Controller/ControllerGraphicScene.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Controller/ControllerMainWindow.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Controller/ControllerNotifications.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Controller/ControllerPlayer.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Controller/ControllerPlugin.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Controller/ControllerTextureObject.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Controller/ControllerTrackedComponentCore.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Controller/null_Controller.cpp" - "${CMAKE_CURRENT_LIST_DIR}/IStates/IPlayerState.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Model/AreaDescriptor/AreaInfo.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Model/AreaDescriptor/AreaInfoElement.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Model/AreaDescriptor/AreaMemory.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Model/AreaDescriptor/Rectification.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Model/DataExporters/DataExporterCSV.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Model/DataExporters/DataExporterGeneric.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Model/DataExporters/DataExporterJson.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Model/DataExporters/DataExporterSerialize.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Model/MediaPlayerStateMachine/PlayerStates/PStateGoToFrame.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Model/MediaPlayerStateMachine/PlayerStates/PStateInitial.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Model/MediaPlayerStateMachine/PlayerStates/PStateInitialStream.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Model/MediaPlayerStateMachine/PlayerStates/PStatePause.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Model/MediaPlayerStateMachine/PlayerStates/PStatePlay.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Model/MediaPlayerStateMachine/PlayerStates/PStateStepBack.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Model/MediaPlayerStateMachine/PlayerStates/PStateStepForw.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Model/MediaPlayerStateMachine/PlayerStates/PStateWait.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Model/UndoCommands/TrackCommands.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Model/Annotations.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Model/BioTracker3ProxyMat.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Model/CoreParameter.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Model/ImageStream.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Model/MediaPlayer.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Model/null_Model.cpp" - "${CMAKE_CURRENT_LIST_DIR}/Model/TextureObject.cpp" - "${CMAKE_CURRENT_LIST_DIR}/util/CLIcommands.cpp" - "${CMAKE_CURRENT_LIST_DIR}/util/VideoCoder.cpp" - "${CMAKE_CURRENT_LIST_DIR}/util/Config.cpp" - "${CMAKE_CURRENT_LIST_DIR}/View/AreaDesciptor/AreaDescriptor.cpp" - "${CMAKE_CURRENT_LIST_DIR}/View/AreaDesciptor/EllipseDescriptor.cpp" - "${CMAKE_CURRENT_LIST_DIR}/View/AreaDesciptor/RectDescriptor.cpp" - "${CMAKE_CURRENT_LIST_DIR}/View/AnnotationsView.cpp" - "${CMAKE_CURRENT_LIST_DIR}/View/CameraDevice.cpp" - "${CMAKE_CURRENT_LIST_DIR}/View/ComponentShape.cpp" - "${CMAKE_CURRENT_LIST_DIR}/View/CoreParameterView.cpp" - "${CMAKE_CURRENT_LIST_DIR}/View/GLVideoView.cpp" - "${CMAKE_CURRENT_LIST_DIR}/View/GraphicsScene.cpp" - "${CMAKE_CURRENT_LIST_DIR}/View/GraphicsView.cpp" - "${CMAKE_CURRENT_LIST_DIR}/View/MainWindow.cpp" - "${CMAKE_CURRENT_LIST_DIR}/View/NotificationLogBrowser.cpp" - "${CMAKE_CURRENT_LIST_DIR}/View/SettingsWindow.cpp" - "${CMAKE_CURRENT_LIST_DIR}/View/TextureObjectView.cpp" - "${CMAKE_CURRENT_LIST_DIR}/View/TrackedComponentView.cpp" - "${CMAKE_CURRENT_LIST_DIR}/View/TrackedImageView.cpp" - "${CMAKE_CURRENT_LIST_DIR}/View/VideoControllWidget.cpp" - "${CMAKE_CURRENT_LIST_DIR}/View/Utility/RotationHandle.cpp" - "${CMAKE_CURRENT_LIST_DIR}/View/Utility/SwitchButton.cpp" - "${CMAKE_CURRENT_LIST_DIR}/View/Utility/Tracer.cpp" + "BioTracker3App.cpp" + "GuiContext.cpp" + "main.cpp" + "guiresources.qrc" + "Controller/IControllerCfg.cpp" + "Controller/ControllerAnnotations.cpp" + "Controller/ControllerAreaDescriptor.cpp" + "Controller/ControllerCommands.cpp" + "Controller/ControllerCoreParameter.cpp" + "Controller/ControllerDataExporter.cpp" + "Controller/ControllerGraphicScene.cpp" + "Controller/ControllerMainWindow.cpp" + "Controller/ControllerNotifications.cpp" + "Controller/ControllerPlayer.cpp" + "Controller/ControllerPlugin.cpp" + "Controller/ControllerTextureObject.cpp" + "Controller/ControllerTrackedComponentCore.cpp" + "Controller/null_Controller.cpp" + "IStates/IPlayerState.cpp" + "Model/AreaDescriptor/AreaInfo.cpp" + "Model/AreaDescriptor/AreaInfoElement.cpp" + "Model/AreaDescriptor/AreaMemory.cpp" + "Model/AreaDescriptor/Rectification.cpp" + "Model/DataExporters/DataExporterCSV.cpp" + "Model/DataExporters/DataExporterGeneric.cpp" + "Model/DataExporters/DataExporterJson.cpp" + "Model/DataExporters/DataExporterSerialize.cpp" + "Model/MediaPlayerStateMachine/MediaPlayerStateMachine.cpp" + "Model/MediaPlayerStateMachine/PlayerStates/PStateGoToFrame.cpp" + "Model/MediaPlayerStateMachine/PlayerStates/PStateInitial.cpp" + "Model/MediaPlayerStateMachine/PlayerStates/PStateInitialStream.cpp" + "Model/MediaPlayerStateMachine/PlayerStates/PStatePause.cpp" + "Model/MediaPlayerStateMachine/PlayerStates/PStatePlay.cpp" + "Model/MediaPlayerStateMachine/PlayerStates/PStateStepBack.cpp" + "Model/MediaPlayerStateMachine/PlayerStates/PStateStepForw.cpp" + "Model/MediaPlayerStateMachine/PlayerStates/PStateWait.cpp" + "Model/UndoCommands/TrackCommands.cpp" + "Model/Annotations.cpp" + "Model/BioTracker3ProxyMat.cpp" + "Model/CoreParameter.cpp" + "Model/ImageStream.cpp" + "Model/MediaPlayer.cpp" + "Model/null_Model.cpp" + "Model/TextureObject.cpp" + "util/CLIcommands.cpp" + "util/VideoCoder.cpp" + "util/Config.cpp" + "View/AreaDesciptor/AreaDescriptor.cpp" + "View/AreaDesciptor/EllipseDescriptor.cpp" + "View/AreaDesciptor/RectDescriptor.cpp" + "View/AnnotationsView.cpp" + "View/CameraDevice.cpp" + "View/ComponentShape.cpp" + "View/CoreParameterView.cpp" + "View/GLVideoView.cpp" + "View/GraphicsScene.cpp" + "View/GraphicsView.cpp" + "View/MainWindow.cpp" + "View/NotificationLogBrowser.cpp" + "View/SettingsWindow.cpp" + "View/TextureObjectView.cpp" + "View/TrackedComponentView.cpp" + "View/TrackedImageView.cpp" + "View/VideoControllWidget.cpp" + "View/Utility/RotationHandle.cpp" + "View/Utility/SwitchButton.cpp" + "View/Utility/Tracer.cpp" ) diff --git a/version.txt b/version.txt new file mode 100644 index 00000000..0fa4ae48 --- /dev/null +++ b/version.txt @@ -0,0 +1 @@ +3.3.0 \ No newline at end of file From d407cafd5b93af5b38c92e9777b070f18e6c84a4 Mon Sep 17 00:00:00 2001 From: Hauke Moenck Date: Wed, 19 Dec 2018 15:29:29 +0100 Subject: [PATCH 055/171] Slight refactoring of version Signed-off-by: Hauke Moenck --- CMakeLists.txt | 4 ++-- Src/CMakeLists.txt | 2 +- version.txt => VERSION | 0 3 files changed, 3 insertions(+), 3 deletions(-) rename version.txt => VERSION (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index e18a949d..5c26b936 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,11 +1,11 @@ cmake_minimum_required(VERSION 3.13) -file(READ version.txt Version) +file(READ VERSION PROJECT_VERSION) exec_program("git" ${CMAKE_CURRENT_SOURCE_DIR} ARGS "log --pretty=format:%h -n 1" OUTPUT_VARIABLE GIT_HASH) exec_program("git" ${CMAKE_CURRENT_SOURCE_DIR} ARGS "describe --tags --abbrev=0" OUTPUT_VARIABLE GIT_TAG) project(BioTracker - VERSION ${Version} + VERSION ${PROJECT_VERSION} LANGUAGES CXX ) diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index b178dd3f..12048ea0 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -90,7 +90,7 @@ endif() set(CPACK_PACKAGE_NAME "${target}") set(CPACK_PACKAGE_VENDOR "Biorobotics Lab / FU Berlin") -set(CPACK_PACKAGE_VERSION ${Version}) +set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION}) if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") option(PACKAGE_WINDOWS_MSI "Create .msi package" OFF) diff --git a/version.txt b/VERSION similarity index 100% rename from version.txt rename to VERSION From c45c803e17bd85ce52f3306d77bdbfa625bc3948 Mon Sep 17 00:00:00 2001 From: David Dormagen Date: Mon, 28 Jan 2019 18:26:15 +0100 Subject: [PATCH 056/171] extend annotations functionality Annotations now support time ranges, snapping to trajectories and exporting to JSON. Together with the loading/saving functionality of bb_behavior this now constitutes a potent tool for behavior labeling. Also, please don't abbreviate functions like that (see squashed commit). This commit squashes https://github.com/walachey/biotracker_core/commit/509ee990e2d3b0bc6a19be86f622c813226e0abe https://github.com/walachey/biotracker_core/commit/317153ab48cb371a2ec49a4572dd4afe3e441219 https://github.com/walachey/biotracker_core/commit/6a28b02a3d007303ae1fda1202746d9988a4f753 I would have rebased cleanly but the frequent refactoring makes this a PITA. --- Src/Controller/ControllerAnnotations.cpp | 91 +++++- Src/Controller/ControllerAnnotations.h | 14 +- Src/Controller/ControllerCoreParameter.cpp | 2 +- Src/Controller/ControllerMainWindow.cpp | 10 +- Src/Model/Annotations.cpp | 314 ++++++++++----------- Src/Model/Annotations.h | 143 ++++++---- Src/View/AnnotationsView.cpp | 7 +- 7 files changed, 337 insertions(+), 244 deletions(-) diff --git a/Src/Controller/ControllerAnnotations.cpp b/Src/Controller/ControllerAnnotations.cpp index db4cca65..27c0f3f8 100644 --- a/Src/Controller/ControllerAnnotations.cpp +++ b/Src/Controller/ControllerAnnotations.cpp @@ -2,11 +2,18 @@ #include "View/MainWindow.h" #include "Controller/ControllerGraphicScene.h" #include "Controller/ControllerPlayer.h" +#include "Controller/ControllerTrackedComponentCore.h" #include "Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h" #include "Model/Annotations.h" #include "View/AnnotationsView.h" #include "Model/MediaPlayerStateMachine/PlayerParameters.h" +#include + +#include +#include +#include + ControllerAnnotations::~ControllerAnnotations() { delete getModel(); @@ -109,6 +116,14 @@ void ControllerAnnotations::keyPressEvent(QKeyEvent *event) else handled = false; break; + case Qt::Key::Key_Q: + if (!model->updateSelectionStartFrame()) + handled = false; + break; + case Qt::Key::Key_W: + if (!model->updateSelectionEndFrame()) + handled = false; + break; default: handled = false; break; @@ -175,11 +190,61 @@ void ControllerAnnotations::mousePressEvent(QMouseEvent *event, const QPoint &po } +Annotations::TrackedPoint ControllerAnnotations::snapToTrajectory(const QPoint &originalPoint) +{ + auto model = static_cast(getModel()); + IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); + auto trackedComponentCoreController = qobject_cast(ctr); + auto trackedTrajectoryModel = dynamic_cast(trackedComponentCoreController->getModel()); + + if (trackedTrajectoryModel && QGuiApplication::queryKeyboardModifiers().testFlag(Qt::ControlModifier)) + { + auto minDistance = std::numeric_limits::infinity(); + QPoint closestPoint {0, 0}; + int closestTrackID { 0 }; + auto allChildren = trackedTrajectoryModel->getChildNodes(); + + for (const auto &childNode : allChildren) + { + // Top level nodes are likely trajectories. + const auto childTrajectory = dynamic_cast (childNode); + // Not a trajectory? Don't know how to handle. + if (childTrajectory == nullptr) + continue; + + for (size_t i = 0; i < childTrajectory->size(); ++i) + { + if (i != model->getCurrentFrame()) + continue; + const auto &childComponent = childTrajectory->getChild(i); + const auto point = dynamic_cast (childComponent); + if (point == nullptr) + continue; + float distance = std::sqrt(std::pow(point->getXpx() - originalPoint.x(), 2) + std::pow(point->getYpx() - originalPoint.y(), 2)); + if (distance < minDistance) + { + minDistance = distance; + closestPoint = QPoint(static_cast(point->getXpx()), static_cast(point->getYpx())); + closestTrackID = childTrajectory->getId(); + } + } + } + + if (minDistance < 100.0f) + { + return Annotations::TrackedPoint(closestPoint, closestTrackID); + } + } + return Annotations::TrackedPoint(originalPoint); +} + void ControllerAnnotations::mouseReleaseEvent(QMouseEvent*event, const QPoint &pos) { auto model = static_cast(getModel()); - if (model->endAnnotation(pos)) + Annotations::TrackedPoint trackedPoint = snapToTrajectory(pos); + + if ((event->button() == Qt::LeftButton) && (model->endAnnotation(trackedPoint) || model->updateAnnotation(trackedPoint))) { updateView(); event->accept(); @@ -190,7 +255,9 @@ void ControllerAnnotations::mouseMoveEvent(QMouseEvent*event, const QPoint &pos) { auto model = static_cast(getModel()); - if (event->buttons() == Qt::LeftButton && model->updateAnnotation(pos)) + Annotations::TrackedPoint trackedPoint = snapToTrajectory(pos); + + if ((event->buttons() & Qt::LeftButton) && model->updateAnnotation(trackedPoint)) { updateView(); event->accept(); @@ -201,29 +268,35 @@ void ControllerAnnotations::setPlayerParameters(playerParameters* parameters) { auto model = static_cast(getModel()); model->setCurrentFrame(parameters->m_CurrentFrameNumber); - emit(onRepaintRequired()); + + IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); + auto trackedComponentCoreController = qobject_cast(ctr); + auto trackedTrajectoryModel = dynamic_cast(trackedComponentCoreController->getModel()); + if (trackedTrajectoryModel != nullptr) + model->updateTrackedAnnotations(trackedTrajectoryModel->getChildNodes()); + updateView(); } -void ControllerAnnotations::receiveAddLabelAnno(){ +void ControllerAnnotations::receiveAddLabelAnnotation(){ actionQueued = ActionQueued::CreateLabel; } -void ControllerAnnotations::receiveAddRectAnno(){ +void ControllerAnnotations::receiveAddRectAnnotation(){ actionQueued = ActionQueued::CreateRect; } -void ControllerAnnotations::receiveAddArrAnno(){ +void ControllerAnnotations::receiveAddArrowAnnotation(){ actionQueued = ActionQueued::CreateArrow; } -void ControllerAnnotations::receiveAddEllAnno(){ +void ControllerAnnotations::receiveAddEllipseAnnotation(){ actionQueued = ActionQueued::CreateEllipse; } -void ControllerAnnotations::receiveDelSelAnno(){ +void ControllerAnnotations::receiveDeleteSelectedAnnotation(){ auto model = static_cast(getModel()); if (model->removeSelection()){ updateView(); } } -void ControllerAnnotations::receiveSetAnnoColor(QColor color) +void ControllerAnnotations::receiveSetAnnotationColor(QColor color) { AnnotationsView* view = dynamic_cast(m_View); if (view) { diff --git a/Src/Controller/ControllerAnnotations.h b/Src/Controller/ControllerAnnotations.h index 3202916a..4dd44906 100644 --- a/Src/Controller/ControllerAnnotations.h +++ b/Src/Controller/ControllerAnnotations.h @@ -1,5 +1,6 @@ #pragma once +#include "Model/Annotations.h" #include "IControllerCfg.h" #include "QString" #include @@ -36,12 +37,12 @@ class ControllerAnnotations : public IControllerCfg void setPlayerParameters(playerParameters* parameters); //annotation receivers - void receiveAddLabelAnno(); - void receiveAddRectAnno(); - void receiveAddArrAnno(); - void receiveAddEllAnno(); - void receiveDelSelAnno(); - void receiveSetAnnoColor(QColor color); + void receiveAddLabelAnnotation(); + void receiveAddRectAnnotation(); + void receiveAddArrowAnnotation(); + void receiveAddEllipseAnnotation(); + void receiveDeleteSelectedAnnotation(); + void receiveSetAnnotationColor(QColor color); protected: void createModel(std::string filepath = ""); @@ -59,6 +60,7 @@ class ControllerAnnotations : public IControllerCfg }; ActionQueued actionQueued{ ActionQueued::None }; void updateView(); + Annotations::TrackedPoint snapToTrajectory(const QPoint &point); Q_SIGNALS: void onRepaintRequired(); }; diff --git a/Src/Controller/ControllerCoreParameter.cpp b/Src/Controller/ControllerCoreParameter.cpp index abad2f57..3b425cfa 100644 --- a/Src/Controller/ControllerCoreParameter.cpp +++ b/Src/Controller/ControllerCoreParameter.cpp @@ -89,7 +89,7 @@ void ControllerCoreParameter::connectControllerToController() { IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::ANNOTATIONS); ControllerAnnotations *annoController = static_cast(ctr); - QObject::connect(view, &CoreParameterView::emitSetAnnoColor, annoController, &ControllerAnnotations::receiveSetAnnoColor, Qt::DirectConnection); + QObject::connect(view, &CoreParameterView::emitSetAnnoColor, annoController, &ControllerAnnotations::receiveSetAnnotationColor, Qt::DirectConnection); } //Connections to the DataExporter diff --git a/Src/Controller/ControllerMainWindow.cpp b/Src/Controller/ControllerMainWindow.cpp index d0673501..9215c171 100644 --- a/Src/Controller/ControllerMainWindow.cpp +++ b/Src/Controller/ControllerMainWindow.cpp @@ -190,11 +190,11 @@ void ControllerMainWindow::connectControllerToController() { IController* ictrann = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::ANNOTATIONS); ControllerAnnotations *ctrann = static_cast(ictrann); - QObject::connect(this, &ControllerMainWindow::emitAddLabelAnno, ctrann, &ControllerAnnotations::receiveAddLabelAnno, Qt::DirectConnection); - QObject::connect(this, &ControllerMainWindow::emitAddRectAnno, ctrann, &ControllerAnnotations::receiveAddRectAnno, Qt::DirectConnection); - QObject::connect(this, &ControllerMainWindow::emitAddArrAnno, ctrann, &ControllerAnnotations::receiveAddArrAnno, Qt::DirectConnection); - QObject::connect(this, &ControllerMainWindow::emitAddEllAnno, ctrann, &ControllerAnnotations::receiveAddEllAnno, Qt::DirectConnection); - QObject::connect(this, &ControllerMainWindow::emitDelSelAnno, ctrann, &ControllerAnnotations::receiveDelSelAnno, Qt::DirectConnection); + QObject::connect(this, &ControllerMainWindow::emitAddLabelAnno, ctrann, &ControllerAnnotations::receiveAddLabelAnnotation, Qt::DirectConnection); + QObject::connect(this, &ControllerMainWindow::emitAddRectAnno, ctrann, &ControllerAnnotations::receiveAddRectAnnotation, Qt::DirectConnection); + QObject::connect(this, &ControllerMainWindow::emitAddArrAnno, ctrann, &ControllerAnnotations::receiveAddArrowAnnotation, Qt::DirectConnection); + QObject::connect(this, &ControllerMainWindow::emitAddEllAnno, ctrann, &ControllerAnnotations::receiveAddEllipseAnnotation, Qt::DirectConnection); + QObject::connect(this, &ControllerMainWindow::emitDelSelAnno, ctrann, &ControllerAnnotations::receiveDeleteSelectedAnnotation, Qt::DirectConnection); //connect to ControllerDataExporter IController* ictrde = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::DATAEXPORT); diff --git a/Src/Model/Annotations.cpp b/Src/Model/Annotations.cpp index 6cdcc890..ff08d686 100644 --- a/Src/Model/Annotations.cpp +++ b/Src/Model/Annotations.cpp @@ -1,10 +1,16 @@ #include "Annotations.h" +#include "Interfaces/IModel/IModelTrackedComponent.h" +#include "Interfaces/IModel/IModelTrackedTrajectory.h" #include #include #include +#include #include +#include +#include +#include Annotations::~Annotations() { @@ -13,98 +19,84 @@ Annotations::~Annotations() std::string Annotations::getFilename() const { - return filepath + ".annotations.csv"; + return filepath + ".annotations.json"; } void Annotations::serialize() const { if (!dirty || filepath.empty()) return; - std::ofstream outfile(getFilename(), std::ios_base::out | std::ios_base::trunc); - if (!outfile.good()) return; - - if (!annotations.empty()) { - for (auto & annotation : annotations) - { - outfile << annotation.get() << std::endl; - } + QJsonArray serializedAnnotations; + for (auto & annotation : annotations) + { + serializedAnnotations.append(QJsonObject::fromVariantMap(annotation->serializeToMap())); } + QJsonDocument jsonDocument(serializedAnnotations); + QFile outfile { QString::fromStdString(getFilename()) }; + if (!outfile.open(QFile::WriteOnly)) + return; + outfile.write(jsonDocument.toJson()); - dirty = !outfile.good(); + dirty = false; } void Annotations::deserialize() { if (filepath.empty()) return; - std::ifstream infile(getFilename(), std::ios_base::in); - if (!infile.good()) return; - annotations.clear(); - // Implements a simple CSV-reader. - // Could be replaced by library functionality. - std::string line; - while (std::getline(infile, line)) + QFile infile { QString::fromStdString(getFilename()) }; + if (!infile.open(QFile::ReadOnly)) return; + const QJsonDocument jsonDocument { QJsonDocument::fromJson(infile.readAll()) }; + const QJsonArray jsonArray(jsonDocument.array()); + + for (const auto & serializedAnnotation : jsonArray) { - try + const auto jsonObject { serializedAnnotation.toObject() }; + const QString type { jsonObject["type"].toString() }; + + std::shared_ptr annotation; + if (type == "arrow") + annotation = std::make_shared(); + else if (type == "label") + annotation = std::make_shared(); + else if (type == "rect") + annotation = std::make_shared(); + else if (type == "ellipse") + annotation = std::make_shared(); + if (annotation) { - std::string::size_type begin = 0; - std::queue args; - do - { - switch (line[begin]) - { - case '"': - { - const auto end = line.find('"', begin + 1); - if (end == std::string::npos) throw("parse error"); - args.push(line.substr(begin + 1, end - begin - 1)); - begin = end + 1; - break; - } - case ',': - ++begin; - break; - default: - { - auto end = line.find('"', begin + 1); - if (end == std::string::npos) - end = line.size(); - args.push(line.substr(begin + 1, end - begin - 1)); - begin = end + 1; - break; - } - } - } while (begin < line.size()); - - if (!args.empty()) - { - const std::string type = args.front(); - args.pop(); - std::shared_ptr annotation; - if (type == "arrow") - annotation = std::make_shared(); - else if (type == "label") - annotation = std::make_shared(); - else if (type == "rect") - annotation = std::make_shared(); - else if (type == "ellipse") - annotation = std::make_shared(); - if (annotation) - { - annotation->deserializeFrom(args); - annotations.push_back(annotation); - } - } + annotation->deserializeFrom(jsonObject.toVariantMap()); + annotations.push_back(annotation); } - catch (...) {} } + + dirty = false; } -std::ostream& operator<<(std::ostream& stream, const Annotations::Annotation *annotation) +void Annotations::updateTrackedAnnotations(const QList &trackedComponents) { - const std::vector serialized = annotation->serializeToVector(); - for (auto &str : serialized) - stream << "\"" << str << "\","; - return stream; + for (auto &annotation : annotations) + { + annotation->updateTrackedPositions(getCurrentFrame(), trackedComponents); + } +} + +void Annotations::TrackedPoint::update(int currentFrameID, const QList &trackedComponents) +{ + if (!isLinkedToTrack) return; + + for (const auto &trackedComponent : trackedComponents) + { + const auto trackedTrajectory = dynamic_cast (trackedComponent); + if (trackedTrajectory == nullptr) continue; + if (trackedTrajectory->getId() != trackID) continue; + + const auto &childComponent = trackedTrajectory->getChild(currentFrameID); + const auto point = dynamic_cast (childComponent); + if (point == nullptr) return; + + position = QPoint(static_cast(point->getXpx()), static_cast(point->getYpx())); + return; + } } void Annotations::Annotation::drawHandleLocation(QPainter *painter, QPoint pos, QString text) @@ -151,34 +143,38 @@ bool Annotations::Annotation::isHandleAtPosition(const QPoint &handle, const QPo return euclidian <= 20.0; } -void Annotations::Annotation::deserializeFrom(std::queue &args) +void Annotations::Annotation::deserializeFrom(const QMap &map) { - if (args.size() < 4) return; - startFrame = std::stoi(args.front()); args.pop(); - text = QString::fromStdString(args.front()); args.pop(); - const int x = std::stoi(args.front()); args.pop(); - const int y = std::stoi(args.front()); args.pop(); - origin = QPoint(x, y); - + text = map.value("comment", text).toString(); + startFrame = map.value("start_frame", static_cast(startFrame)).toInt(); + endFrame = map.value("end_frame", static_cast(endFrame)).toInt(); + origin.position.setY(map.value("origin_x", origin.x()).toInt()); + origin.position.setY(map.value("origin_y", origin.y()).toInt()); + if (map.contains("origin_track_id")) + { + origin.isLinkedToTrack = true; + origin.trackID = map.value("origin_track_id").toInt(); + } } -std::vector Annotations::Annotation::serializeToVector() const +QMap Annotations::Annotation::serializeToMap() const { - return { name(), std::to_string(startFrame), text.toStdString(), std::to_string(origin.x()), std::to_string(origin.y()) }; -} + QMap map; + map["type"] = QString::fromStdString(name()); + map["comment"] = text; + map["start_frame"] = static_cast(startFrame); + map["end_frame"] = static_cast(endFrame); -void Annotations::AnnotationLabel::deserializeFrom(std::queue &args) -{ - Annotation::deserializeFrom(args); - if (args.size() < 0) { - return; + if (origin.isLinkedToTrack) + { + map["origin_track_id"] = origin.trackID; } -} - -std::vector Annotations::AnnotationLabel::serializeToVector() const -{ - auto base = Annotations::Annotation::serializeToVector(); - return base; + else + { + map["origin_x"] = origin.x(); + map["origin_y"] = origin.y(); + } + return map; } void Annotations::AnnotationLabel::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) const @@ -188,41 +184,51 @@ void Annotations::AnnotationLabel::paint(QPainter * painter, const QStyleOptionG thin.setWidthF(1.0); painter->setPen(thin); const int len = 20; - painter->drawLine(this->origin + QPoint(-len, -len), this->origin + QPoint(+len, +len)); - painter->drawLine(this->origin + QPoint(-len, len), this->origin + QPoint(+len, -len)); + painter->drawLine(*this->origin + QPoint(-len, -len), *this->origin + QPoint(+len, +len)); + painter->drawLine(*this->origin + QPoint(-len, len), *this->origin + QPoint(+len, -len)); painter->setPen(original); Annotation::drawHandleLocation(painter, origin, text); } -void Annotations::AnnotationArrow::deserializeFrom(std::queue &args) +void Annotations::AnnotationArrow::deserializeFrom(const QMap &map) { - Annotation::deserializeFrom(args); - if (args.size() < 2) return; - const int x = std::stoi(args.front()); args.pop(); - const int y = std::stoi(args.front()); args.pop(); - arrowHead = QPoint(x, y); + Annotation::deserializeFrom(map); + arrowHead.position.setX(map.value("end_x", arrowHead.x()).toInt()); + arrowHead.position.setY(map.value("end_y", arrowHead.y()).toInt()); + if (map.contains("end_track_id")) + { + arrowHead.isLinkedToTrack = true; + arrowHead.trackID = map.value("end_track_id").toInt(); + } } -std::vector Annotations::AnnotationArrow::serializeToVector() const +QMap Annotations::AnnotationArrow::serializeToMap() const { - auto base = Annotations::Annotation::serializeToVector(); - decltype(base) suffix { std::to_string(arrowHead.x()), std::to_string(arrowHead.y()) }; - base.insert(base.end(), suffix.begin(), suffix.end()); + auto base = Annotations::Annotation::serializeToMap(); + if (arrowHead.isLinkedToTrack) + { + base["end_track_id"] = arrowHead.trackID; + } + else + { + base["end_x"] = arrowHead.x(); + base["end_y"] = arrowHead.y(); + } return base; } void Annotations::AnnotationArrow::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) const { - painter->drawLine(this->origin, this->arrowHead); + painter->drawLine(this->origin.getPoint(), this->arrowHead.getPoint()); // Draw the origin slightly bigger. { painter->save(); QPen thick{ painter->pen() }; thick.setWidthF(thick.widthF()* 2.5f); painter->setPen(thick); - painter->drawPoint(this->origin); + painter->drawPoint(this->origin.getPoint()); painter->restore(); } // Draw the arrowhead slightly thinner. @@ -231,39 +237,28 @@ void Annotations::AnnotationArrow::paint(QPainter * painter, const QStyleOptionG QPen thin{ painter->pen() }; thin.setWidthF(thin.widthF()* 0.5f); painter->setPen(thin); - painter->drawPoint(this->arrowHead); + painter->drawPoint(this->arrowHead.getPoint()); painter->restore(); } Annotation::drawHandleLocation(painter, origin, text ); Annotation::drawHandleLocation(painter, arrowHead, ""); } -QPoint *Annotations::AnnotationArrow::getHandleForPosition(const QPoint &pos) +Annotations::TrackedPoint *Annotations::AnnotationArrow::getHandleForPosition(const QPoint &pos) { if (isHandleAtPosition(arrowHead, pos)) return &arrowHead; return Annotation::getHandleForPosition(pos); } -void Annotations::AnnotationRect::deserializeFrom(std::queue& args) +void Annotations::AnnotationArrow::updateTrackedPositions(int currentFrameID, const QList &trackedComponents) { - Annotation::deserializeFrom(args); - if (args.size() < 2) return; - const int x = std::stoi(args.front()); args.pop(); - const int y = std::stoi(args.front()); args.pop(); - bottomRight = QPoint(x, y); -} - -std::vector Annotations::AnnotationRect::serializeToVector() const -{ - auto base = Annotations::Annotation::serializeToVector(); - decltype(base) suffix{ std::to_string(bottomRight.x()), std::to_string(bottomRight.y()) }; - base.insert(base.end(), suffix.begin(), suffix.end()); - return base; + Annotation::updateTrackedPositions(currentFrameID, trackedComponents); + arrowHead.update(currentFrameID, trackedComponents); } void Annotations::AnnotationRect::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) const { - QRect rect{ origin, bottomRight }; + QRect rect{ origin.getPoint(), arrowHead.getPoint() }; painter->drawRect(rect); // Draw the origin slightly bigger. { @@ -271,7 +266,7 @@ void Annotations::AnnotationRect::paint(QPainter * painter, const QStyleOptionGr QPen thick{ painter->pen() }; thick.setWidthF(thick.widthF()* 2.5f); painter->setPen(thick); - painter->drawPoint(this->origin); + painter->drawPoint(origin.getPoint()); painter->restore(); } // Draw the bottom right point slightly thinner. @@ -280,39 +275,16 @@ void Annotations::AnnotationRect::paint(QPainter * painter, const QStyleOptionGr QPen thin{ painter->pen() }; thin.setWidthF(thin.widthF()* 0.5f); painter->setPen(thin); - painter->drawPoint(this->bottomRight); + painter->drawPoint(arrowHead.getPoint()); painter->restore(); } Annotation::drawHandleLocation(painter, origin, text); - Annotation::drawHandleLocation(painter, bottomRight, ""); -} - -QPoint * Annotations::AnnotationRect::getHandleForPosition(const QPoint & pos) -{ - if (isHandleAtPosition(bottomRight, pos)) return &bottomRight; - return Annotation::getHandleForPosition(pos); -} - -void Annotations::AnnotationEllipse::deserializeFrom(std::queue& args) -{ - Annotation::deserializeFrom(args); - if (args.size() < 2) return; - const int x = std::stoi(args.front()); args.pop(); - const int y = std::stoi(args.front()); args.pop(); - bottomRight = QPoint(x, y); -} - -std::vector Annotations::AnnotationEllipse::serializeToVector() const -{ - auto base = Annotations::Annotation::serializeToVector(); - decltype(base) suffix{ std::to_string(bottomRight.x()), std::to_string(bottomRight.y()) }; - base.insert(base.end(), suffix.begin(), suffix.end()); - return base; + Annotation::drawHandleLocation(painter, arrowHead, ""); } void Annotations::AnnotationEllipse::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) const { - QRect rect{ origin, bottomRight }; + QRect rect{ origin.getPoint(), arrowHead.getPoint() }; painter->drawEllipse(rect); // Draw the origin slightly bigger. { @@ -320,7 +292,7 @@ void Annotations::AnnotationEllipse::paint(QPainter * painter, const QStyleOptio QPen thick{ painter->pen() }; thick.setWidthF(thick.widthF()* 2.5f); painter->setPen(thick); - painter->drawPoint(this->origin); + painter->drawPoint(origin.getPoint()); painter->restore(); } // Draw the bottom right point slightly thinner. @@ -329,20 +301,13 @@ void Annotations::AnnotationEllipse::paint(QPainter * painter, const QStyleOptio QPen thin{ painter->pen() }; thin.setWidthF(thin.widthF()* 0.5f); painter->setPen(thin); - painter->drawPoint(this->bottomRight); + painter->drawPoint(arrowHead.getPoint()); painter->restore(); } Annotation::drawHandleLocation(painter, origin, text); - Annotation::drawHandleLocation(painter, bottomRight, ""); -} - -QPoint * Annotations::AnnotationEllipse::getHandleForPosition(const QPoint & pos) -{ - if (isHandleAtPosition(bottomRight, pos)) return &bottomRight; - return Annotation::getHandleForPosition(pos); + Annotation::drawHandleLocation(painter, arrowHead, ""); } - void Annotations::startArrow(QPoint origin, size_t currentFrame) { currentAnnotation = std::make_shared(origin, currentFrame); @@ -363,7 +328,7 @@ void Annotations::startEllipse(QPoint origin, size_t currentFrame) currentAnnotation = std::make_shared(origin, currentFrame); } -bool Annotations::updateAnnotation(QPoint cursor) +bool Annotations::updateAnnotation(TrackedPoint cursor) { if (currentAnnotation) { @@ -415,7 +380,7 @@ bool Annotations::trySetText(QPoint cursor) { return false; } -bool Annotations::endAnnotation(QPoint cursor) +bool Annotations::endAnnotation(TrackedPoint cursor) { if (currentAnnotation) { @@ -446,4 +411,25 @@ bool Annotations::removeSelection() else ++iter; } + return true; +} + +bool Annotations::updateSelectionStartFrame() +{ + if (!selection) return false; + Annotation *selectedAnnotation{ selection.annotation.lock().get() }; + selectedAnnotation->startFrame = getCurrentFrame(); + if (selectedAnnotation->endFrame < selectedAnnotation->startFrame) + selectedAnnotation->endFrame = selectedAnnotation->startFrame; + return true; +} + +bool Annotations::updateSelectionEndFrame() +{ + if (!selection) return false; + Annotation *selectedAnnotation{ selection.annotation.lock().get() }; + selectedAnnotation->endFrame = getCurrentFrame(); + if (selectedAnnotation->startFrame > selectedAnnotation->endFrame) + selectedAnnotation->startFrame = selectedAnnotation->endFrame; + return true; } diff --git a/Src/Model/Annotations.h b/Src/Model/Annotations.h index 78b4046c..5d768afb 100644 --- a/Src/Model/Annotations.h +++ b/Src/Model/Annotations.h @@ -11,9 +11,12 @@ #include "Interfaces/IModel/IModel.h" +#include #include "QString" +#include #include #include +#include #include #include @@ -21,17 +24,42 @@ #include #include - /** - * Model to handle annotations, including serialization. - * Annotations will be drawn on top of the video. Their position is defined in image coordinates. - * Here the annotations are actually created, serialized and deserialized. - */ +class IModelTrackedComponent; + +/** + Model to handle annotations, including serialization. + Annotations will be drawn on top of the video. Their position is defined in image coordinates. +*/ class Annotations : public IModel { Q_OBJECT public: Annotations(std::string filepath = "") : filepath(filepath) { deserialize(); } virtual ~Annotations(); + /* + A 2d point that can be linked to a tracked component ID. + */ + struct TrackedPoint { + TrackedPoint (const QPoint &pos) : position(pos) {} + TrackedPoint (int x, int y) : TrackedPoint(QPoint(x, y)) {} + TrackedPoint (const QPoint &pos, int trackID) : TrackedPoint(pos) + { + this->trackID = trackID; + isLinkedToTrack = true; + } + TrackedPoint() {} + QPoint position {0, 0}; + int trackID {0}; + bool isLinkedToTrack {0}; + + // Retrieve the current position. + QPoint getPoint() const { return position; } + const QPoint &operator *() const { return position; } + int x() const { return position.x(); } + int y() const { return position.y(); } + // Update the current position to the corresponding track position IIF isLinkedToTrack. + void update(int currentFrameID, const QList &trackedComponents); + }; /* Base annotation class. Children must at least support serialization and drawing. @@ -40,36 +68,48 @@ class Annotations : public IModel { { Annotation(QPoint origin = { 0,0 }, size_t startFrame = 0) : origin(origin), startFrame(startFrame) {} virtual ~Annotation() = default; - /// Position in pixels. - QPoint origin{ 0, 0 }; - size_t startFrame{ 0 }; - /// Possible text for each annotation + // Position in pixels. + TrackedPoint origin{ 0, 0 }; + size_t startFrame{ 0 }, endFrame{ 0 }; + // Possible text for each annotation QString text{ "" }; /// Name that identifies this type of annotation and is used for serialization. virtual std::string name() const = 0; virtual void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) const = 0; - /// Saving requires writing properties to vector of strings. - virtual std::vector serializeToVector() const; - virtual void deserializeFrom(std::queue &args); - /// Set text. Called when right clicking. - virtual void setText(QString newText) { text = newText; }; - /// Get text.Called when right clicking. - virtual QString getText() { return text; }; + // Saving requires writing/reading properties to/from maps. + virtual QMap serializeToMap() const; + virtual void deserializeFrom(const QMap &map); + // Set text. Called when right clicking. + virtual void setText(QString newText) { text = newText; } + // Get text. Called when right clicking. + virtual QString getText() { return text; } // Called either during dragging or when the mouse is released. - //Needs to update positional data. - virtual bool onEndAnnotation(QPoint currentPosition) { origin = currentPosition; return true; }; - virtual QRectF boundingRect() const { return QRect(origin, origin).marginsAdded({ 20, 20, 20, 20 }); } + // Needs to update positional data. + virtual bool onEndAnnotation(TrackedPoint currentPosition) { origin = currentPosition; return true; } + virtual QRectF boundingRect() const { return QRect(*origin, *origin).marginsAdded({ 20, 20, 20, 20 }); } // Used for mouse-click events. // Returns the handle that has been clicked. - virtual QPoint *getHandleForPosition(const QPoint &pos) + virtual TrackedPoint *getHandleForPosition(const QPoint &pos) { if (isHandleAtPosition(origin, pos)) return &origin; return nullptr; } // Static, so that the view can use it to draw special handles. static void drawHandleLocation(QPainter *painter, QPoint pos, QString text); + static void drawHandleLocation(QPainter *painter, const TrackedPoint &pos, QString text) + { + drawHandleLocation(painter, *pos, text); + } + virtual void updateTrackedPositions(int currentFrameID, const QList &trackedComponents) + { + origin.update(currentFrameID, trackedComponents); + } protected: bool isHandleAtPosition(const QPoint &handle, const QPoint &pos); + bool isHandleAtPosition(const TrackedPoint &handle, const QPoint &pos) + { + return isHandleAtPosition(*handle, pos); + } }; /// A label marks a position. @@ -79,8 +119,6 @@ class Annotations : public IModel { virtual ~AnnotationLabel() = default; virtual std::string name() const override { return "label"; } - virtual void deserializeFrom(std::queue &args); - virtual std::vector serializeToVector() const; virtual void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) const override; }; @@ -91,50 +129,36 @@ class Annotations : public IModel { virtual ~AnnotationArrow() = default; virtual std::string name() const override { return "arrow"; } - virtual void deserializeFrom(std::queue &args); - virtual std::vector serializeToVector() const; - virtual bool onEndAnnotation(QPoint currentPosition) override { arrowHead = currentPosition; return true; }; + virtual QMap serializeToMap() const override; + virtual void deserializeFrom(const QMap &map) override; + virtual bool onEndAnnotation(TrackedPoint currentPosition) override { arrowHead = currentPosition; return true; } virtual void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) const override; - virtual QRectF boundingRect() const { return QRect(origin, arrowHead).marginsAdded({ 20, 20, 20, 20 }); } - virtual QPoint *getHandleForPosition(const QPoint &pos) override; + virtual QRectF boundingRect() const { return QRect(*origin, *arrowHead).marginsAdded({ 20, 20, 20, 20 }); } + virtual TrackedPoint *getHandleForPosition(const QPoint &pos) override; + virtual void updateTrackedPositions(int currentFrameID, const QList &trackedComponents) override; - QPoint arrowHead; + TrackedPoint arrowHead; }; - /// A rectangle defined by two points (top-left and bottom-right) - struct AnnotationRect : public Annotation + // A rectangle defined by two points (top-left and bottom-right) + struct AnnotationRect : public AnnotationArrow { - using Annotation::Annotation; + using AnnotationArrow::AnnotationArrow; virtual ~AnnotationRect() = default; virtual std::string name() const override { return "rect"; } - virtual void deserializeFrom(std::queue &args); - virtual std::vector serializeToVector() const; - virtual bool onEndAnnotation(QPoint currentPosition) override { bottomRight = currentPosition; return true; }; virtual void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) const override; - virtual QRectF boundingRect() const { return QRect(origin, bottomRight).marginsAdded({ 20, 20, 20, 20 }); } - virtual QPoint *getHandleForPosition(const QPoint &pos) override; - - QPoint bottomRight; }; - /// An ellipse defined by two points (top-left and bottom-right) - struct AnnotationEllipse : public Annotation + // An ellipse defined by two points (top-left and bottom-right) + struct AnnotationEllipse : public AnnotationArrow { - using Annotation::Annotation; + using AnnotationArrow::AnnotationArrow; virtual ~AnnotationEllipse() = default; virtual std::string name() const override { return "ellipse"; } - virtual void deserializeFrom(std::queue &args); - virtual std::vector serializeToVector() const; - virtual bool onEndAnnotation(QPoint currentPosition) override { bottomRight = currentPosition; return true; }; virtual void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) const override; - virtual QRectF boundingRect() const { return QRect(origin, bottomRight).marginsAdded({ 20, 20, 20, 20 }); } - virtual QPoint *getHandleForPosition(const QPoint &pos) override; - - QPoint bottomRight; }; - void serialize() const; void deserialize(); /// Called by the controller to begin a new annotation. @@ -146,15 +170,21 @@ class Annotations : public IModel { bool tryStartDragging(QPoint cursor); /// Called by the controller on left mouse-clicks. bool trySetText(QPoint cursor); - /// Called by the controller during mouse-drags to update the current annotation. - bool updateAnnotation(QPoint cursor); - /// Called on mouse-release. - bool endAnnotation(QPoint cursor); - /// Removes the currently selected (through tryStartDragging) annotation. + // Called by the controller during mouse-drags to update the current annotation. + bool updateAnnotation(TrackedPoint cursor); + // Called on mouse-release. + bool endAnnotation(TrackedPoint cursor); + // Removes the currently selected (through tryStartDragging) annotation. bool removeSelection(); - /// The current frame is required for the view to highlight annotations. + // Sets the start frame of the current selection to the current frame. + bool updateSelectionStartFrame(); + // Sets the end frame of the current selection to the current frame. + bool updateSelectionEndFrame(); + // The current frame is required for the view to highlight annotations. void setCurrentFrame(size_t currentFrame) { this->currentFrame = currentFrame; } size_t getCurrentFrame() const { return currentFrame; } + // Called when trajectories or displayed frames have changed. + void updateTrackedAnnotations(const QList &trackedComponents); private: size_t currentFrame{ 0 }; /**< The current frame is required by the view. */ @@ -173,7 +203,7 @@ class Annotations : public IModel { { // Annotation from the annotations vector above. Defines validity of the whole struct. std::weak_ptr annotation; - QPoint *handle{ nullptr }; + TrackedPoint *handle{ nullptr }; explicit operator bool() const { return !annotation.expired(); } // This is likely not thread-safe. Annotation *operator->() { return annotation.lock().get(); } @@ -183,4 +213,3 @@ class Annotations : public IModel { friend class AnnotationsView; }; -std::ostream& operator<<(std::ostream& stream, const Annotations::Annotation *annotation); diff --git a/Src/View/AnnotationsView.cpp b/Src/View/AnnotationsView.cpp index d1f26480..8cb40031 100644 --- a/Src/View/AnnotationsView.cpp +++ b/Src/View/AnnotationsView.cpp @@ -44,9 +44,12 @@ void AnnotationsView::paint(QPainter * painter, const QStyleOptionGraphicsItem * { setZValue(-1); auto model = static_cast(getModel()); + const auto currentFrame = model->getCurrentFrame(); for (auto &annotation : model->annotations) { - if (model->getCurrentFrame() == annotation->startFrame) + // Is the current frame in the annotation's range? + if ((currentFrame >= annotation->startFrame && currentFrame <= annotation->endFrame) + || (currentFrame == annotation->startFrame && annotation->startFrame > annotation->endFrame)) painter->setPen(QPen(_annoColor, 6, Qt::SolidLine, Qt::RoundCap)); else { @@ -69,4 +72,4 @@ void AnnotationsView::paint(QPainter * painter, const QStyleOptionGraphicsItem * painter->setPen(QPen(Qt::red, 6, Qt::SolidLine, Qt::RoundCap)); Annotations::Annotation::drawHandleLocation(painter, *model->selection.handle, ""); } -} +} \ No newline at end of file From bbf3748f98aebfeef39be4f8e22b6882a23b24b6 Mon Sep 17 00:00:00 2001 From: David Dormagen Date: Fri, 1 Feb 2019 10:55:42 +0100 Subject: [PATCH 057/171] MediaPlayer: don't crash if receiving parameters without image This could e.g. be achieved by moving to the last frame of a video, hitting [right] and [space]. While allowing the hotkeys then is an issue itself, but it should not crash in any case. --- Src/Model/MediaPlayer.cpp | 83 +++++++++++++++++++++------------------ 1 file changed, 45 insertions(+), 38 deletions(-) diff --git a/Src/Model/MediaPlayer.cpp b/Src/Model/MediaPlayer.cpp index e2e7e034..8faa4496 100644 --- a/Src/Model/MediaPlayer.cpp +++ b/Src/Model/MediaPlayer.cpp @@ -240,45 +240,52 @@ void MediaPlayer::receivePlayerParameters(playerParameters* param) { m_TotalNumbFrames = param->m_TotalNumbFrames; m_CurrentFrame = param->m_CurrentFrame; + const bool isValidFrame = !!m_CurrentFrame; - Q_EMIT renderCurrentImage(m_CurrentFrame, m_NameOfCvMat); - - if (m_TrackingIsActive) { - m_trackingDone = false; - Q_EMIT trackCurrentImage(m_CurrentFrame, m_CurrentFrameNumber); - } - else { - Q_EMIT signalVisualizeCurrentModel(m_CurrentFrameNumber); - Q_EMIT signalCurrentFrameNumberToPlugin(m_CurrentFrameNumber); - } - - if (m_recd) { - //reopenVideoWriter(); //4us - QRectF rscene = m_gv->sceneRect(); //0us - QRectF rview = m_gv->rect(); //0us - QPixmap *pix; - if (!m_recordScaled) - pix = new QPixmap(rscene.size().toSize()); //17us - else - pix = new QPixmap(rview.size().toSize()); //17us - - QPainter *paint = new QPainter(pix); //21us - - if(!m_recordScaled) - m_gv->scene()->render(paint); //8544us - else - m_gv->render(paint);// , m_gv->scene()->sceneRect(), QRect());// , Qt::AspectRatioMode::IgnoreAspectRatio); - - QImage image = pix->toImage(); //8724us - int x = image.format(); //0us - std::shared_ptr mat = std::make_shared(image.height(), image.width(), CV_8UC(image.depth()/8), (uchar*)image.bits(), image.bytesPerLine()); //1us - - cv::cvtColor(*mat, *mat, CV_BGR2RGB); //16898 us - cv::cvtColor(*mat, *mat, CV_BGR2RGB); - m_videoc->add(mat,1); - - } - + if (isValidFrame) + { + Q_EMIT renderCurrentImage(m_CurrentFrame, m_NameOfCvMat); + + if (m_TrackingIsActive) { + m_trackingDone = false; + Q_EMIT trackCurrentImage(m_CurrentFrame, m_CurrentFrameNumber); + } + else { + Q_EMIT signalVisualizeCurrentModel(m_CurrentFrameNumber); + Q_EMIT signalCurrentFrameNumberToPlugin(m_CurrentFrameNumber); + } + + if (m_recd) { + //reopenVideoWriter(); //4us + QRectF rscene = m_gv->sceneRect(); //0us + QRectF rview = m_gv->rect(); //0us + QPixmap *pix; + if (!m_recordScaled) + pix = new QPixmap(rscene.size().toSize()); //17us + else + pix = new QPixmap(rview.size().toSize()); //17us + + QPainter *paint = new QPainter(pix); //21us + + if(!m_recordScaled) + m_gv->scene()->render(paint); //8544us + else + m_gv->render(paint);// , m_gv->scene()->sceneRect(), QRect());// , Qt::AspectRatioMode::IgnoreAspectRatio); + + QImage image = pix->toImage(); //8724us + int x = image.format(); //0us + std::shared_ptr mat = std::make_shared(image.height(), image.width(), CV_8UC(image.depth()/8), (uchar*)image.bits(), image.bytesPerLine()); //1us + + cv::cvtColor(*mat, *mat, CV_BGR2RGB); //16898 us + cv::cvtColor(*mat, *mat, CV_BGR2RGB); + m_videoc->add(mat,1); + + } + } + else + { + qDebug() << "MediaPlayer: Received player parameters with invalid image."; + } Q_EMIT notifyView(); } From 819d6b2cabeff3dc1e650907d050521c9ba0fe71 Mon Sep 17 00:00:00 2001 From: David Dormagen Date: Wed, 13 Feb 2019 19:04:30 +0100 Subject: [PATCH 058/171] CMake: add boost include path and properly include all provided libraries --- Src/CMakeLists.txt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index 12048ea0..39cc6d8a 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -26,9 +26,8 @@ find_package(Qt5 REQUIRED COMPONENTS Core Gui Xml Network Widgets Multimedia Mul target_link_libraries (${target} Qt5::Core Qt5::Gui Qt5::Xml Qt5::Network Qt5::Widgets Qt5::Multimedia Qt5::MultimediaWidgets Qt5::OpenGL) find_package(Boost REQUIRED system filesystem chrono thread timer program_options) -target_link_libraries(${target} - ${Boost_PROGRAM_OPTIONS_LIBRARY} -) +target_include_directories(${target} PUBLIC ${Boost_INCLUDE_DIRS}) +target_link_libraries(${target} ${Boost_LIBRARIES}) option(WITH_PYLON5 "Support Pylon 5 cameras" OFF) if(WITH_PYLON5) From 994045daf8358d7bcb047ad2a788591efb4d0cae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hauke=20J=C3=BCrgen=20M=C3=B6nck?= Date: Thu, 14 Feb 2019 09:50:46 +0100 Subject: [PATCH 059/171] Update README.md Updated readme to comply to the new toolchaining --- README.md | 77 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 43 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index 2945f9b8..68e20c2c 100644 --- a/README.md +++ b/README.md @@ -2,50 +2,59 @@ [![Build Status](https://git.imp.fu-berlin.de/bioroboticslab/biotracker/biotracker/badges/master/build.svg)](https://git.imp.fu-berlin.de/bioroboticslab/biotracker/biotracker/pipelines) -## Running Biotracker 3 from prebuild binaries: +# README -Binaries are distributed via Github: https://github.com/BioroboticsLab/biotracker_core/releases +## Using BioTracker -## Build dependencies +See the [wiki](https://github.com/BioroboticsLab/biotracker_core/wiki). -Building the Biotracker 3 needs: -- opencv build (>3.0) -- QT build (>= 5.4) -- Boost build -- CMake GUI (any version should be OK, but boost detection may vary) +## Running BioTracker from prebuild binaries: -## Building Biotracker 3 (Windows x64) +The releases github page provides stable version. +Most recent binaries can be grabbed from the pipeline. +- [BioTracker core application](https://git.imp.fu-berlin.de/bioroboticslab/biotracker/biotracker/pipelines) +- Some trackers. For example the [Background subtraction tracker](https://git.imp.fu-berlin.de/bioroboticslab/biotracker/backgroundsubtraction_tracker/pipelines) -Following example will use Visual Studio 2015, OpenCv 3.2, QT 5.9 and boost_1_64, all x64. -You will need to tell CMake where to find the libraries. You can do this via GUI when asked or set enviromental variables. +## Building trackers against prebuild BioTracker -Set: -- QT_DIR_CMAKE64, E.g. E:\Software\Libraries\QT\5.9\msvc2015_64\lib\cmake\Qt5 -- CV_DIR_CMAKE64, E.g. E:\Software\Libraries\opencv\build -- BOOST_LIBRARYDIR, E.g. E:\Software\Libraries\boost_1_65_1\stage64\lib -- BOOST_ROOT, E.g. E:\Software\Libraries\boost_1_65_1 -Note that your path's and library version may differ. +This will enable you to only build your own plugin without having to care about the robotracker toolchaining/dependencies/etc.. +- Download [Interfaces](https://git.imp.fu-berlin.de/bioroboticslab/biotracker/interfaces/pipelines) project and add it to your toolchain (e.g. cmake prefix path) +- Optional: Do the same for the [utility](https://git.imp.fu-berlin.de/bioroboticslab/biotracker/utility/pipelines) project, if you need it +- Download and install the [BioTracker core application](https://git.imp.fu-berlin.de/bioroboticslab/biotracker/biotracker/pipelines) +- It might be helpful to use some basic tracker as a template: https://github.com/BioroboticsLab/biotracker_sampletracker +- Make sure to implement the IBehavior interface +- Build +- Put your artifact in the Plugins section +- Run and Enjoy + +## Build dependencies -Building with NVEnc is comming soon. Meanwhile ignore "HMNVLibDir=Not Found", it will build with CPU encoding only. +Building the Robotracker needs: +- opencv (> 3.0) +- QT (>= 5.4) +- Boost +- CMake (>= 3.12) +- Buildtools (Tested: MSVC buildtools or g++) +- recommendet: ninja -Now configure, generate, open and build for Debug/Release. The build is dynamically linked, which means you will need to supply the DLL's to your newly build binary. Qt offers the windeployqt utility. Usage sample, console: -C:\Users\Hauke>E:\Software\Libraries\QT\5.9\msvc2015_64\bin\windeployqt.exe E:\Development\Hauke\biotracker_core\BioTracker\CoreApp\BioTracker\Release\Biotracker_core.exe -OpenCv does not come with such a utility and you need to copy the DLL's manually from e.g.: -E:\Software\Libraries\opencv\build\bin\Release (or Debug, respectively) -Boost libraries are not needed to be copied. +## Building BioTracker (Windows x64) -Congratulations! You build the Biotracker 3! +The [dockerfile](https://git.imp.fu-berlin.de/bioroboticslab/robofish/docker) documents the dependency installation: (includes dependencies for all projects, e.g. BioTracker, interfaces, ...) + +Install and configure those dependencies. A shorthand to the dockerfile is using [vcpkg](https://git.imp.fu-berlin.de/bioroboticslab/robofish/vcpkg) +Get the boost and opencv packages: +` vcpkg install boost-property-tree:x64-windows-14.13 boost-bimap:x64-windows-14.13 boost-assign:x64-windows-14.13 boost-system:x64-windows-14.13 boost-filesystem:x64-windows-14.13 boost-chrono:x64-windows-14.13 boost-timer:x64-windows-14.13 boost-program-options:x64-windows-14.13 ` +`vcpkg install openblas:x64-windows-14.13 opencv[opengl,ffmpeg,ximea,cuda]:x64-windows-14.13 ` +... and Qt systemwide using Qt5_dir +Now call cmake with some switches to include vcpkg: `-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-14.16` +... and build. You might need to copy flang DLL files, as their vcpkg integration is not yet complete. +Proceed withe the build steps as in the linux section. -## Building Biotracker 3 (Linux) +## Building BioTracker (Linux) -Having set all the library paths you can build it just like any cmake project: -git clone https://github.com/BioroboticsLab/biotracker_core.git -cd biotracker_core -mkdir build -cd build -cmake ../BioTracker -make +The [dockerfile](https://git.imp.fu-berlin.de/bioroboticslab/robofish/docker) documents the dependency installation: (includes dependencies for all projects, e.g. BioTracker, interfaces, ...) +Having set all the library paths you can build it just like any cmake project. It's split into a few repositories for modularization. Clone, build and install them in order: [Interfaces](https://github.com/BioroboticsLab/biotracker_interfaces), [Utility](https://github.com/BioroboticsLab/biotracker_utility), [Behavior loader](https://github.com/BioroboticsLab/behavior_loader), the [BioTracker](https://github.com/BioroboticsLab/biotracker_core) itself and any tracking plugin of your liking, eg. the [Background subtraction tracker](https://github.com/BioroboticsLab/biotracker_backgroundsubtraction_tracker). -## Building Biotracker 3 (OSX) +## Building BioTracker (OSX) -Technically the Biotracker should build using the CMake toolchain and run on OSX. This is not officially supported, though. +Technically the BioTracker should build using the CMake toolchain and run on OSX. This is not officially supported, though. From 4f60ecc972d9931fb7c20c59abf649160364d805 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hauke=20J=C3=BCrgen=20M=C3=B6nck?= Date: Thu, 14 Feb 2019 09:52:41 +0100 Subject: [PATCH 060/171] Update README.md Require cmake version 3.13 in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 68e20c2c..13926c6e 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ Building the Robotracker needs: - opencv (> 3.0) - QT (>= 5.4) - Boost -- CMake (>= 3.12) +- CMake (>= 3.13) - Buildtools (Tested: MSVC buildtools or g++) - recommendet: ninja From 4e7ce092dd940d2c698c3acaa1d0295213e536b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hauke=20J=C3=BCrgen=20M=C3=B6nck?= Date: Mon, 4 Mar 2019 15:24:20 +0100 Subject: [PATCH 061/171] Updated the vcpkg triplet in the readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 13926c6e..2c7c435a 100644 --- a/README.md +++ b/README.md @@ -43,8 +43,8 @@ The [dockerfile](https://git.imp.fu-berlin.de/bioroboticslab/robofish/docker) do Install and configure those dependencies. A shorthand to the dockerfile is using [vcpkg](https://git.imp.fu-berlin.de/bioroboticslab/robofish/vcpkg) Get the boost and opencv packages: -` vcpkg install boost-property-tree:x64-windows-14.13 boost-bimap:x64-windows-14.13 boost-assign:x64-windows-14.13 boost-system:x64-windows-14.13 boost-filesystem:x64-windows-14.13 boost-chrono:x64-windows-14.13 boost-timer:x64-windows-14.13 boost-program-options:x64-windows-14.13 ` -`vcpkg install openblas:x64-windows-14.13 opencv[opengl,ffmpeg,ximea,cuda]:x64-windows-14.13 ` +` vcpkg install boost-property-tree:x64-windows-14.16 boost-bimap:x64-windows-14.16 boost-assign:x64-windows-14.16 boost-system:x64-windows-14.16 boost-filesystem:x64-windows-14.16 boost-chrono:x64-windows-14.16 boost-timer:x64-windows-14.16 boost-program-options:x64-windows-14.16 ` +`vcpkg install openblas:x64-windows-14.16 opencv[opengl,ffmpeg,ximea,cuda]:x64-windows-14.16 ` ... and Qt systemwide using Qt5_dir Now call cmake with some switches to include vcpkg: `-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-14.16` ... and build. You might need to copy flang DLL files, as their vcpkg integration is not yet complete. From ee4dc5b20cc4ae32e13bc743aaa6aa9ab7556853 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Wed, 8 May 2019 16:17:08 +0200 Subject: [PATCH 062/171] Add missing opencv ffmpeg dll --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4076bfc4..ba2c880a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -52,7 +52,7 @@ stages: - build expire_in: 1 day script: - - cmake -Bbuild "-H." -DCMAKE_BUILD_TYPE="$CMAKE_BUILD_TYPE" -G Ninja -DPACKAGE_WINDOWS_MSI=ON -DINSTALL_REQUIRED_SYSTEM_LIBRARIES=ON -DINSTALL_SHARED_LIBRARIES='flang;flangrti;libomp;zlib1;tiff;tiffxx;jpeg62;libpng16;lzma;openblas' -DINSTALL_OPENCV_COMPONENTS='core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab' -DCMAKE_TOOLCHAIN_FILE="$env:VCPKG_DIR/scripts/buildsystems/vcpkg.cmake" -DVCPKG_TARGET_TRIPLET="$env:VCPKG_TRIPLET" -DCMAKE_SUPPRESS_REGENERATION=ON -DCMAKE_SKIP_PACKAGE_ALL_DEPENDENCY=ON -DCPACK_PACKAGE_DIRECTORY="${env:PACKAGE_DIR}" + - cmake -Bbuild "-H." -DCMAKE_BUILD_TYPE="$CMAKE_BUILD_TYPE" -G Ninja -DPACKAGE_WINDOWS_MSI=ON -DINSTALL_REQUIRED_SYSTEM_LIBRARIES=ON -DINSTALL_SHARED_LIBRARIES='flang;flangrti;libomp;zlib1;tiff;tiffxx;jpeg62;libpng16;lzma;openblas' -DINSTALL_OPENCV_COMPONENTS='core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab;ffmpeg' -DCMAKE_TOOLCHAIN_FILE="$env:VCPKG_DIR/scripts/buildsystems/vcpkg.cmake" -DVCPKG_TARGET_TRIPLET="$env:VCPKG_TRIPLET" -DCMAKE_SUPPRESS_REGENERATION=ON -DCMAKE_SKIP_PACKAGE_ALL_DEPENDENCY=ON -DCPACK_PACKAGE_DIRECTORY="${env:PACKAGE_DIR}" - ninja -C build build ubuntu-18.04: From f70c5bfb70652a55ab53dc8be398ab8f20ba42e0 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Thu, 16 May 2019 18:06:33 +0200 Subject: [PATCH 063/171] Fix wrong camera resolution check --- Src/View/CameraDevice.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Src/View/CameraDevice.cpp b/Src/View/CameraDevice.cpp index e30ca38d..b9bc69c3 100644 --- a/Src/View/CameraDevice.cpp +++ b/Src/View/CameraDevice.cpp @@ -35,7 +35,7 @@ CameraConfiguration CameraDevice::grabUICameraConfiguration() { std::string sf = ui->lineEdit_3->text().toStdString(); int x, y, f; x = (sx == "Default" ? -1 : std::stoi(sx)); - y = (sx == "Default" ? -1 : std::stoi(sy)); + y = (sy == "Default" ? -1 : std::stoi(sy)); f = (sf == "Default" ? -1 : std::stoi(sf)); CameraConfiguration conf(id, x, y, f, false, ""); From 2e48c17f507e0ff1cac0f11b959cd2ba18243cb5 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Thu, 16 May 2019 18:11:31 +0200 Subject: [PATCH 064/171] Make open camera widget saner --- Src/View/CameraDevice.cpp | 2 +- Src/View/CameraDevice.h | 2 +- Src/View/CameraDevice.ui | 317 ++++++++++++++++++-------------------- 3 files changed, 151 insertions(+), 170 deletions(-) diff --git a/Src/View/CameraDevice.cpp b/Src/View/CameraDevice.cpp index b9bc69c3..e32feab0 100644 --- a/Src/View/CameraDevice.cpp +++ b/Src/View/CameraDevice.cpp @@ -50,7 +50,7 @@ void CameraDevice::on_buttonBox_accepted() this->close(); } -void CameraDevice::on_pushButton_clicked() +void CameraDevice::on_showPreviewButton_clicked() { int id = ui->comboBox->currentIndex(); if (m_ximeaId != id) diff --git a/Src/View/CameraDevice.h b/Src/View/CameraDevice.h index 239360f3..97f46c19 100644 --- a/Src/View/CameraDevice.h +++ b/Src/View/CameraDevice.h @@ -24,7 +24,7 @@ class CameraDevice : public QWidget private Q_SLOTS: void on_buttonBox_accepted(); - void on_pushButton_clicked(); + void on_showPreviewButton_clicked(); void on_comboBox_currentIndexChanged(int index); diff --git a/Src/View/CameraDevice.ui b/Src/View/CameraDevice.ui index 71397814..b8555500 100644 --- a/Src/View/CameraDevice.ui +++ b/Src/View/CameraDevice.ui @@ -6,181 +6,162 @@ 0 0 - 489 - 329 + 480 + 320 - Form + Open camera - - - - 10 - 250 - 471 - 31 - - - - - - - Select Camera Device - - - - - - - - - - Preview - - - - - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - - 10 - 9 - 471 - 231 - - - - - - 0 - 0 - 471 - 231 - - - + + + - - - <No Image> - - + + + + + + 0 + 0 + + + + <No Image> + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + + + + + + + Select Camera Device + + + + + + + + + + Preview + + + + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + + + 0 + 0 + + + + Resolution: + + + + + + + + 0 + 0 + + + + + 100 + 16777215 + + + + Default + + + + + + + + 0 + 0 + + + + x + + + + + + + + 100 + 16777215 + + + + Default + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + FPS: + + + + + + + Default + + + + - - - - - - 10 - 290 - 471 - 31 - - - - - - - - 0 - 0 - - - - Resolution: - - - - - - - - 0 - 0 - - - - - 100 - 16777215 - - - - Default - - - - - - - - 0 - 0 - - - - x - - - - - - - - 100 - 16777215 - - - - Default - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 0 - 0 - - - - FPS: - - - - - - - Default - - - - - + + From 9da6c26fcd7ca1efe1d9fcac5dc7603d588141c5 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Thu, 16 May 2019 18:12:24 +0200 Subject: [PATCH 065/171] Update pylon5 toolchain detection --- Src/cmake/FindPylon5.cmake | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Src/cmake/FindPylon5.cmake b/Src/cmake/FindPylon5.cmake index 00628630..457e7f7c 100644 --- a/Src/cmake/FindPylon5.cmake +++ b/Src/cmake/FindPylon5.cmake @@ -20,26 +20,26 @@ find_path(Pylon5_INCLUDE_DIR pylon/PylonBase.h find_library(Pylon5_Base_LIBRARY NAMES - pylonbase - PylonBase_MD_VC120_v5_0 PylonBase_v5_1 + pylonbase + PylonBase_MD_VC120_v5_0 PylonBase_v5_1 PylonBase_v5_2 PATHS ${Pylon5_LIBRARY_DIR}) find_library(Pylon5_Utility_LIBRARY NAMES - pylonutility - PylonUtility_MD_VC120_v5_0 PylonUtility_v5_1 + pylonutility + PylonUtility_MD_VC120_v5_0 PylonUtility_v5_1 PylonUtility_v5_2 PATHS ${Pylon5_LIBRARY_DIR}) find_library(Pylon5_GenAPI_LIBRARY NAMES - GenApi_gcc_v3_0_Basler_pylon_v5_0 - GenApi_MD_VC120_v3_0_Basler_pylon_v5_0 GenApi_MD_VC141_v3_1_Basler_pylon_v5_1 + GenApi_gcc_v3_0_Basler_pylon_v5_0 + GenApi_MD_VC120_v3_0_Basler_pylon_v5_0 GenApi_MD_VC141_v3_1_Basler_pylon_v5_1 GenApi_MD_VC141_v3_1_Basler_pylon PATHS ${Pylon5_LIBRARY_DIR}) find_library(Pylon5_GCBase_LIBRARY NAMES - GCBase_gcc_v3_0_Basler_pylon_v5_0 - GCBase_MD_VC120_v3_0_Basler_pylon_v5_0 GCBase_MD_VC141_v3_1_Basler_pylon_v5_1 + GCBase_gcc_v3_0_Basler_pylon_v5_0 + GCBase_MD_VC120_v3_0_Basler_pylon_v5_0 GCBase_MD_VC141_v3_1_Basler_pylon_v5_1 GCBase_MD_VC141_v3_1_Basler_pylon PATHS ${Pylon5_LIBRARY_DIR}) include(FindPackageHandleStandardArgs) @@ -66,4 +66,4 @@ set_target_properties (Pylon5::GenAPI PROPERTIES INTERFACE_INCLUDE_DIRECTORIES $ add_library(Pylon5::GCBase UNKNOWN IMPORTED) set_target_properties (Pylon5::GCBase PROPERTIES IMPORTED_LOCATION ${Pylon5_GCBase_LIBRARY}) -set_target_properties (Pylon5::GCBase PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${Pylon5_INCLUDE_DIRS}) \ No newline at end of file +set_target_properties (Pylon5::GCBase PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${Pylon5_INCLUDE_DIRS}) From 2dbb8b5ee59b869151298ee27ce0ea8df332239f Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Fri, 17 May 2019 14:46:55 +0200 Subject: [PATCH 066/171] Generalize camera selection Preparation for support of different camera APIs --- Src/Controller/ControllerMainWindow.cpp | 1 - Src/Controller/ControllerMainWindow.h | 1 + Src/Model/ImageStream.cpp | 6 +- Src/Model/ImageStream.h | 1 + Src/View/CameraDevice.cpp | 156 +++++++++++++----------- Src/View/CameraDevice.h | 1 + Src/View/MainWindow.h | 1 + Src/main.cpp | 1 + Src/util/camera/base.h | 36 ++++++ Src/util/types.h | 21 ---- 10 files changed, 126 insertions(+), 99 deletions(-) create mode 100644 Src/util/camera/base.h diff --git a/Src/Controller/ControllerMainWindow.cpp b/Src/Controller/ControllerMainWindow.cpp index 9215c171..2d03f366 100644 --- a/Src/Controller/ControllerMainWindow.cpp +++ b/Src/Controller/ControllerMainWindow.cpp @@ -15,7 +15,6 @@ #include "GuiContext.h" #include "QPluginLoader" -#include "util/types.h" #include #include diff --git a/Src/Controller/ControllerMainWindow.h b/Src/Controller/ControllerMainWindow.h index 84e59595..f4cd8c01 100644 --- a/Src/Controller/ControllerMainWindow.h +++ b/Src/Controller/ControllerMainWindow.h @@ -14,6 +14,7 @@ #include "boost/filesystem.hpp" #include #include "util/types.h" +#include "util/camera/base.h" /** * The ControllerMainWindow class controlls the IView class MainWindow. diff --git a/Src/Model/ImageStream.cpp b/Src/Model/ImageStream.cpp index d48be68b..3e320a00 100644 --- a/Src/Model/ImageStream.cpp +++ b/Src/Model/ImageStream.cpp @@ -385,7 +385,7 @@ namespace BioTracker { */ explicit ImageStream3Camera(Config *cfg, CameraConfiguration conf) : ImageStream(0, cfg) - , m_capture(conf._id) + , m_capture(conf._selector.index) , m_fps(m_capture.get(CV_CAP_PROP_FPS)) { // Give the camera some extra time to get ready: // Somehow opening it on first try sometimes does not succeed. @@ -393,7 +393,7 @@ namespace BioTracker { // So, stubbornly try it a few times until it works. std::this_thread::sleep_for(std::chrono::milliseconds(1000)); - qDebug() << "\nStarting to record on camera no. " << conf._id; + qDebug() << "\nStarting to record on camera no. " << conf._selector.index; m_w = conf._width == -1 ? _cfg->CameraWidth : conf._width; m_h = conf._height == -1 ? _cfg->CameraHeight : conf._height; m_fps = conf._fps == -1 ? _cfg->RecordFPS : conf._fps; @@ -402,7 +402,7 @@ namespace BioTracker { int fails = 0; while (!m_capture.isOpened() && fails < 5) { - m_capture.open(conf._id); + m_capture.open(conf._selector.index); std::this_thread::sleep_for(std::chrono::milliseconds(1000)); fails++; } diff --git a/Src/Model/ImageStream.h b/Src/Model/ImageStream.h index af20825c..6c17284b 100644 --- a/Src/Model/ImageStream.h +++ b/Src/Model/ImageStream.h @@ -18,6 +18,7 @@ #include "util/ParamNames.h" // GUIPARAM::MediaType #include "util/types.h" +#include "util/camera/base.h" #include "util/Config.h" namespace BioTracker { diff --git a/Src/View/CameraDevice.cpp b/Src/View/CameraDevice.cpp index e32feab0..032d597d 100644 --- a/Src/View/CameraDevice.cpp +++ b/Src/View/CameraDevice.cpp @@ -3,20 +3,19 @@ #include "QCameraInfo" #include "util/types.h" +#include "util/camera/base.h" #include #include #include "opencv2/highgui/highgui.hpp" -CameraDevice::CameraDevice(QWidget *parent) : - QWidget(parent), - ui(new Ui::CameraDevice) +CameraDevice::CameraDevice(QWidget *parent) : QWidget(parent), + ui(new Ui::CameraDevice) { ui->setupUi(this); - m_ximeaId = -1; + m_ximeaId = -1; this->setAttribute(Qt::WA_DeleteOnClose); - listAllCameras(); } @@ -25,26 +24,25 @@ CameraDevice::~CameraDevice() delete ui; } -CameraConfiguration CameraDevice::grabUICameraConfiguration() { - int id = ui->comboBox->currentIndex(); - if (m_ximeaId == id) - id = CV_CAP_XIAPI; - - std::string sx = ui->lineEdit->text().toStdString(); - std::string sy = ui->lineEdit_2->text().toStdString(); - std::string sf = ui->lineEdit_3->text().toStdString(); - int x, y, f; - x = (sx == "Default" ? -1 : std::stoi(sx)); - y = (sy == "Default" ? -1 : std::stoi(sy)); - f = (sf == "Default" ? -1 : std::stoi(sf)); - - CameraConfiguration conf(id, x, y, f, false, ""); - return conf; +CameraConfiguration CameraDevice::grabUICameraConfiguration() +{ + auto camera_selector = ui->comboBox->currentData().value(); + + std::string sx = ui->lineEdit->text().toStdString(); + std::string sy = ui->lineEdit_2->text().toStdString(); + std::string sf = ui->lineEdit_3->text().toStdString(); + int x, y, f; + x = (sx == "Default" ? -1 : std::stoi(sx)); + y = (sy == "Default" ? -1 : std::stoi(sy)); + f = (sf == "Default" ? -1 : std::stoi(sf)); + + CameraConfiguration conf(camera_selector, x, y, f, false, ""); + return conf; } void CameraDevice::on_buttonBox_accepted() { - CameraConfiguration conf = grabUICameraConfiguration(); + CameraConfiguration conf = grabUICameraConfiguration(); Q_EMIT emitSelectedCameraDevice(conf); this->close(); @@ -52,69 +50,79 @@ void CameraDevice::on_buttonBox_accepted() void CameraDevice::on_showPreviewButton_clicked() { - int id = ui->comboBox->currentIndex(); - if (m_ximeaId != id) - { - m_capture.open(id); - } - else - { - id = CV_CAP_XIAPI; - m_capture.open(id); - } - CameraConfiguration conf = grabUICameraConfiguration(); - std::this_thread::sleep_for(std::chrono::milliseconds(1000)); - int fails = 0; - - while (!m_capture.isOpened() && fails < 5) { - m_capture.open(id); - std::this_thread::sleep_for(std::chrono::milliseconds(1000)); - fails++; - } - - if (conf._width != -1) m_capture.set(CV_CAP_PROP_FRAME_WIDTH, conf._width); - if (conf._height != -1) m_capture.set(CV_CAP_PROP_FRAME_HEIGHT, conf._height); - if (conf._fps != -1) m_capture.set(CV_CAP_PROP_FPS, conf._fps); - - if (!m_capture.isOpened()) { - //throw device_open_error(":("); - ui->label_NoImage->setText("Error loading camera"); - } - else - { - cv::Mat mat; - for (int i = 0; i < 10; i++) { - m_capture.grab(); - m_capture.retrieve(mat); - } - cv::Mat destination; - cv::resize(mat, destination, cv::Size(240, 180)); - QPixmap image = QPixmap::fromImage(QImage((unsigned char*)destination.data, destination.cols, destination.rows, QImage::Format_RGB888)); - ui->label_NoImage->setPixmap(image); - m_capture.release(); - } - + auto conf = grabUICameraConfiguration(); + + cv::Mat image; + switch (conf._selector.type) + { + case CameraType::OpenCV: + { + m_capture.open(conf._selector.index); + + for (auto num_tries = 0; !m_capture.isOpened() && num_tries < 50; ++num_tries) + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + + if (conf._width != -1) + m_capture.set(CV_CAP_PROP_FRAME_WIDTH, conf._width); + if (conf._height != -1) + m_capture.set(CV_CAP_PROP_FRAME_HEIGHT, conf._height); + if (conf._fps != -1) + m_capture.set(CV_CAP_PROP_FPS, conf._fps); + + if (!m_capture.isOpened()) + { + ui->label_NoImage->setText("Error loading camera"); + return; + } + + cv::Mat mat; + for (auto i = 0; i < 10; ++i) + { + m_capture.grab(); + m_capture.retrieve(mat); + } + + auto height = conf._height != -1 ? conf._height : ui->label_NoImage->height(); + auto ar = mat.rows ? static_cast(mat.cols) / mat.rows : 1; + auto width = conf._width != -1 ? conf._width : static_cast(height * ar); + + cv::Mat scaled; + cv::resize(mat, scaled, cv::Size{width, height}); + if (scaled.type() == CV_8UC1) + cv::cvtColor(scaled, scaled, cv::COLOR_GRAY2RGB); + + ui->label_NoImage->setPixmap(QPixmap::fromImage(QImage(scaled.data, scaled.cols, scaled.rows, static_cast(scaled.step1()), QImage::Format_RGB888))); + m_capture.release(); + break; + } + default: + throw std::logic_error("Missing preview implementation"); + } } void CameraDevice::on_comboBox_currentIndexChanged(int index) { } - void CameraDevice::listAllCameras() { - cameras = QCameraInfo::availableCameras(); - foreach (const QCameraInfo &cameraInfo, cameras) { - ui->comboBox->addItem(cameraInfo.description()); + cameras = QCameraInfo::availableCameras(); + for (int index = 0; index < cameras.size(); ++index) + { + ui->comboBox->addItem( + cameras[index].description(), + QVariant::fromValue(CameraSelector{CameraType::OpenCV, index})); } - //Try to find ximea cameras - cv::VideoCapture cap(CV_CAP_XIAPI); - if (cap.isOpened()) { - ui->comboBox->addItem("XIMEA default"); - m_ximeaId = cameras.size(); - std::cout << "XIMEA props: " << cap.get(CV_CAP_PROP_FRAME_WIDTH) << " " << cap.get(CV_CAP_PROP_FRAME_HEIGHT) << endl; - } + { + cv::VideoCapture ximea_camera(CV_CAP_XIAPI); + if (ximea_camera.isOpened()) + { + ui->comboBox->addItem( + "XIMEA default", + QVariant::fromValue(CameraSelector{CameraType::OpenCV, CV_CAP_XIAPI})); + } + } } void CameraDevice::on_buttonBox_rejected() diff --git a/Src/View/CameraDevice.h b/Src/View/CameraDevice.h index 97f46c19..4bbc8b5a 100644 --- a/Src/View/CameraDevice.h +++ b/Src/View/CameraDevice.h @@ -7,6 +7,7 @@ #include "QCameraViewfinder" #include "QPointer" #include "util/types.h" +#include "util/camera/base.h" #include namespace Ui { diff --git a/Src/View/MainWindow.h b/Src/View/MainWindow.h index 831789e3..e8f7357c 100644 --- a/Src/View/MainWindow.h +++ b/Src/View/MainWindow.h @@ -12,6 +12,7 @@ #include "QGraphicsObject" #include "View/GraphicsView.h" #include "util/types.h" +#include "util/camera/base.h" #include "SettingsWindow.h" #include #include "QWizard" diff --git a/Src/main.cpp b/Src/main.cpp index f9034afa..beb06f12 100644 --- a/Src/main.cpp +++ b/Src/main.cpp @@ -9,6 +9,7 @@ #include #include "Model/MediaPlayerStateMachine/PlayerParameters.h" #include "util/types.h" +#include "util/camera/base.h" #include "util/CLIcommands.h" #include "Interfaces/IModel/IModelTrackedComponent.h" diff --git a/Src/util/camera/base.h b/Src/util/camera/base.h new file mode 100644 index 00000000..a2d8f0bf --- /dev/null +++ b/Src/util/camera/base.h @@ -0,0 +1,36 @@ +#pragma once + +#include + +#include + +enum class CameraType +{ + OpenCV, +}; + +struct CameraSelector +{ + CameraType type; + int index; +}; + +Q_DECLARE_METATYPE(CameraSelector); + +class CameraConfiguration +{ +public: + CameraConfiguration() : + _selector{CameraType::OpenCV, 0}, _width(-1), _height(-1), _fps(30), _recordInput(false), _fourcc("X264") { + } + CameraConfiguration(CameraSelector p_selector, int p_width, int p_height, double p_fps, bool p_recordInput, std::string p_fourcc) : + _selector(p_selector), _width(p_width), _height(p_height), _fps(p_fps), _recordInput(p_recordInput), _fourcc(p_fourcc) { + } + + CameraSelector _selector; + int _width; + int _height; + bool _recordInput; + double _fps; + std::string _fourcc; +}; diff --git a/Src/util/types.h b/Src/util/types.h index 872a452e..4d303447 100644 --- a/Src/util/types.h +++ b/Src/util/types.h @@ -40,24 +40,3 @@ const std::vector exporterList = { std::string("Serialize"), std::string("Json") }; - -class CameraConfiguration -{ -public: - CameraConfiguration() : - _id(0), _width(-1), _height(-1), _fps(30), _recordInput(false), _fourcc("X264") { - } - CameraConfiguration(int p_id, int p_width, int p_height, double p_fps, bool p_recordInput, std::string p_fourcc) : - _id(p_id), _width(p_width), _height(p_height), _fps(p_fps), _recordInput(p_recordInput), _fourcc(p_fourcc) { - } - - int _id; - int _width; - int _height; - bool _recordInput; - double _fps; - std::string _fourcc; -}; - - - From 103c3ee687a2c1260da06068049e4433925705c1 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Fri, 17 May 2019 15:07:44 +0200 Subject: [PATCH 067/171] Require at least Pylon 5.2 for pylon support --- Src/cmake/FindPylon5.cmake | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Src/cmake/FindPylon5.cmake b/Src/cmake/FindPylon5.cmake index 457e7f7c..b0da309c 100644 --- a/Src/cmake/FindPylon5.cmake +++ b/Src/cmake/FindPylon5.cmake @@ -21,25 +21,25 @@ find_path(Pylon5_INCLUDE_DIR pylon/PylonBase.h find_library(Pylon5_Base_LIBRARY NAMES pylonbase - PylonBase_MD_VC120_v5_0 PylonBase_v5_1 PylonBase_v5_2 + PylonBase_v5_2 PATHS ${Pylon5_LIBRARY_DIR}) find_library(Pylon5_Utility_LIBRARY NAMES pylonutility - PylonUtility_MD_VC120_v5_0 PylonUtility_v5_1 PylonUtility_v5_2 + PylonUtility_v5_2 PATHS ${Pylon5_LIBRARY_DIR}) find_library(Pylon5_GenAPI_LIBRARY NAMES - GenApi_gcc_v3_0_Basler_pylon_v5_0 - GenApi_MD_VC120_v3_0_Basler_pylon_v5_0 GenApi_MD_VC141_v3_1_Basler_pylon_v5_1 GenApi_MD_VC141_v3_1_Basler_pylon + GenApi_gcc_v3_1_Basler_pylon + GenApi_MD_VC141_v3_1_Basler_pylon PATHS ${Pylon5_LIBRARY_DIR}) find_library(Pylon5_GCBase_LIBRARY NAMES - GCBase_gcc_v3_0_Basler_pylon_v5_0 - GCBase_MD_VC120_v3_0_Basler_pylon_v5_0 GCBase_MD_VC141_v3_1_Basler_pylon_v5_1 GCBase_MD_VC141_v3_1_Basler_pylon + GCBase_gcc_v3_1_Basler_pylon + GCBase_MD_VC141_v3_1_Basler_pylon PATHS ${Pylon5_LIBRARY_DIR}) include(FindPackageHandleStandardArgs) From 26c884c53046dc4b66c46efb67b76abd4389ba23 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Fri, 17 May 2019 15:37:42 +0200 Subject: [PATCH 068/171] How about less use-after-free UB? If anyone cares why this is UB : 1. as() creates a temporary 2. .c_str() returns a pointer into memory owned by the temporary 3. the temporary's lifetime ends and it is destroyed 4. the pointer into now freed memoroy is passed to QString() Also, don't make non-void functions without returning anything... --- Src/util/CLIcommands.h | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Src/util/CLIcommands.h b/Src/util/CLIcommands.h index f47154c0..5444ad0c 100644 --- a/Src/util/CLIcommands.h +++ b/Src/util/CLIcommands.h @@ -19,7 +19,7 @@ class CLI { public: - static int optionParser(int ac, char* av[], Config* cfg) + static void optionParser(int ac, char* av[], Config* cfg) { //Taken from http://www.boost.org/doc/libs/1_64_0/libs/program_options/example/option_groups.cpp using namespace boost; @@ -62,13 +62,16 @@ class CLI { exit(0); } if (vm.count("usePlugin")) { - cfg->UsePlugins = QString(vm["usePlugin"].as().c_str()); + auto str = vm["usePlugin"].as(); + cfg->UsePlugins = QString(str.c_str()); } if (vm.count("video")) { - cfg->LoadVideo = QString(vm["video"].as().c_str()); + auto str = vm["video"].as(); + cfg->LoadVideo = QString(str.c_str()); } if (vm.count("cfg")) { - cfg->CfgCustomLocation = QString(vm["cfg"].as().c_str()); + auto str = vm["cfg"].as(); + cfg->CfgCustomLocation = QString(str.c_str()); } } catch (std::exception& e) { From cf7aae20b337e5377563a16059f820d807f0e419 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Fri, 17 May 2019 15:47:12 +0200 Subject: [PATCH 069/171] Make camera preview color correct OpenCV 3-channel color input is *always* BGR. --- Src/View/CameraDevice.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Src/View/CameraDevice.cpp b/Src/View/CameraDevice.cpp index 032d597d..124d5796 100644 --- a/Src/View/CameraDevice.cpp +++ b/Src/View/CameraDevice.cpp @@ -90,6 +90,7 @@ void CameraDevice::on_showPreviewButton_clicked() cv::resize(mat, scaled, cv::Size{width, height}); if (scaled.type() == CV_8UC1) cv::cvtColor(scaled, scaled, cv::COLOR_GRAY2RGB); + cv::cvtColor(scaled, scaled, cv::COLOR_BGR2RGB); ui->label_NoImage->setPixmap(QPixmap::fromImage(QImage(scaled.data, scaled.cols, scaled.rows, static_cast(scaled.step1()), QImage::Format_RGB888))); m_capture.release(); From 65f32d44cf053913a76b27a5e748d198744b6a20 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Fri, 17 May 2019 16:10:12 +0200 Subject: [PATCH 070/171] Generalize camera image stream Prepare for different cmaera APIs --- Src/Model/ImageStream.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Src/Model/ImageStream.cpp b/Src/Model/ImageStream.cpp index 3e320a00..cce50a8f 100644 --- a/Src/Model/ImageStream.cpp +++ b/Src/Model/ImageStream.cpp @@ -375,7 +375,7 @@ namespace BioTracker { /*********************************************************/ - class ImageStream3Camera : public ImageStream { + class ImageStream3OpenCVCamera : public ImageStream { public: /** * @throw file_not_found when device does not exists @@ -383,7 +383,7 @@ namespace BioTracker { * @brief ImageStreamCamera * @param device_id according to the VideoCapture class of OpenCV */ - explicit ImageStream3Camera(Config *cfg, CameraConfiguration conf) + explicit ImageStream3OpenCVCamera(Config *cfg, CameraConfiguration conf) : ImageStream(0, cfg) , m_capture(conf._selector.index) , m_fps(m_capture.get(CV_CAP_PROP_FPS)) { @@ -500,7 +500,12 @@ namespace BioTracker { std::shared_ptr make_ImageStream3Camera(Config *cfg, CameraConfiguration conf) { try { - return std::make_shared(cfg, conf); + switch (conf._selector.type) { + case CameraType::OpenCV: + return std::make_shared(cfg, conf); + default: + throw std::logic_error("Missing image stream implementation"); + } } catch (const device_open_error &) { return make_ImageStream3NoMedia(); From 173603481173f72bf4895b300a805dc1f00cb98e Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Mon, 20 May 2019 13:12:00 +0200 Subject: [PATCH 071/171] Misc --- Src/CMakeLists.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index 39cc6d8a..24b63bb4 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -69,9 +69,6 @@ if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") include(WinDeployQt5) deploy_qt5(${target} DESTINATION .) - - #boost_program_options;boost_filesystem;bt_interfaces; - #calib3d;videoio;imgcodecs;imgproc;core; set(INSTALL_CUDA_COMPONENTS "" CACHE STRING "CUDA components to install") locate_cuda(shared_libraries COMPONENTS ${INSTALL_CUDA_COMPONENTS}) From b35679cea70b5f72a45adfcf44f6926a5a43991d Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Mon, 20 May 2019 13:12:34 +0200 Subject: [PATCH 072/171] Fix using Visual Studio generator --- Src/CMakeLists.txt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index 24b63bb4..2758c590 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -67,8 +67,11 @@ if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") include(InstallRequiredSystemLibraries) endif() - include(WinDeployQt5) - deploy_qt5(${target} DESTINATION .) + if(NOT CMAKE_GENERATOR MATCHES "Visual Studio") + include(WinDeployQt5) + deploy_qt5(${target} DESTINATION .) + endif() + set(INSTALL_CUDA_COMPONENTS "" CACHE STRING "CUDA components to install") locate_cuda(shared_libraries COMPONENTS ${INSTALL_CUDA_COMPONENTS}) From 9a1d7831638db0a9043118fa61afc931c0528c90 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Mon, 20 May 2019 16:08:55 +0200 Subject: [PATCH 073/171] Fix memory leak Thanks to David for debugging --- Src/Model/MediaPlayer.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Src/Model/MediaPlayer.cpp b/Src/Model/MediaPlayer.cpp index 8faa4496..f5f24548 100644 --- a/Src/Model/MediaPlayer.cpp +++ b/Src/Model/MediaPlayer.cpp @@ -279,7 +279,8 @@ void MediaPlayer::receivePlayerParameters(playerParameters* param) { cv::cvtColor(*mat, *mat, CV_BGR2RGB); //16898 us cv::cvtColor(*mat, *mat, CV_BGR2RGB); m_videoc->add(mat,1); - + + delete pix; } } else From e2842c7aec649d9446069cc61d9f05647e26bd94 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Mon, 20 May 2019 16:10:19 +0200 Subject: [PATCH 074/171] Don't call bgr->rgb conversion twice --- Src/Model/MediaPlayer.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Src/Model/MediaPlayer.cpp b/Src/Model/MediaPlayer.cpp index f5f24548..fe5fe3ae 100644 --- a/Src/Model/MediaPlayer.cpp +++ b/Src/Model/MediaPlayer.cpp @@ -277,7 +277,6 @@ void MediaPlayer::receivePlayerParameters(playerParameters* param) { std::shared_ptr mat = std::make_shared(image.height(), image.width(), CV_8UC(image.depth()/8), (uchar*)image.bits(), image.bytesPerLine()); //1us cv::cvtColor(*mat, *mat, CV_BGR2RGB); //16898 us - cv::cvtColor(*mat, *mat, CV_BGR2RGB); m_videoc->add(mat,1); delete pix; From f8f3c43a9d24987458a48d27704565bd51483dd5 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Tue, 21 May 2019 13:49:52 +0200 Subject: [PATCH 075/171] Improve media player performance --- Src/Model/MediaPlayer.cpp | 34 +++++++++++++++++----------------- Src/Model/MediaPlayer.h | 2 ++ 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/Src/Model/MediaPlayer.cpp b/Src/Model/MediaPlayer.cpp index fe5fe3ae..c6be7a8e 100644 --- a/Src/Model/MediaPlayer.cpp +++ b/Src/Model/MediaPlayer.cpp @@ -256,30 +256,30 @@ void MediaPlayer::receivePlayerParameters(playerParameters* param) { } if (m_recd) { - //reopenVideoWriter(); //4us - QRectF rscene = m_gv->sceneRect(); //0us - QRectF rview = m_gv->rect(); //0us - QPixmap *pix; + QRectF rscene = m_gv->sceneRect(); + QRectF rview = m_gv->rect(); + QSize size; if (!m_recordScaled) - pix = new QPixmap(rscene.size().toSize()); //17us + size = rscene.size().toSize(); else - pix = new QPixmap(rview.size().toSize()); //17us - - QPainter *paint = new QPainter(pix); //21us + size = rview.size().toSize(); + if (m_image.size() != size) { + m_image = QImage(size, QImage::Format_RGB32); + if (m_painter.isActive()) + m_painter.end(); + m_painter.begin(&m_image); + } if(!m_recordScaled) - m_gv->scene()->render(paint); //8544us + m_gv->scene()->render(&m_painter); else - m_gv->render(paint);// , m_gv->scene()->sceneRect(), QRect());// , Qt::AspectRatioMode::IgnoreAspectRatio); - - QImage image = pix->toImage(); //8724us - int x = image.format(); //0us - std::shared_ptr mat = std::make_shared(image.height(), image.width(), CV_8UC(image.depth()/8), (uchar*)image.bits(), image.bytesPerLine()); //1us + m_gv->render(&m_painter); - cv::cvtColor(*mat, *mat, CV_BGR2RGB); //16898 us - m_videoc->add(mat,1); + auto view = cv::Mat(m_image.height(), m_image.width(), CV_8UC(m_image.depth() / 8), m_image.bits(), m_image.bytesPerLine()); - delete pix; + auto copy = std::make_shared(view.clone()); + cv::cvtColor(*copy, *copy, CV_BGR2RGB); + m_videoc->add(copy); } } else diff --git a/Src/Model/MediaPlayer.h b/Src/Model/MediaPlayer.h index 7143a23a..dd05ebf9 100644 --- a/Src/Model/MediaPlayer.h +++ b/Src/Model/MediaPlayer.h @@ -201,6 +201,8 @@ class MediaPlayer : public IModel { bool m_useCuda; GraphicsView *m_gv; + QImage m_image; + QPainter m_painter; std::shared_ptr m_videoWriter; std::shared_ptr m_videoc; From 80afc55ec674ea11f2aad87106619d0f784cf858 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Tue, 21 May 2019 16:12:26 +0200 Subject: [PATCH 076/171] Delete old camera stream before opening new one --- .../MediaPlayerStateMachine/MediaPlayerStateMachine.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Src/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.cpp b/Src/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.cpp index 9b5fe35b..d74d62de 100644 --- a/Src/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.cpp +++ b/Src/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.cpp @@ -77,6 +77,11 @@ void MediaPlayerStateMachine::receiveLoadPictures(std::vectorchangeImageStream(m_stream); + } + m_stream = BioTracker::Core::make_ImageStream3Camera(_cfg, conf); m_PlayerParameters->m_TotalNumbFrames = m_stream->numFrames(); From b20abffa31f79b7116b4ed868f2106fc69565377 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Tue, 21 May 2019 16:15:43 +0200 Subject: [PATCH 077/171] Add ImageStream backend for Baseler cameras via the Pylon API --- Src/CMakeLists.txt | 11 +++ Src/Model/ImageStream.cpp | 136 ++++++++++++++++++++++++++++++++++++++ Src/View/CameraDevice.cpp | 52 +++++++++++++++ Src/util/camera/base.h | 3 + Src/util/camera/pylon.cpp | 31 +++++++++ Src/util/camera/pylon.h | 14 ++++ 6 files changed, 247 insertions(+) create mode 100644 Src/util/camera/pylon.cpp create mode 100644 Src/util/camera/pylon.h diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index 2758c590..f1ed4ceb 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -13,6 +13,10 @@ VSSourceGroups(${CMAKE_CURRENT_LIST_DIR}) add_definitions(-DBIORACKER_GIT_HASH="${GIT_HASH}") add_definitions(-DBIOTRACKER_GIT_TAG="${GIT_TAG}") +if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup") +endif() + set(target BioTracker) add_executable (${target}) set_target_properties(${target} PROPERTIES OUTPUT_NAME BioTracker) @@ -187,5 +191,12 @@ PRIVATE "View/Utility/Tracer.cpp" ) +if(WITH_PYLON5) + target_sources(${target} + PRIVATE + "util/camera/pylon.cpp" + ) +endif() + diff --git a/Src/Model/ImageStream.cpp b/Src/Model/ImageStream.cpp index cce50a8f..c6387921 100644 --- a/Src/Model/ImageStream.cpp +++ b/Src/Model/ImageStream.cpp @@ -5,6 +5,7 @@ #include // std::invalid_argument #include #include +#include #include "util/Exceptions.h" #include "QSharedPointer" @@ -14,6 +15,12 @@ #include "Controller/IControllerCfg.h" +#if HAS_PYLON +#include "util/camera/pylon.h" +#include +#endif +#include + namespace BioTracker { namespace Core { @@ -477,6 +484,131 @@ namespace BioTracker { bool m_recording; }; +#if HAS_PYLON + /*********************************************************/ + class ImageStream3PylonCamera : public ImageStream { + public: + explicit ImageStream3PylonCamera(Config* cfg, CameraConfiguration conf) + : ImageStream(0, cfg) + , m_camera(getPylonDevice(conf._selector.index), Pylon::Cleanup_Delete) + { + m_w = conf._width == -1 ? _cfg->CameraWidth : conf._width; + m_h = conf._height == -1 ? _cfg->CameraHeight : conf._height; + m_fps = conf._fps == -1 ? _cfg->RecordFPS : conf._fps; + + m_camera.MaxNumBuffer = 1; + m_camera.Open(); + + if (!m_camera.IsOpen()) { + qWarning() << "Unable to open camera!"; + throw device_open_error("Error loading camera"); + } + + GenApi::CBooleanPtr(m_camera.GetNodeMap().GetNode("AcquisitionFrameRateEnable"))->SetValue(1); + + setFrameRate(m_fps); + auto const actual_fps = getFrameRate(); + qInfo() << "Actual framerate:" << actual_fps; + if (std::abs(actual_fps - m_fps) > 0.1) { + throw device_open_error("Error setting framerate"); + } + + qDebug() << "\nStarting to record on camera " << m_camera.GetDeviceInfo().GetFriendlyName(); + m_camera.StartGrabbing(Pylon::GrabStrategy_LatestImages, Pylon::GrabLoop_ProvidedByUser); + nextFrame_impl(); + + m_recording = false; + m_encoder = std::make_shared(m_fps, _cfg); + } + GuiParam::MediaType type() const override + { + return GuiParam::MediaType::Camera; + } + + size_t numFrames() const override + { + return (std::numeric_limits::max)(); + } + + bool toggleRecord() override + { + if (!m_camera.IsOpen()) { + return false; + } + m_recording = m_encoder->toggle(m_w, m_h, m_fps); + + return m_recording; + } + + double fps() const override + { + return m_fps; + } + + std::string currentFilename() const override + { + return std::string(m_camera.GetDeviceInfo().GetFriendlyName()); + } + + private: + + bool nextFrame_impl() override + { + Pylon::CGrabResultPtr grabbed; + for (auto i = 0; i < m_frame_stride; ++i) + m_camera.RetrieveResult(100, grabbed, Pylon::TimeoutHandling_Return); + + if (!grabbed->GrabSucceeded()) { + qCritical() << "Unable to grab frame:" << grabbed->GetErrorDescription(); + return false; + } + + auto view = toOpenCV(grabbed); + auto scaled = std::make_shared(); + cv::resize(view, *scaled, cv::Size{m_w, m_h}); + if (scaled->type() == CV_8UC1) + cv::cvtColor(*scaled, *scaled, cv::COLOR_GRAY2BGR); + set_current_frame(scaled); + if (m_recording && m_encoder) + m_encoder->add(scaled); + + return !scaled->empty(); + } + + bool setFrameNumber_impl(size_t) override + { + return false; + } + + double getFrameRate() + { + if (m_camera.IsUsb()) { + return GenApi::CFloatPtr(m_camera.GetNodeMap().GetNode("AcquisitionFrameRate"))->GetValue(); + } + + throw std::logic_error("Unsupported device class"); + } + + void setFrameRate(double value) + { + if (m_camera.IsUsb()) { + GenApi::CFloatPtr(m_camera.GetNodeMap().GetNode("AcquisitionFrameRate")) ->SetValue(value); + } else { + throw std::logic_error("Unsupported camera type"); + } + } + + Pylon::PylonAutoInitTerm m_pylon; + Pylon::CInstantCamera m_camera; + double m_fps; + int m_w; + int m_h; + bool m_recording; + + std::shared_ptr m_encoder; + }; +#endif + /*********************************************************/ @@ -503,6 +635,10 @@ namespace BioTracker { switch (conf._selector.type) { case CameraType::OpenCV: return std::make_shared(cfg, conf); +#if HAS_PYLON + case CameraType::Pylon: + return std::make_shared(cfg, conf); +#endif default: throw std::logic_error("Missing image stream implementation"); } diff --git a/Src/View/CameraDevice.cpp b/Src/View/CameraDevice.cpp index 124d5796..d8391415 100644 --- a/Src/View/CameraDevice.cpp +++ b/Src/View/CameraDevice.cpp @@ -4,6 +4,9 @@ #include "QCameraInfo" #include "util/types.h" #include "util/camera/base.h" +#if HAS_PYLON +#include "util/camera/pylon.h" +#endif #include #include #include "opencv2/highgui/highgui.hpp" @@ -96,6 +99,38 @@ void CameraDevice::on_showPreviewButton_clicked() m_capture.release(); break; } +#if HAS_PYLON + case CameraType::Pylon: + { + Pylon::PylonAutoInitTerm pylon; + auto camera = Pylon::CInstantCamera{getPylonDevice(conf._selector.index)}; + camera.Open(); + for (auto num_tries = 0; !camera.IsOpen() && num_tries < 50; ++num_tries) + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + + if (!camera.IsOpen()) + { + ui->label_NoImage->setText("Error loading camera"); + return; + } + + Pylon::CGrabResultPtr grab_result; + camera.GrabOne(5000, grab_result); + auto view = toOpenCV(grab_result); + + auto height = conf._height != -1 ? conf._height : ui->label_NoImage->height(); + auto ar = view.rows ? static_cast(view.cols) / view.rows : 1; + auto width = conf._width != -1 ? conf._width : static_cast(height * ar); + + cv::Mat scaled; + cv::resize(view, scaled, cv::Size{width, height}); + if (scaled.type() == CV_8UC1) + cv::cvtColor(scaled, scaled, cv::COLOR_GRAY2RGB); + + ui->label_NoImage->setPixmap(QPixmap::fromImage(QImage(scaled.data, scaled.cols, scaled.rows, static_cast(scaled.step1()), QImage::Format_RGB888))); + break; + } +#endif default: throw std::logic_error("Missing preview implementation"); } @@ -124,6 +159,23 @@ void CameraDevice::listAllCameras() QVariant::fromValue(CameraSelector{CameraType::OpenCV, CV_CAP_XIAPI})); } } + +#if HAS_PYLON + { + Pylon::PylonAutoInitTerm pylon; + + auto &factory = Pylon::CTlFactory::GetInstance(); + Pylon::DeviceInfoList_t devices; + factory.EnumerateDevices(devices); + + for (int index = 0; index < devices.size(); ++index) + { + ui->comboBox->addItem( + QString{devices[index].GetFriendlyName()}, + QVariant::fromValue(CameraSelector{CameraType::Pylon, index})); + } + } +#endif } void CameraDevice::on_buttonBox_rejected() diff --git a/Src/util/camera/base.h b/Src/util/camera/base.h index a2d8f0bf..7d28620f 100644 --- a/Src/util/camera/base.h +++ b/Src/util/camera/base.h @@ -7,6 +7,9 @@ enum class CameraType { OpenCV, +#if HAS_PYLON + Pylon, +#endif }; struct CameraSelector diff --git a/Src/util/camera/pylon.cpp b/Src/util/camera/pylon.cpp new file mode 100644 index 00000000..94b0caad --- /dev/null +++ b/Src/util/camera/pylon.cpp @@ -0,0 +1,31 @@ +#include "util/camera/pylon.h" + +#if HAS_PYLON + +Pylon::IPylonDevice* getPylonDevice(int index) +{ + Pylon::PylonAutoInitTerm pylon; + auto& factory = Pylon::CTlFactory::GetInstance(); + Pylon::DeviceInfoList_t devices; + factory.EnumerateDevices(devices); + if (0 <= index && index < devices.size()) + return factory.CreateDevice(devices[index]); + throw std::out_of_range("No such Pylon camera available"); +} + +cv::Mat toOpenCV(Pylon::CGrabResultPtr image) +{ + return { + cv::Size{static_cast(image->GetWidth()), static_cast(image->GetHeight())}, + [](Pylon::EPixelType type){ + switch (type) { + case Pylon::PixelType_Mono8: + return CV_8UC1; + default: + throw std::logic_error("Pixel type support not implemented"); + } + }(image->GetPixelType()), + image->GetBuffer() + }; +} +#endif diff --git a/Src/util/camera/pylon.h b/Src/util/camera/pylon.h new file mode 100644 index 00000000..fda65020 --- /dev/null +++ b/Src/util/camera/pylon.h @@ -0,0 +1,14 @@ +#pragma once + +#if HAS_PYLON + +#include "util/camera/base.h" + +#include +#include +#include + +Pylon::IPylonDevice* getPylonDevice(int index); +cv::Mat toOpenCV(Pylon::CGrabResultPtr image); + +#endif From 06117757490b9c94240f0aebdd8d9cb24c7a0dfa Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Tue, 21 May 2019 16:26:42 +0200 Subject: [PATCH 078/171] Add CI/CD job for building windows package with pylon support --- .gitlab-ci.yml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ba2c880a..b3e608ec 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -85,6 +85,23 @@ build windows: - $env:PATH += ";${env:VCPKG_INSTALL_DIR}/bin" - $env:PATH += ";$(resolve-path vendor/biotracker-interfaces/bin)" +build windows[pylon5]: + extends: .build windows + variables: + <<: [ *release, *pylon5 ] + before_script: + - . $Profile + - *msvc15_9 + - GitLab-Fetch-Artifacts bioroboticslab%2Fbiotracker%2Finterfaces master package%20windows + - CMake-Integrate-Package biotracker-interfaces + - GitLab-Fetch-Artifacts bioroboticslab%2Fbiotracker%2Futility master package%20windows + - CMake-Integrate-Package biotracker-utility + - GitLab-Fetch-Artifacts bioroboticslab%2Fbiotracker%2Fbehavior_loader master package%20windows + - CMake-Integrate-Package robofish-behavior_loader + - $env:PACKAGE_DIR = ("${env:TMP}/pkg" -Replace "\\","/") + - $env:PATH += ";${env:VCPKG_INSTALL_DIR}/bin" + - $env:PATH += ";$(resolve-path vendor/biotracker-interfaces/bin)" + package ubuntu-18.04: extends: .ubuntu-18.04 dependencies: @@ -127,3 +144,12 @@ package windows: - $env:PACKAGE_DIR = ("${env:TMP}/pkg" -Replace "\\","/") - $env:PATH += ";${env:VCPKG_INSTALL_DIR}/bin" - $env:PATH += ";$(resolve-path vendor/biotracker-interfaces/bin)" + +package windows[pylon5]: + extends: .package windows + dependencies: + - build windows[pylon5] + before_script: + - $env:PACKAGE_DIR = ("${env:TMP}/pkg" -Replace "\\","/") + - $env:PATH += ";${env:VCPKG_INSTALL_DIR}/bin" + - $env:PATH += ";$(resolve-path vendor/biotracker-interfaces/bin)" From caa1867f3a6d27f8f1aebe771f317ba5c0966c54 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Tue, 21 May 2019 16:51:37 +0200 Subject: [PATCH 079/171] Fix enabling pylon support via environmental variable --- Src/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index f1ed4ceb..f0e3b905 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -33,7 +33,7 @@ find_package(Boost REQUIRED system filesystem chrono thread timer program_option target_include_directories(${target} PUBLIC ${Boost_INCLUDE_DIRS}) target_link_libraries(${target} ${Boost_LIBRARIES}) -option(WITH_PYLON5 "Support Pylon 5 cameras" OFF) +option(WITH_PYLON5 "Support Pylon 5 cameras" $ENV{WITH_PYLON5}) if(WITH_PYLON5) find_package(Pylon5) if(Pylon5_FOUND) From b142218a58c8356ffe058ed1b3c996403e28f449 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Fri, 24 May 2019 12:00:38 +0200 Subject: [PATCH 080/171] Remove superfluous boost dependencies, fix missing deployment of boost shared libraries --- .gitlab-ci.yml | 2 +- Src/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b3e608ec..4f9f04f8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -52,7 +52,7 @@ stages: - build expire_in: 1 day script: - - cmake -Bbuild "-H." -DCMAKE_BUILD_TYPE="$CMAKE_BUILD_TYPE" -G Ninja -DPACKAGE_WINDOWS_MSI=ON -DINSTALL_REQUIRED_SYSTEM_LIBRARIES=ON -DINSTALL_SHARED_LIBRARIES='flang;flangrti;libomp;zlib1;tiff;tiffxx;jpeg62;libpng16;lzma;openblas' -DINSTALL_OPENCV_COMPONENTS='core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab;ffmpeg' -DCMAKE_TOOLCHAIN_FILE="$env:VCPKG_DIR/scripts/buildsystems/vcpkg.cmake" -DVCPKG_TARGET_TRIPLET="$env:VCPKG_TRIPLET" -DCMAKE_SUPPRESS_REGENERATION=ON -DCMAKE_SKIP_PACKAGE_ALL_DEPENDENCY=ON -DCPACK_PACKAGE_DIRECTORY="${env:PACKAGE_DIR}" + - cmake -Bbuild "-H." -DCMAKE_BUILD_TYPE="$CMAKE_BUILD_TYPE" -G Ninja -DPACKAGE_WINDOWS_MSI=ON -DINSTALL_REQUIRED_SYSTEM_LIBRARIES=ON -DINSTALL_SHARED_LIBRARIES='flang;flangrti;libomp;zlib1;tiff;tiffxx;jpeg62;libpng16;lzma;openblas;boost_filesystem-vc141-mt-x64-1_68;boost_program_options-vc141-mt-x64-1_68' -DINSTALL_OPENCV_COMPONENTS='core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab;ffmpeg' -DCMAKE_TOOLCHAIN_FILE="$env:VCPKG_DIR/scripts/buildsystems/vcpkg.cmake" -DVCPKG_TARGET_TRIPLET="$env:VCPKG_TRIPLET" -DCMAKE_SUPPRESS_REGENERATION=ON -DCMAKE_SKIP_PACKAGE_ALL_DEPENDENCY=ON -DCPACK_PACKAGE_DIRECTORY="${env:PACKAGE_DIR}" - ninja -C build build ubuntu-18.04: diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index f0e3b905..ea82d883 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -29,7 +29,7 @@ target_link_libraries (${target} robofish-behavior_loader) find_package(Qt5 REQUIRED COMPONENTS Core Gui Xml Network Widgets Multimedia MultimediaWidgets OpenGL) target_link_libraries (${target} Qt5::Core Qt5::Gui Qt5::Xml Qt5::Network Qt5::Widgets Qt5::Multimedia Qt5::MultimediaWidgets Qt5::OpenGL) -find_package(Boost REQUIRED system filesystem chrono thread timer program_options) +find_package(Boost REQUIRED filesystem program_options) target_include_directories(${target} PUBLIC ${Boost_INCLUDE_DIRS}) target_link_libraries(${target} ${Boost_LIBRARIES}) From 3272cf3205e1e215feddfaab2ce071ae3ae9f490 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Fri, 24 May 2019 12:21:41 +0200 Subject: [PATCH 081/171] Enabling Pylon support should be a hard dependency --- Src/CMakeLists.txt | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index ea82d883..46b590af 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -35,12 +35,9 @@ target_link_libraries(${target} ${Boost_LIBRARIES}) option(WITH_PYLON5 "Support Pylon 5 cameras" $ENV{WITH_PYLON5}) if(WITH_PYLON5) - find_package(Pylon5) - if(Pylon5_FOUND) - message("Pylon5 support enabled") - target_compile_definitions(${target} PRIVATE HAS_PYLON=1) - target_link_libraries(${target} Pylon5::Base Pylon5::Utility Pylon5::GenAPI Pylon5::GCBase) - endif() + find_package(Pylon5 REQUIRED) + target_compile_definitions(${target} PRIVATE HAS_PYLON=1) + target_link_libraries(${target} Pylon5::Base Pylon5::Utility Pylon5::GenAPI Pylon5::GCBase) endif() IF("${HMNVLibDir}" MATCHES "Not Found") From 170e88aa42e5cca5db9f1128c319cc42b452b9ac Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Fri, 24 May 2019 12:25:08 +0200 Subject: [PATCH 082/171] Fix pylon include --- Src/util/camera/pylon.h | 1 - 1 file changed, 1 deletion(-) diff --git a/Src/util/camera/pylon.h b/Src/util/camera/pylon.h index fda65020..59cac525 100644 --- a/Src/util/camera/pylon.h +++ b/Src/util/camera/pylon.h @@ -6,7 +6,6 @@ #include #include -#include Pylon::IPylonDevice* getPylonDevice(int index); cv::Mat toOpenCV(Pylon::CGrabResultPtr image); From b15380e63f81b4c9925027fe01026df0d814aa04 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Tue, 4 Jun 2019 16:25:11 +0200 Subject: [PATCH 083/171] Name player and tracking threads Useful for debugging --- Src/Controller/ControllerPlugin.cpp | 1 + Src/Model/MediaPlayer.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/Src/Controller/ControllerPlugin.cpp b/Src/Controller/ControllerPlugin.cpp index 0a82aa6d..61d6c1dd 100644 --- a/Src/Controller/ControllerPlugin.cpp +++ b/Src/Controller/ControllerPlugin.cpp @@ -19,6 +19,7 @@ ControllerPlugin::ControllerPlugin(QObject* parent, IBioTrackerContext* context, m_BioTrackerPlugin = NULL; m_TrackingThread = new QThread(this); + m_TrackingThread->setObjectName("TrackingThread"); m_TrackingThread->start(); } diff --git a/Src/Model/MediaPlayer.cpp b/Src/Model/MediaPlayer.cpp index c6be7a8e..b8d219af 100644 --- a/Src/Model/MediaPlayer.cpp +++ b/Src/Model/MediaPlayer.cpp @@ -29,6 +29,7 @@ MediaPlayer::MediaPlayer(QObject* parent) : // // Do not set a Parent for MediaPlayerStateMachine in order to run the Player in the QThread! m_PlayerThread = new QThread(this); + m_PlayerThread->setObjectName("PlayerThread"); m_Player = new MediaPlayerStateMachine(); m_Player->setConfig(_cfg); From 3965b4d161da006e0efa1735818b616211ecaee5 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Tue, 4 Jun 2019 16:25:24 +0200 Subject: [PATCH 084/171] Misc --- Src/Model/MediaPlayer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Src/Model/MediaPlayer.cpp b/Src/Model/MediaPlayer.cpp index b8d219af..d0258676 100644 --- a/Src/Model/MediaPlayer.cpp +++ b/Src/Model/MediaPlayer.cpp @@ -53,7 +53,7 @@ MediaPlayer::MediaPlayer(QObject* parent) : QObject::connect(this, &MediaPlayer::toggleRecordImageStreamCommand, m_Player, &MediaPlayerStateMachine::receivetoggleRecordImageStream); - // Handel PlayerStateMachine results + // Handle PlayerStateMachine results QObject::connect(m_Player, &MediaPlayerStateMachine::emitPlayerParameters, this, &MediaPlayer::receivePlayerParameters, Qt::BlockingQueuedConnection); QObject::connect(m_Player, &MediaPlayerStateMachine::emitPlayerParameters, this, &MediaPlayer::fwdPlayerParameters); From c986fd2f3dd2f50bbc349ecdcfa2123ae2f283f8 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Tue, 4 Jun 2019 16:25:43 +0200 Subject: [PATCH 085/171] Drop dead code --- Src/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h | 1 - Src/View/CoreParameterView.cpp | 4 ---- Src/View/CoreParameterView.h | 1 - Src/View/VideoControllWidget.cpp | 4 ---- Src/View/VideoControllWidget.h | 3 --- 5 files changed, 13 deletions(-) diff --git a/Src/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h b/Src/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h index 1d0bbe28..eb3fccd2 100644 --- a/Src/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h +++ b/Src/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h @@ -88,7 +88,6 @@ class MediaPlayerStateMachine : public IModel { private: IPlayerState* m_CurrentPlayerState; IPlayerState* m_NextPlayerState; - QThread m_StateThread; QMap m_States; std::shared_ptr m_ImageStream; diff --git a/Src/View/CoreParameterView.cpp b/Src/View/CoreParameterView.cpp index 4b0eb379..0dcb72e3 100644 --- a/Src/View/CoreParameterView.cpp +++ b/Src/View/CoreParameterView.cpp @@ -507,10 +507,6 @@ void CoreParameterView::on_pushButton_finalizeExp_clicked() { Q_EMIT emitFinalizeExperiment(); } -void CoreParameterView::on_label_ExpSrcCnt_clicked() { - //Event does not exist -} - void CoreParameterView::on_trialHelpButton_clicked() { QMessageBox::information(0, "Trials", "'Start a new Trial' will cause all the previous data to be saved and then reset.\n\n" diff --git a/Src/View/CoreParameterView.h b/Src/View/CoreParameterView.h index 430e0de4..bbef97b6 100644 --- a/Src/View/CoreParameterView.h +++ b/Src/View/CoreParameterView.h @@ -100,7 +100,6 @@ class CoreParameterView : public IViewWidget //pushButton_finalizeExp void on_pushButton_startExp_clicked(); void on_pushButton_finalizeExp_clicked(); - void on_label_ExpSrcCnt_clicked(); void on_trialHelpButton_clicked(); void on_pushButton_saveData_clicked(); void on_pushButton_resetData_clicked(); diff --git a/Src/View/VideoControllWidget.cpp b/Src/View/VideoControllWidget.cpp index 5271324e..c2b37b11 100644 --- a/Src/View/VideoControllWidget.cpp +++ b/Src/View/VideoControllWidget.cpp @@ -170,10 +170,6 @@ void VideoControllWidget::on_PositionChanged(int position) { // controller->takeScreenshot(); // } -void VideoControllWidget::on_comboBoxSelectedView_currentTextChanged(const QString& arg1) { - /*QString name = arg1;*/ -} - void VideoControllWidget::on_sld_video_sliderReleased() { } diff --git a/Src/View/VideoControllWidget.h b/Src/View/VideoControllWidget.h index 405e3e18..f057b211 100644 --- a/Src/View/VideoControllWidget.h +++ b/Src/View/VideoControllWidget.h @@ -52,9 +52,6 @@ class VideoControllWidget : public IViewWidget { // void on_button_previousFrame_clicked(); - - void on_comboBoxSelectedView_currentTextChanged(const QString& arg1); - void on_sld_video_sliderReleased(); void on_sld_video_sliderMoved(int position); From b4f07c7acc7270ded2c566525272b1d90d810a16 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Wed, 5 Jun 2019 15:39:25 +0200 Subject: [PATCH 086/171] Fix hidden integer to boolean conversion --- Src/Controller/ControllerPlugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Src/Controller/ControllerPlugin.cpp b/Src/Controller/ControllerPlugin.cpp index 61d6c1dd..7b96a671 100644 --- a/Src/Controller/ControllerPlugin.cpp +++ b/Src/Controller/ControllerPlugin.cpp @@ -117,7 +117,7 @@ void ControllerPlugin::loadPluginsFromPluginSubfolder() { QFileInfoList fl = d.entryInfoList(nameFilter, QDir::Filter::Files); //Grab list of behaviors from config & registry - std::vector list = _cfg->UseRegistryLocations==true ? PluginLoader::queryRegistryBehaviors(REGISTRY_PATH) : std::vector(); + std::vector list = _cfg->UseRegistryLocations==1 ? PluginLoader::queryRegistryBehaviors(REGISTRY_PATH) : std::vector(); //Search directories std::vector filesFromFolders = PluginLoader::searchDirectoriesForPlugins(list, TRACKER_SUFFIX); for(auto x: filesFromFolders) From dd7a856f13f50d1de624d555746c2175809d863c Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Wed, 5 Jun 2019 15:40:16 +0200 Subject: [PATCH 087/171] Correct docstring --- Src/Controller/ControllerPlugin.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Src/Controller/ControllerPlugin.h b/Src/Controller/ControllerPlugin.h index 4d0239a0..d85e59c5 100644 --- a/Src/Controller/ControllerPlugin.h +++ b/Src/Controller/ControllerPlugin.h @@ -150,7 +150,7 @@ class ControllerPlugin : public IControllerCfg { void receivePauseState(bool state); /** * - * Receive current frame from media play to send it to the plugin + * Receive current frame number from media play to send it to the plugin */ void receiveCurrentFrameNumberToPlugin(uint frameNumber); From 275dbbcc936a76d895086711a571961f60637242 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Wed, 5 Jun 2019 16:09:51 +0200 Subject: [PATCH 088/171] Fix undefined behavior --- Src/Model/MediaPlayer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Src/Model/MediaPlayer.cpp b/Src/Model/MediaPlayer.cpp index d0258676..624e929e 100644 --- a/Src/Model/MediaPlayer.cpp +++ b/Src/Model/MediaPlayer.cpp @@ -213,7 +213,7 @@ QString MediaPlayer::takeScreenshot(GraphicsView *gv) { QImage image = pix->toImage(); //8724us - QString filePath = getTimeAndDate(_cfg->DirScreenshots.toStdString(), ".png").c_str(); + auto filePath = QString::fromStdString(getTimeAndDate(_cfg->DirScreenshots.toStdString(), ".png")); image.save(filePath); From ac62473e23fe7c2bcf2c54116f697b0e90ccb9a1 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Wed, 5 Jun 2019 16:13:34 +0200 Subject: [PATCH 089/171] Fix memory leak in screenshot taking --- Src/Model/MediaPlayer.cpp | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/Src/Model/MediaPlayer.cpp b/Src/Model/MediaPlayer.cpp index 624e929e..f2f4fb2b 100644 --- a/Src/Model/MediaPlayer.cpp +++ b/Src/Model/MediaPlayer.cpp @@ -195,23 +195,20 @@ int MediaPlayer::reopenVideoWriter() { } QString MediaPlayer::takeScreenshot(GraphicsView *gv) { - //TODO duplicated code - QRectF rscene = gv->sceneRect(); //0us - QRectF rview = gv->rect(); //0us - QPixmap *pix; + QRectF rscene = gv->sceneRect(); + QRectF rview = gv->rect(); + QSize size; if (!m_recordScaled) - pix = new QPixmap(rscene.size().toSize()); //17us + size = rscene.size().toSize(); else - pix = new QPixmap(rview.size().toSize()); //17us - - QPainter *paint = new QPainter(pix); //21us + size = rview.size().toSize(); + auto image = QImage(size, QImage::Format_RGB32); + auto painter = QPainter(&image); if (!m_recordScaled) - gv->scene()->render(paint); //8544us + gv->scene()->render(&painter); else - gv->render(paint); - - QImage image = pix->toImage(); //8724us + gv->render(&painter); auto filePath = QString::fromStdString(getTimeAndDate(_cfg->DirScreenshots.toStdString(), ".png")); From a28fa9afb433c12d81c5c2344b7a72be1ba0c77e Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Wed, 5 Jun 2019 16:22:40 +0200 Subject: [PATCH 090/171] Get MSVC to shut up about using its (non-standard) extensions --- Src/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index 46b590af..25123f7f 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -57,6 +57,10 @@ add_definitions( -DMyQT_VERSION="${Qt5Core_VERSION}" ) add_definitions( -DMyCV_VERSION="${OpenCV_VERSION}" ) add_definitions( -DMyBT_VERSION="${Boost_LIB_VERSION}" ) +if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + target_compile_definitions(${target} PRIVATE _CRT_SECURE_NO_WARNINGS) +endif() + include(Locate) if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") install(TARGETS ${target} DESTINATION .) From 3dffd72d46e9bb80d0ad2a242b0f98182ac7d206 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Wed, 5 Jun 2019 16:23:03 +0200 Subject: [PATCH 091/171] Future proof includes of windows.h --- Src/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index 25123f7f..fe8fe7a8 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -58,6 +58,7 @@ add_definitions( -DMyCV_VERSION="${OpenCV_VERSION}" ) add_definitions( -DMyBT_VERSION="${Boost_LIB_VERSION}" ) if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + target_compile_definitions(${target} PRIVATE NOMINMAX) target_compile_definitions(${target} PRIVATE _CRT_SECURE_NO_WARNINGS) endif() From de6dbb3308009373dedb6f4ee84d5bf8c5b6a7ff Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Wed, 5 Jun 2019 16:24:42 +0200 Subject: [PATCH 092/171] Fix a bunch of warnings --- Src/Controller/ControllerAnnotations.cpp | 2 +- Src/Model/Annotations.cpp | 2 +- Src/Model/DataExporters/DataExporterCSV.cpp | 6 +++--- Src/Model/ImageStream.cpp | 4 ++-- Src/View/CoreParameterView.ui | 4 ++-- Src/View/VideoControllWidget.cpp | 4 ++-- Src/util/VideoCoder.cpp | 4 ++-- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Src/Controller/ControllerAnnotations.cpp b/Src/Controller/ControllerAnnotations.cpp index 27c0f3f8..4d0f96fb 100644 --- a/Src/Controller/ControllerAnnotations.cpp +++ b/Src/Controller/ControllerAnnotations.cpp @@ -216,7 +216,7 @@ Annotations::TrackedPoint ControllerAnnotations::snapToTrajectory(const QPoint & { if (i != model->getCurrentFrame()) continue; - const auto &childComponent = childTrajectory->getChild(i); + const auto &childComponent = childTrajectory->getChild(static_cast(i)); const auto point = dynamic_cast (childComponent); if (point == nullptr) continue; diff --git a/Src/Model/Annotations.cpp b/Src/Model/Annotations.cpp index ff08d686..6c5a39d2 100644 --- a/Src/Model/Annotations.cpp +++ b/Src/Model/Annotations.cpp @@ -76,7 +76,7 @@ void Annotations::updateTrackedAnnotations(const QList { for (auto &annotation : annotations) { - annotation->updateTrackedPositions(getCurrentFrame(), trackedComponents); + annotation->updateTrackedPositions(static_cast(getCurrentFrame()), trackedComponents); } } diff --git a/Src/Model/DataExporters/DataExporterCSV.cpp b/Src/Model/DataExporters/DataExporterCSV.cpp index 11036757..a6db9a96 100644 --- a/Src/Model/DataExporters/DataExporterCSV.cpp +++ b/Src/Model/DataExporters/DataExporterCSV.cpp @@ -138,11 +138,11 @@ void DataExporterCSV::loadFile(std::string file) } IModelTrackedComponent* dummy = static_cast(factory->getNewTrackedElement("0")); std::vector headerElsStr = getHeaderElements(dummy); - int headerEls = headerElsStr.size(); + int headerEls = static_cast(headerElsStr.size()); std::vector strs; split(line, strs, _separator[0]); - int idcnt = (strs.size() - 2) / headerEls; + int idcnt = (static_cast(strs.size()) - 2) / headerEls; //Add data lines while (!ifs.eof()) { @@ -259,7 +259,7 @@ void DataExporterCSV::writeAll(std::string f) { if (factory != nullptr) { IModelTrackedComponent *ptraj = static_cast(factory->getNewTrackedElement("0")); std::string header = getHeader(ptraj, vcount); - headerCount = getHeaderElements(ptraj).size(); + headerCount = static_cast(getHeaderElements(ptraj).size()); o << header << "\n"; delete ptraj; } diff --git a/Src/Model/ImageStream.cpp b/Src/Model/ImageStream.cpp index c6387921..3f4e3144 100644 --- a/Src/Model/ImageStream.cpp +++ b/Src/Model/ImageStream.cpp @@ -217,7 +217,7 @@ namespace BioTracker { private: virtual bool nextFrame_impl() override { - m_currentFrame += m_frame_stride; + m_currentFrame += static_cast(m_frame_stride); if (this->numFrames() > m_currentFrame) { const std::string &filename = m_picture_files[m_currentFrame].string(); @@ -235,7 +235,7 @@ namespace BioTracker { const std::string &filename = m_picture_files[frame_number].string(); std::shared_ptr new_frame = std::make_shared(cv::imread(filename)); this->set_current_frame(new_frame); - m_currentFrame = frame_number; + m_currentFrame = static_cast(frame_number); if (m_recording) { if (vCoder) vCoder->add(new_frame); } diff --git a/Src/View/CoreParameterView.ui b/Src/View/CoreParameterView.ui index 70f6c8e1..7e449dae 100644 --- a/Src/View/CoreParameterView.ui +++ b/Src/View/CoreParameterView.ui @@ -1235,7 +1235,7 @@ 0 - + 3 @@ -2046,7 +2046,7 @@ You can add some by right-clicking the video (if loaded). - + Current status of the trial. If paused the tracking is deactivated. diff --git a/Src/View/VideoControllWidget.cpp b/Src/View/VideoControllWidget.cpp index c2b37b11..1bb498bd 100644 --- a/Src/View/VideoControllWidget.cpp +++ b/Src/View/VideoControllWidget.cpp @@ -63,8 +63,8 @@ void VideoControllWidget::getNotified() { ui->actionRecord_cam->setIcon(QIcon(":/Images/resources/recordCam.png")); } - int currentFrameNr = mediaPlayer->getCurrentFrameNumber(); - int totalNumberOfFrames = mediaPlayer->getTotalNumberOfFrames(); + int currentFrameNr = static_cast(mediaPlayer->getCurrentFrameNumber()); + int totalNumberOfFrames = static_cast(mediaPlayer->getTotalNumberOfFrames()); int mediaFps = mediaPlayer->getFpsOfSourceFile(); //ui->frame_num_edit->setText(QString::number(currentFrameNr)); ui->frame_num_spin->setMaximum(totalNumberOfFrames); diff --git a/Src/util/VideoCoder.cpp b/Src/util/VideoCoder.cpp index cb4f4ded..00f89072 100644 --- a/Src/util/VideoCoder.cpp +++ b/Src/util/VideoCoder.cpp @@ -25,7 +25,7 @@ void MutexLinkedList::push(std::shared_ptr imbuffer, bool dropFrame _Access.lock(); images.push_back(imbuffer); - unsigned long s = images.size(); + unsigned long s = static_cast(images.size()); unsigned long w = imbuffer->getWidth(); unsigned long h = imbuffer->getHeight(); //if (s*w*h / 1024 / 1024 > BUFFER_HARDLIMIT) { @@ -62,7 +62,7 @@ void MutexLinkedList::MutexLinkedList::clear() { int MutexLinkedList::size() { int tsize = 0; _Access.lock(); - tsize = images.size(); + tsize = static_cast(images.size()); _Access.unlock(); return tsize; } From 865e6ef667a9a99c044f4c5813bfedc4985768b0 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Wed, 5 Jun 2019 16:36:35 +0200 Subject: [PATCH 093/171] Fix tracking being done in the main (GUI) thread Move it out to the already existing (but unused) tracking thread. --- Src/Controller/ControllerPlugin.cpp | 28 +++++++++++++--------------- Src/Controller/ControllerPlugin.h | 1 + Src/Model/MediaPlayer.cpp | 25 ++++++------------------- Src/Model/MediaPlayer.h | 7 ------- 4 files changed, 20 insertions(+), 41 deletions(-) diff --git a/Src/Controller/ControllerPlugin.cpp b/Src/Controller/ControllerPlugin.cpp index 7b96a671..af0b1747 100644 --- a/Src/Controller/ControllerPlugin.cpp +++ b/Src/Controller/ControllerPlugin.cpp @@ -239,9 +239,6 @@ void ControllerPlugin::connectPlugin() { QObject::connect(obj, SIGNAL(emitCvMat(std::shared_ptr, QString)), ctrTexture, SLOT(receiveCvMat(std::shared_ptr, QString))); - //TODO whyy do this two times?? - QObject::connect(obj, SIGNAL(emitTrackingDone(uint)), model, SLOT(receiveTrackingOperationDone())); - QObject::connect(obj, SIGNAL(emitTrackingDone(uint)), ctrCompView, SLOT(receiveVisualizeTrackingModel(uint))); QObject::connect(obj, SIGNAL(emitChangeDisplayImage(QString)), ctrPlayer, SLOT(receiveChangeDisplayImage(QString))); @@ -262,29 +259,30 @@ void ControllerPlugin::connectPlugin() { // data model actions QObject::connect(this, SIGNAL(emitRemoveTrajectory(IModelTrackedTrajectory*)), obj, - SLOT(receiveRemoveTrajectory(IModelTrackedTrajectory*)), Qt::DirectConnection); + SLOT(receiveRemoveTrajectory(IModelTrackedTrajectory*))); QObject::connect(this, SIGNAL(emitRemoveTrackEntity(IModelTrackedTrajectory*, uint)), obj, - SIGNAL(emitRemoveTrackEntity(IModelTrackedTrajectory*, uint)), Qt::DirectConnection); + SIGNAL(emitRemoveTrackEntity(IModelTrackedTrajectory*, uint))); QObject::connect(this, SIGNAL(emitAddTrajectory(QPoint)), obj, - SLOT(receiveAddTrajectory(QPoint)), Qt::DirectConnection); + SLOT(receiveAddTrajectory(QPoint))); QObject::connect(this, SIGNAL(emitMoveElement(IModelTrackedTrajectory*, uint, QPoint)), obj, - SIGNAL(emitMoveElement(IModelTrackedTrajectory*, uint, QPoint)), Qt::DirectConnection); + SIGNAL(emitMoveElement(IModelTrackedTrajectory*, uint, QPoint))); QObject::connect(this, SIGNAL(emitSwapIds(IModelTrackedTrajectory*, IModelTrackedTrajectory*)), obj, - SLOT(receiveSwapIds(IModelTrackedTrajectory*, IModelTrackedTrajectory*)), Qt::DirectConnection); + SLOT(receiveSwapIds(IModelTrackedTrajectory*, IModelTrackedTrajectory*))); QObject::connect(this, SIGNAL(emitToggleFixTrack(IModelTrackedTrajectory*, bool)), obj, - SIGNAL(emitToggleFixTrack(IModelTrackedTrajectory*, bool)), Qt::DirectConnection); + SIGNAL(emitToggleFixTrack(IModelTrackedTrajectory*, bool))); QObject::connect(this, SIGNAL(emitRemoveTrajectoryId(int)), obj, - SIGNAL(emitRemoveTrajectoryId(int)), Qt::DirectConnection); + SIGNAL(emitRemoveTrajectoryId(int))); QObject::connect(this, SIGNAL(emitValidateTrajectory(int)), obj, - SIGNAL(emitValidateTrajectory(int)), Qt::DirectConnection); + SIGNAL(emitValidateTrajectory(int))); QObject::connect(this, SIGNAL(emitValidateEntity(IModelTrackedTrajectory*, uint)), obj, - SIGNAL(emitValidateEntity(IModelTrackedTrajectory*, uint)), Qt::DirectConnection); + SIGNAL(emitValidateEntity(IModelTrackedTrajectory*, uint))); QObject::connect(this, SIGNAL(emitEntityRotation(IModelTrackedTrajectory*, double, uint)), obj, - SIGNAL(emitEntityRotation(IModelTrackedTrajectory*, double, uint)), Qt::DirectConnection); + SIGNAL(emitEntityRotation(IModelTrackedTrajectory*, double, uint))); + connect(this, &ControllerPlugin::frameRetrieved, m_BioTrackerPlugin, &IBioTrackerPlugin::receiveCurrentFrameFromMainApp); QObject::connect(this, SIGNAL(signalCurrentFrameNumberToPlugin(uint)), obj, - SLOT(receiveCurrentFrameNumberFromMainApp(uint)), Qt::DirectConnection); + SLOT(receiveCurrentFrameNumberFromMainApp(uint))); } void ControllerPlugin::disconnectPlugin() { @@ -334,7 +332,7 @@ void ControllerPlugin::sendCurrentFrameToPlugin(std::shared_ptr mat, ui break; } } - m_BioTrackerPlugin->receiveCurrentFrameFromMainApp(mat, number); + emit frameRetrieved(mat, number); } } diff --git a/Src/Controller/ControllerPlugin.h b/Src/Controller/ControllerPlugin.h index d85e59c5..41667062 100644 --- a/Src/Controller/ControllerPlugin.h +++ b/Src/Controller/ControllerPlugin.h @@ -73,6 +73,7 @@ class ControllerPlugin : public IControllerCfg { void emitEntityRotation(IModelTrackedTrajectory* trajectory0, double angle, uint frameNumber); void emitUpdateView(); + void frameRetrieved(std::shared_ptr mat, uint frameNumber); void signalCurrentFrameNumberToPlugin(uint frameNumber); // IController interface diff --git a/Src/Model/MediaPlayer.cpp b/Src/Model/MediaPlayer.cpp index f2f4fb2b..a131c645 100644 --- a/Src/Model/MediaPlayer.cpp +++ b/Src/Model/MediaPlayer.cpp @@ -11,7 +11,6 @@ using namespace BioTrackerUtilsMisc; //getTimeAndDate MediaPlayer::MediaPlayer(QObject* parent) : IModel(parent) { _cfg = static_cast(parent)->getConfig(); - m_trackingDone = true; m_currentFPS = 0; m_fpsOfSourceFile = 0; _imagew = 0; @@ -54,7 +53,7 @@ MediaPlayer::MediaPlayer(QObject* parent) : QObject::connect(this, &MediaPlayer::toggleRecordImageStreamCommand, m_Player, &MediaPlayerStateMachine::receivetoggleRecordImageStream); // Handle PlayerStateMachine results - QObject::connect(m_Player, &MediaPlayerStateMachine::emitPlayerParameters, this, &MediaPlayer::receivePlayerParameters, Qt::BlockingQueuedConnection); + QObject::connect(m_Player, &MediaPlayerStateMachine::emitPlayerParameters, this, &MediaPlayer::receivePlayerParameters); QObject::connect(m_Player, &MediaPlayerStateMachine::emitPlayerParameters, this, &MediaPlayer::fwdPlayerParameters); // Handle next state operation @@ -218,7 +217,6 @@ QString MediaPlayer::takeScreenshot(GraphicsView *gv) { } void MediaPlayer::receiveTrackingPaused() { - m_trackingDone = true; } void MediaPlayer::receivePlayerParameters(playerParameters* param) { @@ -245,12 +243,11 @@ void MediaPlayer::receivePlayerParameters(playerParameters* param) { Q_EMIT renderCurrentImage(m_CurrentFrame, m_NameOfCvMat); if (m_TrackingIsActive) { - m_trackingDone = false; - Q_EMIT trackCurrentImage(m_CurrentFrame, m_CurrentFrameNumber); + Q_EMIT trackCurrentImage(m_CurrentFrame, static_cast(m_CurrentFrameNumber)); } else { - Q_EMIT signalVisualizeCurrentModel(m_CurrentFrameNumber); - Q_EMIT signalCurrentFrameNumberToPlugin(m_CurrentFrameNumber); + Q_EMIT signalVisualizeCurrentModel(static_cast(m_CurrentFrameNumber)); + Q_EMIT signalCurrentFrameNumberToPlugin(static_cast(m_CurrentFrameNumber)); } if (m_recd) { @@ -297,7 +294,6 @@ void MediaPlayer::rcvPauseState(bool state) { } void MediaPlayer::receivePlayerOperationDone() { - // Only emit this SIGNAL when tracking is not active end = std::chrono::system_clock::now(); long s = std::chrono::duration_cast(end - start).count(); if (!_paused) { @@ -307,18 +303,9 @@ void MediaPlayer::receivePlayerOperationDone() { m_currentFPS = 0; } - if(m_trackingDone == true || !m_TrackingIsActive) - Q_EMIT runPlayerOperation(); + emit runPlayerOperation(); - - start = std::chrono::system_clock::now(); -} - -void MediaPlayer::receiveTrackingOperationDone() { - // Only emit this SIGNAL when tracking is active - if (m_TrackingIsActive) { - m_trackingDone = true; - } + start = std::chrono::system_clock::now(); } void MediaPlayer::receiveChangeDisplayImage(QString str) { diff --git a/Src/Model/MediaPlayer.h b/Src/Model/MediaPlayer.h index dd05ebf9..367abed3 100644 --- a/Src/Model/MediaPlayer.h +++ b/Src/Model/MediaPlayer.h @@ -138,12 +138,6 @@ class MediaPlayer : public IModel { */ void receivePlayerOperationDone(); - /** - * If a BioTracker Plugin is done with executing its tracking algorithm this SLOT will be triggerd. As soon as this SLOT is triggered, the MediaPlayerStateMachine will be - * advised to execute the next state. - */ - void receiveTrackingOperationDone(); - /** * */ @@ -196,7 +190,6 @@ class MediaPlayer : public IModel { bool m_recd; bool m_recordScaled; - bool m_trackingDone; bool _paused = true; bool m_useCuda; From ebf9ae5e0ced17f2172aedd05ee57f2aab568afd Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Thu, 6 Jun 2019 10:57:33 +0200 Subject: [PATCH 094/171] find_package should use COMPONENTS tag --- Src/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index fe8fe7a8..f2f5581b 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -29,7 +29,7 @@ target_link_libraries (${target} robofish-behavior_loader) find_package(Qt5 REQUIRED COMPONENTS Core Gui Xml Network Widgets Multimedia MultimediaWidgets OpenGL) target_link_libraries (${target} Qt5::Core Qt5::Gui Qt5::Xml Qt5::Network Qt5::Widgets Qt5::Multimedia Qt5::MultimediaWidgets Qt5::OpenGL) -find_package(Boost REQUIRED filesystem program_options) +find_package(Boost REQUIRED COMPONENTS filesystem program_options) target_include_directories(${target} PUBLIC ${Boost_INCLUDE_DIRS}) target_link_libraries(${target} ${Boost_LIBRARIES}) From 516bb3fd3b5f1b0b270a8e3cbc3fcbeadc523932 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Thu, 6 Jun 2019 11:06:39 +0200 Subject: [PATCH 095/171] Handle default configuration for pylon camera --- Src/Model/ImageStream.cpp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/Src/Model/ImageStream.cpp b/Src/Model/ImageStream.cpp index 3f4e3144..4d736aad 100644 --- a/Src/Model/ImageStream.cpp +++ b/Src/Model/ImageStream.cpp @@ -504,13 +504,22 @@ namespace BioTracker { throw device_open_error("Error loading camera"); } + if (m_w == -1) + m_w = GenApi::CIntegerPtr(m_camera.GetNodeMap().GetNode("SensorWidth"))->GetValue(); + if (m_h == -1) + m_h = GenApi::CIntegerPtr(m_camera.GetNodeMap().GetNode("SensorHeight"))->GetValue(); + GenApi::CBooleanPtr(m_camera.GetNodeMap().GetNode("AcquisitionFrameRateEnable"))->SetValue(1); - setFrameRate(m_fps); - auto const actual_fps = getFrameRate(); - qInfo() << "Actual framerate:" << actual_fps; - if (std::abs(actual_fps - m_fps) > 0.1) { - throw device_open_error("Error setting framerate"); + if (m_fps == -1) { + m_fps = getFrameRate(); + } else { + setFrameRate(m_fps); + auto const actual_fps = getFrameRate(); + qInfo() << "Actual framerate:" << actual_fps; + if (std::abs(actual_fps - m_fps) > 0.1) { + throw device_open_error("Error setting framerate"); + } } qDebug() << "\nStarting to record on camera " << m_camera.GetDeviceInfo().GetFriendlyName(); From 106998ebb28bc7d20062c8dcd093f9c377e3a476 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Thu, 6 Jun 2019 11:22:52 +0200 Subject: [PATCH 096/171] Refactor --- Src/Model/ImageStream.cpp | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/Src/Model/ImageStream.cpp b/Src/Model/ImageStream.cpp index 4d736aad..3f53dd0d 100644 --- a/Src/Model/ImageStream.cpp +++ b/Src/Model/ImageStream.cpp @@ -492,8 +492,6 @@ namespace BioTracker { : ImageStream(0, cfg) , m_camera(getPylonDevice(conf._selector.index), Pylon::Cleanup_Delete) { - m_w = conf._width == -1 ? _cfg->CameraWidth : conf._width; - m_h = conf._height == -1 ? _cfg->CameraHeight : conf._height; m_fps = conf._fps == -1 ? _cfg->RecordFPS : conf._fps; m_camera.MaxNumBuffer = 1; @@ -504,10 +502,18 @@ namespace BioTracker { throw device_open_error("Error loading camera"); } - if (m_w == -1) - m_w = GenApi::CIntegerPtr(m_camera.GetNodeMap().GetNode("SensorWidth"))->GetValue(); - if (m_h == -1) - m_h = GenApi::CIntegerPtr(m_camera.GetNodeMap().GetNode("SensorHeight"))->GetValue(); + m_imageSize = { + [&]() -> int { + if (conf._width != -1) return conf._width; + if (_cfg->CameraWidth != -1) return _cfg->CameraWidth; + return GenApi::CIntegerPtr(m_camera.GetNodeMap().GetNode("SensorWidth"))->GetValue(); + }(), + [&]() -> int { + if (conf._height != -1) return conf._height; + if (_cfg->CameraHeight != -1) return _cfg->CameraHeight; + return GenApi::CIntegerPtr(m_camera.GetNodeMap().GetNode("SensorHeight"))->GetValue(); + }() + }; GenApi::CBooleanPtr(m_camera.GetNodeMap().GetNode("AcquisitionFrameRateEnable"))->SetValue(1); @@ -544,7 +550,7 @@ namespace BioTracker { if (!m_camera.IsOpen()) { return false; } - m_recording = m_encoder->toggle(m_w, m_h, m_fps); + m_recording = m_encoder->toggle(m_imageSize.width, m_imageSize.height, m_fps); return m_recording; } @@ -574,7 +580,7 @@ namespace BioTracker { auto view = toOpenCV(grabbed); auto scaled = std::make_shared(); - cv::resize(view, *scaled, cv::Size{m_w, m_h}); + cv::resize(view, *scaled, m_imageSize); if (scaled->type() == CV_8UC1) cv::cvtColor(*scaled, *scaled, cv::COLOR_GRAY2BGR); set_current_frame(scaled); @@ -610,8 +616,7 @@ namespace BioTracker { Pylon::PylonAutoInitTerm m_pylon; Pylon::CInstantCamera m_camera; double m_fps; - int m_w; - int m_h; + cv::Size m_imageSize; bool m_recording; std::shared_ptr m_encoder; From c09d9ea1ea83001c8d3a5e0d62524850e9661884 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Thu, 6 Jun 2019 11:23:11 +0200 Subject: [PATCH 097/171] Misc --- Src/Model/ImageStream.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Src/Model/ImageStream.cpp b/Src/Model/ImageStream.cpp index 3f53dd0d..20d4c2cf 100644 --- a/Src/Model/ImageStream.cpp +++ b/Src/Model/ImageStream.cpp @@ -540,9 +540,9 @@ namespace BioTracker { return GuiParam::MediaType::Camera; } - size_t numFrames() const override + std::size_t numFrames() const override { - return (std::numeric_limits::max)(); + return std::numeric_limits::max(); } bool toggleRecord() override From 1b88190940e9839c496dfe7ba8d5e2f7b403cba8 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Thu, 6 Jun 2019 11:24:10 +0200 Subject: [PATCH 098/171] Use separate thread for grabbing frames from pylon cameras --- Src/Model/ImageStream.cpp | 64 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 59 insertions(+), 5 deletions(-) diff --git a/Src/Model/ImageStream.cpp b/Src/Model/ImageStream.cpp index 20d4c2cf..ffa4efc8 100644 --- a/Src/Model/ImageStream.cpp +++ b/Src/Model/ImageStream.cpp @@ -4,9 +4,12 @@ #include // assert #include // std::invalid_argument #include +#include #include #include +#include + #include "util/Exceptions.h" #include "QSharedPointer" #include "Utility/misc.h" @@ -487,14 +490,57 @@ namespace BioTracker { #if HAS_PYLON /*********************************************************/ class ImageStream3PylonCamera : public ImageStream { + private: + class ImageCache : public Pylon::CImageEventHandler + { + private: + boost::circular_buffer grabResults_m; + mutable std::mutex mutex_m; + + public: + ImageCache(std::size_t n) + : grabResults_m(n) + {} + + void push_back(Pylon::CGrabResultPtr const& grabResult) + { + std::scoped_lock lock(mutex_m); + grabResults_m.push_back(grabResult); + } + + Pylon::CGrabResultPtr const& front() const + { + std::scoped_lock lock(mutex_m); + return grabResults_m.front(); + } + + void pop_front() + { + std::scoped_lock lock(mutex_m); + grabResults_m.pop_front(); + } + + std::size_t size() const + { + std::scoped_lock lock(mutex_m); + return grabResults_m.size(); + } + + void OnImageGrabbed([[maybe_unused]] Pylon::CInstantCamera& camera, Pylon::CGrabResultPtr const& grabResult) override + { + push_back(grabResult); + } + }; + + ImageCache m_images; public: explicit ImageStream3PylonCamera(Config* cfg, CameraConfiguration conf) : ImageStream(0, cfg) + , m_images(m_frame_stride + static_cast(std::ceil(m_frame_stride / 2.))) , m_camera(getPylonDevice(conf._selector.index), Pylon::Cleanup_Delete) { m_fps = conf._fps == -1 ? _cfg->RecordFPS : conf._fps; - m_camera.MaxNumBuffer = 1; m_camera.Open(); if (!m_camera.IsOpen()) { @@ -529,12 +575,17 @@ namespace BioTracker { } qDebug() << "\nStarting to record on camera " << m_camera.GetDeviceInfo().GetFriendlyName(); - m_camera.StartGrabbing(Pylon::GrabStrategy_LatestImages, Pylon::GrabLoop_ProvidedByUser); + m_camera.RegisterImageEventHandler(&m_images, Pylon::ERegistrationMode::RegistrationMode_Append, Pylon::ECleanup::Cleanup_None); + m_camera.StartGrabbing(Pylon::GrabStrategy_OneByOne, Pylon::GrabLoop_ProvidedByInstantCamera); nextFrame_impl(); m_recording = false; m_encoder = std::make_shared(m_fps, _cfg); } + ~ImageStream3PylonCamera() + { + m_camera.DeregisterImageEventHandler(&m_images); + } GuiParam::MediaType type() const override { return GuiParam::MediaType::Camera; @@ -569,9 +620,12 @@ namespace BioTracker { bool nextFrame_impl() override { - Pylon::CGrabResultPtr grabbed; - for (auto i = 0; i < m_frame_stride; ++i) - m_camera.RetrieveResult(100, grabbed, Pylon::TimeoutHandling_Return); + while (m_images.size() < m_frame_stride) + std::this_thread::sleep_for(std::chrono::milliseconds(1000) / m_fps / 2); // Half of a frame intervals + for (auto i = std::size_t{1}; i < m_frame_stride; ++i) + m_images.pop_front(); + Pylon::CGrabResultPtr grabbed = m_images.front(); + m_images.pop_front(); if (!grabbed->GrabSucceeded()) { qCritical() << "Unable to grab frame:" << grabbed->GetErrorDescription(); From 8de2d65ffb7623609fd884f20ad6f069363c7b7f Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Thu, 6 Jun 2019 11:27:13 +0200 Subject: [PATCH 099/171] Report actual pylon camera fps instead of requested one --- Src/Model/ImageStream.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Src/Model/ImageStream.cpp b/Src/Model/ImageStream.cpp index ffa4efc8..8d921c43 100644 --- a/Src/Model/ImageStream.cpp +++ b/Src/Model/ImageStream.cpp @@ -572,6 +572,7 @@ namespace BioTracker { if (std::abs(actual_fps - m_fps) > 0.1) { throw device_open_error("Error setting framerate"); } + m_fps = actual_fps; } qDebug() << "\nStarting to record on camera " << m_camera.GetDeviceInfo().GetFriendlyName(); From a1f1a6759c2831c8f151c23b5f5817ce5bb783b1 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Thu, 6 Jun 2019 11:29:25 +0200 Subject: [PATCH 100/171] Pylon camera video encoder: shared_ptr -> unique_ptr --- Src/Model/ImageStream.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Src/Model/ImageStream.cpp b/Src/Model/ImageStream.cpp index 8d921c43..5799cc91 100644 --- a/Src/Model/ImageStream.cpp +++ b/Src/Model/ImageStream.cpp @@ -581,7 +581,7 @@ namespace BioTracker { nextFrame_impl(); m_recording = false; - m_encoder = std::make_shared(m_fps, _cfg); + m_encoder = std::make_unique(m_fps, _cfg); } ~ImageStream3PylonCamera() { @@ -674,7 +674,7 @@ namespace BioTracker { cv::Size m_imageSize; bool m_recording; - std::shared_ptr m_encoder; + std::unique_ptr m_encoder; }; #endif From 1d8cb3ef8099c600bdb410a45d539492de7c424d Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Mon, 15 Jul 2019 14:51:27 +0200 Subject: [PATCH 101/171] Update ci/cd --- .gitlab-ci.py | 166 +++++++++++++++++++++++++++++++++++++++++++++++++ .gitlab-ci.yml | 162 +++++++++++++++++------------------------------ 2 files changed, 222 insertions(+), 106 deletions(-) create mode 100755 .gitlab-ci.py diff --git a/.gitlab-ci.py b/.gitlab-ci.py new file mode 100755 index 00000000..320c0bc7 --- /dev/null +++ b/.gitlab-ci.py @@ -0,0 +1,166 @@ +#! /usr/bin/env python3 + +import tarfile +import shutil +import ssl + +from os import environ as env, pathsep, makedirs +from platform import system +from subprocess import check_call, check_output, DEVNULL +from argparse import ArgumentParser +from io import BytesIO +from urllib.request import Request, urlopen +from urllib.parse import quote, urlencode +from zipfile import ZipFile +from pathlib import Path + + +def define(key: str, value: str): + return ['-D', f'{key}={value}'] + + +def define_env(name: str): + return define(name, env[name]) if name in env else [] + + +def fetch_artifacts(project, reference, job): + gitlab_host = 'https://git.imp.fu-berlin.de' + project = quote(project, safe="") + reference = quote(reference, safe="") + params = urlencode([("job", job)], doseq=True) + url = f'{gitlab_host}/api/v4/projects/{project}/jobs/artifacts/{reference}/download?{params}' + headers = {'JOB-TOKEN': env['CI_JOB_TOKEN']} + return ZipFile( + BytesIO( + urlopen(Request(url, headers=headers), + context=ssl._create_unverified_context()).read())) + + +def extract_cmake_package(artifacts, name): + for filename in artifacts.namelist(): + if Path(filename).match(f'{name}-*.tar.xz'): + with tarfile.open(fileobj=BytesIO(artifacts.read(filename))) as f: + f.extractall('vendor') + shutil.move(next(Path('vendor').glob(f'{name}-*/')), + f'vendor/{name}') + + +if system() == 'Windows': + + def setup_msvc(): + msvc_path = 'C:/Program Files (x86)/Microsoft Visual Studio/2017/BuildTools/Common7/Tools' + lines = check_output([ + 'cmd', '/c', 'VsDevCmd.bat', '-arch=amd64', + f'-vcvars_ver={env["VCVARS_VER"]}', '&', 'set' + ], + cwd=msvc_path).decode('utf-8').splitlines() + for line in lines: + split = line.split('=') + if len(split) != 2: + continue + key, value = split + if key in env and env[key] == value: + continue + env[key] = value + + def setup_vcpkg(): + env['PATH'] += f"{pathsep}{env['VCPKG_INSTALL_DIR']}/bin" + + def setup_cuda(): + if 'CUDA_PATH' in env: + env['PATH'] += f"{pathsep}{env['CUDA_PATH']}/bin" + + +def setup_dependencies(): + for path in Path('vendor').glob('*/bin'): + env['PATH'] += f"{pathsep}{path}" + + +def prepare(args): + for name, project, reference, job in args.dependencies: + with fetch_artifacts(project, reference, job) as artifacts: + extract_cmake_package(artifacts, name) + + +def build(args): + if system() == 'Windows': + setup_msvc() + setup_vcpkg() + setup_cuda() + setup_dependencies() + + command = ['cmake'] + command += ['-S', '.'] + command += ['-B', 'build'] + command += ['-G', 'Ninja'] + command += define('CMAKE_PREFIX_PATH', 'vendor') + command += define_env('CMAKE_BUILD_TYPE') + command += define('CMAKE_SUPPRESS_REGENERATION', 'ON') + command += define('CMAKE_SKIP_PACKAGE_ALL_DEPENDENCY', 'ON') + + if system() == 'Windows': + command += define( + 'CMAKE_TOOLCHAIN_FILE', + env['VCPKG_DIR'] + '/scripts/buildsystems/vcpkg.cmake') + command += define('VCPKG_TARGET_TRIPLET', env['VCPKG_TRIPLET']) + command += define('PACKAGE_WINDOWS_MSI', 'ON') + command += define('INSTALL_REQUIRED_SYSTEM_LIBRARIES', 'ON') + command += define_env('INSTALL_SHARED_LIBRARIES') + command += define_env('INSTALL_OPENCV_COMPONENTS') + command += define_env('CPACK_PACKAGE_DIRECTORY') + check_call(command) + + command = ['ninja', '-C', 'build'] + check_call(command) + + +def package(args): + if system() == 'Windows': + setup_vcpkg() + setup_cuda() + + cwd = None + command = ['ninja', '-C', 'build', 'package'] + + if system() == 'Linux': + makedirs('build/appdir/usr/bin') + makedirs('build/appdir/usr/share/applications') + makedirs('build/appdir/usr/share/icons/hicolor/256x256') + shutil.copy('build/Src/BioTracker', 'build/appdir/usr/bin') + shutil.copy('Src/BioTracker.desktop', + 'build/appdir/usr/share/applications') + shutil.copy('Src/resources/logo/BT3-big.png', + 'build/appdir/usr/share/icons/hicolor/256x256') + + cwd = 'build' + command = [ + 'linuxdeployqt', + 'appdir/usr/share/applications/BioTracker.desktop', '-appimage', + '-no-translations' + ] + + setup_dependencies() + check_call(command, cwd=cwd) + + +if __name__ == '__main__': + parser = ArgumentParser() + subparsers = parser.add_subparsers() + + prepare_parser = subparsers.add_parser('prepare') + prepare_parser.set_defaults(task=prepare) + prepare_parser.add_argument('--dependency', + dest='dependencies', + nargs=4, + action='append', + metavar=('PACKAGE', 'PROJECT', 'REFERENCE', + 'JOB')) + + build_parser = subparsers.add_parser('build') + build_parser.set_defaults(task=build) + + package_parser = subparsers.add_parser('package') + package_parser.set_defaults(task=package) + + args = parser.parse_args() + args.task(args) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4f9f04f8..1795dacf 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -7,149 +7,99 @@ stages: tags: [ linux, docker ] image: git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker:devel-ubuntu18.04 -.windows: - tags: [ windows, docker ] - image: git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker:devel-windows +.windows-1809: + tags: [ windows-1809, docker ] + image: git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker:devel-windows1809 -.windows[cuda]: - tags: [ windows, docker ] - image: git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker:cuda-devel-windows .gcc8: &gcc8 CC: gcc-8 CXX: g++-8 .msvc15.9: &msvc15_9 - VSDevEnv -arch=amd64 -vcvars_ver="14.16" + VCVARS_VER: '14.16' -.pylon5: &pylon5 - WITH_PYLON5: 1 +.release: &release + CMAKE_BUILD_TYPE: Release .debug: &debug CMAKE_BUILD_TYPE: Debug -.release: &release - CMAKE_BUILD_TYPE: Release +.pylon5: &pylon5 + WITH_PYLON5: 1 -.build ubuntu-18.04: - extends: .ubuntu-18.04 - stage: build - artifacts: - paths: - - vendor - - build - expire_in: 1 day - script: - - cmake -Bbuild -H. -DCMAKE_BUILD_TYPE="$CMAKE_BUILD_TYPE" -G Ninja -DCMAKE_SUPPRESS_REGENERATION=ON -DCMAKE_SKIP_PACKAGE_ALL_DEPENDENCY=ON - - ninja -C build -.build windows: - extends: .windows +.build: &build stage: build artifacts: paths: - vendor - build expire_in: 1 day - script: - - cmake -Bbuild "-H." -DCMAKE_BUILD_TYPE="$CMAKE_BUILD_TYPE" -G Ninja -DPACKAGE_WINDOWS_MSI=ON -DINSTALL_REQUIRED_SYSTEM_LIBRARIES=ON -DINSTALL_SHARED_LIBRARIES='flang;flangrti;libomp;zlib1;tiff;tiffxx;jpeg62;libpng16;lzma;openblas;boost_filesystem-vc141-mt-x64-1_68;boost_program_options-vc141-mt-x64-1_68' -DINSTALL_OPENCV_COMPONENTS='core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab;ffmpeg' -DCMAKE_TOOLCHAIN_FILE="$env:VCPKG_DIR/scripts/buildsystems/vcpkg.cmake" -DVCPKG_TARGET_TRIPLET="$env:VCPKG_TRIPLET" -DCMAKE_SUPPRESS_REGENERATION=ON -DCMAKE_SKIP_PACKAGE_ALL_DEPENDENCY=ON -DCPACK_PACKAGE_DIRECTORY="${env:PACKAGE_DIR}" - - ninja -C build + script: ./.gitlab-ci.py build build ubuntu-18.04: - extends: .build ubuntu-18.04 + extends: .ubuntu-18.04 + <<: *build variables: <<: [ *gcc8, *release ] before_script: - - . /etc/profile.d/robofish.sh - - gitlab-fetch-artifacts bioroboticslab%2Fbiotracker%2Finterfaces master package%20ubuntu-18.04 - - cmake-integrate-package biotracker-interfaces - - gitlab-fetch-artifacts bioroboticslab%2Fbiotracker%2Futility master package%20ubuntu-18.04 - - cmake-integrate-package biotracker-utility - - gitlab-fetch-artifacts bioroboticslab%2Fbiotracker%2Fbehavior_loader master package%20ubuntu-18.04 - - cmake-integrate-package robofish-behavior_loader - -build windows: - extends: .build windows + - ./.gitlab-ci.py prepare + --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package ubuntu-18.04' + --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package ubuntu-18.04' + --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package ubuntu-18.04' + +build windows-1809: + extends: .windows-1809 + <<: *build variables: - <<: [ *release ] + <<: [ *msvc15_9, *release ] before_script: - - . $Profile - - *msvc15_9 - - GitLab-Fetch-Artifacts bioroboticslab%2Fbiotracker%2Finterfaces master package%20windows - - CMake-Integrate-Package biotracker-interfaces - - GitLab-Fetch-Artifacts bioroboticslab%2Fbiotracker%2Futility master package%20windows - - CMake-Integrate-Package biotracker-utility - - GitLab-Fetch-Artifacts bioroboticslab%2Fbiotracker%2Fbehavior_loader master package%20windows - - CMake-Integrate-Package robofish-behavior_loader - - $env:PACKAGE_DIR = ("${env:TMP}/pkg" -Replace "\\","/") - - $env:PATH += ";${env:VCPKG_INSTALL_DIR}/bin" - - $env:PATH += ";$(resolve-path vendor/biotracker-interfaces/bin)" - -build windows[pylon5]: - extends: .build windows + - ./.gitlab-ci.py prepare + --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package ubuntu-18.04' + --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package ubuntu-18.04' + --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package ubuntu-18.04' + - $env:INSTALL_SHARED_LIBRARIES = 'flang;flangrti;libomp;zlib1;tiff;tiffxx;jpeg62;libpng16;lzma;openblas;boost_filesystem-vc141-mt-x64-1_68;boost_program_options-vc141-mt-x64-1_68' + - $env:INSTALL_OPENCV_COMPONENTS = 'core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab;ffmpeg' + +build windows-1809[pylon5]: + extends: .windows-1809 + <<: *build variables: - <<: [ *release, *pylon5 ] + <<: [ *msvc15_9, *release, *pylon5 ] before_script: - - . $Profile - - *msvc15_9 - - GitLab-Fetch-Artifacts bioroboticslab%2Fbiotracker%2Finterfaces master package%20windows - - CMake-Integrate-Package biotracker-interfaces - - GitLab-Fetch-Artifacts bioroboticslab%2Fbiotracker%2Futility master package%20windows - - CMake-Integrate-Package biotracker-utility - - GitLab-Fetch-Artifacts bioroboticslab%2Fbiotracker%2Fbehavior_loader master package%20windows - - CMake-Integrate-Package robofish-behavior_loader - - $env:PACKAGE_DIR = ("${env:TMP}/pkg" -Replace "\\","/") - - $env:PATH += ";${env:VCPKG_INSTALL_DIR}/bin" - - $env:PATH += ";$(resolve-path vendor/biotracker-interfaces/bin)" + - ./.gitlab-ci.py prepare + --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package ubuntu-18.04' + --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package ubuntu-18.04' + --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package ubuntu-18.04' + - $env:INSTALL_SHARED_LIBRARIES = 'flang;flangrti;libomp;zlib1;tiff;tiffxx;jpeg62;libpng16;lzma;openblas;boost_filesystem-vc141-mt-x64-1_68;boost_program_options-vc141-mt-x64-1_68' + - $env:INSTALL_OPENCV_COMPONENTS = 'core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab;ffmpeg' -package ubuntu-18.04: - extends: .ubuntu-18.04 - dependencies: - - build ubuntu-18.04 + +.package: &package stage: package - tags: [ linux, docker_privileged ] artifacts: paths: - build/*.AppImage - expire_in: 1 week - before_script: - - . /etc/profile.d/robofish.sh - - cmake-enable-package-discovery biotracker-interfaces - script: - - mkdir -p build/appdir/usr/bin - - mkdir -p build/appdir/usr/share/applications - - mkdir -p build/appdir/usr/share/icons/hicolor/256x256 - - cp build/Src/BioTracker build/appdir/usr/bin - - cp Src/BioTracker.desktop build/appdir/usr/share/applications - - cp Src/resources/logo/BT3-big.png build/appdir/usr/share/icons/hicolor/256x256 - - cd build - - linuxdeployqt appdir/usr/share/applications/BioTracker.desktop -appimage -no-translations - -.package windows: - extends: .windows - stage: package - artifacts: - paths: - build/*.msi expire_in: 1 week - script: - - ninja -C build package - - Copy-Item "$env:PACKAGE_DIR/*" build -Recurse + script: ./.gitlab-ci.py package -package windows: - extends: .package windows +package ubuntu-18.04: + extends: .ubuntu-18.04 dependencies: - - build windows - before_script: - - $env:PACKAGE_DIR = ("${env:TMP}/pkg" -Replace "\\","/") - - $env:PATH += ";${env:VCPKG_INSTALL_DIR}/bin" - - $env:PATH += ";$(resolve-path vendor/biotracker-interfaces/bin)" + - build ubuntu-18.04 + <<: *package + tags: [ linux, docker_privileged ] -package windows[pylon5]: - extends: .package windows +package windows-1809: + extends: .windows-1809 dependencies: - - build windows[pylon5] - before_script: - - $env:PACKAGE_DIR = ("${env:TMP}/pkg" -Replace "\\","/") - - $env:PATH += ";${env:VCPKG_INSTALL_DIR}/bin" - - $env:PATH += ";$(resolve-path vendor/biotracker-interfaces/bin)" + - build windows-1809 + <<: *package + +package windows-1809[pylon5]: + extends: .windows-1809 + dependencies: + - build windows-1809[pylon5] + <<: *package From 22ff98e7b60283b197cd1c993a80ac9b4a2398ad Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Mon, 15 Jul 2019 15:39:51 +0200 Subject: [PATCH 102/171] Fix ci/cd --- .gitlab-ci.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1795dacf..8a56edfd 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -56,9 +56,9 @@ build windows-1809: <<: [ *msvc15_9, *release ] before_script: - ./.gitlab-ci.py prepare - --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package ubuntu-18.04' - --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package ubuntu-18.04' - --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package ubuntu-18.04' + --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package windows-1809' + --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package windows-1809' + --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package windows-1809' - $env:INSTALL_SHARED_LIBRARIES = 'flang;flangrti;libomp;zlib1;tiff;tiffxx;jpeg62;libpng16;lzma;openblas;boost_filesystem-vc141-mt-x64-1_68;boost_program_options-vc141-mt-x64-1_68' - $env:INSTALL_OPENCV_COMPONENTS = 'core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab;ffmpeg' @@ -69,9 +69,9 @@ build windows-1809[pylon5]: <<: [ *msvc15_9, *release, *pylon5 ] before_script: - ./.gitlab-ci.py prepare - --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package ubuntu-18.04' - --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package ubuntu-18.04' - --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package ubuntu-18.04' + --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package windows-1809' + --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package windows-1809' + --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package windows-1809' - $env:INSTALL_SHARED_LIBRARIES = 'flang;flangrti;libomp;zlib1;tiff;tiffxx;jpeg62;libpng16;lzma;openblas;boost_filesystem-vc141-mt-x64-1_68;boost_program_options-vc141-mt-x64-1_68' - $env:INSTALL_OPENCV_COMPONENTS = 'core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab;ffmpeg' From 5e452a0884d6b02bdaee6b6efab8ecb7ffebe352 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Mon, 15 Jul 2019 17:46:40 +0200 Subject: [PATCH 103/171] Update ci/cd --- .gitlab-ci.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.py b/.gitlab-ci.py index 320c0bc7..ba4731f0 100755 --- a/.gitlab-ci.py +++ b/.gitlab-ci.py @@ -93,7 +93,7 @@ def build(args): command += ['-S', '.'] command += ['-B', 'build'] command += ['-G', 'Ninja'] - command += define('CMAKE_PREFIX_PATH', 'vendor') + command += define('CMAKE_PREFIX_PATH', Path('vendor').resolve()) command += define_env('CMAKE_BUILD_TYPE') command += define('CMAKE_SUPPRESS_REGENERATION', 'ON') command += define('CMAKE_SKIP_PACKAGE_ALL_DEPENDENCY', 'ON') From f833c2a9a5fa5e5717715c44062622d2a2589985 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Tue, 23 Jul 2019 16:29:55 +0200 Subject: [PATCH 104/171] Don't misuse the robofish namespace --- Src/CMakeLists.txt | 4 ++-- Src/Controller/ControllerPlugin.cpp | 2 +- Src/cmake/WIX/WIX.template.in | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index f2f5581b..708140b1 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -103,9 +103,9 @@ if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") set(CPACK_GENERATOR "WIX") set(CPACK_WIX_UPGRADE_GUID "e47473db-3d71-4c42-8a58-d3eac87aa0bd") - set(CPACK_PACKAGE_INSTALL_DIRECTORY "RoboFish/${target}") + set(CPACK_PACKAGE_INSTALL_DIRECTORY "BioTracker/BioTracker") - set(CPACK_WIX_PROGRAM_MENU_FOLDER "RoboFish") + set(CPACK_WIX_PROGRAM_MENU_FOLDER "BioTracker") set_property(INSTALL "$" PROPERTY CPACK_START_MENU_SHORTCUTS "${target}" diff --git a/Src/Controller/ControllerPlugin.cpp b/Src/Controller/ControllerPlugin.cpp index af0b1747..92918e10 100644 --- a/Src/Controller/ControllerPlugin.cpp +++ b/Src/Controller/ControllerPlugin.cpp @@ -11,7 +11,7 @@ #include "Controller/ControllerCoreParameter.h" #include "Controller/ControllerCommands.h" -#define REGISTRY_PATH "SOFTWARE\\FUBioroboticsLab\\Robofish\\BioTracker\\Plugins" +#define REGISTRY_PATH "SOFTWARE\\FUBioroboticsLab\\BioTracker\\Plugins" #define TRACKER_SUFFIX ".bio_tracker" ControllerPlugin::ControllerPlugin(QObject* parent, IBioTrackerContext* context, ENUMS::CONTROLLERTYPE ctr) : diff --git a/Src/cmake/WIX/WIX.template.in b/Src/cmake/WIX/WIX.template.in index aae0e719..30d6da02 100644 --- a/Src/cmake/WIX/WIX.template.in +++ b/Src/cmake/WIX/WIX.template.in @@ -38,7 +38,7 @@ - + From 85dc8f72d71efb442c236f305b35789d278efabf Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Mon, 5 Aug 2019 16:51:33 +0200 Subject: [PATCH 105/171] ci/cd: Bundle boost system on windows --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8a56edfd..49e0cc1d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -59,7 +59,7 @@ build windows-1809: --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package windows-1809' --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package windows-1809' --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package windows-1809' - - $env:INSTALL_SHARED_LIBRARIES = 'flang;flangrti;libomp;zlib1;tiff;tiffxx;jpeg62;libpng16;lzma;openblas;boost_filesystem-vc141-mt-x64-1_68;boost_program_options-vc141-mt-x64-1_68' + - $env:INSTALL_SHARED_LIBRARIES = 'flang;flangrti;libomp;zlib1;tiff;tiffxx;jpeg62;libpng16;lzma;openblas;boost_system-vc141-mt-x64-1_68;boost_filesystem-vc141-mt-x64-1_68;boost_program_options-vc141-mt-x64-1_68' - $env:INSTALL_OPENCV_COMPONENTS = 'core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab;ffmpeg' build windows-1809[pylon5]: @@ -72,7 +72,7 @@ build windows-1809[pylon5]: --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package windows-1809' --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package windows-1809' --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package windows-1809' - - $env:INSTALL_SHARED_LIBRARIES = 'flang;flangrti;libomp;zlib1;tiff;tiffxx;jpeg62;libpng16;lzma;openblas;boost_filesystem-vc141-mt-x64-1_68;boost_program_options-vc141-mt-x64-1_68' + - $env:INSTALL_SHARED_LIBRARIES = 'flang;flangrti;libomp;zlib1;tiff;tiffxx;jpeg62;libpng16;lzma;openblas;boost_system-vc141-mt-x64-1_68;boost_filesystem-vc141-mt-x64-1_68;boost_program_options-vc141-mt-x64-1_68' - $env:INSTALL_OPENCV_COMPONENTS = 'core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab;ffmpeg' From 6eb35863a0f8f0189a5e2b737aef830b14307a50 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Mon, 12 Aug 2019 16:28:38 +0200 Subject: [PATCH 106/171] Misc --- Src/Model/MediaPlayer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Src/Model/MediaPlayer.cpp b/Src/Model/MediaPlayer.cpp index a131c645..5f41e779 100644 --- a/Src/Model/MediaPlayer.cpp +++ b/Src/Model/MediaPlayer.cpp @@ -233,7 +233,7 @@ void MediaPlayer::receivePlayerParameters(playerParameters* param) { m_CurrentFrame = param->m_CurrentFrame; m_CurrentFrameNumber = param->m_CurrentFrameNumber; m_fpsOfSourceFile = param->m_fpsSourceVideo; - m_TotalNumbFrames = param->m_TotalNumbFrames; + m_TotalNumbFrames = param->m_TotalNumbFrames; m_CurrentFrame = param->m_CurrentFrame; const bool isValidFrame = !!m_CurrentFrame; From a1e8f9572a57958e003602f2b1452711112d1b40 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Mon, 12 Aug 2019 17:09:27 +0200 Subject: [PATCH 107/171] Fix crash on invalid frame --- Src/Model/MediaPlayer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Src/Model/MediaPlayer.cpp b/Src/Model/MediaPlayer.cpp index 5f41e779..84215f06 100644 --- a/Src/Model/MediaPlayer.cpp +++ b/Src/Model/MediaPlayer.cpp @@ -236,7 +236,7 @@ void MediaPlayer::receivePlayerParameters(playerParameters* param) { m_TotalNumbFrames = param->m_TotalNumbFrames; m_CurrentFrame = param->m_CurrentFrame; - const bool isValidFrame = !!m_CurrentFrame; + const bool isValidFrame = static_cast(m_CurrentFrame) && !m_CurrentFrame->empty(); if (isValidFrame) { From 269daed1b48ed1cb8a1fb79792edcf318b6eb7f0 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Tue, 13 Aug 2019 01:40:06 +0200 Subject: [PATCH 108/171] Update ci/cd to non-standard qt5 --- .gitlab-ci.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.gitlab-ci.py b/.gitlab-ci.py index ba4731f0..a2d8e34b 100755 --- a/.gitlab-ci.py +++ b/.gitlab-ci.py @@ -70,6 +70,11 @@ def setup_cuda(): if 'CUDA_PATH' in env: env['PATH'] += f"{pathsep}{env['CUDA_PATH']}/bin" +if system() == 'Linux': + + def setup_qt5(): + env['PATH'] += f"{pathsep}{env['Qt5_DIR']}/../../../bin/" + def setup_dependencies(): for path in Path('vendor').glob('*/bin'): @@ -123,6 +128,8 @@ def package(args): command = ['ninja', '-C', 'build', 'package'] if system() == 'Linux': + setup_qt5() + makedirs('build/appdir/usr/bin') makedirs('build/appdir/usr/share/applications') makedirs('build/appdir/usr/share/icons/hicolor/256x256') From 16cfd628c5d5c736c1e0267617c22839e6bb74e3 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Tue, 13 Aug 2019 02:29:14 +0200 Subject: [PATCH 109/171] Fixup ci/cd (hopefully) --- .gitlab-ci.py | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.py b/.gitlab-ci.py index a2d8e34b..5d61e21e 100755 --- a/.gitlab-ci.py +++ b/.gitlab-ci.py @@ -73,6 +73,7 @@ def setup_cuda(): if system() == 'Linux': def setup_qt5(): + env['PATH'] += f"{pathsep}/usr/lib/x86_64-linux-gnu" env['PATH'] += f"{pathsep}{env['Qt5_DIR']}/../../../bin/" From e6cd85e94fa5184cbdec6d32c5b0c61386dbbfca Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Tue, 13 Aug 2019 03:09:27 +0200 Subject: [PATCH 110/171] ci/cd: Revert superfluous code --- .gitlab-ci.py | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitlab-ci.py b/.gitlab-ci.py index 5d61e21e..a2d8e34b 100755 --- a/.gitlab-ci.py +++ b/.gitlab-ci.py @@ -73,7 +73,6 @@ def setup_cuda(): if system() == 'Linux': def setup_qt5(): - env['PATH'] += f"{pathsep}/usr/lib/x86_64-linux-gnu" env['PATH'] += f"{pathsep}{env['Qt5_DIR']}/../../../bin/" From b4b2537dcf840a47abd018dde02427b5cf36053f Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Wed, 14 Aug 2019 15:21:10 +0200 Subject: [PATCH 111/171] Misc --- Src/Model/AreaDescriptor/AreaInfoElement.cpp | 20 ++++----- Src/Model/AreaDescriptor/AreaInfoElement.h | 46 ++++++++++---------- Src/View/AreaDesciptor/RectDescriptor.h | 38 ++++++++-------- 3 files changed, 52 insertions(+), 52 deletions(-) diff --git a/Src/Model/AreaDescriptor/AreaInfoElement.cpp b/Src/Model/AreaDescriptor/AreaInfoElement.cpp index 995eb4d6..6dbb6f27 100644 --- a/Src/Model/AreaDescriptor/AreaInfoElement.cpp +++ b/Src/Model/AreaDescriptor/AreaInfoElement.cpp @@ -68,13 +68,13 @@ void AreaInfoElement::setVerticeAtLocation(const QPoint &pos, int vertice) { Q_EMIT updatedVertices(); } - -bool AreaInfoElement::isHandleAtPosition(const cv::Point2f &handle, const QPoint &pos) { - return isHandleAtPosition(QPoint(handle.x, handle.y), pos); -} -bool AreaInfoElement::isHandleAtPosition(const QPoint &handle, const QPoint &pos) -{ - QPoint diff = handle - pos; - const float euclidian = std::sqrt((diff.x() * diff.x()) + (diff.y() * diff.y())); - return euclidian <= 20.0; -} + +bool AreaInfoElement::isHandleAtPosition(const cv::Point2f &handle, const QPoint &pos) { + return isHandleAtPosition(QPoint(handle.x, handle.y), pos); +} +bool AreaInfoElement::isHandleAtPosition(const QPoint &handle, const QPoint &pos) +{ + QPoint diff = handle - pos; + const float euclidian = std::sqrt((diff.x() * diff.x()) + (diff.y() * diff.y())); + return euclidian <= 20.0; +} diff --git a/Src/Model/AreaDescriptor/AreaInfoElement.h b/Src/Model/AreaDescriptor/AreaInfoElement.h index 6653d6c0..cbc7b87b 100644 --- a/Src/Model/AreaDescriptor/AreaInfoElement.h +++ b/Src/Model/AreaDescriptor/AreaInfoElement.h @@ -1,4 +1,4 @@ -#pragma once +#pragma once #include "Interfaces/IModel/IModel.h" #include #include @@ -37,33 +37,33 @@ class AreaInfoElement : public IModel void setVerticeAtLocation(const QPoint &pos, int vertice); int getVerticeAtLocation(const QPoint &pos); - - virtual QPoint *getHandleForPosition(const QPoint &pos) - { - if (isHandleAtPosition(_origin, pos)) return &_origin; - return nullptr; - } - - void setShowNumbers(bool b) { - _showNumbers = b; - } - - bool getShowNumbers() { - return _showNumbers; - } - - BiotrackerTypes::AreaType getAreaType() { return _areaType; } - void setAreaType(BiotrackerTypes::AreaType t) { _areaType = t; } - -protected: - bool isHandleAtPosition(const cv::Point2f &handle, const QPoint &pos); + + virtual QPoint *getHandleForPosition(const QPoint &pos) + { + if (isHandleAtPosition(_origin, pos)) return &_origin; + return nullptr; + } + + void setShowNumbers(bool b) { + _showNumbers = b; + } + + bool getShowNumbers() { + return _showNumbers; + } + + BiotrackerTypes::AreaType getAreaType() { return _areaType; } + void setAreaType(BiotrackerTypes::AreaType t) { _areaType = t; } + +protected: + bool isHandleAtPosition(const cv::Point2f &handle, const QPoint &pos); bool isHandleAtPosition(const QPoint &handle, const QPoint &pos); signals: void updatedVertices(); -private: - // Position in pixels. +private: + // Position in pixels. QPoint _origin{ 0, 0 }; bool _showNumbers; diff --git a/Src/View/AreaDesciptor/RectDescriptor.h b/Src/View/AreaDesciptor/RectDescriptor.h index b11e876a..d05b1672 100644 --- a/Src/View/AreaDesciptor/RectDescriptor.h +++ b/Src/View/AreaDesciptor/RectDescriptor.h @@ -13,7 +13,7 @@ class RectDescriptor : public AreaDescriptor RectDescriptor(IController *controller = 0, IModel *model = 0); ~RectDescriptor(); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; - + QRectF boundingRect() const override; bool inShape(QPoint p); @@ -29,35 +29,35 @@ public Q_SLOTS: void getNotified(); void receiveDragUpdate(BiotrackerTypes::AreaType vectorType, int id, double x, double y); -protected: +protected: bool sceneEventFilter(QGraphicsItem * watched, QEvent * event) override; void updateLinePositions(); private: void init(); - bool _isInit; - - QGraphicsItem *_watchingDrag; - int _dragX; + bool _isInit; + + QGraphicsItem *_watchingDrag; + int _dragX; int _dragY; std::vector _v; - //Rects - std::vector> _rectification; - std::vector> _rectificationLines; + //Rects + std::vector> _rectification; + std::vector> _rectificationLines; std::vector> _rectificationNumbers; - QBrush _brush; - - BiotrackerTypes::AreaType _dragType; - int _dragVectorId; - QPoint _drag; - - // IView interface -public: - void setNewModel(IModel *model) override { setModel(model); }; -protected: + QBrush _brush; + + BiotrackerTypes::AreaType _dragType; + int _dragVectorId; + QPoint _drag; + + // IView interface +public: + void setNewModel(IModel *model) override { setModel(model); }; +protected: void connectModelView() override {}; }; From c9c7f7983e4ebbdf37fddcd1ec5bfdc2acec83de Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Wed, 14 Aug 2019 15:21:39 +0200 Subject: [PATCH 112/171] OpenCV 4 compatibility --- Src/Model/AreaDescriptor/AreaInfoElement.cpp | 4 ++-- Src/Model/AreaDescriptor/AreaInfoElement.h | 4 ++-- Src/Model/ImageStream.cpp | 24 ++++++++++---------- Src/Model/MediaPlayer.cpp | 6 ++--- Src/Model/TextureObject.cpp | 4 ++-- Src/View/AreaDesciptor/AreaDescriptor.h | 2 +- Src/View/AreaDesciptor/RectDescriptor.h | 2 +- Src/View/CameraDevice.cpp | 10 ++++---- Src/util/VideoCoder.cpp | 4 ++-- 9 files changed, 30 insertions(+), 30 deletions(-) diff --git a/Src/Model/AreaDescriptor/AreaInfoElement.cpp b/Src/Model/AreaDescriptor/AreaInfoElement.cpp index 6dbb6f27..5ce6c01b 100644 --- a/Src/Model/AreaDescriptor/AreaInfoElement.cpp +++ b/Src/Model/AreaDescriptor/AreaInfoElement.cpp @@ -1,7 +1,7 @@ #include "AreaInfoElement.h" -#include -#include "opencv2/imgproc/imgproc.hpp" +#include +#include AreaInfoElement::AreaInfoElement(int type) : _areaType(BiotrackerTypes::AreaType::NONE), diff --git a/Src/Model/AreaDescriptor/AreaInfoElement.h b/Src/Model/AreaDescriptor/AreaInfoElement.h index cbc7b87b..5ed1d957 100644 --- a/Src/Model/AreaDescriptor/AreaInfoElement.h +++ b/Src/Model/AreaDescriptor/AreaInfoElement.h @@ -1,11 +1,11 @@ #pragma once #include "Interfaces/IModel/IModel.h" -#include +#include #include #include "util/types.h" class AreaInfoElement : public IModel -{ +{ Q_OBJECT public: diff --git a/Src/Model/ImageStream.cpp b/Src/Model/ImageStream.cpp index 5799cc91..10ca51ce 100644 --- a/Src/Model/ImageStream.cpp +++ b/Src/Model/ImageStream.cpp @@ -315,8 +315,8 @@ namespace BioTracker { void openMedia(std::vector files){ m_capture.open(files.front().string()); - m_num_frames = static_cast(m_capture.get(CV_CAP_PROP_FRAME_COUNT)); - m_fps = m_capture.get(CV_CAP_PROP_FPS); + m_num_frames = static_cast(m_capture.get(cv::CAP_PROP_FRAME_COUNT)); + m_fps = m_capture.get(cv::CAP_PROP_FPS); m_fileName = files.front().string(); if (!boost::filesystem::exists(files.front())) { @@ -335,8 +335,8 @@ namespace BioTracker { m_fps = fps; } - m_w = m_capture.get(CV_CAP_PROP_FRAME_WIDTH); - m_h = m_capture.get(CV_CAP_PROP_FRAME_HEIGHT); + m_w = m_capture.get(cv::CAP_PROP_FRAME_WIDTH); + m_h = m_capture.get(cv::CAP_PROP_FRAME_HEIGHT); m_recording = false; vCoder = std::make_shared(m_fps, _cfg); @@ -367,7 +367,7 @@ namespace BioTracker { } else { // adjust frame position ("0-based index of the frame to be decoded/captured next.") - m_capture.set(CV_CAP_PROP_POS_FRAMES, static_cast(frame_number)); + m_capture.set(cv::CAP_PROP_POS_FRAMES, static_cast(frame_number)); return this->nextFrame_impl(); } } @@ -396,7 +396,7 @@ namespace BioTracker { explicit ImageStream3OpenCVCamera(Config *cfg, CameraConfiguration conf) : ImageStream(0, cfg) , m_capture(conf._selector.index) - , m_fps(m_capture.get(CV_CAP_PROP_FPS)) { + , m_fps(m_capture.get(cv::CAP_PROP_FPS)) { // Give the camera some extra time to get ready: // Somehow opening it on first try sometimes does not succeed. // Workaround: http://stackoverflow.com/questions/22019064/unable-to-read-frames-from-videocapture-from-secondary-webcam-with-opencv?rq=1 @@ -422,13 +422,13 @@ namespace BioTracker { throw device_open_error(":("); } - if (m_w != -1) m_capture.set(CV_CAP_PROP_FRAME_WIDTH, m_w); - if (m_h != -1) m_capture.set(CV_CAP_PROP_FRAME_HEIGHT, m_h); - if (m_fps != -1) m_capture.set(CV_CAP_PROP_FPS, m_fps); + if (m_w != -1) m_capture.set(cv::CAP_PROP_FRAME_WIDTH, m_w); + if (m_h != -1) m_capture.set(cv::CAP_PROP_FRAME_HEIGHT, m_h); + if (m_fps != -1) m_capture.set(cv::CAP_PROP_FPS, m_fps); - m_w = m_capture.get(CV_CAP_PROP_FRAME_WIDTH); - m_h = m_capture.get(CV_CAP_PROP_FRAME_HEIGHT); - m_fps = m_capture.get(CV_CAP_PROP_FPS); + m_w = m_capture.get(cv::CAP_PROP_FRAME_WIDTH); + m_h = m_capture.get(cv::CAP_PROP_FRAME_HEIGHT); + m_fps = m_capture.get(cv::CAP_PROP_FPS); qDebug() << "Cam open: " << m_capture.isOpened() << " w/h:" << m_w << "/" << m_h << " fps:" << m_fps; // load first image if (this->numFrames() > 0) { diff --git a/Src/Model/MediaPlayer.cpp b/Src/Model/MediaPlayer.cpp index 84215f06..8c1e446d 100644 --- a/Src/Model/MediaPlayer.cpp +++ b/Src/Model/MediaPlayer.cpp @@ -185,8 +185,8 @@ int MediaPlayer::reopenVideoWriter() { _imagew = r.width(); _imageh = r.height(); - int codec = CV_FOURCC('X', '2', '6', '4'); - m_videoWriter = std::make_shared(getTimeAndDate("./ViewCapture", ".avi"), codec, 30, CvSize(r.width(), r.height()), 1); + int codec = cv::VideoWriter::fourcc('X', '2', '6', '4'); + m_videoWriter = std::make_shared(getTimeAndDate("./ViewCapture", ".avi"), codec, 30, cv::Size(r.width(), r.height()), 1); m_recd = m_videoWriter->isOpened(); } } @@ -273,7 +273,7 @@ void MediaPlayer::receivePlayerParameters(playerParameters* param) { auto view = cv::Mat(m_image.height(), m_image.width(), CV_8UC(m_image.depth() / 8), m_image.bits(), m_image.bytesPerLine()); auto copy = std::make_shared(view.clone()); - cv::cvtColor(*copy, *copy, CV_BGR2RGB); + cv::cvtColor(*copy, *copy, cv::ColorConversionCodes::COLOR_BGR2RGB); m_videoc->add(copy); } } diff --git a/Src/Model/TextureObject.cpp b/Src/Model/TextureObject.cpp index 91a09ea0..781939be 100644 --- a/Src/Model/TextureObject.cpp +++ b/Src/Model/TextureObject.cpp @@ -15,7 +15,7 @@ void TextureObject::set(const cv::Mat &img) { return; if (img.channels() == 3) { img.convertTo(img, CV_8UC3); - cv::cvtColor(img, m_img, CV_BGR2RGB); + cv::cvtColor(img, m_img, cv::ColorConversionCodes::COLOR_BGR2RGB); } else if (img.channels() == 1) { // convert grayscale to "color" cv::Mat img8U; @@ -36,7 +36,7 @@ void TextureObject::set(const cv::Mat &img) { const double convertedMin = abs(static_cast(min * sizeRatio)); img.convertTo(img8U, CV_8U, sizeRatio, convertedMin); } - cv::cvtColor(img8U, m_img, CV_GRAY2RGB); + cv::cvtColor(img8U, m_img, cv::ColorConversionCodes::COLOR_GRAY2RGB); } else { m_img = img; } diff --git a/Src/View/AreaDesciptor/AreaDescriptor.h b/Src/View/AreaDesciptor/AreaDescriptor.h index 8a2e198c..aea4dfad 100644 --- a/Src/View/AreaDesciptor/AreaDescriptor.h +++ b/Src/View/AreaDesciptor/AreaDescriptor.h @@ -1,7 +1,7 @@ #pragma once #include "Interfaces/IView/IViewTrackedComponent.h" -#include +#include #include "util/Config.h" class AreaDescriptor : public QObject, public IView, public QGraphicsItem diff --git a/Src/View/AreaDesciptor/RectDescriptor.h b/Src/View/AreaDesciptor/RectDescriptor.h index d05b1672..4499390b 100644 --- a/Src/View/AreaDesciptor/RectDescriptor.h +++ b/Src/View/AreaDesciptor/RectDescriptor.h @@ -1,7 +1,7 @@ #pragma once #include "AreaDescriptor.h" -#include "cv.h" +#include #include #include "util/types.h" #include diff --git a/Src/View/CameraDevice.cpp b/Src/View/CameraDevice.cpp index d8391415..2a2af757 100644 --- a/Src/View/CameraDevice.cpp +++ b/Src/View/CameraDevice.cpp @@ -66,11 +66,11 @@ void CameraDevice::on_showPreviewButton_clicked() std::this_thread::sleep_for(std::chrono::milliseconds(100)); if (conf._width != -1) - m_capture.set(CV_CAP_PROP_FRAME_WIDTH, conf._width); + m_capture.set(cv::CAP_PROP_FRAME_WIDTH, conf._width); if (conf._height != -1) - m_capture.set(CV_CAP_PROP_FRAME_HEIGHT, conf._height); + m_capture.set(cv::CAP_PROP_FRAME_HEIGHT, conf._height); if (conf._fps != -1) - m_capture.set(CV_CAP_PROP_FPS, conf._fps); + m_capture.set(cv::CAP_PROP_FPS, conf._fps); if (!m_capture.isOpened()) { @@ -151,12 +151,12 @@ void CameraDevice::listAllCameras() } { - cv::VideoCapture ximea_camera(CV_CAP_XIAPI); + cv::VideoCapture ximea_camera(cv::CAP_XIAPI); if (ximea_camera.isOpened()) { ui->comboBox->addItem( "XIMEA default", - QVariant::fromValue(CameraSelector{CameraType::OpenCV, CV_CAP_XIAPI})); + QVariant::fromValue(CameraSelector{CameraType::OpenCV, cv::CAP_XIAPI})); } } diff --git a/Src/util/VideoCoder.cpp b/Src/util/VideoCoder.cpp index 00f89072..0b3ce610 100644 --- a/Src/util/VideoCoder.cpp +++ b/Src/util/VideoCoder.cpp @@ -180,8 +180,8 @@ int VideoCoder::toggle(int w, int h, double fps) { //Check which one to use if (codecStr == "X264") { - int codec = CV_FOURCC('X', 'V', 'I', 'D'); - vWriter = std::make_shared(getTimeAndDate(videoDir+"CameraCapture", ".avi"), codec, fps, CvSize(w, h), 1); + int codec = cv::VideoWriter::fourcc('X', 'V', 'I', 'D'); + vWriter = std::make_shared(getTimeAndDate(videoDir+"CameraCapture", ".avi"), codec, fps, cv::Size(w, h), 1); m_recording = vWriter->isOpened(); vWriter->set(cv::VIDEOWRITER_PROP_QUALITY, 100); std::cout << "Video is open:" << m_recording << std::endl; From 47cb97fe2ce3c1925fa0f2ef4aa082f7c8b70cf7 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Thu, 15 Aug 2019 18:44:10 +0200 Subject: [PATCH 113/171] Update ci/cd and README for no flang dependency --- .gitlab-ci.yml | 4 ++-- README.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 49e0cc1d..112684a0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -59,7 +59,7 @@ build windows-1809: --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package windows-1809' --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package windows-1809' --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package windows-1809' - - $env:INSTALL_SHARED_LIBRARIES = 'flang;flangrti;libomp;zlib1;tiff;tiffxx;jpeg62;libpng16;lzma;openblas;boost_system-vc141-mt-x64-1_68;boost_filesystem-vc141-mt-x64-1_68;boost_program_options-vc141-mt-x64-1_68' + - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;tiffxx;jpeg62;libpng16;lzma;openblas;boost_system-vc141-mt-x64-1_68;boost_filesystem-vc141-mt-x64-1_68;boost_program_options-vc141-mt-x64-1_68' - $env:INSTALL_OPENCV_COMPONENTS = 'core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab;ffmpeg' build windows-1809[pylon5]: @@ -72,7 +72,7 @@ build windows-1809[pylon5]: --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package windows-1809' --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package windows-1809' --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package windows-1809' - - $env:INSTALL_SHARED_LIBRARIES = 'flang;flangrti;libomp;zlib1;tiff;tiffxx;jpeg62;libpng16;lzma;openblas;boost_system-vc141-mt-x64-1_68;boost_filesystem-vc141-mt-x64-1_68;boost_program_options-vc141-mt-x64-1_68' + - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;tiffxx;jpeg62;libpng16;lzma;openblas;boost_system-vc141-mt-x64-1_68;boost_filesystem-vc141-mt-x64-1_68;boost_program_options-vc141-mt-x64-1_68' - $env:INSTALL_OPENCV_COMPONENTS = 'core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab;ffmpeg' diff --git a/README.md b/README.md index 2c7c435a..0af38e79 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ Get the boost and opencv packages: `vcpkg install openblas:x64-windows-14.16 opencv[opengl,ffmpeg,ximea,cuda]:x64-windows-14.16 ` ... and Qt systemwide using Qt5_dir Now call cmake with some switches to include vcpkg: `-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-14.16` -... and build. You might need to copy flang DLL files, as their vcpkg integration is not yet complete. +... and build. Proceed withe the build steps as in the linux section. ## Building BioTracker (Linux) From 77bc51e63045cfec117093575c81b5ccb4e05ebf Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Thu, 15 Aug 2019 20:15:17 +0200 Subject: [PATCH 114/171] Fix ci/cd --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 112684a0..4af7d464 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -59,7 +59,7 @@ build windows-1809: --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package windows-1809' --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package windows-1809' --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package windows-1809' - - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;tiffxx;jpeg62;libpng16;lzma;openblas;boost_system-vc141-mt-x64-1_68;boost_filesystem-vc141-mt-x64-1_68;boost_program_options-vc141-mt-x64-1_68' + - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;jpeg62;libpng16;lzma;openblas;boost_system-vc141-mt-x64-1_68;boost_filesystem-vc141-mt-x64-1_68;boost_program_options-vc141-mt-x64-1_68' - $env:INSTALL_OPENCV_COMPONENTS = 'core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab;ffmpeg' build windows-1809[pylon5]: @@ -72,7 +72,7 @@ build windows-1809[pylon5]: --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package windows-1809' --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package windows-1809' --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package windows-1809' - - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;tiffxx;jpeg62;libpng16;lzma;openblas;boost_system-vc141-mt-x64-1_68;boost_filesystem-vc141-mt-x64-1_68;boost_program_options-vc141-mt-x64-1_68' + - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;jpeg62;libpng16;lzma;openblas;boost_system-vc141-mt-x64-1_68;boost_filesystem-vc141-mt-x64-1_68;boost_program_options-vc141-mt-x64-1_68' - $env:INSTALL_OPENCV_COMPONENTS = 'core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab;ffmpeg' From ee7acea1200b6ec5ac2dcb989896bb7c61d7a8bb Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Thu, 15 Aug 2019 20:26:13 +0200 Subject: [PATCH 115/171] Fix ci/cd: updated boost version --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4af7d464..ed52000a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -59,7 +59,7 @@ build windows-1809: --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package windows-1809' --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package windows-1809' --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package windows-1809' - - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;jpeg62;libpng16;lzma;openblas;boost_system-vc141-mt-x64-1_68;boost_filesystem-vc141-mt-x64-1_68;boost_program_options-vc141-mt-x64-1_68' + - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;jpeg62;libpng16;lzma;openblas;boost_system-vc141-mt-x64-1_70;boost_filesystem-vc141-mt-x64-1_70;boost_program_options-vc141-mt-x64-1_70' - $env:INSTALL_OPENCV_COMPONENTS = 'core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab;ffmpeg' build windows-1809[pylon5]: @@ -72,7 +72,7 @@ build windows-1809[pylon5]: --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package windows-1809' --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package windows-1809' --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package windows-1809' - - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;jpeg62;libpng16;lzma;openblas;boost_system-vc141-mt-x64-1_68;boost_filesystem-vc141-mt-x64-1_68;boost_program_options-vc141-mt-x64-1_68' + - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;jpeg62;libpng16;lzma;openblas;boost_system-vc141-mt-x64-1_70;boost_filesystem-vc141-mt-x64-1_70;boost_program_options-vc141-mt-x64-1_70' - $env:INSTALL_OPENCV_COMPONENTS = 'core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab;ffmpeg' From 565ca9a2c698a30735d569da5687d3bbff3098d7 Mon Sep 17 00:00:00 2001 From: David Dormagen Date: Mon, 2 Sep 2019 18:39:07 +0200 Subject: [PATCH 116/171] Annotations: correctly load origin positions from JSON file --- Src/Model/Annotations.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Src/Model/Annotations.cpp b/Src/Model/Annotations.cpp index 6c5a39d2..f4027caf 100644 --- a/Src/Model/Annotations.cpp +++ b/Src/Model/Annotations.cpp @@ -148,7 +148,7 @@ void Annotations::Annotation::deserializeFrom(const QMap &map text = map.value("comment", text).toString(); startFrame = map.value("start_frame", static_cast(startFrame)).toInt(); endFrame = map.value("end_frame", static_cast(endFrame)).toInt(); - origin.position.setY(map.value("origin_x", origin.x()).toInt()); + origin.position.setX(map.value("origin_x", origin.x()).toInt()); origin.position.setY(map.value("origin_y", origin.y()).toInt()); if (map.contains("origin_track_id")) { From 2a9bc22370c6af7e60e6c1caa36e983f858607af Mon Sep 17 00:00:00 2001 From: David Dormagen Date: Fri, 29 Nov 2019 17:10:58 +0100 Subject: [PATCH 117/171] annotations QOL: easier selection and thinner visuals --- Src/Controller/ControllerAnnotations.cpp | 10 ++++++++-- Src/Model/Annotations.cpp | 19 ++++++++++++++----- Src/View/AnnotationsView.cpp | 8 ++++---- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/Src/Controller/ControllerAnnotations.cpp b/Src/Controller/ControllerAnnotations.cpp index 4d0f96fb..d490336d 100644 --- a/Src/Controller/ControllerAnnotations.cpp +++ b/Src/Controller/ControllerAnnotations.cpp @@ -132,7 +132,10 @@ void ControllerAnnotations::keyPressEvent(QKeyEvent *event) if (handled) + { + updateView(); event->accept(); + } } void ControllerAnnotations::mousePressEvent(QMouseEvent *event, const QPoint &pos) @@ -178,6 +181,7 @@ void ControllerAnnotations::mousePressEvent(QMouseEvent *event, const QPoint &po if (model->trySetText(pos)) { updateView(); + model->serialize(); } else { handled = false; @@ -241,10 +245,11 @@ Annotations::TrackedPoint ControllerAnnotations::snapToTrajectory(const QPoint & void ControllerAnnotations::mouseReleaseEvent(QMouseEvent*event, const QPoint &pos) { auto model = static_cast(getModel()); + const bool isAltModifierActive = QGuiApplication::queryKeyboardModifiers().testFlag(Qt::AltModifier); Annotations::TrackedPoint trackedPoint = snapToTrajectory(pos); - if ((event->button() == Qt::LeftButton) && (model->endAnnotation(trackedPoint) || model->updateAnnotation(trackedPoint))) + if ((event->button() == Qt::LeftButton) && !isAltModifierActive && (model->endAnnotation(trackedPoint) || model->updateAnnotation(trackedPoint))) { updateView(); event->accept(); @@ -254,10 +259,11 @@ void ControllerAnnotations::mouseReleaseEvent(QMouseEvent*event, const QPoint &p void ControllerAnnotations::mouseMoveEvent(QMouseEvent*event, const QPoint &pos) { auto model = static_cast(getModel()); + const bool isAltModifierActive = QGuiApplication::queryKeyboardModifiers().testFlag(Qt::AltModifier); Annotations::TrackedPoint trackedPoint = snapToTrajectory(pos); - if ((event->buttons() & Qt::LeftButton) && model->updateAnnotation(trackedPoint)) + if ((event->buttons() & Qt::LeftButton) && !isAltModifierActive && model->updateAnnotation(trackedPoint)) { updateView(); event->accept(); diff --git a/Src/Model/Annotations.cpp b/Src/Model/Annotations.cpp index f4027caf..34d95c78 100644 --- a/Src/Model/Annotations.cpp +++ b/Src/Model/Annotations.cpp @@ -11,6 +11,7 @@ #include #include #include +#include Annotations::~Annotations() { @@ -104,7 +105,7 @@ void Annotations::Annotation::drawHandleLocation(QPainter *painter, QPoint pos, QPen original{ painter->pen() }; QPen dotted{ original }; dotted.setStyle(Qt::PenStyle::DotLine); - dotted.setWidthF(dotted.widthF() / 2.0); + dotted.setWidthF(dotted.widthF() / 4.0); painter->setPen(dotted); const int radius = 20; painter->drawEllipse(pos, radius, radius); @@ -348,15 +349,23 @@ bool Annotations::updateAnnotation(TrackedPoint cursor) bool Annotations::tryStartDragging(QPoint cursor) { selection.reset(); + float currentDistance = std::numeric_limits::max(); + bool annotationFound = false; for (auto &annotation : annotations) { - if (!(selection.handle = annotation->getHandleForPosition(cursor))) { + auto handle = annotation->getHandleForPosition(cursor); + if (!handle) // Nothing found? continue; - } + const float distance = QVector2D {handle->getPoint() - cursor}.length(); + if (distance >= currentDistance) // Point is farther? + continue; + // New best point found! + currentDistance = distance; + selection.handle = handle; selection.annotation = annotation; - return true; + annotationFound = true; } - return false; + return annotationFound; } bool Annotations::trySetText(QPoint cursor) { diff --git a/Src/View/AnnotationsView.cpp b/Src/View/AnnotationsView.cpp index 8cb40031..63d5a115 100644 --- a/Src/View/AnnotationsView.cpp +++ b/Src/View/AnnotationsView.cpp @@ -50,12 +50,12 @@ void AnnotationsView::paint(QPainter * painter, const QStyleOptionGraphicsItem * // Is the current frame in the annotation's range? if ((currentFrame >= annotation->startFrame && currentFrame <= annotation->endFrame) || (currentFrame == annotation->startFrame && annotation->startFrame > annotation->endFrame)) - painter->setPen(QPen(_annoColor, 6, Qt::SolidLine, Qt::RoundCap)); + painter->setPen(QPen(_annoColor, 3, Qt::SolidLine, Qt::RoundCap)); else { QColor transparentGray = Qt::gray; transparentGray.setAlphaF(0.25); - painter->setPen(QPen(transparentGray, 6, Qt::SolidLine, Qt::RoundCap)); + painter->setPen(QPen(transparentGray, 3, Qt::SolidLine, Qt::RoundCap)); } annotation->paint(painter, option, widget); } @@ -64,12 +64,12 @@ void AnnotationsView::paint(QPainter * painter, const QStyleOptionGraphicsItem * { QColor transparentYellow = _annoColor; transparentYellow.setAlphaF(0.5); - painter->setPen(QPen(transparentYellow, 6, Qt::SolidLine, Qt::RoundCap)); + painter->setPen(QPen(transparentYellow, 3, Qt::SolidLine, Qt::RoundCap)); model->currentAnnotation->paint(painter, option, widget); } if (model->selection) { - painter->setPen(QPen(Qt::red, 6, Qt::SolidLine, Qt::RoundCap)); + painter->setPen(QPen(Qt::red, 3, Qt::SolidLine, Qt::RoundCap)); Annotations::Annotation::drawHandleLocation(painter, *model->selection.handle, ""); } } \ No newline at end of file From 8e39e553f66c5b37d87b749697aa13d282722296 Mon Sep 17 00:00:00 2001 From: David Dormagen Date: Fri, 29 Nov 2019 17:25:31 +0100 Subject: [PATCH 118/171] annotations: allow hiding with Alt+H --- Src/Controller/ControllerAnnotations.cpp | 7 ++++++- Src/Model/Annotations.cpp | 24 ++++++++++++++++++++++++ Src/Model/Annotations.h | 8 ++++++++ Src/View/AnnotationsView.cpp | 2 ++ 4 files changed, 40 insertions(+), 1 deletion(-) diff --git a/Src/Controller/ControllerAnnotations.cpp b/Src/Controller/ControllerAnnotations.cpp index d490336d..d4dce888 100644 --- a/Src/Controller/ControllerAnnotations.cpp +++ b/Src/Controller/ControllerAnnotations.cpp @@ -107,7 +107,12 @@ void ControllerAnnotations::keyPressEvent(QKeyEvent *event) case Qt::Key::Key_E: actionQueued = ActionQueued::CreateEllipse; break; - case Qt::Key::Key_Delete: + case Qt::Key::Key_H: + model->toggleHideAnnotations(); + handled = true; + break; + case Qt::Key::Key_Delete: // Fallthrough. + case Qt::Key::Key_Backspace: // Remove existing selected annotation at current frame. if (model->removeSelection()) { diff --git a/Src/Model/Annotations.cpp b/Src/Model/Annotations.cpp index 34d95c78..7bd91b62 100644 --- a/Src/Model/Annotations.cpp +++ b/Src/Model/Annotations.cpp @@ -353,6 +353,8 @@ bool Annotations::tryStartDragging(QPoint cursor) bool annotationFound = false; for (auto &annotation : annotations) { + if (annotation->isHidden()) + continue; auto handle = annotation->getHandleForPosition(cursor); if (!handle) // Nothing found? continue; @@ -372,6 +374,8 @@ bool Annotations::trySetText(QPoint cursor) { selection.reset(); for (auto &annotation : annotations) { + if (annotation->isHidden()) + continue; if (!(selection.handle = annotation->getHandleForPosition(cursor))) { continue; } @@ -442,3 +446,23 @@ bool Annotations::updateSelectionEndFrame() selectedAnnotation->startFrame = selectedAnnotation->endFrame; return true; } + +void Annotations::toggleHideAnnotations() +{ + bool allWereHidden = true; + for (auto &annotation : annotations) + { + if (!annotation->isHidden()) + { + allWereHidden = false; + annotation->setHidden(true); + } + } + + if (allWereHidden) + { + for (auto &annotation : annotations) + annotation->setHidden(false); + } + +} \ No newline at end of file diff --git a/Src/Model/Annotations.h b/Src/Model/Annotations.h index 5d768afb..90aeabe6 100644 --- a/Src/Model/Annotations.h +++ b/Src/Model/Annotations.h @@ -104,12 +104,18 @@ class Annotations : public IModel { { origin.update(currentFrameID, trackedComponents); } + // Visually disable annotations and interactions with them. + // This will not be serialized. + void setHidden(bool hidden=true) { this->hidden = hidden; } + bool isHidden() const { return hidden; } protected: bool isHandleAtPosition(const QPoint &handle, const QPoint &pos); bool isHandleAtPosition(const TrackedPoint &handle, const QPoint &pos) { return isHandleAtPosition(*handle, pos); } + private: + bool hidden { false }; }; /// A label marks a position. @@ -185,6 +191,8 @@ class Annotations : public IModel { size_t getCurrentFrame() const { return currentFrame; } // Called when trajectories or displayed frames have changed. void updateTrackedAnnotations(const QList &trackedComponents); + // Used to hide existing annotations, or if all are hidden, unhide them. + void toggleHideAnnotations(); private: size_t currentFrame{ 0 }; /**< The current frame is required by the view. */ diff --git a/Src/View/AnnotationsView.cpp b/Src/View/AnnotationsView.cpp index 63d5a115..c8fb64dc 100644 --- a/Src/View/AnnotationsView.cpp +++ b/Src/View/AnnotationsView.cpp @@ -47,6 +47,8 @@ void AnnotationsView::paint(QPainter * painter, const QStyleOptionGraphicsItem * const auto currentFrame = model->getCurrentFrame(); for (auto &annotation : model->annotations) { + if (annotation->isHidden()) + continue; // Is the current frame in the annotation's range? if ((currentFrame >= annotation->startFrame && currentFrame <= annotation->endFrame) || (currentFrame == annotation->startFrame && annotation->startFrame > annotation->endFrame)) From 9a234ca327ea4874917b0e207cfd577b1a3ab681 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Tue, 10 Dec 2019 15:50:31 +0100 Subject: [PATCH 119/171] ci: add centos-7 build --- .gitlab-ci.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ed52000a..49c2b769 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,6 +3,10 @@ stages: - package - deploy +.centos-7: + tags: [ linux, docker ] + image: git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker:centos-7 + .ubuntu-18.04: tags: [ linux, docker ] image: git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker:devel-ubuntu18.04 @@ -38,6 +42,17 @@ stages: expire_in: 1 day script: ./.gitlab-ci.py build +build centos-7: + extends: .centos-7 + <<: *build + variables: + <<: [ *release ] + before_script: + - ./.gitlab-ci.py prepare + --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package centos-7' + --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package centos-7' + --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package centos-7' + build ubuntu-18.04: extends: .ubuntu-18.04 <<: *build @@ -85,6 +100,12 @@ build windows-1809[pylon5]: expire_in: 1 week script: ./.gitlab-ci.py package +package centos-7: + extends: .centos-7 + dependencies: + - build centos-7 + <<: *package + package ubuntu-18.04: extends: .ubuntu-18.04 dependencies: From e214e6ec32145949be3d807135478ef5c767ecff Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Thu, 20 Feb 2020 17:11:18 +0100 Subject: [PATCH 120/171] ci/cd: remove ubuntu --- .gitlab-ci.yml | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 49c2b769..f8d7221a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -7,10 +7,6 @@ stages: tags: [ linux, docker ] image: git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker:centos-7 -.ubuntu-18.04: - tags: [ linux, docker ] - image: git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker:devel-ubuntu18.04 - .windows-1809: tags: [ windows-1809, docker ] image: git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker:devel-windows1809 @@ -53,17 +49,6 @@ build centos-7: --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package centos-7' --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package centos-7' -build ubuntu-18.04: - extends: .ubuntu-18.04 - <<: *build - variables: - <<: [ *gcc8, *release ] - before_script: - - ./.gitlab-ci.py prepare - --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package ubuntu-18.04' - --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package ubuntu-18.04' - --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package ubuntu-18.04' - build windows-1809: extends: .windows-1809 <<: *build @@ -106,13 +91,6 @@ package centos-7: - build centos-7 <<: *package -package ubuntu-18.04: - extends: .ubuntu-18.04 - dependencies: - - build ubuntu-18.04 - <<: *package - tags: [ linux, docker_privileged ] - package windows-1809: extends: .windows-1809 dependencies: From 8bf1316d4e245630550c14166b038c723e00da20 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Tue, 25 Feb 2020 14:13:58 +0100 Subject: [PATCH 121/171] Remove dead code --- Src/CMakeLists.txt | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index 708140b1..8bf5a149 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -3,12 +3,6 @@ ############################################################## list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/cmake) -if( CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR ) - include(biotracker-utility/VSSugar) -else() - include(${biotracker-utility_SOURCE_DIR}/cmake/VSSugar.cmake) -endif() -VSSourceGroups(${CMAKE_CURRENT_LIST_DIR}) add_definitions(-DBIORACKER_GIT_HASH="${GIT_HASH}") add_definitions(-DBIOTRACKER_GIT_TAG="${GIT_TAG}") From 393f02407e760e91b0377ec5fcb3cddc66ff3f26 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Tue, 25 Feb 2020 15:17:15 +0100 Subject: [PATCH 122/171] Update use of (git) source version --- CMakeLists.txt | 12 +++--------- Src/CMakeLists.txt | 8 +++----- Src/View/MainWindow.cpp | 7 ++----- VERSION | 1 - 4 files changed, 8 insertions(+), 20 deletions(-) delete mode 100644 VERSION diff --git a/CMakeLists.txt b/CMakeLists.txt index 5c26b936..6a58e111 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,11 +1,8 @@ cmake_minimum_required(VERSION 3.13) -file(READ VERSION PROJECT_VERSION) -exec_program("git" ${CMAKE_CURRENT_SOURCE_DIR} ARGS "log --pretty=format:%h -n 1" OUTPUT_VARIABLE GIT_HASH) -exec_program("git" ${CMAKE_CURRENT_SOURCE_DIR} ARGS "describe --tags --abbrev=0" OUTPUT_VARIABLE GIT_TAG) +exec_program("git" ${CMAKE_CURRENT_SOURCE_DIR} ARGS "describe --dirty --always --exclude '*'" OUTPUT_VARIABLE SOURCE_VERSION) project(BioTracker - VERSION ${PROJECT_VERSION} LANGUAGES CXX ) @@ -20,11 +17,8 @@ set(CMAKE_AUTORCC ON) set(HMNVLibDir "Not Found" CACHE FILEPATH "") if( CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR ) - find_package(biotracker-utility 0.2 REQUIRED) - find_package(robofish-behavior_loader 0.2 REQUIRED) + find_package(biotracker-utility REQUIRED) + find_package(robofish-behavior_loader REQUIRED) endif() add_subdirectory(Src) - - - diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index 8bf5a149..decb251b 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -4,9 +4,6 @@ list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/cmake) -add_definitions(-DBIORACKER_GIT_HASH="${GIT_HASH}") -add_definitions(-DBIOTRACKER_GIT_TAG="${GIT_TAG}") - if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup") endif() @@ -15,6 +12,8 @@ set(target BioTracker) add_executable (${target}) set_target_properties(${target} PROPERTIES OUTPUT_NAME BioTracker) +target_compile_definitions(${target} PRIVATE SOURCE_VERSION="${SOURCE_VERSION}") + target_include_directories(${target} PUBLIC ${CMAKE_CURRENT_LIST_DIR}) target_link_libraries (${target} biotracker-utility) @@ -88,8 +87,7 @@ endif() set(CPACK_PACKAGE_NAME "${target}") set(CPACK_PACKAGE_VENDOR "Biorobotics Lab / FU Berlin") - -set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION}) +set(CPACK_PACKAGE_VERSION ${SOURCE_VERSION}) if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") option(PACKAGE_WINDOWS_MSI "Create .msi package" OFF) diff --git a/Src/View/MainWindow.cpp b/Src/View/MainWindow.cpp index a143fa84..b427f19f 100644 --- a/Src/View/MainWindow.cpp +++ b/Src/View/MainWindow.cpp @@ -958,11 +958,8 @@ void MainWindow::on_actionAbout_triggered() { std::string version = ""; version = "BioTracker3

      "; - version = "Version: "; - version += BIOTRACKER_GIT_TAG; - version += " ("; - version += BIORACKER_GIT_HASH; - version += ")"; + version = "Source Version: "; + version += SOURCE_VERSION; version += +"

      "; version += "External libraries used:

      "; diff --git a/VERSION b/VERSION deleted file mode 100644 index 0fa4ae48..00000000 --- a/VERSION +++ /dev/null @@ -1 +0,0 @@ -3.3.0 \ No newline at end of file From 70e38f8a198195a6be7d8610e39154411ac59f6b Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Tue, 25 Feb 2020 20:54:16 +0100 Subject: [PATCH 123/171] Work around MSI ProductVersion requiring MAJOR.MINOR.BUILD format --- Src/CMakeLists.txt | 4 +++- Src/cmake/WIX/WIX.template.in | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index decb251b..d99a09ba 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -94,6 +94,7 @@ if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") if(PACKAGE_WINDOWS_MSI) set(CPACK_GENERATOR "WIX") set(CPACK_WIX_UPGRADE_GUID "e47473db-3d71-4c42-8a58-d3eac87aa0bd") + set(CPACK_WIX_PRODUCT_VERSION "0.0.0") set(CPACK_PACKAGE_INSTALL_DIRECTORY "BioTracker/BioTracker") @@ -108,7 +109,8 @@ if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") ) set(CPACK_WIX_LICENSE_RTF ${CMAKE_SOURCE_DIR}/Src/cmake/WIX/licence.rtf) - set(CPACK_WIX_TEMPLATE "${CMAKE_SOURCE_DIR}/Src/cmake/WIX/WIX.template.in") + configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/WIX/WIX.template.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake/WIX/WIX.template") + set(CPACK_WIX_TEMPLATE "${CMAKE_CURRENT_BINARY_DIR}/cmake/WIX/WIX.template") endif() endif() diff --git a/Src/cmake/WIX/WIX.template.in b/Src/cmake/WIX/WIX.template.in index 30d6da02..e5283e61 100644 --- a/Src/cmake/WIX/WIX.template.in +++ b/Src/cmake/WIX/WIX.template.in @@ -8,7 +8,7 @@ From 349048a7aae66c6dcbfa021c29f0cc653b8c5f54 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Fri, 28 Feb 2020 16:24:31 +0100 Subject: [PATCH 124/171] pylon5 -> pylon --- .gitlab-ci.yml | 12 ++++++------ Src/CMakeLists.txt | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f8d7221a..6bb2e653 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -25,8 +25,8 @@ stages: .debug: &debug CMAKE_BUILD_TYPE: Debug -.pylon5: &pylon5 - WITH_PYLON5: 1 +.pylon: &pylon + WITH_PYLON: 1 .build: &build @@ -62,11 +62,11 @@ build windows-1809: - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;jpeg62;libpng16;lzma;openblas;boost_system-vc141-mt-x64-1_70;boost_filesystem-vc141-mt-x64-1_70;boost_program_options-vc141-mt-x64-1_70' - $env:INSTALL_OPENCV_COMPONENTS = 'core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab;ffmpeg' -build windows-1809[pylon5]: +build windows-1809[pylon]: extends: .windows-1809 <<: *build variables: - <<: [ *msvc15_9, *release, *pylon5 ] + <<: [ *msvc15_9, *release, *pylon ] before_script: - ./.gitlab-ci.py prepare --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package windows-1809' @@ -97,8 +97,8 @@ package windows-1809: - build windows-1809 <<: *package -package windows-1809[pylon5]: +package windows-1809[pylon]: extends: .windows-1809 dependencies: - - build windows-1809[pylon5] + - build windows-1809[pylon] <<: *package diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index d99a09ba..bdb3393c 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -26,8 +26,8 @@ find_package(Boost REQUIRED COMPONENTS filesystem program_options) target_include_directories(${target} PUBLIC ${Boost_INCLUDE_DIRS}) target_link_libraries(${target} ${Boost_LIBRARIES}) -option(WITH_PYLON5 "Support Pylon 5 cameras" $ENV{WITH_PYLON5}) -if(WITH_PYLON5) +option(WITH_PYLON "Support Pylon cameras" $ENV{WITH_PYLON}) +if(WITH_PYLON) find_package(Pylon5 REQUIRED) target_compile_definitions(${target} PRIVATE HAS_PYLON=1) target_link_libraries(${target} Pylon5::Base Pylon5::Utility Pylon5::GenAPI Pylon5::GCBase) @@ -187,7 +187,7 @@ PRIVATE "View/Utility/Tracer.cpp" ) -if(WITH_PYLON5) +if(WITH_PYLON) target_sources(${target} PRIVATE "util/camera/pylon.cpp" From 6f37a9786a41c516e36f7ebefb833513cfcc6f48 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Fri, 28 Feb 2020 16:26:37 +0100 Subject: [PATCH 125/171] Include features in package name --- Src/CMakeLists.txt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index bdb3393c..3a26fccb 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -28,11 +28,14 @@ target_link_libraries(${target} ${Boost_LIBRARIES}) option(WITH_PYLON "Support Pylon cameras" $ENV{WITH_PYLON}) if(WITH_PYLON) + list(APPEND FEATURES pylon) find_package(Pylon5 REQUIRED) target_compile_definitions(${target} PRIVATE HAS_PYLON=1) target_link_libraries(${target} Pylon5::Base Pylon5::Utility Pylon5::GenAPI Pylon5::GCBase) endif() +string(JOIN "," VARIANT ${FEATURES}) + IF("${HMNVLibDir}" MATCHES "Not Found") ELSE() target_link_libraries(${target} ${HMNVLibDir}/lib/NvEncInterace.lib) @@ -116,6 +119,12 @@ endif() include(CPack) +set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}") +if (NOT "${VARIANT}" STREQUAL "") + string(APPEND CPACK_PACKAGE_FILE_NAME "[${VARIANT}]") +endif() +string(APPEND CPACK_PACKAGE_FILE_NAME "-${CPACK_PACKAGE_VERSION}-${CPACK_SYSTEM_NAME}") + target_sources(${target} PRIVATE "BioTracker3App.cpp" From 531b5a310610277f45cb037b5de9f0498bb6543e Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Fri, 28 Feb 2020 16:28:27 +0100 Subject: [PATCH 126/171] ci/cd: Add centos-7 pylon package --- .gitlab-ci.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6bb2e653..73382dd9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -49,6 +49,17 @@ build centos-7: --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package centos-7' --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package centos-7' +build centos-7[pylon]: + extends: .centos-7 + <<: *build + variables: + <<: [ *release, *pylon ] + before_script: + - ./.gitlab-ci.py prepare + --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package centos-7' + --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package centos-7' + --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package centos-7' + build windows-1809: extends: .windows-1809 <<: *build @@ -91,6 +102,12 @@ package centos-7: - build centos-7 <<: *package +package centos-7[pylon]: + extends: .centos-7 + dependencies: + - build centos-7[pylon] + <<: *package + package windows-1809: extends: .windows-1809 dependencies: From 4280f0ed4816b13d0d4741fdabe0e13a022225ff Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Fri, 28 Feb 2020 17:10:03 +0100 Subject: [PATCH 127/171] Fix variant based package filename --- Src/CMakeLists.txt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index 3a26fccb..47c14ca8 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -117,13 +117,16 @@ if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") endif() endif() -include(CPack) - set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}") -if (NOT "${VARIANT}" STREQUAL "") +if(NOT "${VARIANT}" STREQUAL "") string(APPEND CPACK_PACKAGE_FILE_NAME "[${VARIANT}]") endif() -string(APPEND CPACK_PACKAGE_FILE_NAME "-${CPACK_PACKAGE_VERSION}-${CPACK_SYSTEM_NAME}") +string(APPEND CPACK_PACKAGE_FILE_NAME "-${CPACK_PACKAGE_VERSION}") +if(NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") + string(APPEND CPACK_PACKAGE_FILE_NAME "-${CMAKE_SYSTEM_NAME}") +endif() + +include(CPack) target_sources(${target} PRIVATE From 238de9bacefeb0638ed93c6d339e06858cf9f37a Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Sun, 1 Mar 2020 16:50:23 +0100 Subject: [PATCH 128/171] Cleanup some includes --- Src/Model/AreaDescriptor/Rectification.h | 5 ++- Src/View/ComponentShape.cpp | 53 ++++++++++++------------ Src/View/GraphicsView.cpp | 16 +++---- Src/View/MainWindow.cpp | 37 ++++++++--------- 4 files changed, 54 insertions(+), 57 deletions(-) diff --git a/Src/Model/AreaDescriptor/Rectification.h b/Src/Model/AreaDescriptor/Rectification.h index f8eb8962..096dc1a8 100644 --- a/Src/Model/AreaDescriptor/Rectification.h +++ b/Src/Model/AreaDescriptor/Rectification.h @@ -1,8 +1,9 @@ #pragma once +#include +#include + #include -#include -#include /** * Rectification class normalizing the tracking image diff --git a/Src/View/ComponentShape.cpp b/Src/View/ComponentShape.cpp index abc84a67..e23e6d49 100644 --- a/Src/View/ComponentShape.cpp +++ b/Src/View/ComponentShape.cpp @@ -1,34 +1,35 @@ #include "ComponentShape.h" -#include - -#include "View/Utility/Tracer.h" -#include "QBrush" -#include "QPainter" -#include "QMenu" -#include "QAction" -#include "QGraphicsScene" -#include "QGraphicsSceneContextMenuEvent" -#include "QDebug" -#include "QColorDialog" -#include "qwidgetaction.h" -#include "qlabel.h" -#include "assert.h" -#include "QTime" -#include "qlistwidget.h" -#include "QGraphicsProxyWidget" -#include "QVBoxLayout" -#include "QSlider" -#include "QLineEdit" -#include "QAbstractSlider" -#include "QComboBox" -#include "QSpinBox" -#include "QDoubleSpinBox" +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include -#include +#include #include -#include +#include + +#include "View/Utility/Tracer.h" /* diff --git a/Src/View/GraphicsView.cpp b/Src/View/GraphicsView.cpp index 5ab7851c..8aa23a68 100644 --- a/Src/View/GraphicsView.cpp +++ b/Src/View/GraphicsView.cpp @@ -1,16 +1,13 @@ #include "GraphicsView.h" -#include "QTimeLine" -#include "QWheelEvent" -#include "../Controller/ControllerGraphicScene.h" - -#include -#include +#include +#include #include #include -#include -#include -#include + +#include "../Controller/ControllerGraphicScene.h" +#include "../Model/Annotations.h" + GraphicsView::GraphicsView(QWidget *parent, IController *controller, IModel *model) : IViewGraphicsView(parent, controller, model) @@ -19,7 +16,6 @@ GraphicsView::GraphicsView(QWidget *parent, IController *controller, IModel *mod m_BackgroundImage = NULL; this->setScene(m_GraphicsScene); - //this->setViewport(new QGLWidget()); this->setBackgroundBrush(QBrush(Qt::white)); diff --git a/Src/View/MainWindow.cpp b/Src/View/MainWindow.cpp index b427f19f..6d72e6b8 100644 --- a/Src/View/MainWindow.cpp +++ b/Src/View/MainWindow.cpp @@ -1,32 +1,31 @@ #include "MainWindow.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + #include "ui_MainWindow.h" #include "util/types.h" -#include "Controller/ControllerMainWindow.h" +#include "Model/null_Model.h" #include "View/CoreParameterView.h" -#include "VideoControllWidget.h" #include "View/GraphicsView.h" #include "View/AnnotationsView.h" -#include "Model/null_Model.h" +#include "Controller/ControllerMainWindow.h" #include "Controller/null_Controller.h" - -#include "qfiledialog.h" -#include "QLayout" -#include "QGraphicsObject" -#include -#include -#include -#include -#include "qtextedit.h" -#include -#include "qdesktopwidget.h" -#include "QToolButton" -#include "QWizard" -#include "QWizardPage" -#include "QDesktopServices" - +#include "VideoControllWidget.h" MainWindow::MainWindow(QWidget* parent, IController* controller, IModel* model) : IViewMainWindow(parent, controller, model), From 0d473dd065650e85698b508e4f8831b2f9d3f2dd Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Sun, 1 Mar 2020 17:21:01 +0100 Subject: [PATCH 129/171] Fix AreaDiscriptor missing Q_INTERFACES --- Src/View/AreaDesciptor/AreaDescriptor.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Src/View/AreaDesciptor/AreaDescriptor.h b/Src/View/AreaDesciptor/AreaDescriptor.h index aea4dfad..81e3a64a 100644 --- a/Src/View/AreaDesciptor/AreaDescriptor.h +++ b/Src/View/AreaDesciptor/AreaDescriptor.h @@ -7,6 +7,7 @@ class AreaDescriptor : public QObject, public IView, public QGraphicsItem { Q_OBJECT + Q_INTERFACES(QGraphicsItem) public: AreaDescriptor(IController *controller, IModel *model); ~AreaDescriptor(); From 08c4fcc52119f437d53d62cf2a2a91450eb4b361 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Mon, 2 Mar 2020 04:11:09 +0100 Subject: [PATCH 130/171] misc --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0af38e79..67bc021c 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ This will enable you to only build your own plugin without having to care about ## Build dependencies -Building the Robotracker needs: +Building the BioTracker needs: - opencv (> 3.0) - QT (>= 5.4) - Boost From cb678331a5064e8d852297470bd08e55a3b09f23 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Mon, 2 Mar 2020 04:11:27 +0100 Subject: [PATCH 131/171] misc --- Src/cmake/WIX/WIX.template.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Src/cmake/WIX/WIX.template.in b/Src/cmake/WIX/WIX.template.in index e5283e61..b1331288 100644 --- a/Src/cmake/WIX/WIX.template.in +++ b/Src/cmake/WIX/WIX.template.in @@ -38,7 +38,7 @@ - + From 3d13ddf69838e1612831ad0e856c16636c89c823 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Mon, 9 Mar 2020 13:52:11 +0100 Subject: [PATCH 132/171] update ci --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 73382dd9..75879476 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -9,7 +9,7 @@ stages: .windows-1809: tags: [ windows-1809, docker ] - image: git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker:devel-windows1809 + image: git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker:devel-windows-1809 .gcc8: &gcc8 From 43bb47bf34db2991c31d205849bedd96ab686bc8 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Mon, 9 Mar 2020 19:52:09 +0100 Subject: [PATCH 133/171] [ci,windows-1809] New opencv vcpkg port no longer requires separate ffmpeg wrapper DLL --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 75879476..27ff72d5 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -71,7 +71,7 @@ build windows-1809: --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package windows-1809' --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package windows-1809' - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;jpeg62;libpng16;lzma;openblas;boost_system-vc141-mt-x64-1_70;boost_filesystem-vc141-mt-x64-1_70;boost_program_options-vc141-mt-x64-1_70' - - $env:INSTALL_OPENCV_COMPONENTS = 'core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab;ffmpeg' + - $env:INSTALL_OPENCV_COMPONENTS = 'core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab' build windows-1809[pylon]: extends: .windows-1809 @@ -84,7 +84,7 @@ build windows-1809[pylon]: --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package windows-1809' --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package windows-1809' - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;jpeg62;libpng16;lzma;openblas;boost_system-vc141-mt-x64-1_70;boost_filesystem-vc141-mt-x64-1_70;boost_program_options-vc141-mt-x64-1_70' - - $env:INSTALL_OPENCV_COMPONENTS = 'core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab;ffmpeg' + - $env:INSTALL_OPENCV_COMPONENTS = 'core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab' .package: &package From cd22382012c02aebb40294ab6e73b470aea7b3ba Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Mon, 9 Mar 2020 20:16:04 +0100 Subject: [PATCH 134/171] Update locating shared libraries --- Src/cmake/Locate.cmake | 54 +++++++++++++++++++++++++++++++++--------- 1 file changed, 43 insertions(+), 11 deletions(-) diff --git a/Src/cmake/Locate.cmake b/Src/cmake/Locate.cmake index 6da6860c..0e674217 100644 --- a/Src/cmake/Locate.cmake +++ b/Src/cmake/Locate.cmake @@ -1,4 +1,35 @@ +function(locate_shared_library_anyof VAR) + foreach(name ${ARGN}) + set(_filename "${CMAKE_SHARED_LIBRARY_PREFIX}${name}${CMAKE_SHARED_LIBRARY_SUFFIX}") + message(STATUS "Locating ${_filename}") + if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") + execute_process( + COMMAND where.exe "${_filename}" + OUTPUT_VARIABLE _matches + OUTPUT_STRIP_TRAILING_WHITESPACE + RESULT_VARIABLE _res + ) + if("${_res}" STREQUAL "0") + string(REGEX REPLACE "\n" ";" _matches "${_matches}") + list(GET _matches 0 _match) + string(REGEX REPLACE "\\\\" "/" _match "${_match}") + + if(DEFINED ${VAR}) + list(APPEND ${VAR} "${_match}") + set(${VAR} ${${VAR}} PARENT_SCOPE) + else() + set(${VAR} "${_match}" PARENT_SCOPE) + endif() + return() + endif() + else() + message(FATAL_ERROR "Platform not supported") + endif() + endforeach() + message(FATAL_ERROR "Could not locate any of ${ARGN}") +endfunction() + function(locate_shared_library VAR) foreach(name ${ARGN}) set(_filename "${CMAKE_SHARED_LIBRARY_PREFIX}${name}${CMAKE_SHARED_LIBRARY_SUFFIX}") @@ -16,7 +47,7 @@ function(locate_shared_library VAR) string(REGEX REPLACE "\n" ";" _matches "${_matches}") list(GET _matches 0 _match) string(REGEX REPLACE "\\\\" "/" _match "${_match}") - + if(DEFINED ${VAR}) list(APPEND ${VAR} "${_match}") set(${VAR} ${${VAR}} PARENT_SCOPE) @@ -33,15 +64,16 @@ function(locate_opencv VAR) cmake_parse_arguments(ARG "" "" "COMPONENTS" ${ARGN}) if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") - set(suffix "${OpenCV_VERSION_MAJOR}${OpenCV_VERSION_MINOR}${OpenCV_VERSION_PATCH}") - set(suffixX64 "${OpenCV_VERSION_MAJOR}${OpenCV_VERSION_MINOR}${OpenCV_VERSION_PATCH}_64") + set(version "${OpenCV_VERSION_MAJOR}${OpenCV_VERSION_MINOR}${OpenCV_VERSION_PATCH}") + + if(${CMAKE_SIZEOF_VOID_P} EQUAL 8) + set(platform "64") + else() + set(platform "32") + endif() foreach(component ${ARG_COMPONENTS}) - if("${component}" STREQUAL "ffmpeg") - locate_shared_library(${VAR} "opencv_${component}${suffixX64}") - else() - locate_shared_library(${VAR} "opencv_${component}${suffix}") - endif() + locate_shared_library_anyof(${VAR} "opencv_${component}" "opencv_${component}${version}" "opencv_${component}${version}_${platform}") endforeach() set(${VAR} ${${VAR}} PARENT_SCOPE) else() @@ -54,13 +86,13 @@ function(locate_cuda VAR) if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") if(${CMAKE_SIZEOF_VOID_P} EQUAL 8) - set(suffix "64_${CUDA_VERSION_MAJOR}${CUDA_VERSION_MINOR}") + set(suffix "64_${CUDA_VERSION_MAJOR}") else() - set(suffix "32_${CUDA_VERSION_MAJOR}${CUDA_VERSION_MINOR}") + set(suffix "32_${CUDA_VERSION_MAJOR}") endif() foreach(component ${ARG_COMPONENTS}) - locate_shared_library(${VAR} "${component}${suffix}") + locate_shared_library_anyof(${VAR} "${component}${suffix}" "${component}${suffix}${CUDA_VERSION_MINOR}") endforeach() set(${VAR} ${${VAR}} PARENT_SCOPE) else() From 0f631ec88e0432f5a79f94f0954bdd1d06457c30 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Thu, 12 Mar 2020 15:41:53 +0100 Subject: [PATCH 135/171] [ci] fix/update version of deployed boost shared libraries --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 27ff72d5..fe9ca67b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -70,7 +70,7 @@ build windows-1809: --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package windows-1809' --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package windows-1809' --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package windows-1809' - - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;jpeg62;libpng16;lzma;openblas;boost_system-vc141-mt-x64-1_70;boost_filesystem-vc141-mt-x64-1_70;boost_program_options-vc141-mt-x64-1_70' + - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;jpeg62;libpng16;lzma;openblas;boost_system-vc141-mt-x64-1_72;boost_filesystem-vc141-mt-x64-1_72;boost_program_options-vc141-mt-x64-1_72' - $env:INSTALL_OPENCV_COMPONENTS = 'core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab' build windows-1809[pylon]: @@ -83,7 +83,7 @@ build windows-1809[pylon]: --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package windows-1809' --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package windows-1809' --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package windows-1809' - - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;jpeg62;libpng16;lzma;openblas;boost_system-vc141-mt-x64-1_70;boost_filesystem-vc141-mt-x64-1_70;boost_program_options-vc141-mt-x64-1_70' + - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;jpeg62;libpng16;lzma;openblas;boost_system-vc141-mt-x64-1_72;boost_filesystem-vc141-mt-x64-1_72;boost_program_options-vc141-mt-x64-1_72' - $env:INSTALL_OPENCV_COMPONENTS = 'core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab' From 3feecf8d5fb8caf40f16a24606aba4c8b9bc7cf5 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Thu, 12 Mar 2020 16:07:49 +0100 Subject: [PATCH 136/171] Deploy shared libraries loaded dynamically by Pylon --- .gitlab-ci.py | 26 ++++++++++++++++++++++++++ .gitlab-ci.yml | 2 ++ 2 files changed, 28 insertions(+) diff --git a/.gitlab-ci.py b/.gitlab-ci.py index a2d8e34b..7bd8396f 100755 --- a/.gitlab-ci.py +++ b/.gitlab-ci.py @@ -131,6 +131,7 @@ def package(args): setup_qt5() makedirs('build/appdir/usr/bin') + makedirs('build/appdir/usr/lib') makedirs('build/appdir/usr/share/applications') makedirs('build/appdir/usr/share/icons/hicolor/256x256') shutil.copy('build/Src/BioTracker', 'build/appdir/usr/bin') @@ -146,6 +147,31 @@ def package(args): '-no-translations' ] + if "WITH_PYLON" in env and env['WITH_PYLON'] == "1": + shutil.copy('/opt/pylon5/lib64/libbxapi-5.2.0.so', 'build/appdir/usr/lib') + shutil.copy('/opt/pylon5/lib64/libgxapi-5.2.0.so', 'build/appdir/usr/lib') + shutil.copy('/opt/pylon5/lib64/liblog4cpp_gcc_v3_1_Basler_pylon.so', 'build/appdir/usr/lib') + shutil.copy('/opt/pylon5/lib64/libpylon_TL_bcon-5.2.0.so', 'build/appdir/usr/lib') + shutil.copy('/opt/pylon5/lib64/libpylon_TL_camemu-5.2.0.so', 'build/appdir/usr/lib') + shutil.copy('/opt/pylon5/lib64/libpylon_TL_gige-5.2.0.so', 'build/appdir/usr/lib') + shutil.copy('/opt/pylon5/lib64/libpylon_TL_usb-5.2.0.so', 'build/appdir/usr/lib') + shutil.copy('/opt/pylon5/lib64/libpylonutility-5.2.0.so', 'build/appdir/usr/lib') + shutil.copy('/opt/pylon5/lib64/libuxapi-5.2.0.so', 'build/appdir/usr/lib') + shutil.copy('/opt/pylon5/lib64/pylon-libusb-1.0.so', 'build/appdir/usr/lib') + + command += [ + '-executable=appdir/usr/lib/libbxapi-5.2.0.so', + '-executable=appdir/usr/lib/libgxapi-5.2.0.so', + '-executable=appdir/usr/lib/liblog4cpp_gcc_v3_1_Basler_pylon.so', + '-executable=appdir/usr/lib/libpylon_TL_bcon-5.2.0.so', + '-executable=appdir/usr/lib/libpylon_TL_camemu-5.2.0.so', + '-executable=appdir/usr/lib/libpylon_TL_gige-5.2.0.so', + '-executable=appdir/usr/lib/libpylon_TL_usb-5.2.0.so', + '-executable=appdir/usr/lib/libpylonutility-5.2.0.so', + '-executable=appdir/usr/lib/libuxapi-5.2.0.so', + '-executable=appdir/usr/lib/pylon-libusb-1.0.so', + ] + setup_dependencies() check_call(command, cwd=cwd) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index fe9ca67b..995a778f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -106,6 +106,8 @@ package centos-7[pylon]: extends: .centos-7 dependencies: - build centos-7[pylon] + variables: + <<: [ *pylon ] <<: *package package windows-1809: From 27c913d1f62f04e9d3862f6acb196a1b627d0366 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Fri, 13 Mar 2020 16:31:42 +0100 Subject: [PATCH 137/171] PACKAGE_WINDOWS_MSI -> PACKAGE_MSI --- .gitlab-ci.py | 2 +- Src/CMakeLists.txt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.py b/.gitlab-ci.py index 7bd8396f..e81b4231 100755 --- a/.gitlab-ci.py +++ b/.gitlab-ci.py @@ -108,7 +108,7 @@ def build(args): 'CMAKE_TOOLCHAIN_FILE', env['VCPKG_DIR'] + '/scripts/buildsystems/vcpkg.cmake') command += define('VCPKG_TARGET_TRIPLET', env['VCPKG_TRIPLET']) - command += define('PACKAGE_WINDOWS_MSI', 'ON') + command += define('PACKAGE_MSI', 'ON') command += define('INSTALL_REQUIRED_SYSTEM_LIBRARIES', 'ON') command += define_env('INSTALL_SHARED_LIBRARIES') command += define_env('INSTALL_OPENCV_COMPONENTS') diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index 47c14ca8..8af57dd5 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -93,8 +93,8 @@ set(CPACK_PACKAGE_VENDOR "Biorobotics Lab / FU Berlin") set(CPACK_PACKAGE_VERSION ${SOURCE_VERSION}) if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") - option(PACKAGE_WINDOWS_MSI "Create .msi package" OFF) - if(PACKAGE_WINDOWS_MSI) + option(PACKAGE_MSI "Create MSI package" OFF) + if(PACKAGE_MSI) set(CPACK_GENERATOR "WIX") set(CPACK_WIX_UPGRADE_GUID "e47473db-3d71-4c42-8a58-d3eac87aa0bd") set(CPACK_WIX_PRODUCT_VERSION "0.0.0") From fc73234756d531942fc37676929a0de1a6d94b9a Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Wed, 8 Apr 2020 09:01:03 +0200 Subject: [PATCH 138/171] [cmake] INSTALL_REQUIRED_SYSTEM_LIBRARIES => INSTALL_SYSTEM_LIBRARIES --- .gitlab-ci.py | 2 +- Src/CMakeLists.txt | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.py b/.gitlab-ci.py index e81b4231..770a2319 100755 --- a/.gitlab-ci.py +++ b/.gitlab-ci.py @@ -109,7 +109,7 @@ def build(args): env['VCPKG_DIR'] + '/scripts/buildsystems/vcpkg.cmake') command += define('VCPKG_TARGET_TRIPLET', env['VCPKG_TRIPLET']) command += define('PACKAGE_MSI', 'ON') - command += define('INSTALL_REQUIRED_SYSTEM_LIBRARIES', 'ON') + command += define('INSTALL_SYSTEM_LIBRARIES', 'ON') command += define_env('INSTALL_SHARED_LIBRARIES') command += define_env('INSTALL_OPENCV_COMPONENTS') command += define_env('CPACK_PACKAGE_DIRECTORY') diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index 8af57dd5..3ee2fc1f 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -58,12 +58,13 @@ if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") target_compile_definitions(${target} PRIVATE _CRT_SECURE_NO_WARNINGS) endif() +option(INSTALL_SYSTEM_LIBRARIES "Install system libraries" OFF) + include(Locate) if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") install(TARGETS ${target} DESTINATION .) - option(INSTALL_REQUIRED_SYSTEM_LIBRARIES "Install required system libraries" OFF) - if(INSTALL_REQUIRED_SYSTEM_LIBRARIES) + if(INSTALL_SYSTEM_LIBRARIES) set(CMAKE_INSTALL_UCRT_LIBRARIES TRUE) set(CMAKE_INSTALL_SYSTEM_RUNTIME_DESTINATION .) include(InstallRequiredSystemLibraries) From 9c8732d7ff786e0c724bad3a4bb69c7d7608c5c1 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Wed, 8 Apr 2020 09:02:53 +0200 Subject: [PATCH 139/171] [cmake] update boost dependency --- Src/CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index 3ee2fc1f..eed9efea 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -22,9 +22,9 @@ target_link_libraries (${target} robofish-behavior_loader) find_package(Qt5 REQUIRED COMPONENTS Core Gui Xml Network Widgets Multimedia MultimediaWidgets OpenGL) target_link_libraries (${target} Qt5::Core Qt5::Gui Qt5::Xml Qt5::Network Qt5::Widgets Qt5::Multimedia Qt5::MultimediaWidgets Qt5::OpenGL) -find_package(Boost REQUIRED COMPONENTS filesystem program_options) -target_include_directories(${target} PUBLIC ${Boost_INCLUDE_DIRS}) -target_link_libraries(${target} ${Boost_LIBRARIES}) +set(Boost_REALPATH ON) +find_package(Boost REQUIRED COMPONENTS system filesystem program_options) +target_link_libraries(${target} Boost::system Boost::filesystem Boost::program_options) option(WITH_PYLON "Support Pylon cameras" $ENV{WITH_PYLON}) if(WITH_PYLON) From 963a6d9ba8059014032bfcb03cadd4b78829caa7 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Wed, 8 Apr 2020 09:12:17 +0200 Subject: [PATCH 140/171] [cmake,ci] No longer hardcode boost shared library names --- .gitlab-ci.yml | 4 ++-- Src/CMakeLists.txt | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 995a778f..360fa19f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -70,7 +70,7 @@ build windows-1809: --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package windows-1809' --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package windows-1809' --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package windows-1809' - - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;jpeg62;libpng16;lzma;openblas;boost_system-vc141-mt-x64-1_72;boost_filesystem-vc141-mt-x64-1_72;boost_program_options-vc141-mt-x64-1_72' + - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;jpeg62;libpng16;lzma;openblas' - $env:INSTALL_OPENCV_COMPONENTS = 'core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab' build windows-1809[pylon]: @@ -83,7 +83,7 @@ build windows-1809[pylon]: --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package windows-1809' --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package windows-1809' --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package windows-1809' - - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;jpeg62;libpng16;lzma;openblas;boost_system-vc141-mt-x64-1_72;boost_filesystem-vc141-mt-x64-1_72;boost_program_options-vc141-mt-x64-1_72' + - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;jpeg62;libpng16;lzma;openblas' - $env:INSTALL_OPENCV_COMPONENTS = 'core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab' diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index eed9efea..7235adb3 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -75,6 +75,8 @@ if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") deploy_qt5(${target} DESTINATION .) endif() + install(FILES "${Boost_SYSTEM_LIBRARY_RELEASE}" "${Boost_FILESYSTEM_LIBRARY_RELEASE}" "${Boost_PROGRAM_OPTIONS_LIBRARY_RELEASE}" DESTINATION .) + set(INSTALL_CUDA_COMPONENTS "" CACHE STRING "CUDA components to install") locate_cuda(shared_libraries COMPONENTS ${INSTALL_CUDA_COMPONENTS}) From 6c33402f39b00b07c65597d66ca2d7c761fdc493 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Wed, 8 Apr 2020 09:15:13 +0200 Subject: [PATCH 141/171] [ci] windows: deploy ffmpeg shared libraries --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 360fa19f..34be9d20 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -70,7 +70,7 @@ build windows-1809: --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package windows-1809' --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package windows-1809' --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package windows-1809' - - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;jpeg62;libpng16;lzma;openblas' + - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;jpeg62;libpng16;lzma;openblas;avformat-58;swscale-5;avcodec-58;avutil-56' - $env:INSTALL_OPENCV_COMPONENTS = 'core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab' build windows-1809[pylon]: @@ -83,7 +83,7 @@ build windows-1809[pylon]: --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package windows-1809' --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package windows-1809' --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package windows-1809' - - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;jpeg62;libpng16;lzma;openblas' + - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;jpeg62;libpng16;lzma;openblas;avformat-58;swscale-5;avcodec-58;avutil-56' - $env:INSTALL_OPENCV_COMPONENTS = 'core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab' From 130a84858f485f41b40d52ce930377d904a680ec Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Wed, 8 Apr 2020 09:36:11 +0200 Subject: [PATCH 142/171] Integrate Linux AppImage building with cmake --- .gitlab-ci.py | 51 +++------------------------ Src/CMakeLists.txt | 45 ++++++++++++++++++++--- Src/cmake/CPackLinuxDeployQt.cmake.in | 20 +++++++++++ 3 files changed, 66 insertions(+), 50 deletions(-) create mode 100644 Src/cmake/CPackLinuxDeployQt.cmake.in diff --git a/.gitlab-ci.py b/.gitlab-ci.py index 770a2319..568396de 100755 --- a/.gitlab-ci.py +++ b/.gitlab-ci.py @@ -113,6 +113,8 @@ def build(args): command += define_env('INSTALL_SHARED_LIBRARIES') command += define_env('INSTALL_OPENCV_COMPONENTS') command += define_env('CPACK_PACKAGE_DIRECTORY') + elif system() == 'Linux': + command += define('PACKAGE_APPIMAGE', 'ON') check_call(command) command = ['ninja', '-C', 'build'] @@ -124,56 +126,13 @@ def package(args): setup_vcpkg() setup_cuda() - cwd = None - command = ['ninja', '-C', 'build', 'package'] - if system() == 'Linux': setup_qt5() - makedirs('build/appdir/usr/bin') - makedirs('build/appdir/usr/lib') - makedirs('build/appdir/usr/share/applications') - makedirs('build/appdir/usr/share/icons/hicolor/256x256') - shutil.copy('build/Src/BioTracker', 'build/appdir/usr/bin') - shutil.copy('Src/BioTracker.desktop', - 'build/appdir/usr/share/applications') - shutil.copy('Src/resources/logo/BT3-big.png', - 'build/appdir/usr/share/icons/hicolor/256x256') - - cwd = 'build' - command = [ - 'linuxdeployqt', - 'appdir/usr/share/applications/BioTracker.desktop', '-appimage', - '-no-translations' - ] - - if "WITH_PYLON" in env and env['WITH_PYLON'] == "1": - shutil.copy('/opt/pylon5/lib64/libbxapi-5.2.0.so', 'build/appdir/usr/lib') - shutil.copy('/opt/pylon5/lib64/libgxapi-5.2.0.so', 'build/appdir/usr/lib') - shutil.copy('/opt/pylon5/lib64/liblog4cpp_gcc_v3_1_Basler_pylon.so', 'build/appdir/usr/lib') - shutil.copy('/opt/pylon5/lib64/libpylon_TL_bcon-5.2.0.so', 'build/appdir/usr/lib') - shutil.copy('/opt/pylon5/lib64/libpylon_TL_camemu-5.2.0.so', 'build/appdir/usr/lib') - shutil.copy('/opt/pylon5/lib64/libpylon_TL_gige-5.2.0.so', 'build/appdir/usr/lib') - shutil.copy('/opt/pylon5/lib64/libpylon_TL_usb-5.2.0.so', 'build/appdir/usr/lib') - shutil.copy('/opt/pylon5/lib64/libpylonutility-5.2.0.so', 'build/appdir/usr/lib') - shutil.copy('/opt/pylon5/lib64/libuxapi-5.2.0.so', 'build/appdir/usr/lib') - shutil.copy('/opt/pylon5/lib64/pylon-libusb-1.0.so', 'build/appdir/usr/lib') - - command += [ - '-executable=appdir/usr/lib/libbxapi-5.2.0.so', - '-executable=appdir/usr/lib/libgxapi-5.2.0.so', - '-executable=appdir/usr/lib/liblog4cpp_gcc_v3_1_Basler_pylon.so', - '-executable=appdir/usr/lib/libpylon_TL_bcon-5.2.0.so', - '-executable=appdir/usr/lib/libpylon_TL_camemu-5.2.0.so', - '-executable=appdir/usr/lib/libpylon_TL_gige-5.2.0.so', - '-executable=appdir/usr/lib/libpylon_TL_usb-5.2.0.so', - '-executable=appdir/usr/lib/libpylonutility-5.2.0.so', - '-executable=appdir/usr/lib/libuxapi-5.2.0.so', - '-executable=appdir/usr/lib/pylon-libusb-1.0.so', - ] - setup_dependencies() - check_call(command, cwd=cwd) + + command = ['ninja', '-C', 'build', 'package'] + check_call(command) if __name__ == '__main__': diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index 7235adb3..dd6a42a5 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -95,6 +95,12 @@ set(CPACK_PACKAGE_NAME "${target}") set(CPACK_PACKAGE_VENDOR "Biorobotics Lab / FU Berlin") set(CPACK_PACKAGE_VERSION ${SOURCE_VERSION}) +set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}") +if(NOT "${VARIANT}" STREQUAL "") + string(APPEND CPACK_PACKAGE_FILE_NAME "[${VARIANT}]") +endif() +string(APPEND CPACK_PACKAGE_FILE_NAME "-${CPACK_PACKAGE_VERSION}") + if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") option(PACKAGE_MSI "Create MSI package" OFF) if(PACKAGE_MSI) @@ -120,11 +126,42 @@ if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") endif() endif() -set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}") -if(NOT "${VARIANT}" STREQUAL "") - string(APPEND CPACK_PACKAGE_FILE_NAME "[${VARIANT}]") +if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") + include(GNUInstallDirs) + + install(TARGETS ${target} RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") + install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/BioTracker.desktop DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications") + install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/resources/logo/BT3-big.png DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/256x256") + + set_target_properties(${target} PROPERTIES + INSTALL_RPATH "\$ORIGIN/../${CMAKE_INSTALL_LIBDIR}") + + if(WITH_PYLON) + install(DIRECTORY "${Pylon5_LIBRARY_DIR}/" DESTINATION "${CMAKE_INSTALL_LIBDIR}") + endif() + + install(FILES "${Boost_SYSTEM_LIBRARY_RELEASE}" "${Boost_FILESYSTEM_LIBRARY_RELEASE}" "${Boost_PROGRAM_OPTIONS_LIBRARY_RELEASE}" DESTINATION "${CMAKE_INSTALL_LIBDIR}") + + get_target_property(shared_library biotracker-interfaces LOCATION) + install(FILES "${shared_library}" DESTINATION "${CMAKE_INSTALL_LIBDIR}") + + option(PACKAGE_APPIMAGE "Create AppImage package" OFF) + + if(PACKAGE_APPIMAGE) + find_program(LINUXDEPLOYQT_EXECUTABLE linuxdeployqt) + if(NOT LINUXDEPLOYQT_EXECUTABLE) + message(FATAL_ERROR "AppImage packaging tool \"linuxdeployqt\" not found") + endif() + set(CPACK_GENERATOR "External;${CPACK_GENERATOR}") + set(APPIMAGE_FILE_NAME "${CPACK_PACKAGE_FILE_NAME}") + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/CPackLinuxDeployQt.cmake.in "${CMAKE_BINARY_DIR}/CPackExternal.cmake" @ONLY) + set(CPACK_EXTERNAL_PACKAGE_SCRIPT "${CMAKE_BINARY_DIR}/CPackExternal.cmake") + set(CPACK_EXTERNAL_ENABLE_STAGING ON) + set_target_properties(${target} PROPERTIES + INSTALL_RPATH_USE_LINK_PATH ON) + endif() endif() -string(APPEND CPACK_PACKAGE_FILE_NAME "-${CPACK_PACKAGE_VERSION}") + if(NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") string(APPEND CPACK_PACKAGE_FILE_NAME "-${CMAKE_SYSTEM_NAME}") endif() diff --git a/Src/cmake/CPackLinuxDeployQt.cmake.in b/Src/cmake/CPackLinuxDeployQt.cmake.in new file mode 100644 index 00000000..e78748d6 --- /dev/null +++ b/Src/cmake/CPackLinuxDeployQt.cmake.in @@ -0,0 +1,20 @@ + +set(APPIMAGE_APP_DIRECTORY "${CPACK_TEMPORARY_DIRECTORY}/appdir") +file(REMOVE_RECURSE "${APPIMAGE_APP_DIRECTORY}") +file(MAKE_DIRECTORY "${APPIMAGE_APP_DIRECTORY}") + +file(COPY "${CPACK_TEMPORARY_DIRECTORY}/@CMAKE_INSTALL_BINDIR@" DESTINATION "${APPIMAGE_APP_DIRECTORY}/usr") +file(COPY "${CPACK_TEMPORARY_DIRECTORY}/@CMAKE_INSTALL_LIBDIR@" DESTINATION "${APPIMAGE_APP_DIRECTORY}/usr") +file(COPY "${CPACK_TEMPORARY_DIRECTORY}/@CMAKE_INSTALL_DATAROOTDIR@" DESTINATION "${APPIMAGE_APP_DIRECTORY}/usr") + +file(RENAME "${APPIMAGE_APP_DIRECTORY}/usr/@CMAKE_INSTALL_BINDIR@" "${APPIMAGE_APP_DIRECTORY}/usr/bin") +file(RENAME "${APPIMAGE_APP_DIRECTORY}/usr/@CMAKE_INSTALL_LIBDIR@" "${APPIMAGE_APP_DIRECTORY}/usr/lib") +file(RENAME "${APPIMAGE_APP_DIRECTORY}/usr/@CMAKE_INSTALL_DATAROOTDIR@" "${APPIMAGE_APP_DIRECTORY}/usr/share") + +execute_process(COMMAND "@LINUXDEPLOYQT_EXECUTABLE@" + ${APPIMAGE_APP_DIRECTORY}/usr/share/applications/BioTracker.desktop -bundle-non-qt-libs -appimage -no-translations) + +file(GLOB LINUXDEPLOYQT_OUTPUT_FILE RELATIVE "${CPACK_PACKAGE_DIRECTORY}" "BioTracker-*.AppImage") +if(LINUXDEPLOYQT_OUTPUT_FILE) + file(RENAME "${CPACK_PACKAGE_DIRECTORY}/${LINUXDEPLOYQT_OUTPUT_FILE}" "${CPACK_PACKAGE_DIRECTORY}/@APPIMAGE_FILE_NAME@.AppImage") +endif() From ab1505add3eeaa42c1746d615e9a59eef1824958 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Wed, 8 Apr 2020 09:51:26 +0200 Subject: [PATCH 143/171] [cmake] Update source version --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6a58e111..3dd64838 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.13) -exec_program("git" ${CMAKE_CURRENT_SOURCE_DIR} ARGS "describe --dirty --always --exclude '*'" OUTPUT_VARIABLE SOURCE_VERSION) +exec_program("git" ${CMAKE_CURRENT_SOURCE_DIR} ARGS "describe --dirty --always" OUTPUT_VARIABLE SOURCE_VERSION) project(BioTracker LANGUAGES CXX From 402465826db91a24e8b167a160d6bb05c8f0f50c Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Tue, 14 Apr 2020 12:41:31 +0200 Subject: [PATCH 144/171] [cmake,windows] Fix boost dll installation --- Src/CMakeLists.txt | 2 +- Src/cmake/Locate.cmake | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index dd6a42a5..743c87ae 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -75,7 +75,7 @@ if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") deploy_qt5(${target} DESTINATION .) endif() - install(FILES "${Boost_SYSTEM_LIBRARY_RELEASE}" "${Boost_FILESYSTEM_LIBRARY_RELEASE}" "${Boost_PROGRAM_OPTIONS_LIBRARY_RELEASE}" DESTINATION .) + locate_boost(shared_libraries COMPONENTS system filesystem program_options) set(INSTALL_CUDA_COMPONENTS "" CACHE STRING "CUDA components to install") locate_cuda(shared_libraries COMPONENTS ${INSTALL_CUDA_COMPONENTS}) diff --git a/Src/cmake/Locate.cmake b/Src/cmake/Locate.cmake index 0e674217..f9e1290c 100644 --- a/Src/cmake/Locate.cmake +++ b/Src/cmake/Locate.cmake @@ -116,3 +116,24 @@ function(locate_cudnn VAR) message(FATAL_ERROR "Platform not supported") endif() endfunction() + +function(locate_boost VAR) + cmake_parse_arguments(ARG "" "" "COMPONENTS" ${ARGN}) + + if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") + foreach(component ${ARG_COMPONENTS}) + string(TOUPPER ${component} uppercomponent) + execute_process( + COMMAND dumpbin.exe /HEADERS "${Boost_${uppercomponent}_LIBRARY_RELEASE}" + OUTPUT_VARIABLE _importlib_headers + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + string(REGEX MATCH "DLL name *: *([^\r\n]*)" match "${_importlib_headers}") + get_filename_component(dll_name "${CMAKE_MATCH_1}" NAME_WE) + locate_shared_library_anyof(${VAR} "${dll_name}") + endforeach() + set(${VAR} ${${VAR}} PARENT_SCOPE) + else() + message(FATAL_ERROR "Platform not supported") + endif() +endfunction() From a64e8c9864a71dc1cd796549f19851c2a2ba185d Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Tue, 14 Apr 2020 12:42:49 +0200 Subject: [PATCH 145/171] [ci,windows] Add missing swresample lib --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 34be9d20..f139007a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -70,7 +70,7 @@ build windows-1809: --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package windows-1809' --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package windows-1809' --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package windows-1809' - - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;jpeg62;libpng16;lzma;openblas;avformat-58;swscale-5;avcodec-58;avutil-56' + - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;jpeg62;libpng16;lzma;openblas;avformat-58;avcodec-58;avutil-56;swscale-5;swresample-3' - $env:INSTALL_OPENCV_COMPONENTS = 'core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab' build windows-1809[pylon]: @@ -83,7 +83,7 @@ build windows-1809[pylon]: --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package windows-1809' --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package windows-1809' --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package windows-1809' - - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;jpeg62;libpng16;lzma;openblas;avformat-58;swscale-5;avcodec-58;avutil-56' + - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;jpeg62;libpng16;lzma;openblas;avformat-58;avcodec-58;avutil-56;swscale-5;swresample-3' - $env:INSTALL_OPENCV_COMPONENTS = 'core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab' From 9694feca16091613801325f249bca5a95dc360d6 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Tue, 14 Apr 2020 12:43:30 +0200 Subject: [PATCH 146/171] [ci,windows] add missing webp lib --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f139007a..ad9f012d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -70,7 +70,7 @@ build windows-1809: --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package windows-1809' --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package windows-1809' --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package windows-1809' - - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;jpeg62;libpng16;lzma;openblas;avformat-58;avcodec-58;avutil-56;swscale-5;swresample-3' + - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;jpeg62;libpng16;webp;lzma;openblas;avformat-58;avcodec-58;avutil-56;swscale-5;swresample-3' - $env:INSTALL_OPENCV_COMPONENTS = 'core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab' build windows-1809[pylon]: @@ -83,7 +83,7 @@ build windows-1809[pylon]: --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package windows-1809' --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package windows-1809' --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package windows-1809' - - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;jpeg62;libpng16;lzma;openblas;avformat-58;avcodec-58;avutil-56;swscale-5;swresample-3' + - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;jpeg62;libpng16;webp;lzma;openblas;avformat-58;avcodec-58;avutil-56;swscale-5;swresample-3' - $env:INSTALL_OPENCV_COMPONENTS = 'core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab' From d36b43cdbbcf02b2a5823ff175db7d9291491aa7 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Wed, 10 Jun 2020 18:18:08 +0200 Subject: [PATCH 147/171] [ci] update --- .gitlab-ci.py | 158 ------------------------------------------------ .gitlab-ci.yml | 125 ++++++++++++++------------------------ ci/compile.py | 7 +++ ci/configure.py | 81 +++++++++++++++++++++++++ ci/package.py | 15 +++++ ci/prepare.py | 62 +++++++++++++++++++ 6 files changed, 212 insertions(+), 236 deletions(-) delete mode 100755 .gitlab-ci.py create mode 100755 ci/compile.py create mode 100755 ci/configure.py create mode 100755 ci/package.py create mode 100755 ci/prepare.py diff --git a/.gitlab-ci.py b/.gitlab-ci.py deleted file mode 100755 index 568396de..00000000 --- a/.gitlab-ci.py +++ /dev/null @@ -1,158 +0,0 @@ -#! /usr/bin/env python3 - -import tarfile -import shutil -import ssl - -from os import environ as env, pathsep, makedirs -from platform import system -from subprocess import check_call, check_output, DEVNULL -from argparse import ArgumentParser -from io import BytesIO -from urllib.request import Request, urlopen -from urllib.parse import quote, urlencode -from zipfile import ZipFile -from pathlib import Path - - -def define(key: str, value: str): - return ['-D', f'{key}={value}'] - - -def define_env(name: str): - return define(name, env[name]) if name in env else [] - - -def fetch_artifacts(project, reference, job): - gitlab_host = 'https://git.imp.fu-berlin.de' - project = quote(project, safe="") - reference = quote(reference, safe="") - params = urlencode([("job", job)], doseq=True) - url = f'{gitlab_host}/api/v4/projects/{project}/jobs/artifacts/{reference}/download?{params}' - headers = {'JOB-TOKEN': env['CI_JOB_TOKEN']} - return ZipFile( - BytesIO( - urlopen(Request(url, headers=headers), - context=ssl._create_unverified_context()).read())) - - -def extract_cmake_package(artifacts, name): - for filename in artifacts.namelist(): - if Path(filename).match(f'{name}-*.tar.xz'): - with tarfile.open(fileobj=BytesIO(artifacts.read(filename))) as f: - f.extractall('vendor') - shutil.move(next(Path('vendor').glob(f'{name}-*/')), - f'vendor/{name}') - - -if system() == 'Windows': - - def setup_msvc(): - msvc_path = 'C:/Program Files (x86)/Microsoft Visual Studio/2017/BuildTools/Common7/Tools' - lines = check_output([ - 'cmd', '/c', 'VsDevCmd.bat', '-arch=amd64', - f'-vcvars_ver={env["VCVARS_VER"]}', '&', 'set' - ], - cwd=msvc_path).decode('utf-8').splitlines() - for line in lines: - split = line.split('=') - if len(split) != 2: - continue - key, value = split - if key in env and env[key] == value: - continue - env[key] = value - - def setup_vcpkg(): - env['PATH'] += f"{pathsep}{env['VCPKG_INSTALL_DIR']}/bin" - - def setup_cuda(): - if 'CUDA_PATH' in env: - env['PATH'] += f"{pathsep}{env['CUDA_PATH']}/bin" - -if system() == 'Linux': - - def setup_qt5(): - env['PATH'] += f"{pathsep}{env['Qt5_DIR']}/../../../bin/" - - -def setup_dependencies(): - for path in Path('vendor').glob('*/bin'): - env['PATH'] += f"{pathsep}{path}" - - -def prepare(args): - for name, project, reference, job in args.dependencies: - with fetch_artifacts(project, reference, job) as artifacts: - extract_cmake_package(artifacts, name) - - -def build(args): - if system() == 'Windows': - setup_msvc() - setup_vcpkg() - setup_cuda() - setup_dependencies() - - command = ['cmake'] - command += ['-S', '.'] - command += ['-B', 'build'] - command += ['-G', 'Ninja'] - command += define('CMAKE_PREFIX_PATH', Path('vendor').resolve()) - command += define_env('CMAKE_BUILD_TYPE') - command += define('CMAKE_SUPPRESS_REGENERATION', 'ON') - command += define('CMAKE_SKIP_PACKAGE_ALL_DEPENDENCY', 'ON') - - if system() == 'Windows': - command += define( - 'CMAKE_TOOLCHAIN_FILE', - env['VCPKG_DIR'] + '/scripts/buildsystems/vcpkg.cmake') - command += define('VCPKG_TARGET_TRIPLET', env['VCPKG_TRIPLET']) - command += define('PACKAGE_MSI', 'ON') - command += define('INSTALL_SYSTEM_LIBRARIES', 'ON') - command += define_env('INSTALL_SHARED_LIBRARIES') - command += define_env('INSTALL_OPENCV_COMPONENTS') - command += define_env('CPACK_PACKAGE_DIRECTORY') - elif system() == 'Linux': - command += define('PACKAGE_APPIMAGE', 'ON') - check_call(command) - - command = ['ninja', '-C', 'build'] - check_call(command) - - -def package(args): - if system() == 'Windows': - setup_vcpkg() - setup_cuda() - - if system() == 'Linux': - setup_qt5() - - setup_dependencies() - - command = ['ninja', '-C', 'build', 'package'] - check_call(command) - - -if __name__ == '__main__': - parser = ArgumentParser() - subparsers = parser.add_subparsers() - - prepare_parser = subparsers.add_parser('prepare') - prepare_parser.set_defaults(task=prepare) - prepare_parser.add_argument('--dependency', - dest='dependencies', - nargs=4, - action='append', - metavar=('PACKAGE', 'PROJECT', 'REFERENCE', - 'JOB')) - - build_parser = subparsers.add_parser('build') - build_parser.set_defaults(task=build) - - package_parser = subparsers.add_parser('package') - package_parser.set_defaults(task=package) - - args = parser.parse_args() - args.task(args) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ad9f012d..a761f7d6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,32 +3,22 @@ stages: - package - deploy -.centos-7: - tags: [ linux, docker ] - image: git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker:centos-7 +.centos: + tags: [linux, docker] + image: git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker:centos -.windows-1809: - tags: [ windows-1809, docker ] - image: git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker:devel-windows-1809 - - -.gcc8: &gcc8 - CC: gcc-8 - CXX: g++-8 - -.msvc15.9: &msvc15_9 - VCVARS_VER: '14.16' +.windows: + tags: [windows, docker] + image: git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker:devel-windows + before_script: + - . $Profile.AllUsersAllHosts .release: &release CMAKE_BUILD_TYPE: Release -.debug: &debug - CMAKE_BUILD_TYPE: Debug - .pylon: &pylon WITH_PYLON: 1 - .build: &build stage: build artifacts: @@ -36,88 +26,67 @@ stages: - vendor - build expire_in: 1 day - script: ./.gitlab-ci.py build + script: + - ./ci/prepare.py + - ./ci/configure.py + - ./ci/compile.py + +.package: &package + stage: package + artifacts: + paths: + - build/*.AppImage + - build/*.msi + expire_in: 1 week + script: + - ./ci/package.py -build centos-7: - extends: .centos-7 +build centos: + extends: .centos <<: *build variables: - <<: [ *release ] - before_script: - - ./.gitlab-ci.py prepare - --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package centos-7' - --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package centos-7' - --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package centos-7' + <<: [*release] -build centos-7[pylon]: - extends: .centos-7 +build centos[pylon]: + extends: .centos <<: *build variables: - <<: [ *release, *pylon ] - before_script: - - ./.gitlab-ci.py prepare - --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package centos-7' - --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package centos-7' - --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package centos-7' + <<: [*release, *pylon] -build windows-1809: - extends: .windows-1809 +build windows: + extends: .windows <<: *build variables: - <<: [ *msvc15_9, *release ] - before_script: - - ./.gitlab-ci.py prepare - --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package windows-1809' - --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package windows-1809' - --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package windows-1809' - - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;jpeg62;libpng16;webp;lzma;openblas;avformat-58;avcodec-58;avutil-56;swscale-5;swresample-3' - - $env:INSTALL_OPENCV_COMPONENTS = 'core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab' + <<: [*release] -build windows-1809[pylon]: - extends: .windows-1809 +build windows[pylon]: + extends: .windows <<: *build variables: - <<: [ *msvc15_9, *release, *pylon ] - before_script: - - ./.gitlab-ci.py prepare - --dependency biotracker-interfaces bioroboticslab/biotracker/interfaces master 'package windows-1809' - --dependency biotracker-utility bioroboticslab/biotracker/utility master 'package windows-1809' - --dependency robofish-behavior_loader bioroboticslab/biotracker/behavior_loader master 'package windows-1809' - - $env:INSTALL_SHARED_LIBRARIES = 'zlib1;tiff;jpeg62;libpng16;webp;lzma;openblas;avformat-58;avcodec-58;avutil-56;swscale-5;swresample-3' - - $env:INSTALL_OPENCV_COMPONENTS = 'core;calib3d;features2d;flann;highgui;imgcodecs;imgproc;ml;objdetect;photo;shape;stitching;superres;video;videoio;videostab' - - -.package: &package - stage: package - artifacts: - paths: - - build/*.AppImage - - build/*.msi - expire_in: 1 week - script: ./.gitlab-ci.py package + <<: [*release, *pylon] -package centos-7: - extends: .centos-7 +package centos: + extends: .centos dependencies: - - build centos-7 + - build centos <<: *package -package centos-7[pylon]: - extends: .centos-7 +package centos[pylon]: + extends: .centos dependencies: - - build centos-7[pylon] + - build centos[pylon] variables: - <<: [ *pylon ] + <<: [*pylon] <<: *package -package windows-1809: - extends: .windows-1809 +package windows: + extends: .windows dependencies: - - build windows-1809 + - build windows <<: *package -package windows-1809[pylon]: - extends: .windows-1809 +package windows[pylon]: + extends: .windows dependencies: - - build windows-1809[pylon] + - build windows[pylon] <<: *package diff --git a/ci/compile.py b/ci/compile.py new file mode 100755 index 00000000..bf791920 --- /dev/null +++ b/ci/compile.py @@ -0,0 +1,7 @@ +#! /usr/bin/env python3 + +from subprocess import check_call + +if __name__ == "__main__": + command = ["ninja", "-C", "build"] + check_call(command) diff --git a/ci/configure.py b/ci/configure.py new file mode 100755 index 00000000..0aa461b8 --- /dev/null +++ b/ci/configure.py @@ -0,0 +1,81 @@ +#! /usr/bin/env python3 + +from ast import literal_eval +from os import environ as env, pathsep +from subprocess import check_call +from pathlib import Path +from platform import system + + +def define(key: str, value: str): + return ["-D", f"{key}={value}"] + + +def define_env(name: str): + return define(name, env[name]) if name in env else [] + + + +if __name__ == "__main__": + if system() == "Windows": + env["PATH"] += f"{pathsep}{env['VCPKG_INSTALL_DIR']}/bin" + for path in Path("vendor").glob("*/bin"): + env["PATH"] += f"{pathsep}{path}" + + shared_libraries = [ + "zlib1", + "tiff", + "jpeg62", + "libpng16", + "webp", + "lzma", + "openblas", + "avformat-58", + "avcodec-58", + "avutil-56", + "swscale-5", + "swresample-3", + ] + + opencv_components = [ + "core", + "calib3d", + "features2d", + "flann", + "highgui", + "imgcodecs", + "imgproc", + "ml", + "objdetect", + "photo", + "shape", + "stitching", + "superres", + "video", + "videoio", + "videostab", + ] + + command = ["cmake"] + command += ["-S", "."] + command += ["-B", "build"] + command += ["-G", "Ninja"] + command += define("CMAKE_PREFIX_PATH", Path("vendor").resolve()) + command += define_env("CMAKE_BUILD_TYPE") + command += define_env("CMAKE_TOOLCHAIN_FILE") + command += define("CMAKE_SUPPRESS_REGENERATION", "ON") + command += define("CMAKE_SKIP_PACKAGE_ALL_DEPENDENCY", "ON") + command += define_env("VCPKG_TARGET_TRIPLET") + + if system() == "Windows": + command += define("PACKAGE_MSI", "ON") + command += define("INSTALL_SYSTEM_LIBRARIES", "ON") + command += define("INSTALL_SHARED_LIBRARIES", ";".join(shared_libraries),) + command += define("INSTALL_OPENCV_COMPONENTS", ";".join(opencv_components),) + + elif system() == "Linux": + command += define("PACKAGE_APPIMAGE", "ON") + else: + assert False + + check_call(command) diff --git a/ci/package.py b/ci/package.py new file mode 100755 index 00000000..9c151b01 --- /dev/null +++ b/ci/package.py @@ -0,0 +1,15 @@ +#! /usr/bin/env python3 + +from os import environ as env, pathsep +from subprocess import check_call +from pathlib import Path +from platform import system + +if __name__ == "__main__": + if system() == "Linux": + for path in Path("vendor").glob("*/bin"): + env["PATH"] += f"{pathsep}{path}" + env['PATH'] += f"{pathsep}{env['Qt5_DIR']}/../../../bin/" + + command = ["ninja", "-C", "build", "package"] + check_call(command) diff --git a/ci/prepare.py b/ci/prepare.py new file mode 100755 index 00000000..38c4cc7f --- /dev/null +++ b/ci/prepare.py @@ -0,0 +1,62 @@ +#! /usr/bin/env python3 + +import tarfile +import shutil +import ssl + +from os import environ as env, symlink +from platform import system +from io import BytesIO +from urllib.request import Request, urlopen +from urllib.parse import quote, urlencode +from zipfile import ZipFile +from pathlib import Path + + +def define(key: str, value: str): + return ["-D", f"{key}={value}"] + + +def define_env(name: str): + return define(name, env[name]) if name in env else [] + + +def fetch_artifacts(project, reference, job): + gitlab_host = "https://git.imp.fu-berlin.de" + project = quote(project, safe="") + reference = quote(reference, safe="") + params = urlencode([("job", job)], doseq=True) + url = f"{gitlab_host}/api/v4/projects/{project}/jobs/artifacts/{reference}/download?{params}" + headers = {"JOB-TOKEN": env["CI_JOB_TOKEN"]} + return ZipFile( + BytesIO( + urlopen( + Request(url, headers=headers), context=ssl._create_unverified_context() + ).read() + ) + ) + + +def extract_cmake_package(artifacts, name): + for filename in artifacts.namelist(): + if Path(filename).match(f"{name}-*.tar.xz"): + with tarfile.open(fileobj=BytesIO(artifacts.read(filename))) as f: + f.extractall("vendor") + shutil.move(next(Path("vendor").glob(f"{name}-*/")), f"vendor/{name}") + + +if __name__ == "__main__": + if system() == "Windows": + job_stem = "package windows" + elif system() == "Linux": + job_stem = "package centos" + else: + assert False + + for name, project, job in [ + ("biotracker-interfaces", "bioroboticslab/biotracker/interfaces", job_stem), + ("biotracker-utility", "bioroboticslab/biotracker/utility", job_stem), + ("robofish-behavior_loader", "bioroboticslab/biotracker/behavior_loader", job_stem), + ]: + with fetch_artifacts(project, "master", job) as artifacts: + extract_cmake_package(artifacts, name) From b1dba5f1721c9bb6ff8ab22e538703fb0dd4069d Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Thu, 11 Jun 2020 12:41:22 +0200 Subject: [PATCH 148/171] [ci] update --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a761f7d6..6c5b526b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -5,11 +5,11 @@ stages: .centos: tags: [linux, docker] - image: git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker:centos + image: git.imp.fu-berlin.de:5000/bioroboticslab/auto/ci/centos:latest .windows: tags: [windows, docker] - image: git.imp.fu-berlin.de:5000/bioroboticslab/robofish/docker:devel-windows + image: git.imp.fu-berlin.de:5000/bioroboticslab/auto/ci/windows:latest-devel before_script: - . $Profile.AllUsersAllHosts From 61b9b1250004ac1dafd0438d8ea35ac7932bdfde Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Tue, 27 Oct 2020 00:51:42 +0100 Subject: [PATCH 149/171] [cmake] bump cmake to minimum version 3.15 (Boost::headers) --- CMakeLists.txt | 2 +- Src/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3dd64838..50dbe936 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.13) +cmake_minimum_required(VERSION 3.15) exec_program("git" ${CMAKE_CURRENT_SOURCE_DIR} ARGS "describe --dirty --always" OUTPUT_VARIABLE SOURCE_VERSION) diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index 743c87ae..a34298e4 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -24,7 +24,7 @@ target_link_libraries (${target} Qt5::Core Qt5::Gui Qt5::Xml Qt5::Network Qt5::W set(Boost_REALPATH ON) find_package(Boost REQUIRED COMPONENTS system filesystem program_options) -target_link_libraries(${target} Boost::system Boost::filesystem Boost::program_options) +target_link_libraries(${target} Boost::headers Boost::system Boost::filesystem Boost::program_options) option(WITH_PYLON "Support Pylon cameras" $ENV{WITH_PYLON}) if(WITH_PYLON) From 379a7c397fafd05dd97f5196ba5e7a8bacc3ed12 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Tue, 27 Oct 2020 00:52:13 +0100 Subject: [PATCH 150/171] [ci] use static boost --- Src/CMakeLists.txt | 5 ----- ci/configure.py | 2 ++ 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index a34298e4..42c290de 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -22,7 +22,6 @@ target_link_libraries (${target} robofish-behavior_loader) find_package(Qt5 REQUIRED COMPONENTS Core Gui Xml Network Widgets Multimedia MultimediaWidgets OpenGL) target_link_libraries (${target} Qt5::Core Qt5::Gui Qt5::Xml Qt5::Network Qt5::Widgets Qt5::Multimedia Qt5::MultimediaWidgets Qt5::OpenGL) -set(Boost_REALPATH ON) find_package(Boost REQUIRED COMPONENTS system filesystem program_options) target_link_libraries(${target} Boost::headers Boost::system Boost::filesystem Boost::program_options) @@ -75,8 +74,6 @@ if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") deploy_qt5(${target} DESTINATION .) endif() - locate_boost(shared_libraries COMPONENTS system filesystem program_options) - set(INSTALL_CUDA_COMPONENTS "" CACHE STRING "CUDA components to install") locate_cuda(shared_libraries COMPONENTS ${INSTALL_CUDA_COMPONENTS}) @@ -140,8 +137,6 @@ if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") install(DIRECTORY "${Pylon5_LIBRARY_DIR}/" DESTINATION "${CMAKE_INSTALL_LIBDIR}") endif() - install(FILES "${Boost_SYSTEM_LIBRARY_RELEASE}" "${Boost_FILESYSTEM_LIBRARY_RELEASE}" "${Boost_PROGRAM_OPTIONS_LIBRARY_RELEASE}" DESTINATION "${CMAKE_INSTALL_LIBDIR}") - get_target_property(shared_library biotracker-interfaces LOCATION) install(FILES "${shared_library}" DESTINATION "${CMAKE_INSTALL_LIBDIR}") diff --git a/ci/configure.py b/ci/configure.py index 0aa461b8..dc511ef9 100755 --- a/ci/configure.py +++ b/ci/configure.py @@ -67,6 +67,8 @@ def define_env(name: str): command += define("CMAKE_SKIP_PACKAGE_ALL_DEPENDENCY", "ON") command += define_env("VCPKG_TARGET_TRIPLET") + command += define("Boost_USE_STATIC_LIBS", "ON") + if system() == "Windows": command += define("PACKAGE_MSI", "ON") command += define("INSTALL_SYSTEM_LIBRARIES", "ON") From 127a10b49f9cfae0b0492d75973b2b2825784385 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Tue, 27 Oct 2020 01:13:28 +0100 Subject: [PATCH 151/171] [cmake] remove dead code --- Src/cmake/Locate.cmake | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/Src/cmake/Locate.cmake b/Src/cmake/Locate.cmake index f9e1290c..0e674217 100644 --- a/Src/cmake/Locate.cmake +++ b/Src/cmake/Locate.cmake @@ -116,24 +116,3 @@ function(locate_cudnn VAR) message(FATAL_ERROR "Platform not supported") endif() endfunction() - -function(locate_boost VAR) - cmake_parse_arguments(ARG "" "" "COMPONENTS" ${ARGN}) - - if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") - foreach(component ${ARG_COMPONENTS}) - string(TOUPPER ${component} uppercomponent) - execute_process( - COMMAND dumpbin.exe /HEADERS "${Boost_${uppercomponent}_LIBRARY_RELEASE}" - OUTPUT_VARIABLE _importlib_headers - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - string(REGEX MATCH "DLL name *: *([^\r\n]*)" match "${_importlib_headers}") - get_filename_component(dll_name "${CMAKE_MATCH_1}" NAME_WE) - locate_shared_library_anyof(${VAR} "${dll_name}") - endforeach() - set(${VAR} ${${VAR}} PARENT_SCOPE) - else() - message(FATAL_ERROR "Platform not supported") - endif() -endfunction() From 591407332ddc6072d088287fe99b0dab6c51debf Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Fri, 6 Nov 2020 15:38:18 +0100 Subject: [PATCH 152/171] Don't create genicam_xml_cache in home directory --- Src/main.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Src/main.cpp b/Src/main.cpp index beb06f12..bac5d51d 100644 --- a/Src/main.cpp +++ b/Src/main.cpp @@ -16,6 +16,12 @@ #include "util/Config.h" #include +#include + +#if HAS_PYLON + #include +#endif + //This will hide the console. //See https://stackoverflow.com/questions/2139637/hide-console-of-windows-application #ifdef _WIN32 @@ -54,6 +60,16 @@ int main(int argc, char* argv[]) { cfg->load(cfgLoc, "config.ini"); cfg->save(cfgLoc, "config.ini"); +#if HAS_PYLON + const auto cache = boost::filesystem::path{QStandardPaths::writableLocation(QStandardPaths::CacheLocation).toStdString()}; + const auto genicamCache = cache / "genicam_xml_cache"; + + boost::filesystem::create_directories(genicamCache); + GenICam::SetGenICamCacheFolder(GenICam::gcstring{genicamCache.c_str()}); + + qputenv(GENICAM_CACHE_VERSION, QByteArray::fromStdString(genicamCache.string())); +#endif + qRegisterMetaType("cv::Mat"); qRegisterMetaType>("std::shared_ptr"); qRegisterMetaType("std::size_t"); From ad93452821b8b6945de626b9dc9a692004834caf Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Mon, 16 Nov 2020 16:45:58 +0100 Subject: [PATCH 153/171] Support Bayer BG 8 pixel format for pylon cameras --- Src/Model/ImageStream.cpp | 2 -- Src/View/CameraDevice.cpp | 2 -- Src/util/camera/pylon.cpp | 38 ++++++++++++++++++++++++-------------- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/Src/Model/ImageStream.cpp b/Src/Model/ImageStream.cpp index 10ca51ce..f138c452 100644 --- a/Src/Model/ImageStream.cpp +++ b/Src/Model/ImageStream.cpp @@ -636,8 +636,6 @@ namespace BioTracker { auto view = toOpenCV(grabbed); auto scaled = std::make_shared(); cv::resize(view, *scaled, m_imageSize); - if (scaled->type() == CV_8UC1) - cv::cvtColor(*scaled, *scaled, cv::COLOR_GRAY2BGR); set_current_frame(scaled); if (m_recording && m_encoder) m_encoder->add(scaled); diff --git a/Src/View/CameraDevice.cpp b/Src/View/CameraDevice.cpp index 2a2af757..ec559916 100644 --- a/Src/View/CameraDevice.cpp +++ b/Src/View/CameraDevice.cpp @@ -124,8 +124,6 @@ void CameraDevice::on_showPreviewButton_clicked() cv::Mat scaled; cv::resize(view, scaled, cv::Size{width, height}); - if (scaled.type() == CV_8UC1) - cv::cvtColor(scaled, scaled, cv::COLOR_GRAY2RGB); ui->label_NoImage->setPixmap(QPixmap::fromImage(QImage(scaled.data, scaled.cols, scaled.rows, static_cast(scaled.step1()), QImage::Format_RGB888))); break; diff --git a/Src/util/camera/pylon.cpp b/Src/util/camera/pylon.cpp index 94b0caad..757fb398 100644 --- a/Src/util/camera/pylon.cpp +++ b/Src/util/camera/pylon.cpp @@ -2,10 +2,12 @@ #if HAS_PYLON -Pylon::IPylonDevice* getPylonDevice(int index) +#include + +Pylon::IPylonDevice *getPylonDevice(int index) { Pylon::PylonAutoInitTerm pylon; - auto& factory = Pylon::CTlFactory::GetInstance(); + auto &factory = Pylon::CTlFactory::GetInstance(); Pylon::DeviceInfoList_t devices; factory.EnumerateDevices(devices); if (0 <= index && index < devices.size()) @@ -15,17 +17,25 @@ Pylon::IPylonDevice* getPylonDevice(int index) cv::Mat toOpenCV(Pylon::CGrabResultPtr image) { - return { - cv::Size{static_cast(image->GetWidth()), static_cast(image->GetHeight())}, - [](Pylon::EPixelType type){ - switch (type) { - case Pylon::PixelType_Mono8: - return CV_8UC1; - default: - throw std::logic_error("Pixel type support not implemented"); - } - }(image->GetPixelType()), - image->GetBuffer() - }; + auto size = cv::Size{static_cast(image->GetWidth()), static_cast(image->GetHeight())}; + auto data = image->GetBuffer(); + + switch (image->GetPixelType()) + { + case Pylon::PixelType_Mono8: + { + auto mat = cv::Mat{size, CV_8UC1, data}; + cv::cvtColor(mat, mat, cv::COLOR_GRAY2BGR); + return mat; + } + case Pylon::PixelType_BayerBG8: + { + auto mat = cv::Mat{size, CV_8UC1, data}; + cv::cvtColor(mat, mat, cv::COLOR_BayerBG2BGR_EA); + return mat; + } + default: + throw std::logic_error("Pixel type support not implemented"); + } } #endif From 5df957862db0d55ad65e54f5cb1a0c119bf6b102 Mon Sep 17 00:00:00 2001 From: David Dormagen Date: Mon, 25 Jan 2021 10:31:42 +0100 Subject: [PATCH 154/171] annotations: correctly mark as 'dirty' when updating begin/end frame Otherwise, annotations would not be saved when closing the video if the only action since last save was e.g. setting the end timestamp. --- Src/Model/Annotations.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Src/Model/Annotations.cpp b/Src/Model/Annotations.cpp index 7bd91b62..c43209bf 100644 --- a/Src/Model/Annotations.cpp +++ b/Src/Model/Annotations.cpp @@ -434,6 +434,7 @@ bool Annotations::updateSelectionStartFrame() selectedAnnotation->startFrame = getCurrentFrame(); if (selectedAnnotation->endFrame < selectedAnnotation->startFrame) selectedAnnotation->endFrame = selectedAnnotation->startFrame; + dirty = true; return true; } @@ -444,6 +445,7 @@ bool Annotations::updateSelectionEndFrame() selectedAnnotation->endFrame = getCurrentFrame(); if (selectedAnnotation->startFrame > selectedAnnotation->endFrame) selectedAnnotation->startFrame = selectedAnnotation->endFrame; + dirty = true; return true; } From eda62e2fd6a43b09105d7b501f09500ba97cefca Mon Sep 17 00:00:00 2001 From: David Dormagen Date: Mon, 25 Jan 2021 16:51:31 +0100 Subject: [PATCH 155/171] annotations: draw inactive annotations slightly smaller ..and slightly less opaque and with a dashed line. This makes it easier to see whether there is an active annotation for the current frame in case of many stacked inactive annotations that would otherwise obscure the active one. --- Src/View/AnnotationsView.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Src/View/AnnotationsView.cpp b/Src/View/AnnotationsView.cpp index c8fb64dc..2003e637 100644 --- a/Src/View/AnnotationsView.cpp +++ b/Src/View/AnnotationsView.cpp @@ -56,8 +56,8 @@ void AnnotationsView::paint(QPainter * painter, const QStyleOptionGraphicsItem * else { QColor transparentGray = Qt::gray; - transparentGray.setAlphaF(0.25); - painter->setPen(QPen(transparentGray, 3, Qt::SolidLine, Qt::RoundCap)); + transparentGray.setAlphaF(0.2); + painter->setPen(QPen(transparentGray, 2.5, Qt::DashLine, Qt::RoundCap)); } annotation->paint(painter, option, widget); } From 43331306a35dedbeb88d2738ebb34acd641b23d1 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Wed, 3 Mar 2021 14:16:44 +0100 Subject: [PATCH 156/171] [ci] update --- .gitlab-ci.yml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6c5b526b..859f75b5 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -41,52 +41,52 @@ stages: script: - ./ci/package.py -build centos: +"build: [centos]": extends: .centos <<: *build variables: <<: [*release] -build centos[pylon]: +"build [pylon]: [centos]": extends: .centos <<: *build variables: <<: [*release, *pylon] -build windows: +"build: [windows]": extends: .windows <<: *build variables: <<: [*release] -build windows[pylon]: +"build [pylon]: [windows]": extends: .windows <<: *build variables: <<: [*release, *pylon] -package centos: +"package: [centos]": extends: .centos dependencies: - - build centos + - "build: [centos]" <<: *package -package centos[pylon]: +"package [pylon]: [centos]": extends: .centos dependencies: - - build centos[pylon] + - "build [pylon]: [centos]" variables: <<: [*pylon] <<: *package -package windows: +"package: [windows]": extends: .windows dependencies: - - build windows + - "build: [windows]" <<: *package -package windows[pylon]: +"package [pylon]: [windows]": extends: .windows dependencies: - - build windows[pylon] + - "build [pylon]: [windows]" <<: *package From 44803a39d0f27bc6e7809cd5c7c93d8b24227649 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Wed, 3 Mar 2021 14:24:14 +0100 Subject: [PATCH 157/171] [ci] fix update --- ci/prepare.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/prepare.py b/ci/prepare.py index 38c4cc7f..0d97cd75 100755 --- a/ci/prepare.py +++ b/ci/prepare.py @@ -47,9 +47,9 @@ def extract_cmake_package(artifacts, name): if __name__ == "__main__": if system() == "Windows": - job_stem = "package windows" + job_stem = "package: [windows]" elif system() == "Linux": - job_stem = "package centos" + job_stem = "package: [centos]" else: assert False From a7a409216a3827b6abc0df75eba8e47bb1407bbd Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Thu, 15 Jul 2021 13:48:08 +0200 Subject: [PATCH 158/171] Fix pylon camera code to not crash due to exception --- Src/Model/ImageStream.cpp | 70 ++++++--------------------------------- 1 file changed, 11 insertions(+), 59 deletions(-) diff --git a/Src/Model/ImageStream.cpp b/Src/Model/ImageStream.cpp index f138c452..f54480ef 100644 --- a/Src/Model/ImageStream.cpp +++ b/Src/Model/ImageStream.cpp @@ -491,52 +491,10 @@ namespace BioTracker { /*********************************************************/ class ImageStream3PylonCamera : public ImageStream { private: - class ImageCache : public Pylon::CImageEventHandler - { - private: - boost::circular_buffer grabResults_m; - mutable std::mutex mutex_m; - - public: - ImageCache(std::size_t n) - : grabResults_m(n) - {} - - void push_back(Pylon::CGrabResultPtr const& grabResult) - { - std::scoped_lock lock(mutex_m); - grabResults_m.push_back(grabResult); - } - - Pylon::CGrabResultPtr const& front() const - { - std::scoped_lock lock(mutex_m); - return grabResults_m.front(); - } - - void pop_front() - { - std::scoped_lock lock(mutex_m); - grabResults_m.pop_front(); - } - - std::size_t size() const - { - std::scoped_lock lock(mutex_m); - return grabResults_m.size(); - } - - void OnImageGrabbed([[maybe_unused]] Pylon::CInstantCamera& camera, Pylon::CGrabResultPtr const& grabResult) override - { - push_back(grabResult); - } - }; - - ImageCache m_images; + Pylon::CGrabResultPtr m_grabbed; public: explicit ImageStream3PylonCamera(Config* cfg, CameraConfiguration conf) : ImageStream(0, cfg) - , m_images(m_frame_stride + static_cast(std::ceil(m_frame_stride / 2.))) , m_camera(getPylonDevice(conf._selector.index), Pylon::Cleanup_Delete) { m_fps = conf._fps == -1 ? _cfg->RecordFPS : conf._fps; @@ -576,17 +534,13 @@ namespace BioTracker { } qDebug() << "\nStarting to record on camera " << m_camera.GetDeviceInfo().GetFriendlyName(); - m_camera.RegisterImageEventHandler(&m_images, Pylon::ERegistrationMode::RegistrationMode_Append, Pylon::ECleanup::Cleanup_None); - m_camera.StartGrabbing(Pylon::GrabStrategy_OneByOne, Pylon::GrabLoop_ProvidedByInstantCamera); + m_camera.StartGrabbing(); nextFrame_impl(); m_recording = false; m_encoder = std::make_unique(m_fps, _cfg); } - ~ImageStream3PylonCamera() - { - m_camera.DeregisterImageEventHandler(&m_images); - } + GuiParam::MediaType type() const override { return GuiParam::MediaType::Camera; @@ -621,19 +575,17 @@ namespace BioTracker { bool nextFrame_impl() override { - while (m_images.size() < m_frame_stride) - std::this_thread::sleep_for(std::chrono::milliseconds(1000) / m_fps / 2); // Half of a frame intervals - for (auto i = std::size_t{1}; i < m_frame_stride; ++i) - m_images.pop_front(); - Pylon::CGrabResultPtr grabbed = m_images.front(); - m_images.pop_front(); - - if (!grabbed->GrabSucceeded()) { - qCritical() << "Unable to grab frame:" << grabbed->GetErrorDescription(); + for (std::size_t i = 1; i < m_frame_stride; ++i) { + if (!m_camera.RetrieveResult(2000, m_grabbed, Pylon::TimeoutHandling_Return)) { + return false; + } + } + + if (!m_camera.RetrieveResult(2000, m_grabbed, Pylon::TimeoutHandling_Return)) { return false; } - auto view = toOpenCV(grabbed); + auto view = toOpenCV(m_grabbed); auto scaled = std::make_shared(); cv::resize(view, *scaled, m_imageSize); set_current_frame(scaled); From 4291ea2deb5156dfd4849684a310671597efdeea Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Tue, 21 Sep 2021 12:37:23 +0200 Subject: [PATCH 159/171] Fix incorrect opencv camera device selection on Linux See https://bugzilla.kernel.org/show_bug.cgi?id=199575 as to why just using indices doesn't work --- Src/Model/ImageStream.cpp | 2 +- Src/View/CameraDevice.cpp | 12 ++++++++---- Src/util/camera/base.h | 5 +++-- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/Src/Model/ImageStream.cpp b/Src/Model/ImageStream.cpp index f54480ef..1f7512a9 100644 --- a/Src/Model/ImageStream.cpp +++ b/Src/Model/ImageStream.cpp @@ -395,7 +395,7 @@ namespace BioTracker { */ explicit ImageStream3OpenCVCamera(Config *cfg, CameraConfiguration conf) : ImageStream(0, cfg) - , m_capture(conf._selector.index) + , m_capture(conf._selector.name) , m_fps(m_capture.get(cv::CAP_PROP_FPS)) { // Give the camera some extra time to get ready: // Somehow opening it on first try sometimes does not succeed. diff --git a/Src/View/CameraDevice.cpp b/Src/View/CameraDevice.cpp index ec559916..63e3eefb 100644 --- a/Src/View/CameraDevice.cpp +++ b/Src/View/CameraDevice.cpp @@ -60,7 +60,11 @@ void CameraDevice::on_showPreviewButton_clicked() { case CameraType::OpenCV: { - m_capture.open(conf._selector.index); + if (conf._selector.index == cv::CAP_XIAPI) { + m_capture.open(cv::CAP_XIAPI); + } else { + m_capture.open(conf._selector.name); + } for (auto num_tries = 0; !m_capture.isOpened() && num_tries < 50; ++num_tries) std::this_thread::sleep_for(std::chrono::milliseconds(100)); @@ -145,7 +149,7 @@ void CameraDevice::listAllCameras() { ui->comboBox->addItem( cameras[index].description(), - QVariant::fromValue(CameraSelector{CameraType::OpenCV, index})); + QVariant::fromValue(CameraSelector{CameraType::OpenCV, index, cameras[index].deviceName().toStdString()})); } { @@ -154,7 +158,7 @@ void CameraDevice::listAllCameras() { ui->comboBox->addItem( "XIMEA default", - QVariant::fromValue(CameraSelector{CameraType::OpenCV, cv::CAP_XIAPI})); + QVariant::fromValue(CameraSelector{CameraType::OpenCV, cv::CAP_XIAPI, ""})); } } @@ -170,7 +174,7 @@ void CameraDevice::listAllCameras() { ui->comboBox->addItem( QString{devices[index].GetFriendlyName()}, - QVariant::fromValue(CameraSelector{CameraType::Pylon, index})); + QVariant::fromValue(CameraSelector{CameraType::Pylon, index, ""})); } } #endif diff --git a/Src/util/camera/base.h b/Src/util/camera/base.h index 7d28620f..0998ba98 100644 --- a/Src/util/camera/base.h +++ b/Src/util/camera/base.h @@ -14,8 +14,9 @@ enum class CameraType struct CameraSelector { - CameraType type; - int index; + CameraType type; + int index; + std::string name; }; Q_DECLARE_METATYPE(CameraSelector); From eaee7fcf5c7b269e46eb0d1fbe83015b0e1cc851 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Tue, 21 Sep 2021 12:44:11 +0200 Subject: [PATCH 160/171] Fix a crash when image to display is completely black --- Src/Model/TextureObject.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Src/Model/TextureObject.cpp b/Src/Model/TextureObject.cpp index 781939be..673b3a96 100644 --- a/Src/Model/TextureObject.cpp +++ b/Src/Model/TextureObject.cpp @@ -24,7 +24,7 @@ void TextureObject::set(const cv::Mat &img) { // (usually 64F) so we need to map a [HUGE range] to -> [0 .. 255] double min, max; cv::minMaxLoc(img, &min, &max); - if (min >= 0 && min < 255 && max > 0 && max <= 255) { + if (min >= 0 && min < 255 && max >= 0 && max <= 255) { // do not refit if the range is actually inbetween [0 ... 255] img.convertTo(img8U, CV_8U); } else if (max > min) { From a16e761dfbdd80d278ca1fc7ced8400e57583e11 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Fri, 12 Nov 2021 15:59:42 +0100 Subject: [PATCH 161/171] Fix potential issue with image being empty (but not null) --- Src/Model/TextureObject.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Src/Model/TextureObject.cpp b/Src/Model/TextureObject.cpp index 673b3a96..e403c764 100644 --- a/Src/Model/TextureObject.cpp +++ b/Src/Model/TextureObject.cpp @@ -13,6 +13,9 @@ void TextureObject::set(const cv::Mat &img) { //TODO Andi this cv::Mat is null sometimes when using the camera!? if (&img == NULL) return; + if (img.empty()) { + return; + } if (img.channels() == 3) { img.convertTo(img, CV_8UC3); cv::cvtColor(img, m_img, cv::ColorConversionCodes::COLOR_BGR2RGB); From b7a0ca14677445e3236fcf21332e74fee1e880f3 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Fri, 12 Nov 2021 17:21:50 +0100 Subject: [PATCH 162/171] Hopefully fix that invalid matrix memoty crash bug with this --- Src/Controller/ControllerTextureObject.cpp | 2 +- Src/Model/TextureObject.cpp | 24 ++++++++++------------ Src/Model/TextureObject.h | 2 +- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/Src/Controller/ControllerTextureObject.cpp b/Src/Controller/ControllerTextureObject.cpp index bf8132a7..7aa3e3ba 100644 --- a/Src/Controller/ControllerTextureObject.cpp +++ b/Src/Controller/ControllerTextureObject.cpp @@ -40,7 +40,7 @@ void ControllerTextureObject::connectControllerToController() { void ControllerTextureObject::receiveCvMat(std::shared_ptr mat, QString name) { checkIfTextureModelExists(name); - m_TextureObjects.value(name)->set(*mat); + m_TextureObjects.value(name)->set(mat); } diff --git a/Src/Model/TextureObject.cpp b/Src/Model/TextureObject.cpp index e403c764..9c85ba28 100644 --- a/Src/Model/TextureObject.cpp +++ b/Src/Model/TextureObject.cpp @@ -9,27 +9,25 @@ TextureObject::TextureObject(QObject *parent, QString name) : m_texture = QImage(1, 1, QImage::Format_RGB888); } -void TextureObject::set(const cv::Mat &img) { - //TODO Andi this cv::Mat is null sometimes when using the camera!? - if (&img == NULL) - return; - if (img.empty()) { +void TextureObject::set(std::shared_ptr img) { + if (img->empty()) { return; } - if (img.channels() == 3) { - img.convertTo(img, CV_8UC3); - cv::cvtColor(img, m_img, cv::ColorConversionCodes::COLOR_BGR2RGB); - } else if (img.channels() == 1) { + + if (img->channels() == 3) { + img->convertTo(m_img, CV_8UC3); + cv::cvtColor(m_img, m_img, cv::ColorConversionCodes::COLOR_BGR2RGB); + } else if (img->channels() == 1) { // convert grayscale to "color" cv::Mat img8U; // we assume that the 1d image has more than 8bit per pixel // (usually 64F) so we need to map a [HUGE range] to -> [0 .. 255] double min, max; - cv::minMaxLoc(img, &min, &max); + cv::minMaxLoc(*img, &min, &max); if (min >= 0 && min < 255 && max >= 0 && max <= 255) { // do not refit if the range is actually inbetween [0 ... 255] - img.convertTo(img8U, CV_8U); + img->convertTo(img8U, CV_8U); } else if (max > min) { // otherwise: the range is outside of native [0 ... 255] so we // actually need to do some refitting @@ -37,11 +35,11 @@ void TextureObject::set(const cv::Mat &img) { // mapping 1-step out from [0 .. 255] range 1-step in the [min .. max] range const double sizeRatio = 256.0/abs(static_cast(max - min)); const double convertedMin = abs(static_cast(min * sizeRatio)); - img.convertTo(img8U, CV_8U, sizeRatio, convertedMin); + img->convertTo(img8U, CV_8U, sizeRatio, convertedMin); } cv::cvtColor(img8U, m_img, cv::ColorConversionCodes::COLOR_GRAY2RGB); } else { - m_img = img; + img->copyTo(m_img); } m_texture = QImage( diff --git a/Src/Model/TextureObject.h b/Src/Model/TextureObject.h index f136f04e..dd0b7ff2 100644 --- a/Src/Model/TextureObject.h +++ b/Src/Model/TextureObject.h @@ -24,7 +24,7 @@ class TextureObject : public IModel { public: explicit TextureObject(QObject* parent = 0, QString name = "NoName"); - void set(cv::Mat const& img); + void set(std::shared_ptr img); QString getName(); QImage const& get() const { From f9ba343080b7aa5ae9d46f94eaed36ed59ad5c77 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Mon, 15 Nov 2021 00:15:25 +0100 Subject: [PATCH 163/171] Add code comment about crash bug --- Src/Model/TextureObject.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Src/Model/TextureObject.cpp b/Src/Model/TextureObject.cpp index 9c85ba28..45181f02 100644 --- a/Src/Model/TextureObject.cpp +++ b/Src/Model/TextureObject.cpp @@ -24,6 +24,9 @@ void TextureObject::set(std::shared_ptr img) { // we assume that the 1d image has more than 8bit per pixel // (usually 64F) so we need to map a [HUGE range] to -> [0 .. 255] double min, max; + // FIXME: This still sometimes crashes when accessing the img data. + // cv::Mat is reference counted, so all std::shared_ptr + // instances should be replaced with cv::Mat. cv::minMaxLoc(*img, &min, &max); if (min >= 0 && min < 255 && max >= 0 && max <= 255) { // do not refit if the range is actually inbetween [0 ... 255] From 4a01ea6ec938c3fe27db0c5817f2bd6a617a7640 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Mon, 15 Nov 2021 18:09:03 +0100 Subject: [PATCH 164/171] cleanup --- Src/GuiContext.cpp | 1 - Src/IStates/IPlayerState.h | 1 - Src/View/AnnotationsView.cpp | 1 - Src/View/GLVideoView.h | 1 - 4 files changed, 4 deletions(-) diff --git a/Src/GuiContext.cpp b/Src/GuiContext.cpp index fcaf0914..9840b020 100644 --- a/Src/GuiContext.cpp +++ b/Src/GuiContext.cpp @@ -6,7 +6,6 @@ #include "Controller/ControllerAnnotations.h" #include "Controller/ControllerTrackedComponentCore.h" #include "Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h" -#include "Model/TextureObject.h" #include "Controller/ControllerGraphicScene.h" #include "Controller/ControllerDataExporter.h" #include "Controller/ControllerAreaDescriptor.h" diff --git a/Src/IStates/IPlayerState.h b/Src/IStates/IPlayerState.h index d47d81df..85f08675 100644 --- a/Src/IStates/IPlayerState.h +++ b/Src/IStates/IPlayerState.h @@ -15,7 +15,6 @@ #include "Interfaces/IModel/IModel.h" #include "Model/ImageStream.h" -#include "Model/TextureObject.h" /** * The stateParameters struct represents the possible stats for the VideoControll buttons in the MainWindow widget. diff --git a/Src/View/AnnotationsView.cpp b/Src/View/AnnotationsView.cpp index 2003e637..ebf63c8a 100644 --- a/Src/View/AnnotationsView.cpp +++ b/Src/View/AnnotationsView.cpp @@ -6,7 +6,6 @@ #include "Interfaces/IController/IController.h" -#include "Model/TextureObject.h" #include "Model/Annotations.h" #include "View/GraphicsView.h" diff --git a/Src/View/GLVideoView.h b/Src/View/GLVideoView.h index afc0bd29..9931c060 100644 --- a/Src/View/GLVideoView.h +++ b/Src/View/GLVideoView.h @@ -5,7 +5,6 @@ #include "QPainter" #include "Interfaces/IView/IViewWidget.h" -#include "Model/TextureObject.h" class GLVideoView: public IViewOpenGLWidget { From 2ec3cd666c44c9232397c7f5ca91b9e5ab19e485 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Mon, 7 Mar 2022 12:03:33 +0100 Subject: [PATCH 165/171] Fix Gitlab Issue #1 --- Src/Model/ImageStream.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Src/Model/ImageStream.cpp b/Src/Model/ImageStream.cpp index 1f7512a9..e5ff8cdb 100644 --- a/Src/Model/ImageStream.cpp +++ b/Src/Model/ImageStream.cpp @@ -534,7 +534,7 @@ namespace BioTracker { } qDebug() << "\nStarting to record on camera " << m_camera.GetDeviceInfo().GetFriendlyName(); - m_camera.StartGrabbing(); + m_camera.StartGrabbing(Pylon::GrabStrategy_LatestImages, Pylon::GrabLoop_ProvidedByUser); nextFrame_impl(); m_recording = false; From e86799ccddff212cbd139a0bf39940f9c0589b6d Mon Sep 17 00:00:00 2001 From: Max Breitenfeldt Date: Thu, 21 Jul 2022 17:43:06 +0200 Subject: [PATCH 166/171] add missing include --- Src/IStates/IPlayerState.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Src/IStates/IPlayerState.h b/Src/IStates/IPlayerState.h index 85f08675..a8d513b5 100644 --- a/Src/IStates/IPlayerState.h +++ b/Src/IStates/IPlayerState.h @@ -10,11 +10,11 @@ #define IPLAYERSTATE_H #include -#include "QPointer" +#include #include "Interfaces/IModel/IModel.h" - #include "Model/ImageStream.h" +#include "QPointer" /** * The stateParameters struct represents the possible stats for the VideoControll buttons in the MainWindow widget. From 4c92c13b1fdcf064b3c32393539448da73803a75 Mon Sep 17 00:00:00 2001 From: Max Breitenfeldt Date: Thu, 21 Jul 2022 18:09:18 +0200 Subject: [PATCH 167/171] use shared pointer to playerParameters PlayerParameters is owned by MediaPlayerStateMachine, which lives on MediaPlayers thread. sharing a Pointer via signals is not thread safe. This is fixed by copying the object and using a shared_ptr in the signal. The shared_ptr is const, so there may only be concurrent reads on it. --- Src/Controller/ControllerAnnotations.cpp | 25 +++--- Src/Controller/ControllerAnnotations.h | 2 +- Src/Controller/ControllerAreaDescriptor.cpp | 2 +- Src/Controller/ControllerAreaDescriptor.h | 4 +- Src/Controller/ControllerDataExporter.cpp | 2 +- Src/Controller/ControllerDataExporter.h | 2 +- Src/Model/AreaDescriptor/AreaInfo.cpp | 2 +- Src/Model/AreaDescriptor/AreaInfo.h | 4 +- Src/Model/MediaPlayer.cpp | 2 +- Src/Model/MediaPlayer.h | 4 +- .../MediaPlayerStateMachine.cpp | 89 +++++++++++-------- .../MediaPlayerStateMachine.h | 4 +- Src/View/CoreParameterView.cpp | 2 +- Src/View/CoreParameterView.h | 2 +- Src/main.cpp | 5 +- 15 files changed, 85 insertions(+), 66 deletions(-) diff --git a/Src/Controller/ControllerAnnotations.cpp b/Src/Controller/ControllerAnnotations.cpp index d4dce888..d62189cb 100644 --- a/Src/Controller/ControllerAnnotations.cpp +++ b/Src/Controller/ControllerAnnotations.cpp @@ -275,17 +275,20 @@ void ControllerAnnotations::mouseMoveEvent(QMouseEvent*event, const QPoint &pos) } } -void ControllerAnnotations::setPlayerParameters(playerParameters* parameters) -{ - auto model = static_cast(getModel()); - model->setCurrentFrame(parameters->m_CurrentFrameNumber); - - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); - auto trackedComponentCoreController = qobject_cast(ctr); - auto trackedTrajectoryModel = dynamic_cast(trackedComponentCoreController->getModel()); - if (trackedTrajectoryModel != nullptr) - model->updateTrackedAnnotations(trackedTrajectoryModel->getChildNodes()); - updateView(); +void ControllerAnnotations::setPlayerParameters( + std::shared_ptr parameters) { + auto model = static_cast(getModel()); + model->setCurrentFrame(parameters->m_CurrentFrameNumber); + + IController *ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); + auto trackedComponentCoreController = + qobject_cast(ctr); + auto trackedTrajectoryModel = dynamic_cast( + trackedComponentCoreController->getModel()); + if (trackedTrajectoryModel != nullptr) + model->updateTrackedAnnotations(trackedTrajectoryModel->getChildNodes()); + updateView(); } void ControllerAnnotations::receiveAddLabelAnnotation(){ diff --git a/Src/Controller/ControllerAnnotations.h b/Src/Controller/ControllerAnnotations.h index 4dd44906..1f716e70 100644 --- a/Src/Controller/ControllerAnnotations.h +++ b/Src/Controller/ControllerAnnotations.h @@ -34,7 +34,7 @@ class ControllerAnnotations : public IControllerCfg void mouseReleaseEvent(QMouseEvent*event, const QPoint &pos); void mouseMoveEvent(QMouseEvent*event, const QPoint &pos); void keyPressEvent(QKeyEvent *event); - void setPlayerParameters(playerParameters* parameters); + void setPlayerParameters(std::shared_ptr parameters); //annotation receivers void receiveAddLabelAnnotation(); diff --git a/Src/Controller/ControllerAreaDescriptor.cpp b/Src/Controller/ControllerAreaDescriptor.cpp index 6e2b0af1..406d578e 100644 --- a/Src/Controller/ControllerAreaDescriptor.cpp +++ b/Src/Controller/ControllerAreaDescriptor.cpp @@ -93,7 +93,7 @@ void ControllerAreaDescriptor::trackingAreaType(int v) { gview->addGraphicsItem(static_cast(m_ViewApperture)); } -void ControllerAreaDescriptor::rcvPlayerParameters(playerParameters* parameters) +void ControllerAreaDescriptor::rcvPlayerParameters(std::shared_ptr parameters) { //Best effort to save performance... //File has changed diff --git a/Src/Controller/ControllerAreaDescriptor.h b/Src/Controller/ControllerAreaDescriptor.h index dc885d19..1cbad6c3 100644 --- a/Src/Controller/ControllerAreaDescriptor.h +++ b/Src/Controller/ControllerAreaDescriptor.h @@ -25,7 +25,7 @@ public slots: void setDisplayRectificationDefinition(bool b); void setDisplayTrackingAreaDefinition(bool b); void setTrackingAreaAsEllipse(bool b); - void rcvPlayerParameters(playerParameters* parameters); + void rcvPlayerParameters(std::shared_ptr parameters); private slots: void trackingAreaType(int v); @@ -52,4 +52,4 @@ private slots: bool _visibleApperture = false; bool _visibleRectification = false; QString _currentFilename = "No Media"; -}; \ No newline at end of file +}; diff --git a/Src/Controller/ControllerDataExporter.cpp b/Src/Controller/ControllerDataExporter.cpp index 40870293..cf1d6095 100644 --- a/Src/Controller/ControllerDataExporter.cpp +++ b/Src/Controller/ControllerDataExporter.cpp @@ -140,7 +140,7 @@ void ControllerDataExporter::connectModelToController() { QObject::connect(mplay, &MediaPlayer::fwdPlayerParameters, this, &ControllerDataExporter::rcvPlayerParameters); } -void ControllerDataExporter::rcvPlayerParameters(playerParameters* parameters) { +void ControllerDataExporter::rcvPlayerParameters(std::shared_ptr parameters) { if (qobject_cast(m_Model) != nullptr) { qobject_cast(m_Model)->setFps(parameters->m_fpsSourceVideo); qobject_cast(m_Model)->setTitle(parameters->m_CurrentTitle); diff --git a/Src/Controller/ControllerDataExporter.h b/Src/Controller/ControllerDataExporter.h index a3af361e..6dcfcc68 100644 --- a/Src/Controller/ControllerDataExporter.h +++ b/Src/Controller/ControllerDataExporter.h @@ -50,7 +50,7 @@ class ControllerDataExporter : public IControllerCfg { void connectModelToController() override; private Q_SLOTS: - void rcvPlayerParameters(playerParameters* parameters); + void rcvPlayerParameters(std::shared_ptr parameters); private: IModelTrackedComponentFactory* _factory; diff --git a/Src/Model/AreaDescriptor/AreaInfo.cpp b/Src/Model/AreaDescriptor/AreaInfo.cpp index 93951475..89657adb 100644 --- a/Src/Model/AreaDescriptor/AreaInfo.cpp +++ b/Src/Model/AreaDescriptor/AreaInfo.cpp @@ -83,7 +83,7 @@ void AreaInfo::loadAreas() { _apperture->setVertices(p); } -void AreaInfo::rcvPlayerParameters(playerParameters* parameters) +void AreaInfo::rcvPlayerParameters(std::shared_ptr parameters) { if (_parms == nullptr || _parms->m_CurrentFilename != parameters->m_CurrentFilename) { _rectInitialized = false; diff --git a/Src/Model/AreaDescriptor/AreaInfo.h b/Src/Model/AreaDescriptor/AreaInfo.h index 530f38aa..1fa3dc89 100644 --- a/Src/Model/AreaDescriptor/AreaInfo.h +++ b/Src/Model/AreaDescriptor/AreaInfo.h @@ -50,12 +50,12 @@ class AreaInfo : public IModelAreaDescriptor bool _useEntireScreen = false; int _vdimX = 1; int _vdimY = 1; - playerParameters* _parms; + std::shared_ptr _parms; bool _rectInitialized = false; QString _areaInfoCache; public Q_SLOTS: - void rcvPlayerParameters(playerParameters* parameters); + void rcvPlayerParameters(std::shared_ptr parameters); private: QString myType(); diff --git a/Src/Model/MediaPlayer.cpp b/Src/Model/MediaPlayer.cpp index 8c1e446d..73be6a70 100644 --- a/Src/Model/MediaPlayer.cpp +++ b/Src/Model/MediaPlayer.cpp @@ -219,7 +219,7 @@ QString MediaPlayer::takeScreenshot(GraphicsView *gv) { void MediaPlayer::receiveTrackingPaused() { } -void MediaPlayer::receivePlayerParameters(playerParameters* param) { +void MediaPlayer::receivePlayerParameters(std::shared_ptr param) { m_Back = param->m_Back; m_Paus = param->m_Paus; diff --git a/Src/Model/MediaPlayer.h b/Src/Model/MediaPlayer.h index 367abed3..668987d7 100644 --- a/Src/Model/MediaPlayer.h +++ b/Src/Model/MediaPlayer.h @@ -94,7 +94,7 @@ class MediaPlayer : public IModel { void toggleRecordImageStreamCommand(); - void fwdPlayerParameters(playerParameters* parameters); + void fwdPlayerParameters(std::shared_ptr parameters); void emitNextMediaInBatch(const std::string path); void emitNextMediaInBatchLoaded(const std::string path); @@ -131,7 +131,7 @@ class MediaPlayer : public IModel { /** * MediaPlayer will receive the current playerParameters from the MediaPlayerStateMachine. */ - void receivePlayerParameters(playerParameters* param); + void receivePlayerParameters(std::shared_ptr param); /** * If the MediaPlayerStateMachine is finished with executing the current state it will trigger this SLOT. diff --git a/Src/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.cpp b/Src/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.cpp index d74d62de..7fa0d149 100644 --- a/Src/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.cpp +++ b/Src/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.cpp @@ -1,5 +1,6 @@ #include "MediaPlayerStateMachine.h" +#include "Model/MediaPlayerStateMachine/PlayerParameters.h" #include "PlayerStates/PStatePlay.h" #include "PlayerStates/PStateInitialStream.h" #include "PlayerStates/PStateStepForw.h" @@ -10,26 +11,36 @@ #include "PlayerStates/PStateGoToFrame.h" #include "util/types.h" +#include MediaPlayerStateMachine::MediaPlayerStateMachine(QObject* parent) : IModel(parent), m_ImageStream(BioTracker::Core::make_ImageStream3NoMedia()) { - - m_PlayerParameters = new playerParameters(); - - m_States.insert(IPlayerState::PLAYER_STATES::STATE_INITIAL, (new PStateInitial(this, m_ImageStream))); - m_States.insert(IPlayerState::PLAYER_STATES::STATE_INITIAL_STREAM, (new PStateInitialStream(this, m_ImageStream))); - m_States.insert(IPlayerState::PLAYER_STATES::STATE_STEP_FORW, (new PStateStepForw(this, m_ImageStream))); - m_States.insert(IPlayerState::PLAYER_STATES::STATE_PLAY, (new PStatePlay(this, m_ImageStream))); - m_States.insert(IPlayerState::PLAYER_STATES::STATE_PAUSE, (new PStatePause(this, m_ImageStream))); - m_States.insert(IPlayerState::PLAYER_STATES::STATE_STEP_BACK, (new PStateStepBack(this, m_ImageStream))); - m_States.insert(IPlayerState::PLAYER_STATES::STATE_WAIT, (new PStateWait(this, m_ImageStream))); - m_States.insert(IPlayerState::PLAYER_STATES::STATE_GOTOFRAME, (new PStateGoToFrame(this, m_ImageStream))); - - QMap::iterator i; - for (i = m_States.begin(); i != m_States.end(); i++) { - QObject::connect(i.value(), &IPlayerState::emitNextMediaInBatch, this, &MediaPlayerStateMachine::emitNextMediaInBatch); - QObject::connect(i.value(), &IPlayerState::emitNextMediaInBatchLoaded, this, &MediaPlayerStateMachine::emitNextMediaInBatchLoaded); + m_PlayerParameters = playerParameters(); + + m_States.insert(IPlayerState::PLAYER_STATES::STATE_INITIAL, + (new PStateInitial(this, m_ImageStream))); + m_States.insert(IPlayerState::PLAYER_STATES::STATE_INITIAL_STREAM, + (new PStateInitialStream(this, m_ImageStream))); + m_States.insert(IPlayerState::PLAYER_STATES::STATE_STEP_FORW, + (new PStateStepForw(this, m_ImageStream))); + m_States.insert(IPlayerState::PLAYER_STATES::STATE_PLAY, + (new PStatePlay(this, m_ImageStream))); + m_States.insert(IPlayerState::PLAYER_STATES::STATE_PAUSE, + (new PStatePause(this, m_ImageStream))); + m_States.insert(IPlayerState::PLAYER_STATES::STATE_STEP_BACK, + (new PStateStepBack(this, m_ImageStream))); + m_States.insert(IPlayerState::PLAYER_STATES::STATE_WAIT, + (new PStateWait(this, m_ImageStream))); + m_States.insert(IPlayerState::PLAYER_STATES::STATE_GOTOFRAME, + (new PStateGoToFrame(this, m_ImageStream))); + + QMap::iterator i; + for (i = m_States.begin(); i != m_States.end(); i++) { + QObject::connect(i.value(), &IPlayerState::emitNextMediaInBatch, this, + &MediaPlayerStateMachine::emitNextMediaInBatch); + QObject::connect(i.value(), &IPlayerState::emitNextMediaInBatchLoaded, this, + &MediaPlayerStateMachine::emitNextMediaInBatchLoaded); } setNextState(IPlayerState::PLAYER_STATES::STATE_INITIAL); @@ -53,8 +64,8 @@ void MediaPlayerStateMachine::receiveLoadVideoCommand(std::vectorm_TotalNumbFrames = m_stream->numFrames(); - + m_PlayerParameters.m_TotalNumbFrames = m_stream->numFrames(); + for (auto x: m_States) { x->changeImageStream(m_stream); } @@ -66,7 +77,7 @@ void MediaPlayerStateMachine::receiveLoadVideoCommand(std::vector files) { m_stream = BioTracker::Core::make_ImageStream3Pictures(_cfg, files); - m_PlayerParameters->m_TotalNumbFrames = m_stream->numFrames(); + m_PlayerParameters.m_TotalNumbFrames = m_stream->numFrames(); for (auto x: m_States) { x->changeImageStream(m_stream); @@ -84,7 +95,7 @@ void MediaPlayerStateMachine::receiveLoadCameraDevice(CameraConfiguration conf) m_stream = BioTracker::Core::make_ImageStream3Camera(_cfg, conf); - m_PlayerParameters->m_TotalNumbFrames = m_stream->numFrames(); + m_PlayerParameters.m_TotalNumbFrames = m_stream->numFrames(); for (auto x: m_States) { x->changeImageStream(m_stream); @@ -120,15 +131,16 @@ void MediaPlayerStateMachine::receiveGoToFrame(int frame) { } void MediaPlayerStateMachine::receiveTargetFps(double fps) { - m_PlayerParameters->m_fpsTarget = fps; - static_cast(m_States.value(IPlayerState::STATE_PLAY))->setFps(fps); + m_PlayerParameters.m_fpsTarget = fps; + static_cast(m_States.value(IPlayerState::STATE_PLAY)) + ->setFps(fps); } void MediaPlayerStateMachine::receivetoggleRecordImageStream() { if (m_stream) - m_PlayerParameters->m_RecI = m_stream->toggleRecord(); + m_PlayerParameters.m_RecI = m_stream->toggleRecord(); else - m_PlayerParameters->m_RecI = false; + m_PlayerParameters.m_RecI = false; emitSignals(); return; } @@ -137,24 +149,27 @@ void MediaPlayerStateMachine::updatePlayerParameter() { stateParameters stateParam = m_CurrentPlayerState->getStateParameters(); - m_PlayerParameters->m_Back = stateParam.m_Back; - m_PlayerParameters->m_Forw = stateParam.m_Forw; - m_PlayerParameters->m_Paus = stateParam.m_Paus; - m_PlayerParameters->m_Play = stateParam.m_Play; - m_PlayerParameters->m_Stop = stateParam.m_Stop; + m_PlayerParameters.m_Back = stateParam.m_Back; + m_PlayerParameters.m_Forw = stateParam.m_Forw; + m_PlayerParameters.m_Paus = stateParam.m_Paus; + m_PlayerParameters.m_Play = stateParam.m_Play; + m_PlayerParameters.m_Stop = stateParam.m_Stop; - m_PlayerParameters->m_CurrentFilename = m_CurrentPlayerState->getCurrentFileName(); - m_PlayerParameters->m_TotalNumbFrames = m_CurrentPlayerState->m_ImageStream->numFrames(); + m_PlayerParameters.m_CurrentFilename = m_CurrentPlayerState->getCurrentFileName(); + m_PlayerParameters.m_TotalNumbFrames = m_CurrentPlayerState->m_ImageStream->numFrames(); - m_PlayerParameters->m_CurrentFrame = m_CurrentPlayerState->getCurrentFrame(); - m_PlayerParameters->m_CurrentFrameNumber = m_CurrentPlayerState->getCurrentFrameNumber(); - m_PlayerParameters->m_fpsSourceVideo = m_CurrentPlayerState->m_ImageStream->fps(); - m_PlayerParameters->m_batchItems = m_CurrentPlayerState->getBatchItems(); + m_PlayerParameters.m_CurrentFrame = m_CurrentPlayerState->getCurrentFrame(); + m_PlayerParameters.m_CurrentFrameNumber = m_CurrentPlayerState->getCurrentFrameNumber(); + m_PlayerParameters.m_fpsSourceVideo = m_CurrentPlayerState->m_ImageStream->fps(); + m_PlayerParameters.m_batchItems = m_CurrentPlayerState->getBatchItems(); } void MediaPlayerStateMachine::emitSignals() { - - Q_EMIT emitPlayerParameters(m_PlayerParameters); + auto parametersCopy = + std::make_shared(m_PlayerParameters); + assert(parametersCopy->m_CurrentFrameNumber == + m_PlayerParameters.m_CurrentFrameNumber); + Q_EMIT emitPlayerParameters(parametersCopy); } void MediaPlayerStateMachine::setNextState(IPlayerState::PLAYER_STATES state) { diff --git a/Src/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h b/Src/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h index eb3fccd2..11892437 100644 --- a/Src/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h +++ b/Src/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h @@ -70,7 +70,7 @@ class MediaPlayerStateMachine : public IModel { /** * After each state execution this SIGNAL is emmited and received by the MediaPlayer class. The parameter playerParameters contains all information that was changed during the execution of the current state. */ - void emitPlayerParameters(playerParameters* parameters); + void emitPlayerParameters(std::shared_ptr parameters); /** * When the state operation got finished, this SIGNAL is emmited and received by the MediaPlayer class. @@ -91,7 +91,7 @@ class MediaPlayerStateMachine : public IModel { QMap m_States; std::shared_ptr m_ImageStream; - playerParameters* m_PlayerParameters; + playerParameters m_PlayerParameters; std::shared_ptr m_stream; Config *_cfg; }; diff --git a/Src/View/CoreParameterView.cpp b/Src/View/CoreParameterView.cpp index 0dcb72e3..ea63afa2 100644 --- a/Src/View/CoreParameterView.cpp +++ b/Src/View/CoreParameterView.cpp @@ -539,7 +539,7 @@ void CoreParameterView::on_pushButton_addTraj_clicked(){ emitAddTrack(); } -void CoreParameterView::rcvPlayerParameters(playerParameters* parameters) { +void CoreParameterView::rcvPlayerParameters(std::shared_ptr parameters) { QFileInfo f(parameters->m_CurrentFilename); _currentFile = f.baseName(); ui->label_ExpSrcCnt->setText(_currentFile); diff --git a/Src/View/CoreParameterView.h b/Src/View/CoreParameterView.h index bbef97b6..9ad399cd 100644 --- a/Src/View/CoreParameterView.h +++ b/Src/View/CoreParameterView.h @@ -105,7 +105,7 @@ class CoreParameterView : public IViewWidget void on_pushButton_resetData_clicked(); void on_pushButton_addTraj_clicked(); public slots: - void rcvPlayerParameters(playerParameters* parameters); + void rcvPlayerParameters(std::shared_ptr parameters); public: diff --git a/Src/main.cpp b/Src/main.cpp index bac5d51d..cacb25c6 100644 --- a/Src/main.cpp +++ b/Src/main.cpp @@ -77,8 +77,9 @@ int main(int argc, char* argv[]) { qRegisterMetaType>("std::vector"); qRegisterMetaType("BiotrackerTypes::AreaType"); qRegisterMetaType>("QVector"); - qRegisterMetaType("playerParameters*"); - qRegisterMetaType("CameraConfiguration"); + qRegisterMetaType>( + "std::shared_ptr"); + qRegisterMetaType("CameraConfiguration"); qRegisterMetaTypeStreamOperators>("QList"); qInstallMessageHandler(myMessageOutput); From 290a9acac820974e9e936d3b527c6d5279275c1e Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Fri, 29 Jul 2022 16:57:11 +0200 Subject: [PATCH 168/171] Merge PluginLoader back into biotracker --- CMakeLists.txt | 1 - Src/CMakeLists.txt | 2 +- Src/PluginLoader.cpp | 339 +++++++++++++++++++++++++++++++++++++++++++ Src/PluginLoader.h | 109 ++++++++++++++ 4 files changed, 449 insertions(+), 2 deletions(-) create mode 100644 Src/PluginLoader.cpp create mode 100644 Src/PluginLoader.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 50dbe936..61773d02 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,7 +18,6 @@ set(HMNVLibDir "Not Found" CACHE FILEPATH "") if( CMAKE_SOURCE_DIR STREQUAL PROJECT_SOURCE_DIR ) find_package(biotracker-utility REQUIRED) - find_package(robofish-behavior_loader REQUIRED) endif() add_subdirectory(Src) diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt index 42c290de..1aecb453 100644 --- a/Src/CMakeLists.txt +++ b/Src/CMakeLists.txt @@ -17,7 +17,6 @@ target_compile_definitions(${target} PRIVATE SOURCE_VERSION="${SOURCE_VERSION}") target_include_directories(${target} PUBLIC ${CMAKE_CURRENT_LIST_DIR}) target_link_libraries (${target} biotracker-utility) -target_link_libraries (${target} robofish-behavior_loader) find_package(Qt5 REQUIRED COMPONENTS Core Gui Xml Network Widgets Multimedia MultimediaWidgets OpenGL) target_link_libraries (${target} Qt5::Core Qt5::Gui Qt5::Xml Qt5::Network Qt5::Widgets Qt5::Multimedia Qt5::MultimediaWidgets Qt5::OpenGL) @@ -167,6 +166,7 @@ target_sources(${target} PRIVATE "BioTracker3App.cpp" "GuiContext.cpp" + "PluginLoader.cpp" "main.cpp" "guiresources.qrc" "Controller/IControllerCfg.cpp" diff --git a/Src/PluginLoader.cpp b/Src/PluginLoader.cpp new file mode 100644 index 00000000..db3c4684 --- /dev/null +++ b/Src/PluginLoader.cpp @@ -0,0 +1,339 @@ +#include "PluginLoader.h" +#include +#include +#include +#include + +#ifdef _WIN32 + #include + #include + #include + #include + #include + #include + #define MAX_KEY_LENGTH 255 + #define MAX_VALUE_NAME 16383 + +std::vector QueryKey(HKEY hKey, std::string path) +{ + // See + // https://docs.microsoft.com/en-us/windows/desktop/sysinfo/enumerating-registry-subkeys + std::vector list; + TCHAR achClass[MAX_PATH] = TEXT(""); // buffer for class name + DWORD cchClassName = MAX_PATH; // size of class string + DWORD cSubKeys = 0; // number of subkeys + DWORD cbMaxSubKey; // longest subkey size + DWORD cchMaxClass; // longest class string + DWORD cValues; // number of values for key + DWORD cchMaxValue; // longest value name + DWORD cbMaxValueData; // longest value data + DWORD cbSecurityDescriptor; // size of security descriptor + FILETIME ftLastWriteTime; // last write time + + DWORD i, retCode; + + TCHAR achValue[MAX_VALUE_NAME]; + DWORD cchValue = MAX_VALUE_NAME; + + // Get the class name and the value count. + retCode = RegQueryInfoKey(hKey, // key handle + achClass, // buffer for class name + &cchClassName, // size of class string + NULL, // reserved + &cSubKeys, // number of subkeys + &cbMaxSubKey, // longest subkey size + &cchMaxClass, // longest class string + &cValues, // number of values for this key + &cchMaxValue, // longest value name + &cbMaxValueData, // longest value data + &cbSecurityDescriptor, // security descriptor + &ftLastWriteTime); // last write time + + // Enumerate the key values. + if (cValues) { + // printf( "\nNumber of values: %d\n", cValues); + + for (i = 0, retCode = ERROR_SUCCESS; i < cValues; i++) { + cchValue = MAX_VALUE_NAME; + achValue[0] = '\0'; + retCode = + RegEnumValue(hKey, i, achValue, &cchValue, NULL, NULL, NULL, NULL); + + if (retCode == ERROR_SUCCESS) { + CRegKey regKey; + CHAR szBuffer[512]; + ULONG dwBufferSize = sizeof(szBuffer); + + if (auto error_code = regKey.Open(HKEY_LOCAL_MACHINE, + path.c_str(), + KEY_READ); + error_code != ERROR_SUCCESS) { + qWarning() << "Error opening windows registry path " + << path.c_str() << ": " << error_code; + regKey.Close(); + continue; + } + if (auto error_code = regKey.QueryStringValue(achValue, + szBuffer, + &dwBufferSize); + error_code != ERROR_SUCCESS) { + qWarning() << "Error opening windows registry value " + << achValue << ": " << error_code; + regKey.Close(); + continue; + } + + std::string fp = szBuffer; + std::replace(fp.begin(), fp.end(), '\\', '/'); + list.push_back(fp); + } + } + } + return list; +} +#endif + +std::vector PluginLoader::queryRegistryBehaviors(std::string path) +{ + std::vector list; + +#ifdef _WIN32 + HKEY hTestKey; + + if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, + TEXT(path.c_str()), + 0, + KEY_READ, + &hTestKey) == ERROR_SUCCESS) { + list = QueryKey(hTestKey, path); + } + + RegCloseKey(hTestKey); +#endif + + return list; +} + +#ifdef _WIN32 +const char* WinGetEnv(const char* name) +{ + const DWORD buffSize = 65535; + static char buffer[buffSize]; + if (GetEnvironmentVariableA(name, buffer, buffSize)) { + return buffer; + } else { + return 0; + } +} +bool WinSetEnv(const char* name, const char* toWhat) +{ + return SetEnvironmentVariableA(name, toWhat); +} +#endif + +bool is_shared_library(std::filesystem::path const& p) +{ + auto extension = p.extension(); + return extension == ".so" || extension == ".dylib" || extension == ".dll"; +} + +const char* PluginLoader::addDllPath(std::string f) +{ +// Get the directory of the DLL/*.so and add it to the PATH env variable. +// This way dependencies can be shipped in the same directory +#ifdef _WIN32 + QFileInfo finf(f.c_str()); + // rather than the buggy _getenv: + // https://docs.microsoft.com/de-de/windows/desktop/api/winbase/nf-winbase-getenvironmentvariable + auto old_path = WinGetEnv("PATH"); + auto path = std::ostringstream(); + if (old_path) { + path << old_path << ";" << finf.absolutePath().toStdString().c_str(); + WinSetEnv("PATH", path.str().c_str()); + } else { + qWarning() << "Failed to get and modify PATH enviromental variable."; + } + return old_path; +#endif + + return ""; +} + +void PluginLoader::delDllPath(const char* oldPath) +{ +// reset path. We don't want some weird cross-effects +#ifdef _WIN32 + if (oldPath) { + WinSetEnv("PATH", oldPath); + } +#endif +} + +bool endsWith(std::string value, std::string ending) +{ + std::transform(value.begin(), value.end(), value.begin(), ::tolower); + std::transform(ending.begin(), ending.end(), ending.begin(), ::tolower); + if (ending.size() > value.size()) + return false; + return std::equal(ending.rbegin(), ending.rend(), value.rbegin()); +} + +bool validSuffix(std::string f, std::string suffix) +{ + return (endsWith(f, suffix + ".dll") || endsWith(f, suffix + ".so")); +} + +std::vector PluginLoader::searchDirectoriesForPlugins( + std::vector list, + std::string suffix) +{ + // Search directories + std::vector filesFromFolders; + + for (auto f : list) { + auto path = std::filesystem::path(f); + if (path.empty()) { + continue; + } + if (std::filesystem::is_directory(path)) { + try { + for (auto& e : std::filesystem::directory_iterator(path)) { + auto p = e.path(); + if (is_shared_library(p) && + p.replace_extension().extension() == suffix) { + filesFromFolders.push_back(e.path().string()); + } + } + } catch (std::filesystem::filesystem_error const& e) { + qWarning() << e.what(); + } + } else if (is_shared_library(path)) { + filesFromFolders.push_back(f); + } else { + qWarning() << "Neither a directory, nor a shared library:" + << f.data(); + } + } + + return filesFromFolders; +} + +PluginLoader::PluginLoader(QObject* parent) +{ + m_MetaData = nullptr; + m_PluginLoader = new QPluginLoader(this); + m_PluginListModel = new QStringListModel(); +} +PluginLoader::~PluginLoader() +{ + delete m_PluginLoader; + delete m_PluginListModel; +} + +bool PluginLoader::loadPluginFromFilename(QString const& filename) +{ + bool retval = false; + if (m_PluginLoader->isLoaded()) { + m_PluginLoader->unload(); + } + + bool isLib = QLibrary::isLibrary(filename); + + if (isLib) { + + auto oldPath = PluginLoader::addDllPath(filename.toStdString()); + m_PluginLoader->setFileName(filename); + + readMetaDataFromPlugin(); + + retval = m_PluginLoader->load(); + QString s = m_PluginLoader->errorString(); + std::string ss = s.toStdString(); + addPluginnameToLists(getCurrentPluginName(), filename); + + if (!m_PluginLoader->isLoaded()) { + qWarning() << ss.c_str(); + retval = false; + } + PluginLoader::delDllPath(oldPath); + } else { + retval = false; + } + + return retval; +} + +void PluginLoader::addPluginnameToLists(QString mstring, QString filename) +{ + if (!m_PluginList.contains(mstring)) + m_PluginList.append(mstring); + m_PluginListModel->setStringList(m_PluginList); + m_PluginMap.insert(std::pair(mstring, filename)); +} + +bool PluginLoader::loadPluginFromName(QString name) +{ + QString filename = m_PluginMap.find(name)->second; + return loadPluginFromFilename(filename); +} + +int PluginLoader::addToPluginList(QString filename, QString suffix) +{ + if (!validSuffix(filename.toStdString(), suffix.toStdString())) + return 1; + + bool isLib = QLibrary::isLibrary(filename); + + if (isLib) { + + QPluginLoader loader; + loader.setFileName(filename); + QJsonValue pluginMeda(loader.metaData().value("MetaData")); + QJsonObject metaObj = pluginMeda.toObject(); + QString mstring = metaObj.value("name").toString(); + addPluginnameToLists(mstring, filename); + } else { + return 2; + qWarning() << "Error reading plugin: " << filename; + } + return 0; +} + +QStringListModel* PluginLoader::getPluginList() +{ + return m_PluginListModel; +} + +QObject* PluginLoader::getPluginInstance() +{ + return (m_PluginLoader->instance()); +} + +QJsonObject PluginLoader::getPluginMetaData() const +{ + if (m_MetaData == nullptr) + qFatal("(getPluginMetaData) No plugin loaded"); + return *m_MetaData; +} + +void PluginLoader::readMetaDataFromPlugin() +{ + m_MetaData = std::make_shared( + m_PluginLoader->metaData().value("MetaData").toObject()); +} + +bool PluginLoader::getIsPluginLoaded() +{ + return m_isPluginLoaded; +} + +QString PluginLoader::getCurrentPluginName() +{ + if (m_MetaData == nullptr) + return "Error name"; + return m_MetaData->value("name").toString(); +} +const std::map& PluginLoader::getPluginMap() const +{ + return m_PluginMap; +} diff --git a/Src/PluginLoader.h b/Src/PluginLoader.h new file mode 100644 index 00000000..747c9c2c --- /dev/null +++ b/Src/PluginLoader.h @@ -0,0 +1,109 @@ + +#ifndef PLUGINLOADER_H +#define PLUGINLOADER_H + +#include "QPluginLoader" +#include "QStringListModel" +#include "QPointer" +#include +#include + +/** + * \class PluginLoader + * This class loads Qt-Plugins, the related metadata and files the plugin + * depends on. \author Hauke Mönck, Gregor Barth + */ + +class PluginLoader : QObject +{ + Q_OBJECT +public: + explicit PluginLoader(QObject* parent = 0); + + ~PluginLoader(); + + /** + * Loads a file as a QT plugin and reads it's name from the metadata. + * It will then be added to the stringlist and is selectable via + * "loadPluginFromName". This function does not actually set the plugin + * instance. + */ + int addToPluginList(QString filename, QString suffix); + + /** + * Returns a QStrinListModel with the names of all seen Plugins. + */ + QStringListModel* getPluginList(); + + /** + * Loads a BioTracker Plugin from a file path. It returns true if the Plugin + * could be loaded, otherwise false. The loaded plugin acts as singleton! + */ + bool loadPluginFromFilename(QString const& filename); + + /** + * Loads a plugin from it's name (given in the metadata) instead of the + * filename. Only works if it is already known to the pluginloader, i.e. was + * loaded manually or automatically before or or has been added to the + * pluginlist via "addToPluginList" + */ + bool loadPluginFromName(QString name); + + QJsonObject getPluginMetaData() const; + + static std::vector queryRegistryBehaviors(std::string path); + + static std::vector searchDirectoriesForPlugins( + std::vector list, + std::string suffix); + + // return oldPath + static const char* addDllPath(std::string file); + + static void delDllPath(const char* oldPath); + + // Is a plugin loaded or not? + bool getIsPluginLoaded(); + + // Gets the name of the currently loaded plugin + QString getCurrentPluginName(); + + /** + * Returns the Instance of the BioTracker Plugin. + */ + QObject* getPluginInstance(); + + /** + * Returns a map containing the mapping "plugin name -> filename" + */ + std::map const& getPluginMap() const; + +private: + void addPluginnameToLists(QString name, QString filename); + + // a map containing the mapping "plugin name -> filename" + std::map m_PluginMap; + + /** + * Gets the metadata from the currently loaded plugin. + * Currently this is nothing but the advertised name of the plugin + */ + void readMetaDataFromPlugin(); + + // The QT object to actually load the plugins + QPluginLoader* m_PluginLoader; + + std::shared_ptr m_MetaData; + + // nomen est omen + bool m_isPluginLoaded; + + // List of all available plugins + QStringList m_PluginList; + + // Entire ListModel of the metadata (actually containing all metadata, not + // only name) + QStringListModel* m_PluginListModel; +}; + +#endif // PLUGINLOADER_H From a7c2f29fd85209d1017c161b20523ab95be6bd19 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Wed, 3 Aug 2022 12:11:41 +0200 Subject: [PATCH 169/171] Add and enforce formating style --- .clang-format | 104 + .editorconfig | 19 + Src/BioTracker3App.cpp | 8 +- Src/BioTracker3App.h | 12 +- Src/Controller/ControllerAnnotations.cpp | 542 ++-- Src/Controller/ControllerAnnotations.h | 90 +- Src/Controller/ControllerAreaDescriptor.cpp | 439 +-- Src/Controller/ControllerAreaDescriptor.h | 64 +- Src/Controller/ControllerCommands.cpp | 154 +- Src/Controller/ControllerCommands.h | 129 +- Src/Controller/ControllerCoreParameter.cpp | 384 ++- Src/Controller/ControllerCoreParameter.h | 43 +- Src/Controller/ControllerDataExporter.cpp | 200 +- Src/Controller/ControllerDataExporter.h | 64 +- Src/Controller/ControllerGraphicScene.cpp | 35 +- Src/Controller/ControllerGraphicScene.h | 59 +- Src/Controller/ControllerMainWindow.cpp | 405 ++- Src/Controller/ControllerMainWindow.h | 242 +- Src/Controller/ControllerNotifications.cpp | 51 +- Src/Controller/ControllerNotifications.h | 46 +- Src/Controller/ControllerPlayer.cpp | 243 +- Src/Controller/ControllerPlayer.h | 246 +- Src/Controller/ControllerPlugin.cpp | 973 ++++--- Src/Controller/ControllerPlugin.h | 335 +-- Src/Controller/ControllerTextureObject.cpp | 62 +- Src/Controller/ControllerTextureObject.h | 61 +- .../ControllerTrackedComponentCore.cpp | 284 +- .../ControllerTrackedComponentCore.h | 164 +- Src/Controller/IControllerCfg.cpp | 15 +- Src/Controller/IControllerCfg.h | 26 +- Src/Controller/null_Controller.cpp | 5 - Src/Controller/null_Controller.h | 20 +- Src/GuiContext.cpp | 131 +- Src/GuiContext.h | 17 +- Src/IStates/IPlayerState.cpp | 29 +- Src/IStates/IPlayerState.h | 171 +- Src/Model/Annotations.cpp | 734 ++--- Src/Model/Annotations.h | 497 ++-- Src/Model/AreaDescriptor/AreaInfo.cpp | 163 +- Src/Model/AreaDescriptor/AreaInfo.h | 74 +- Src/Model/AreaDescriptor/AreaInfoElement.cpp | 115 +- Src/Model/AreaDescriptor/AreaInfoElement.h | 113 +- Src/Model/AreaDescriptor/AreaMemory.cpp | 28 +- Src/Model/AreaDescriptor/AreaMemory.h | 15 +- Src/Model/AreaDescriptor/Rectification.cpp | 440 +-- Src/Model/AreaDescriptor/Rectification.h | 250 +- Src/Model/BioTracker3ProxyMat.cpp | 1 - Src/Model/BioTracker3ProxyMat.h | 35 +- Src/Model/CoreParameter.cpp | 15 +- Src/Model/CoreParameter.h | 100 +- Src/Model/DataExporters/DataExporterCSV.cpp | 190 +- Src/Model/DataExporters/DataExporterCSV.h | 79 +- .../DataExporters/DataExporterGeneric.cpp | 31 +- Src/Model/DataExporters/DataExporterGeneric.h | 22 +- Src/Model/DataExporters/DataExporterJson.cpp | 145 +- Src/Model/DataExporters/DataExporterJson.h | 45 +- .../DataExporters/DataExporterSerialize.cpp | 145 +- .../DataExporters/DataExporterSerialize.h | 45 +- Src/Model/ImageStream.cpp | 1353 ++++----- Src/Model/ImageStream.h | 354 +-- Src/Model/MediaPlayer.cpp | 418 +-- Src/Model/MediaPlayer.h | 215 +- .../MediaPlayerStateMachine.cpp | 250 +- .../MediaPlayerStateMachine.h | 67 +- .../PlayerParameters.h | 34 +- .../PlayerStates/PStateGoToFrame.cpp | 26 +- .../PlayerStates/PStateGoToFrame.h | 29 +- .../PlayerStates/PStateInitial.cpp | 15 +- .../PlayerStates/PStateInitial.h | 23 +- .../PlayerStates/PStateInitialStream.cpp | 16 +- .../PlayerStates/PStateInitialStream.h | 24 +- .../PlayerStates/PStatePause.cpp | 18 +- .../PlayerStates/PStatePause.h | 24 +- .../PlayerStates/PStatePlay.cpp | 55 +- .../PlayerStates/PStatePlay.h | 31 +- .../PlayerStates/PStateStepBack.cpp | 19 +- .../PlayerStates/PStateStepBack.h | 23 +- .../PlayerStates/PStateStepForw.cpp | 19 +- .../PlayerStates/PStateStepForw.h | 23 +- .../PlayerStates/PStateWait.cpp | 17 +- .../PlayerStates/PStateWait.h | 21 +- Src/Model/TextureObject.cpp | 29 +- Src/Model/TextureObject.h | 37 +- Src/Model/UndoCommands/TrackCommands.cpp | 142 +- Src/Model/UndoCommands/TrackCommands.h | 197 +- Src/Model/null_Model.cpp | 1 - Src/Model/null_Model.h | 15 +- Src/PluginLoader.cpp | 444 +-- Src/PluginLoader.h | 129 +- Src/View/AnnotationsView.cpp | 90 +- Src/View/AnnotationsView.h | 40 +- Src/View/AreaDesciptor/AreaDescriptor.cpp | 5 +- Src/View/AreaDesciptor/AreaDescriptor.h | 26 +- Src/View/AreaDesciptor/EllipseDescriptor.cpp | 168 +- Src/View/AreaDesciptor/EllipseDescriptor.h | 83 +- Src/View/AreaDesciptor/RectDescriptor.cpp | 192 +- Src/View/AreaDesciptor/RectDescriptor.h | 71 +- Src/View/CameraDevice.cpp | 93 +- Src/View/CameraDevice.h | 23 +- Src/View/ComponentShape.cpp | 2406 +++++++++-------- Src/View/ComponentShape.h | 415 +-- Src/View/CoreParameterView.cpp | 754 +++--- Src/View/CoreParameterView.h | 342 +-- Src/View/GLVideoView.cpp | 38 +- Src/View/GLVideoView.h | 9 +- Src/View/GraphicsScene.cpp | 8 +- Src/View/GraphicsScene.h | 4 +- Src/View/GraphicsView.cpp | 199 +- Src/View/GraphicsView.h | 55 +- Src/View/MainWindow.cpp | 1748 ++++++------ Src/View/MainWindow.h | 245 +- Src/View/NotificationLogBrowser.cpp | 71 +- Src/View/NotificationLogBrowser.h | 31 +- Src/View/SettingsWindow.cpp | 94 +- Src/View/SettingsWindow.h | 20 +- Src/View/TextureObjectView.cpp | 49 +- Src/View/TextureObjectView.h | 8 +- Src/View/TrackedComponentView.cpp | 1228 +++++---- Src/View/TrackedComponentView.h | 261 +- Src/View/TrackedImageView.cpp | 37 +- Src/View/TrackedImageView.h | 2 +- Src/View/Utility/RotationHandle.cpp | 112 +- Src/View/Utility/RotationHandle.h | 47 +- Src/View/Utility/SwitchButton.cpp | 188 +- Src/View/Utility/SwitchButton.h | 95 +- Src/View/Utility/Tracer.cpp | 80 +- Src/View/Utility/Tracer.h | 74 +- Src/View/VideoControllWidget.cpp | 496 ++-- Src/View/VideoControllWidget.h | 65 +- Src/main.cpp | 73 +- Src/util/CLIcommands.h | 118 +- Src/util/Config.cpp | 168 +- Src/util/Config.h | 51 +- Src/util/Exceptions.h | 65 +- Src/util/Messages.h | 69 +- Src/util/PanZoomState.h | 50 +- Src/util/ParamNames.h | 159 +- Src/util/ScreenHelper.h | 421 +-- Src/util/VideoCoder.cpp | 423 +-- Src/util/VideoCoder.h | 181 +- Src/util/camera/base.h | 51 +- Src/util/camera/pylon.cpp | 54 +- Src/util/camera/pylon.h | 8 +- Src/util/stdext.h | 75 +- Src/util/types.h | 41 +- 145 files changed, 14038 insertions(+), 11163 deletions(-) create mode 100644 .clang-format create mode 100644 .editorconfig diff --git a/.clang-format b/.clang-format new file mode 100644 index 00000000..b3b525e7 --- /dev/null +++ b/.clang-format @@ -0,0 +1,104 @@ +--- +Language: Cpp +Standard: Cpp11 +UseTab: Never +TabWidth: 4 +IndentWidth: 4 +AccessModifierOffset: -4 +ContinuationIndentWidth: 4 +ColumnLimit: 79 +ConstructorInitializerIndentWidth: 0 +BinPackArguments: false +BinPackParameters: false +AlignAfterOpenBracket: Align +AlignConsecutiveAssignments: true +AlignConsecutiveDeclarations: true +AlignOperands: true +AlignEscapedNewlines: Right +AlignTrailingComments: true +AllowAllArgumentsOnNextLine: false +AllowAllConstructorInitializersOnNextLine: false +ConstructorInitializerAllOnOneLineOrOnePerLine: false +AllowAllParametersOfDeclarationOnNextLine: false +AllowShortBlocksOnASingleLine: false +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: None +AllowShortIfStatementsOnASingleLine: Never +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: true +AlwaysBreakTemplateDeclarations: Yes +BreakBeforeBraces: Custom +BraceWrapping: + AfterClass: true + AfterControlStatement: false + AfterEnum: true + AfterFunction: true + AfterNamespace: true + AfterObjCDeclaration: true + AfterStruct: true + AfterUnion: true + AfterExternBlock: true + BeforeCatch: false + BeforeElse: false + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: true + SplitEmptyNamespace: true +BreakBeforeBinaryOperators: None +BreakBeforeInheritanceComma: false +BreakInheritanceList: BeforeColon +BreakBeforeTernaryOperators: true +BreakConstructorInitializers: BeforeComma +BreakAfterJavaFieldAnnotations: false +BreakStringLiterals: true +CompactNamespaces: false +Cpp11BracedListStyle: true +DerivePointerAlignment: false +DisableFormat: false +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: false +IndentCaseLabels: false +IndentPPDirectives: BeforeHash +IndentWrappedFunctionNames: true +KeepEmptyLinesAtTheStartOfBlocks: true +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: All +PointerAlignment: Left +ReflowComments: true +SortIncludes: false +SortUsingDeclarations: true +SpaceAfterCStyleCast: true +SpaceAfterTemplateKeyword: false +SpaceBeforeAssignmentOperators: true +SpaceBeforeCpp11BracedList: false +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeParens: ControlStatements +SpaceBeforeRangeBasedForLoopColon: true +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: false +SpacesInContainerLiterals: false +SpacesInCStyleCastParentheses: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +PenaltyBreakAssignment: 100 +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakString: 1000 +PenaltyBreakTemplateDeclaration: 10 +PenaltyExcessCharacter: 1000000 +PenaltyReturnTypeOnItsOwnLine: 1000 +CommentPragmas: '' +MacroBlockBegin: '' +MacroBlockEnd: '' +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +StatementMacros: + - Q_UNUSED + - QT_REQUIRE_VERSION +... diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..7b80d1c5 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,19 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true + +[*.{c,h,cc,hh,cpp,hpp,cxx,hxx}] +indent_style = space +indent_size = 4 + +[*.py] +indent_style = space +indent_size = 4 + +[*.yml] +indent_style = space +indent_size = 2 diff --git a/Src/BioTracker3App.cpp b/Src/BioTracker3App.cpp index 852751be..57f18f62 100644 --- a/Src/BioTracker3App.cpp +++ b/Src/BioTracker3App.cpp @@ -1,8 +1,8 @@ #include "BioTracker3App.h" -BioTracker3App::BioTracker3App(QObject *parent) : QObject(parent) +BioTracker3App::BioTracker3App(QObject* parent) +: QObject(parent) { - } void BioTracker3App::runBioTracker() @@ -10,12 +10,12 @@ void BioTracker3App::runBioTracker() m_BioTrackerContext->createApplication(); } -void BioTracker3App::setBioTrackerContext(IBioTrackerContext *context) +void BioTracker3App::setBioTrackerContext(IBioTrackerContext* context) { m_BioTrackerContext = context; } -IBioTrackerContext *BioTracker3App::getBioTrackerContext() +IBioTrackerContext* BioTracker3App::getBioTrackerContext() { return m_BioTrackerContext; } diff --git a/Src/BioTracker3App.h b/Src/BioTracker3App.h index 1ac86a27..c833500d 100644 --- a/Src/BioTracker3App.h +++ b/Src/BioTracker3App.h @@ -6,24 +6,22 @@ #include "Interfaces/IBioTrackerContext.h" #include "QPointer" - class BioTracker3App : public QObject { Q_OBJECT public: - explicit BioTracker3App(QObject *parent = 0); + explicit BioTracker3App(QObject* parent = 0); - void runBioTracker(); - void setBioTrackerContext(IBioTrackerContext *context); - IBioTrackerContext *getBioTrackerContext(); + void runBioTracker(); + void setBioTrackerContext(IBioTrackerContext* context); + IBioTrackerContext* getBioTrackerContext(); Q_SIGNALS: public Q_SLOTS: private: - QPointer< IBioTrackerContext > m_BioTrackerContext; - + QPointer m_BioTrackerContext; }; #endif // BIOTRACKER3APP_H diff --git a/Src/Controller/ControllerAnnotations.cpp b/Src/Controller/ControllerAnnotations.cpp index d62189cb..4e06efb9 100644 --- a/Src/Controller/ControllerAnnotations.cpp +++ b/Src/Controller/ControllerAnnotations.cpp @@ -16,305 +16,347 @@ ControllerAnnotations::~ControllerAnnotations() { - delete getModel(); - delete getView(); + delete getModel(); + delete getView(); } -void ControllerAnnotations::cleanup() { - // Delete the model to trigger serialization - delete getModel(); +void ControllerAnnotations::cleanup() +{ + // Delete the model to trigger serialization + delete getModel(); } void ControllerAnnotations::reset(std::string filepath) { - // Replace the model with a fresh one. - delete getModel(); - createModel(filepath); - connectModelToController(); + // Replace the model with a fresh one. + delete getModel(); + createModel(filepath); + connectModelToController(); } -ControllerAnnotations::ControllerAnnotations(QObject* parent, IBioTrackerContext* context, ENUMS::CONTROLLERTYPE ctr) : - IControllerCfg(parent, context, ctr) { +ControllerAnnotations::ControllerAnnotations(QObject* parent, + IBioTrackerContext* context, + ENUMS::CONTROLLERTYPE ctr) +: IControllerCfg(parent, context, ctr) +{ } -void ControllerAnnotations::connectControllerToController() { - { - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::GRAPHICSVIEW); - auto viewController = qobject_cast(ctr); - auto view = dynamic_cast (viewController->getView()); - view->addGraphicsItem(static_cast(getView())); - - QObject::connect(view, &GraphicsView::onMousePressEvent, this, &ControllerAnnotations::mousePressEvent, Qt::DirectConnection); - QObject::connect(view, &GraphicsView::onMouseReleaseEvent, this, &ControllerAnnotations::mouseReleaseEvent, Qt::DirectConnection); - QObject::connect(view, &GraphicsView::onMouseMoveEvent, this, &ControllerAnnotations::mouseMoveEvent, Qt::DirectConnection); - //QObject::connect(view, &GraphicsView::onKeyReleaseEvent, this, &ControllerAnnotations::keyReleaseEvent, Qt::DirectConnection); - QObject::connect(view, &GraphicsView::onKeyPressEvent, this, &ControllerAnnotations::keyPressEvent, Qt::DirectConnection); - - - QWidget *viewport = view->viewport(); - QObject::connect(this, SIGNAL(onRepaintRequired()), viewport, SLOT(repaint())); - } - - { - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::PLAYER); - auto mediaPlayerController = dynamic_cast (ctr); - assert(mediaPlayerController); - MediaPlayer *player = dynamic_cast (mediaPlayerController->getModel()); - assert(player); - QObject::connect(player, &MediaPlayer::fwdPlayerParameters, this, &ControllerAnnotations::setPlayerParameters); - } +void ControllerAnnotations::connectControllerToController() +{ + { + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::GRAPHICSVIEW); + auto viewController = qobject_cast(ctr); + auto view = dynamic_cast(viewController->getView()); + view->addGraphicsItem(static_cast(getView())); + + QObject::connect(view, + &GraphicsView::onMousePressEvent, + this, + &ControllerAnnotations::mousePressEvent, + Qt::DirectConnection); + QObject::connect(view, + &GraphicsView::onMouseReleaseEvent, + this, + &ControllerAnnotations::mouseReleaseEvent, + Qt::DirectConnection); + QObject::connect(view, + &GraphicsView::onMouseMoveEvent, + this, + &ControllerAnnotations::mouseMoveEvent, + Qt::DirectConnection); + // QObject::connect(view, &GraphicsView::onKeyReleaseEvent, this, + // &ControllerAnnotations::keyReleaseEvent, Qt::DirectConnection); + QObject::connect(view, + &GraphicsView::onKeyPressEvent, + this, + &ControllerAnnotations::keyPressEvent, + Qt::DirectConnection); + + QWidget* viewport = view->viewport(); + QObject::connect(this, + SIGNAL(onRepaintRequired()), + viewport, + SLOT(repaint())); + } + + { + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::PLAYER); + auto mediaPlayerController = dynamic_cast(ctr); + assert(mediaPlayerController); + MediaPlayer* player = dynamic_cast( + mediaPlayerController->getModel()); + assert(player); + QObject::connect(player, + &MediaPlayer::fwdPlayerParameters, + this, + &ControllerAnnotations::setPlayerParameters); + } } -void ControllerAnnotations::createModel(std::string filepath) { - m_Model = new Annotations(filepath); +void ControllerAnnotations::createModel(std::string filepath) +{ + m_Model = new Annotations(filepath); } -void ControllerAnnotations::createView() { - assert(m_Model); - m_View = new AnnotationsView(this, m_Model); +void ControllerAnnotations::createView() +{ + assert(m_Model); + m_View = new AnnotationsView(this, m_Model); } -void ControllerAnnotations::connectModelToController() { - auto model = static_cast(getModel()); - auto view = static_cast(getView()); - view->setNewModel(model); +void ControllerAnnotations::connectModelToController() +{ + auto model = static_cast(getModel()); + auto view = static_cast(getView()); + view->setNewModel(model); } void ControllerAnnotations::updateView() { - auto view = static_cast(getView()); - view->prepareUpdate(); - emit(onRepaintRequired()); + auto view = static_cast(getView()); + view->prepareUpdate(); + emit(onRepaintRequired()); } -void ControllerAnnotations::keyPressEvent(QKeyEvent *event) +void ControllerAnnotations::keyPressEvent(QKeyEvent* event) { - auto model = static_cast(getModel()); - actionQueued = ActionQueued::None; - bool handled = true; - if (event->modifiers()&Qt::AltModifier) { - switch (event->key()) - { - case Qt::Key::Key_A: - actionQueued = ActionQueued::CreateArrow; - break; - case Qt::Key::Key_L: - actionQueued = ActionQueued::CreateLabel; - break; - case Qt::Key::Key_R: - actionQueued = ActionQueued::CreateRect; - break; - case Qt::Key::Key_E: - actionQueued = ActionQueued::CreateEllipse; - break; - case Qt::Key::Key_H: - model->toggleHideAnnotations(); - handled = true; - break; - case Qt::Key::Key_Delete: // Fallthrough. - case Qt::Key::Key_Backspace: - // Remove existing selected annotation at current frame. - if (model->removeSelection()) - { - updateView(); - } - else - handled = false; - break; - case Qt::Key::Key_Q: - if (!model->updateSelectionStartFrame()) - handled = false; - break; - case Qt::Key::Key_W: - if (!model->updateSelectionEndFrame()) - handled = false; - break; - default: - handled = false; - break; - } - } - - - if (handled) - { - updateView(); - event->accept(); - } + auto model = static_cast(getModel()); + actionQueued = ActionQueued::None; + bool handled = true; + if (event->modifiers() & Qt::AltModifier) { + switch (event->key()) { + case Qt::Key::Key_A: + actionQueued = ActionQueued::CreateArrow; + break; + case Qt::Key::Key_L: + actionQueued = ActionQueued::CreateLabel; + break; + case Qt::Key::Key_R: + actionQueued = ActionQueued::CreateRect; + break; + case Qt::Key::Key_E: + actionQueued = ActionQueued::CreateEllipse; + break; + case Qt::Key::Key_H: + model->toggleHideAnnotations(); + handled = true; + break; + case Qt::Key::Key_Delete: // Fallthrough. + case Qt::Key::Key_Backspace: + // Remove existing selected annotation at current frame. + if (model->removeSelection()) { + updateView(); + } else + handled = false; + break; + case Qt::Key::Key_Q: + if (!model->updateSelectionStartFrame()) + handled = false; + break; + case Qt::Key::Key_W: + if (!model->updateSelectionEndFrame()) + handled = false; + break; + default: + handled = false; + break; + } + } + + if (handled) { + updateView(); + event->accept(); + } } -void ControllerAnnotations::mousePressEvent(QMouseEvent *event, const QPoint &pos) +void ControllerAnnotations::mousePressEvent(QMouseEvent* event, + const QPoint& pos) { - // left-click: add annotation in pos or try start dragging annotation - if (event->button() == Qt::LeftButton) { - auto model = static_cast(getModel()); - bool handled = true; - - switch (actionQueued) - { - case ActionQueued::CreateArrow: - model->startArrow(pos, model->getCurrentFrame()); - break; - case ActionQueued::CreateLabel: - model->startLabel(pos, model->getCurrentFrame()); - break; - case ActionQueued::CreateRect: - model->startRect(pos, model->getCurrentFrame()); - break; - case ActionQueued::CreateEllipse: - model->startEllipse(pos, model->getCurrentFrame()); - break; - default: - if (model->tryStartDragging(pos)) { - updateView(); - } - else { - handled = false; - } - updateView(); - break; - } - if (handled) - event->accept(); - actionQueued = ActionQueued::None; - } - - // right-click: set text for annotation in pos - else if (event->button() == Qt::RightButton) { - auto model = static_cast(getModel()); - bool handled = true; - - if (model->trySetText(pos)) { - updateView(); + // left-click: add annotation in pos or try start dragging annotation + if (event->button() == Qt::LeftButton) { + auto model = static_cast(getModel()); + bool handled = true; + + switch (actionQueued) { + case ActionQueued::CreateArrow: + model->startArrow(pos, model->getCurrentFrame()); + break; + case ActionQueued::CreateLabel: + model->startLabel(pos, model->getCurrentFrame()); + break; + case ActionQueued::CreateRect: + model->startRect(pos, model->getCurrentFrame()); + break; + case ActionQueued::CreateEllipse: + model->startEllipse(pos, model->getCurrentFrame()); + break; + default: + if (model->tryStartDragging(pos)) { + updateView(); + } else { + handled = false; + } + updateView(); + break; + } + if (handled) + event->accept(); + actionQueued = ActionQueued::None; + } + + // right-click: set text for annotation in pos + else if (event->button() == Qt::RightButton) { + auto model = static_cast(getModel()); + bool handled = true; + + if (model->trySetText(pos)) { + updateView(); model->serialize(); - } - else { - handled = false; - } - if (handled) { - event->accept(); - } - - } - + } else { + handled = false; + } + if (handled) { + event->accept(); + } + } } -Annotations::TrackedPoint ControllerAnnotations::snapToTrajectory(const QPoint &originalPoint) +Annotations::TrackedPoint ControllerAnnotations::snapToTrajectory( + const QPoint& originalPoint) { - auto model = static_cast(getModel()); - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); - auto trackedComponentCoreController = qobject_cast(ctr); - auto trackedTrajectoryModel = dynamic_cast(trackedComponentCoreController->getModel()); - - if (trackedTrajectoryModel && QGuiApplication::queryKeyboardModifiers().testFlag(Qt::ControlModifier)) - { - auto minDistance = std::numeric_limits::infinity(); - QPoint closestPoint {0, 0}; - int closestTrackID { 0 }; - auto allChildren = trackedTrajectoryModel->getChildNodes(); - - for (const auto &childNode : allChildren) - { - // Top level nodes are likely trajectories. - const auto childTrajectory = dynamic_cast (childNode); - // Not a trajectory? Don't know how to handle. - if (childTrajectory == nullptr) - continue; - - for (size_t i = 0; i < childTrajectory->size(); ++i) - { - if (i != model->getCurrentFrame()) - continue; - const auto &childComponent = childTrajectory->getChild(static_cast(i)); - const auto point = dynamic_cast (childComponent); - if (point == nullptr) - continue; - float distance = std::sqrt(std::pow(point->getXpx() - originalPoint.x(), 2) + std::pow(point->getYpx() - originalPoint.y(), 2)); - if (distance < minDistance) - { - minDistance = distance; - closestPoint = QPoint(static_cast(point->getXpx()), static_cast(point->getYpx())); - closestTrackID = childTrajectory->getId(); - } - } - } - - if (minDistance < 100.0f) - { - return Annotations::TrackedPoint(closestPoint, closestTrackID); - } - } - return Annotations::TrackedPoint(originalPoint); + auto model = static_cast(getModel()); + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); + auto trackedComponentCoreController = + qobject_cast(ctr); + auto trackedTrajectoryModel = dynamic_cast( + trackedComponentCoreController->getModel()); + + if (trackedTrajectoryModel && + QGuiApplication::queryKeyboardModifiers().testFlag( + Qt::ControlModifier)) { + auto minDistance = std::numeric_limits::infinity(); + QPoint closestPoint{0, 0}; + int closestTrackID{0}; + auto allChildren = trackedTrajectoryModel->getChildNodes(); + + for (const auto& childNode : allChildren) { + // Top level nodes are likely trajectories. + const auto childTrajectory = + dynamic_cast(childNode); + // Not a trajectory? Don't know how to handle. + if (childTrajectory == nullptr) + continue; + + for (size_t i = 0; i < childTrajectory->size(); ++i) { + if (i != model->getCurrentFrame()) + continue; + const auto& childComponent = childTrajectory->getChild( + static_cast(i)); + const auto point = dynamic_cast( + childComponent); + if (point == nullptr) + continue; + float distance = std::sqrt( + std::pow(point->getXpx() - originalPoint.x(), 2) + + std::pow(point->getYpx() - originalPoint.y(), 2)); + if (distance < minDistance) { + minDistance = distance; + closestPoint = QPoint(static_cast(point->getXpx()), + static_cast(point->getYpx())); + closestTrackID = childTrajectory->getId(); + } + } + } + + if (minDistance < 100.0f) { + return Annotations::TrackedPoint(closestPoint, closestTrackID); + } + } + return Annotations::TrackedPoint(originalPoint); } -void ControllerAnnotations::mouseReleaseEvent(QMouseEvent*event, const QPoint &pos) +void ControllerAnnotations::mouseReleaseEvent(QMouseEvent* event, + const QPoint& pos) { - auto model = static_cast(getModel()); - const bool isAltModifierActive = QGuiApplication::queryKeyboardModifiers().testFlag(Qt::AltModifier); - - Annotations::TrackedPoint trackedPoint = snapToTrajectory(pos); - - if ((event->button() == Qt::LeftButton) && !isAltModifierActive && (model->endAnnotation(trackedPoint) || model->updateAnnotation(trackedPoint))) - { - updateView(); - event->accept(); - } + auto model = static_cast(getModel()); + const bool isAltModifierActive = + QGuiApplication::queryKeyboardModifiers().testFlag(Qt::AltModifier); + + Annotations::TrackedPoint trackedPoint = snapToTrajectory(pos); + + if ((event->button() == Qt::LeftButton) && !isAltModifierActive && + (model->endAnnotation(trackedPoint) || + model->updateAnnotation(trackedPoint))) { + updateView(); + event->accept(); + } } -void ControllerAnnotations::mouseMoveEvent(QMouseEvent*event, const QPoint &pos) +void ControllerAnnotations::mouseMoveEvent(QMouseEvent* event, + const QPoint& pos) { - auto model = static_cast(getModel()); - const bool isAltModifierActive = QGuiApplication::queryKeyboardModifiers().testFlag(Qt::AltModifier); + auto model = static_cast(getModel()); + const bool isAltModifierActive = + QGuiApplication::queryKeyboardModifiers().testFlag(Qt::AltModifier); - Annotations::TrackedPoint trackedPoint = snapToTrajectory(pos); + Annotations::TrackedPoint trackedPoint = snapToTrajectory(pos); - if ((event->buttons() & Qt::LeftButton) && !isAltModifierActive && model->updateAnnotation(trackedPoint)) - { - updateView(); - event->accept(); - } + if ((event->buttons() & Qt::LeftButton) && !isAltModifierActive && + model->updateAnnotation(trackedPoint)) { + updateView(); + event->accept(); + } } void ControllerAnnotations::setPlayerParameters( - std::shared_ptr parameters) { - auto model = static_cast(getModel()); - model->setCurrentFrame(parameters->m_CurrentFrameNumber); - - IController *ctr = m_BioTrackerContext->requestController( - ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); - auto trackedComponentCoreController = - qobject_cast(ctr); - auto trackedTrajectoryModel = dynamic_cast( - trackedComponentCoreController->getModel()); - if (trackedTrajectoryModel != nullptr) - model->updateTrackedAnnotations(trackedTrajectoryModel->getChildNodes()); - updateView(); + std::shared_ptr parameters) +{ + auto model = static_cast(getModel()); + model->setCurrentFrame(parameters->m_CurrentFrameNumber); + + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); + auto trackedComponentCoreController = + qobject_cast(ctr); + auto trackedTrajectoryModel = dynamic_cast( + trackedComponentCoreController->getModel()); + if (trackedTrajectoryModel != nullptr) + model->updateTrackedAnnotations( + trackedTrajectoryModel->getChildNodes()); + updateView(); } -void ControllerAnnotations::receiveAddLabelAnnotation(){ - actionQueued = ActionQueued::CreateLabel; +void ControllerAnnotations::receiveAddLabelAnnotation() +{ + actionQueued = ActionQueued::CreateLabel; } -void ControllerAnnotations::receiveAddRectAnnotation(){ - actionQueued = ActionQueued::CreateRect; +void ControllerAnnotations::receiveAddRectAnnotation() +{ + actionQueued = ActionQueued::CreateRect; } -void ControllerAnnotations::receiveAddArrowAnnotation(){ - actionQueued = ActionQueued::CreateArrow; +void ControllerAnnotations::receiveAddArrowAnnotation() +{ + actionQueued = ActionQueued::CreateArrow; } -void ControllerAnnotations::receiveAddEllipseAnnotation(){ - actionQueued = ActionQueued::CreateEllipse; +void ControllerAnnotations::receiveAddEllipseAnnotation() +{ + actionQueued = ActionQueued::CreateEllipse; } -void ControllerAnnotations::receiveDeleteSelectedAnnotation(){ - auto model = static_cast(getModel()); - if (model->removeSelection()){ - updateView(); - } +void ControllerAnnotations::receiveDeleteSelectedAnnotation() +{ + auto model = static_cast(getModel()); + if (model->removeSelection()) { + updateView(); + } } void ControllerAnnotations::receiveSetAnnotationColor(QColor color) { - AnnotationsView* view = dynamic_cast(m_View); - if (view) { - view->setColor(color); - } + AnnotationsView* view = dynamic_cast(m_View); + if (view) { + view->setColor(color); + } } - diff --git a/Src/Controller/ControllerAnnotations.h b/Src/Controller/ControllerAnnotations.h index 1f716e70..f151e8a6 100644 --- a/Src/Controller/ControllerAnnotations.h +++ b/Src/Controller/ControllerAnnotations.h @@ -10,57 +10,65 @@ struct playerParameters; /** -* The ControllerAnnotations inherits IController -* It is the management unit of the annotation component. -* It controls user input -> creates new annotations in model, forwards moves and deletes them -*/ + * The ControllerAnnotations inherits IController + * It is the management unit of the annotation component. + * It controls user input -> creates new annotations in model, forwards moves + * and deletes them + */ class ControllerAnnotations : public IControllerCfg { - Q_OBJECT + Q_OBJECT public: - ControllerAnnotations(QObject* parent = 0, IBioTrackerContext* context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::ANNOTATIONS); - virtual ~ControllerAnnotations(); - void cleanup(); + ControllerAnnotations( + QObject* parent = 0, + IBioTrackerContext* context = 0, + ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::ANNOTATIONS); + virtual ~ControllerAnnotations(); + void cleanup(); - // IController interface + // IController interface public: - void connectControllerToController() override; + void connectControllerToController() override; - public Q_SLOTS: +public Q_SLOTS: - /// - void reset(std::string filepath); - void mousePressEvent(QMouseEvent *event, const QPoint &pos); - void mouseReleaseEvent(QMouseEvent*event, const QPoint &pos); - void mouseMoveEvent(QMouseEvent*event, const QPoint &pos); - void keyPressEvent(QKeyEvent *event); - void setPlayerParameters(std::shared_ptr parameters); + /// + void reset(std::string filepath); + void mousePressEvent(QMouseEvent* event, const QPoint& pos); + void mouseReleaseEvent(QMouseEvent* event, const QPoint& pos); + void mouseMoveEvent(QMouseEvent* event, const QPoint& pos); + void keyPressEvent(QKeyEvent* event); + void setPlayerParameters( + std::shared_ptr parameters); - //annotation receivers - void receiveAddLabelAnnotation(); - void receiveAddRectAnnotation(); - void receiveAddArrowAnnotation(); - void receiveAddEllipseAnnotation(); - void receiveDeleteSelectedAnnotation(); - void receiveSetAnnotationColor(QColor color); + // annotation receivers + void receiveAddLabelAnnotation(); + void receiveAddRectAnnotation(); + void receiveAddArrowAnnotation(); + void receiveAddEllipseAnnotation(); + void receiveDeleteSelectedAnnotation(); + void receiveSetAnnotationColor(QColor color); protected: - void createModel(std::string filepath = ""); - void createModel() override { createModel(""); } - void createView() override; - void connectModelToController() override; + void createModel(std::string filepath = ""); + void createModel() override + { + createModel(""); + } + void createView() override; + void connectModelToController() override; - enum class ActionQueued - { - None, - CreateArrow, - CreateLabel, - CreateRect, - CreateEllipse, - }; - ActionQueued actionQueued{ ActionQueued::None }; - void updateView(); - Annotations::TrackedPoint snapToTrajectory(const QPoint &point); + enum class ActionQueued + { + None, + CreateArrow, + CreateLabel, + CreateRect, + CreateEllipse, + }; + ActionQueued actionQueued{ActionQueued::None}; + void updateView(); + Annotations::TrackedPoint snapToTrajectory(const QPoint& point); Q_SIGNALS: - void onRepaintRequired(); + void onRepaintRequired(); }; diff --git a/Src/Controller/ControllerAreaDescriptor.cpp b/Src/Controller/ControllerAreaDescriptor.cpp index 406d578e..6dac7474 100644 --- a/Src/Controller/ControllerAreaDescriptor.cpp +++ b/Src/Controller/ControllerAreaDescriptor.cpp @@ -17,91 +17,110 @@ #include "Model/AreaDescriptor/AreaMemory.h" using namespace AreaMemory; -ControllerAreaDescriptor::ControllerAreaDescriptor(QObject *parent, IBioTrackerContext *context, ENUMS::CONTROLLERTYPE ctr) : - IControllerCfg(parent, context, ctr) +ControllerAreaDescriptor::ControllerAreaDescriptor(QObject* parent, + IBioTrackerContext* context, + ENUMS::CONTROLLERTYPE ctr) +: IControllerCfg(parent, context, ctr) { - _watchingVertice = -1; - _watchingVerticeType = BiotrackerTypes::AreaType::NONE; - m_ViewApperture = nullptr; + _watchingVertice = -1; + _watchingVerticeType = BiotrackerTypes::AreaType::NONE; + m_ViewApperture = nullptr; } -void ControllerAreaDescriptor::triggerUpdateAreaDescriptor() { +void ControllerAreaDescriptor::triggerUpdateAreaDescriptor() +{ - IModelAreaDescriptor* area = dynamic_cast(getModel()); - Q_EMIT updateAreaDescriptor(area); + IModelAreaDescriptor* area = dynamic_cast( + getModel()); + Q_EMIT updateAreaDescriptor(area); } void ControllerAreaDescriptor::createView() { - assert(m_Model); - AreaInfo* mInf = dynamic_cast (getModel()); - RectDescriptor* view = new RectDescriptor(this, mInf->_rect.get()); - m_View = view; - QObject::connect(this, &ControllerAreaDescriptor::currentVectorDrag, view, &RectDescriptor::receiveDragUpdate); - - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::GRAPHICSVIEW); - auto viewController = qobject_cast(ctr); - auto gview = dynamic_cast (viewController->getView()); - gview->addGraphicsItem(view); - - AreaInfo* area = dynamic_cast(getModel()); - - int v = _cfg->AppertureType; - trackingAreaType(v); + assert(m_Model); + AreaInfo* mInf = dynamic_cast(getModel()); + RectDescriptor* view = new RectDescriptor(this, mInf->_rect.get()); + m_View = view; + QObject::connect(this, + &ControllerAreaDescriptor::currentVectorDrag, + view, + &RectDescriptor::receiveDragUpdate); + + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::GRAPHICSVIEW); + auto viewController = qobject_cast(ctr); + auto gview = dynamic_cast(viewController->getView()); + gview->addGraphicsItem(view); + + AreaInfo* area = dynamic_cast(getModel()); + + int v = _cfg->AppertureType; + trackingAreaType(v); } void ControllerAreaDescriptor::connectModelToController() { - } -void ControllerAreaDescriptor::trackingAreaType(int v) { - - IController* ctr1 = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::GRAPHICSVIEW); - auto viewController = qobject_cast(ctr1); - auto gview = dynamic_cast (viewController->getView()); - - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::COMPONENT); - RectDescriptor* view = dynamic_cast(m_View); - AreaInfo* area = dynamic_cast(getModel()); - if (m_ViewApperture) { - gview->removeGraphicsItem(static_cast(m_ViewApperture)); - delete m_ViewApperture; - } - - if (v == 0) { - m_ViewApperture = new RectDescriptor(this, area->_apperture.get()); - area->_apperture->setType(0); - static_cast(m_ViewApperture)->setBrush(QBrush(Qt::red)); - QObject::connect(this, &ControllerAreaDescriptor::currentVectorDrag, static_cast(m_ViewApperture), &RectDescriptor::receiveDragUpdate); - _cfg->AppertureType = 0; - } - else if (v > 0) { - m_ViewApperture = new EllipseDescriptor(this, area->_apperture.get()); - area->_apperture->setType(1); - static_cast(m_ViewApperture)->setBrush(QBrush(Qt::red)); - static_cast(m_ViewApperture)->setDimensions(_w, _h); - QObject::connect(this, &ControllerAreaDescriptor::currentVectorDrag, static_cast(m_ViewApperture), &EllipseDescriptor::receiveDragUpdate); - _cfg->AppertureType = 1; - } +void ControllerAreaDescriptor::trackingAreaType(int v) +{ + + IController* ctr1 = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::GRAPHICSVIEW); + auto viewController = qobject_cast(ctr1); + auto gview = dynamic_cast(viewController->getView()); + + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::COMPONENT); + RectDescriptor* view = dynamic_cast(m_View); + AreaInfo* area = dynamic_cast(getModel()); + if (m_ViewApperture) { + gview->removeGraphicsItem( + static_cast(m_ViewApperture)); + delete m_ViewApperture; + } + + if (v == 0) { + m_ViewApperture = new RectDescriptor(this, area->_apperture.get()); + area->_apperture->setType(0); + static_cast(m_ViewApperture) + ->setBrush(QBrush(Qt::red)); + QObject::connect(this, + &ControllerAreaDescriptor::currentVectorDrag, + static_cast(m_ViewApperture), + &RectDescriptor::receiveDragUpdate); + _cfg->AppertureType = 0; + } else if (v > 0) { + m_ViewApperture = new EllipseDescriptor(this, area->_apperture.get()); + area->_apperture->setType(1); + static_cast(m_ViewApperture) + ->setBrush(QBrush(Qt::red)); + static_cast(m_ViewApperture) + ->setDimensions(_w, _h); + QObject::connect(this, + &ControllerAreaDescriptor::currentVectorDrag, + static_cast(m_ViewApperture), + &EllipseDescriptor::receiveDragUpdate); + _cfg->AppertureType = 1; + } if (!_visibleApperture) static_cast(m_ViewApperture)->hide(); if (!_visibleRectification) static_cast(m_View)->hide(); - gview->addGraphicsItem(static_cast(m_ViewApperture)); + gview->addGraphicsItem(static_cast(m_ViewApperture)); } -void ControllerAreaDescriptor::rcvPlayerParameters(std::shared_ptr parameters) +void ControllerAreaDescriptor::rcvPlayerParameters( + std::shared_ptr parameters) { - //Best effort to save performance... - //File has changed - if (_currentFilename != parameters->m_CurrentFilename) - { + // Best effort to save performance... + // File has changed + if (_currentFilename != parameters->m_CurrentFilename) { _currentFilename = parameters->m_CurrentFilename; - //Set area descriptor dimensions + // Set area descriptor dimensions AreaDescriptor* ad = static_cast(m_ViewApperture); std::shared_ptr m = parameters->m_CurrentFrame; if (ad && m != nullptr) { @@ -109,180 +128,234 @@ void ControllerAreaDescriptor::rcvPlayerParameters(std::shared_ptrsize().height; ad->setDimensions(_w, _h); } - QVector v = getVertices(_currentFilename, _cfg->AreaDefinitions); + QVector v = getVertices(_currentFilename, + _cfg->AreaDefinitions); if (!v.empty()) { changeAreaDescriptorType(v[2]); } } - } void ControllerAreaDescriptor::connectControllerToController() { - { - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::GRAPHICSVIEW); - auto viewController = qobject_cast(ctr); - auto view = dynamic_cast (viewController->getView()); - - QObject::connect(view, &GraphicsView::onMousePressEvent, this, &ControllerAreaDescriptor::mousePressEvent, Qt::DirectConnection); - QObject::connect(view, &GraphicsView::onMouseReleaseEvent, this, &ControllerAreaDescriptor::mouseReleaseEvent, Qt::DirectConnection); - QObject::connect(view, &GraphicsView::onMouseMoveEvent, this, &ControllerAreaDescriptor::mouseMoveEvent, Qt::DirectConnection); - QObject::connect(view, &GraphicsView::onKeyReleaseEvent, this, &ControllerAreaDescriptor::keyReleaseEvent, Qt::DirectConnection); - - //Area info model needs to know video dimensions - auto model = static_cast(getModel()); - IController* ctrPl = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::PLAYER); - auto mediaPlayerController = static_cast (ctrPl); - MediaPlayer *player = static_cast (mediaPlayerController->getModel()); - QObject::connect(player, &MediaPlayer::fwdPlayerParameters, model, &AreaInfo::rcvPlayerParameters, Qt::DirectConnection); - QObject::connect(player, &MediaPlayer::fwdPlayerParameters, this, &ControllerAreaDescriptor::rcvPlayerParameters, Qt::DirectConnection); - - - IController* ctrParms = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::COREPARAMETER); - auto parmsController = qobject_cast(ctrParms); - QObject::connect(this, &ControllerAreaDescriptor::changeAreaDescriptorType, parmsController, &ControllerCoreParameter::changeAreaDescriptorType, Qt::DirectConnection); - - - AreaInfo* area = dynamic_cast(getModel()); - QObject::connect(area->_rect.get(), SIGNAL(updatedVertices()), this, SLOT(updateView())); - QObject::connect(area->_apperture.get(), SIGNAL(updatedVertices()), this, SLOT(updateView())); - } - { - //View stuff from the parameter view - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::GRAPHICSVIEW); - auto viewController = qobject_cast(ctr); - } { - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::COREPARAMETER); - ControllerCoreParameter *cctr = static_cast(ctr); + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::GRAPHICSVIEW); + auto viewController = qobject_cast(ctr); + auto view = dynamic_cast(viewController->getView()); + + QObject::connect(view, + &GraphicsView::onMousePressEvent, + this, + &ControllerAreaDescriptor::mousePressEvent, + Qt::DirectConnection); + QObject::connect(view, + &GraphicsView::onMouseReleaseEvent, + this, + &ControllerAreaDescriptor::mouseReleaseEvent, + Qt::DirectConnection); + QObject::connect(view, + &GraphicsView::onMouseMoveEvent, + this, + &ControllerAreaDescriptor::mouseMoveEvent, + Qt::DirectConnection); + QObject::connect(view, + &GraphicsView::onKeyReleaseEvent, + this, + &ControllerAreaDescriptor::keyReleaseEvent, + Qt::DirectConnection); + + // Area info model needs to know video dimensions + auto model = static_cast(getModel()); + IController* ctrPl = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::PLAYER); + auto mediaPlayerController = static_cast(ctrPl); + MediaPlayer* player = static_cast( + mediaPlayerController->getModel()); + QObject::connect(player, + &MediaPlayer::fwdPlayerParameters, + model, + &AreaInfo::rcvPlayerParameters, + Qt::DirectConnection); + QObject::connect(player, + &MediaPlayer::fwdPlayerParameters, + this, + &ControllerAreaDescriptor::rcvPlayerParameters, + Qt::DirectConnection); + + IController* ctrParms = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::COREPARAMETER); + auto parmsController = qobject_cast( + ctrParms); + QObject::connect(this, + &ControllerAreaDescriptor::changeAreaDescriptorType, + parmsController, + &ControllerCoreParameter::changeAreaDescriptorType, + Qt::DirectConnection); + + AreaInfo* area = dynamic_cast(getModel()); + QObject::connect(area->_rect.get(), + SIGNAL(updatedVertices()), + this, + SLOT(updateView())); + QObject::connect(area->_apperture.get(), + SIGNAL(updatedVertices()), + this, + SLOT(updateView())); + } + { + // View stuff from the parameter view + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::GRAPHICSVIEW); + auto viewController = qobject_cast(ctr); + } + { + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::COREPARAMETER); + ControllerCoreParameter* cctr = static_cast( + ctr); cctr->triggerUpdate(); } } void ControllerAreaDescriptor::createModel() { - m_Model = new AreaInfo(this); + m_Model = new AreaInfo(this); } -void ControllerAreaDescriptor::updateView() { +void ControllerAreaDescriptor::updateView() +{ - AreaInfo* area = static_cast(getModel()); - RectDescriptor* rd = static_cast(getView()); - rd->updateRect(); - AreaDescriptor* ad = static_cast(m_ViewApperture); - ad->updateRect(); - area->updateRectification(); - area->updateApperture(); + AreaInfo* area = static_cast(getModel()); + RectDescriptor* rd = static_cast(getView()); + rd->updateRect(); + AreaDescriptor* ad = static_cast(m_ViewApperture); + ad->updateRect(); + area->updateRectification(); + area->updateApperture(); } - -void ControllerAreaDescriptor::keyReleaseEvent(QKeyEvent *event) +void ControllerAreaDescriptor::keyReleaseEvent(QKeyEvent* event) { } -void ControllerAreaDescriptor::mousePressEvent(QMouseEvent *event, const QPoint &pos) +void ControllerAreaDescriptor::mousePressEvent(QMouseEvent* event, + const QPoint& pos) { - auto model = static_cast(getModel()); - - //check if rectification vertice is grabbed and visible - RectDescriptor* rd = static_cast(getView()); - int verticeRect = -1; - if (rd->isVisible()) { - verticeRect = model->_rect->getVerticeAtLocation(pos); - if (verticeRect >= 0) { - _watchingVertice = verticeRect; - _watchingVerticeType = BiotrackerTypes::AreaType::RECT; - event->accept(); - } - } - - - //check if apperture vertice is grabbed and visible - AreaDescriptor* ad = static_cast(m_ViewApperture); - int verticeApp = -1; - if (ad->isVisible()) { - verticeApp = model->_apperture->getVerticeAtLocation(pos); - if (verticeApp >= 0) { - _watchingVertice = verticeApp; - _watchingVerticeType = BiotrackerTypes::AreaType::APPERTURE; - event->accept(); - } - } - - //else none is grabbed - if (verticeRect < 0 && verticeApp < 0) { - _watchingVertice = -1; - _watchingVerticeType = BiotrackerTypes::AreaType::NONE; - } - - //disable use entire screen when one vertice is grabbed + auto model = static_cast(getModel()); + + // check if rectification vertice is grabbed and visible + RectDescriptor* rd = static_cast(getView()); + int verticeRect = -1; + if (rd->isVisible()) { + verticeRect = model->_rect->getVerticeAtLocation(pos); + if (verticeRect >= 0) { + _watchingVertice = verticeRect; + _watchingVerticeType = BiotrackerTypes::AreaType::RECT; + event->accept(); + } + } + + // check if apperture vertice is grabbed and visible + AreaDescriptor* ad = static_cast(m_ViewApperture); + int verticeApp = -1; + if (ad->isVisible()) { + verticeApp = model->_apperture->getVerticeAtLocation(pos); + if (verticeApp >= 0) { + _watchingVertice = verticeApp; + _watchingVerticeType = BiotrackerTypes::AreaType::APPERTURE; + event->accept(); + } + } + + // else none is grabbed + if (verticeRect < 0 && verticeApp < 0) { + _watchingVertice = -1; + _watchingVerticeType = BiotrackerTypes::AreaType::NONE; + } + + // disable use entire screen when one vertice is grabbed if (verticeRect > 0 || verticeApp > 0) { AreaInfo* area = static_cast(getModel()); area->setUseEntireScreen(false); } - Q_EMIT currentVectorDrag(_watchingVerticeType, _watchingVertice, pos.x(), pos.y()); + Q_EMIT currentVectorDrag(_watchingVerticeType, + _watchingVertice, + pos.x(), + pos.y()); } -void ControllerAreaDescriptor::mouseReleaseEvent(QMouseEvent*event, const QPoint &pos) +void ControllerAreaDescriptor::mouseReleaseEvent(QMouseEvent* event, + const QPoint& pos) { - auto model = static_cast(getModel()); + auto model = static_cast(getModel()); - if (_watchingVertice >= 0 && _watchingVerticeType == BiotrackerTypes::AreaType::RECT) { - model->_rect->setVerticeAtLocation(pos, _watchingVertice); - event->accept(); - triggerUpdateAreaDescriptor(); - } + if (_watchingVertice >= 0 && + _watchingVerticeType == BiotrackerTypes::AreaType::RECT) { + model->_rect->setVerticeAtLocation(pos, _watchingVertice); + event->accept(); + triggerUpdateAreaDescriptor(); + } - if (_watchingVertice >= 0 && _watchingVerticeType == BiotrackerTypes::AreaType::APPERTURE) { - model->_apperture->setVerticeAtLocation(pos, _watchingVertice); - event->accept(); - triggerUpdateAreaDescriptor(); - } + if (_watchingVertice >= 0 && + _watchingVerticeType == BiotrackerTypes::AreaType::APPERTURE) { + model->_apperture->setVerticeAtLocation(pos, _watchingVertice); + event->accept(); + triggerUpdateAreaDescriptor(); + } _watchingVerticeType = BiotrackerTypes::AreaType::NONE; - _watchingVertice = -1; - Q_EMIT currentVectorDrag(_watchingVerticeType, _watchingVertice, pos.x(), pos.y()); + _watchingVertice = -1; + Q_EMIT currentVectorDrag(_watchingVerticeType, + _watchingVertice, + pos.x(), + pos.y()); } -void ControllerAreaDescriptor::mouseMoveEvent(QMouseEvent*event, const QPoint &pos) +void ControllerAreaDescriptor::mouseMoveEvent(QMouseEvent* event, + const QPoint& pos) { - Q_EMIT currentVectorDrag(_watchingVerticeType, _watchingVertice, pos.x(), pos.y()); + Q_EMIT currentVectorDrag(_watchingVerticeType, + _watchingVertice, + pos.x(), + pos.y()); } -void ControllerAreaDescriptor::setRectificationDimensions(double w, double h) { +void ControllerAreaDescriptor::setRectificationDimensions(double w, double h) +{ - _cfg->RectificationHeight = h; - _cfg->RectificationWidth = w; + _cfg->RectificationHeight = h; + _cfg->RectificationWidth = w; - AreaInfo* area = static_cast(getModel()); - area->setRectificationDimensions(w, h); - triggerUpdateAreaDescriptor(); + AreaInfo* area = static_cast(getModel()); + area->setRectificationDimensions(w, h); + triggerUpdateAreaDescriptor(); RectDescriptor* rd = static_cast(getView()); rd->updateRect(); } -void ControllerAreaDescriptor::setDisplayRectificationDefinition(bool b) { +void ControllerAreaDescriptor::setDisplayRectificationDefinition(bool b) +{ _visibleRectification = b; - RectDescriptor* rd = static_cast(getView()); - rd->setVisible(b); + RectDescriptor* rd = static_cast(getView()); + rd->setVisible(b); } -void ControllerAreaDescriptor::setDisplayTrackingAreaDefinition(bool b) { - _visibleApperture = b; - AreaDescriptor* ad = static_cast(m_ViewApperture); - ad->setVisible(b); +void ControllerAreaDescriptor::setDisplayTrackingAreaDefinition(bool b) +{ + _visibleApperture = b; + AreaDescriptor* ad = static_cast(m_ViewApperture); + ad->setVisible(b); } -void ControllerAreaDescriptor::setTrackingAreaAsEllipse(bool b) { - //Not passing b as a parameter for clarification reasons - if (b) { - trackingAreaType(1); - } - else { - trackingAreaType(0); - } +void ControllerAreaDescriptor::setTrackingAreaAsEllipse(bool b) +{ + // Not passing b as a parameter for clarification reasons + if (b) { + trackingAreaType(1); + } else { + trackingAreaType(0); + } } - - diff --git a/Src/Controller/ControllerAreaDescriptor.h b/Src/Controller/ControllerAreaDescriptor.h index 1cbad6c3..975012ae 100644 --- a/Src/Controller/ControllerAreaDescriptor.h +++ b/Src/Controller/ControllerAreaDescriptor.h @@ -9,47 +9,55 @@ class ControllerAreaDescriptor : public IControllerCfg { - Q_OBJECT + Q_OBJECT public: - ControllerAreaDescriptor(QObject *parent = 0, IBioTrackerContext *context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::AREADESCRIPTOR); + ControllerAreaDescriptor( + QObject* parent = 0, + IBioTrackerContext* context = 0, + ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::AREADESCRIPTOR); - void triggerUpdateAreaDescriptor(); + void triggerUpdateAreaDescriptor(); signals: - void updateAreaDescriptor(IModelAreaDescriptor *ad); - void currentVectorDrag(BiotrackerTypes::AreaType vectorType, int id, double x, double y); + void updateAreaDescriptor(IModelAreaDescriptor* ad); + void currentVectorDrag(BiotrackerTypes::AreaType vectorType, + int id, + double x, + double y); void changeAreaDescriptorType(QString type); public slots: - void setRectificationDimensions(double w, double h); - void setDisplayRectificationDefinition(bool b); - void setDisplayTrackingAreaDefinition(bool b); - void setTrackingAreaAsEllipse(bool b); - void rcvPlayerParameters(std::shared_ptr parameters); + void setRectificationDimensions(double w, double h); + void setDisplayRectificationDefinition(bool b); + void setDisplayTrackingAreaDefinition(bool b); + void setTrackingAreaAsEllipse(bool b); + void rcvPlayerParameters( + std::shared_ptr parameters); private slots: - void trackingAreaType(int v); + void trackingAreaType(int v); - void mousePressEvent(QMouseEvent *event, const QPoint &pos); - void mouseReleaseEvent(QMouseEvent*event, const QPoint &pos); - void mouseMoveEvent(QMouseEvent*event, const QPoint &pos); - void keyReleaseEvent(QKeyEvent *event); - void updateView(); + void mousePressEvent(QMouseEvent* event, const QPoint& pos); + void mouseReleaseEvent(QMouseEvent* event, const QPoint& pos); + void mouseMoveEvent(QMouseEvent* event, const QPoint& pos); + void keyReleaseEvent(QKeyEvent* event); + void updateView(); - // IController interface + // IController interface protected: - void createModel() override; - void createView() override; - void connectModelToController() override; - void connectControllerToController() override; + void createModel() override; + void createView() override; + void connectModelToController() override; + void connectControllerToController() override; + private: - int _watchingVertice; + int _watchingVertice; BiotrackerTypes::AreaType _watchingVerticeType; - IView *m_ViewApperture; - int _w = 1; - int _h = 1; - bool _visibleApperture = false; - bool _visibleRectification = false; - QString _currentFilename = "No Media"; + IView* m_ViewApperture; + int _w = 1; + int _h = 1; + bool _visibleApperture = false; + bool _visibleRectification = false; + QString _currentFilename = "No Media"; }; diff --git a/Src/Controller/ControllerCommands.cpp b/Src/Controller/ControllerCommands.cpp index 542447e1..4e1c3202 100644 --- a/Src/Controller/ControllerCommands.cpp +++ b/Src/Controller/ControllerCommands.cpp @@ -1,8 +1,10 @@ #include "Controller/ControllerCommands.h" #include "QDebug" -ControllerCommands::ControllerCommands(QObject *parent, IBioTrackerContext *context, ENUMS::CONTROLLERTYPE ctr) : - IControllerCfg(parent, context, ctr) +ControllerCommands::ControllerCommands(QObject* parent, + IBioTrackerContext* context, + ENUMS::CONTROLLERTYPE ctr) +: IControllerCfg(parent, context, ctr) { } @@ -10,110 +12,156 @@ ControllerCommands::~ControllerCommands() { } -void ControllerCommands::receiveAddTrackCommand(QPoint pos, int id) { - AddTrackCommand* addCmd = new AddTrackCommand(id, pos); - QObject::connect(addCmd, &AddTrackCommand::emitAddTrajectory, this, &ControllerCommands::emitAddTrajectory); - QObject::connect(addCmd, &AddTrackCommand::emitValidateTrajectory, this, &ControllerCommands::emitValidateTrajectory); - QObject::connect(addCmd, &AddTrackCommand::emitRemoveTrajectoryId, this, &ControllerCommands::emitRemoveTrajectoryId); +void ControllerCommands::receiveAddTrackCommand(QPoint pos, int id) +{ + AddTrackCommand* addCmd = new AddTrackCommand(id, pos); + QObject::connect(addCmd, + &AddTrackCommand::emitAddTrajectory, + this, + &ControllerCommands::emitAddTrajectory); + QObject::connect(addCmd, + &AddTrackCommand::emitValidateTrajectory, + this, + &ControllerCommands::emitValidateTrajectory); + QObject::connect(addCmd, + &AddTrackCommand::emitRemoveTrajectoryId, + this, + &ControllerCommands::emitRemoveTrajectoryId); - _undoStack->push(addCmd); + _undoStack->push(addCmd); } -void ControllerCommands::receiveRemoveTrackCommand(IModelTrackedTrajectory * traj) +void ControllerCommands::receiveRemoveTrackCommand( + IModelTrackedTrajectory* traj) { - RemoveTrackCommand* rmtCmd = new RemoveTrackCommand(traj); - QObject::connect(rmtCmd, &RemoveTrackCommand::emitValidateTrajectory, this, &ControllerCommands::emitValidateTrajectory); - QObject::connect(rmtCmd, &RemoveTrackCommand::emitRemoveTrajectory, this, &ControllerCommands::emitRemoveTrajectory); + RemoveTrackCommand* rmtCmd = new RemoveTrackCommand(traj); + QObject::connect(rmtCmd, + &RemoveTrackCommand::emitValidateTrajectory, + this, + &ControllerCommands::emitValidateTrajectory); + QObject::connect(rmtCmd, + &RemoveTrackCommand::emitRemoveTrajectory, + this, + &ControllerCommands::emitRemoveTrajectory); - _undoStack->push(rmtCmd); + _undoStack->push(rmtCmd); } -void ControllerCommands::receiveRemoveTrackEntityCommand(IModelTrackedTrajectory * traj, uint frameNumber) +void ControllerCommands::receiveRemoveTrackEntityCommand( + IModelTrackedTrajectory* traj, + uint frameNumber) { - RemoveElementCommand* rmeCmd = new RemoveElementCommand(traj, frameNumber); - QObject::connect(rmeCmd, &RemoveElementCommand::emitValidateEntity, this, &ControllerCommands::emitValidateEntity); - QObject::connect(rmeCmd, &RemoveElementCommand::emitRemoveElement, this, &ControllerCommands::emitRemoveTrackEntity); + RemoveElementCommand* rmeCmd = new RemoveElementCommand(traj, frameNumber); + QObject::connect(rmeCmd, + &RemoveElementCommand::emitValidateEntity, + this, + &ControllerCommands::emitValidateEntity); + QObject::connect(rmeCmd, + &RemoveElementCommand::emitRemoveElement, + this, + &ControllerCommands::emitRemoveTrackEntity); - _undoStack->push(rmeCmd); + _undoStack->push(rmeCmd); } -void ControllerCommands::receiveMoveElementCommand(IModelTrackedTrajectory* traj, QPoint oldPos, QPoint newPos, uint frameNumber, int toMove) +void ControllerCommands::receiveMoveElementCommand( + IModelTrackedTrajectory* traj, + QPoint oldPos, + QPoint newPos, + uint frameNumber, + int toMove) { - MoveElementCommand* mvCmd = new MoveElementCommand(traj, frameNumber, oldPos, newPos, toMove); - QObject::connect(mvCmd, &MoveElementCommand::emitMoveElement, this, &ControllerCommands::emitMoveElement); + MoveElementCommand* mvCmd = + new MoveElementCommand(traj, frameNumber, oldPos, newPos, toMove); + QObject::connect(mvCmd, + &MoveElementCommand::emitMoveElement, + this, + &ControllerCommands::emitMoveElement); - _undoStack->push(mvCmd); + _undoStack->push(mvCmd); } -void ControllerCommands::receiveSwapIdCommand(IModelTrackedTrajectory * traj0, IModelTrackedTrajectory * traj1) +void ControllerCommands::receiveSwapIdCommand(IModelTrackedTrajectory* traj0, + IModelTrackedTrajectory* traj1) { - SwapTrackIdCommand* swapCmd = new SwapTrackIdCommand(traj0, traj1); - QObject::connect(swapCmd, &SwapTrackIdCommand::emitSwapIds, this, &ControllerCommands::emitSwapIds); + SwapTrackIdCommand* swapCmd = new SwapTrackIdCommand(traj0, traj1); + QObject::connect(swapCmd, + &SwapTrackIdCommand::emitSwapIds, + this, + &ControllerCommands::emitSwapIds); - _undoStack->push(swapCmd); + _undoStack->push(swapCmd); } -void ControllerCommands::receiveFixTrackCommand(IModelTrackedTrajectory * traj, bool toggle) +void ControllerCommands::receiveFixTrackCommand(IModelTrackedTrajectory* traj, + bool toggle) { - FixTrackCommand* fixCmd = new FixTrackCommand(traj, toggle); - QObject::connect(fixCmd, &FixTrackCommand::emitFixTrack, this, &ControllerCommands::emitToggleFixTrack); + FixTrackCommand* fixCmd = new FixTrackCommand(traj, toggle); + QObject::connect(fixCmd, + &FixTrackCommand::emitFixTrack, + this, + &ControllerCommands::emitToggleFixTrack); - _undoStack->push(fixCmd); + _undoStack->push(fixCmd); } -void ControllerCommands::receiveEntityRotation(IModelTrackedTrajectory * traj,double oldAngleDeg, double newAngleDeg, uint frameNumber) +void ControllerCommands::receiveEntityRotation(IModelTrackedTrajectory* traj, + double oldAngleDeg, + double newAngleDeg, + uint frameNumber) { - RotateEntityCommand* rotCmd = new RotateEntityCommand(traj, oldAngleDeg, newAngleDeg, frameNumber); - QObject::connect(rotCmd, &RotateEntityCommand::emitEntityRotation, this, &ControllerCommands::emitEntityRotation); + RotateEntityCommand* rotCmd = + new RotateEntityCommand(traj, oldAngleDeg, newAngleDeg, frameNumber); + QObject::connect(rotCmd, + &RotateEntityCommand::emitEntityRotation, + this, + &ControllerCommands::emitEntityRotation); - _undoStack->push(rotCmd); + _undoStack->push(rotCmd); } void ControllerCommands::receiveUndo() { - if (_undoStack->canUndo()) { - _undoStack->undo(); - } - else { - qDebug() << "CORE: Cannot undo the last command!"; - } + if (_undoStack->canUndo()) { + _undoStack->undo(); + } else { + qDebug() << "CORE: Cannot undo the last command!"; + } } void ControllerCommands::receiveRedo() { - if (_undoStack->canRedo()) { - _undoStack->redo(); - } - else { - qDebug() << "CORE: Csannot redo the next command!"; - } + if (_undoStack->canRedo()) { + _undoStack->redo(); + } else { + qDebug() << "CORE: Csannot redo the next command!"; + } } void ControllerCommands::receiveClear() { - _undoStack->clear(); + _undoStack->clear(); } void ControllerCommands::receiveShowActionList() { - _undoView->show(); + _undoView->show(); } void ControllerCommands::connectControllerToController() { - } void ControllerCommands::createModel() { - _undoStack = new QUndoStack(this); + _undoStack = new QUndoStack(this); } void ControllerCommands::createView() { - _undoView = new QUndoView(_undoStack); - _undoView->setWindowTitle("Command List"); - _undoView->setAttribute(Qt::WA_QuitOnClose, false); + _undoView = new QUndoView(_undoStack); + _undoView->setWindowTitle("Command List"); + _undoView->setAttribute(Qt::WA_QuitOnClose, false); } void ControllerCommands::connectModelToController() diff --git a/Src/Controller/ControllerCommands.h b/Src/Controller/ControllerCommands.h index 99754025..a95d5729 100644 --- a/Src/Controller/ControllerCommands.h +++ b/Src/Controller/ControllerCommands.h @@ -9,67 +9,88 @@ #include "QUndoView" /** -* This class inherits from IController. -* http://doc.qt.io/qt-5/qundo.html -* The commands component controls the commands on an undo/redo stack (model) and the undo view -*/ -class ControllerCommands : public IControllerCfg { - Q_OBJECT + * This class inherits from IController. + * http://doc.qt.io/qt-5/qundo.html + * The commands component controls the commands on an undo/redo stack (model) + * and the undo view + */ +class ControllerCommands : public IControllerCfg +{ + Q_OBJECT public: - ControllerCommands(QObject* parent = 0, IBioTrackerContext* context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); - virtual ~ControllerCommands(); + ControllerCommands( + QObject* parent = 0, + IBioTrackerContext* context = 0, + ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); + virtual ~ControllerCommands(); signals: - // signal to ctrPlugin to remove trajectory - void emitRemoveTrajectory(IModelTrackedTrajectory* trajectory); - - void emitRemoveTrajectoryId(int id); - - // signal to ctrPlugin to remove track entity - void emitRemoveTrackEntity(IModelTrackedTrajectory* trajectory, uint frameNumber); - - // signal to ctrPlugin to add trajectory - void emitAddTrajectory(QPoint pos); - - void emitValidateTrajectory(int id); - - void emitValidateEntity(IModelTrackedTrajectory* trajectory, uint frameNumber); - - void emitMoveElement(IModelTrackedTrajectory* trajectory, uint frameNumber, QPoint pos, int toMove); - - void emitSwapIds(IModelTrackedTrajectory* trajectory0, IModelTrackedTrajectory* trajectory1); - - void emitToggleFixTrack(IModelTrackedTrajectory* trajectory, bool toggle); - - void emitEntityRotation(IModelTrackedTrajectory* trajectory, double angleDeg, uint frameNumber); - - - public slots: - void receiveAddTrackCommand(QPoint pos, int id); - void receiveRemoveTrackCommand(IModelTrackedTrajectory* traj); - void receiveRemoveTrackEntityCommand(IModelTrackedTrajectory* traj, uint frameNumber); - void receiveMoveElementCommand(IModelTrackedTrajectory* traj, QPoint oldPos, QPoint newPos, uint frameNumber, int toMove); - void receiveSwapIdCommand(IModelTrackedTrajectory* traj0, IModelTrackedTrajectory* traj1); - void receiveFixTrackCommand(IModelTrackedTrajectory* traj, bool toggle); - void receiveEntityRotation(IModelTrackedTrajectory* traj, double oldAngleDeg, double newAngleDeg, uint frameNumber); - - void receiveUndo(); - void receiveRedo(); - void receiveClear(); - void receiveShowActionList(); - - // IController interface + // signal to ctrPlugin to remove trajectory + void emitRemoveTrajectory(IModelTrackedTrajectory* trajectory); + + void emitRemoveTrajectoryId(int id); + + // signal to ctrPlugin to remove track entity + void emitRemoveTrackEntity(IModelTrackedTrajectory* trajectory, + uint frameNumber); + + // signal to ctrPlugin to add trajectory + void emitAddTrajectory(QPoint pos); + + void emitValidateTrajectory(int id); + + void emitValidateEntity(IModelTrackedTrajectory* trajectory, + uint frameNumber); + + void emitMoveElement(IModelTrackedTrajectory* trajectory, + uint frameNumber, + QPoint pos, + int toMove); + + void emitSwapIds(IModelTrackedTrajectory* trajectory0, + IModelTrackedTrajectory* trajectory1); + + void emitToggleFixTrack(IModelTrackedTrajectory* trajectory, bool toggle); + + void emitEntityRotation(IModelTrackedTrajectory* trajectory, + double angleDeg, + uint frameNumber); + +public slots: + void receiveAddTrackCommand(QPoint pos, int id); + void receiveRemoveTrackCommand(IModelTrackedTrajectory* traj); + void receiveRemoveTrackEntityCommand(IModelTrackedTrajectory* traj, + uint frameNumber); + void receiveMoveElementCommand(IModelTrackedTrajectory* traj, + QPoint oldPos, + QPoint newPos, + uint frameNumber, + int toMove); + void receiveSwapIdCommand(IModelTrackedTrajectory* traj0, + IModelTrackedTrajectory* traj1); + void receiveFixTrackCommand(IModelTrackedTrajectory* traj, bool toggle); + void receiveEntityRotation(IModelTrackedTrajectory* traj, + double oldAngleDeg, + double newAngleDeg, + uint frameNumber); + + void receiveUndo(); + void receiveRedo(); + void receiveClear(); + void receiveShowActionList(); + + // IController interface public: - void connectControllerToController() override; + void connectControllerToController() override; protected: - void createModel() override; - void createView() override; - void connectModelToController() override; - //member + void createModel() override; + void createView() override; + void connectModelToController() override; + // member private: - QUndoStack* _undoStack; - QUndoView* _undoView; + QUndoStack* _undoStack; + QUndoView* _undoView; }; #endif // CONTROLLERCOMMANDS_H \ No newline at end of file diff --git a/Src/Controller/ControllerCoreParameter.cpp b/Src/Controller/ControllerCoreParameter.cpp index 3b425cfa..89c0b729 100644 --- a/Src/Controller/ControllerCoreParameter.cpp +++ b/Src/Controller/ControllerCoreParameter.cpp @@ -10,133 +10,292 @@ #include "View/TrackedComponentView.h" #include "Model/CoreParameter.h" -ControllerCoreParameter::ControllerCoreParameter(QObject *parent, IBioTrackerContext *context, ENUMS::CONTROLLERTYPE ctr) : - IControllerCfg(parent, context, ctr) +ControllerCoreParameter::ControllerCoreParameter(QObject* parent, + IBioTrackerContext* context, + ENUMS::CONTROLLERTYPE ctr) +: IControllerCfg(parent, context, ctr) { - } void ControllerCoreParameter::createView() { - assert(m_Model); - m_View = new CoreParameterView(0, this, m_Model); + assert(m_Model); + m_View = new CoreParameterView(0, this, m_Model); } void ControllerCoreParameter::connectModelToController() { - } void ControllerCoreParameter::connectControllerToController() { - CoreParameterView* view = static_cast(m_View);view->triggerUpdate(); - //Connections to the trackedComponentCore - { - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); - ControllerTrackedComponentCore *tccController = dynamic_cast(ctr); - IView* vv = tccController->getView(); - TrackedComponentView* tcview = static_cast(vv); - - IController* ctr2 = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::GRAPHICSVIEW); - ControllerGraphicScene* ctrGrphScn = dynamic_cast(ctr2); - - - QObject::connect(view, &CoreParameterView::emitViewSwitch, tcview, &TrackedComponentView::receiveViewSwitch, Qt::DirectConnection); - //Tracks - //QObject::connect(view, &CoreParameterView::emitSelectAll, tcview, &TrackedComponentView::receiveSelectAll, Qt::DirectConnection); - QObject::connect(view, &CoreParameterView::emitAddTrack, tcview, &TrackedComponentView::addTrajectory, Qt::DirectConnection); - - //Track dimensions - QObject::connect(view, &CoreParameterView::emitTrackOrientationLine, tcview, &TrackedComponentView::receiveTrackOrientationLine, Qt::DirectConnection); - QObject::connect(view, &CoreParameterView::emitTrackShowId, tcview, &TrackedComponentView::receiveTrackShowId, Qt::DirectConnection); - QObject::connect(view, &CoreParameterView::emitTrackDimensionsAll, tcview, &TrackedComponentView::receiveTrackDimensionsAll, Qt::DirectConnection); - QObject::connect(view, &CoreParameterView::emitTrackDimensionsSelected, tcview, &TrackedComponentView::receiveTrackDimensionsSelected, Qt::DirectConnection); - QObject::connect(view, &CoreParameterView::emitTrackDimensionsSetDefault, tcview, &TrackedComponentView::receiveTrackDimensionsSetDefault, Qt::DirectConnection); - - //Track ignore zoom - QObject::connect(view, &CoreParameterView::emitIgnoreZoom, tcview, &TrackedComponentView::receiveIgnoreZoom, Qt::DirectConnection); - - //Track color - QObject::connect(view, &CoreParameterView::emitColorChangeBorderAll, tcview, &TrackedComponentView::receiveColorChangeBorderAll, Qt::DirectConnection); - QObject::connect(view, &CoreParameterView::emitColorChangeBorderSelected, tcview, &TrackedComponentView::receiveColorChangeBorderSelected, Qt::DirectConnection); - QObject::connect(view, &CoreParameterView::emitColorChangeBrushAll, tcview, &TrackedComponentView::receiveColorChangeBrushAll, Qt::DirectConnection); - QObject::connect(view, &CoreParameterView::emitColorChangeBrushSelected, tcview, &TrackedComponentView::receiveColorChangeBrushSelected, Qt::DirectConnection); - //Tracing - QObject::connect(view, &CoreParameterView::emitTracingHistoryLength, tcview, &TrackedComponentView::receiveTracingHistoryLength, Qt::DirectConnection); - QObject::connect(view, &CoreParameterView::emitTracingStyle, tcview, &TrackedComponentView::receiveTracingStyle, Qt::DirectConnection); - QObject::connect(view, &CoreParameterView::emitTracingSteps, tcview, &TrackedComponentView::receiveTracingSteps, Qt::DirectConnection); - QObject::connect(view, &CoreParameterView::emitTracingTimeDegradation, tcview, &TrackedComponentView::receiveTracingTimeDegradation, Qt::DirectConnection); - QObject::connect(view, &CoreParameterView::emitTracerFrameNumber, tcview, &TrackedComponentView::receiveTracerFrameNumber, Qt::DirectConnection); - //Tracing dimensions - QObject::connect(view, &CoreParameterView::emitTracerProportions, tcview, &TrackedComponentView::receiveTracerProportions, Qt::DirectConnection); - QObject::connect(view, &CoreParameterView::emitTracerOrientationLine, tcview, &TrackedComponentView::receiveTracerOrientationLine, Qt::DirectConnection); - //Misc - QObject::connect(view, &CoreParameterView::emitToggleAntialiasingEntities, tcview, &TrackedComponentView::receiveToggleAntialiasingEntities, Qt::DirectConnection); - QObject::connect(view, &CoreParameterView::emitToggleAntialiasingFull, ctrGrphScn, &ControllerGraphicScene::receiveToggleAntialiasingFull, Qt::DirectConnection); - - } - //Connections to the AreaDescriptor - { - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::AREADESCRIPTOR); - ControllerAreaDescriptor *adController = static_cast(ctr); - QObject::connect(view, &CoreParameterView::emitRectDimensions, adController, &ControllerAreaDescriptor::setRectificationDimensions, Qt::DirectConnection); - QObject::connect(view, &CoreParameterView::emitDisplayTrackingArea, adController, &ControllerAreaDescriptor::setDisplayTrackingAreaDefinition, Qt::DirectConnection); - QObject::connect(view, &CoreParameterView::emitDisplayRectification, adController, &ControllerAreaDescriptor::setDisplayRectificationDefinition, Qt::DirectConnection); - QObject::connect(view, &CoreParameterView::emitTrackingAreaAsEllipse, adController, &ControllerAreaDescriptor::setTrackingAreaAsEllipse, Qt::DirectConnection); - } + CoreParameterView* view = static_cast(m_View); + view->triggerUpdate(); + // Connections to the trackedComponentCore + { + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); + ControllerTrackedComponentCore* tccController = + dynamic_cast(ctr); + IView* vv = tccController->getView(); + TrackedComponentView* tcview = static_cast(vv); - //Connections to the Annotations - { - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::ANNOTATIONS); - ControllerAnnotations *annoController = static_cast(ctr); - QObject::connect(view, &CoreParameterView::emitSetAnnoColor, annoController, &ControllerAnnotations::receiveSetAnnotationColor, Qt::DirectConnection); - } + IController* ctr2 = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::GRAPHICSVIEW); + ControllerGraphicScene* ctrGrphScn = + dynamic_cast(ctr2); - //Connections to the DataExporter + QObject::connect(view, + &CoreParameterView::emitViewSwitch, + tcview, + &TrackedComponentView::receiveViewSwitch, + Qt::DirectConnection); + // Tracks + // QObject::connect(view, &CoreParameterView::emitSelectAll, tcview, + // &TrackedComponentView::receiveSelectAll, Qt::DirectConnection); + QObject::connect(view, + &CoreParameterView::emitAddTrack, + tcview, + &TrackedComponentView::addTrajectory, + Qt::DirectConnection); + + // Track dimensions + QObject::connect(view, + &CoreParameterView::emitTrackOrientationLine, + tcview, + &TrackedComponentView::receiveTrackOrientationLine, + Qt::DirectConnection); + QObject::connect(view, + &CoreParameterView::emitTrackShowId, + tcview, + &TrackedComponentView::receiveTrackShowId, + Qt::DirectConnection); + QObject::connect(view, + &CoreParameterView::emitTrackDimensionsAll, + tcview, + &TrackedComponentView::receiveTrackDimensionsAll, + Qt::DirectConnection); + QObject::connect(view, + &CoreParameterView::emitTrackDimensionsSelected, + tcview, + &TrackedComponentView::receiveTrackDimensionsSelected, + Qt::DirectConnection); + QObject::connect( + view, + &CoreParameterView::emitTrackDimensionsSetDefault, + tcview, + &TrackedComponentView::receiveTrackDimensionsSetDefault, + Qt::DirectConnection); + + // Track ignore zoom + QObject::connect(view, + &CoreParameterView::emitIgnoreZoom, + tcview, + &TrackedComponentView::receiveIgnoreZoom, + Qt::DirectConnection); + + // Track color + QObject::connect(view, + &CoreParameterView::emitColorChangeBorderAll, + tcview, + &TrackedComponentView::receiveColorChangeBorderAll, + Qt::DirectConnection); + QObject::connect( + view, + &CoreParameterView::emitColorChangeBorderSelected, + tcview, + &TrackedComponentView::receiveColorChangeBorderSelected, + Qt::DirectConnection); + QObject::connect(view, + &CoreParameterView::emitColorChangeBrushAll, + tcview, + &TrackedComponentView::receiveColorChangeBrushAll, + Qt::DirectConnection); + QObject::connect( + view, + &CoreParameterView::emitColorChangeBrushSelected, + tcview, + &TrackedComponentView::receiveColorChangeBrushSelected, + Qt::DirectConnection); + // Tracing + QObject::connect(view, + &CoreParameterView::emitTracingHistoryLength, + tcview, + &TrackedComponentView::receiveTracingHistoryLength, + Qt::DirectConnection); + QObject::connect(view, + &CoreParameterView::emitTracingStyle, + tcview, + &TrackedComponentView::receiveTracingStyle, + Qt::DirectConnection); + QObject::connect(view, + &CoreParameterView::emitTracingSteps, + tcview, + &TrackedComponentView::receiveTracingSteps, + Qt::DirectConnection); + QObject::connect(view, + &CoreParameterView::emitTracingTimeDegradation, + tcview, + &TrackedComponentView::receiveTracingTimeDegradation, + Qt::DirectConnection); + QObject::connect(view, + &CoreParameterView::emitTracerFrameNumber, + tcview, + &TrackedComponentView::receiveTracerFrameNumber, + Qt::DirectConnection); + // Tracing dimensions + QObject::connect(view, + &CoreParameterView::emitTracerProportions, + tcview, + &TrackedComponentView::receiveTracerProportions, + Qt::DirectConnection); + QObject::connect(view, + &CoreParameterView::emitTracerOrientationLine, + tcview, + &TrackedComponentView::receiveTracerOrientationLine, + Qt::DirectConnection); + // Misc + QObject::connect( + view, + &CoreParameterView::emitToggleAntialiasingEntities, + tcview, + &TrackedComponentView::receiveToggleAntialiasingEntities, + Qt::DirectConnection); + QObject::connect( + view, + &CoreParameterView::emitToggleAntialiasingFull, + ctrGrphScn, + &ControllerGraphicScene::receiveToggleAntialiasingFull, + Qt::DirectConnection); + } + // Connections to the AreaDescriptor { - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::DATAEXPORT); - ControllerDataExporter *deController = static_cast(ctr); - QObject::connect(view, &CoreParameterView::emitFinalizeExperiment, deController, &ControllerDataExporter::receiveFinalizeExperiment, Qt::DirectConnection); - QObject::connect(view, &CoreParameterView::emitTrialStarted, deController, &ControllerDataExporter::receiveTrialStarted, Qt::DirectConnection); + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::AREADESCRIPTOR); + ControllerAreaDescriptor* adController = + static_cast(ctr); + QObject::connect(view, + &CoreParameterView::emitRectDimensions, + adController, + &ControllerAreaDescriptor::setRectificationDimensions, + Qt::DirectConnection); + QObject::connect( + view, + &CoreParameterView::emitDisplayTrackingArea, + adController, + &ControllerAreaDescriptor::setDisplayTrackingAreaDefinition, + Qt::DirectConnection); + QObject::connect( + view, + &CoreParameterView::emitDisplayRectification, + adController, + &ControllerAreaDescriptor::setDisplayRectificationDefinition, + Qt::DirectConnection); + QObject::connect(view, + &CoreParameterView::emitTrackingAreaAsEllipse, + adController, + &ControllerAreaDescriptor::setTrackingAreaAsEllipse, + Qt::DirectConnection); + } + // Connections to the Annotations + { + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::ANNOTATIONS); + ControllerAnnotations* annoController = + static_cast(ctr); + QObject::connect(view, + &CoreParameterView::emitSetAnnoColor, + annoController, + &ControllerAnnotations::receiveSetAnnotationColor, + Qt::DirectConnection); + } + // Connections to the DataExporter + { + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::DATAEXPORT); + ControllerDataExporter* deController = + static_cast(ctr); + QObject::connect(view, + &CoreParameterView::emitFinalizeExperiment, + deController, + &ControllerDataExporter::receiveFinalizeExperiment, + Qt::DirectConnection); + QObject::connect(view, + &CoreParameterView::emitTrialStarted, + deController, + &ControllerDataExporter::receiveTrialStarted, + Qt::DirectConnection); } - //Media Player + // Media Player { - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::PLAYER); - ControllerPlayer *mpc = static_cast(ctr); - MediaPlayer* mp = static_cast(mpc->getModel()); - QObject::connect(mp, &MediaPlayer::fwdPlayerParameters, view, &CoreParameterView::rcvPlayerParameters); - QObject::connect(view, &CoreParameterView::emitStartPlayback, mpc, &ControllerPlayer::play); - QObject::connect(view, &CoreParameterView::emitStopPlayback, mpc, &ControllerPlayer::stop); - QObject::connect(view, &CoreParameterView::emitPausePlayback, mpc, &ControllerPlayer::pause); + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::PLAYER); + ControllerPlayer* mpc = static_cast(ctr); + MediaPlayer* mp = static_cast(mpc->getModel()); + QObject::connect(mp, + &MediaPlayer::fwdPlayerParameters, + view, + &CoreParameterView::rcvPlayerParameters); + QObject::connect(view, + &CoreParameterView::emitStartPlayback, + mpc, + &ControllerPlayer::play); + QObject::connect(view, + &CoreParameterView::emitStopPlayback, + mpc, + &ControllerPlayer::stop); + QObject::connect(view, + &CoreParameterView::emitPausePlayback, + mpc, + &ControllerPlayer::pause); } - //Main Window + // Main Window { - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::MAINWINDOW); - ControllerMainWindow *mwc = static_cast(ctr); - QObject::connect(view, &CoreParameterView::emitEnableTracking, mwc, &ControllerMainWindow::activeTracking); - QObject::connect(view, &CoreParameterView::emitDisableTracking, mwc, &ControllerMainWindow::deactiveTrackring); - QObject::connect(view, &CoreParameterView::emitActivateTrackingSwitch, mwc, &ControllerMainWindow::activeTrackingCheckBox); - QObject::connect(view, &CoreParameterView::emitDeactivateTrackingSwitch, mwc, &ControllerMainWindow::deactiveTrackingCheckBox); - QObject::connect(view, &CoreParameterView::emitSaveDataToFile, mwc, &ControllerMainWindow::receiveSaveTrajData); + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::MAINWINDOW); + ControllerMainWindow* mwc = static_cast(ctr); + QObject::connect(view, + &CoreParameterView::emitEnableTracking, + mwc, + &ControllerMainWindow::activeTracking); + QObject::connect(view, + &CoreParameterView::emitDisableTracking, + mwc, + &ControllerMainWindow::deactiveTrackring); + QObject::connect(view, + &CoreParameterView::emitActivateTrackingSwitch, + mwc, + &ControllerMainWindow::activeTrackingCheckBox); + QObject::connect(view, + &CoreParameterView::emitDeactivateTrackingSwitch, + mwc, + &ControllerMainWindow::deactiveTrackingCheckBox); + QObject::connect(view, + &CoreParameterView::emitSaveDataToFile, + mwc, + &ControllerMainWindow::receiveSaveTrajData); } view->triggerUpdate(); } -void ControllerCoreParameter::changeAreaDescriptorType(QString type) { +void ControllerCoreParameter::changeAreaDescriptorType(QString type) +{ if (dynamic_cast(m_View)) - dynamic_cast(m_View)->areaDescriptorTypeChanged(type); + dynamic_cast(m_View)->areaDescriptorTypeChanged( + type); } void ControllerCoreParameter::receiveResetTrial() { - CoreParameterView* view = static_cast(m_View); - view->resetTrial(); + CoreParameterView* view = static_cast(m_View); + view->resetTrial(); } -void ControllerCoreParameter::triggerUpdate() { +void ControllerCoreParameter::triggerUpdate() +{ CoreParameterView* view = static_cast(m_View); view->triggerUpdate(); @@ -144,35 +303,38 @@ void ControllerCoreParameter::triggerUpdate() { void ControllerCoreParameter::receiveTrackNumber(int number) { - CoreParameter* coreParams = dynamic_cast(getModel()); - if (coreParams) { - coreParams->setTrackNumber(number); - } + CoreParameter* coreParams = dynamic_cast(getModel()); + if (coreParams) { + coreParams->setTrackNumber(number); + } } void ControllerCoreParameter::createModel() { - m_Model = new CoreParameter(this); + m_Model = new CoreParameter(this); } -void ControllerCoreParameter::updateView() +void ControllerCoreParameter::updateView() { } -void ControllerCoreParameter::setCorePermission(std::pair permission) +void ControllerCoreParameter::setCorePermission( + std::pair permission) { - if (dynamic_cast(m_View)) { - dynamic_cast(m_View)->setPermission(permission); - } - else { - //qDebug() << "no view yet"; - //This should never happen, actually - assert(false); - } + if (dynamic_cast(m_View)) { + dynamic_cast(m_View)->setPermission(permission); + } else { + // qDebug() << "no view yet"; + // This should never happen, actually + assert(false); + } } -int ControllerCoreParameter::getTrialNumber() { - return (static_cast(m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::DATAEXPORT)))->getNumber(true); +int ControllerCoreParameter::getTrialNumber() +{ + return (static_cast( + m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::DATAEXPORT))) + ->getNumber(true); } - diff --git a/Src/Controller/ControllerCoreParameter.h b/Src/Controller/ControllerCoreParameter.h index 87e5c093..4b2e0747 100644 --- a/Src/Controller/ControllerCoreParameter.h +++ b/Src/Controller/ControllerCoreParameter.h @@ -7,37 +7,40 @@ class ControllerCoreParameter : public IControllerCfg { - Q_OBJECT + Q_OBJECT public: - ControllerCoreParameter(QObject *parent = 0, IBioTrackerContext *context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::COREPARAMETER); + ControllerCoreParameter( + QObject* parent = 0, + IBioTrackerContext* context = 0, + ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::COREPARAMETER); - //Triggers the view to re-send gui parameters + // Triggers the view to re-send gui parameters void triggerUpdate(); signals: - //... + //... - private slots: - //... - void updateView(); - //update track number - void receiveTrackNumber(int number); +private slots: + //... + void updateView(); + // update track number + void receiveTrackNumber(int number); - public slots: - void setCorePermission(std::pair permission); +public slots: + void setCorePermission(std::pair permission); void changeAreaDescriptorType(QString type); - void receiveResetTrial(); + void receiveResetTrial(); - //Forwarded from data exporter + // Forwarded from data exporter int getTrialNumber(); - // IController interface + // IController interface protected: - void createModel() override; - void createView() override; - void connectModelToController() override; - void connectControllerToController() override; -private: - //... + void createModel() override; + void createView() override; + void connectModelToController() override; + void connectControllerToController() override; +private: + //... }; diff --git a/Src/Controller/ControllerDataExporter.cpp b/Src/Controller/ControllerDataExporter.cpp index cf1d6095..e3d281f4 100644 --- a/Src/Controller/ControllerDataExporter.cpp +++ b/Src/Controller/ControllerDataExporter.cpp @@ -9,10 +9,12 @@ #include #include "QDesktopServices" -using namespace BioTrackerUtilsMisc; //split +using namespace BioTrackerUtilsMisc; // split -ControllerDataExporter::ControllerDataExporter(QObject *parent, IBioTrackerContext *context, ENUMS::CONTROLLERTYPE ctr) : - IControllerCfg(parent, context, ctr) +ControllerDataExporter::ControllerDataExporter(QObject* parent, + IBioTrackerContext* context, + ENUMS::CONTROLLERTYPE ctr) +: IControllerCfg(parent, context, ctr) { } @@ -20,71 +22,94 @@ ControllerDataExporter::~ControllerDataExporter() { } -void ControllerDataExporter::cleanup() { +void ControllerDataExporter::cleanup() +{ if (m_Model) - qobject_cast(m_Model)->finalize(); -} - -void ControllerDataExporter::connectControllerToController() { - //connect to controller commands - IController* ictrcmd = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::COMMANDS); - ControllerCommands *ctrcmd = static_cast(ictrcmd); - - QObject::connect(this, &ControllerDataExporter::emitResetUndoStack, ctrcmd, &ControllerCommands::receiveClear, Qt::DirectConnection); - - //connect to view controller - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); - ControllerTrackedComponentCore *tccController = dynamic_cast(ctr); - - QObject::connect(this, &ControllerDataExporter::emitViewUpdate, tccController, &ControllerTrackedComponentCore::receiveUpdateView, Qt::DirectConnection); - - - // ControllerPlayer* cPl = dynamic_cast(m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::PLAYER)); - // QObject::connect(cPl, &ControllerPlayer::emitNextMediaInBatch, this, &ControllerDataExporter::receiveReset, Qt::DirectConnection); + qobject_cast(m_Model)->finalize(); } -void ControllerDataExporter::createModel() { +void ControllerDataExporter::connectControllerToController() +{ + // connect to controller commands + IController* ictrcmd = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::COMMANDS); + ControllerCommands* ctrcmd = static_cast(ictrcmd); + + QObject::connect(this, + &ControllerDataExporter::emitResetUndoStack, + ctrcmd, + &ControllerCommands::receiveClear, + Qt::DirectConnection); + + // connect to view controller + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); + ControllerTrackedComponentCore* tccController = + dynamic_cast(ctr); + + QObject::connect(this, + &ControllerDataExporter::emitViewUpdate, + tccController, + &ControllerTrackedComponentCore::receiveUpdateView, + Qt::DirectConnection); + + // ControllerPlayer* cPl = + // dynamic_cast(m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::PLAYER)); + // QObject::connect(cPl, &ControllerPlayer::emitNextMediaInBatch, this, + // &ControllerDataExporter::receiveReset, Qt::DirectConnection); +} + +void ControllerDataExporter::createModel() +{ m_Model = nullptr; } -SourceVideoMetadata ControllerDataExporter::getSourceMetadata() { - IController* ctrM = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::PLAYER); - MediaPlayer* mplay = dynamic_cast(ctrM->getModel()); - SourceVideoMetadata d; - d.name = mplay->getCurrentFileName().toStdString(); - d.fps = std::to_string(mplay->getFpsOfSourceFile()); - d.fps = d.fps.erase(d.fps.find_last_not_of('0') + 1, std::string::npos); - return d; +SourceVideoMetadata ControllerDataExporter::getSourceMetadata() +{ + IController* ctrM = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::PLAYER); + MediaPlayer* mplay = dynamic_cast(ctrM->getModel()); + SourceVideoMetadata d; + d.name = mplay->getCurrentFileName().toStdString(); + d.fps = std::to_string(mplay->getFpsOfSourceFile()); + d.fps = d.fps.erase(d.fps.find_last_not_of('0') + 1, std::string::npos); + return d; } -void ControllerDataExporter::loadFile(std::string file) { +void ControllerDataExporter::loadFile(std::string file) +{ if (_factory) { qobject_cast(m_Model)->loadFile(file); - } - else { - std::cout << "Can not load tracks for this plugin as it does not provide a factory." << std::endl; + } else { + std::cout << "Can not load tracks for this plugin as it does not " + "provide a factory." + << std::endl; } } -void ControllerDataExporter::saveFile(std::string file) { +void ControllerDataExporter::saveFile(std::string file) +{ if (_factory) { qobject_cast(m_Model)->writeAll(file); - } - else { - std::cout << "Can not save tracks for this plugin as it does not provide a factory." << std::endl; + } else { + std::cout << "Can not save tracks for this plugin as it does not " + "provide a factory." + << std::endl; } } -void ControllerDataExporter::createView() { +void ControllerDataExporter::createView() +{ - m_View = 0; + m_View = 0; } -void ControllerDataExporter::setDataStructure(IModel* exp) { +void ControllerDataExporter::setDataStructure(IModel* exp) +{ if (getModel()) delete getModel(); - //Grab the codec from config file + // Grab the codec from config file std::string exporter = exporterList[_cfg->DataExporter]; if (exporter == "CSV") m_Model = new DataExporterCSV(this); @@ -95,26 +120,33 @@ void ControllerDataExporter::setDataStructure(IModel* exp) { else m_Model = nullptr; - qobject_cast(m_Model)->open(static_cast(exp)); + qobject_cast(m_Model)->open( + static_cast(exp)); IModelDataExporter* model; if ((model = dynamic_cast(getModel())) != nullptr) { - QObject::connect(model, &IModelDataExporter::fileWritten, this, &ControllerDataExporter::receiveFileWritten); + QObject::connect(model, + &IModelDataExporter::fileWritten, + this, + &ControllerDataExporter::receiveFileWritten); } - } -void ControllerDataExporter::setComponentFactory(IModelTrackedComponentFactory* exp) { - _factory = exp; +void ControllerDataExporter::setComponentFactory( + IModelTrackedComponentFactory* exp) +{ + _factory = exp; } -void ControllerDataExporter::receiveTrackingDone(uint frame) { +void ControllerDataExporter::receiveTrackingDone(uint frame) +{ if (getModel()) { dynamic_cast(getModel())->write(frame); } } -void ControllerDataExporter::receiveFinalizeExperiment() { +void ControllerDataExporter::receiveFinalizeExperiment() +{ if (getModel()) { emitResetUndoStack(); dynamic_cast(getModel())->finalizeAndReInit(); @@ -122,7 +154,8 @@ void ControllerDataExporter::receiveFinalizeExperiment() { } } -void ControllerDataExporter::receiveReset() { +void ControllerDataExporter::receiveReset() +{ if (getModel()) { emitResetUndoStack(); dynamic_cast(getModel())->finalizeAndReInit(); @@ -133,27 +166,39 @@ void ControllerDataExporter::receiveReset() { createModel(); } -void ControllerDataExporter::connectModelToController() { - IController* ctrM = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::PLAYER); - MediaPlayer* mplay = dynamic_cast(ctrM->getModel()); +void ControllerDataExporter::connectModelToController() +{ + IController* ctrM = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::PLAYER); + MediaPlayer* mplay = dynamic_cast(ctrM->getModel()); - QObject::connect(mplay, &MediaPlayer::fwdPlayerParameters, this, &ControllerDataExporter::rcvPlayerParameters); + QObject::connect(mplay, + &MediaPlayer::fwdPlayerParameters, + this, + &ControllerDataExporter::rcvPlayerParameters); } -void ControllerDataExporter::rcvPlayerParameters(std::shared_ptr parameters) { +void ControllerDataExporter::rcvPlayerParameters( + std::shared_ptr parameters) +{ if (qobject_cast(m_Model) != nullptr) { - qobject_cast(m_Model)->setFps(parameters->m_fpsSourceVideo); - qobject_cast(m_Model)->setTitle(parameters->m_CurrentTitle); + qobject_cast(m_Model)->setFps( + parameters->m_fpsSourceVideo); + qobject_cast(m_Model)->setTitle( + parameters->m_CurrentTitle); } } -int ControllerDataExporter::getNumber(bool trial) { - //Get all existing files of trial or track directory and parse highest export number - QString basePath = trial ? _cfg->DirTrials : _cfg->DirTracks; - QStringList allFiles = QDir(basePath).entryList(QDir::NoDotAndDotDot | QDir::Files); +int ControllerDataExporter::getNumber(bool trial) +{ + // Get all existing files of trial or track directory and parse highest + // export number + QString basePath = trial ? _cfg->DirTrials : _cfg->DirTracks; + QStringList allFiles = QDir(basePath).entryList(QDir::NoDotAndDotDot | + QDir::Files); int maxVal = 0; - foreach(QString s, allFiles) { + foreach (QString s, allFiles) { int val; if (sscanf(s.toStdString().c_str(), "Export_%d_*", &val) != EOF) { maxVal = std::max(maxVal, val); @@ -162,18 +207,20 @@ int ControllerDataExporter::getNumber(bool trial) { return maxVal; } -QString ControllerDataExporter::generateBasename(bool temporaryFile) { +QString ControllerDataExporter::generateBasename(bool temporaryFile) +{ - QString resultPath = (_trialStarted ?_cfg->DirTrials : _cfg->DirTracks); + QString resultPath = (_trialStarted ? _cfg->DirTrials : _cfg->DirTracks); - QString path = (temporaryFile ? _cfg->DirTemp : resultPath); - int maxVal = getNumber(_trialStarted ? true : false); - std::string current = "Export_"+std::to_string(maxVal+1)+"_"; + QString path = (temporaryFile ? _cfg->DirTemp : resultPath); + int maxVal = getNumber(_trialStarted ? true : false); + std::string current = "Export_" + std::to_string(maxVal + 1) + "_"; return QString(getTimeAndDate(path.toStdString() + current, "").c_str()); } -void ControllerDataExporter::receiveFileWritten(QFileInfo fname) { +void ControllerDataExporter::receiveFileWritten(QFileInfo fname) +{ QString str = "Exported file:\n"; str += fname.absoluteFilePath(); @@ -183,8 +230,10 @@ void ControllerDataExporter::receiveFileWritten(QFileInfo fname) { msgBox.setInformativeText(str); msgBox.setStandardButtons(QMessageBox::Ok); msgBox.setDefaultButton(QMessageBox::Ok); - QPushButton *goToFileDirButton = msgBox.addButton(tr("Show in folder"), QMessageBox::ActionRole); - QPushButton *openFileButton = msgBox.addButton(tr("Open file"), QMessageBox::ActionRole); + QPushButton* goToFileDirButton = msgBox.addButton(tr("Show in folder"), + QMessageBox::ActionRole); + QPushButton* openFileButton = msgBox.addButton(tr("Open file"), + QMessageBox::ActionRole); msgBox.setIcon(QMessageBox::Information); msgBox.exec(); @@ -192,16 +241,13 @@ void ControllerDataExporter::receiveFileWritten(QFileInfo fname) { if (msgBox.clickedButton() == goToFileDirButton) { QUrl fileDirUrl = QUrl::fromLocalFile(fname.absolutePath()); QDesktopServices::openUrl(fileDirUrl); - } - else if (msgBox.clickedButton() == openFileButton){ + } else if (msgBox.clickedButton() == openFileButton) { QUrl fileUrl = QUrl::fromLocalFile(fname.absoluteFilePath()); QDesktopServices::openUrl(fileUrl); } - } void ControllerDataExporter::receiveTrialStarted(bool started) { - _trialStarted = started; + _trialStarted = started; } - diff --git a/Src/Controller/ControllerDataExporter.h b/Src/Controller/ControllerDataExporter.h index 6dcfcc68..ab8499af 100644 --- a/Src/Controller/ControllerDataExporter.h +++ b/Src/Controller/ControllerDataExporter.h @@ -7,53 +7,61 @@ #include "QThread" #include "Model/MediaPlayer.h" -//POD class to bundle some infos -struct SourceVideoMetadata { - std::string name; - std::string fps; +// POD class to bundle some infos +struct SourceVideoMetadata +{ + std::string name; + std::string fps; }; -class ControllerDataExporter : public IControllerCfg { - Q_OBJECT +class ControllerDataExporter : public IControllerCfg +{ + Q_OBJECT public: - ControllerDataExporter(QObject* parent = 0, IBioTrackerContext* context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); - ~ControllerDataExporter(); + ControllerDataExporter( + QObject* parent = 0, + IBioTrackerContext* context = 0, + ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); + ~ControllerDataExporter(); void cleanup(); - // IController interface + // IController interface public: - void connectControllerToController() override; - void setDataStructure(IModel* exp); - void setComponentFactory(IModelTrackedComponentFactory* exp); - IModelTrackedComponentFactory* getComponentFactory() { return _factory; }; - SourceVideoMetadata getSourceMetadata(); - int getNumber(bool trial); - QString generateBasename(bool temporaryFile); + void connectControllerToController() override; + void setDataStructure(IModel* exp); + void setComponentFactory(IModelTrackedComponentFactory* exp); + IModelTrackedComponentFactory* getComponentFactory() + { + return _factory; + }; + SourceVideoMetadata getSourceMetadata(); + int getNumber(bool trial); + QString generateBasename(bool temporaryFile); void loadFile(std::string file); void saveFile(std::string file); Q_SIGNALS: - void emitResetUndoStack(); - void emitViewUpdate(); + void emitResetUndoStack(); + void emitViewUpdate(); - public Q_SLOTS: +public Q_SLOTS: void receiveReset(); - void receiveTrackingDone(uint frame); + void receiveTrackingDone(uint frame); void receiveFinalizeExperiment(); void receiveFileWritten(QFileInfo fname); - void receiveTrialStarted(bool started); + void receiveTrialStarted(bool started); protected: - void createModel() override; - void createView() override; - void connectModelToController() override; + void createModel() override; + void createView() override; + void connectModelToController() override; private Q_SLOTS: - void rcvPlayerParameters(std::shared_ptr parameters); + void rcvPlayerParameters( + std::shared_ptr parameters); private: - IModelTrackedComponentFactory* _factory; - bool _trialStarted = false; + IModelTrackedComponentFactory* _factory; + bool _trialStarted = false; }; - diff --git a/Src/Controller/ControllerGraphicScene.cpp b/Src/Controller/ControllerGraphicScene.cpp index e2e133af..720956ea 100644 --- a/Src/Controller/ControllerGraphicScene.cpp +++ b/Src/Controller/ControllerGraphicScene.cpp @@ -4,22 +4,24 @@ #include "Model/null_Model.h" #include "View/MainWindow.h" -ControllerGraphicScene::ControllerGraphicScene(QObject *parent, IBioTrackerContext *context, ENUMS::CONTROLLERTYPE ctr) : - IControllerCfg(parent, context, ctr) +ControllerGraphicScene::ControllerGraphicScene(QObject* parent, + IBioTrackerContext* context, + ENUMS::CONTROLLERTYPE ctr) +: IControllerCfg(parent, context, ctr) { - m_Element = NULL; - m_GraphicsView = NULL; + m_Element = NULL; + m_GraphicsView = NULL; } -void ControllerGraphicScene::addGraphicsItem(QGraphicsItem *item) +void ControllerGraphicScene::addGraphicsItem(QGraphicsItem* item) { - GraphicsView *gview = dynamic_cast (m_View); + GraphicsView* gview = dynamic_cast(m_View); gview->addGraphicsItem(item); } -void ControllerGraphicScene::addTextureObject(QGraphicsItem *item) +void ControllerGraphicScene::addTextureObject(QGraphicsItem* item) { - GraphicsView *gview = dynamic_cast (m_View); + GraphicsView* gview = dynamic_cast(m_View); gview->addPixmapItem(item); } @@ -35,16 +37,21 @@ void ControllerGraphicScene::createView() void ControllerGraphicScene::connectModelToController() { - QObject::connect(this, &ControllerGraphicScene::signalToggleAntialiasingFull, dynamic_cast(m_View), &GraphicsView::receiveToggleAntialiasingFull); + QObject::connect(this, + &ControllerGraphicScene::signalToggleAntialiasingFull, + dynamic_cast(m_View), + &GraphicsView::receiveToggleAntialiasingFull); } void ControllerGraphicScene::connectControllerToController() { - IController * ctrM = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::MAINWINDOW); - QPointer< MainWindow > mainWin = dynamic_cast(ctrM->getView()); - mainWin->addVideoView(m_View); + IController* ctrM = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::MAINWINDOW); + QPointer mainWin = dynamic_cast(ctrM->getView()); + mainWin->addVideoView(m_View); } -void ControllerGraphicScene::receiveToggleAntialiasingFull(bool toggle) { - signalToggleAntialiasingFull(toggle); +void ControllerGraphicScene::receiveToggleAntialiasingFull(bool toggle) +{ + signalToggleAntialiasingFull(toggle); } \ No newline at end of file diff --git a/Src/Controller/ControllerGraphicScene.h b/Src/Controller/ControllerGraphicScene.h index 75b9d003..c0f2816a 100644 --- a/Src/Controller/ControllerGraphicScene.h +++ b/Src/Controller/ControllerGraphicScene.h @@ -1,9 +1,9 @@ /**************************************************************************** - ** - ** This file is part of the BioTracker Framework - ** by Andreas Jörg - ** - ****************************************************************************/ + ** + ** This file is part of the BioTracker Framework + ** by Andreas Jörg + ** + ****************************************************************************/ #ifndef CONTROLLERGRAPHICSCENE_H #define CONTROLLERGRAPHICSCENE_H @@ -13,45 +13,54 @@ #include "QPointer" /** - * The ControllerGraphicScene class controlls the component for rendering TextureObjects and TrackedComponents on a GraphhicsView. - * Each PixmapItem represents a cv::Mat. The cv::Mat comes from the TextureObjects-Component of BioTracker. - * The GraphicsItem represents the compositum structure of IViewTrackedComponent classes. These structure comes from the ControllerTrackedComponentCore or the Plugin and handed over by the PluginController of the MainApplication. + * The ControllerGraphicScene class controlls the component for rendering + * TextureObjects and TrackedComponents on a GraphhicsView. Each PixmapItem + * represents a cv::Mat. The cv::Mat comes from the TextureObjects-Component of + * BioTracker. The GraphicsItem represents the compositum structure of + * IViewTrackedComponent classes. These structure comes from the + * ControllerTrackedComponentCore or the Plugin and handed over by the + * PluginController of the MainApplication. * */ -class ControllerGraphicScene : public IControllerCfg { +class ControllerGraphicScene : public IControllerCfg +{ Q_OBJECT - public: - ControllerGraphicScene(QObject* parent = 0, IBioTrackerContext* context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); +public: + ControllerGraphicScene( + QObject* parent = 0, + IBioTrackerContext* context = 0, + ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); /** - * This methode add a the root node of the compositum structure of IViewTrackedComponent classes to the GraphicsView canvas. - * All child nodes will be rendered on a GraphicsView canvas as well. + * This methode add a the root node of the compositum structure of + * IViewTrackedComponent classes to the GraphicsView canvas. All child + * nodes will be rendered on a GraphicsView canvas as well. */ void addGraphicsItem(QGraphicsItem* item); /** - * This methode adds a IViewGraphicsPixmapItem to the GraphicsView canvas for rendering. + * This methode adds a IViewGraphicsPixmapItem to the GraphicsView canvas + * for rendering. */ - void addTextureObject(QGraphicsItem* item); + void addTextureObject(QGraphicsItem* item); - signals: - void signalToggleAntialiasingFull(bool toggle); - - public slots: - void receiveToggleAntialiasingFull(bool toggle); +signals: + void signalToggleAntialiasingFull(bool toggle); + +public slots: + void receiveToggleAntialiasingFull(bool toggle); // IController interface - protected: +protected: void createModel() override; void createView() override; void connectModelToController() override; void connectControllerToController() override; - private: - +private: IView* m_GraphicsView; - IModel* m_Element; - QPointer< IModel > m_NullModel; + IModel* m_Element; + QPointer m_NullModel; }; #endif // CONTROLLERGRAPHICSCENE_H diff --git a/Src/Controller/ControllerMainWindow.cpp b/Src/Controller/ControllerMainWindow.cpp index 2d03f366..6aa581da 100644 --- a/Src/Controller/ControllerMainWindow.cpp +++ b/Src/Controller/ControllerMainWindow.cpp @@ -19,107 +19,131 @@ #include #include - -ControllerMainWindow::ControllerMainWindow(QObject* parent, IBioTrackerContext* context, ENUMS::CONTROLLERTYPE ctr) : - IControllerCfg(parent, context, ctr) { - +ControllerMainWindow::ControllerMainWindow(QObject* parent, + IBioTrackerContext* context, + ENUMS::CONTROLLERTYPE ctr) +: IControllerCfg(parent, context, ctr) +{ } -void ControllerMainWindow::loadVideo(std::vector files) { +void ControllerMainWindow::loadVideo( + std::vector files) +{ - Q_EMIT emitOnLoadMedia(files.front().string()); - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::PLAYER); + Q_EMIT emitOnLoadMedia(files.front().string()); + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::PLAYER); qobject_cast(ctr)->loadVideoStream(files); Q_EMIT emitMediaLoaded(files.front().string()); - + dynamic_cast(m_View)->checkMediaGroupBox(); } -void ControllerMainWindow::loadTracker(QString plugin) { +void ControllerMainWindow::loadTracker(QString plugin) +{ Q_EMIT emitOnLoadPlugin(plugin.toStdString()); dynamic_cast(m_View)->resetTrackerViews(); - qobject_cast(m_BioTrackerContext)->loadBioTrackerPlugin(plugin); + qobject_cast(m_BioTrackerContext) + ->loadBioTrackerPlugin(plugin); dynamic_cast(m_View)->checkTrackerGroupBox(); activeTrackingCheckBox(); Q_EMIT emitPluginLoaded(plugin.toStdString()); } -void ControllerMainWindow::loadPictures(std::vector files) { +void ControllerMainWindow::loadPictures( + std::vector files) +{ std::string str = files.empty() ? "" : files.front().string(); - - Q_EMIT emitOnLoadMedia(str); - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::PLAYER); + + Q_EMIT emitOnLoadMedia(str); + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::PLAYER); qobject_cast(ctr)->loadPictures(files); Q_EMIT emitMediaLoaded(str); dynamic_cast(m_View)->checkMediaGroupBox(); } -void ControllerMainWindow::loadCameraDevice(CameraConfiguration conf) { - Q_EMIT emitOnLoadMedia("::Camera"); - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::PLAYER); +void ControllerMainWindow::loadCameraDevice(CameraConfiguration conf) +{ + Q_EMIT emitOnLoadMedia("::Camera"); + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::PLAYER); qobject_cast(ctr)->loadCameraDevice(conf); Q_EMIT emitMediaLoaded("::Camera"); dynamic_cast(m_View)->checkMediaGroupBox(); } -void ControllerMainWindow::activeTracking() { - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::PLAYER); +void ControllerMainWindow::activeTracking() +{ + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::PLAYER); qobject_cast(ctr)->setTrackingActivated(); dynamic_cast(m_View)->activateTracking(); } -void ControllerMainWindow::deactiveTrackring() { - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::PLAYER); +void ControllerMainWindow::deactiveTrackring() +{ + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::PLAYER); qobject_cast(ctr)->setTrackingDeactivated(); dynamic_cast(m_View)->deactivateTracking(); } -void ControllerMainWindow::setTrackerList(QStringListModel* trackerList, QString current) { +void ControllerMainWindow::setTrackerList(QStringListModel* trackerList, + QString current) +{ dynamic_cast(m_View)->setTrackerList(trackerList, current); } -void ControllerMainWindow::setTrackerParamterWidget(IView* widget) { +void ControllerMainWindow::setTrackerParamterWidget(IView* widget) +{ dynamic_cast(m_View)->addTrackerParameterView(widget); } -void ControllerMainWindow::setTrackerElementsWidget(IView *widget) +void ControllerMainWindow::setTrackerElementsWidget(IView* widget) { - dynamic_cast(m_View)->addTrackerElementsView(widget); + dynamic_cast(m_View)->addTrackerElementsView(widget); } -void ControllerMainWindow::setCoreElementsWidget(IView * widget) +void ControllerMainWindow::setCoreElementsWidget(IView* widget) { - dynamic_cast(m_View)->addCoreElementsView(widget); + dynamic_cast(m_View)->addCoreElementsView(widget); } void ControllerMainWindow::setNotificationBrowserWidget(IView* widget) { - dynamic_cast(m_View)->addNotificationBrowser(widget); + dynamic_cast(m_View)->addNotificationBrowser(widget); } - -void ControllerMainWindow::loadTrajectoryFile(std::string file) { - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::DATAEXPORT); +void ControllerMainWindow::loadTrajectoryFile(std::string file) +{ + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::DATAEXPORT); static_cast(ctr)->loadFile(file); Q_EMIT emitTrackLoaded(file); } -void ControllerMainWindow::saveTrajectoryFile(std::string file) { - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::DATAEXPORT); +void ControllerMainWindow::saveTrajectoryFile(std::string file) +{ + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::DATAEXPORT); static_cast(ctr)->saveFile(file); } -void ControllerMainWindow::deactiveTrackingCheckBox() { +void ControllerMainWindow::deactiveTrackingCheckBox() +{ dynamic_cast(m_View)->deactivateTrackingCheckBox(); } -void ControllerMainWindow::activeTrackingCheckBox() { +void ControllerMainWindow::activeTrackingCheckBox() +{ dynamic_cast(m_View)->activeTrackingCheckBox(); } -void ControllerMainWindow::receiveSaveTrajData(){ +void ControllerMainWindow::receiveSaveTrajData() +{ dynamic_cast(m_View)->saveDataToFile(); } @@ -129,116 +153,242 @@ void ControllerMainWindow::createModel() m_Model = new null_Model(); } -void ControllerMainWindow::createView() { - m_View = dynamic_cast (new MainWindow(0, this, m_Model)); +void ControllerMainWindow::createView() +{ + m_View = dynamic_cast(new MainWindow(0, this, m_Model)); static_cast(m_View)->show(); } -void ControllerMainWindow::connectModelToController() { +void ControllerMainWindow::connectModelToController() +{ + + MainWindow* mw = dynamic_cast(m_View); + QObject::connect(mw, + &MainWindow::selectPlugin, + this, + &ControllerMainWindow::rcvSelectPlugin); - MainWindow *mw = dynamic_cast (m_View); - QObject::connect(mw, &MainWindow::selectPlugin, this, &ControllerMainWindow::rcvSelectPlugin); - // Prepare annotations and serialize existing ones. - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::ANNOTATIONS); - ControllerAnnotations *annotationController = static_cast(ctr); - QObject::connect(this, &ControllerMainWindow::emitMediaLoaded, annotationController, &ControllerAnnotations::reset, Qt::DirectConnection); + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::ANNOTATIONS); + ControllerAnnotations* annotationController = + static_cast(ctr); + QObject::connect(this, + &ControllerMainWindow::emitMediaLoaded, + annotationController, + &ControllerAnnotations::reset, + Qt::DirectConnection); // Write previously written data structure and reset it - IController* ctr2 = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::DATAEXPORT); - ControllerDataExporter *contrl = static_cast(ctr2); - QObject::connect(this, &ControllerMainWindow::emitOnLoadMedia, contrl, &ControllerDataExporter::receiveFinalizeExperiment, Qt::DirectConnection); - QObject::connect(this, &ControllerMainWindow::emitOnLoadPlugin, contrl, &ControllerDataExporter::receiveReset, Qt::DirectConnection); + IController* ctr2 = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::DATAEXPORT); + ControllerDataExporter* contrl = static_cast( + ctr2); + QObject::connect(this, + &ControllerMainWindow::emitOnLoadMedia, + contrl, + &ControllerDataExporter::receiveFinalizeExperiment, + Qt::DirectConnection); + QObject::connect(this, + &ControllerMainWindow::emitOnLoadPlugin, + contrl, + &ControllerDataExporter::receiveReset, + Qt::DirectConnection); } -void ControllerMainWindow::connectControllerToController() { - // - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::COREPARAMETER); - IView* v = ctr->getView(); - dynamic_cast(m_View)->addCoreParameterView(v); - - //connect to controller commands - IController* ictrcmd = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::COMMANDS); - ControllerCommands *ctrcmd = static_cast(ictrcmd); - - QObject::connect(this, &ControllerMainWindow::emitUndoCommand, ctrcmd, &ControllerCommands::receiveUndo, Qt::DirectConnection); - QObject::connect(this, &ControllerMainWindow::emitRedoCommand, ctrcmd, &ControllerCommands::receiveRedo, Qt::DirectConnection); - QObject::connect(this, &ControllerMainWindow::emitOnLoadMedia, ctrcmd, &ControllerCommands::receiveClear, Qt::DirectConnection); - QObject::connect(this, &ControllerMainWindow::emitOnLoadPlugin, ctrcmd, &ControllerCommands::receiveClear, Qt::DirectConnection); - QObject::connect(this, &ControllerMainWindow::emitShowActionListCommand, ctrcmd, &ControllerCommands::receiveShowActionList, Qt::DirectConnection); - - //connect to ControllerGraphicScene - IController* ictrgrv = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::GRAPHICSVIEW); - ControllerGraphicScene *ctrgrv = static_cast(ictrgrv); - GraphicsView* grv = static_cast(ctrgrv->getView()); - - QObject::connect(grv, &GraphicsView::emitCursorPosition, this, &ControllerMainWindow::receiveCursorPosition, Qt::QueuedConnection); - - //connect to ControllerTrackedComponentCore - IController* ictrtrcc = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); - ControllerTrackedComponentCore *ctrtrcc = static_cast(ictrtrcc); - - QObject::connect(this, &ControllerMainWindow::emitAddTrack, ctrtrcc, &ControllerTrackedComponentCore::emitAddTrack, Qt::DirectConnection); - QObject::connect(this, &ControllerMainWindow::emitDeleteSelectedTracks, ctrtrcc, &ControllerTrackedComponentCore::emitDeleteSelectedTracks, Qt::DirectConnection); - QObject::connect(this, &ControllerMainWindow::emitSelectAll, ctrtrcc, &ControllerTrackedComponentCore::emitSelectAll, Qt::DirectConnection); - QObject::connect(this, &ControllerMainWindow::emitSwapIds, ctrtrcc, &ControllerTrackedComponentCore::emitSwapIdsToView, Qt::DirectConnection); - QObject::connect(this, &ControllerMainWindow::emitChangeColorBorder, ctrtrcc, &ControllerTrackedComponentCore::emitChangeColorBorder, Qt::DirectConnection); - QObject::connect(this, &ControllerMainWindow::emitChangeColorFill, ctrtrcc, &ControllerTrackedComponentCore::emitChangeColorFill, Qt::DirectConnection); - - //connect to ControllerAnnotations - IController* ictrann = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::ANNOTATIONS); - ControllerAnnotations *ctrann = static_cast(ictrann); - - QObject::connect(this, &ControllerMainWindow::emitAddLabelAnno, ctrann, &ControllerAnnotations::receiveAddLabelAnnotation, Qt::DirectConnection); - QObject::connect(this, &ControllerMainWindow::emitAddRectAnno, ctrann, &ControllerAnnotations::receiveAddRectAnnotation, Qt::DirectConnection); - QObject::connect(this, &ControllerMainWindow::emitAddArrAnno, ctrann, &ControllerAnnotations::receiveAddArrowAnnotation, Qt::DirectConnection); - QObject::connect(this, &ControllerMainWindow::emitAddEllAnno, ctrann, &ControllerAnnotations::receiveAddEllipseAnnotation, Qt::DirectConnection); - QObject::connect(this, &ControllerMainWindow::emitDelSelAnno, ctrann, &ControllerAnnotations::receiveDeleteSelectedAnnotation, Qt::DirectConnection); - - //connect to ControllerDataExporter - IController* ictrde = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::DATAEXPORT); - ControllerDataExporter *deController = static_cast(ictrde); - QObject::connect(this, &ControllerMainWindow::emitFinalizeExperiment, deController, &ControllerDataExporter::receiveFinalizeExperiment, Qt::DirectConnection); - - // reset trials - IController* ictrcpv = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::COREPARAMETER); - ControllerCoreParameter *ctrcpv = static_cast(ictrcpv); - QObject::connect(this, &ControllerMainWindow::emitOnLoadMedia, ctrcpv, &ControllerCoreParameter::receiveResetTrial, Qt::DirectConnection); - QObject::connect(this, &ControllerMainWindow::emitOnLoadPlugin, ctrcpv, &ControllerCoreParameter::receiveResetTrial, Qt::DirectConnection); +void ControllerMainWindow::connectControllerToController() +{ + // + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::COREPARAMETER); + IView* v = ctr->getView(); + dynamic_cast(m_View)->addCoreParameterView(v); + + // connect to controller commands + IController* ictrcmd = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::COMMANDS); + ControllerCommands* ctrcmd = static_cast(ictrcmd); + + QObject::connect(this, + &ControllerMainWindow::emitUndoCommand, + ctrcmd, + &ControllerCommands::receiveUndo, + Qt::DirectConnection); + QObject::connect(this, + &ControllerMainWindow::emitRedoCommand, + ctrcmd, + &ControllerCommands::receiveRedo, + Qt::DirectConnection); + QObject::connect(this, + &ControllerMainWindow::emitOnLoadMedia, + ctrcmd, + &ControllerCommands::receiveClear, + Qt::DirectConnection); + QObject::connect(this, + &ControllerMainWindow::emitOnLoadPlugin, + ctrcmd, + &ControllerCommands::receiveClear, + Qt::DirectConnection); + QObject::connect(this, + &ControllerMainWindow::emitShowActionListCommand, + ctrcmd, + &ControllerCommands::receiveShowActionList, + Qt::DirectConnection); + + // connect to ControllerGraphicScene + IController* ictrgrv = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::GRAPHICSVIEW); + ControllerGraphicScene* ctrgrv = static_cast( + ictrgrv); + GraphicsView* grv = static_cast(ctrgrv->getView()); + + QObject::connect(grv, + &GraphicsView::emitCursorPosition, + this, + &ControllerMainWindow::receiveCursorPosition, + Qt::QueuedConnection); + + // connect to ControllerTrackedComponentCore + IController* ictrtrcc = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); + ControllerTrackedComponentCore* ctrtrcc = + static_cast(ictrtrcc); + + QObject::connect(this, + &ControllerMainWindow::emitAddTrack, + ctrtrcc, + &ControllerTrackedComponentCore::emitAddTrack, + Qt::DirectConnection); + QObject::connect(this, + &ControllerMainWindow::emitDeleteSelectedTracks, + ctrtrcc, + &ControllerTrackedComponentCore::emitDeleteSelectedTracks, + Qt::DirectConnection); + QObject::connect(this, + &ControllerMainWindow::emitSelectAll, + ctrtrcc, + &ControllerTrackedComponentCore::emitSelectAll, + Qt::DirectConnection); + QObject::connect(this, + &ControllerMainWindow::emitSwapIds, + ctrtrcc, + &ControllerTrackedComponentCore::emitSwapIdsToView, + Qt::DirectConnection); + QObject::connect(this, + &ControllerMainWindow::emitChangeColorBorder, + ctrtrcc, + &ControllerTrackedComponentCore::emitChangeColorBorder, + Qt::DirectConnection); + QObject::connect(this, + &ControllerMainWindow::emitChangeColorFill, + ctrtrcc, + &ControllerTrackedComponentCore::emitChangeColorFill, + Qt::DirectConnection); + + // connect to ControllerAnnotations + IController* ictrann = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::ANNOTATIONS); + ControllerAnnotations* ctrann = static_cast( + ictrann); + + QObject::connect(this, + &ControllerMainWindow::emitAddLabelAnno, + ctrann, + &ControllerAnnotations::receiveAddLabelAnnotation, + Qt::DirectConnection); + QObject::connect(this, + &ControllerMainWindow::emitAddRectAnno, + ctrann, + &ControllerAnnotations::receiveAddRectAnnotation, + Qt::DirectConnection); + QObject::connect(this, + &ControllerMainWindow::emitAddArrAnno, + ctrann, + &ControllerAnnotations::receiveAddArrowAnnotation, + Qt::DirectConnection); + QObject::connect(this, + &ControllerMainWindow::emitAddEllAnno, + ctrann, + &ControllerAnnotations::receiveAddEllipseAnnotation, + Qt::DirectConnection); + QObject::connect(this, + &ControllerMainWindow::emitDelSelAnno, + ctrann, + &ControllerAnnotations::receiveDeleteSelectedAnnotation, + Qt::DirectConnection); + + // connect to ControllerDataExporter + IController* ictrde = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::DATAEXPORT); + ControllerDataExporter* deController = + static_cast(ictrde); + QObject::connect(this, + &ControllerMainWindow::emitFinalizeExperiment, + deController, + &ControllerDataExporter::receiveFinalizeExperiment, + Qt::DirectConnection); + + // reset trials + IController* ictrcpv = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::COREPARAMETER); + ControllerCoreParameter* ctrcpv = static_cast( + ictrcpv); + QObject::connect(this, + &ControllerMainWindow::emitOnLoadMedia, + ctrcpv, + &ControllerCoreParameter::receiveResetTrial, + Qt::DirectConnection); + QObject::connect(this, + &ControllerMainWindow::emitOnLoadPlugin, + ctrcpv, + &ControllerCoreParameter::receiveResetTrial, + Qt::DirectConnection); // batch media signals - IController* ctr3 = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::PLAYER); - ControllerPlayer *cont3 = static_cast(ctr3); - QObject::connect(cont3, &ControllerPlayer::emitNextMediaInBatch, this, &ControllerMainWindow::emitOnLoadMedia, Qt::DirectConnection); - QObject::connect(cont3, &ControllerPlayer::emitNextMediaInBatchLoaded, this, &ControllerMainWindow::emitMediaLoaded, Qt::DirectConnection); - - //Load video as per CLI - if (!_cfg->LoadVideo.isEmpty()) - loadVideo({ _cfg->LoadVideo.toStdString().c_str() }); + IController* ctr3 = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::PLAYER); + ControllerPlayer* cont3 = static_cast(ctr3); + QObject::connect(cont3, + &ControllerPlayer::emitNextMediaInBatch, + this, + &ControllerMainWindow::emitOnLoadMedia, + Qt::DirectConnection); + QObject::connect(cont3, + &ControllerPlayer::emitNextMediaInBatchLoaded, + this, + &ControllerMainWindow::emitMediaLoaded, + Qt::DirectConnection); + + // Load video as per CLI + if (!_cfg->LoadVideo.isEmpty()) + loadVideo({_cfg->LoadVideo.toStdString().c_str()}); } void ControllerMainWindow::receiveCursorPosition(QPoint pos) { - //qDebug() << pos; - dynamic_cast(m_View)->setCursorPositionLabel(pos); + // qDebug() << pos; + dynamic_cast(m_View)->setCursorPositionLabel(pos); } -void ControllerMainWindow::setCorePermission(std::pair permission){ - if( dynamic_cast(m_View)){ +void ControllerMainWindow::setCorePermission( + std::pair permission) +{ + if (dynamic_cast(m_View)) { dynamic_cast(m_View)->setCorePermission(permission); - } - else{ + } else { assert(false); } } -void ControllerMainWindow::rcvSelectPlugin(QString plugin) { +void ControllerMainWindow::rcvSelectPlugin(QString plugin) +{ Q_EMIT emitOnLoadPlugin(plugin.toStdString()); dynamic_cast(m_View)->resetTrackerViews(); - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::PLUGIN); - qobject_cast(ctr)->selectPlugin(plugin); - //dynamic_cast(m_View)->activeTrackingCheckBox(); - activeTrackingCheckBox(); + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::PLUGIN); + qobject_cast(ctr)->selectPlugin(plugin); + // dynamic_cast(m_View)->activeTrackingCheckBox(); + activeTrackingCheckBox(); Q_EMIT emitPluginLoaded(plugin.toStdString()); } @@ -247,10 +397,11 @@ void ControllerMainWindow::onNewMediumLoaded(const std::string path) Q_EMIT emitMediaLoaded(path); } -void ControllerMainWindow::exit() { - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::PLAYER); - ControllerPlayer *pc = static_cast(ctr); +void ControllerMainWindow::exit() +{ + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::PLAYER); + ControllerPlayer* pc = static_cast(ctr); pc->stop(); - delete m_BioTrackerContext; + delete m_BioTrackerContext; } - diff --git a/Src/Controller/ControllerMainWindow.h b/Src/Controller/ControllerMainWindow.h index f4cd8c01..4f998170 100644 --- a/Src/Controller/ControllerMainWindow.h +++ b/Src/Controller/ControllerMainWindow.h @@ -1,9 +1,9 @@ /**************************************************************************** - ** - ** This file is part of the BioTracker Framework - ** by Andreas Jörg - ** - ****************************************************************************/ + ** + ** This file is part of the BioTracker Framework + ** by Andreas Jörg + ** + ****************************************************************************/ #ifndef CONTROLLERMAINWINDOW_H #define CONTROLLERMAINWINDOW_H @@ -16,118 +16,140 @@ #include "util/types.h" #include "util/camera/base.h" - /** - * The ControllerMainWindow class controlls the IView class MainWindow. - * All user interactions done through the MainWindow class are delegated to the controllers of the component that concerns them. - * Other components can place their IView Widgets on the MainWindow. - */ -class ControllerMainWindow : public IControllerCfg { - Q_OBJECT +/** + * The ControllerMainWindow class controlls the IView class MainWindow. + * All user interactions done through the MainWindow class are delegated to the + * controllers of the component that concerns them. Other components can place + * their IView Widgets on the MainWindow. + */ +class ControllerMainWindow : public IControllerCfg +{ + Q_OBJECT public: - ControllerMainWindow(QObject* parent = 0, IBioTrackerContext* context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); - - /** - * Receives the a string containing the video file path from the MainWindow class. The string is then given to the ControllerPlayer class of the MediaPlayer-Component. - */ - void loadVideo(std::vector files); - /** - * Receives the a string containing the Plugin file path from the MainWindow class. The string is then given to the BioTrackerContext class which will hand it over to the ControllerPlugin class. - */ - void loadTracker(QString str); - /** - * Receives the a string containing the pictures file path from the MainWindow class. The string is then given to the ControllerPlayer class of the MediaPlayer-Component. - */ - void loadPictures(std::vector files); - /** - * Receives the a string containing the camera device number from the MainWindow class. The string is then given to the ControllerPlayer class of the MediaPlayer-Component. - */ - void loadCameraDevice(CameraConfiguration conf); - /** - * Receives a QStringListModel with the names of all currently loades BioTracker Plugins from the ControllerPlugin class. - */ - void setTrackerList(QStringListModel* trackerList, QString current); - /** - * Embeds the Parameter Widget devined in the BioTracker Plugins into the MainWindow Widget. - */ - void setTrackerParamterWidget(IView* widget); - /** - * Embeds the view for visualization of tracking data devined in the BioTracker Plugins into the MainWindow Widget. - */ - void setTrackerElementsWidget(IView *widget); - /** - * Embeds the view for visualization of tracking data from the core app into the MainWindow Widget. - */ - void setCoreElementsWidget(IView* widget); - /** - * Embeds the the notification view of the core app into the MainWindow Widget. - */ - void setNotificationBrowserWidget(IView * widget); - - void loadTrajectoryFile(std::string file); - void saveTrajectoryFile(std::string file); - - void deactiveTrackingCheckBox(); - void activeTrackingCheckBox(); - - //Passes exit command to the GUI context - void exit(); + ControllerMainWindow( + QObject* parent = 0, + IBioTrackerContext* context = 0, + ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); + + /** + * Receives the a string containing the video file path from the MainWindow + * class. The string is then given to the ControllerPlayer class of the + * MediaPlayer-Component. + */ + void loadVideo(std::vector files); + /** + * Receives the a string containing the Plugin file path from the + * MainWindow class. The string is then given to the BioTrackerContext + * class which will hand it over to the ControllerPlugin class. + */ + void loadTracker(QString str); + /** + * Receives the a string containing the pictures file path from the + * MainWindow class. The string is then given to the ControllerPlayer class + * of the MediaPlayer-Component. + */ + void loadPictures(std::vector files); + /** + * Receives the a string containing the camera device number from the + * MainWindow class. The string is then given to the ControllerPlayer class + * of the MediaPlayer-Component. + */ + void loadCameraDevice(CameraConfiguration conf); + /** + * Receives a QStringListModel with the names of all currently loades + * BioTracker Plugins from the ControllerPlugin class. + */ + void setTrackerList(QStringListModel* trackerList, QString current); + /** + * Embeds the Parameter Widget devined in the BioTracker Plugins into the + * MainWindow Widget. + */ + void setTrackerParamterWidget(IView* widget); + /** + * Embeds the view for visualization of tracking data devined in the + * BioTracker Plugins into the MainWindow Widget. + */ + void setTrackerElementsWidget(IView* widget); + /** + * Embeds the view for visualization of tracking data from the core app + * into the MainWindow Widget. + */ + void setCoreElementsWidget(IView* widget); + /** + * Embeds the the notification view of the core app into the MainWindow + * Widget. + */ + void setNotificationBrowserWidget(IView* widget); + + void loadTrajectoryFile(std::string file); + void saveTrajectoryFile(std::string file); + + void deactiveTrackingCheckBox(); + void activeTrackingCheckBox(); + + // Passes exit command to the GUI context + void exit(); public: - signals : - void emitFinalizeExperiment(); - - void emitOnLoadPlugin(const std::string path); - void emitOnLoadMedia(const std::string path); - - void emitPluginLoaded(const std::string path); - void emitMediaLoaded(const std::string path); - void emitTrackLoaded(const std::string path); - - void emitUndoCommand(); - void emitRedoCommand(); - void emitClearUndoStack(); - void emitShowActionListCommand(); - - //view toolbar actions - void emitAddTrack(); - void emitDeleteSelectedTracks(); - void emitSwapIds(); - void emitSelectAll(); - void emitChangeColorBorder(); - void emitChangeColorFill(); - void emitAddLabelAnno(); - void emitAddRectAnno(); - void emitAddArrAnno(); - void emitAddEllAnno(); - void emitDelSelAnno(); - - public slots: - void setCorePermission(std::pair permission); - /** - * Receives the command for activating the Tracking in a BioTracker Plugin from the MainWindow class. This command is given to the ControllerPlayer class of the MediaPlayer-component. - */ - void activeTracking(); - /** - * Receives the command for deactivating the Tracking in a BioTracker Plugin from the MainWindow class. This command is given to the ControllerPlayer class of the MediaPlayer-component. - */ - void deactiveTrackring(); - - void receiveSaveTrajData(); - - // IController interface +signals: + void emitFinalizeExperiment(); + + void emitOnLoadPlugin(const std::string path); + void emitOnLoadMedia(const std::string path); + + void emitPluginLoaded(const std::string path); + void emitMediaLoaded(const std::string path); + void emitTrackLoaded(const std::string path); + + void emitUndoCommand(); + void emitRedoCommand(); + void emitClearUndoStack(); + void emitShowActionListCommand(); + + // view toolbar actions + void emitAddTrack(); + void emitDeleteSelectedTracks(); + void emitSwapIds(); + void emitSelectAll(); + void emitChangeColorBorder(); + void emitChangeColorFill(); + void emitAddLabelAnno(); + void emitAddRectAnno(); + void emitAddArrAnno(); + void emitAddEllAnno(); + void emitDelSelAnno(); + +public slots: + void setCorePermission(std::pair permission); + /** + * Receives the command for activating the Tracking in a BioTracker Plugin + * from the MainWindow class. This command is given to the ControllerPlayer + * class of the MediaPlayer-component. + */ + void activeTracking(); + /** + * Receives the command for deactivating the Tracking in a BioTracker + * Plugin from the MainWindow class. This command is given to the + * ControllerPlayer class of the MediaPlayer-component. + */ + void deactiveTrackring(); + + void receiveSaveTrajData(); + + // IController interface protected: - void createModel() override; - void createView() override; - void connectModelToController() override; - void connectControllerToController() override; + void createModel() override; + void createView() override; + void connectModelToController() override; + void connectControllerToController() override; - private slots: - void rcvSelectPlugin(QString plugin); - void receiveCursorPosition(QPoint pos); +private slots: + void rcvSelectPlugin(QString plugin); + void receiveCursorPosition(QPoint pos); private: - // Internal cleanup callback when a new video or imagestream is loaded. - void onNewMediumLoaded(const std::string path = ""); + // Internal cleanup callback when a new video or imagestream is loaded. + void onNewMediumLoaded(const std::string path = ""); }; #endif // CONTROLLERMAINWINDOW_H diff --git a/Src/Controller/ControllerNotifications.cpp b/Src/Controller/ControllerNotifications.cpp index 07295117..bb3cd6d3 100644 --- a/Src/Controller/ControllerNotifications.cpp +++ b/Src/Controller/ControllerNotifications.cpp @@ -3,19 +3,23 @@ #include "ControllerMainWindow.h" #include "qdebug.h" -IView* view; - -ControllerNotifications::ControllerNotifications(QObject* parent, IBioTrackerContext* context, ENUMS::CONTROLLERTYPE ctr) : - IControllerCfg(parent, context, ctr) { +IView* view; +ControllerNotifications::ControllerNotifications(QObject* parent, + IBioTrackerContext* context, + ENUMS::CONTROLLERTYPE ctr) +: IControllerCfg(parent, context, ctr) +{ } -ControllerNotifications::~ControllerNotifications() { - qInstallMessageHandler(0); +ControllerNotifications::~ControllerNotifications() +{ + qInstallMessageHandler(0); } -void ControllerNotifications::cleanup() { - qInstallMessageHandler(0); +void ControllerNotifications::cleanup() +{ + qInstallMessageHandler(0); } void ControllerNotifications::createModel() @@ -24,10 +28,9 @@ void ControllerNotifications::createModel() void ControllerNotifications::createView() { - m_View = new NotificationLogBrowser(); - view = m_View; - qInstallMessageHandler(messageHandler); - + m_View = new NotificationLogBrowser(); + view = m_View; + qInstallMessageHandler(messageHandler); } void ControllerNotifications::connectModelToController() @@ -36,19 +39,21 @@ void ControllerNotifications::connectModelToController() void ControllerNotifications::connectControllerToController() { - // Add notification browser to Main Window - IController* ctrA = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::MAINWINDOW); - QPointer< ControllerMainWindow > ctrMainWindow = qobject_cast(ctrA); + // Add notification browser to Main Window + IController* ctrA = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::MAINWINDOW); + QPointer ctrMainWindow = + qobject_cast(ctrA); - ctrMainWindow->setNotificationBrowserWidget(m_View); + ctrMainWindow->setNotificationBrowserWidget(m_View); } - - -void messageHandler(QtMsgType type, const QMessageLogContext & context, const QString & msg) +void messageHandler(QtMsgType type, + const QMessageLogContext& context, + const QString& msg) { - NotificationLogBrowser* log = dynamic_cast(view); - if (log) { - log->outputMessage(type, msg); - } + NotificationLogBrowser* log = dynamic_cast(view); + if (log) { + log->outputMessage(type, msg); + } } diff --git a/Src/Controller/ControllerNotifications.h b/Src/Controller/ControllerNotifications.h index 19a73f54..0a66a520 100644 --- a/Src/Controller/ControllerNotifications.h +++ b/Src/Controller/ControllerNotifications.h @@ -1,34 +1,38 @@ #pragma once #ifndef CONTROLLERNOTIFICATIONS_H -#define CONTROLLERNOTIFICATIONS_H + #define CONTROLLERNOTIFICATIONS_H -#include "IControllerCfg.h" + #include "IControllerCfg.h" /** -* This class inherits from IController. -* The notifications component includes the notifications view. -* This controller uses qInstallMessageHandler(messageHandler) to -* intercept all qDebug messages and display them in a text browser (the view). -* This text browser is displayed in the 'Notifications' tab in the GUI. -* QDebug reference: http://doc.qt.io/qt-5/qdebug.html -*/ -class ControllerNotifications : public IControllerCfg { - Q_OBJECT + * This class inherits from IController. + * The notifications component includes the notifications view. + * This controller uses qInstallMessageHandler(messageHandler) to + * intercept all qDebug messages and display them in a text browser (the view). + * This text browser is displayed in the 'Notifications' tab in the GUI. + * QDebug reference: http://doc.qt.io/qt-5/qdebug.html + */ +class ControllerNotifications : public IControllerCfg +{ + Q_OBJECT public: - ControllerNotifications(QObject* parent = 0, IBioTrackerContext* context = 0, - ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); - ~ControllerNotifications(); - void cleanup() override; + ControllerNotifications( + QObject* parent = 0, + IBioTrackerContext* context = 0, + ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); + ~ControllerNotifications(); + void cleanup() override; protected: - void createModel() override; - void createView() override; - void connectModelToController() override; - void connectControllerToController() override; - + void createModel() override; + void createView() override; + void connectModelToController() override; + void connectControllerToController() override; }; -void messageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg); +void messageHandler(QtMsgType type, + const QMessageLogContext& context, + const QString& msg); #endif // CONTROLLERNOTIFICATIONS_H \ No newline at end of file diff --git a/Src/Controller/ControllerPlayer.cpp b/Src/Controller/ControllerPlayer.cpp index 2789dc85..14f2bee8 100644 --- a/Src/Controller/ControllerPlayer.cpp +++ b/Src/Controller/ControllerPlayer.cpp @@ -10,8 +10,10 @@ #include #include -ControllerPlayer::ControllerPlayer(QObject *parent, IBioTrackerContext *context, ENUMS::CONTROLLERTYPE ctr) : - IControllerCfg(parent, context, ctr) +ControllerPlayer::ControllerPlayer(QObject* parent, + IBioTrackerContext* context, + ENUMS::CONTROLLERTYPE ctr) +: IControllerCfg(parent, context, ctr) { } @@ -19,178 +21,255 @@ ControllerPlayer::~ControllerPlayer() { } -void ControllerPlayer::loadVideoStream(std::vector files) { +void ControllerPlayer::loadVideoStream( + std::vector files) +{ qobject_cast(m_Model)->loadVideoStream(files); - emitPauseState(true); + emitPauseState(true); } -void ControllerPlayer::loadPictures(std::vector files) { +void ControllerPlayer::loadPictures(std::vector files) +{ qobject_cast(m_Model)->loadPictures(files); - emitPauseState(true); + emitPauseState(true); } -void ControllerPlayer::loadCameraDevice(CameraConfiguration conf) { +void ControllerPlayer::loadCameraDevice(CameraConfiguration conf) +{ qobject_cast(m_Model)->loadCameraDevice(conf); - emitPauseState(true); + emitPauseState(true); } -void ControllerPlayer::nextFrame() { +void ControllerPlayer::nextFrame() +{ qobject_cast(m_Model)->nextFrameCommand(); } -void ControllerPlayer::prevFrame() { +void ControllerPlayer::prevFrame() +{ qobject_cast(m_Model)->prevFrameCommand(); } -void ControllerPlayer::play() { +void ControllerPlayer::play() +{ qobject_cast(m_Model)->playCommand(); - emitPauseState(false); + emitPauseState(false); } -void ControllerPlayer::stop() { +void ControllerPlayer::stop() +{ qobject_cast(m_Model)->stopCommand(); - emitPauseState(true); + emitPauseState(true); } -void ControllerPlayer::pause() { +void ControllerPlayer::pause() +{ qobject_cast(m_Model)->pauseCommand(); - emitPauseState(true); + emitPauseState(true); } -void ControllerPlayer::setGoToFrame(int frame) { +void ControllerPlayer::setGoToFrame(int frame) +{ qobject_cast(m_Model)->goToFrame(frame); } -void ControllerPlayer::receiveRenderImage(std::shared_ptr mat, QString name) { - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::TEXTUREOBJECT); - QPointer< ControllerTextureObject > ctrTextureObject = qobject_cast(ctr); +void ControllerPlayer::receiveRenderImage(std::shared_ptr mat, + QString name) +{ + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::TEXTUREOBJECT); + QPointer ctrTextureObject = + qobject_cast(ctr); ctrTextureObject->receiveCvMat(mat, name); } -void ControllerPlayer::receiveImageToTracker(std::shared_ptr mat, uint number) { - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::PLUGIN); - QPointer< ControllerPlugin > ctrPlugin = qobject_cast(ctr); +void ControllerPlayer::receiveImageToTracker(std::shared_ptr mat, + uint number) +{ + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::PLUGIN); + QPointer ctrPlugin = qobject_cast( + ctr); ctrPlugin->sendCurrentFrameToPlugin(mat, number); } -void ControllerPlayer::changeImageView(QString str) { - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::TEXTUREOBJECT); - QPointer< ControllerTextureObject > ctrTextureObject = qobject_cast(ctr); +void ControllerPlayer::changeImageView(QString str) +{ + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::TEXTUREOBJECT); + QPointer ctrTextureObject = + qobject_cast(ctr); ctrTextureObject->changeTextureModel(str); } -int ControllerPlayer::recordOutput() { - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::GRAPHICSVIEW); - QPointer< ControllerGraphicScene > ctrTextureObject = qobject_cast(ctr); +int ControllerPlayer::recordOutput() +{ + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::GRAPHICSVIEW); + QPointer ctrTextureObject = + qobject_cast(ctr); - return qobject_cast(m_Model)->toggleRecordGraphicsScenes(dynamic_cast (ctrTextureObject->getView())); + return qobject_cast(m_Model)->toggleRecordGraphicsScenes( + dynamic_cast(ctrTextureObject->getView())); } -int ControllerPlayer::recordInput() { - return qobject_cast(m_Model)->toggleRecordImageStream(); +int ControllerPlayer::recordInput() +{ + return qobject_cast(m_Model)->toggleRecordImageStream(); } -void ControllerPlayer::setTargetFps(double fps) { +void ControllerPlayer::setTargetFps(double fps) +{ return qobject_cast(m_Model)->setTargetFPS(fps); } -QString ControllerPlayer::takeScreenshot() { - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::GRAPHICSVIEW); - QPointer< ControllerGraphicScene > ctrTextureObject = qobject_cast(ctr); - return qobject_cast(m_Model)->takeScreenshot(dynamic_cast(ctrTextureObject->getView())); +QString ControllerPlayer::takeScreenshot() +{ + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::GRAPHICSVIEW); + QPointer ctrTextureObject = + qobject_cast(ctr); + return qobject_cast(m_Model)->takeScreenshot( + dynamic_cast(ctrTextureObject->getView())); } -void ControllerPlayer::setTrackingActivated() { +void ControllerPlayer::setTrackingActivated() +{ qobject_cast(m_Model)->setTrackingActive(); } -void ControllerPlayer::setTrackingDeactivated() { +void ControllerPlayer::setTrackingDeactivated() +{ qobject_cast(m_Model)->setTrackingDeactive(); } -void ControllerPlayer::connectControllerToController() { - //connect to mainwindow - IController* ctrM = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::MAINWINDOW); - QPointer< MainWindow > mainWin = dynamic_cast(ctrM->getView()); +void ControllerPlayer::connectControllerToController() +{ + // connect to mainwindow + IController* ctrM = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::MAINWINDOW); + QPointer mainWin = dynamic_cast(ctrM->getView()); mainWin->addVideoControllWidget(m_View); VideoControllWidget* vControl = static_cast(m_View); vControl->setupVideoToolbar(); - ////connect to coreparameterview - //IController* ictrCpv = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::COREPARAMETER); - //QPointer< ControllerCoreParameter > ctrCpv = dynamic_cast(ictrCpv); + ////connect to coreparameterview + // IController* ictrCpv = + // m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::COREPARAMETER); + // QPointer< ControllerCoreParameter > ctrCpv = + // dynamic_cast(ictrCpv); - //QObject::connect(this, &ControllerPlayer::emitPauseState, ctrCpv, &ControllercoreParameter) + // QObject::connect(this, &ControllerPlayer::emitPauseState, ctrCpv, + // &ControllercoreParameter) } -void ControllerPlayer::createModel() { +void ControllerPlayer::createModel() +{ m_Model = new MediaPlayer(this); } -void ControllerPlayer::createView() { - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::MAINWINDOW); - QPointer< MainWindow > mainWindow = dynamic_cast(ctr->getView()); +void ControllerPlayer::createView() +{ + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::MAINWINDOW); + QPointer mainWindow = dynamic_cast( + ctr->getView()); m_View = new VideoControllWidget(mainWindow, this, m_Model); } -void ControllerPlayer::connectModelToController() { - - QObject::connect(qobject_cast(m_Model), &MediaPlayer::renderCurrentImage, this, &ControllerPlayer::receiveRenderImage); - QObject::connect(qobject_cast(m_Model), &MediaPlayer::trackCurrentImage, this, &ControllerPlayer::receiveImageToTracker); - QObject::connect(this, &ControllerPlayer::emitPauseState, qobject_cast(m_Model), &MediaPlayer::rcvPauseState); - QObject::connect(qobject_cast(m_Model), &MediaPlayer::signalVisualizeCurrentModel, this, &ControllerPlayer::receiveVisualizeCurrentModel); - QObject::connect(qobject_cast(m_Model), &MediaPlayer::signalCurrentFrameNumberToPlugin, this, &ControllerPlayer::receiveCurrentFrameNumberToPlugin); - - QObject::connect(qobject_cast(m_Model), &MediaPlayer::emitNextMediaInBatch, this, &ControllerPlayer::receiveNextMediaInBatch, Qt::DirectConnection); - QObject::connect(qobject_cast(m_Model), &MediaPlayer::emitNextMediaInBatchLoaded, this, &ControllerPlayer::receiveNextMediaInBatchLoaded, Qt::DirectConnection); - - - IController* ctrTRCC = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); - QPointer< ControllerTrackedComponentCore > trCC = qobject_cast(ctrTRCC); - - QObject::connect(trCC, &ControllerTrackedComponentCore::emitTrackNumber, this, &ControllerPlayer::receiveTrackCount, Qt::DirectConnection); +void ControllerPlayer::connectModelToController() +{ + QObject::connect(qobject_cast(m_Model), + &MediaPlayer::renderCurrentImage, + this, + &ControllerPlayer::receiveRenderImage); + QObject::connect(qobject_cast(m_Model), + &MediaPlayer::trackCurrentImage, + this, + &ControllerPlayer::receiveImageToTracker); + QObject::connect(this, + &ControllerPlayer::emitPauseState, + qobject_cast(m_Model), + &MediaPlayer::rcvPauseState); + QObject::connect(qobject_cast(m_Model), + &MediaPlayer::signalVisualizeCurrentModel, + this, + &ControllerPlayer::receiveVisualizeCurrentModel); + QObject::connect(qobject_cast(m_Model), + &MediaPlayer::signalCurrentFrameNumberToPlugin, + this, + &ControllerPlayer::receiveCurrentFrameNumberToPlugin); + + QObject::connect(qobject_cast(m_Model), + &MediaPlayer::emitNextMediaInBatch, + this, + &ControllerPlayer::receiveNextMediaInBatch, + Qt::DirectConnection); + QObject::connect(qobject_cast(m_Model), + &MediaPlayer::emitNextMediaInBatchLoaded, + this, + &ControllerPlayer::receiveNextMediaInBatchLoaded, + Qt::DirectConnection); + + IController* ctrTRCC = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); + QPointer trCC = + qobject_cast(ctrTRCC); + + QObject::connect(trCC, + &ControllerTrackedComponentCore::emitTrackNumber, + this, + &ControllerPlayer::receiveTrackCount, + Qt::DirectConnection); } -void ControllerPlayer::receiveNextMediaInBatch(const std::string path){ +void ControllerPlayer::receiveNextMediaInBatch(const std::string path) +{ _trackCountEndOfBatch = _trackCount; Q_EMIT emitNextMediaInBatch(path); } -void ControllerPlayer::receiveNextMediaInBatchLoaded(const std::string path){ +void ControllerPlayer::receiveNextMediaInBatchLoaded(const std::string path) +{ Q_EMIT emitNextMediaInBatchLoaded(path); - - IController* ctrTRCC = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); - QPointer< ControllerTrackedComponentCore > trCC = qobject_cast(ctrTRCC); - for(int i=0; i<_trackCountEndOfBatch; i++){ + + IController* ctrTRCC = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); + QPointer trCC = + qobject_cast(ctrTRCC); + for (int i = 0; i < _trackCountEndOfBatch; i++) { trCC->emitAddTrack(); } } -void ControllerPlayer::receiveTrackCount(int trackNo){ +void ControllerPlayer::receiveTrackCount(int trackNo) +{ _trackCount = trackNo; } - void ControllerPlayer::receiveVisualizeCurrentModel(uint frameNumber) { - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); - QPointer< ControllerTrackedComponentCore > ctrTrCompCore = qobject_cast(ctr); + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); + QPointer ctrTrCompCore = + qobject_cast(ctr); - ctrTrCompCore->receiveVisualizeTrackingModel(frameNumber); + ctrTrCompCore->receiveVisualizeTrackingModel(frameNumber); } -void ControllerPlayer::receiveChangeDisplayImage(QString str) { +void ControllerPlayer::receiveChangeDisplayImage(QString str) +{ - VideoControllWidget *w = dynamic_cast(m_View); - w->setSelectedView(str); + VideoControllWidget* w = dynamic_cast(m_View); + w->setSelectedView(str); } void ControllerPlayer::receiveCurrentFrameNumberToPlugin(uint frameNumber) { - Q_EMIT signalCurrentFrameNumberToPlugin(frameNumber); + Q_EMIT signalCurrentFrameNumberToPlugin(frameNumber); } diff --git a/Src/Controller/ControllerPlayer.h b/Src/Controller/ControllerPlayer.h index 50ca447d..040e65c7 100644 --- a/Src/Controller/ControllerPlayer.h +++ b/Src/Controller/ControllerPlayer.h @@ -1,9 +1,9 @@ /**************************************************************************** - ** - ** This file is part of the BioTracker Framework - ** by Andreas Jörg - ** - ****************************************************************************/ + ** + ** This file is part of the BioTracker Framework + ** by Andreas Jörg + ** + ****************************************************************************/ #ifndef CONTROLLERPLAYER_H #define CONTROLLERPLAYER_H @@ -13,117 +13,133 @@ #include "util/types.h" /** - * The ControllerPlayer class it the controller of the MediaPlayer-Component. This controller creates and controlls the IModel class MediaPlayer and the IView class VideoControllWidget. + * The ControllerPlayer class it the controller of the MediaPlayer-Component. + * This controller creates and controlls the IModel class MediaPlayer and the + * IView class VideoControllWidget. */ -class ControllerPlayer : public IControllerCfg { - Q_OBJECT - public: - ControllerPlayer(QObject* parent = 0, IBioTrackerContext* context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); - ~ControllerPlayer(); - - /** - * Hands over the file path of a video to the IModel class MediaPlayer. - */ - void loadVideoStream(std::vector files); - /** - * Hands over the file path of pictures to the IModel class MediaPlayer. - */ - void loadPictures(std::vector files); - /** - * Hands over the camera device number to the IModel class MediaPlayer. - */ - void loadCameraDevice(CameraConfiguration conf); - - /** - * Tells the MediaPlayer-Component to hand over the current cv::Mat and the current frame number to the BioTracker Plugin. - */ - void setTrackingActivated(); - /** - * Tells the MediaPlayer-Component not to hand over the current cv::Mat and the current frame number to the BioTracker Plugin. - */ - void setTrackingDeactivated(); - - /** - * Tells the IModel class MediaPlayer to display the next image frame of the ImageStream. - */ - void nextFrame(); - /** - * Tells the IModel class MediaPlayer to display the previous image frame of the ImageStream. - */ - void prevFrame(); - /** - * Tells the IModel class MediaPlayer to start playing the ImageStream. - */ - void play(); - /** - * Tells the IModel class MediaPlayer to stop playing the ImageStream. - */ - void stop(); - /** - * Tells the IModel class MediaPlayer to pause playing the ImageStream. - */ - void pause(); - /** - * If the user changes the ImageView in the comboBox represented in the VideoControllWidget it passes the selected ImageView name to the ControllerTextureObject class of the TextureObject-Component. - */ - void changeImageView(QString str); - - /** - * User clicked record -> record "what the user sees" - */ - int recordOutput(); - - int recordInput(); - - void setTargetFps(double fps); - - QString takeScreenshot(); - - // IController interface - public: - void connectControllerToController() override; - - signals: - void emitPauseState(bool state); - void signalCurrentFrameNumberToPlugin(uint frameNumber); - void emitNextMediaInBatch(const std::string path); - void emitNextMediaInBatchLoaded(const std::string path); - - public Q_SLOTS: - /** - * This SLOT receives a cv::Mat and a name for the cv::Mat from the MediaPlayer class and hands it over to the ControllerTextureObject for rendering. - */ - void receiveRenderImage(std::shared_ptr mat, QString name); - /** - * This SLOT receives a cv::Mat and its frame number and hands it over to the ControllerPlugin for Tracking in the BioTracker Plugin. - */ - void receiveImageToTracker(std::shared_ptr mat, uint number); - /** - * This SLOT receives a framenumber and hands it over to the ControllerTrackedComponentCore for visualizing in the main app. - */ - void receiveVisualizeCurrentModel(uint frameNumber); - - void receiveChangeDisplayImage(QString str); - - void receiveCurrentFrameNumberToPlugin(uint frameNumber); - /** - * Tells the IModel class MediaPlayer to jump directly to the specified image frame by the parameter frame. - */ - void setGoToFrame(int frame); - - - void receiveNextMediaInBatch(const std::string path); - void receiveNextMediaInBatchLoaded(const std::string path); - void receiveTrackCount(int trackNo); - - protected: - void createModel() override; - void createView() override; - void connectModelToController() override; - - private: - int _trackCount = 0; - int _trackCountEndOfBatch = 0; +class ControllerPlayer : public IControllerCfg +{ + Q_OBJECT +public: + ControllerPlayer( + QObject* parent = 0, + IBioTrackerContext* context = 0, + ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); + ~ControllerPlayer(); + + /** + * Hands over the file path of a video to the IModel class MediaPlayer. + */ + void loadVideoStream(std::vector files); + /** + * Hands over the file path of pictures to the IModel class MediaPlayer. + */ + void loadPictures(std::vector files); + /** + * Hands over the camera device number to the IModel class MediaPlayer. + */ + void loadCameraDevice(CameraConfiguration conf); + + /** + * Tells the MediaPlayer-Component to hand over the current cv::Mat and the + * current frame number to the BioTracker Plugin. + */ + void setTrackingActivated(); + /** + * Tells the MediaPlayer-Component not to hand over the current cv::Mat and + * the current frame number to the BioTracker Plugin. + */ + void setTrackingDeactivated(); + + /** + * Tells the IModel class MediaPlayer to display the next image frame of + * the ImageStream. + */ + void nextFrame(); + /** + * Tells the IModel class MediaPlayer to display the previous image frame + * of the ImageStream. + */ + void prevFrame(); + /** + * Tells the IModel class MediaPlayer to start playing the ImageStream. + */ + void play(); + /** + * Tells the IModel class MediaPlayer to stop playing the ImageStream. + */ + void stop(); + /** + * Tells the IModel class MediaPlayer to pause playing the ImageStream. + */ + void pause(); + /** + * If the user changes the ImageView in the comboBox represented in the + * VideoControllWidget it passes the selected ImageView name to the + * ControllerTextureObject class of the TextureObject-Component. + */ + void changeImageView(QString str); + + /** + * User clicked record -> record "what the user sees" + */ + int recordOutput(); + + int recordInput(); + + void setTargetFps(double fps); + + QString takeScreenshot(); + + // IController interface +public: + void connectControllerToController() override; + +signals: + void emitPauseState(bool state); + void signalCurrentFrameNumberToPlugin(uint frameNumber); + void emitNextMediaInBatch(const std::string path); + void emitNextMediaInBatchLoaded(const std::string path); + +public Q_SLOTS: + /** + * This SLOT receives a cv::Mat and a name for the cv::Mat from the + * MediaPlayer class and hands it over to the ControllerTextureObject for + * rendering. + */ + void receiveRenderImage(std::shared_ptr mat, QString name); + /** + * This SLOT receives a cv::Mat and its frame number and hands it over to + * the ControllerPlugin for Tracking in the BioTracker Plugin. + */ + void receiveImageToTracker(std::shared_ptr mat, uint number); + /** + * This SLOT receives a framenumber and hands it over to the + * ControllerTrackedComponentCore for visualizing in the main app. + */ + void receiveVisualizeCurrentModel(uint frameNumber); + + void receiveChangeDisplayImage(QString str); + + void receiveCurrentFrameNumberToPlugin(uint frameNumber); + /** + * Tells the IModel class MediaPlayer to jump directly to the specified + * image frame by the parameter frame. + */ + void setGoToFrame(int frame); + + void receiveNextMediaInBatch(const std::string path); + void receiveNextMediaInBatchLoaded(const std::string path); + void receiveTrackCount(int trackNo); + +protected: + void createModel() override; + void createView() override; + void connectModelToController() override; + +private: + int _trackCount = 0; + int _trackCountEndOfBatch = 0; }; #endif // CONTROLLERPLAYER_H diff --git a/Src/Controller/ControllerPlugin.cpp b/Src/Controller/ControllerPlugin.cpp index 92918e10..cf04edd2 100644 --- a/Src/Controller/ControllerPlugin.cpp +++ b/Src/Controller/ControllerPlugin.cpp @@ -14,499 +14,658 @@ #define REGISTRY_PATH "SOFTWARE\\FUBioroboticsLab\\BioTracker\\Plugins" #define TRACKER_SUFFIX ".bio_tracker" -ControllerPlugin::ControllerPlugin(QObject* parent, IBioTrackerContext* context, ENUMS::CONTROLLERTYPE ctr) : - IControllerCfg(parent, context, ctr) { - m_BioTrackerPlugin = NULL; +ControllerPlugin::ControllerPlugin(QObject* parent, + IBioTrackerContext* context, + ENUMS::CONTROLLERTYPE ctr) +: IControllerCfg(parent, context, ctr) +{ + m_BioTrackerPlugin = NULL; - m_TrackingThread = new QThread(this); - m_TrackingThread->setObjectName("TrackingThread"); - m_TrackingThread->start(); + m_TrackingThread = new QThread(this); + m_TrackingThread->setObjectName("TrackingThread"); + m_TrackingThread->start(); } -ControllerPlugin::~ControllerPlugin() { - - //They might not exist (no plugins available!) - if(m_BioTrackerPlugin) - delete m_BioTrackerPlugin; - if(pluginLoader) - delete pluginLoader; +ControllerPlugin::~ControllerPlugin() +{ - m_TrackingThread->quit(); - m_TrackingThread->wait(); + // They might not exist (no plugins available!) + if (m_BioTrackerPlugin) + delete m_BioTrackerPlugin; + if (pluginLoader) + delete pluginLoader; + m_TrackingThread->quit(); + m_TrackingThread->wait(); } -void ControllerPlugin::addToPluginList(QString str) { +void ControllerPlugin::addToPluginList(QString str) +{ - std::string s = str.toStdString(); - pluginLoader->addToPluginList(str, TRACKER_SUFFIX); + std::string s = str.toStdString(); + pluginLoader->addToPluginList(str, TRACKER_SUFFIX); - // Add Plugin name to Main Window - IController* ctrA = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::MAINWINDOW); - QPointer< ControllerMainWindow > ctrMainWindow = qobject_cast(ctrA); + // Add Plugin name to Main Window + IController* ctrA = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::MAINWINDOW); + QPointer ctrMainWindow = + qobject_cast(ctrA); - ctrMainWindow->setTrackerList(pluginLoader->getPluginList(), - pluginLoader->getCurrentPluginName()); + ctrMainWindow->setTrackerList(pluginLoader->getPluginList(), + pluginLoader->getCurrentPluginName()); } -void ControllerPlugin::loadPluginFromFileName(QString str) { - - if (pluginLoader->loadPluginFromFilename(str)) { - m_BioTrackerPlugin = qobject_cast(pluginLoader->getPluginInstance()); - createPlugin(); - - // Add Plugin name to Main Window - IController* ctrA = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::MAINWINDOW); - QPointer< ControllerMainWindow > ctrMainWindow = qobject_cast(ctrA); - - ctrMainWindow->setTrackerList(pluginLoader->getPluginList(), - pluginLoader->getCurrentPluginName()); - - //Add Tracker Parameter to Main Window - IView *parms = m_BioTrackerPlugin->getTrackerParameterWidget(); - ctrMainWindow->setTrackerParamterWidget(parms); - - //Add Tracker tracked components (Elements) to Main Window - IView *elems = m_BioTrackerPlugin->getTrackerElementsWidget(); - ctrMainWindow->setTrackerElementsWidget(elems); - - IController* ctrB = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); - QPointer< ControllerTrackedComponentCore > ctrTrackedComponentCore = qobject_cast(ctrB); - - //Add Tracker tracked components model to ControllerTrackedComponentCore - ctrTrackedComponentCore->addModel(m_BioTrackerPlugin->getTrackerComponentModel()); - //Add tracked component view to main window - ctrMainWindow->setCoreElementsWidget(ctrTrackedComponentCore->getTrackingElementsWidgetCore()); - - IController* ctrDE = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::DATAEXPORT); - QPointer< ControllerDataExporter > ctrDataExp = qobject_cast(ctrDE); - ctrDataExp->setDataStructure(m_BioTrackerPlugin->getTrackerComponentModel()); - ctrDataExp->setComponentFactory(m_BioTrackerPlugin->getComponentFactory()); +void ControllerPlugin::loadPluginFromFileName(QString str) +{ - m_BioTrackerPlugin->sendCorePermissions(); - }else{ - qWarning() << "Failed to load plugin from filename!"; - } + if (pluginLoader->loadPluginFromFilename(str)) { + m_BioTrackerPlugin = qobject_cast( + pluginLoader->getPluginInstance()); + createPlugin(); + + // Add Plugin name to Main Window + IController* ctrA = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::MAINWINDOW); + QPointer ctrMainWindow = + qobject_cast(ctrA); + + ctrMainWindow->setTrackerList(pluginLoader->getPluginList(), + pluginLoader->getCurrentPluginName()); + + // Add Tracker Parameter to Main Window + IView* parms = m_BioTrackerPlugin->getTrackerParameterWidget(); + ctrMainWindow->setTrackerParamterWidget(parms); + + // Add Tracker tracked components (Elements) to Main Window + IView* elems = m_BioTrackerPlugin->getTrackerElementsWidget(); + ctrMainWindow->setTrackerElementsWidget(elems); + + IController* ctrB = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); + QPointer ctrTrackedComponentCore = + qobject_cast(ctrB); + + // Add Tracker tracked components model to + // ControllerTrackedComponentCore + ctrTrackedComponentCore->addModel( + m_BioTrackerPlugin->getTrackerComponentModel()); + // Add tracked component view to main window + ctrMainWindow->setCoreElementsWidget( + ctrTrackedComponentCore->getTrackingElementsWidgetCore()); + + IController* ctrDE = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::DATAEXPORT); + QPointer ctrDataExp = + qobject_cast(ctrDE); + ctrDataExp->setDataStructure( + m_BioTrackerPlugin->getTrackerComponentModel()); + ctrDataExp->setComponentFactory( + m_BioTrackerPlugin->getComponentFactory()); + + m_BioTrackerPlugin->sendCorePermissions(); + } else { + qWarning() << "Failed to load plugin from filename!"; + } } -void ControllerPlugin::selectPlugin(QString str) { - if (str.isEmpty()) - return; - - if (pluginLoader->getCurrentPluginName() != str) - loadPluginFromFileName(pluginLoader->getPluginMap().find(str)->second); -} +void ControllerPlugin::selectPlugin(QString str) +{ + if (str.isEmpty()) + return; -void ControllerPlugin::createModel() { - m_Model = nullptr; - pluginLoader = new PluginLoader(this); + if (pluginLoader->getCurrentPluginName() != str) + loadPluginFromFileName(pluginLoader->getPluginMap().find(str)->second); } -void ControllerPlugin::createView() { +void ControllerPlugin::createModel() +{ + m_Model = nullptr; + pluginLoader = new PluginLoader(this); } -void ControllerPlugin::connectModelToController() { +void ControllerPlugin::createView() +{ } -void ControllerPlugin::loadPluginsFromPluginSubfolder() { - - ////////////// - QDir d(_cfg->DirPlugins); - d.setFilter(QDir::Filter::Files); - QStringList nameFilter; - QFileInfoList fl = d.entryInfoList(nameFilter, QDir::Filter::Files); - - //Grab list of behaviors from config & registry - std::vector list = _cfg->UseRegistryLocations==1 ? PluginLoader::queryRegistryBehaviors(REGISTRY_PATH) : std::vector(); - //Search directories - std::vector filesFromFolders = PluginLoader::searchDirectoriesForPlugins(list, TRACKER_SUFFIX); - for(auto x: filesFromFolders) - addToPluginList(x.c_str()); - - foreach(QFileInfo fi, fl) { - QString s = fi.absoluteFilePath(); - addToPluginList(s); - } - - //Load plugins as per CLI - if (!_cfg->UsePlugins.isEmpty()) { - addToPluginList(_cfg->UsePlugins.toStdString().c_str()); - } +void ControllerPlugin::connectModelToController() +{ } -void ControllerPlugin::connectControllerToController() { - - // Add Plugin name to Main Window - IController* ctrA = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::MAINWINDOW); - QPointer< ControllerMainWindow > ctrMainWindow = qobject_cast(ctrA); - - ctrMainWindow->deactiveTrackingCheckBox(); - - loadPluginsFromPluginSubfolder(); - - // connect ControllerTrackedComponentView - IController* ctrB = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); - QPointer< ControllerTrackedComponentCore > ctrTrackedComponentCore = qobject_cast(ctrB); - - QObject::connect(this, SIGNAL(emitUpdateView()), ctrTrackedComponentCore, - SLOT(receiveUpdateView())); - - // connect ControllerCommands - IController* ctrD = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::COMMANDS); - QPointer< ControllerCommands > ctrCommands = qobject_cast(ctrD); - - QObject::connect(ctrCommands, SIGNAL(emitAddTrajectory(QPoint)), this, - SLOT(receiveAddTrajectory(QPoint)), Qt::DirectConnection); - QObject::connect(ctrCommands, SIGNAL(emitRemoveTrajectory(IModelTrackedTrajectory*)), this, - SLOT(receiveRemoveTrajectory(IModelTrackedTrajectory*)), Qt::DirectConnection); - QObject::connect(ctrCommands, SIGNAL(emitRemoveTrajectoryId(int)), this, - SLOT(receiveRemoveTrajectoryId(int)), Qt::DirectConnection); - QObject::connect(ctrCommands, SIGNAL(emitRemoveTrackEntity(IModelTrackedTrajectory*, uint)), this, - SLOT(receiveRemoveTrackEntity(IModelTrackedTrajectory*, uint)), Qt::DirectConnection); - QObject::connect(ctrCommands, SIGNAL(emitValidateTrajectory(int)), this, - SLOT(receiveValidateTrajectory(int)), Qt::DirectConnection); - QObject::connect(ctrCommands, SIGNAL(emitValidateEntity(IModelTrackedTrajectory*, uint)), this, - SLOT(receiveValidateEntity(IModelTrackedTrajectory*, uint)), Qt::DirectConnection); - QObject::connect(ctrCommands, SIGNAL(emitMoveElement(IModelTrackedTrajectory*, uint, QPoint, int)), this, - SLOT(receiveMoveElement(IModelTrackedTrajectory*, uint, QPoint, int)), Qt::DirectConnection); - QObject::connect(ctrCommands, SIGNAL(emitSwapIds(IModelTrackedTrajectory*, IModelTrackedTrajectory*)), this, - SLOT(receiveSwapIds(IModelTrackedTrajectory*, IModelTrackedTrajectory*)), Qt::DirectConnection); - QObject::connect(ctrCommands, SIGNAL(emitToggleFixTrack(IModelTrackedTrajectory*, bool)), this, - SLOT(receiveToggleFixTrack(IModelTrackedTrajectory*, bool)), Qt::DirectConnection); - QObject::connect(ctrCommands, SIGNAL(emitEntityRotation(IModelTrackedTrajectory*, double, uint)), this, - SLOT(receiveEntityRotation(IModelTrackedTrajectory*, double, uint)), Qt::DirectConnection); - - - // connect ControllerPlayer - IController* ctrC = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::PLAYER); - QPointer< ControllerPlayer > ctrPlayer = qobject_cast(ctrC); - QObject::connect(ctrPlayer, SIGNAL(emitPauseState(bool)), this, - SLOT(receivePauseState(bool)), Qt::DirectConnection); - - QObject::connect(ctrPlayer, SIGNAL(signalCurrentFrameNumberToPlugin(uint)), - this, SLOT(receiveCurrentFrameNumberToPlugin(uint)), Qt::DirectConnection); +void ControllerPlugin::loadPluginsFromPluginSubfolder() +{ + ////////////// + QDir d(_cfg->DirPlugins); + d.setFilter(QDir::Filter::Files); + QStringList nameFilter; + QFileInfoList fl = d.entryInfoList(nameFilter, QDir::Filter::Files); + + // Grab list of behaviors from config & registry + std::vector list = _cfg->UseRegistryLocations == 1 + ? PluginLoader::queryRegistryBehaviors( + REGISTRY_PATH) + : std::vector(); + // Search directories + std::vector filesFromFolders = + PluginLoader::searchDirectoriesForPlugins(list, TRACKER_SUFFIX); + for (auto x : filesFromFolders) + addToPluginList(x.c_str()); + + foreach (QFileInfo fi, fl) { + QString s = fi.absoluteFilePath(); + addToPluginList(s); + } + + // Load plugins as per CLI + if (!_cfg->UsePlugins.isEmpty()) { + addToPluginList(_cfg->UsePlugins.toStdString().c_str()); + } } -void ControllerPlugin::createPlugin() { - m_BioTrackerPlugin = qobject_cast(pluginLoader->getPluginInstance()); - if (!m_BioTrackerPlugin){ - qFatal("Error at loading plugin."); - } - m_BioTrackerPlugin->createPlugin(); - - m_BioTrackerPlugin->moveToThread(m_TrackingThread); - - connectPlugin(); - - IController* ctrAreaDesc = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::AREADESCRIPTOR); - ControllerAreaDescriptor* ctAreaDesc = qobject_cast(ctrAreaDesc); - ctAreaDesc->triggerUpdateAreaDescriptor(); - - Q_EMIT signalCurrentFrameNumberToPlugin(m_currentFrameNumber); +void ControllerPlugin::connectControllerToController() +{ + // Add Plugin name to Main Window + IController* ctrA = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::MAINWINDOW); + QPointer ctrMainWindow = + qobject_cast(ctrA); + + ctrMainWindow->deactiveTrackingCheckBox(); + + loadPluginsFromPluginSubfolder(); + + // connect ControllerTrackedComponentView + IController* ctrB = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); + QPointer ctrTrackedComponentCore = + qobject_cast(ctrB); + + QObject::connect(this, + SIGNAL(emitUpdateView()), + ctrTrackedComponentCore, + SLOT(receiveUpdateView())); + + // connect ControllerCommands + IController* ctrD = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::COMMANDS); + QPointer ctrCommands = + qobject_cast(ctrD); + + QObject::connect(ctrCommands, + SIGNAL(emitAddTrajectory(QPoint)), + this, + SLOT(receiveAddTrajectory(QPoint)), + Qt::DirectConnection); + QObject::connect(ctrCommands, + SIGNAL(emitRemoveTrajectory(IModelTrackedTrajectory*)), + this, + SLOT(receiveRemoveTrajectory(IModelTrackedTrajectory*)), + Qt::DirectConnection); + QObject::connect(ctrCommands, + SIGNAL(emitRemoveTrajectoryId(int)), + this, + SLOT(receiveRemoveTrajectoryId(int)), + Qt::DirectConnection); + QObject::connect( + ctrCommands, + SIGNAL(emitRemoveTrackEntity(IModelTrackedTrajectory*, uint)), + this, + SLOT(receiveRemoveTrackEntity(IModelTrackedTrajectory*, uint)), + Qt::DirectConnection); + QObject::connect(ctrCommands, + SIGNAL(emitValidateTrajectory(int)), + this, + SLOT(receiveValidateTrajectory(int)), + Qt::DirectConnection); + QObject::connect( + ctrCommands, + SIGNAL(emitValidateEntity(IModelTrackedTrajectory*, uint)), + this, + SLOT(receiveValidateEntity(IModelTrackedTrajectory*, uint)), + Qt::DirectConnection); + QObject::connect( + ctrCommands, + SIGNAL(emitMoveElement(IModelTrackedTrajectory*, uint, QPoint, int)), + this, + SLOT(receiveMoveElement(IModelTrackedTrajectory*, uint, QPoint, int)), + Qt::DirectConnection); + QObject::connect(ctrCommands, + SIGNAL(emitSwapIds(IModelTrackedTrajectory*, + IModelTrackedTrajectory*)), + this, + SLOT(receiveSwapIds(IModelTrackedTrajectory*, + IModelTrackedTrajectory*)), + Qt::DirectConnection); + QObject::connect( + ctrCommands, + SIGNAL(emitToggleFixTrack(IModelTrackedTrajectory*, bool)), + this, + SLOT(receiveToggleFixTrack(IModelTrackedTrajectory*, bool)), + Qt::DirectConnection); + QObject::connect( + ctrCommands, + SIGNAL(emitEntityRotation(IModelTrackedTrajectory*, double, uint)), + this, + SLOT(receiveEntityRotation(IModelTrackedTrajectory*, double, uint)), + Qt::DirectConnection); + + // connect ControllerPlayer + IController* ctrC = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::PLAYER); + QPointer ctrPlayer = qobject_cast( + ctrC); + QObject::connect(ctrPlayer, + SIGNAL(emitPauseState(bool)), + this, + SLOT(receivePauseState(bool)), + Qt::DirectConnection); + + QObject::connect(ctrPlayer, + SIGNAL(signalCurrentFrameNumberToPlugin(uint)), + this, + SLOT(receiveCurrentFrameNumberToPlugin(uint)), + Qt::DirectConnection); } -void ControllerPlugin::connectPlugin() { - IController* ctrA = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::PLAYER); - QPointer< ControllerPlayer > ctrPlayer = qobject_cast(ctrA); - - IModel* model = ctrPlayer->getModel(); - - IController* ctrB = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::TEXTUREOBJECT); - ControllerTextureObject* ctrTexture = qobject_cast(ctrB); - - IController* ctrAreaDesc = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::AREADESCRIPTOR); - ControllerAreaDescriptor* ctAreaDesc = qobject_cast(ctrAreaDesc); - - - IController* ctrData = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::DATAEXPORT); - ControllerDataExporter* ctDataEx = qobject_cast(ctrData); - - IController* ctrC = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); - ControllerTrackedComponentCore* ctrCompView = qobject_cast(ctrC); - - IController* ctrD = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::COREPARAMETER); - ControllerCoreParameter* ctrCoreParam = qobject_cast(ctrD); - - IController* ctrE = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::MAINWINDOW); - QPointer< ControllerMainWindow > ctrMainWindow = qobject_cast(ctrE); - - QObject* obj = dynamic_cast(m_BioTrackerPlugin); - - QObject::connect(obj, SIGNAL(emitTrackingDone(uint)), ctDataEx, SLOT(receiveTrackingDone(uint))); - - QObject::connect(obj, SIGNAL(emitCvMat(std::shared_ptr, QString)), - ctrTexture, SLOT(receiveCvMat(std::shared_ptr, QString))); - - QObject::connect(obj, SIGNAL(emitTrackingDone(uint)), ctrCompView, SLOT(receiveVisualizeTrackingModel(uint))); - - QObject::connect(obj, SIGNAL(emitChangeDisplayImage(QString)), ctrPlayer, SLOT(receiveChangeDisplayImage(QString))); - - QObject::connect(ctAreaDesc, SIGNAL(updateAreaDescriptor(IModelAreaDescriptor*)), obj, SLOT(receiveAreaDescriptor(IModelAreaDescriptor*))); - - QObject::connect(obj, SIGNAL(emitCorePermission(std::pair)), ctrCompView, - SLOT(setCorePermission(std::pair))); - - QObject::connect(obj, SIGNAL(emitCorePermission(std::pair)), ctrCoreParam, - SLOT(setCorePermission(std::pair))); - - QObject::connect(obj, SIGNAL(emitCorePermission(std::pair)), ctrMainWindow, - SLOT(setCorePermission(std::pair))); - - QObject::connect(obj, SIGNAL(emitDimensionUpdate(int, int)), ctrCompView, SIGNAL(emitDimensionUpdate(int, int))); +void ControllerPlugin::createPlugin() +{ + m_BioTrackerPlugin = qobject_cast( + pluginLoader->getPluginInstance()); + if (!m_BioTrackerPlugin) { + qFatal("Error at loading plugin."); + } + m_BioTrackerPlugin->createPlugin(); + m_BioTrackerPlugin->moveToThread(m_TrackingThread); - // data model actions - QObject::connect(this, SIGNAL(emitRemoveTrajectory(IModelTrackedTrajectory*)), obj, - SLOT(receiveRemoveTrajectory(IModelTrackedTrajectory*))); - QObject::connect(this, SIGNAL(emitRemoveTrackEntity(IModelTrackedTrajectory*, uint)), obj, - SIGNAL(emitRemoveTrackEntity(IModelTrackedTrajectory*, uint))); - QObject::connect(this, SIGNAL(emitAddTrajectory(QPoint)), obj, - SLOT(receiveAddTrajectory(QPoint))); - QObject::connect(this, SIGNAL(emitMoveElement(IModelTrackedTrajectory*, uint, QPoint)), obj, - SIGNAL(emitMoveElement(IModelTrackedTrajectory*, uint, QPoint))); - QObject::connect(this, SIGNAL(emitSwapIds(IModelTrackedTrajectory*, IModelTrackedTrajectory*)), obj, - SLOT(receiveSwapIds(IModelTrackedTrajectory*, IModelTrackedTrajectory*))); - QObject::connect(this, SIGNAL(emitToggleFixTrack(IModelTrackedTrajectory*, bool)), obj, - SIGNAL(emitToggleFixTrack(IModelTrackedTrajectory*, bool))); + connectPlugin(); - QObject::connect(this, SIGNAL(emitRemoveTrajectoryId(int)), obj, - SIGNAL(emitRemoveTrajectoryId(int))); - QObject::connect(this, SIGNAL(emitValidateTrajectory(int)), obj, - SIGNAL(emitValidateTrajectory(int))); - QObject::connect(this, SIGNAL(emitValidateEntity(IModelTrackedTrajectory*, uint)), obj, - SIGNAL(emitValidateEntity(IModelTrackedTrajectory*, uint))); - QObject::connect(this, SIGNAL(emitEntityRotation(IModelTrackedTrajectory*, double, uint)), obj, - SIGNAL(emitEntityRotation(IModelTrackedTrajectory*, double, uint))); + IController* ctrAreaDesc = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::AREADESCRIPTOR); + ControllerAreaDescriptor* ctAreaDesc = + qobject_cast(ctrAreaDesc); + ctAreaDesc->triggerUpdateAreaDescriptor(); - connect(this, &ControllerPlugin::frameRetrieved, m_BioTrackerPlugin, &IBioTrackerPlugin::receiveCurrentFrameFromMainApp); - QObject::connect(this, SIGNAL(signalCurrentFrameNumberToPlugin(uint)), obj, - SLOT(receiveCurrentFrameNumberFromMainApp(uint))); + Q_EMIT signalCurrentFrameNumberToPlugin(m_currentFrameNumber); } -void ControllerPlugin::disconnectPlugin() { - +void ControllerPlugin::connectPlugin() +{ + IController* ctrA = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::PLAYER); + QPointer ctrPlayer = qobject_cast( + ctrA); + + IModel* model = ctrPlayer->getModel(); + + IController* ctrB = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::TEXTUREOBJECT); + ControllerTextureObject* ctrTexture = + qobject_cast(ctrB); + + IController* ctrAreaDesc = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::AREADESCRIPTOR); + ControllerAreaDescriptor* ctAreaDesc = + qobject_cast(ctrAreaDesc); + + IController* ctrData = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::DATAEXPORT); + ControllerDataExporter* ctDataEx = qobject_cast( + ctrData); + + IController* ctrC = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); + ControllerTrackedComponentCore* ctrCompView = + qobject_cast(ctrC); + + IController* ctrD = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::COREPARAMETER); + ControllerCoreParameter* ctrCoreParam = + qobject_cast(ctrD); + + IController* ctrE = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::MAINWINDOW); + QPointer ctrMainWindow = + qobject_cast(ctrE); + + QObject* obj = dynamic_cast(m_BioTrackerPlugin); + + QObject::connect(obj, + SIGNAL(emitTrackingDone(uint)), + ctDataEx, + SLOT(receiveTrackingDone(uint))); + + QObject::connect(obj, + SIGNAL(emitCvMat(std::shared_ptr, QString)), + ctrTexture, + SLOT(receiveCvMat(std::shared_ptr, QString))); + + QObject::connect(obj, + SIGNAL(emitTrackingDone(uint)), + ctrCompView, + SLOT(receiveVisualizeTrackingModel(uint))); + + QObject::connect(obj, + SIGNAL(emitChangeDisplayImage(QString)), + ctrPlayer, + SLOT(receiveChangeDisplayImage(QString))); + + QObject::connect(ctAreaDesc, + SIGNAL(updateAreaDescriptor(IModelAreaDescriptor*)), + obj, + SLOT(receiveAreaDescriptor(IModelAreaDescriptor*))); + + QObject::connect( + obj, + SIGNAL(emitCorePermission(std::pair)), + ctrCompView, + SLOT(setCorePermission(std::pair))); + + QObject::connect( + obj, + SIGNAL(emitCorePermission(std::pair)), + ctrCoreParam, + SLOT(setCorePermission(std::pair))); + + QObject::connect( + obj, + SIGNAL(emitCorePermission(std::pair)), + ctrMainWindow, + SLOT(setCorePermission(std::pair))); + + QObject::connect(obj, + SIGNAL(emitDimensionUpdate(int, int)), + ctrCompView, + SIGNAL(emitDimensionUpdate(int, int))); + + // data model actions + QObject::connect(this, + SIGNAL(emitRemoveTrajectory(IModelTrackedTrajectory*)), + obj, + SLOT(receiveRemoveTrajectory(IModelTrackedTrajectory*))); + QObject::connect( + this, + SIGNAL(emitRemoveTrackEntity(IModelTrackedTrajectory*, uint)), + obj, + SIGNAL(emitRemoveTrackEntity(IModelTrackedTrajectory*, uint))); + QObject::connect(this, + SIGNAL(emitAddTrajectory(QPoint)), + obj, + SLOT(receiveAddTrajectory(QPoint))); + QObject::connect( + this, + SIGNAL(emitMoveElement(IModelTrackedTrajectory*, uint, QPoint)), + obj, + SIGNAL(emitMoveElement(IModelTrackedTrajectory*, uint, QPoint))); + QObject::connect(this, + SIGNAL(emitSwapIds(IModelTrackedTrajectory*, + IModelTrackedTrajectory*)), + obj, + SLOT(receiveSwapIds(IModelTrackedTrajectory*, + IModelTrackedTrajectory*))); + QObject::connect( + this, + SIGNAL(emitToggleFixTrack(IModelTrackedTrajectory*, bool)), + obj, + SIGNAL(emitToggleFixTrack(IModelTrackedTrajectory*, bool))); + + QObject::connect(this, + SIGNAL(emitRemoveTrajectoryId(int)), + obj, + SIGNAL(emitRemoveTrajectoryId(int))); + QObject::connect(this, + SIGNAL(emitValidateTrajectory(int)), + obj, + SIGNAL(emitValidateTrajectory(int))); + QObject::connect( + this, + SIGNAL(emitValidateEntity(IModelTrackedTrajectory*, uint)), + obj, + SIGNAL(emitValidateEntity(IModelTrackedTrajectory*, uint))); + QObject::connect( + this, + SIGNAL(emitEntityRotation(IModelTrackedTrajectory*, double, uint)), + obj, + SIGNAL(emitEntityRotation(IModelTrackedTrajectory*, double, uint))); + + connect(this, + &ControllerPlugin::frameRetrieved, + m_BioTrackerPlugin, + &IBioTrackerPlugin::receiveCurrentFrameFromMainApp); + QObject::connect(this, + SIGNAL(signalCurrentFrameNumberToPlugin(uint)), + obj, + SLOT(receiveCurrentFrameNumberFromMainApp(uint))); } -//first send all the commands currently in the command queue then the next image can be sent -void ControllerPlugin::sendCurrentFrameToPlugin(std::shared_ptr mat, uint number) { - m_currentFrameNumber = number; - - //Prevent calling the plugin if none is loaded - if (m_BioTrackerPlugin) { - while (!m_editQueue.isEmpty()) { - queueElement edit = m_editQueue.dequeue(); - - switch (edit.type) - { - case EDIT::REMOVE_TRACK: - emitRemoveTrajectory(edit.trajectory0); - break; - case EDIT::REMOVE_TRACK_ID: - emitRemoveTrajectoryId(edit.id); - break; - case EDIT::REMOVE_ENTITY: - emitRemoveTrackEntity(edit.trajectory0, edit.frameNumber); - break; - case EDIT::ADD: - emitAddTrajectory(edit.pos); - break; - case EDIT::MOVE: - emitMoveElement(edit.trajectory0, edit.frameNumber, edit.pos); - break; - case EDIT::SWAP: - emitSwapIds(edit.trajectory0, edit.trajectory1); - break; - case EDIT::FIX: - emitToggleFixTrack(edit.trajectory0, edit.toggle); - break; - case EDIT::VALIDATE: - emitValidateTrajectory(edit.id); - break; - case EDIT::VALIDATE_ENTITY: - emitValidateEntity(edit.trajectory0, edit.frameNumber); - break; - case EDIT::ROTATE_ENTITY: - emitEntityRotation(edit.trajectory0, edit.angle, edit.frameNumber); - break; - } - } - emit frameRetrieved(mat, number); - } +void ControllerPlugin::disconnectPlugin() +{ } - +// first send all the commands currently in the command queue then the next +// image can be sent +void ControllerPlugin::sendCurrentFrameToPlugin(std::shared_ptr mat, + uint number) +{ + m_currentFrameNumber = number; + + // Prevent calling the plugin if none is loaded + if (m_BioTrackerPlugin) { + while (!m_editQueue.isEmpty()) { + queueElement edit = m_editQueue.dequeue(); + + switch (edit.type) { + case EDIT::REMOVE_TRACK: + emitRemoveTrajectory(edit.trajectory0); + break; + case EDIT::REMOVE_TRACK_ID: + emitRemoveTrajectoryId(edit.id); + break; + case EDIT::REMOVE_ENTITY: + emitRemoveTrackEntity(edit.trajectory0, edit.frameNumber); + break; + case EDIT::ADD: + emitAddTrajectory(edit.pos); + break; + case EDIT::MOVE: + emitMoveElement(edit.trajectory0, edit.frameNumber, edit.pos); + break; + case EDIT::SWAP: + emitSwapIds(edit.trajectory0, edit.trajectory1); + break; + case EDIT::FIX: + emitToggleFixTrack(edit.trajectory0, edit.toggle); + break; + case EDIT::VALIDATE: + emitValidateTrajectory(edit.id); + break; + case EDIT::VALIDATE_ENTITY: + emitValidateEntity(edit.trajectory0, edit.frameNumber); + break; + case EDIT::ROTATE_ENTITY: + emitEntityRotation(edit.trajectory0, + edit.angle, + edit.frameNumber); + break; + } + } + emit frameRetrieved(mat, number); + } +} //############################SLOTS################################################## // receivers of commands -void ControllerPlugin::receiveRemoveTrajectory(IModelTrackedTrajectory * trajectory) +void ControllerPlugin::receiveRemoveTrajectory( + IModelTrackedTrajectory* trajectory) { - if (m_paused) { - emitRemoveTrajectory(trajectory); - emitUpdateView(); - } - else { - queueElement removeTrackEdit; - removeTrackEdit.type = EDIT::REMOVE_TRACK; - removeTrackEdit.trajectory0 = trajectory; - m_editQueue.enqueue(removeTrackEdit); - } + if (m_paused) { + emitRemoveTrajectory(trajectory); + emitUpdateView(); + } else { + queueElement removeTrackEdit; + removeTrackEdit.type = EDIT::REMOVE_TRACK; + removeTrackEdit.trajectory0 = trajectory; + m_editQueue.enqueue(removeTrackEdit); + } } void ControllerPlugin::receiveRemoveTrajectoryId(int id) { - if (m_paused) { - emitRemoveTrajectoryId(id); - emitUpdateView(); - } - else { - queueElement removeTrackEdit; - removeTrackEdit.type = EDIT::REMOVE_TRACK_ID; - removeTrackEdit.id = id; - m_editQueue.enqueue(removeTrackEdit); - } + if (m_paused) { + emitRemoveTrajectoryId(id); + emitUpdateView(); + } else { + queueElement removeTrackEdit; + removeTrackEdit.type = EDIT::REMOVE_TRACK_ID; + removeTrackEdit.id = id; + m_editQueue.enqueue(removeTrackEdit); + } } -void ControllerPlugin::receiveRemoveTrackEntity(IModelTrackedTrajectory * trajectory, uint frameNumber) +void ControllerPlugin::receiveRemoveTrackEntity( + IModelTrackedTrajectory* trajectory, + uint frameNumber) { - if (m_paused) { - emitRemoveTrackEntity(trajectory, frameNumber); - emitUpdateView(); - } - else { - queueElement removeEntityEdit; - removeEntityEdit.type = EDIT::REMOVE_ENTITY; - removeEntityEdit.trajectory0 = trajectory; - removeEntityEdit.frameNumber = frameNumber; - m_editQueue.enqueue(removeEntityEdit); - } + if (m_paused) { + emitRemoveTrackEntity(trajectory, frameNumber); + emitUpdateView(); + } else { + queueElement removeEntityEdit; + removeEntityEdit.type = EDIT::REMOVE_ENTITY; + removeEntityEdit.trajectory0 = trajectory; + removeEntityEdit.frameNumber = frameNumber; + m_editQueue.enqueue(removeEntityEdit); + } } void ControllerPlugin::receiveAddTrajectory(QPoint pos) { - if (m_paused) { - emitAddTrajectory(pos); - emitUpdateView(); - } - else { - queueElement addEdit; - addEdit.type = EDIT::ADD; - addEdit.pos = pos; - m_editQueue.enqueue(addEdit); - } + if (m_paused) { + emitAddTrajectory(pos); + emitUpdateView(); + } else { + queueElement addEdit; + addEdit.type = EDIT::ADD; + addEdit.pos = pos; + m_editQueue.enqueue(addEdit); + } } -void ControllerPlugin::receiveMoveElement(IModelTrackedTrajectory * trajectory, uint frameNumber, QPoint pos, int toMove) +void ControllerPlugin::receiveMoveElement(IModelTrackedTrajectory* trajectory, + uint frameNumber, + QPoint pos, + int toMove) { - if (m_paused) { - emitMoveElement(trajectory, frameNumber, pos); - //only emit the update after the last move is processed - if (toMove == 1) { - emitUpdateView(); - } - } - else { - queueElement moveEdit; - moveEdit.type = EDIT::MOVE; - moveEdit.trajectory0 = trajectory; - moveEdit.pos = pos; - moveEdit.frameNumber = frameNumber; - m_editQueue.enqueue(moveEdit); - } + if (m_paused) { + emitMoveElement(trajectory, frameNumber, pos); + // only emit the update after the last move is processed + if (toMove == 1) { + emitUpdateView(); + } + } else { + queueElement moveEdit; + moveEdit.type = EDIT::MOVE; + moveEdit.trajectory0 = trajectory; + moveEdit.pos = pos; + moveEdit.frameNumber = frameNumber; + m_editQueue.enqueue(moveEdit); + } } -void ControllerPlugin::receiveSwapIds(IModelTrackedTrajectory * trajectory0, IModelTrackedTrajectory * trajectory1) +void ControllerPlugin::receiveSwapIds(IModelTrackedTrajectory* trajectory0, + IModelTrackedTrajectory* trajectory1) { - if (m_paused) { - emitSwapIds(trajectory0, trajectory1); - emitUpdateView(); - } - else { - queueElement swapEdit; - swapEdit.type = EDIT::SWAP; - swapEdit.trajectory0 = trajectory0; - swapEdit.trajectory1 = trajectory1; - m_editQueue.enqueue(swapEdit); - } + if (m_paused) { + emitSwapIds(trajectory0, trajectory1); + emitUpdateView(); + } else { + queueElement swapEdit; + swapEdit.type = EDIT::SWAP; + swapEdit.trajectory0 = trajectory0; + swapEdit.trajectory1 = trajectory1; + m_editQueue.enqueue(swapEdit); + } } void ControllerPlugin::receiveValidateTrajectory(int id) { - if (m_paused) { - emitValidateTrajectory(id); - emitUpdateView(); - } - else { - queueElement validateEdit; - validateEdit.type = EDIT::VALIDATE; - validateEdit.id = id; - m_editQueue.enqueue(validateEdit); - } + if (m_paused) { + emitValidateTrajectory(id); + emitUpdateView(); + } else { + queueElement validateEdit; + validateEdit.type = EDIT::VALIDATE; + validateEdit.id = id; + m_editQueue.enqueue(validateEdit); + } } -void ControllerPlugin::receiveValidateEntity(IModelTrackedTrajectory * trajectory, uint frameNumber) +void ControllerPlugin::receiveValidateEntity( + IModelTrackedTrajectory* trajectory, + uint frameNumber) { - if (m_paused) { - emitValidateEntity(trajectory, frameNumber); - emitUpdateView(); - } - else { - queueElement validateEntityEdit; - validateEntityEdit.type = EDIT::VALIDATE_ENTITY; - validateEntityEdit.trajectory0 = trajectory; - validateEntityEdit.frameNumber = frameNumber; - m_editQueue.enqueue(validateEntityEdit); - } + if (m_paused) { + emitValidateEntity(trajectory, frameNumber); + emitUpdateView(); + } else { + queueElement validateEntityEdit; + validateEntityEdit.type = EDIT::VALIDATE_ENTITY; + validateEntityEdit.trajectory0 = trajectory; + validateEntityEdit.frameNumber = frameNumber; + m_editQueue.enqueue(validateEntityEdit); + } } -void ControllerPlugin::receiveToggleFixTrack(IModelTrackedTrajectory * trajectory, bool toggle) +void ControllerPlugin::receiveToggleFixTrack( + IModelTrackedTrajectory* trajectory, + bool toggle) { - if (m_paused) { - emitToggleFixTrack(trajectory, toggle); - emitUpdateView(); - } - else { - queueElement fixEdit; - fixEdit.type = EDIT::FIX; - fixEdit.trajectory0 = trajectory; - fixEdit.toggle = toggle; - m_editQueue.enqueue(fixEdit); - } + if (m_paused) { + emitToggleFixTrack(trajectory, toggle); + emitUpdateView(); + } else { + queueElement fixEdit; + fixEdit.type = EDIT::FIX; + fixEdit.trajectory0 = trajectory; + fixEdit.toggle = toggle; + m_editQueue.enqueue(fixEdit); + } } -void ControllerPlugin::receiveEntityRotation(IModelTrackedTrajectory * trajectory, double angle, uint frameNumber) +void ControllerPlugin::receiveEntityRotation( + IModelTrackedTrajectory* trajectory, + double angle, + uint frameNumber) { - if (m_paused) { - emitEntityRotation(trajectory, angle, frameNumber); - emitUpdateView(); - } - else { - queueElement rotEdit; - rotEdit.type = EDIT::ROTATE_ENTITY; - rotEdit.trajectory0 = trajectory; - rotEdit.angle = angle; - rotEdit.frameNumber = frameNumber; - m_editQueue.enqueue(rotEdit); - } + if (m_paused) { + emitEntityRotation(trajectory, angle, frameNumber); + emitUpdateView(); + } else { + queueElement rotEdit; + rotEdit.type = EDIT::ROTATE_ENTITY; + rotEdit.trajectory0 = trajectory; + rotEdit.angle = angle; + rotEdit.frameNumber = frameNumber; + m_editQueue.enqueue(rotEdit); + } } //********************************************************************* void ControllerPlugin::receivePauseState(bool state) { - m_paused = state; + m_paused = state; } void ControllerPlugin::receiveCurrentFrameNumberToPlugin(uint frameNumber) { - m_currentFrameNumber = frameNumber; - Q_EMIT signalCurrentFrameNumberToPlugin(frameNumber); + m_currentFrameNumber = frameNumber; + Q_EMIT signalCurrentFrameNumberToPlugin(frameNumber); } -void ControllerPlugin::receiveTrackingDone() { - +void ControllerPlugin::receiveTrackingDone() +{ } - diff --git a/Src/Controller/ControllerPlugin.h b/Src/Controller/ControllerPlugin.h index 41667062..ec3b11a5 100644 --- a/Src/Controller/ControllerPlugin.h +++ b/Src/Controller/ControllerPlugin.h @@ -1,10 +1,10 @@ /**************************************************************************** - ** - ** This file is part of the BioTracker Framework - ** by Andreas Jörg - ** edited by Jonas Piotrowski - ** - ****************************************************************************/ + ** + ** This file is part of the BioTracker Framework + ** by Andreas Jörg + ** edited by Jonas Piotrowski + ** + ****************************************************************************/ #ifndef CONTROLLERPLUGIN_H #define CONTROLLERPLUGIN_H @@ -15,169 +15,202 @@ #include "QQueue" #include "QPoint" - /// ENUM for the command queue in the controllerplugin -enum EDIT { REMOVE_TRACK, REMOVE_TRACK_ID, REMOVE_ENTITY, ADD, MOVE, SWAP, FIX, VALIDATE, VALIDATE_ENTITY, ROTATE_ENTITY }; +/// ENUM for the command queue in the controllerplugin +enum EDIT +{ + REMOVE_TRACK, + REMOVE_TRACK_ID, + REMOVE_ENTITY, + ADD, + MOVE, + SWAP, + FIX, + VALIDATE, + VALIDATE_ENTITY, + ROTATE_ENTITY +}; /// struct for the command queue in the controllerplugin -struct queueElement { - EDIT type; - QPoint pos; - IModelTrackedTrajectory* trajectory0; - IModelTrackedTrajectory* trajectory1; - IModelTrackedComponent* element; - bool toggle; - int id; - double angle; - uint frameNumber; +struct queueElement +{ + EDIT type; + QPoint pos; + IModelTrackedTrajectory* trajectory0; + IModelTrackedTrajectory* trajectory1; + IModelTrackedComponent* element; + bool toggle; + int id; + double angle; + uint frameNumber; }; /** - * This is the controller class of the Plugin Loader Component. This component is responsible for loading and managing BioTracker Plugins - * The ControllerPlugin class is responsible for loading and connecting to BioTracker Plugins. - * It also manages tracking data modification commands. It queues up the commands and forwards them to the trakcing plugin if - * either the tracking is paused or the tracker is done with tracking the previous frame. The plgin then sends the commands first and afterward - * the next image to track. This avoids a race condition. + * This is the controller class of the Plugin Loader Component. This component + * is responsible for loading and managing BioTracker Plugins The + * ControllerPlugin class is responsible for loading and connecting to + * BioTracker Plugins. It also manages tracking data modification commands. It + * queues up the commands and forwards them to the trakcing plugin if either + * the tracking is paused or the tracker is done with tracking the previous + * frame. The plgin then sends the commands first and afterward the next image + * to track. This avoids a race condition. */ -class ControllerPlugin : public IControllerCfg { - Q_OBJECT +class ControllerPlugin : public IControllerCfg +{ + Q_OBJECT public: - ControllerPlugin(QObject* parent = 0, IBioTrackerContext* context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); - ~ControllerPlugin(); - - void addToPluginList(QString str); - - /** - * (This function - * This function delivers a file path of a Plugin to the IModel class PluginLoader. If the Plugin could be loaded, - * the functions additionally requests the name of the Plugin and sets it as an entry into an IView widget in the MainWindow. - */ - void loadPluginFromFileName(QString str); - - /** - * This function hands the received cv::Mat pointer and the current frame number to the PluginLoader. - */ - void sendCurrentFrameToPlugin(std::shared_ptr mat, uint number); - - void selectPlugin(QString str); + ControllerPlugin( + QObject* parent = 0, + IBioTrackerContext* context = 0, + ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); + ~ControllerPlugin(); + + void addToPluginList(QString str); + + /** + * (This function + * This function delivers a file path of a Plugin to the IModel class + * PluginLoader. If the Plugin could be loaded, the functions additionally + * requests the name of the Plugin and sets it as an entry into an IView + * widget in the MainWindow. + */ + void loadPluginFromFileName(QString str); + + /** + * This function hands the received cv::Mat pointer and the current frame + * number to the PluginLoader. + */ + void sendCurrentFrameToPlugin(std::shared_ptr mat, uint number); + + void selectPlugin(QString str); signals: - void emitRemoveTrajectory(IModelTrackedTrajectory* trajectory); - void emitRemoveTrajectoryId(int id); - void emitRemoveTrackEntity(IModelTrackedTrajectory* trajectory, uint frameNumber); - void emitValidateTrajectory(int id); - void emitValidateEntity(IModelTrackedTrajectory* trajectory, uint frameNumber); - void emitAddTrajectory(QPoint pos); - void emitMoveElement(IModelTrackedTrajectory* element, uint frameNumber, QPoint pos); - void emitSwapIds(IModelTrackedTrajectory* trajectory0, IModelTrackedTrajectory* trajectory1); - void emitToggleFixTrack(IModelTrackedTrajectory* trajectory0, bool toggle); - void emitEntityRotation(IModelTrackedTrajectory* trajectory0, double angle, uint frameNumber); - - void emitUpdateView(); - void frameRetrieved(std::shared_ptr mat, uint frameNumber); - void signalCurrentFrameNumberToPlugin(uint frameNumber); - - // IController interface + void emitRemoveTrajectory(IModelTrackedTrajectory* trajectory); + void emitRemoveTrajectoryId(int id); + void emitRemoveTrackEntity(IModelTrackedTrajectory* trajectory, + uint frameNumber); + void emitValidateTrajectory(int id); + void emitValidateEntity(IModelTrackedTrajectory* trajectory, + uint frameNumber); + void emitAddTrajectory(QPoint pos); + void emitMoveElement(IModelTrackedTrajectory* element, + uint frameNumber, + QPoint pos); + void emitSwapIds(IModelTrackedTrajectory* trajectory0, + IModelTrackedTrajectory* trajectory1); + void emitToggleFixTrack(IModelTrackedTrajectory* trajectory0, bool toggle); + void emitEntityRotation(IModelTrackedTrajectory* trajectory0, + double angle, + uint frameNumber); + + void emitUpdateView(); + void frameRetrieved(std::shared_ptr mat, uint frameNumber); + void signalCurrentFrameNumberToPlugin(uint frameNumber); + + // IController interface protected: - void createModel() override; - void createView() override; - void connectModelToController() override; - void connectControllerToController() override; - - void createPlugin(); - - void connectPlugin(); - void disconnectPlugin(); - - private Q_SLOTS: - /** - * - * If Tracking is active and the tracking process was finished, the Plugin is able to emit a Signal that triggers this SLOT. - */ - void receiveTrackingDone(); - /** - * - * Receive command to remove a trajectory and put it in edit queue - */ - void receiveRemoveTrajectory(IModelTrackedTrajectory* trajectory); - /** - * - * Receive command to remove a trajectory by id and put it in edit queue - */ - void receiveRemoveTrajectoryId(int id); - /** - * - * Receive command to remove a track entity and put it in edit queue - */ - void receiveRemoveTrackEntity(IModelTrackedTrajectory* trajectory, uint frameNumber); - /** - * - * Receive command to add a trajectory and put it in edit queue - */ - void receiveAddTrajectory(QPoint pos); - /** - * - * Receive command to move a element in a trajectory and put it in edit queue - */ - void receiveMoveElement(IModelTrackedTrajectory* trajectory, uint frameNumber, QPoint pos, int toMove); - /** - * - * Receive command to swap two ID's and put it in edit queue - */ - void receiveSwapIds(IModelTrackedTrajectory* trajectory0, IModelTrackedTrajectory* trajectory1); - /** - * - * Receive command to revalidate a traj by id - */ - void receiveValidateTrajectory(int id); - /** - * - * Receive command to revalidate a entity - */ - void receiveValidateEntity(IModelTrackedTrajectory* trajectory, uint frameNumber); - /** - * - * Receive command to fix a traj, so the tracker should not change it's data - */ - void receiveToggleFixTrack(IModelTrackedTrajectory* trajectory, bool toggle); - /** - * - * Receive command to rotate an entity - */ - void receiveEntityRotation(IModelTrackedTrajectory* trajectory, double angle, uint frameNumber); - /** - * - * Receive current state of medium (pause or play) - */ - void receivePauseState(bool state); - /** - * - * Receive current frame number from media play to send it to the plugin - */ - void receiveCurrentFrameNumberToPlugin(uint frameNumber); - - + void createModel() override; + void createView() override; + void connectModelToController() override; + void connectControllerToController() override; + + void createPlugin(); + + void connectPlugin(); + void disconnectPlugin(); + +private Q_SLOTS: + /** + * + * If Tracking is active and the tracking process was finished, the Plugin + * is able to emit a Signal that triggers this SLOT. + */ + void receiveTrackingDone(); + /** + * + * Receive command to remove a trajectory and put it in edit queue + */ + void receiveRemoveTrajectory(IModelTrackedTrajectory* trajectory); + /** + * + * Receive command to remove a trajectory by id and put it in edit queue + */ + void receiveRemoveTrajectoryId(int id); + /** + * + * Receive command to remove a track entity and put it in edit queue + */ + void receiveRemoveTrackEntity(IModelTrackedTrajectory* trajectory, + uint frameNumber); + /** + * + * Receive command to add a trajectory and put it in edit queue + */ + void receiveAddTrajectory(QPoint pos); + /** + * + * Receive command to move a element in a trajectory and put it in edit + * queue + */ + void receiveMoveElement(IModelTrackedTrajectory* trajectory, + uint frameNumber, + QPoint pos, + int toMove); + /** + * + * Receive command to swap two ID's and put it in edit queue + */ + void receiveSwapIds(IModelTrackedTrajectory* trajectory0, + IModelTrackedTrajectory* trajectory1); + /** + * + * Receive command to revalidate a traj by id + */ + void receiveValidateTrajectory(int id); + /** + * + * Receive command to revalidate a entity + */ + void receiveValidateEntity(IModelTrackedTrajectory* trajectory, + uint frameNumber); + /** + * + * Receive command to fix a traj, so the tracker should not change it's + * data + */ + void receiveToggleFixTrack(IModelTrackedTrajectory* trajectory, + bool toggle); + /** + * + * Receive command to rotate an entity + */ + void receiveEntityRotation(IModelTrackedTrajectory* trajectory, + double angle, + uint frameNumber); + /** + * + * Receive current state of medium (pause or play) + */ + void receivePauseState(bool state); + /** + * + * Receive current frame number from media play to send it to the plugin + */ + void receiveCurrentFrameNumberToPlugin(uint frameNumber); private: - void loadPluginsFromPluginSubfolder(); + void loadPluginsFromPluginSubfolder(); - IBioTrackerPlugin* m_BioTrackerPlugin; + IBioTrackerPlugin* m_BioTrackerPlugin; - QQueue m_editQueue; + QQueue m_editQueue; - QPointer< QThread > m_TrackingThread; - - PluginLoader* pluginLoader; - - bool m_paused = true; - - uint m_currentFrameNumber = 0; + QPointer m_TrackingThread; + PluginLoader* pluginLoader; + bool m_paused = true; + uint m_currentFrameNumber = 0; }; - - - - #endif // CONTROLLERPLUGIN_H diff --git a/Src/Controller/ControllerTextureObject.cpp b/Src/Controller/ControllerTextureObject.cpp index 7aa3e3ba..b293ad95 100644 --- a/Src/Controller/ControllerTextureObject.cpp +++ b/Src/Controller/ControllerTextureObject.cpp @@ -6,14 +6,18 @@ #include "Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h" #include "View/TextureObjectView.h" -ControllerTextureObject::ControllerTextureObject(QObject* parent, IBioTrackerContext* context, ENUMS::CONTROLLERTYPE ctr) : - IControllerCfg(parent, context, ctr) { +ControllerTextureObject::ControllerTextureObject(QObject* parent, + IBioTrackerContext* context, + ENUMS::CONTROLLERTYPE ctr) +: IControllerCfg(parent, context, ctr) +{ m_TextureViewNamesModel = new QStringListModel(); m_TextureViewNamesModel->setStringList(m_TextureViewNames); } -void ControllerTextureObject::changeTextureModel(QString name) { - if(name == QString("") ) +void ControllerTextureObject::changeTextureModel(QString name) +{ + if (name == QString("")) name = m_DefaultTextureName; checkIfTextureModelExists(name); @@ -22,49 +26,57 @@ void ControllerTextureObject::changeTextureModel(QString name) { changeTextureView(m_Model); } -void ControllerTextureObject::connectControllerToController() { - IController* ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::PLAYER); - QPointer< ControllerPlayer > ctrPlayer = qobject_cast(ctr); +void ControllerTextureObject::connectControllerToController() +{ + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::PLAYER); + QPointer ctrPlayer = qobject_cast( + ctr); - QPointer< VideoControllWidget > videoView = dynamic_cast (ctrPlayer->getView()); + QPointer videoView = + dynamic_cast(ctrPlayer->getView()); videoView->setVideoViewComboboxModel(m_TextureViewNamesModel); - - IController* ctrG = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::GRAPHICSVIEW); - QPointer< ControllerGraphicScene > ctrGraphics = qobject_cast(ctrG); + IController* ctrG = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::GRAPHICSVIEW); + QPointer ctrGraphics = + qobject_cast(ctrG); QGraphicsPixmapItem* item = dynamic_cast(m_View); ctrGraphics->addTextureObject(item); } -void ControllerTextureObject::receiveCvMat(std::shared_ptr mat, QString name) { +void ControllerTextureObject::receiveCvMat(std::shared_ptr mat, + QString name) +{ checkIfTextureModelExists(name); m_TextureObjects.value(name)->set(mat); - } -void ControllerTextureObject::createModel() { +void ControllerTextureObject::createModel() +{ createNewTextureObjectModel(m_DefaultTextureName); m_Model = m_TextureObjects.value(m_DefaultTextureName); } -void ControllerTextureObject::createView() { +void ControllerTextureObject::createView() +{ m_View = new TextureObjectView(this, this, m_Model); } -void ControllerTextureObject::connectModelToController() { - +void ControllerTextureObject::connectModelToController() +{ } -void ControllerTextureObject::checkIfTextureModelExists(QString name) { - if(name == QString("") ) +void ControllerTextureObject::checkIfTextureModelExists(QString name) +{ + if (name == QString("")) name = m_DefaultTextureName; - bool itemIsInList = false; - for (int i = 0 ; i < m_TextureViewNames.size(); ++i) { + for (int i = 0; i < m_TextureViewNames.size(); ++i) { if (m_TextureViewNames.at(i) == name) { itemIsInList = true; @@ -76,15 +88,15 @@ void ControllerTextureObject::checkIfTextureModelExists(QString name) { } } -void ControllerTextureObject::createNewTextureObjectModel(QString name) { +void ControllerTextureObject::createNewTextureObjectModel(QString name) +{ TextureObject* newTextureModel = new TextureObject(this, name); m_TextureObjects.insert(name, newTextureModel); m_TextureViewNames.append(name); m_TextureViewNamesModel->setStringList(m_TextureViewNames); - } -void ControllerTextureObject::changeTextureView(IModel* model) { +void ControllerTextureObject::changeTextureView(IModel* model) +{ m_View->setNewModel(model); - } diff --git a/Src/Controller/ControllerTextureObject.h b/Src/Controller/ControllerTextureObject.h index cdcc50f2..4af23bc9 100644 --- a/Src/Controller/ControllerTextureObject.h +++ b/Src/Controller/ControllerTextureObject.h @@ -1,10 +1,9 @@ /**************************************************************************** - ** - ** This file is part of the BioTracker Framework - ** by Andreas Jörg - ** - ****************************************************************************/ - + ** + ** This file is part of the BioTracker Framework + ** by Andreas Jörg + ** + ****************************************************************************/ #ifndef CONTROLLERTEXTUREOBJECT_H #define CONTROLLERTEXTUREOBJECT_H @@ -19,50 +18,62 @@ #include "QPointer" /** - * This is the Controller class of the software component TextureObject. This component is responsible for rendering cv::Mats on a disply canvas. Other components can trigger the SLOT - * receiveCvMat(std::shard_ptr mat, QString name) in order to render their images. Usually this would be the component MediaPlayer which will send the original cv::Mat from - * an ImageStream to controller class ControllerTextureObject. An other component is the BioTracker Plugin. If a cv::Mat is manipulated by a Tracking Algorithm the Plugin is able to - * send that cv::Mat to this component. The Parameter name will be listed in the combobox widget on the MainWindow widget. - * The ControllerTextureObject class controlls the of the TrextureObject Component. + * This is the Controller class of the software component TextureObject. This + * component is responsible for rendering cv::Mats on a disply canvas. Other + * components can trigger the SLOT receiveCvMat(std::shard_ptr mat, + * QString name) in order to render their images. Usually this would be the + * component MediaPlayer which will send the original cv::Mat from an + * ImageStream to controller class ControllerTextureObject. An other component + * is the BioTracker Plugin. If a cv::Mat is manipulated by a Tracking + * Algorithm the Plugin is able to send that cv::Mat to this component. The + * Parameter name will be listed in the combobox widget on the MainWindow + * widget. The ControllerTextureObject class controlls the of the + * TrextureObject Component. */ -class ControllerTextureObject : public IControllerCfg { +class ControllerTextureObject : public IControllerCfg +{ Q_OBJECT - public: - ControllerTextureObject(QObject* parent = 0, IBioTrackerContext* context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); +public: + ControllerTextureObject( + QObject* parent = 0, + IBioTrackerContext* context = 0, + ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); /** - * If the user changes the combobox widget for the rendered cv::Mat in the MainWindow this methode will change the corresponding IModel class TextureObject. + * If the user changes the combobox widget for the rendered cv::Mat in the + * MainWindow this methode will change the corresponding IModel class + * TextureObject. */ void changeTextureModel(QString name); // IController interface - public: +public: void connectControllerToController() override; - public Q_SLOTS: +public Q_SLOTS: /** - * This SLOT can be triggered by any component that wants to render a cv::Mat. + * This SLOT can be triggered by any component that wants to render a + * cv::Mat. */ void receiveCvMat(std::shared_ptr mat, QString name); - protected: +protected: void createModel() override; void createView() override; void connectModelToController() override; - private: +private: void checkIfTextureModelExists(QString name); void createNewTextureObjectModel(QString name); void changeTextureView(IModel* model); - private: - QMap > m_TextureObjects; +private: + QMap> m_TextureObjects; QString m_DefaultTextureName = "Original"; - QStringList m_TextureViewNames; - QPointer< QStringListModel > m_TextureViewNamesModel; - + QStringList m_TextureViewNames; + QPointer m_TextureViewNamesModel; }; #endif // CONTROLLERTEXTUREOBJECT_H diff --git a/Src/Controller/ControllerTrackedComponentCore.cpp b/Src/Controller/ControllerTrackedComponentCore.cpp index 82d02e82..5a95e4f7 100644 --- a/Src/Controller/ControllerTrackedComponentCore.cpp +++ b/Src/Controller/ControllerTrackedComponentCore.cpp @@ -12,142 +12,232 @@ #include "Interfaces/IView/IViewTrackedComponent.h" #include "Controller/ControllerCommands.h" - -ControllerTrackedComponentCore::ControllerTrackedComponentCore(QObject *parent, IBioTrackerContext *context, ENUMS::CONTROLLERTYPE ctr) : - IControllerCfg(parent, context, ctr) +ControllerTrackedComponentCore::ControllerTrackedComponentCore( + QObject* parent, + IBioTrackerContext* context, + ENUMS::CONTROLLERTYPE ctr) +: IControllerCfg(parent, context, ctr) { - m_View = nullptr; - m_Model = nullptr; + m_View = nullptr; + m_Model = nullptr; } void ControllerTrackedComponentCore::createView() { - //This occurs when there has been a previous plugin to visualize - if (m_View != nullptr) - delete m_View; + // This occurs when there has been a previous plugin to visualize + if (m_View != nullptr) + delete m_View; - m_View = new TrackedComponentView(0, this, m_Model); + m_View = new TrackedComponentView(0, this, m_Model); } void ControllerTrackedComponentCore::connectModelToController() { - } void ControllerTrackedComponentCore::connectControllerToController() { - IController * ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::MAINWINDOW); - QPointer< ControllerMainWindow > ctrMainWindow = qobject_cast(ctr); - - //connect to view - TrackedComponentView* view = static_cast(m_View); - QObject::connect(view, SIGNAL(emitAddTrajectory(QPoint, int)), this, SIGNAL(emitAddTrajectory(QPoint, int))); - QObject::connect(view, SIGNAL(emitSwapIds(IModelTrackedTrajectory*, IModelTrackedTrajectory*)), this, SIGNAL(emitSwapIds(IModelTrackedTrajectory*, IModelTrackedTrajectory*))); - QObject::connect(this, SIGNAL(emitDimensionUpdate(int, int)), view, SLOT(rcvDimensionUpdate(int, int))); - - QObject::connect(this, SIGNAL(emitAddTrack()), view, SLOT(addTrajectory())); - QObject::connect(this, SIGNAL(emitDeleteSelectedTracks()), view, SLOT(removeTrajectories())); - QObject::connect(this, SIGNAL(emitSelectAll()), view, SLOT(receiveSelectAll())); - QObject::connect(this, SIGNAL(emitSwapIdsToView()), view, SLOT(swapIds())); - QObject::connect(this, SIGNAL(emitChangeColorBorder()), view, SLOT(receiveColorChangeBorderSelected())); - QObject::connect(this, SIGNAL(emitChangeColorFill()), view, SLOT(receiveColorChangeBrushSelected())); - - - //connect to update track number in core params - IController * ctrICP = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::COREPARAMETER); - QPointer< ControllerCoreParameter > ctrCP = qobject_cast(ctrICP); - QObject::connect(this, SIGNAL(emitTrackNumber(int)), ctrCP, SLOT(receiveTrackNumber(int))); - - //connect to commandcontroller - IController * ctrICC = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::COMMANDS); - QPointer< ControllerCommands > ctrCC = qobject_cast(ctrICC); - QObject::connect(this, SIGNAL(emitAddTrajectory(QPoint, int)), ctrCC, SLOT(receiveAddTrackCommand(QPoint, int))); - QObject::connect(this, SIGNAL(emitRemoveTrajectory(IModelTrackedTrajectory*)), ctrCC, SLOT(receiveRemoveTrackCommand(IModelTrackedTrajectory*))); - QObject::connect(this, SIGNAL(emitRemoveTrackEntity(IModelTrackedTrajectory*, uint)), ctrCC, SLOT(receiveRemoveTrackEntityCommand(IModelTrackedTrajectory*, uint))); - QObject::connect(this, SIGNAL(emitMoveElement(IModelTrackedTrajectory*, QPoint, QPoint, uint, int)), ctrCC, SLOT(receiveMoveElementCommand(IModelTrackedTrajectory*, QPoint, QPoint, uint, int))); - QObject::connect(this, SIGNAL(emitSwapIds(IModelTrackedTrajectory*, IModelTrackedTrajectory*)), ctrCC, SLOT(receiveSwapIdCommand(IModelTrackedTrajectory*, IModelTrackedTrajectory*))); - QObject::connect(this, SIGNAL(emitToggleFixTrack(IModelTrackedTrajectory*, bool)), ctrCC, SLOT(receiveFixTrackCommand(IModelTrackedTrajectory*, bool))); - QObject::connect(this, SIGNAL(emitEntityRotation(IModelTrackedTrajectory*, double, double, uint)), ctrCC, SLOT(receiveEntityRotation(IModelTrackedTrajectory*, double, double, uint))); - - //connect to controllerPlayer - IController * ctrIP = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::PLAYER); - QPointer< ControllerPlayer > ctrP = qobject_cast(ctrIP); - QObject::connect(this, &ControllerTrackedComponentCore::emitGoToFrame, ctrP, &ControllerPlayer::setGoToFrame); - - - // Tell the Visualization to reset upon loading a new plugin - QObject::connect(ctrMainWindow, &ControllerMainWindow::emitTrackLoaded, this, &ControllerTrackedComponentCore::receiveOnPluginLoaded); - + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::MAINWINDOW); + QPointer ctrMainWindow = + qobject_cast(ctr); + + // connect to view + TrackedComponentView* view = static_cast(m_View); + QObject::connect(view, + SIGNAL(emitAddTrajectory(QPoint, int)), + this, + SIGNAL(emitAddTrajectory(QPoint, int))); + QObject::connect(view, + SIGNAL(emitSwapIds(IModelTrackedTrajectory*, + IModelTrackedTrajectory*)), + this, + SIGNAL(emitSwapIds(IModelTrackedTrajectory*, + IModelTrackedTrajectory*))); + QObject::connect(this, + SIGNAL(emitDimensionUpdate(int, int)), + view, + SLOT(rcvDimensionUpdate(int, int))); + + QObject::connect(this, + SIGNAL(emitAddTrack()), + view, + SLOT(addTrajectory())); + QObject::connect(this, + SIGNAL(emitDeleteSelectedTracks()), + view, + SLOT(removeTrajectories())); + QObject::connect(this, + SIGNAL(emitSelectAll()), + view, + SLOT(receiveSelectAll())); + QObject::connect(this, SIGNAL(emitSwapIdsToView()), view, SLOT(swapIds())); + QObject::connect(this, + SIGNAL(emitChangeColorBorder()), + view, + SLOT(receiveColorChangeBorderSelected())); + QObject::connect(this, + SIGNAL(emitChangeColorFill()), + view, + SLOT(receiveColorChangeBrushSelected())); + + // connect to update track number in core params + IController* ctrICP = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::COREPARAMETER); + QPointer ctrCP = + qobject_cast(ctrICP); + QObject::connect(this, + SIGNAL(emitTrackNumber(int)), + ctrCP, + SLOT(receiveTrackNumber(int))); + + // connect to commandcontroller + IController* ctrICC = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::COMMANDS); + QPointer ctrCC = qobject_cast( + ctrICC); + QObject::connect(this, + SIGNAL(emitAddTrajectory(QPoint, int)), + ctrCC, + SLOT(receiveAddTrackCommand(QPoint, int))); + QObject::connect( + this, + SIGNAL(emitRemoveTrajectory(IModelTrackedTrajectory*)), + ctrCC, + SLOT(receiveRemoveTrackCommand(IModelTrackedTrajectory*))); + QObject::connect( + this, + SIGNAL(emitRemoveTrackEntity(IModelTrackedTrajectory*, uint)), + ctrCC, + SLOT(receiveRemoveTrackEntityCommand(IModelTrackedTrajectory*, uint))); + QObject::connect(this, + SIGNAL(emitMoveElement(IModelTrackedTrajectory*, + QPoint, + QPoint, + uint, + int)), + ctrCC, + SLOT(receiveMoveElementCommand(IModelTrackedTrajectory*, + QPoint, + QPoint, + uint, + int))); + QObject::connect(this, + SIGNAL(emitSwapIds(IModelTrackedTrajectory*, + IModelTrackedTrajectory*)), + ctrCC, + SLOT(receiveSwapIdCommand(IModelTrackedTrajectory*, + IModelTrackedTrajectory*))); + QObject::connect( + this, + SIGNAL(emitToggleFixTrack(IModelTrackedTrajectory*, bool)), + ctrCC, + SLOT(receiveFixTrackCommand(IModelTrackedTrajectory*, bool))); + QObject::connect(this, + SIGNAL(emitEntityRotation(IModelTrackedTrajectory*, + double, + double, + uint)), + ctrCC, + SLOT(receiveEntityRotation(IModelTrackedTrajectory*, + double, + double, + uint))); + + // connect to controllerPlayer + IController* ctrIP = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::PLAYER); + QPointer ctrP = qobject_cast(ctrIP); + QObject::connect(this, + &ControllerTrackedComponentCore::emitGoToFrame, + ctrP, + &ControllerPlayer::setGoToFrame); + + // Tell the Visualization to reset upon loading a new plugin + QObject::connect(ctrMainWindow, + &ControllerMainWindow::emitTrackLoaded, + this, + &ControllerTrackedComponentCore::receiveOnPluginLoaded); } -void ControllerTrackedComponentCore::receiveOnPluginLoaded() { - receiveUpdateView(); +void ControllerTrackedComponentCore::receiveOnPluginLoaded() +{ + receiveUpdateView(); } -void ControllerTrackedComponentCore::setCorePermission(std::pair permission) +void ControllerTrackedComponentCore::setCorePermission( + std::pair permission) { - if (dynamic_cast(m_View)) { - dynamic_cast(m_View)->setPermission(permission); - } - else { - //qDebug() << "no view yet"; - //This should never happen, actually - assert(false); - } + if (dynamic_cast(m_View)) { + dynamic_cast(m_View)->setPermission(permission); + } else { + // qDebug() << "no view yet"; + // This should never happen, actually + assert(false); + } } void ControllerTrackedComponentCore::receiveUpdateView() { - TrackedComponentView* compView = dynamic_cast(m_View); - compView->getNotified(); - //signal the core parameter controller to update the track number - IModelTrackedTrajectory *model = dynamic_cast(getModel()); - int trackNumber = model->validCount(); - emitTrackNumber(trackNumber); + TrackedComponentView* compView = dynamic_cast( + m_View); + compView->getNotified(); + // signal the core parameter controller to update the track number + IModelTrackedTrajectory* model = dynamic_cast( + getModel()); + int trackNumber = model->validCount(); + emitTrackNumber(trackNumber); } void ControllerTrackedComponentCore::createModel() { - // This controller gets his model (via addModel()) from the corresponding tracked-component-controller when a plugin is loaded - m_Model = new null_Model(); + // This controller gets his model (via addModel()) from the corresponding + // tracked-component-controller when a plugin is loaded + m_Model = new null_Model(); } -IView *ControllerTrackedComponentCore::getTrackingElementsWidgetCore() +IView* ControllerTrackedComponentCore::getTrackingElementsWidgetCore() { - return m_View; + return m_View; } IModel* ControllerTrackedComponentCore::getCoreParameter() { - IController * ctr = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::COREPARAMETER); - QPointer< ControllerCoreParameter > ctrCP = qobject_cast(ctr); - return ctrCP->getModel(); + IController* ctr = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::COREPARAMETER); + QPointer ctrCP = + qobject_cast(ctr); + return ctrCP->getModel(); } void ControllerTrackedComponentCore::addModel(IModel* model) { - m_Model = model; - m_View->setNewModel(m_Model); - - TrackedComponentView* view = dynamic_cast(m_View); - - //signal initial track number to core params - IModelTrackedTrajectory *iModel = dynamic_cast(getModel()); - if (iModel) { - int trackNumber = iModel->validCount(); - emitTrackNumber(trackNumber); - } + m_Model = model; + m_View->setNewModel(m_Model); + + TrackedComponentView* view = dynamic_cast(m_View); + + // signal initial track number to core params + IModelTrackedTrajectory* iModel = dynamic_cast( + getModel()); + if (iModel) { + int trackNumber = iModel->validCount(); + emitTrackNumber(trackNumber); + } } -void ControllerTrackedComponentCore::receiveVisualizeTrackingModel(uint framenumber) +void ControllerTrackedComponentCore::receiveVisualizeTrackingModel( + uint framenumber) { - //signal the view to update track entities - TrackedComponentView* compView = dynamic_cast(m_View); - compView->updateShapes(framenumber); - //signal the core parameter controller to update the track number - IModelTrackedTrajectory *model = dynamic_cast(getModel()); - if (model) { - int trackNumber = model->validCount(); - emitTrackNumber(trackNumber); - } + // signal the view to update track entities + TrackedComponentView* compView = dynamic_cast( + m_View); + compView->updateShapes(framenumber); + // signal the core parameter controller to update the track number + IModelTrackedTrajectory* model = dynamic_cast( + getModel()); + if (model) { + int trackNumber = model->validCount(); + emitTrackNumber(trackNumber); + } } diff --git a/Src/Controller/ControllerTrackedComponentCore.h b/Src/Controller/ControllerTrackedComponentCore.h index 69e335d9..44428c16 100644 --- a/Src/Controller/ControllerTrackedComponentCore.h +++ b/Src/Controller/ControllerTrackedComponentCore.h @@ -4,104 +4,120 @@ #include "IControllerCfg.h" #include "Interfaces/IModel/IModelTrackedTrajectory.h" - /** -* The ControllerTrackedComponentCore class controls the component for visualizing TrackedComponents. -* It is basically a forwarder for permissions, user interaction signals (including tracking data manipulation). -*/ + * The ControllerTrackedComponentCore class controls the component for + * visualizing TrackedComponents. It is basically a forwarder for permissions, + * user interaction signals (including tracking data manipulation). + */ class ControllerTrackedComponentCore : public IControllerCfg { - Q_OBJECT + Q_OBJECT public: - ControllerTrackedComponentCore(QObject *parent = 0, IBioTrackerContext *context = 0, - ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); - - /** - * Hook for the view to put in in the mainwindow's media panel each time a plugin is loaded - */ - IView *getTrackingElementsWidgetCore(); - - /** - * The model is actually the tracking data from the tracking plugin. This component only reads this data. - * Is called when a new tracking plugin is loaded. - */ - void addModel(IModel* model); - - /** - * Hook for the view to get the core parameters to set up new componentshapes with default settings - */ - IModel* getCoreParameter(); - - /* - * SIGNALS - */ + ControllerTrackedComponentCore( + QObject* parent = 0, + IBioTrackerContext* context = 0, + ENUMS::CONTROLLERTYPE ctr = + ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); + + /** + * Hook for the view to put in in the mainwindow's media panel each time a + * plugin is loaded + */ + IView* getTrackingElementsWidgetCore(); + + /** + * The model is actually the tracking data from the tracking plugin. This + * component only reads this data. Is called when a new tracking plugin is + * loaded. + */ + void addModel(IModel* model); + + /** + * Hook for the view to get the core parameters to set up new + * componentshapes with default settings + */ + IModel* getCoreParameter(); + + /* + * SIGNALS + */ signals: - /// signal to ctrcommands to remove trajectory - void emitRemoveTrajectory(IModelTrackedTrajectory* trajectory); - - /// signal to ctrcommands to remove entity - void emitRemoveTrackEntity(IModelTrackedTrajectory* trajectory, uint frameNumber); - - /// signal to ctrcommands to add trajectory - void emitAddTrajectory(QPoint pos, int id); + /// signal to ctrcommands to remove trajectory + void emitRemoveTrajectory(IModelTrackedTrajectory* trajectory); - /// signal to ctrcommands to move entity - void emitMoveElement(IModelTrackedTrajectory* trajectory, QPoint oldPos, QPoint newPos, uint frameNumber, int toMove); + /// signal to ctrcommands to remove entity + void emitRemoveTrackEntity(IModelTrackedTrajectory* trajectory, + uint frameNumber); - /// signal to ctrcommands to swap track id's - void emitSwapIds(IModelTrackedTrajectory* trajectory0, IModelTrackedTrajectory* trajectory1); + /// signal to ctrcommands to add trajectory + void emitAddTrajectory(QPoint pos, int id); - /// signal to ctrcommands fix or unfix a traj - void emitToggleFixTrack(IModelTrackedTrajectory* trajectory, bool toggle); + /// signal to ctrcommands to move entity + void emitMoveElement(IModelTrackedTrajectory* trajectory, + QPoint oldPos, + QPoint newPos, + uint frameNumber, + int toMove); - /// signal to ctrcommands rotate entity - void emitEntityRotation(IModelTrackedTrajectory*, double oldAngleDeg, double newAngleDeg, uint frameNumber); + /// signal to ctrcommands to swap track id's + void emitSwapIds(IModelTrackedTrajectory* trajectory0, + IModelTrackedTrajectory* trajectory1); - /// signal to ctrCoreParameter to show number of valid trrajectories + /// signal to ctrcommands fix or unfix a traj + void emitToggleFixTrack(IModelTrackedTrajectory* trajectory, bool toggle); - void emitTrackNumber(int number); + /// signal to ctrcommands rotate entity + void emitEntityRotation(IModelTrackedTrajectory*, + double oldAngleDeg, + double newAngleDeg, + uint frameNumber); - /// signal to view to update its dimensions - void emitDimensionUpdate(int x, int y); + /// signal to ctrCoreParameter to show number of valid trrajectories - //forward left-toolbar actions to view - void emitAddTrack(); - void emitDeleteSelectedTracks(); - void emitSwapIdsToView(); - void emitSelectAll(); - void emitChangeColorBorder(); - void emitChangeColorFill(); - void emitGoToFrame(int frame); + void emitTrackNumber(int number); + /// signal to view to update its dimensions + void emitDimensionUpdate(int x, int y); - /* - * SLOTS - */ - public Q_SLOTS: + // forward left-toolbar actions to view + void emitAddTrack(); + void emitDeleteSelectedTracks(); + void emitSwapIdsToView(); + void emitSelectAll(); + void emitChangeColorBorder(); + void emitChangeColorFill(); + void emitGoToFrame(int frame); - /// A (different) plugin has been loaded. Here, the controller needs to inform the view - void receiveOnPluginLoaded(); + /* + * SLOTS + */ +public Q_SLOTS: - /// this slot gets triggered when the core-view needs to update with the current frame - void receiveVisualizeTrackingModel(uint framenumber); + /// A (different) plugin has been loaded. Here, the controller needs to + /// inform the view + void receiveOnPluginLoaded(); - /// gets triggered when plugin sends permissions and forwards it to the view - void setCorePermission(std::pair permission); + /// this slot gets triggered when the core-view needs to update with the + /// current frame + void receiveVisualizeTrackingModel(uint framenumber); - /// gets triggered when a the view needs an update - void receiveUpdateView(); + /// gets triggered when plugin sends permissions and forwards it to the + /// view + void setCorePermission(std::pair permission); + /// gets triggered when a the view needs an update + void receiveUpdateView(); - // IController interface + // IController interface protected: - void createModel() override; - void createView() override; - void connectModelToController() override; - void connectControllerToController() override; + void createModel() override; + void createView() override; + void connectModelToController() override; + void connectControllerToController() override; - //IView* m_parameterView; - //IModel* m_coreParameterModel; + // IView* m_parameterView; + // IModel* m_coreParameterModel; }; #endif // CONTROLLERTRACKEDCOMPONENTCORE_H diff --git a/Src/Controller/IControllerCfg.cpp b/Src/Controller/IControllerCfg.cpp index ce211b4f..90af64a4 100644 --- a/Src/Controller/IControllerCfg.cpp +++ b/Src/Controller/IControllerCfg.cpp @@ -1,13 +1,18 @@ #include "IControllerCfg.h" -IControllerCfg::IControllerCfg(QObject* parent, IBioTrackerContext* context, ENUMS::CONTROLLERTYPE ctr) : - IController(parent, context, ctr) { +IControllerCfg::IControllerCfg(QObject* parent, + IBioTrackerContext* context, + ENUMS::CONTROLLERTYPE ctr) +: IController(parent, context, ctr) +{ } -void IControllerCfg::setConfig(Config *cfg){ - _cfg=cfg; +void IControllerCfg::setConfig(Config* cfg) +{ + _cfg = cfg; } -Config *IControllerCfg::getConfig(){ +Config* IControllerCfg::getConfig() +{ return _cfg; } \ No newline at end of file diff --git a/Src/Controller/IControllerCfg.h b/Src/Controller/IControllerCfg.h index 14012c0a..d4f32df9 100644 --- a/Src/Controller/IControllerCfg.h +++ b/Src/Controller/IControllerCfg.h @@ -1,9 +1,9 @@ /**************************************************************************** - ** - ** This file is part of the BioTracker Framework - ** by Andreas Jörg - ** - ****************************************************************************/ + ** + ** This file is part of the BioTracker Framework + ** by Andreas Jörg + ** + ****************************************************************************/ #ifndef NULL_CONTROLLER_H #define NULL_CONTROLLER_H @@ -13,19 +13,23 @@ #include "util/Config.h" /** - * The null_Controller class is for initialisation of IController classes instead of using Null Pointers. + * The null_Controller class is for initialisation of IController classes + * instead of using Null Pointers. */ -class IControllerCfg : public IController { +class IControllerCfg : public IController +{ public: - IControllerCfg(QObject* parent = 0, IBioTrackerContext* context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); + IControllerCfg(QObject* parent = 0, + IBioTrackerContext* context = 0, + ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); - void setConfig(Config *cfg); + void setConfig(Config* cfg); - Config *getConfig(); + Config* getConfig(); protected: - Config *_cfg; + Config* _cfg; }; #endif // NULL_CONTROLLER_H diff --git a/Src/Controller/null_Controller.cpp b/Src/Controller/null_Controller.cpp index 612c02f3..194a4683 100644 --- a/Src/Controller/null_Controller.cpp +++ b/Src/Controller/null_Controller.cpp @@ -2,25 +2,20 @@ null_Controller::null_Controller() { - } void null_Controller::createModel() { - } void null_Controller::createView() { - } void null_Controller::connectModelToController() { - } void null_Controller::connectControllerToController() { - } diff --git a/Src/Controller/null_Controller.h b/Src/Controller/null_Controller.h index a3d813cb..0c5d8207 100644 --- a/Src/Controller/null_Controller.h +++ b/Src/Controller/null_Controller.h @@ -1,22 +1,24 @@ /**************************************************************************** - ** - ** This file is part of the BioTracker Framework - ** by Andreas Jörg - ** - ****************************************************************************/ + ** + ** This file is part of the BioTracker Framework + ** by Andreas Jörg + ** + ****************************************************************************/ #pragma once #include "IControllerCfg.h" /** - * The null_Controller class is for initialisation of IController classes instead of using Null Pointers. + * The null_Controller class is for initialisation of IController classes + * instead of using Null Pointers. */ -class null_Controller : public IControllerCfg { - public: +class null_Controller : public IControllerCfg +{ +public: null_Controller(); // IController interface - protected: +protected: void createModel() override; void createView() override; void connectModelToController() override; diff --git a/Src/GuiContext.cpp b/Src/GuiContext.cpp index 9840b020..df986c07 100644 --- a/Src/GuiContext.cpp +++ b/Src/GuiContext.cpp @@ -16,38 +16,78 @@ #include "QDebug" - -GuiContext::GuiContext(QObject *parent, Config *cfg) : - IBioTrackerContext(parent) +GuiContext::GuiContext(QObject* parent, Config* cfg) +: IBioTrackerContext(parent) { - _cfg = cfg; - QPointer< IController > MainWindowController = new ControllerMainWindow(this, this, ENUMS::CONTROLLERTYPE::MAINWINDOW); - QPointer< IController > PlayerController = new ControllerPlayer(this, this, ENUMS::CONTROLLERTYPE::PLAYER); - QPointer< IController > TextureObjectController = new ControllerTextureObject(this, this, ENUMS::CONTROLLERTYPE::TEXTUREOBJECT); - QPointer< IController > GraphicsViewController = new ControllerGraphicScene(this, this, ENUMS::CONTROLLERTYPE::GRAPHICSVIEW); - QPointer< IController > TrackedComponentCoreController = new ControllerTrackedComponentCore(this, this, ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); - QPointer< IController > DataExportController = new ControllerDataExporter(this, this, ENUMS::CONTROLLERTYPE::DATAEXPORT); - QPointer< IController > PluginController = new ControllerPlugin(this, this, ENUMS::CONTROLLERTYPE::PLUGIN); - QPointer< IController > AnnotationsController = new ControllerAnnotations(this, this, ENUMS::CONTROLLERTYPE::ANNOTATIONS); - QPointer< IController > AreaDescriptorController = new ControllerAreaDescriptor(this, this, ENUMS::CONTROLLERTYPE::AREADESCRIPTOR); - QPointer< IController > CoreParameterController = new ControllerCoreParameter(this, this, ENUMS::CONTROLLERTYPE::COREPARAMETER); - QPointer< IController > CommandsController = new ControllerCommands(this, this, ENUMS::CONTROLLERTYPE::COMMANDS); - QPointer< IController > NotificationController = new ControllerNotifications(this, this, ENUMS::CONTROLLERTYPE::NOTIFICATION); + _cfg = cfg; + QPointer MainWindowController = new ControllerMainWindow( + this, + this, + ENUMS::CONTROLLERTYPE::MAINWINDOW); + QPointer PlayerController = + new ControllerPlayer(this, this, ENUMS::CONTROLLERTYPE::PLAYER); + QPointer TextureObjectController = + new ControllerTextureObject(this, + this, + ENUMS::CONTROLLERTYPE::TEXTUREOBJECT); + QPointer GraphicsViewController = new ControllerGraphicScene( + this, + this, + ENUMS::CONTROLLERTYPE::GRAPHICSVIEW); + QPointer TrackedComponentCoreController = + new ControllerTrackedComponentCore( + this, + this, + ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); + QPointer DataExportController = new ControllerDataExporter( + this, + this, + ENUMS::CONTROLLERTYPE::DATAEXPORT); + QPointer PluginController = + new ControllerPlugin(this, this, ENUMS::CONTROLLERTYPE::PLUGIN); + QPointer AnnotationsController = new ControllerAnnotations( + this, + this, + ENUMS::CONTROLLERTYPE::ANNOTATIONS); + QPointer AreaDescriptorController = + new ControllerAreaDescriptor(this, + this, + ENUMS::CONTROLLERTYPE::AREADESCRIPTOR); + QPointer CoreParameterController = + new ControllerCoreParameter(this, + this, + ENUMS::CONTROLLERTYPE::COREPARAMETER); + QPointer CommandsController = + new ControllerCommands(this, this, ENUMS::CONTROLLERTYPE::COMMANDS); + QPointer NotificationController = new ControllerNotifications( + this, + this, + ENUMS::CONTROLLERTYPE::NOTIFICATION); - m_ControllersMap.insert(ENUMS::CONTROLLERTYPE::MAINWINDOW, MainWindowController); + m_ControllersMap.insert(ENUMS::CONTROLLERTYPE::MAINWINDOW, + MainWindowController); m_ControllersMap.insert(ENUMS::CONTROLLERTYPE::PLAYER, PlayerController); - m_ControllersMap.insert(ENUMS::CONTROLLERTYPE::TEXTUREOBJECT, TextureObjectController); - m_ControllersMap.insert(ENUMS::CONTROLLERTYPE::GRAPHICSVIEW, GraphicsViewController); - m_ControllersMap.insert(ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE, TrackedComponentCoreController); - m_ControllersMap.insert(ENUMS::CONTROLLERTYPE::DATAEXPORT, DataExportController); - m_ControllersMap.insert(ENUMS::CONTROLLERTYPE::PLUGIN, PluginController); - m_ControllersMap.insert(ENUMS::CONTROLLERTYPE::ANNOTATIONS, AnnotationsController); - m_ControllersMap.insert(ENUMS::CONTROLLERTYPE::AREADESCRIPTOR, AreaDescriptorController); - m_ControllersMap.insert(ENUMS::CONTROLLERTYPE::COREPARAMETER, CoreParameterController); - m_ControllersMap.insert(ENUMS::CONTROLLERTYPE::COMMANDS, CommandsController); - m_ControllersMap.insert(ENUMS::CONTROLLERTYPE::NOTIFICATION, NotificationController); + m_ControllersMap.insert(ENUMS::CONTROLLERTYPE::TEXTUREOBJECT, + TextureObjectController); + m_ControllersMap.insert(ENUMS::CONTROLLERTYPE::GRAPHICSVIEW, + GraphicsViewController); + m_ControllersMap.insert(ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE, + TrackedComponentCoreController); + m_ControllersMap.insert(ENUMS::CONTROLLERTYPE::DATAEXPORT, + DataExportController); + m_ControllersMap.insert(ENUMS::CONTROLLERTYPE::PLUGIN, PluginController); + m_ControllersMap.insert(ENUMS::CONTROLLERTYPE::ANNOTATIONS, + AnnotationsController); + m_ControllersMap.insert(ENUMS::CONTROLLERTYPE::AREADESCRIPTOR, + AreaDescriptorController); + m_ControllersMap.insert(ENUMS::CONTROLLERTYPE::COREPARAMETER, + CoreParameterController); + m_ControllersMap.insert(ENUMS::CONTROLLERTYPE::COMMANDS, + CommandsController); + m_ControllersMap.insert(ENUMS::CONTROLLERTYPE::NOTIFICATION, + NotificationController); - for (auto x: m_ControllersMap){ + for (auto x : m_ControllersMap) { auto c = static_cast(x); c->setConfig(_cfg); } @@ -55,42 +95,43 @@ GuiContext::GuiContext(QObject *parent, Config *cfg) : void GuiContext::loadBioTrackerPlugin(QString str) { - qobject_cast (m_ControllersMap.value(ENUMS::CONTROLLERTYPE::PLUGIN))->loadPluginFromFileName(str); -} + qobject_cast( + m_ControllersMap.value(ENUMS::CONTROLLERTYPE::PLUGIN)) + ->loadPluginFromFileName(str); +} void GuiContext::createAppController() { - QMap::iterator i; - for (i = m_ControllersMap.begin(); i != m_ControllersMap.end(); ++i) - { + QMap::iterator i; + for (i = m_ControllersMap.begin(); i != m_ControllersMap.end(); ++i) { i.value()->createComponents(); } } void GuiContext::connectController() { - QMap::iterator i; - for (i = m_ControllersMap.begin(); i != m_ControllersMap.end(); ++i) - { + QMap::iterator i; + for (i = m_ControllersMap.begin(); i != m_ControllersMap.end(); ++i) { i.value()->connectComponents(); } } -void GuiContext::exit() { +void GuiContext::exit() +{ - QString cfgLoc = _cfg->CfgCustomLocation.isEmpty()?Config::configLocation:_cfg->CfgCustomLocation; + QString cfgLoc = _cfg->CfgCustomLocation.isEmpty() + ? Config::configLocation + : _cfg->CfgCustomLocation; _cfg->save(cfgLoc, "config.ini"); - QMap::iterator i; - for (i = m_ControllersMap.begin(); i != m_ControllersMap.end(); ++i) - { + QMap::iterator i; + for (i = m_ControllersMap.begin(); i != m_ControllersMap.end(); ++i) { i.value()->cleanup(); } - - for (auto&& i : m_ControllersMap) - { + + for (auto&& i : m_ControllersMap) { delete i; } qApp->exit(); - std::exit(0); + std::exit(0); } diff --git a/Src/GuiContext.h b/Src/GuiContext.h index 31944c92..78a3f118 100644 --- a/Src/GuiContext.h +++ b/Src/GuiContext.h @@ -10,20 +10,21 @@ class GuiContext : public IBioTrackerContext Q_OBJECT public: - GuiContext(QObject *parent = 0, Config *cfg = nullptr); - ~GuiContext() { - exit(); - } + GuiContext(QObject* parent = 0, Config* cfg = nullptr); + ~GuiContext() + { + exit(); + } void loadBioTrackerPlugin(QString str); - void exit(); + void exit(); // IBioTrackerContext interface protected: - void createAppController() override; - void connectController() override; - Config *_cfg; + void createAppController() override; + void connectController() override; + Config* _cfg; }; #endif // GUICONTEXT_H diff --git a/Src/IStates/IPlayerState.cpp b/Src/IStates/IPlayerState.cpp index 760f9f45..a7c57e8e 100644 --- a/Src/IStates/IPlayerState.cpp +++ b/Src/IStates/IPlayerState.cpp @@ -4,29 +4,38 @@ #include "opencv2/core/core.hpp" -IPlayerState::IPlayerState(MediaPlayerStateMachine* player, std::shared_ptr imageStream) : - m_Player(player), - m_ImageStream(imageStream) { - m_FrameNumber = 0; +IPlayerState::IPlayerState( + MediaPlayerStateMachine* player, + std::shared_ptr imageStream) +: m_Player(player) +, m_ImageStream(imageStream) +{ + m_FrameNumber = 0; } -std::shared_ptr IPlayerState::getCurrentFrame() { +std::shared_ptr IPlayerState::getCurrentFrame() +{ return m_Mat; } -size_t IPlayerState::getCurrentFrameNumber() { +size_t IPlayerState::getCurrentFrameNumber() +{ return m_FrameNumber; } -void IPlayerState::changeImageStream(std::shared_ptr imageStream) { +void IPlayerState::changeImageStream( + std::shared_ptr imageStream) +{ m_ImageStream.reset(); m_ImageStream = imageStream; } -stateParameters IPlayerState::getStateParameters() { +stateParameters IPlayerState::getStateParameters() +{ return m_StateParameters; } -QString IPlayerState::getCurrentFileName() { - return QString::fromStdString( m_ImageStream->currentFilename() ); +QString IPlayerState::getCurrentFileName() +{ + return QString::fromStdString(m_ImageStream->currentFilename()); } diff --git a/Src/IStates/IPlayerState.h b/Src/IStates/IPlayerState.h index a8d513b5..42bead66 100644 --- a/Src/IStates/IPlayerState.h +++ b/Src/IStates/IPlayerState.h @@ -1,10 +1,9 @@ /**************************************************************************** - ** - ** This file is part of the BioTracker Framework - ** by Andreas Jörg - ** - ****************************************************************************/ - + ** + ** This file is part of the BioTracker Framework + ** by Andreas Jörg + ** + ****************************************************************************/ #ifndef IPLAYERSTATE_H #define IPLAYERSTATE_H @@ -17,96 +16,120 @@ #include "QPointer" /** - * The stateParameters struct represents the possible stats for the VideoControll buttons in the MainWindow widget. - * If a value is true, the button will be available to the user. If a value is false, the button is deactivated in the MainWindow. + * The stateParameters struct represents the possible stats for the + * VideoControll buttons in the MainWindow widget. If a value is true, the + * button will be available to the user. If a value is false, the button is + * deactivated in the MainWindow. */ -struct stateParameters { +struct stateParameters +{ bool m_Play; bool m_Forw; bool m_Back; bool m_Stop; - bool m_Paus; - bool m_RecI; - bool m_RecO; + bool m_Paus; + bool m_RecI; + bool m_RecO; }; class MediaPlayerStateMachine; /** - * The IPlayerState class is the interface for all states of the MediaPlayerStateMachine. - * This class is responsible for manipulating ImageStreams with its method operate(). - * If new states are required simply create them and add a name for the state to the - * ENUMERATION PLAYER_STATES. + * The IPlayerState class is the interface for all states of the + * MediaPlayerStateMachine. This class is responsible for manipulating + * ImageStreams with its method operate(). If new states are required simply + * create them and add a name for the state to the ENUMERATION PLAYER_STATES. * - * Any State class is able to set its following state in the MediaPlayerStateMachine. + * Any State class is able to set its following state in the + * MediaPlayerStateMachine. * */ -class IPlayerState : public IModel { - Q_OBJECT +class IPlayerState : public IModel +{ + Q_OBJECT public: - explicit IPlayerState(MediaPlayerStateMachine* player, std::shared_ptr imageStream); - enum PLAYER_STATES {STATE_INITIAL, STATE_INITIAL_STREAM, STATE_PLAY, STATE_STEP_FORW, - STATE_STEP_BACK, STATE_PAUSE, STATE_WAIT, STATE_GOTOFRAME - }; - Q_ENUM(PLAYER_STATES) - + explicit IPlayerState( + MediaPlayerStateMachine* player, + std::shared_ptr imageStream); + enum PLAYER_STATES + { + STATE_INITIAL, + STATE_INITIAL_STREAM, + STATE_PLAY, + STATE_STEP_FORW, + STATE_STEP_BACK, + STATE_PAUSE, + STATE_WAIT, + STATE_GOTOFRAME + }; + Q_ENUM(PLAYER_STATES) public: - /** - * If the user changes the Image Source all states will be informed throught this method. - */ - void changeImageStream(std::shared_ptr imageStream); - - /** - * Must be implemented by any state. Implement here the ImageStream manipulation. - */ - virtual void operate() = 0; - - /** - * Returns the State Parameters for the ImageStream controlls in the VideoViewWidget. - */ - stateParameters getStateParameters(); - - /** - * Returns the current filename of the ImageStream. - */ - QString getCurrentFileName(); - - /** - * Returns the current title of the ImageStream. - */ - std::string getCurrentTitle() { return m_ImageStream->getTitle(); }; - - std::vector getBatchItems() { return m_ImageStream->getBatchItems(); }; - - /** - * Returns the current cv::Mat of the ImageStream. - */ - std::shared_ptr getCurrentFrame(); - - /** - * Returns the current frame number of the ImageStream. - */ - size_t getCurrentFrameNumber(); - - //TODO: The Media player does not hold a valid imagestream. Hence use the current state's stream to grab details - std::shared_ptr m_ImageStream; - - + /** + * If the user changes the Image Source all states will be informed + * throught this method. + */ + void changeImageStream( + std::shared_ptr imageStream); + + /** + * Must be implemented by any state. Implement here the ImageStream + * manipulation. + */ + virtual void operate() = 0; + + /** + * Returns the State Parameters for the ImageStream controlls in the + * VideoViewWidget. + */ + stateParameters getStateParameters(); + + /** + * Returns the current filename of the ImageStream. + */ + QString getCurrentFileName(); + + /** + * Returns the current title of the ImageStream. + */ + std::string getCurrentTitle() + { + return m_ImageStream->getTitle(); + }; + + std::vector getBatchItems() + { + return m_ImageStream->getBatchItems(); + }; + + /** + * Returns the current cv::Mat of the ImageStream. + */ + std::shared_ptr getCurrentFrame(); + + /** + * Returns the current frame number of the ImageStream. + */ + size_t getCurrentFrameNumber(); + + // TODO: The Media player does not hold a valid imagestream. Hence use the + // current state's stream to grab details + std::shared_ptr m_ImageStream; + Q_SIGNALS: - void emitNextMediaInBatch(const std::string path); - void emitNextMediaInBatchLoaded(const std::string path); + void emitNextMediaInBatch(const std::string path); + void emitNextMediaInBatchLoaded(const std::string path); protected: - MediaPlayerStateMachine* m_Player; + MediaPlayerStateMachine* m_Player; - stateParameters m_StateParameters; + stateParameters m_StateParameters; - std::shared_ptr m_Mat; - size_t m_FrameNumber; - std::fstream fs; + std::shared_ptr m_Mat; + size_t m_FrameNumber; + std::fstream fs; - QString m_currentFileName; + QString m_currentFileName; }; #endif // IPLAYERSTATE_H diff --git a/Src/Model/Annotations.cpp b/Src/Model/Annotations.cpp index c43209bf..461f7c7b 100644 --- a/Src/Model/Annotations.cpp +++ b/Src/Model/Annotations.cpp @@ -13,458 +13,490 @@ #include #include -Annotations::~Annotations() +Annotations::~Annotations() { - serialize(); + serialize(); } std::string Annotations::getFilename() const { - return filepath + ".annotations.json"; + return filepath + ".annotations.json"; } void Annotations::serialize() const { - if (!dirty || filepath.empty()) return; - - QJsonArray serializedAnnotations; - for (auto & annotation : annotations) - { - serializedAnnotations.append(QJsonObject::fromVariantMap(annotation->serializeToMap())); - } - QJsonDocument jsonDocument(serializedAnnotations); - QFile outfile { QString::fromStdString(getFilename()) }; - if (!outfile.open(QFile::WriteOnly)) - return; - outfile.write(jsonDocument.toJson()); - - dirty = false; + if (!dirty || filepath.empty()) + return; + + QJsonArray serializedAnnotations; + for (auto& annotation : annotations) { + serializedAnnotations.append( + QJsonObject::fromVariantMap(annotation->serializeToMap())); + } + QJsonDocument jsonDocument(serializedAnnotations); + QFile outfile{QString::fromStdString(getFilename())}; + if (!outfile.open(QFile::WriteOnly)) + return; + outfile.write(jsonDocument.toJson()); + + dirty = false; } void Annotations::deserialize() { - if (filepath.empty()) return; - QFile infile { QString::fromStdString(getFilename()) }; - if (!infile.open(QFile::ReadOnly)) return; - const QJsonDocument jsonDocument { QJsonDocument::fromJson(infile.readAll()) }; - const QJsonArray jsonArray(jsonDocument.array()); - - for (const auto & serializedAnnotation : jsonArray) - { - const auto jsonObject { serializedAnnotation.toObject() }; - const QString type { jsonObject["type"].toString() }; - - std::shared_ptr annotation; - if (type == "arrow") - annotation = std::make_shared(); - else if (type == "label") - annotation = std::make_shared(); - else if (type == "rect") - annotation = std::make_shared(); - else if (type == "ellipse") - annotation = std::make_shared(); - if (annotation) - { - annotation->deserializeFrom(jsonObject.toVariantMap()); - annotations.push_back(annotation); - } - } - - dirty = false; + if (filepath.empty()) + return; + QFile infile{QString::fromStdString(getFilename())}; + if (!infile.open(QFile::ReadOnly)) + return; + const QJsonDocument jsonDocument{ + QJsonDocument::fromJson(infile.readAll())}; + const QJsonArray jsonArray(jsonDocument.array()); + + for (const auto& serializedAnnotation : jsonArray) { + const auto jsonObject{serializedAnnotation.toObject()}; + const QString type{jsonObject["type"].toString()}; + + std::shared_ptr annotation; + if (type == "arrow") + annotation = std::make_shared(); + else if (type == "label") + annotation = std::make_shared(); + else if (type == "rect") + annotation = std::make_shared(); + else if (type == "ellipse") + annotation = std::make_shared(); + if (annotation) { + annotation->deserializeFrom(jsonObject.toVariantMap()); + annotations.push_back(annotation); + } + } + + dirty = false; } -void Annotations::updateTrackedAnnotations(const QList &trackedComponents) +void Annotations::updateTrackedAnnotations( + const QList& trackedComponents) { - for (auto &annotation : annotations) - { - annotation->updateTrackedPositions(static_cast(getCurrentFrame()), trackedComponents); - } + for (auto& annotation : annotations) { + annotation->updateTrackedPositions(static_cast(getCurrentFrame()), + trackedComponents); + } } -void Annotations::TrackedPoint::update(int currentFrameID, const QList &trackedComponents) +void Annotations::TrackedPoint::update( + int currentFrameID, + const QList& trackedComponents) { - if (!isLinkedToTrack) return; - - for (const auto &trackedComponent : trackedComponents) - { - const auto trackedTrajectory = dynamic_cast (trackedComponent); - if (trackedTrajectory == nullptr) continue; - if (trackedTrajectory->getId() != trackID) continue; - - const auto &childComponent = trackedTrajectory->getChild(currentFrameID); - const auto point = dynamic_cast (childComponent); - if (point == nullptr) return; - - position = QPoint(static_cast(point->getXpx()), static_cast(point->getYpx())); - return; - } + if (!isLinkedToTrack) + return; + + for (const auto& trackedComponent : trackedComponents) { + const auto trackedTrajectory = dynamic_cast( + trackedComponent); + if (trackedTrajectory == nullptr) + continue; + if (trackedTrajectory->getId() != trackID) + continue; + + const auto& childComponent = trackedTrajectory->getChild( + currentFrameID); + const auto point = dynamic_cast( + childComponent); + if (point == nullptr) + return; + + position = QPoint(static_cast(point->getXpx()), + static_cast(point->getYpx())); + return; + } } -void Annotations::Annotation::drawHandleLocation(QPainter *painter, QPoint pos, QString text) +void Annotations::Annotation::drawHandleLocation(QPainter* painter, + QPoint pos, + QString text) { - QPen original{ painter->pen() }; - QPen dotted{ original }; - dotted.setStyle(Qt::PenStyle::DotLine); - dotted.setWidthF(dotted.widthF() / 4.0); - painter->setPen(dotted); - const int radius = 20; - painter->drawEllipse(pos, radius, radius); - - //text slighy other color --> hue + 20 - //so text can be read when annotation is also contrasting with the background - QPen textPen{ original }; - QColor textColor{ dotted.color() }; - textColor.setHsv(textColor.hsvHue() + 20, textColor.hsvSaturation(), textColor.value()); - textPen.setColor(textColor); - painter->setPen(textPen); - - //font - QFont font= painter->font(); - font.setPointSize(15); - painter->setFont(font); - - //calculate text width to position variably - QFontMetrics fm(font); - int width = fm.width(text); - int height = fm.height(); - - //text position under origin handle - QPoint textPos = pos + QPoint(-width / 2, 20 + height); - - //draw text - painter->drawText(textPos, text); - - painter->setPen(original); + QPen original{painter->pen()}; + QPen dotted{original}; + dotted.setStyle(Qt::PenStyle::DotLine); + dotted.setWidthF(dotted.widthF() / 4.0); + painter->setPen(dotted); + const int radius = 20; + painter->drawEllipse(pos, radius, radius); + + // text slighy other color --> hue + 20 + // so text can be read when annotation is also contrasting with the + // background + QPen textPen{original}; + QColor textColor{dotted.color()}; + textColor.setHsv(textColor.hsvHue() + 20, + textColor.hsvSaturation(), + textColor.value()); + textPen.setColor(textColor); + painter->setPen(textPen); + + // font + QFont font = painter->font(); + font.setPointSize(15); + painter->setFont(font); + + // calculate text width to position variably + QFontMetrics fm(font); + int width = fm.width(text); + int height = fm.height(); + + // text position under origin handle + QPoint textPos = pos + QPoint(-width / 2, 20 + height); + + // draw text + painter->drawText(textPos, text); + + painter->setPen(original); } -bool Annotations::Annotation::isHandleAtPosition(const QPoint &handle, const QPoint &pos) +bool Annotations::Annotation::isHandleAtPosition(const QPoint& handle, + const QPoint& pos) { - QPoint diff = handle - pos; - const float euclidian = std::sqrt((diff.x() * diff.x()) + (diff.y() * diff.y())); - return euclidian <= 20.0; + QPoint diff = handle - pos; + const float euclidian = std::sqrt((diff.x() * diff.x()) + + (diff.y() * diff.y())); + return euclidian <= 20.0; } -void Annotations::Annotation::deserializeFrom(const QMap &map) +void Annotations::Annotation::deserializeFrom( + const QMap& map) { - text = map.value("comment", text).toString(); - startFrame = map.value("start_frame", static_cast(startFrame)).toInt(); - endFrame = map.value("end_frame", static_cast(endFrame)).toInt(); - origin.position.setX(map.value("origin_x", origin.x()).toInt()); - origin.position.setY(map.value("origin_y", origin.y()).toInt()); - if (map.contains("origin_track_id")) - { - origin.isLinkedToTrack = true; - origin.trackID = map.value("origin_track_id").toInt(); - } + text = map.value("comment", text).toString(); + startFrame = + map.value("start_frame", static_cast(startFrame)).toInt(); + endFrame = map.value("end_frame", static_cast(endFrame)).toInt(); + origin.position.setX(map.value("origin_x", origin.x()).toInt()); + origin.position.setY(map.value("origin_y", origin.y()).toInt()); + if (map.contains("origin_track_id")) { + origin.isLinkedToTrack = true; + origin.trackID = map.value("origin_track_id").toInt(); + } } QMap Annotations::Annotation::serializeToMap() const { - QMap map; - map["type"] = QString::fromStdString(name()); - map["comment"] = text; - map["start_frame"] = static_cast(startFrame); - map["end_frame"] = static_cast(endFrame); - - if (origin.isLinkedToTrack) - { - map["origin_track_id"] = origin.trackID; - } - else - { - map["origin_x"] = origin.x(); - map["origin_y"] = origin.y(); - } - return map; + QMap map; + map["type"] = QString::fromStdString(name()); + map["comment"] = text; + map["start_frame"] = static_cast(startFrame); + map["end_frame"] = static_cast(endFrame); + + if (origin.isLinkedToTrack) { + map["origin_track_id"] = origin.trackID; + } else { + map["origin_x"] = origin.x(); + map["origin_y"] = origin.y(); + } + return map; } -void Annotations::AnnotationLabel::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) const +void Annotations::AnnotationLabel::paint( + QPainter* painter, + const QStyleOptionGraphicsItem* option, + QWidget* widget) const { - QPen original{ painter->pen() }; - QPen thin{ original }; - thin.setWidthF(1.0); - painter->setPen(thin); - const int len = 20; - painter->drawLine(*this->origin + QPoint(-len, -len), *this->origin + QPoint(+len, +len)); - painter->drawLine(*this->origin + QPoint(-len, len), *this->origin + QPoint(+len, -len)); - - painter->setPen(original); - - Annotation::drawHandleLocation(painter, origin, text); + QPen original{painter->pen()}; + QPen thin{original}; + thin.setWidthF(1.0); + painter->setPen(thin); + const int len = 20; + painter->drawLine(*this->origin + QPoint(-len, -len), + *this->origin + QPoint(+len, +len)); + painter->drawLine(*this->origin + QPoint(-len, len), + *this->origin + QPoint(+len, -len)); + + painter->setPen(original); + + Annotation::drawHandleLocation(painter, origin, text); } -void Annotations::AnnotationArrow::deserializeFrom(const QMap &map) +void Annotations::AnnotationArrow::deserializeFrom( + const QMap& map) { - Annotation::deserializeFrom(map); - arrowHead.position.setX(map.value("end_x", arrowHead.x()).toInt()); - arrowHead.position.setY(map.value("end_y", arrowHead.y()).toInt()); - if (map.contains("end_track_id")) - { - arrowHead.isLinkedToTrack = true; - arrowHead.trackID = map.value("end_track_id").toInt(); - } + Annotation::deserializeFrom(map); + arrowHead.position.setX(map.value("end_x", arrowHead.x()).toInt()); + arrowHead.position.setY(map.value("end_y", arrowHead.y()).toInt()); + if (map.contains("end_track_id")) { + arrowHead.isLinkedToTrack = true; + arrowHead.trackID = map.value("end_track_id").toInt(); + } } QMap Annotations::AnnotationArrow::serializeToMap() const { - auto base = Annotations::Annotation::serializeToMap(); - if (arrowHead.isLinkedToTrack) - { - base["end_track_id"] = arrowHead.trackID; - } - else - { - base["end_x"] = arrowHead.x(); - base["end_y"] = arrowHead.y(); - } - return base; + auto base = Annotations::Annotation::serializeToMap(); + if (arrowHead.isLinkedToTrack) { + base["end_track_id"] = arrowHead.trackID; + } else { + base["end_x"] = arrowHead.x(); + base["end_y"] = arrowHead.y(); + } + return base; } -void Annotations::AnnotationArrow::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) const +void Annotations::AnnotationArrow::paint( + QPainter* painter, + const QStyleOptionGraphicsItem* option, + QWidget* widget) const { - painter->drawLine(this->origin.getPoint(), this->arrowHead.getPoint()); - // Draw the origin slightly bigger. - { - painter->save(); - QPen thick{ painter->pen() }; - thick.setWidthF(thick.widthF()* 2.5f); - painter->setPen(thick); - painter->drawPoint(this->origin.getPoint()); - painter->restore(); - } - // Draw the arrowhead slightly thinner. - { - painter->save(); - QPen thin{ painter->pen() }; - thin.setWidthF(thin.widthF()* 0.5f); - painter->setPen(thin); - painter->drawPoint(this->arrowHead.getPoint()); - painter->restore(); - } - Annotation::drawHandleLocation(painter, origin, text ); - Annotation::drawHandleLocation(painter, arrowHead, ""); + painter->drawLine(this->origin.getPoint(), this->arrowHead.getPoint()); + // Draw the origin slightly bigger. + { + painter->save(); + QPen thick{painter->pen()}; + thick.setWidthF(thick.widthF() * 2.5f); + painter->setPen(thick); + painter->drawPoint(this->origin.getPoint()); + painter->restore(); + } + // Draw the arrowhead slightly thinner. + { + painter->save(); + QPen thin{painter->pen()}; + thin.setWidthF(thin.widthF() * 0.5f); + painter->setPen(thin); + painter->drawPoint(this->arrowHead.getPoint()); + painter->restore(); + } + Annotation::drawHandleLocation(painter, origin, text); + Annotation::drawHandleLocation(painter, arrowHead, ""); } -Annotations::TrackedPoint *Annotations::AnnotationArrow::getHandleForPosition(const QPoint &pos) +Annotations::TrackedPoint* Annotations::AnnotationArrow::getHandleForPosition( + const QPoint& pos) { - if (isHandleAtPosition(arrowHead, pos)) return &arrowHead; - return Annotation::getHandleForPosition(pos); + if (isHandleAtPosition(arrowHead, pos)) + return &arrowHead; + return Annotation::getHandleForPosition(pos); } -void Annotations::AnnotationArrow::updateTrackedPositions(int currentFrameID, const QList &trackedComponents) +void Annotations::AnnotationArrow::updateTrackedPositions( + int currentFrameID, + const QList& trackedComponents) { - Annotation::updateTrackedPositions(currentFrameID, trackedComponents); - arrowHead.update(currentFrameID, trackedComponents); + Annotation::updateTrackedPositions(currentFrameID, trackedComponents); + arrowHead.update(currentFrameID, trackedComponents); } -void Annotations::AnnotationRect::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) const +void Annotations::AnnotationRect::paint(QPainter* painter, + const QStyleOptionGraphicsItem* option, + QWidget* widget) const { - QRect rect{ origin.getPoint(), arrowHead.getPoint() }; - painter->drawRect(rect); - // Draw the origin slightly bigger. - { - painter->save(); - QPen thick{ painter->pen() }; - thick.setWidthF(thick.widthF()* 2.5f); - painter->setPen(thick); - painter->drawPoint(origin.getPoint()); - painter->restore(); - } - // Draw the bottom right point slightly thinner. - { - painter->save(); - QPen thin{ painter->pen() }; - thin.setWidthF(thin.widthF()* 0.5f); - painter->setPen(thin); - painter->drawPoint(arrowHead.getPoint()); - painter->restore(); - } - Annotation::drawHandleLocation(painter, origin, text); - Annotation::drawHandleLocation(painter, arrowHead, ""); + QRect rect{origin.getPoint(), arrowHead.getPoint()}; + painter->drawRect(rect); + // Draw the origin slightly bigger. + { + painter->save(); + QPen thick{painter->pen()}; + thick.setWidthF(thick.widthF() * 2.5f); + painter->setPen(thick); + painter->drawPoint(origin.getPoint()); + painter->restore(); + } + // Draw the bottom right point slightly thinner. + { + painter->save(); + QPen thin{painter->pen()}; + thin.setWidthF(thin.widthF() * 0.5f); + painter->setPen(thin); + painter->drawPoint(arrowHead.getPoint()); + painter->restore(); + } + Annotation::drawHandleLocation(painter, origin, text); + Annotation::drawHandleLocation(painter, arrowHead, ""); } -void Annotations::AnnotationEllipse::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) const +void Annotations::AnnotationEllipse::paint( + QPainter* painter, + const QStyleOptionGraphicsItem* option, + QWidget* widget) const { - QRect rect{ origin.getPoint(), arrowHead.getPoint() }; - painter->drawEllipse(rect); - // Draw the origin slightly bigger. - { - painter->save(); - QPen thick{ painter->pen() }; - thick.setWidthF(thick.widthF()* 2.5f); - painter->setPen(thick); - painter->drawPoint(origin.getPoint()); - painter->restore(); - } - // Draw the bottom right point slightly thinner. - { - painter->save(); - QPen thin{ painter->pen() }; - thin.setWidthF(thin.widthF()* 0.5f); - painter->setPen(thin); - painter->drawPoint(arrowHead.getPoint()); - painter->restore(); - } - Annotation::drawHandleLocation(painter, origin, text); - Annotation::drawHandleLocation(painter, arrowHead, ""); + QRect rect{origin.getPoint(), arrowHead.getPoint()}; + painter->drawEllipse(rect); + // Draw the origin slightly bigger. + { + painter->save(); + QPen thick{painter->pen()}; + thick.setWidthF(thick.widthF() * 2.5f); + painter->setPen(thick); + painter->drawPoint(origin.getPoint()); + painter->restore(); + } + // Draw the bottom right point slightly thinner. + { + painter->save(); + QPen thin{painter->pen()}; + thin.setWidthF(thin.widthF() * 0.5f); + painter->setPen(thin); + painter->drawPoint(arrowHead.getPoint()); + painter->restore(); + } + Annotation::drawHandleLocation(painter, origin, text); + Annotation::drawHandleLocation(painter, arrowHead, ""); } void Annotations::startArrow(QPoint origin, size_t currentFrame) { - currentAnnotation = std::make_shared(origin, currentFrame); + currentAnnotation = std::make_shared(origin, + currentFrame); } void Annotations::startLabel(QPoint origin, size_t currentFrame) { - currentAnnotation = std::make_shared(origin, currentFrame); + currentAnnotation = std::make_shared(origin, + currentFrame); } void Annotations::startRect(QPoint origin, size_t currentFrame) { - currentAnnotation = std::make_shared(origin, currentFrame); + currentAnnotation = std::make_shared(origin, currentFrame); } void Annotations::startEllipse(QPoint origin, size_t currentFrame) { - currentAnnotation = std::make_shared(origin, currentFrame); + currentAnnotation = std::make_shared(origin, + currentFrame); } bool Annotations::updateAnnotation(TrackedPoint cursor) { - if (currentAnnotation) - { - currentAnnotation->onEndAnnotation(cursor); - dirty = true; - return true; - } - if (selection) - { - *selection.handle = cursor; - dirty = true; - return true; - } - return false; + if (currentAnnotation) { + currentAnnotation->onEndAnnotation(cursor); + dirty = true; + return true; + } + if (selection) { + *selection.handle = cursor; + dirty = true; + return true; + } + return false; } bool Annotations::tryStartDragging(QPoint cursor) { - selection.reset(); - float currentDistance = std::numeric_limits::max(); - bool annotationFound = false; - for (auto &annotation : annotations) - { - if (annotation->isHidden()) - continue; - auto handle = annotation->getHandleForPosition(cursor); - if (!handle) // Nothing found? - continue; - const float distance = QVector2D {handle->getPoint() - cursor}.length(); - if (distance >= currentDistance) // Point is farther? - continue; - // New best point found! - currentDistance = distance; - selection.handle = handle; - selection.annotation = annotation; - annotationFound = true; - } - return annotationFound; + selection.reset(); + float currentDistance = std::numeric_limits::max(); + bool annotationFound = false; + for (auto& annotation : annotations) { + if (annotation->isHidden()) + continue; + auto handle = annotation->getHandleForPosition(cursor); + if (!handle) // Nothing found? + continue; + const float distance = QVector2D{handle->getPoint() - cursor}.length(); + if (distance >= currentDistance) // Point is farther? + continue; + // New best point found! + currentDistance = distance; + selection.handle = handle; + selection.annotation = annotation; + annotationFound = true; + } + return annotationFound; } -bool Annotations::trySetText(QPoint cursor) { - selection.reset(); - for (auto &annotation : annotations) - { - if (annotation->isHidden()) - continue; - if (!(selection.handle = annotation->getHandleForPosition(cursor))) { - continue; - } - selection.annotation = annotation; - - bool ok; - QString annoText = QInputDialog::getText(Q_NULLPTR, tr("Set annotation text"), - tr("Annotation text:"), QLineEdit::Normal, annotation->getText(), &ok); - if (ok) { - annotation->setText(annoText); - dirty = true; - } - return true; - } - return false; +bool Annotations::trySetText(QPoint cursor) +{ + selection.reset(); + for (auto& annotation : annotations) { + if (annotation->isHidden()) + continue; + if (!(selection.handle = annotation->getHandleForPosition(cursor))) { + continue; + } + selection.annotation = annotation; + + bool ok; + QString annoText = QInputDialog::getText(Q_NULLPTR, + tr("Set annotation text"), + tr("Annotation text:"), + QLineEdit::Normal, + annotation->getText(), + &ok); + if (ok) { + annotation->setText(annoText); + dirty = true; + } + return true; + } + return false; } bool Annotations::endAnnotation(TrackedPoint cursor) { - if (currentAnnotation) - { - const bool isValid = currentAnnotation->onEndAnnotation(cursor); - if (!isValid) return false; - - annotations.push_back(currentAnnotation); - currentAnnotation.reset(); - dirty = true; - return true; - } - - return false; + if (currentAnnotation) { + const bool isValid = currentAnnotation->onEndAnnotation(cursor); + if (!isValid) + return false; + + annotations.push_back(currentAnnotation); + currentAnnotation.reset(); + dirty = true; + return true; + } + + return false; } bool Annotations::removeSelection() { - if (!selection) return false; - Annotation *selectedAnnotation{ selection.annotation.lock().get() }; - - for (auto iter = annotations.begin(); iter != annotations.end();) - { - const auto annotation = *iter; - if (annotation.get() == selectedAnnotation){ - iter = annotations.erase(iter); - dirty = true; - } - else - ++iter; - } - return true; + if (!selection) + return false; + Annotation* selectedAnnotation{selection.annotation.lock().get()}; + + for (auto iter = annotations.begin(); iter != annotations.end();) { + const auto annotation = *iter; + if (annotation.get() == selectedAnnotation) { + iter = annotations.erase(iter); + dirty = true; + } else + ++iter; + } + return true; } bool Annotations::updateSelectionStartFrame() { - if (!selection) return false; - Annotation *selectedAnnotation{ selection.annotation.lock().get() }; - selectedAnnotation->startFrame = getCurrentFrame(); - if (selectedAnnotation->endFrame < selectedAnnotation->startFrame) - selectedAnnotation->endFrame = selectedAnnotation->startFrame; - dirty = true; - return true; + if (!selection) + return false; + Annotation* selectedAnnotation{selection.annotation.lock().get()}; + selectedAnnotation->startFrame = getCurrentFrame(); + if (selectedAnnotation->endFrame < selectedAnnotation->startFrame) + selectedAnnotation->endFrame = selectedAnnotation->startFrame; + dirty = true; + return true; } bool Annotations::updateSelectionEndFrame() { - if (!selection) return false; - Annotation *selectedAnnotation{ selection.annotation.lock().get() }; - selectedAnnotation->endFrame = getCurrentFrame(); - if (selectedAnnotation->startFrame > selectedAnnotation->endFrame) - selectedAnnotation->startFrame = selectedAnnotation->endFrame; - dirty = true; - return true; + if (!selection) + return false; + Annotation* selectedAnnotation{selection.annotation.lock().get()}; + selectedAnnotation->endFrame = getCurrentFrame(); + if (selectedAnnotation->startFrame > selectedAnnotation->endFrame) + selectedAnnotation->startFrame = selectedAnnotation->endFrame; + dirty = true; + return true; } void Annotations::toggleHideAnnotations() { - bool allWereHidden = true; - for (auto &annotation : annotations) - { - if (!annotation->isHidden()) - { - allWereHidden = false; - annotation->setHidden(true); - } - } - - if (allWereHidden) - { - for (auto &annotation : annotations) - annotation->setHidden(false); - } - + bool allWereHidden = true; + for (auto& annotation : annotations) { + if (!annotation->isHidden()) { + allWereHidden = false; + annotation->setHidden(true); + } + } + + if (allWereHidden) { + for (auto& annotation : annotations) + annotation->setHidden(false); + } } \ No newline at end of file diff --git a/Src/Model/Annotations.h b/Src/Model/Annotations.h index 90aeabe6..3e0aee90 100644 --- a/Src/Model/Annotations.h +++ b/Src/Model/Annotations.h @@ -1,11 +1,10 @@ /**************************************************************************** - ** - ** This file is part of the BioTracker Framework - ** by Andreas Jörg and BioTracker in version 2. - ** - ** - ****************************************************************************/ - + ** + ** This file is part of the BioTracker Framework + ** by Andreas Jörg and BioTracker in version 2. + ** + ** + ****************************************************************************/ #pragma once @@ -27,197 +26,315 @@ class IModelTrackedComponent; /** - Model to handle annotations, including serialization. - Annotations will be drawn on top of the video. Their position is defined in image coordinates. + Model to handle annotations, including serialization. + Annotations will be drawn on top of the video. Their position is defined in + image coordinates. */ -class Annotations : public IModel { - Q_OBJECT +class Annotations : public IModel +{ + Q_OBJECT public: - Annotations(std::string filepath = "") : filepath(filepath) { deserialize(); } - virtual ~Annotations(); - - /* - A 2d point that can be linked to a tracked component ID. - */ - struct TrackedPoint { - TrackedPoint (const QPoint &pos) : position(pos) {} - TrackedPoint (int x, int y) : TrackedPoint(QPoint(x, y)) {} - TrackedPoint (const QPoint &pos, int trackID) : TrackedPoint(pos) - { - this->trackID = trackID; - isLinkedToTrack = true; - } - TrackedPoint() {} - QPoint position {0, 0}; - int trackID {0}; - bool isLinkedToTrack {0}; - - // Retrieve the current position. - QPoint getPoint() const { return position; } - const QPoint &operator *() const { return position; } - int x() const { return position.x(); } - int y() const { return position.y(); } - // Update the current position to the corresponding track position IIF isLinkedToTrack. - void update(int currentFrameID, const QList &trackedComponents); - }; - /* - Base annotation class. - Children must at least support serialization and drawing. - */ - struct Annotation - { - Annotation(QPoint origin = { 0,0 }, size_t startFrame = 0) : origin(origin), startFrame(startFrame) {} - virtual ~Annotation() = default; - // Position in pixels. - TrackedPoint origin{ 0, 0 }; - size_t startFrame{ 0 }, endFrame{ 0 }; - // Possible text for each annotation - QString text{ "" }; - /// Name that identifies this type of annotation and is used for serialization. - virtual std::string name() const = 0; - virtual void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) const = 0; - // Saving requires writing/reading properties to/from maps. - virtual QMap serializeToMap() const; - virtual void deserializeFrom(const QMap &map); - // Set text. Called when right clicking. - virtual void setText(QString newText) { text = newText; } - // Get text. Called when right clicking. - virtual QString getText() { return text; } - // Called either during dragging or when the mouse is released. - // Needs to update positional data. - virtual bool onEndAnnotation(TrackedPoint currentPosition) { origin = currentPosition; return true; } - virtual QRectF boundingRect() const { return QRect(*origin, *origin).marginsAdded({ 20, 20, 20, 20 }); } - // Used for mouse-click events. - // Returns the handle that has been clicked. - virtual TrackedPoint *getHandleForPosition(const QPoint &pos) - { - if (isHandleAtPosition(origin, pos)) return &origin; - return nullptr; - } - // Static, so that the view can use it to draw special handles. - static void drawHandleLocation(QPainter *painter, QPoint pos, QString text); - static void drawHandleLocation(QPainter *painter, const TrackedPoint &pos, QString text) - { - drawHandleLocation(painter, *pos, text); - } - virtual void updateTrackedPositions(int currentFrameID, const QList &trackedComponents) - { - origin.update(currentFrameID, trackedComponents); - } - // Visually disable annotations and interactions with them. - // This will not be serialized. - void setHidden(bool hidden=true) { this->hidden = hidden; } - bool isHidden() const { return hidden; } - protected: - bool isHandleAtPosition(const QPoint &handle, const QPoint &pos); - bool isHandleAtPosition(const TrackedPoint &handle, const QPoint &pos) - { - return isHandleAtPosition(*handle, pos); - } - private: - bool hidden { false }; - }; - - /// A label marks a position. - struct AnnotationLabel : public Annotation - { - using Annotation::Annotation; - virtual ~AnnotationLabel() = default; - - virtual std::string name() const override { return "label"; } - virtual void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) const override; - }; - - /// An arrow defines a vector between two positions. - struct AnnotationArrow : public Annotation - { - using Annotation::Annotation; - virtual ~AnnotationArrow() = default; - - virtual std::string name() const override { return "arrow"; } - virtual QMap serializeToMap() const override; - virtual void deserializeFrom(const QMap &map) override; - virtual bool onEndAnnotation(TrackedPoint currentPosition) override { arrowHead = currentPosition; return true; } - virtual void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) const override; - virtual QRectF boundingRect() const { return QRect(*origin, *arrowHead).marginsAdded({ 20, 20, 20, 20 }); } - virtual TrackedPoint *getHandleForPosition(const QPoint &pos) override; - virtual void updateTrackedPositions(int currentFrameID, const QList &trackedComponents) override; - - TrackedPoint arrowHead; - }; - - // A rectangle defined by two points (top-left and bottom-right) - struct AnnotationRect : public AnnotationArrow - { - using AnnotationArrow::AnnotationArrow; - virtual ~AnnotationRect() = default; - - virtual std::string name() const override { return "rect"; } - virtual void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) const override; - }; - // An ellipse defined by two points (top-left and bottom-right) - struct AnnotationEllipse : public AnnotationArrow - { - using AnnotationArrow::AnnotationArrow; - virtual ~AnnotationEllipse() = default; - - virtual std::string name() const override { return "ellipse"; } - virtual void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) const override; - }; - - void serialize() const; - void deserialize(); - /// Called by the controller to begin a new annotation. - void startArrow(QPoint origin, size_t currentFrame); - void startLabel(QPoint origin, size_t currentFrame); - void startRect(QPoint origin, size_t currentFrame); - void startEllipse(QPoint origin, size_t currentFrame); - /// Called by the controller on left mouse-clicks. - bool tryStartDragging(QPoint cursor); - /// Called by the controller on left mouse-clicks. - bool trySetText(QPoint cursor); - // Called by the controller during mouse-drags to update the current annotation. - bool updateAnnotation(TrackedPoint cursor); - // Called on mouse-release. - bool endAnnotation(TrackedPoint cursor); - // Removes the currently selected (through tryStartDragging) annotation. - bool removeSelection(); - // Sets the start frame of the current selection to the current frame. - bool updateSelectionStartFrame(); - // Sets the end frame of the current selection to the current frame. - bool updateSelectionEndFrame(); - // The current frame is required for the view to highlight annotations. - void setCurrentFrame(size_t currentFrame) { this->currentFrame = currentFrame; } - size_t getCurrentFrame() const { return currentFrame; } - // Called when trajectories or displayed frames have changed. - void updateTrackedAnnotations(const QList &trackedComponents); - // Used to hide existing annotations, or if all are hidden, unhide them. - void toggleHideAnnotations(); + Annotations(std::string filepath = "") + : filepath(filepath) + { + deserialize(); + } + virtual ~Annotations(); + + /* + A 2d point that can be linked to a tracked component ID. + */ + struct TrackedPoint + { + TrackedPoint(const QPoint& pos) + : position(pos) + { + } + TrackedPoint(int x, int y) + : TrackedPoint(QPoint(x, y)) + { + } + TrackedPoint(const QPoint& pos, int trackID) + : TrackedPoint(pos) + { + this->trackID = trackID; + isLinkedToTrack = true; + } + TrackedPoint() + { + } + QPoint position{0, 0}; + int trackID{0}; + bool isLinkedToTrack{0}; + + // Retrieve the current position. + QPoint getPoint() const + { + return position; + } + const QPoint& operator*() const + { + return position; + } + int x() const + { + return position.x(); + } + int y() const + { + return position.y(); + } + // Update the current position to the corresponding track position IIF + // isLinkedToTrack. + void update(int currentFrameID, + const QList& trackedComponents); + }; + /* + Base annotation class. + Children must at least support serialization and drawing. + */ + struct Annotation + { + Annotation(QPoint origin = {0, 0}, size_t startFrame = 0) + : origin(origin) + , startFrame(startFrame) + { + } + virtual ~Annotation() = default; + // Position in pixels. + TrackedPoint origin{0, 0}; + size_t startFrame{0}, endFrame{0}; + // Possible text for each annotation + QString text{""}; + /// Name that identifies this type of annotation and is used for + /// serialization. + virtual std::string name() const = 0; + virtual void paint(QPainter* painter, + const QStyleOptionGraphicsItem* option, + QWidget* widget) const = 0; + // Saving requires writing/reading properties to/from maps. + virtual QMap serializeToMap() const; + virtual void deserializeFrom(const QMap& map); + // Set text. Called when right clicking. + virtual void setText(QString newText) + { + text = newText; + } + // Get text. Called when right clicking. + virtual QString getText() + { + return text; + } + // Called either during dragging or when the mouse is released. + // Needs to update positional data. + virtual bool onEndAnnotation(TrackedPoint currentPosition) + { + origin = currentPosition; + return true; + } + virtual QRectF boundingRect() const + { + return QRect(*origin, *origin).marginsAdded({20, 20, 20, 20}); + } + // Used for mouse-click events. + // Returns the handle that has been clicked. + virtual TrackedPoint* getHandleForPosition(const QPoint& pos) + { + if (isHandleAtPosition(origin, pos)) + return &origin; + return nullptr; + } + // Static, so that the view can use it to draw special handles. + static void drawHandleLocation(QPainter* painter, + QPoint pos, + QString text); + static void drawHandleLocation(QPainter* painter, + const TrackedPoint& pos, + QString text) + { + drawHandleLocation(painter, *pos, text); + } + virtual void updateTrackedPositions( + int currentFrameID, + const QList& trackedComponents) + { + origin.update(currentFrameID, trackedComponents); + } + // Visually disable annotations and interactions with them. + // This will not be serialized. + void setHidden(bool hidden = true) + { + this->hidden = hidden; + } + bool isHidden() const + { + return hidden; + } + + protected: + bool isHandleAtPosition(const QPoint& handle, const QPoint& pos); + bool isHandleAtPosition(const TrackedPoint& handle, const QPoint& pos) + { + return isHandleAtPosition(*handle, pos); + } + + private: + bool hidden{false}; + }; + + /// A label marks a position. + struct AnnotationLabel : public Annotation + { + using Annotation::Annotation; + virtual ~AnnotationLabel() = default; + + virtual std::string name() const override + { + return "label"; + } + virtual void paint(QPainter* painter, + const QStyleOptionGraphicsItem* option, + QWidget* widget) const override; + }; + + /// An arrow defines a vector between two positions. + struct AnnotationArrow : public Annotation + { + using Annotation::Annotation; + virtual ~AnnotationArrow() = default; + + virtual std::string name() const override + { + return "arrow"; + } + virtual QMap serializeToMap() const override; + virtual void deserializeFrom( + const QMap& map) override; + virtual bool onEndAnnotation(TrackedPoint currentPosition) override + { + arrowHead = currentPosition; + return true; + } + virtual void paint(QPainter* painter, + const QStyleOptionGraphicsItem* option, + QWidget* widget) const override; + virtual QRectF boundingRect() const + { + return QRect(*origin, *arrowHead).marginsAdded({20, 20, 20, 20}); + } + virtual TrackedPoint* getHandleForPosition(const QPoint& pos) override; + virtual void updateTrackedPositions( + int currentFrameID, + const QList& trackedComponents) override; + + TrackedPoint arrowHead; + }; + + // A rectangle defined by two points (top-left and bottom-right) + struct AnnotationRect : public AnnotationArrow + { + using AnnotationArrow::AnnotationArrow; + virtual ~AnnotationRect() = default; + + virtual std::string name() const override + { + return "rect"; + } + virtual void paint(QPainter* painter, + const QStyleOptionGraphicsItem* option, + QWidget* widget) const override; + }; + // An ellipse defined by two points (top-left and bottom-right) + struct AnnotationEllipse : public AnnotationArrow + { + using AnnotationArrow::AnnotationArrow; + virtual ~AnnotationEllipse() = default; + + virtual std::string name() const override + { + return "ellipse"; + } + virtual void paint(QPainter* painter, + const QStyleOptionGraphicsItem* option, + QWidget* widget) const override; + }; + + void serialize() const; + void deserialize(); + /// Called by the controller to begin a new annotation. + void startArrow(QPoint origin, size_t currentFrame); + void startLabel(QPoint origin, size_t currentFrame); + void startRect(QPoint origin, size_t currentFrame); + void startEllipse(QPoint origin, size_t currentFrame); + /// Called by the controller on left mouse-clicks. + bool tryStartDragging(QPoint cursor); + /// Called by the controller on left mouse-clicks. + bool trySetText(QPoint cursor); + // Called by the controller during mouse-drags to update the current + // annotation. + bool updateAnnotation(TrackedPoint cursor); + // Called on mouse-release. + bool endAnnotation(TrackedPoint cursor); + // Removes the currently selected (through tryStartDragging) annotation. + bool removeSelection(); + // Sets the start frame of the current selection to the current frame. + bool updateSelectionStartFrame(); + // Sets the end frame of the current selection to the current frame. + bool updateSelectionEndFrame(); + // The current frame is required for the view to highlight annotations. + void setCurrentFrame(size_t currentFrame) + { + this->currentFrame = currentFrame; + } + size_t getCurrentFrame() const + { + return currentFrame; + } + // Called when trajectories or displayed frames have changed. + void updateTrackedAnnotations( + const QList& trackedComponents); + // Used to hide existing annotations, or if all are hidden, unhide them. + void toggleHideAnnotations(); + private: - size_t currentFrame{ 0 }; /**< The current frame is required by the view. */ + size_t currentFrame{0}; /**< The current frame is required by the view. */ - std::string filepath; /**< filepath of the original source image. */ + std::string filepath; /**< filepath of the original source image. */ - std::string getFilename() const; /**< The resulting filename will add a suffix to the original source path. */ + std::string getFilename() const; /**< The resulting filename will add a + suffix to the original source path. */ - mutable bool dirty{ false }; /**< Whether the annotations need to be serialized on exit. */ + mutable bool dirty{ + false}; /**< Whether the annotations need to be serialized on exit. */ - std::vector> annotations;/**< vector of all annotations */ + std::vector> + annotations; /**< vector of all annotations */ - std::shared_ptr currentAnnotation; /**< Held temporarily during events - not yet 'created'. */ + std::shared_ptr + currentAnnotation; /**< Held temporarily during events - not yet + 'created'. */ - /// Valid during drag & drop or after mouse selection. - struct SelectionData - { - // Annotation from the annotations vector above. Defines validity of the whole struct. - std::weak_ptr annotation; - TrackedPoint *handle{ nullptr }; - explicit operator bool() const { return !annotation.expired(); } - // This is likely not thread-safe. - Annotation *operator->() { return annotation.lock().get(); } - void reset() { return annotation.reset(); } - } selection; + /// Valid during drag & drop or after mouse selection. + struct SelectionData + { + // Annotation from the annotations vector above. Defines validity of + // the whole struct. + std::weak_ptr annotation; + TrackedPoint* handle{nullptr}; + explicit operator bool() const + { + return !annotation.expired(); + } + // This is likely not thread-safe. + Annotation* operator->() + { + return annotation.lock().get(); + } + void reset() + { + return annotation.reset(); + } + } selection; - friend class AnnotationsView; + friend class AnnotationsView; }; - diff --git a/Src/Model/AreaDescriptor/AreaInfo.cpp b/Src/Model/AreaDescriptor/AreaInfo.cpp index 89657adb..543b977d 100644 --- a/Src/Model/AreaDescriptor/AreaInfo.cpp +++ b/Src/Model/AreaDescriptor/AreaInfo.cpp @@ -9,11 +9,12 @@ using namespace AreaMemory; using namespace BioTrackerUtilsMisc; -AreaInfo::AreaInfo(QObject *parent) : - IModelAreaDescriptor(parent) +AreaInfo::AreaInfo(QObject* parent) +: IModelAreaDescriptor(parent) { _parms = nullptr; - _areaInfoCache = static_cast(parent)->getConfig()->AreaDefinitions; + _areaInfoCache = + static_cast(parent)->getConfig()->AreaDefinitions; _rect = std::make_shared(); _rect->setShowNumbers(true); _rect->setAreaType(BiotrackerTypes::AreaType::RECT); @@ -24,146 +25,170 @@ AreaInfo::AreaInfo(QObject *parent) : updateRectification(); } -QString AreaInfo::myType(){ +QString AreaInfo::myType() +{ if (_apperture != nullptr) { return QString::number(_apperture->getType()); } return "0"; } -void AreaInfo::reset(int w, int h) { +void AreaInfo::reset(int w, int h) +{ _useEntireScreen = true; _rectInitialized = false; - _vdimX = w; - _vdimY = h; - + _vdimX = w; + _vdimY = h; - QVector vertices = _parms != nullptr ? getVertices(_parms->m_CurrentFilename, _areaInfoCache) : QVector(); + QVector vertices = _parms != nullptr + ? getVertices(_parms->m_CurrentFilename, + _areaInfoCache) + : QVector(); - if ( vertices == DEFAULT_PAIR //couldn't find entry - || vertices.empty()) //biotracker just started + if (vertices == DEFAULT_PAIR // couldn't find entry + || vertices.empty()) // biotracker just started { - std::vector v{ - cv::Point(0,0), - cv::Point(0,_vdimY), - cv::Point(_vdimX,_vdimY), - cv::Point(_vdimX,0) - }; + std::vector v{cv::Point(0, 0), + cv::Point(0, _vdimY), + cv::Point(_vdimX, _vdimY), + cv::Point(_vdimX, 0)}; _apperture->setVertices(v); _rect->setVertices(v); - } - else - { - std::vector pts = toQPointVector(vertices[0]); + } else { + std::vector pts = toQPointVector(vertices[0]); std::vector pts2 = toQPointVector(vertices[1]); _apperture->setVertices(QVecToCvVec(pts2)); _rect->setVertices(QVecToCvVec(pts)); } } -void AreaInfo::loadAreas() { +void AreaInfo::loadAreas() +{ - QVector pair = getVertices(_parms ? _parms->m_CurrentFilename : "", _areaInfoCache, true); + QVector pair = getVertices(_parms ? _parms->m_CurrentFilename + : "", + _areaInfoCache, + true); if (pair[1] == QString(DEFAULT_RECT)) { if (_parms) { std::shared_ptr m = _parms->m_CurrentFrame; reset(m->size().width, m->size().height); - } - else { + } else { reset(100, 100); } } - std::vector p = stringToCVPointVec(pair[0].toStdString()); _rect->setVertices(p); - p = stringToCVPointVec(pair[1].toStdString());; + p = stringToCVPointVec(pair[1].toStdString()); + ; _apperture->setVertices(p); } -void AreaInfo::rcvPlayerParameters(std::shared_ptr parameters) +void AreaInfo::rcvPlayerParameters( + std::shared_ptr parameters) { - if (_parms == nullptr || _parms->m_CurrentFilename != parameters->m_CurrentFilename) { + if (_parms == nullptr || + _parms->m_CurrentFilename != parameters->m_CurrentFilename) { _rectInitialized = false; } if (parameters->m_CurrentFrame == nullptr) { return; } - _parms = parameters; + _parms = parameters; std::shared_ptr m = parameters->m_CurrentFrame; if ((m->size().width != _vdimX || m->size().height != _vdimY) && - _useEntireScreen) { //TODO: _useEntireScreen? if we do not update stuff in the very beginning, tracking rectification will break + _useEntireScreen) { // TODO: _useEntireScreen? if we do not update + // stuff in the very beginning, tracking + // rectification will break reset(m->size().width, m->size().height); loadAreas(); updateRectification(); } } -void AreaInfo::updateRectification() { +void AreaInfo::updateRectification() +{ if (_parms) { if (!_rectInitialized) { - QVector vertices = getVertices(_parms->m_CurrentFilename, _areaInfoCache); - std::vector pts = toQPointVector(vertices[0]); + QVector vertices = getVertices(_parms->m_CurrentFilename, + _areaInfoCache); + std::vector pts = toQPointVector(vertices[0]); Rectification::instance().setArea(pts); - Rectification::instance().setupRecitification(100, 100, _vdimX, _vdimY); + Rectification::instance().setupRecitification(100, + 100, + _vdimX, + _vdimY); _rectInitialized = true; - } - else { - QVector vertices = getVertices(_parms->m_CurrentFilename, _areaInfoCache); + } else { + QVector vertices = getVertices(_parms->m_CurrentFilename, + _areaInfoCache); Rectification::instance().setArea(_rect->getQVertices()); - Rectification::instance().setupRecitification(100, 100, _vdimX, _vdimY); + Rectification::instance().setupRecitification(100, + 100, + _vdimX, + _vdimY); - setVertices(_parms->m_CurrentFilename, + setVertices( + _parms->m_CurrentFilename, QVector{ - cvPointsToString(_rect->getVertices()).c_str(), - cvPointsToString(_apperture->getVertices()).c_str(), - QString(myType()), QString(vertices[3]) }, + cvPointsToString(_rect->getVertices()).c_str(), + cvPointsToString(_apperture->getVertices()).c_str(), + QString(myType()), + QString(vertices[3])}, _areaInfoCache); - setVertices("Last", + setVertices( + "Last", QVector{ - cvPointsToString(_rect->getVertices()).c_str(), - cvPointsToString(_apperture->getVertices()).c_str(), - QString(myType()), QString(vertices[3]) }, + cvPointsToString(_rect->getVertices()).c_str(), + cvPointsToString(_apperture->getVertices()).c_str(), + QString(myType()), + QString(vertices[3])}, _areaInfoCache); } - } - else { - //TODO: What's to do here? + } else { + // TODO: What's to do here? } } -void AreaInfo::setRectificationDimensions(double w, double h) { - Rectification::instance().setDimension(w,h); +void AreaInfo::setRectificationDimensions(double w, double h) +{ + Rectification::instance().setDimension(w, h); } -void AreaInfo::updateApperture() { +void AreaInfo::updateApperture() +{ if (_parms && _rectInitialized) { - QVector vertices = getVertices(_parms->m_CurrentFilename, _areaInfoCache); - std::vector p = _apperture->getVertices(); - - setVertices(_parms->m_CurrentFilename, - QVector{ - cvPointsToString(_rect->getVertices()).c_str(), - cvPointsToString(p).c_str(), - QString(myType()), QString(vertices[3]) }, - _areaInfoCache); //TODO - + QVector vertices = getVertices(_parms->m_CurrentFilename, + _areaInfoCache); + std::vector p = _apperture->getVertices(); + + setVertices( + _parms->m_CurrentFilename, + QVector{cvPointsToString(_rect->getVertices()).c_str(), + cvPointsToString(p).c_str(), + QString(myType()), + QString(vertices[3])}, + _areaInfoCache); // TODO } } -bool AreaInfo::inTrackingArea(cv::Point2f point_cm) { - return _apperture->insideElement(point_cm); +bool AreaInfo::inTrackingArea(cv::Point2f point_cm) +{ + return _apperture->insideElement(point_cm); } -cv::Point2f AreaInfo::pxToCm(cv::Point point_px) { - return Rectification::instance().pxToCm(point_px); +cv::Point2f AreaInfo::pxToCm(cv::Point point_px) +{ + return Rectification::instance().pxToCm(point_px); } -cv::Point2f AreaInfo::cmToPx(cv::Point2f point_cm) { - return Rectification::instance().cmToPx(point_cm); +cv::Point2f AreaInfo::cmToPx(cv::Point2f point_cm) +{ + return Rectification::instance().cmToPx(point_cm); } diff --git a/Src/Model/AreaDescriptor/AreaInfo.h b/Src/Model/AreaDescriptor/AreaInfo.h index 1fa3dc89..79cd0ae0 100644 --- a/Src/Model/AreaDescriptor/AreaInfo.h +++ b/Src/Model/AreaDescriptor/AreaInfo.h @@ -8,56 +8,64 @@ class AreaInfo : public IModelAreaDescriptor { - Q_OBJECT + Q_OBJECT public: - AreaInfo() = delete; - AreaInfo(QObject *parent = 0); + AreaInfo() = delete; + AreaInfo(QObject* parent = 0); - //TODO PORT - bool inTrackingArea(cv::Point2f point_cm) override; + // TODO PORT + bool inTrackingArea(cv::Point2f point_cm) override; - /** - * Transform the provided pixel coordinates into world coordinates and return world coordinates. - * @param: pixelCoords, a list of points. - * @return: world coordinates in as a list. - */ - cv::Point2f pxToCm(cv::Point point_px) override; + /** + * Transform the provided pixel coordinates into world coordinates and + * return world coordinates. + * @param: pixelCoords, a list of points. + * @return: world coordinates in as a list. + */ + cv::Point2f pxToCm(cv::Point point_px) override; - /** - * Transform the provided pixel point into world coordinates and return world point. - * @param: point, a pixel point, used opencv point - * @return: world point. - */ - cv::Point2f cmToPx(cv::Point2f point_cm) override; + /** + * Transform the provided pixel point into world coordinates and return + * world point. + * @param: point, a pixel point, used opencv point + * @return: world point. + */ + cv::Point2f cmToPx(cv::Point2f point_cm) override; - void updateApperture(); + void updateApperture(); - void updateRectification(); + void updateRectification(); - void setRectificationDimensions(double w, double h); + void setRectificationDimensions(double w, double h); void reset(int w, int h); void loadAreas(); - void setUseEntireScreen(bool b) { _useEntireScreen = b; }; - bool getUseEntireScreen() { return _useEntireScreen; }; + void setUseEntireScreen(bool b) + { + _useEntireScreen = b; + }; + bool getUseEntireScreen() + { + return _useEntireScreen; + }; - std::shared_ptr _rect; - std::shared_ptr _apperture; + std::shared_ptr _rect; + std::shared_ptr _apperture; private: - - //If the user never changed the area, use the whole screen. Indicate by this switch - bool _useEntireScreen = false; - int _vdimX = 1; - int _vdimY = 1; + // If the user never changed the area, use the whole screen. Indicate by + // this switch + bool _useEntireScreen = false; + int _vdimX = 1; + int _vdimY = 1; std::shared_ptr _parms; - bool _rectInitialized = false; - QString _areaInfoCache; + bool _rectInitialized = false; + QString _areaInfoCache; public Q_SLOTS: - void rcvPlayerParameters(std::shared_ptr parameters); + void rcvPlayerParameters( + std::shared_ptr parameters); private: QString myType(); }; - diff --git a/Src/Model/AreaDescriptor/AreaInfoElement.cpp b/Src/Model/AreaDescriptor/AreaInfoElement.cpp index 5ce6c01b..2326f069 100644 --- a/Src/Model/AreaDescriptor/AreaInfoElement.cpp +++ b/Src/Model/AreaDescriptor/AreaInfoElement.cpp @@ -3,78 +3,79 @@ #include #include -AreaInfoElement::AreaInfoElement(int type) : - _areaType(BiotrackerTypes::AreaType::NONE), - _type(type), - _showNumbers(false) +AreaInfoElement::AreaInfoElement(int type) +: _areaType(BiotrackerTypes::AreaType::NONE) +, _type(type) +, _showNumbers(false) { } - AreaInfoElement::~AreaInfoElement() { } +bool AreaInfoElement::insideElement(cv::Point p) +{ -bool AreaInfoElement::insideElement(cv::Point p) { - - if (_type == 0) { - - return cv::pointPolygonTest(_v, p, true) > 0; - } - else if (_type == 1) { - float rx = std::abs(_v[1].x - _v[0].x) / 2; - float ry = std::abs(_v[1].y - _v[0].y) / 2; - float h = _v[0].x + rx; - float k = _v[0].y + ry; - float x = p.x; - float y = p.y; - - float xh = std::pow(x - h, 2); - float yk = std::pow(y - k, 2); - float val = (xh / (rx*rx)) + (yk / (ry*ry)); - bool inShape = val <= 1; - - return inShape; - } - return false; + if (_type == 0) { + + return cv::pointPolygonTest(_v, p, true) > 0; + } else if (_type == 1) { + float rx = std::abs(_v[1].x - _v[0].x) / 2; + float ry = std::abs(_v[1].y - _v[0].y) / 2; + float h = _v[0].x + rx; + float k = _v[0].y + ry; + float x = p.x; + float y = p.y; + + float xh = std::pow(x - h, 2); + float yk = std::pow(y - k, 2); + float val = (xh / (rx * rx)) + (yk / (ry * ry)); + bool inShape = val <= 1; + + return inShape; + } + return false; } -int AreaInfoElement::getVerticeAtLocation(const QPoint &pos) { - if (_type == 0) { - for (int i = 0; i < 4; i++) { - if (isHandleAtPosition(_v[i], pos)) - return i; - } - } - else if (_type == 1) { - for (int i = 0; i < 2; i++) { - if (isHandleAtPosition(_v[i], pos)) - return i; - } - } - - return -1; +int AreaInfoElement::getVerticeAtLocation(const QPoint& pos) +{ + if (_type == 0) { + for (int i = 0; i < 4; i++) { + if (isHandleAtPosition(_v[i], pos)) + return i; + } + } else if (_type == 1) { + for (int i = 0; i < 2; i++) { + if (isHandleAtPosition(_v[i], pos)) + return i; + } + } + + return -1; } -void AreaInfoElement::setVerticeAtLocation(const QPoint &pos, int vertice) { - if (_type == 0 && vertice >= 0 && vertice <4) { - _v[vertice] = cv::Point2f(pos.x(), pos.y()); - } - else if (_type > 0 && vertice >= 0 && vertice < 2) { - _v[vertice] = cv::Point2f(pos.x(), pos.y()); - } - - Q_EMIT updatedVertices(); +void AreaInfoElement::setVerticeAtLocation(const QPoint& pos, int vertice) +{ + if (_type == 0 && vertice >= 0 && vertice < 4) { + _v[vertice] = cv::Point2f(pos.x(), pos.y()); + } else if (_type > 0 && vertice >= 0 && vertice < 2) { + _v[vertice] = cv::Point2f(pos.x(), pos.y()); + } + Q_EMIT updatedVertices(); } -bool AreaInfoElement::isHandleAtPosition(const cv::Point2f &handle, const QPoint &pos) { - return isHandleAtPosition(QPoint(handle.x, handle.y), pos); +bool AreaInfoElement::isHandleAtPosition(const cv::Point2f& handle, + const QPoint& pos) +{ + return isHandleAtPosition(QPoint(handle.x, handle.y), pos); } -bool AreaInfoElement::isHandleAtPosition(const QPoint &handle, const QPoint &pos) +bool AreaInfoElement::isHandleAtPosition(const QPoint& handle, + const QPoint& pos) { - QPoint diff = handle - pos; - const float euclidian = std::sqrt((diff.x() * diff.x()) + (diff.y() * diff.y())); - return euclidian <= 20.0; + QPoint diff = handle - pos; + const float euclidian = std::sqrt((diff.x() * diff.x()) + + (diff.y() * diff.y())); + return euclidian <= 20.0; } diff --git a/Src/Model/AreaDescriptor/AreaInfoElement.h b/Src/Model/AreaDescriptor/AreaInfoElement.h index 5ed1d957..63168be4 100644 --- a/Src/Model/AreaDescriptor/AreaInfoElement.h +++ b/Src/Model/AreaDescriptor/AreaInfoElement.h @@ -6,72 +6,91 @@ class AreaInfoElement : public IModel { - Q_OBJECT + Q_OBJECT public: - AreaInfoElement(int type = 0); - ~AreaInfoElement(); - - bool insideElement(cv::Point p); - - void setVertices(std::vector p) { - _v = p; - Q_EMIT updatedVertices(); - }; - - std::vector _v; - - std::vector getVertices() { return _v; }; - - //TODO: change everything to QPoints? - std::vector getQVertices() { - std::vector v; - for (int i = 0; i < _v.size(); i++) { - v.push_back(QPoint(_v[i].x, _v[i].y)); - } - return v; - }; - - int getType() { return _type; }; - void setType(int t) { _type = t; }; - - void setVerticeAtLocation(const QPoint &pos, int vertice); - int getVerticeAtLocation(const QPoint &pos); - - virtual QPoint *getHandleForPosition(const QPoint &pos) - { - if (isHandleAtPosition(_origin, pos)) return &_origin; - return nullptr; - } + AreaInfoElement(int type = 0); + ~AreaInfoElement(); + + bool insideElement(cv::Point p); + + void setVertices(std::vector p) + { + _v = p; + Q_EMIT updatedVertices(); + }; + + std::vector _v; + + std::vector getVertices() + { + return _v; + }; + + // TODO: change everything to QPoints? + std::vector getQVertices() + { + std::vector v; + for (int i = 0; i < _v.size(); i++) { + v.push_back(QPoint(_v[i].x, _v[i].y)); + } + return v; + }; + + int getType() + { + return _type; + }; + void setType(int t) + { + _type = t; + }; + + void setVerticeAtLocation(const QPoint& pos, int vertice); + int getVerticeAtLocation(const QPoint& pos); + + virtual QPoint* getHandleForPosition(const QPoint& pos) + { + if (isHandleAtPosition(_origin, pos)) + return &_origin; + return nullptr; + } - void setShowNumbers(bool b) { + void setShowNumbers(bool b) + { _showNumbers = b; } - bool getShowNumbers() { + bool getShowNumbers() + { return _showNumbers; } - BiotrackerTypes::AreaType getAreaType() { return _areaType; } - void setAreaType(BiotrackerTypes::AreaType t) { _areaType = t; } + BiotrackerTypes::AreaType getAreaType() + { + return _areaType; + } + void setAreaType(BiotrackerTypes::AreaType t) + { + _areaType = t; + } protected: - bool isHandleAtPosition(const cv::Point2f &handle, const QPoint &pos); - bool isHandleAtPosition(const QPoint &handle, const QPoint &pos); + bool isHandleAtPosition(const cv::Point2f& handle, const QPoint& pos); + bool isHandleAtPosition(const QPoint& handle, const QPoint& pos); signals: - void updatedVertices(); + void updatedVertices(); private: - // Position in pixels. - QPoint _origin{ 0, 0 }; + // Position in pixels. + QPoint _origin{0, 0}; bool _showNumbers; - //Rect or Ellipse? + // Rect or Ellipse? int _type; - //Rectification, tracking area or both? + // Rectification, tracking area or both? BiotrackerTypes::AreaType _areaType; }; - diff --git a/Src/Model/AreaDescriptor/AreaMemory.cpp b/Src/Model/AreaDescriptor/AreaMemory.cpp index 6efe106b..ce486ba0 100644 --- a/Src/Model/AreaDescriptor/AreaMemory.cpp +++ b/Src/Model/AreaDescriptor/AreaMemory.cpp @@ -13,12 +13,14 @@ TODO: This is still rather prototype'ish. */ #include -using namespace BioTrackerUtilsMisc; //split -namespace AreaMemory{ +using namespace BioTrackerUtilsMisc; // split +namespace AreaMemory +{ QMap> map; - QVector getVertices(QString file, QString areaFile, bool useLast) { + QVector getVertices(QString file, QString areaFile, bool useLast) + { if (map.size() == 0) { std::ifstream o; o.open(areaFile.toStdString(), std::ifstream::in); @@ -33,7 +35,7 @@ namespace AreaMemory{ strs[1].c_str(), strs[2].c_str(), strs[3].c_str(), - strs[4].c_str() }; + strs[4].c_str()}; } } } @@ -45,12 +47,13 @@ namespace AreaMemory{ else { if (useLast && map.contains("Last")) { return map.value("Last"); - }else + } else return DEFAULT_PAIR; } } - void setVertices(QString file, QVector values, QString areaFile) { + void setVertices(QString file, QVector values, QString areaFile) + { if (file.size() <= 1) { return; } @@ -64,17 +67,18 @@ namespace AreaMemory{ while (i.hasNext()) { i.next(); o << i.key().toStdString() << "#" << i.value()[0].toStdString() - << "#" << i.value()[1].toStdString() - << "#" << i.value()[2].toStdString() - << "#" << i.value()[3].toStdString() << std::endl; + << "#" << i.value()[1].toStdString() << "#" + << i.value()[2].toStdString() << "#" + << i.value()[3].toStdString() << std::endl; } } } - std::vector toQPointVector(QString vertices) { + std::vector toQPointVector(QString vertices) + { std::vector strs; - std::vector points; - std::string s = vertices.toStdString(); + std::vector points; + std::string s = vertices.toStdString(); split(s, strs, ';'); for (int i = 0; i < strs.size(); i++) { std::vector pt; diff --git a/Src/Model/AreaDescriptor/AreaMemory.h b/Src/Model/AreaDescriptor/AreaMemory.h index 93a086b0..cedd9e07 100644 --- a/Src/Model/AreaDescriptor/AreaMemory.h +++ b/Src/Model/AreaDescriptor/AreaMemory.h @@ -7,12 +7,17 @@ namespace AreaMemory { -#define DEFAULT_RECT "15,15;15,105;105,105;105,15" -#define DEFAULT_AREA "10,10;10,100;100,100;100,10" -#define DEFAULT_PAIR QVector{DEFAULT_AREA, DEFAULT_RECT, "0", "0"} +#define DEFAULT_RECT "15,15;15,105;105,105;105,15" +#define DEFAULT_AREA "10,10;10,100;100,100;100,10" +#define DEFAULT_PAIR \ + QVector \ + { \ + DEFAULT_AREA, DEFAULT_RECT, "0", "0" \ + } - QVector getVertices(QString file, QString areaFile, bool useLast = false); + QVector getVertices(QString file, + QString areaFile, + bool useLast = false); void setVertices(QString file, QVector values, QString areaFile); std::vector toQPointVector(QString vertices); }; - diff --git a/Src/Model/AreaDescriptor/Rectification.cpp b/Src/Model/AreaDescriptor/Rectification.cpp index f4541402..6613f75b 100644 --- a/Src/Model/AreaDescriptor/Rectification.cpp +++ b/Src/Model/AreaDescriptor/Rectification.cpp @@ -7,340 +7,358 @@ #include "util/types.h" #include "util/Config.h" -using namespace BioTrackerUtilsMisc; //split +using namespace BioTrackerUtilsMisc; // split -Rectification::Rectification(float w, float h) { - initRecitification(w,h); - setupRecitification(0,0,0,0); +Rectification::Rectification(float w, float h) +{ + initRecitification(w, h); + setupRecitification(0, 0, 0, 0); } -void Rectification::init(double areaHeight_cm, double areaWidth_cm, - std::vector areaCoordinates, int camCaptureWidth_px, - int camCaptureHeight_px, int frameDisplayWidthPx, int frameDisplayHeightPx) +void Rectification::init(double areaHeight_cm, + double areaWidth_cm, + std::vector areaCoordinates, + int camCaptureWidth_px, + int camCaptureHeight_px, + int frameDisplayWidthPx, + int frameDisplayHeightPx) { - _q = cv::Mat(3, 1, CV_32F); - _camCaptureWidth_px = camCaptureWidth_px; - _camCaptureHeight_px = camCaptureHeight_px; - _areaHeight_cm = areaHeight_cm; - _areaWidth_cm = areaWidth_cm; - _areaCoordinates = areaCoordinates; - _frameDisplayWidthPx = frameDisplayWidthPx; - _frameDisplayHeightPx = frameDisplayHeightPx; - - setupRecitification(frameDisplayWidthPx, frameDisplayHeightPx, camCaptureWidth_px, camCaptureHeight_px); + _q = cv::Mat(3, 1, CV_32F); + _camCaptureWidth_px = camCaptureWidth_px; + _camCaptureHeight_px = camCaptureHeight_px; + _areaHeight_cm = areaHeight_cm; + _areaWidth_cm = areaWidth_cm; + _areaCoordinates = areaCoordinates; + _frameDisplayWidthPx = frameDisplayWidthPx; + _frameDisplayHeightPx = frameDisplayHeightPx; + + setupRecitification(frameDisplayWidthPx, + frameDisplayHeightPx, + camCaptureWidth_px, + camCaptureHeight_px); } -void Rectification::initRecitification(double areaHeight_cm, double areaWidth_cm) +void Rectification::initRecitification(double areaHeight_cm, + double areaWidth_cm) { - setArea(); - setDimension(areaWidth_cm, areaHeight_cm); + setArea(); + setDimension(areaWidth_cm, areaHeight_cm); } - -void Rectification::setArea(std::vector areaCoordinates) { - _areaCoordinates = areaCoordinates; - //BioTracker::Core::Settings *_settings = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); - //_settings->setParam(AREADESCRIPTOR::CN_ARENA, cvPointsToString(areaCoordinates).c_str()); +void Rectification::setArea(std::vector areaCoordinates) +{ + _areaCoordinates = areaCoordinates; + // BioTracker::Core::Settings *_settings = + // BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); + //_settings->setParam(AREADESCRIPTOR::CN_ARENA, + // cvPointsToString(areaCoordinates).c_str()); } -void Rectification::setArea(std::vector areaCoordinates) { - std::vector cvAreaCoordinates; - for (int i = 0; i < areaCoordinates.size(); i++) { - cvAreaCoordinates.push_back(cv::Point(areaCoordinates[i].x(), areaCoordinates[i].y())); - } - setArea(cvAreaCoordinates); +void Rectification::setArea(std::vector areaCoordinates) +{ + std::vector cvAreaCoordinates; + for (int i = 0; i < areaCoordinates.size(); i++) { + cvAreaCoordinates.push_back( + cv::Point(areaCoordinates[i].x(), areaCoordinates[i].y())); + } + setArea(cvAreaCoordinates); } -std::vector Rectification::getDefaultArena() { - std::string s = (Config::DefaultArena).toStdString(); - return stringToCVPointVec(s); +std::vector Rectification::getDefaultArena() +{ + std::string s = (Config::DefaultArena).toStdString(); + return stringToCVPointVec(s); } void Rectification::setArea() { - setArea(getDefaultArena()); + setArea(getDefaultArena()); } -void Rectification::setDimension(double areaWidth_cm, double areaHeight_cm) { - _areaWidth_cm = areaWidth_cm; - _areaHeight_cm = areaHeight_cm; - setupRecitification(_frameDisplayWidthPx, _frameDisplayHeightPx, _camCaptureWidth_px, _camCaptureHeight_px); +void Rectification::setDimension(double areaWidth_cm, double areaHeight_cm) +{ + _areaWidth_cm = areaWidth_cm; + _areaHeight_cm = areaHeight_cm; + setupRecitification(_frameDisplayWidthPx, + _frameDisplayHeightPx, + _camCaptureWidth_px, + _camCaptureHeight_px); } -void Rectification::setupRecitification(int frameDisplayWidthPx, int frameDisplayHeightPx, int camImageWidth, int camImageHeight) +void Rectification::setupRecitification(int frameDisplayWidthPx, + int frameDisplayHeightPx, + int camImageWidth, + int camImageHeight) { - _frameDisplayWidthPx = frameDisplayWidthPx; - _frameDisplayHeightPx = frameDisplayHeightPx; + _frameDisplayWidthPx = frameDisplayWidthPx; + _frameDisplayHeightPx = frameDisplayHeightPx; - _camCaptureWidth_px = frameDisplayWidthPx; - _camCaptureHeight_px = frameDisplayHeightPx; + _camCaptureWidth_px = frameDisplayWidthPx; + _camCaptureHeight_px = frameDisplayHeightPx; - if (_rectifiedAreaCoordinates.size() > 0) { - _rectifiedAreaCoordinates.clear(); - } + if (_rectifiedAreaCoordinates.size() > 0) { + _rectifiedAreaCoordinates.clear(); + } - _rectifiedAreaCoordinates.push_back(cv::Point2f(0.0, 0.0)); // Top left - _rectifiedAreaCoordinates.push_back(cv::Point2f(0.0, _areaHeight_cm)); // botton left - _rectifiedAreaCoordinates.push_back(cv::Point2f(_areaWidth_cm, _areaHeight_cm)); // bottom right - _rectifiedAreaCoordinates.push_back(cv::Point2f(_areaWidth_cm, 0.0)); // top right + _rectifiedAreaCoordinates.push_back(cv::Point2f(0.0, 0.0)); // Top left + _rectifiedAreaCoordinates.push_back( + cv::Point2f(0.0, _areaHeight_cm)); // botton left + _rectifiedAreaCoordinates.push_back( + cv::Point2f(_areaWidth_cm, _areaHeight_cm)); // bottom right + _rectifiedAreaCoordinates.push_back( + cv::Point2f(_areaWidth_cm, 0.0)); // top right - std::vector areaCoordinates_2f; + std::vector areaCoordinates_2f; - assert(_areaCoordinates.size() == 4); + assert(_areaCoordinates.size() == 4); - cv::Mat coordinateMatrix(getSortedPoints()); - - if (cv::sum(coordinateMatrix)[0] > 0.0f) - coordinateMatrix.copyTo(areaCoordinates_2f); - else - areaCoordinates_2f = _rectifiedAreaCoordinates; + cv::Mat coordinateMatrix(getSortedPoints()); - _H = cv::findHomography(areaCoordinates_2f, _rectifiedAreaCoordinates); - _H_inv = _H.inv(); - _isSetup = true; + if (cv::sum(coordinateMatrix)[0] > 0.0f) + coordinateMatrix.copyTo(areaCoordinates_2f); + else + areaCoordinates_2f = _rectifiedAreaCoordinates; + + _H = cv::findHomography(areaCoordinates_2f, _rectifiedAreaCoordinates); + _H_inv = _H.inv(); + _isSetup = true; } void Rectification::resetAreaCoordinates() { - std::vector areaCoordinates; - - double rationHeight = double(_frameDisplayHeightPx) / double(_camCaptureHeight_px); - double rationWidth = double(_frameDisplayWidthPx) / double(_camCaptureWidth_px); + std::vector areaCoordinates; - for (cv::Point p : _areaCoordinates) { + double rationHeight = double(_frameDisplayHeightPx) / + double(_camCaptureHeight_px); + double rationWidth = double(_frameDisplayWidthPx) / + double(_camCaptureWidth_px); + for (cv::Point p : _areaCoordinates) { - int newP_x = p.x / rationWidth; - int newP_y = p.y / rationHeight; + int newP_x = p.x / rationWidth; + int newP_y = p.y / rationHeight; - areaCoordinates.push_back(cv::Point(newP_x, newP_y)); - } + areaCoordinates.push_back(cv::Point(newP_x, newP_y)); + } - if (checkValidCoordinates(areaCoordinates, _camCaptureHeight_px, _camCaptureWidth_px)) - { - _areaCoordinates.clear(); - _areaCoordinates = areaCoordinates; + if (checkValidCoordinates(areaCoordinates, + _camCaptureHeight_px, + _camCaptureWidth_px)) { + _areaCoordinates.clear(); + _areaCoordinates = areaCoordinates; - setupRecitification(_frameDisplayWidthPx, _frameDisplayHeightPx, _camCaptureWidth_px, _camCaptureHeight_px); - } + setupRecitification(_frameDisplayWidthPx, + _frameDisplayHeightPx, + _camCaptureWidth_px, + _camCaptureHeight_px); + } } -bool Rectification::checkValidCoordinates(std::vector areaCoordinates, int camCaptureHeight_px, int camCaptureWidth_px) -{ - for (cv::Point p : areaCoordinates) { - if (p.y > camCaptureHeight_px) return false; - if (p.x > camCaptureWidth_px) return false; - } - - return true; +bool Rectification::checkValidCoordinates( + std::vector areaCoordinates, + int camCaptureHeight_px, + int camCaptureWidth_px) +{ + for (cv::Point p : areaCoordinates) { + if (p.y > camCaptureHeight_px) + return false; + if (p.x > camCaptureWidth_px) + return false; + } + + return true; } cv::Point2f Rectification::pxToCm(cv::Point point_px) const { - cv::Mat_ v = (cv::Mat_(3,1) << point_px.x, point_px.y, 1); - cv::gemm(_H, v, 1, 0, 0, _q); - double* qx = _q.ptr(0); - double* qy = _q.ptr(1); - double* qz = _q.ptr(2); - - cv::Point2f cm((*qx / *qz), (*qy / *qz)); - return cm; + cv::Mat_ v = (cv::Mat_(3, 1) << point_px.x, point_px.y, 1); + cv::gemm(_H, v, 1, 0, 0, _q); + double* qx = _q.ptr(0); + double* qy = _q.ptr(1); + double* qz = _q.ptr(2); + + cv::Point2f cm((*qx / *qz), (*qy / *qz)); + return cm; } cv::Point2f Rectification::pxToCm(QPoint point_px) const { - return pxToCm(cv::Point(point_px.x(), point_px.y())); + return pxToCm(cv::Point(point_px.x(), point_px.y())); } cv::Point2f Rectification::cmToPx(cv::Point2f point_cm) const { - cv::Mat_ v = (cv::Mat_(3, 1) << point_cm.x, point_cm.y, 1); - cv::gemm(_H_inv, v, 1, 0, 0, _q); - double *qx = _q.ptr(0); - double *qy = _q.ptr(1); - double *qz = _q.ptr(2); + cv::Mat_ v = (cv::Mat_(3, 1) << point_cm.x, point_cm.y, 1); + cv::gemm(_H_inv, v, 1, 0, 0, _q); + double* qx = _q.ptr(0); + double* qy = _q.ptr(1); + double* qz = _q.ptr(2); - return cv::Point2f((*qx / *qz), (*qy / *qz)); + return cv::Point2f((*qx / *qz), (*qy / *qz)); } bool Rectification::inArea(cv::Point2f point_cm) const -{ - bool flag = (point_cm.x >= 0 && point_cm.y >= 0 && point_cm.x <= _areaWidth_cm && point_cm.y <= _areaHeight_cm); - return flag; +{ + bool flag = (point_cm.x >= 0 && point_cm.y >= 0 && + point_cm.x <= _areaWidth_cm && point_cm.y <= _areaHeight_cm); + return flag; } - int Rectification::minXPx() { - int minX = _camCaptureWidth_px; - for (int i = 0; i < _areaCoordinates.size(); i++) - { - if(_areaCoordinates.at(i).x < minX) - minX = _areaCoordinates.at(i).x; - } - return minX; + int minX = _camCaptureWidth_px; + for (int i = 0; i < _areaCoordinates.size(); i++) { + if (_areaCoordinates.at(i).x < minX) + minX = _areaCoordinates.at(i).x; + } + return minX; } int Rectification::maxXPx() { - int maxX = -1; - for (int i = 0; i < _areaCoordinates.size(); i++) - { - if(_areaCoordinates.at(i).x > maxX) - maxX = _areaCoordinates.at(i).x; - } - return maxX; + int maxX = -1; + for (int i = 0; i < _areaCoordinates.size(); i++) { + if (_areaCoordinates.at(i).x > maxX) + maxX = _areaCoordinates.at(i).x; + } + return maxX; } int Rectification::minYPx() { - int minY = _camCaptureHeight_px; - for (int i = 0; i < _areaCoordinates.size(); i++) - { - if(_areaCoordinates.at(i).y < minY) - minY = _areaCoordinates.at(i).y; - } - return minY; + int minY = _camCaptureHeight_px; + for (int i = 0; i < _areaCoordinates.size(); i++) { + if (_areaCoordinates.at(i).y < minY) + minY = _areaCoordinates.at(i).y; + } + return minY; } int Rectification::maxYPx() { - int maxY = -1; - for (int i = 0; i < _areaCoordinates.size(); i++) - { - if(_areaCoordinates.at(i).y > maxY) - maxY = _areaCoordinates.at(i).y; - } - return maxY; + int maxY = -1; + for (int i = 0; i < _areaCoordinates.size(); i++) { + if (_areaCoordinates.at(i).y > maxY) + maxY = _areaCoordinates.at(i).y; + } + return maxY; } cv::Point Rectification::getTopLeft() { - assert(_areaCoordinates.size() == 4); + assert(_areaCoordinates.size() == 4); - std::vector ac(_areaCoordinates); + std::vector ac(_areaCoordinates); - std::sort(ac.begin(), ac.end(), - [](const cv::Point & a, const cv::Point & b) -> bool - { - return (a.x <= b.x) && (a.y <= b.y); - } - ); + std::sort(ac.begin(), + ac.end(), + [](const cv::Point& a, const cv::Point& b) -> bool { + return (a.x <= b.x) && (a.y <= b.y); + }); - return ac[0]; + return ac[0]; } cv::Point Rectification::getBottomLeft() { - assert(_areaCoordinates.size() == 4); + assert(_areaCoordinates.size() == 4); - std::vector ac(_areaCoordinates); + std::vector ac(_areaCoordinates); - std::sort(ac.begin(), ac.end(), - [](const cv::Point & a, const cv::Point & b) -> bool - { - return (a.x <= b.x) && (a.y >= b.y); - } - ); + std::sort(ac.begin(), + ac.end(), + [](const cv::Point& a, const cv::Point& b) -> bool { + return (a.x <= b.x) && (a.y >= b.y); + }); - return ac[0]; + return ac[0]; } cv::Point Rectification::getBottomRight() { - assert(_areaCoordinates.size() == 4); + assert(_areaCoordinates.size() == 4); - std::vector ac(_areaCoordinates); + std::vector ac(_areaCoordinates); - std::sort(ac.begin(), ac.end(), - [](const cv::Point & a, const cv::Point & b) -> bool - { - return (a.x >= b.x) && (a.y >= b.y); - } - ); + std::sort(ac.begin(), + ac.end(), + [](const cv::Point& a, const cv::Point& b) -> bool { + return (a.x >= b.x) && (a.y >= b.y); + }); - - return ac[0]; + return ac[0]; } cv::Point Rectification::getTopRight() { - assert(_areaCoordinates.size() == 4); - + assert(_areaCoordinates.size() == 4); - std::vector ac(_areaCoordinates); + std::vector ac(_areaCoordinates); - std::sort(ac.begin(), ac.end(), - [](const cv::Point & a, const cv::Point & b) -> bool - { - return (a.x >= b.x) && (a.y <= b.y); - } - ); + std::sort(ac.begin(), + ac.end(), + [](const cv::Point& a, const cv::Point& b) -> bool { + return (a.x >= b.x) && (a.y <= b.y); + }); - return ac[0]; + return ac[0]; } cv::Mat Rectification::getSortedPoints() { - assert(_areaCoordinates.size() == 4); - return cv::Mat(_areaCoordinates); + assert(_areaCoordinates.size() == 4); + return cv::Mat(_areaCoordinates); } cv::Point Rectification::getCorrectedResolutionPoint(QPoint pos) { - return getCorrectedResolutionPoint(cv::Point(pos.x(),pos.y())); + return getCorrectedResolutionPoint(cv::Point(pos.x(), pos.y())); } cv::Point Rectification::getCorrectedResolutionPoint(cv::Point pos) { - int heightScaled = _frameDisplayHeightPx; - int widthScaled = _frameDisplayWidthPx; - - float scaleFactor = 1.0f; + int heightScaled = _frameDisplayHeightPx; + int widthScaled = _frameDisplayWidthPx; - if (_camCaptureWidth_px > _frameDisplayWidthPx || _camCaptureHeight_px > _frameDisplayHeightPx) - { - scaleFactor = float(_camCaptureWidth_px) / float(_frameDisplayWidthPx); + float scaleFactor = 1.0f; - heightScaled = _camCaptureHeight_px / scaleFactor; + if (_camCaptureWidth_px > _frameDisplayWidthPx || + _camCaptureHeight_px > _frameDisplayHeightPx) { + scaleFactor = float(_camCaptureWidth_px) / float(_frameDisplayWidthPx); - if (_camCaptureWidth_px == _camCaptureHeight_px) - { - if (heightScaled > _frameDisplayHeightPx) - { - scaleFactor = float(_camCaptureHeight_px) / float(_frameDisplayHeightPx); + heightScaled = _camCaptureHeight_px / scaleFactor; - widthScaled = _camCaptureWidth_px / scaleFactor; + if (_camCaptureWidth_px == _camCaptureHeight_px) { + if (heightScaled > _frameDisplayHeightPx) { + scaleFactor = float(_camCaptureHeight_px) / + float(_frameDisplayHeightPx); - assert(widthScaled <= _frameDisplayWidthPx); - } - else - { - if (heightScaled > _frameDisplayWidthPx) - { - scaleFactor = float(_camCaptureHeight_px) / float(_frameDisplayWidthPx); + widthScaled = _camCaptureWidth_px / scaleFactor; - widthScaled = _camCaptureWidth_px / scaleFactor; + assert(widthScaled <= _frameDisplayWidthPx); + } else { + if (heightScaled > _frameDisplayWidthPx) { + scaleFactor = float(_camCaptureHeight_px) / + float(_frameDisplayWidthPx); - assert(widthScaled <= _frameDisplayWidthPx); - } - } - } - else - { - if (heightScaled > _frameDisplayWidthPx) - { - scaleFactor = float(_camCaptureHeight_px) / float(_frameDisplayWidthPx); + widthScaled = _camCaptureWidth_px / scaleFactor; - widthScaled = _camCaptureWidth_px / scaleFactor; + assert(widthScaled <= _frameDisplayWidthPx); + } + } + } else { + if (heightScaled > _frameDisplayWidthPx) { + scaleFactor = float(_camCaptureHeight_px) / + float(_frameDisplayWidthPx); - assert(widthScaled <= _frameDisplayWidthPx); - } - } + widthScaled = _camCaptureWidth_px / scaleFactor; - - } + assert(widthScaled <= _frameDisplayWidthPx); + } + } + } - return cv::Point(int(float(pos.x) * scaleFactor), int(float(pos.y) * scaleFactor)); + return cv::Point(int(float(pos.x) * scaleFactor), + int(float(pos.y) * scaleFactor)); } \ No newline at end of file diff --git a/Src/Model/AreaDescriptor/Rectification.h b/Src/Model/AreaDescriptor/Rectification.h index 096dc1a8..9c1949dc 100644 --- a/Src/Model/AreaDescriptor/Rectification.h +++ b/Src/Model/AreaDescriptor/Rectification.h @@ -8,123 +8,157 @@ /** * Rectification class normalizing the tracking image */ -class Rectification +class Rectification { public: + static Rectification& instance() + { + static Rectification _instance(100, + 100); // Guaranteed to be destroyed. + // Instantiated on first use. + return _instance; + } + + ~Rectification() + { + } - static Rectification& instance() - { - static Rectification _instance(100,100); // Guaranteed to be destroyed. - // Instantiated on first use. - return _instance; - } +private: + /** + * The standard constructor. + */ + Rectification(float w, float h); + + Rectification( + const Rectification&); /* verhindert, dass eine weitere Instanz via + Kopier-Konstruktor erstellt werden kann */ + + Rectification& operator=( + const Rectification&); // Verhindert weitere Instanz durch Kopie - ~Rectification() {} +public: + void init(double areaHeight_cm, + double areaWidth_cm, + std::vector areaCoordinates, + int camCaptureWidth_px, + int camCaptureHeight_px, + int frameDisplayWidthPx, + int frameDisplayHeightPx); + + bool isSetup() + { + return _isSetup; + }; + + double areaWidth_cm() const + { + return _areaWidth_cm; + } + double areaHeight_cm() const + { + return _areaHeight_cm; + } + int captureWidth_px() const + { + return _camCaptureWidth_px; + } + int captureHeight_px() const + { + return _camCaptureHeight_px; + } + + bool inArea(cv::Point2f point_cm) const; + + /** + * Transform the provided pixel coordinates into world coordinates and + * return world coordinates. + * @param: pixelCoords, a list of points. + * @return: world coordinates in as a list. + */ + cv::Point2f pxToCm(cv::Point point_px) const; + cv::Point2f pxToCm(QPoint point_px) const; + + /** + * Transform the provided pixel point into world coordinates and return + * world point. + * @param: point, a pixel point, used opencv point + * @return: world point. + */ + cv::Point2f cmToPx(cv::Point2f point_cm) const; + + /** + * Sets the tank coordinates. + * @param: areaCoordinates, the coordinate list of the considered area. + * @return: void. + */ + void setArea(std::vector areaCoordinates); + void setArea(std::vector areaCoordinates); + + // infers the area coordinates from the data model + void setArea(); + std::vector getDefaultArena(); + void resetAreaCoordinates(); + + /** + * Sets the real world dimension the tank. + * @param: areaWidth_cm, width of the tank in cm, + * @param: areaHeight_cm, height of the tank in cm, + * @return: void. + */ + void setDimension(double areaWidth_cm, double areaHeight_cm); + + void setCamImageSize(cv::Size size) + { + _camCaptureWidth_px = size.width; + _camCaptureHeight_px = size.height; + } + + void initRecitification(double areaHeight_cm, double areaWidth_cm); + void setupRecitification(int frameDisplayWidthPx, + int frameDisplayHeightPx, + int camImageWidth, + int camImageHeight); + + std::vector area() const + { + return _areaCoordinates; + } + + int minXPx(); + int maxXPx(); + int minYPx(); + int maxYPx(); + + cv::Point getTopLeft(); + cv::Point getBottomLeft(); + cv::Point getBottomRight(); + cv::Point getTopRight(); + cv::Point getCorrectedResolutionPoint(QPoint pos); + cv::Point getCorrectedResolutionPoint(cv::Point pos); + cv::Mat getSortedPoints(); private: + std::vector _areaCoordinates; + std::vector _rectifiedAreaCoordinates; - /** - * The standard constructor. - */ - Rectification(float w, float h); + // Homography + cv::Mat_ _H; + cv::Mat_ _H_inv; + // some vector 3x1. Might be zero? TODO + mutable cv::Mat_ _q; - Rectification(const Rectification&); /* verhindert, dass eine weitere Instanz via - Kopier-Konstruktor erstellt werden kann */ + int _camCaptureWidth_px; + int _camCaptureHeight_px; - Rectification & operator = (const Rectification &); //Verhindert weitere Instanz durch Kopie + int _frameDisplayWidthPx; + int _frameDisplayHeightPx; -public: + double _areaWidth_cm; + double _areaHeight_cm; + + bool _isSetup; - void init(double areaHeight_cm, double areaWidth_cm, - std::vector areaCoordinates, int camCaptureWidth_px, - int camCaptureHeight_px, int frameDisplayWidthPx, int frameDisplayHeightPx); - - bool isSetup() { return _isSetup; }; - - double areaWidth_cm() const { return _areaWidth_cm; } - double areaHeight_cm() const { return _areaHeight_cm; } - int captureWidth_px() const { return _camCaptureWidth_px; } - int captureHeight_px() const { return _camCaptureHeight_px; } - - bool inArea(cv::Point2f point_cm) const; - - /** - * Transform the provided pixel coordinates into world coordinates and return world coordinates. - * @param: pixelCoords, a list of points. - * @return: world coordinates in as a list. - */ - cv::Point2f pxToCm(cv::Point point_px) const; - cv::Point2f pxToCm(QPoint point_px) const; - - /** - * Transform the provided pixel point into world coordinates and return world point. - * @param: point, a pixel point, used opencv point - * @return: world point. - */ - cv::Point2f cmToPx(cv::Point2f point_cm) const; - - /** - * Sets the tank coordinates. - * @param: areaCoordinates, the coordinate list of the considered area. - * @return: void. - */ - void setArea(std::vector areaCoordinates); - void setArea(std::vector areaCoordinates); - - //infers the area coordinates from the data model - void setArea(); - std::vector getDefaultArena(); - void resetAreaCoordinates(); - - /** - * Sets the real world dimension the tank. - * @param: areaWidth_cm, width of the tank in cm, - * @param: areaHeight_cm, height of the tank in cm, - * @return: void. - */ - void setDimension(double areaWidth_cm, double areaHeight_cm); - - void setCamImageSize(cv::Size size) { _camCaptureWidth_px = size.width; _camCaptureHeight_px = size.height; } - - void initRecitification(double areaHeight_cm, double areaWidth_cm); - void setupRecitification(int frameDisplayWidthPx, int frameDisplayHeightPx, int camImageWidth, int camImageHeight); - - std::vector area() const { return _areaCoordinates; } - - int minXPx(); - int maxXPx(); - int minYPx(); - int maxYPx(); - - cv::Point getTopLeft(); - cv::Point getBottomLeft(); - cv::Point getBottomRight(); - cv::Point getTopRight(); - cv::Point getCorrectedResolutionPoint(QPoint pos); - cv::Point getCorrectedResolutionPoint(cv::Point pos); - cv::Mat getSortedPoints(); - -private: - std::vector _areaCoordinates; - std::vector _rectifiedAreaCoordinates; - - //Homography - cv::Mat_ _H; - cv::Mat_ _H_inv; - //some vector 3x1. Might be zero? TODO - mutable cv::Mat_ _q; - - int _camCaptureWidth_px; - int _camCaptureHeight_px; - - int _frameDisplayWidthPx; - int _frameDisplayHeightPx; - - double _areaWidth_cm; - double _areaHeight_cm; - - bool _isSetup; - - bool checkValidCoordinates(std::vector areaCoordinates, int camCaptureHeight_px, int camCaptureWidth_px); - + bool checkValidCoordinates(std::vector areaCoordinates, + int camCaptureHeight_px, + int camCaptureWidth_px); }; diff --git a/Src/Model/BioTracker3ProxyMat.cpp b/Src/Model/BioTracker3ProxyMat.cpp index 3b17de71..43480dc9 100644 --- a/Src/Model/BioTracker3ProxyMat.cpp +++ b/Src/Model/BioTracker3ProxyMat.cpp @@ -1,2 +1 @@ #include "BioTracker3ProxyMat.h" - diff --git a/Src/Model/BioTracker3ProxyMat.h b/Src/Model/BioTracker3ProxyMat.h index 6b96a336..1faf68c7 100644 --- a/Src/Model/BioTracker3ProxyMat.h +++ b/Src/Model/BioTracker3ProxyMat.h @@ -1,10 +1,9 @@ /**************************************************************************** - ** - ** This file is part of the BioTracker Framework - ** Origin of this class is BioTracker in version 2. - ** - ****************************************************************************/ - + ** + ** This file is part of the BioTracker Framework + ** Origin of this class is BioTracker in version 2. + ** + ****************************************************************************/ #ifndef BIOTRACKER3PROXYMAT_H #define BIOTRACKER3PROXYMAT_H @@ -16,34 +15,40 @@ #include /** - * The BioTracker3ProxyMat class is currently not used in BioTracker. It is an old class of the BioTracker in version 2. + * The BioTracker3ProxyMat class is currently not used in BioTracker. It is an + * old class of the BioTracker in version 2. */ -class BioTracker3ProxyMat { - public: +class BioTracker3ProxyMat +{ +public: BioTracker3ProxyMat(cv::Mat const& mat) - : m_originalMat(mat) { + : m_originalMat(mat) + { } BioTracker3ProxyMat(const BioTracker3ProxyMat&) = delete; BioTracker3ProxyMat& operator=(const BioTracker3ProxyMat&) = delete; - cv::Mat& getMat() { + cv::Mat& getMat() + { if (!isModified()) { m_modifiedMat = m_originalMat.clone(); } return m_modifiedMat.get(); } - void setMat(cv::Mat mat) { + void setMat(cv::Mat mat) + { m_modifiedMat = mat; } - bool isModified() const { + bool isModified() const + { return m_modifiedMat.is_initialized(); } - private: - cv::Mat const& m_originalMat; +private: + cv::Mat const& m_originalMat; boost::optional m_modifiedMat; }; diff --git a/Src/Model/CoreParameter.cpp b/Src/Model/CoreParameter.cpp index 5ffe5f58..6f362538 100644 --- a/Src/Model/CoreParameter.cpp +++ b/Src/Model/CoreParameter.cpp @@ -1,16 +1,17 @@ #include "CoreParameter.h" -CoreParameter::CoreParameter(QObject *parent) : - IModel(parent) +CoreParameter::CoreParameter(QObject* parent) +: IModel(parent) { - //_settings = BioTracker::Util::TypedSingleton::getInstance(CONFIGPARAM::CONFIG_INI_FILE); - //_settings = new BioTracker::Core::Settings(CONFIGPARAM::CONFIG_INI_FILE); + //_settings = + // BioTracker::Util::TypedSingleton::getInstance(CONFIGPARAM::CONFIG_INI_FILE); + //_settings = new BioTracker::Core::Settings(CONFIGPARAM::CONFIG_INI_FILE); - Q_EMIT notifyView(); + Q_EMIT notifyView(); } void CoreParameter::setTrackNumber(int number) { - m_trackNumber = number; - notifyView(); + m_trackNumber = number; + notifyView(); } diff --git a/Src/Model/CoreParameter.h b/Src/Model/CoreParameter.h index ef0db4e1..a6599e37 100644 --- a/Src/Model/CoreParameter.h +++ b/Src/Model/CoreParameter.h @@ -1,71 +1,65 @@ #ifndef COREPARAMETER_H #define COREPARAMETER_H - #include "Interfaces/IModel/IModel.h" #include "qcolor.h" /** -* This model includes the default visualization options the TrackedcomponentView -* uses to create its ComponentsShapes. -* Other shared paramters can also be added. -* It is a runtime shared storage. -*/ + * This model includes the default visualization options the + * TrackedcomponentView uses to create its ComponentsShapes. Other shared + * paramters can also be added. It is a runtime shared storage. + */ class CoreParameter : public IModel { - Q_OBJECT + Q_OBJECT public: - CoreParameter(QObject *parent = 0); - - //void setAll( - // bool viewSwitch, - // QString tracingStyle, - // int tracingHistory, - // int tracingSteps, - // QColor* colorBorder, - // QColor* colorBrush) - //{ - // m_viewSwitch = viewSwitch; - // m_tracingStyle = tracingStyle; - // m_tracingHistory = tracingHistory; - // m_tracingSteps = tracingSteps; - // m_colorBorder = colorBorder; - // m_colorBrush = colorBrush; - - // Q_EMIT notifyView(); - //}; - void setTrackNumber(int number); + CoreParameter(QObject* parent = 0); + // void setAll( + // bool viewSwitch, + // QString tracingStyle, + // int tracingHistory, + // int tracingSteps, + // QColor* colorBorder, + // QColor* colorBrush) + //{ + // m_viewSwitch = viewSwitch; + // m_tracingStyle = tracingStyle; + // m_tracingHistory = tracingHistory; + // m_tracingSteps = tracingSteps; + // m_colorBorder = colorBorder; + // m_colorBrush = colorBrush; + // Q_EMIT notifyView(); + //}; + void setTrackNumber(int number); public: - bool m_viewSwitch = true; - bool m_antialiasingEntities = false; - bool m_antialiasingFull = false; - - //Tracing - QString m_tracingStyle = "No tracing"; - int m_tracingHistory = 20; - int m_tracingSteps = 1; - QString m_tracingTimeDegradation = "None"; - double m_tracerProportions = 0.5; - bool m_tracerOrientationLine = false; - bool m_tracerFrameNumber = false; - //Track dimensions - int m_trackWidth = 30; - int m_trackHeight = 20; - //Track misc - bool m_trackOrientationLine = true; - bool m_trackShowId = false; - //Track color - QColor* m_colorBorder = new QColor(Qt::black); - QColor* m_colorBrush = new QColor(Qt::green); - //Track count - int m_trackNumber = 0; - //Ignore zooming - bool m_ignoreZoom = false; - + bool m_viewSwitch = true; + bool m_antialiasingEntities = false; + bool m_antialiasingFull = false; + // Tracing + QString m_tracingStyle = "No tracing"; + int m_tracingHistory = 20; + int m_tracingSteps = 1; + QString m_tracingTimeDegradation = "None"; + double m_tracerProportions = 0.5; + bool m_tracerOrientationLine = false; + bool m_tracerFrameNumber = false; + // Track dimensions + int m_trackWidth = 30; + int m_trackHeight = 20; + // Track misc + bool m_trackOrientationLine = true; + bool m_trackShowId = false; + // Track color + QColor* m_colorBorder = new QColor(Qt::black); + QColor* m_colorBrush = new QColor(Qt::green); + // Track count + int m_trackNumber = 0; + // Ignore zooming + bool m_ignoreZoom = false; }; #endif // COREPARAMETER_H diff --git a/Src/Model/DataExporters/DataExporterCSV.cpp b/Src/Model/DataExporters/DataExporterCSV.cpp index a6db9a96..c0796d99 100644 --- a/Src/Model/DataExporters/DataExporterCSV.cpp +++ b/Src/Model/DataExporters/DataExporterCSV.cpp @@ -5,26 +5,24 @@ #include #include +using namespace BioTrackerUtilsMisc; // split -using namespace BioTrackerUtilsMisc; //split - -DataExporterCSV::DataExporterCSV(QObject *parent) : - DataExporterGeneric(parent) +DataExporterCSV::DataExporterCSV(QObject* parent) +: DataExporterGeneric(parent) { - _root = nullptr; + _root = nullptr; _separator = _cfg->CsvSeperator.toStdString(); } - DataExporterCSV::~DataExporterCSV() { } -//https://codereview.stackexchange.com/questions/29611/finding-the-number-of-occurrences-of-a-string-in-another-string +// https://codereview.stackexchange.com/questions/29611/finding-the-number-of-occurrences-of-a-string-in-another-string int DataExporterCSV::key_search(const std::string& s, const std::string& key) { - int count = 0; - size_t pos = 0; + int count = 0; + size_t pos = 0; while ((pos = s.find(key, pos)) != std::string::npos) { ++count; ++pos; @@ -32,14 +30,13 @@ int DataExporterCSV::key_search(const std::string& s, const std::string& key) return count; } - -std::vector DataExporterCSV::getHeaderElements(IModelTrackedComponent *comp) { +std::vector DataExporterCSV::getHeaderElements( + IModelTrackedComponent* comp) +{ std::vector ret; - for (int i = 0; imetaObject()->propertyCount(); ++i) - { - if (comp->metaObject()->property(i).isStored(comp)) - { + for (int i = 0; i < comp->metaObject()->propertyCount(); ++i) { + if (comp->metaObject()->property(i).isStored(comp)) { if (!comp->metaObject()->property(i).isStored()) { continue; } @@ -50,15 +47,14 @@ std::vector DataExporterCSV::getHeaderElements(IModelTrackedCompone return ret; } -std::string DataExporterCSV::getHeader(IModelTrackedComponent *comp, int cnt) { +std::string DataExporterCSV::getHeader(IModelTrackedComponent* comp, int cnt) +{ std::stringstream ss; ss << "FRAME" << _separator << "MillisecsByFPS"; for (int c = 0; c < cnt; c++) { - for (int i = 0; imetaObject()->propertyCount(); ++i) - { - if (comp->metaObject()->property(i).isStored(comp)) - { + for (int i = 0; i < comp->metaObject()->propertyCount(); ++i) { + if (comp->metaObject()->property(i).isStored(comp)) { if (!comp->metaObject()->property(i).isStored()) { continue; } @@ -72,14 +68,14 @@ std::string DataExporterCSV::getHeader(IModelTrackedComponent *comp, int cnt) { } /* Writes a tracked component to string -*/ -std::string DataExporterCSV::writeComponentCSV(IModelTrackedComponent* comp, int tid) { + */ +std::string DataExporterCSV::writeComponentCSV(IModelTrackedComponent* comp, + int tid) +{ std::stringstream ss; - for (int i = 0; imetaObject()->propertyCount(); ++i) - { - if (comp->metaObject()->property(i).isStored(comp)) - { + for (int i = 0; i < comp->metaObject()->propertyCount(); ++i) { + if (comp->metaObject()->property(i).isStored(comp)) { if (!comp->metaObject()->property(i).isStored()) { continue; } @@ -88,9 +84,9 @@ std::string DataExporterCSV::writeComponentCSV(IModelTrackedComponent* comp, int continue; } std::string str = comp->metaObject()->property(i).name(); - QVariant v = comp->metaObject()->property(i).read(comp); + QVariant v = comp->metaObject()->property(i).read(comp); std::string val = v.toString().toStdString(); - val = (val == "" ? "0" : val); + val = (val == "" ? "0" : val); ss << _separator << val; } } @@ -98,26 +94,33 @@ std::string DataExporterCSV::writeComponentCSV(IModelTrackedComponent* comp, int return ss.str(); } -void DataExporterCSV::setProperty(IModelTrackedComponent* comp, std::string key, std::string val) { - QString qval = QString(val.c_str()); +void DataExporterCSV::setProperty(IModelTrackedComponent* comp, + std::string key, + std::string val) +{ + QString qval = QString(val.c_str()); QVariant v(qval); comp->setProperty(key.c_str(), v); } -void DataExporterCSV::addChildOfChild(IModelTrackedTrajectory *root, IModelTrackedComponent* child, IModelTrackedComponentFactory* factory, int idx) { - IModelTrackedTrajectory *traj = dynamic_cast(root->getChild(child->getId())); +void DataExporterCSV::addChildOfChild(IModelTrackedTrajectory* root, + IModelTrackedComponent* child, + IModelTrackedComponentFactory* factory, + int idx) +{ + IModelTrackedTrajectory* traj = dynamic_cast( + root->getChild(child->getId())); if (traj) { traj->add(child, idx); - } - else - { - traj = static_cast(factory->getNewTrackedTrajectory("0")); + } else { + traj = static_cast( + factory->getNewTrackedTrajectory("0")); traj->setValid(false); traj->add(child, idx); root->add(traj, child->getId()); } - + traj->setValid(child->getValid()); } @@ -130,21 +133,24 @@ void DataExporterCSV::loadFile(std::string file) getline(ifs, line); } - //parse header - ControllerDataExporter *ctr = dynamic_cast(_parent); - IModelTrackedComponentFactory* factory = ctr ? ctr->getComponentFactory() : nullptr; + // parse header + ControllerDataExporter* ctr = dynamic_cast( + _parent); + IModelTrackedComponentFactory* factory = ctr ? ctr->getComponentFactory() + : nullptr; if (!factory) { return; } - IModelTrackedComponent* dummy = static_cast(factory->getNewTrackedElement("0")); + IModelTrackedComponent* dummy = static_cast( + factory->getNewTrackedElement("0")); std::vector headerElsStr = getHeaderElements(dummy); - int headerEls = static_cast(headerElsStr.size()); + int headerEls = static_cast(headerElsStr.size()); std::vector strs; split(line, strs, _separator[0]); int idcnt = (static_cast(strs.size()) - 2) / headerEls; - //Add data lines + // Add data lines while (!ifs.eof()) { getline(ifs, line); @@ -153,13 +159,15 @@ void DataExporterCSV::loadFile(std::string file) if (strs.size() < 2) continue; - //First two entries are the "global header" (trajectory info, same for all at current timeslice) - int frame = atoi(strs[0].c_str()); + // First two entries are the "global header" (trajectory info, same for + // all at current timeslice) + int frame = atoi(strs[0].c_str()); float frameById = atof(strs[1].c_str()); - //the current trajectory/element pair - int curTrajCnt = 0; - IModelTrackedComponent* comp = static_cast(factory->getNewTrackedElement("0")); + // the current trajectory/element pair + int curTrajCnt = 0; + IModelTrackedComponent* comp = static_cast( + factory->getNewTrackedElement("0")); for (int x = 2; x < strs.size(); x++) { setProperty(comp, headerElsStr[curTrajCnt], strs[x].c_str()); @@ -168,30 +176,34 @@ void DataExporterCSV::loadFile(std::string file) if (curTrajCnt >= headerEls) { curTrajCnt = 0; addChildOfChild(_root, comp, factory, frame); - comp = static_cast(factory->getNewTrackedElement("0")); + comp = static_cast( + factory->getNewTrackedElement("0")); } } - //addChildOfChild(_root, comp, factory, frame); + // addChildOfChild(_root, comp, factory, frame); } } -void DataExporterCSV::write(int idx) { +void DataExporterCSV::write(int idx) +{ if (!_root) { qDebug() << "CORE: No output opened!"; return; } - //TODO there is some duplicated code here + // TODO there is some duplicated code here _ofs << std::to_string(idx) - << _separator + std::to_string((long long)((((double)idx) / _fps) * 1000)); + << _separator + + std::to_string((long long) ((((double) idx) / _fps) * 1000)); - //Write single trajectory + // Write single trajectory int trajNumber = 0; for (int i = 0; i < _root->size(); i++) { - IModelTrackedTrajectory *t = dynamic_cast(_root->getChild(i)); + IModelTrackedTrajectory* t = dynamic_cast( + _root->getChild(i)); if (t) { - IModelTrackedPoint *e; + IModelTrackedPoint* e; if (idx == -1) e = dynamic_cast(t->getLastChild()); else @@ -205,16 +217,18 @@ void DataExporterCSV::write(int idx) { _ofs << std::endl; } -void DataExporterCSV::finalizeAndReInit() { +void DataExporterCSV::finalizeAndReInit() +{ - close(); //Not needed, but... + close(); // Not needed, but... writeAll(); cleanup(); open(_root); } -void DataExporterCSV::writeAll(std::string f) { - //Sanity +void DataExporterCSV::writeAll(std::string f) +{ + // Sanity if (!_root) { qDebug() << "CORE: No output opened!"; return; @@ -223,12 +237,11 @@ void DataExporterCSV::writeAll(std::string f) { _ofs.close(); } - //Find max length of all tracks + // Find max length of all tracks int max = getMaxLinecount(); - //There is nothing to write - if (max <= 0) - { + // There is nothing to write + if (max <= 0) { cleanup(); return; } @@ -240,47 +253,51 @@ void DataExporterCSV::writeAll(std::string f) { if (target.substr(target.size() - 4) != ".csv") target += ".csv"; - //Create final file - std::ofstream o; + // Create final file + std::ofstream o; o.open(target, std::ofstream::out); - //write metadata - ControllerDataExporter *ctr = dynamic_cast(_parent); + // write metadata + ControllerDataExporter* ctr = dynamic_cast( + _parent); SourceVideoMetadata d = ctr->getSourceMetadata(); o << "# Source name: " << d.name << std::endl; o << "# Source FPS: " << d.fps << std::endl; QVariant vv(QDateTime::currentDateTime()); o << "# Generation time: " << vv.toString().toStdString() << std::endl; - //write header - int vcount = _root->validCount(); - IModelTrackedComponentFactory* factory = ctr ? ctr->getComponentFactory() : nullptr; - int headerCount = 0; + // write header + int vcount = _root->validCount(); + IModelTrackedComponentFactory* factory = ctr ? ctr->getComponentFactory() + : nullptr; + int headerCount = 0; if (factory != nullptr) { - IModelTrackedComponent *ptraj = static_cast(factory->getNewTrackedElement("0")); + IModelTrackedComponent* ptraj = static_cast( + factory->getNewTrackedElement("0")); std::string header = getHeader(ptraj, vcount); - headerCount = static_cast(getHeaderElements(ptraj).size()); + headerCount = static_cast(getHeaderElements(ptraj).size()); o << header << "\n"; delete ptraj; } - - //Write out everything to a new file + // Write out everything to a new file int trajNumber = 0; - //idx is the frame number + // idx is the frame number for (int idx = 0; idx < max; idx++) { o << std::to_string(idx) - << _separator + std::to_string((((float)idx) / _fps) * 1000); + << _separator + std::to_string((((float) idx) / _fps) * 1000); int linecnt = 0; - //i is the track number + // i is the track number for (int i = 0; i < _root->size(); i++) { - IModelTrackedTrajectory *t = dynamic_cast(_root->getChild(i)); + IModelTrackedTrajectory* t = + dynamic_cast(_root->getChild(i)); if (t && t->validCount() > 0) { - IModelTrackedPoint *e = dynamic_cast(t->getChild(idx)); + IModelTrackedPoint* e = dynamic_cast( + t->getChild(idx)); if (e) { std::string line = writeComponentCSV(e, trajNumber); o << line; @@ -291,7 +308,7 @@ void DataExporterCSV::writeAll(std::string f) { } int count = _root->validCount(); while (linecnt < count) { - for (int i = 0; i getHeaderElements(IModelTrackedComponent *comp); - + std::vector getHeaderElements(IModelTrackedComponent* comp); + /* Get's the header as one connected string - * - * Similar getHeaderElements, but for all components and having all elements of the return vector concatenated - * returns GlobalHeaders,Individual1,Indiviual2,... - */ - std::string getHeader(IModelTrackedComponent *comp, int cnt); + * + * Similar getHeaderElements, but for all components and having all + * elements of the return vector concatenated returns + * GlobalHeaders,Individual1,Indiviual2,... + */ + std::string getHeader(IModelTrackedComponent* comp, int cnt); /* Sets sets a property to a components. - */ - void setProperty(IModelTrackedComponent* comp, std::string key, std::string val); + */ + void setProperty(IModelTrackedComponent* comp, + std::string key, + std::string val); /* Writes a tracked component to string - */ + */ std::string writeComponentCSV(IModelTrackedComponent* comp, int tid); - - void addChildOfChild(IModelTrackedTrajectory *root, IModelTrackedComponent* child, IModelTrackedComponentFactory* factory, int idx); + void addChildOfChild(IModelTrackedTrajectory* root, + IModelTrackedComponent* child, + IModelTrackedComponentFactory* factory, + int idx); }; - diff --git a/Src/Model/DataExporters/DataExporterGeneric.cpp b/Src/Model/DataExporters/DataExporterGeneric.cpp index 950b659a..ce5f0d20 100644 --- a/Src/Model/DataExporters/DataExporterGeneric.cpp +++ b/Src/Model/DataExporters/DataExporterGeneric.cpp @@ -5,19 +5,22 @@ #include #include -DataExporterGeneric::DataExporterGeneric(QObject *parent) : - IModelDataExporter(parent) +DataExporterGeneric::DataExporterGeneric(QObject* parent) +: IModelDataExporter(parent) { _parent = static_cast(parent); - _cfg = static_cast(parent)->getConfig(); - _root = 0; + _cfg = static_cast(parent)->getConfig(); + _root = 0; } -void DataExporterGeneric::open(IModelTrackedTrajectory *root) { +void DataExporterGeneric::open(IModelTrackedTrajectory* root) +{ _root = root; - - _tmpFile = _parent->generateBasename(true).toStdString() + ".tmp" + getSuffix().toStdString(); - _finalFile = _parent->generateBasename(false).toStdString() + getSuffix().toStdString(); + + _tmpFile = _parent->generateBasename(true).toStdString() + ".tmp" + + getSuffix().toStdString(); + _finalFile = _parent->generateBasename(false).toStdString() + + getSuffix().toStdString(); _ofs.open(_tmpFile, std::ofstream::out); } @@ -28,8 +31,10 @@ int DataExporterGeneric::getMaxLinecount() int max = 0; for (int i = 0; i < _root->size(); i++) { - IModelTrackedTrajectory *t = dynamic_cast(_root->getChild(i)); - if (t) max = std::max(t->size(), max); + IModelTrackedTrajectory* t = dynamic_cast( + _root->getChild(i)); + if (t) + max = std::max(t->size(), max); } return max; @@ -39,15 +44,15 @@ void DataExporterGeneric::cleanup() { int s = _root->size(); - //Erase all tracking data from the tracking structure! + // Erase all tracking data from the tracking structure! _root->clear(); - //Remove temporary file + // Remove temporary file QFile file(_tmpFile.c_str()); file.remove(); if (s > 0) { - //Tell the controller about the written file + // Tell the controller about the written file QFileInfo fi(_finalFile.c_str()); fileWritten(fi); } diff --git a/Src/Model/DataExporters/DataExporterGeneric.h b/Src/Model/DataExporters/DataExporterGeneric.h index fbed180e..9507d139 100644 --- a/Src/Model/DataExporters/DataExporterGeneric.h +++ b/Src/Model/DataExporters/DataExporterGeneric.h @@ -10,35 +10,33 @@ class DataExporterGeneric : public IModelDataExporter { - Q_OBJECT + Q_OBJECT public: - DataExporterGeneric(QObject *parent = 0); + DataExporterGeneric(QObject* parent = 0); - /** + /** * Opens a file for writing the passed tracking structure * @param root Pointer to the tracking structure - */ - void open(IModelTrackedTrajectory *root) override; + */ + void open(IModelTrackedTrajectory* root) override; void finalize() override; protected: - int getMaxLinecount(); void cleanup(); - ControllerDataExporter *_parent = nullptr; - Config *_cfg; + ControllerDataExporter* _parent = nullptr; + Config* _cfg; std::ofstream _ofs; - //Name of the temporary file to write to + // Name of the temporary file to write to std::string _tmpFile; - //Name of the final file, holding a clean representation of the structure. + // Name of the final file, holding a clean representation of the structure. std::string _finalFile; -private: +private: }; - diff --git a/Src/Model/DataExporters/DataExporterJson.cpp b/Src/Model/DataExporters/DataExporterJson.cpp index da0d2e99..c055655b 100644 --- a/Src/Model/DataExporters/DataExporterJson.cpp +++ b/Src/Model/DataExporters/DataExporterJson.cpp @@ -6,7 +6,6 @@ #include "Controller/ControllerDataExporter.h" - #include #include #include @@ -18,34 +17,36 @@ #include #include - -namespace DataExporterJsonUtil { +namespace DataExporterJsonUtil +{ template - static T preprocess_value(T &¶mValue) { + static T preprocess_value(T&& paramValue) + { return std::forward(paramValue); } /* Writes a tracked component to a property tree for json serialization - */ - void writeComponentJson(IModelTrackedComponent* comp, boost::property_tree::ptree *pt) { + */ + void writeComponentJson(IModelTrackedComponent* comp, + boost::property_tree::ptree* pt) + { - for (int i = 0; imetaObject()->propertyCount(); ++i) - { - if (comp->metaObject()->property(i).isStored(comp)) - { + for (int i = 0; i < comp->metaObject()->propertyCount(); ++i) { + if (comp->metaObject()->property(i).isStored(comp)) { if (!comp->metaObject()->property(i).isStored()) { continue; } std::string str = comp->metaObject()->property(i).name(); - QVariant v = comp->metaObject()->property(i).read(comp); + QVariant v = comp->metaObject()->property(i).read(comp); pt->put(str, v.toString().toStdString()); } } } /* Helper function to extract a suffix number from a string - */ - int getId(std::string fst, std::string prefix) { + */ + int getId(std::string fst, std::string prefix) + { if (fst.size() < prefix.size()) return -1; @@ -59,78 +60,87 @@ namespace DataExporterJsonUtil { } /* Helper function to set elements - */ - void setElemProperty(boost::property_tree::ptree *tree, std::string key, IModelTrackedComponent* comp) { - QString val = QString(tree->data().c_str()); + */ + void setElemProperty(boost::property_tree::ptree* tree, + std::string key, + IModelTrackedComponent* comp) + { + QString val = QString(tree->data().c_str()); std::string check = val.toStdString(); - QVariant v(val); + QVariant v(val); comp->setProperty(key.c_str(), v); } /* Recursion to write the tracked component tree into a boost property tree - */ + */ void populateLevel( IModelTrackedComponent* comp, - boost::property_tree::basic_ptree> *pt, + boost::property_tree:: + basic_ptree>* pt, IModelTrackedComponentFactory* factory, - std::deque prefixes) + std::deque prefixes) { - //Check the prefixes (are the children leafs or nodes?) + // Check the prefixes (are the children leafs or nodes?) std::string prefix = ""; if (prefixes.size() > 0) { prefix = prefixes.front(); prefixes.pop_front(); } - //Iterate children + // Iterate children for (auto it : *pt) { - //Get ID if any + // Get ID if any int id = getId(it.first, prefix); - //Check if there is a subtree + // Check if there is a subtree if (it.second.size() > 0) { - //This is a valid subtree + // This is a valid subtree if (prefixes.size() > 0) { - IModelTrackedTrajectory *child = static_cast(factory->getNewTrackedTrajectory("0")); + IModelTrackedTrajectory* child = + static_cast( + factory->getNewTrackedTrajectory("0")); populateLevel(child, &(it.second), factory, prefixes); - static_cast(comp)->add(child, id); + static_cast(comp)->add(child, + id); } - //This is a leaf node with only properties beneath + // This is a leaf node with only properties beneath else { - IModelTrackedComponent *node = static_cast(factory->getNewTrackedElement("0")); + IModelTrackedComponent* node = + static_cast( + factory->getNewTrackedElement("0")); populateLevel(node, &(it.second), factory, prefixes); static_cast(comp)->add(node, id); } } - //Found a property and assigning it + // Found a property and assigning it else { setElemProperty(&(it.second), it.first, comp); } } - } } -DataExporterJson::DataExporterJson(QObject *parent) : - DataExporterGeneric(parent) +DataExporterJson::DataExporterJson(QObject* parent) +: DataExporterGeneric(parent) { _root = 0; } - DataExporterJson::~DataExporterJson() { - //delete _root; + // delete _root; } -std::string DataExporterJson::writeTrackpoint(IModelTrackedPoint *e, int trajNumber) { +std::string DataExporterJson::writeTrackpoint(IModelTrackedPoint* e, + int trajNumber) +{ std::stringstream ss; - return ss.str(); } -void DataExporterJson::write(int idx) { +void DataExporterJson::write(int idx) +{ if (!_root) { qDebug() << "CORE: No output opened!"; return; @@ -139,36 +149,36 @@ void DataExporterJson::write(int idx) { _ofs << std::endl; } -void DataExporterJson::finalizeAndReInit() { - close(); //Not needed, but... +void DataExporterJson::finalizeAndReInit() +{ + close(); // Not needed, but... writeAll(); cleanup(); open(_root); } -void DataExporterJson::loadFile(std::string file) { +void DataExporterJson::loadFile(std::string file) +{ boost::property_tree::ptree ptRoot; boost::property_tree::read_json(file, ptRoot); - ControllerDataExporter *ctr = _parent; - IModelTrackedComponentFactory* factory = ctr ? ctr->getComponentFactory() : nullptr; + ControllerDataExporter* ctr = _parent; + IModelTrackedComponentFactory* factory = ctr ? ctr->getComponentFactory() + : nullptr; if (!factory) { return; } - //ID's of entities are managed via prefix+enumeration - std::deque prefixes = { "Trajectory_", "Element_" }; + // ID's of entities are managed via prefix+enumeration + std::deque prefixes = {"Trajectory_", "Element_"}; - //Recursively reads the json - DataExporterJsonUtil::populateLevel( - _root, - &ptRoot, - factory, - prefixes); + // Recursively reads the json + DataExporterJsonUtil::populateLevel(_root, &ptRoot, factory, prefixes); }; -void DataExporterJson::writeAll(std::string f) { - //Sanity +void DataExporterJson::writeAll(std::string f) +{ + // Sanity if (!_root) { qDebug() << "CORE: No output opened!"; return; @@ -189,38 +199,41 @@ void DataExporterJson::writeAll(std::string f) { if (target.substr(target.size() - 4) != ".json") target += ".json"; - boost::property_tree::ptree ptRoot; + boost::property_tree::ptree ptRoot; DataExporterJsonUtil::writeComponentJson(_root, &ptRoot); - - //go through all trajectories - for (int i = 0; i < _root->size(); i++) { - IModelTrackedTrajectory *t = static_cast(_root->getChild(i)); + + // go through all trajectories + for (int i = 0; i < _root->size(); i++) { + IModelTrackedTrajectory* t = static_cast( + _root->getChild(i)); boost::property_tree::ptree ptt; DataExporterJsonUtil::writeComponentJson(t, &ptt); ////i is the track number for (int idx = 0; idx < t->size(); idx++) { - IModelTrackedComponent *e = static_cast(t->getChild(idx)); + IModelTrackedComponent* e = static_cast( + t->getChild(idx)); - //If the node exists (i.e. not NULL) then it to the property tree + // If the node exists (i.e. not NULL) then it to the property tree if (e) { boost::property_tree::ptree pte; DataExporterJsonUtil::writeComponentJson(e, &pte); - ptt.put_child("Element_"+std::to_string(idx), pte); + ptt.put_child("Element_" + std::to_string(idx), pte); } } - //Insert the trajectory into the tree + // Insert the trajectory into the tree ptRoot.put_child("Trajectory_" + std::to_string(i), ptt); - } + } write_json(target, ptRoot); } -void DataExporterJson::close() { +void DataExporterJson::close() +{ _ofs.close(); - if ((!_root || _root->size() == 0) &&_tmpFile!="" ) { - //Remove temporary file + if ((!_root || _root->size() == 0) && _tmpFile != "") { + // Remove temporary file QFile file(_tmpFile.c_str()); file.remove(); } diff --git a/Src/Model/DataExporters/DataExporterJson.h b/Src/Model/DataExporters/DataExporterJson.h index d7827bcc..f0decebb 100644 --- a/Src/Model/DataExporters/DataExporterJson.h +++ b/Src/Model/DataExporters/DataExporterJson.h @@ -4,41 +4,42 @@ class DataExporterJson : public DataExporterGeneric { - Q_OBJECT + Q_OBJECT public: - DataExporterJson(QObject *parent = 0); - ~DataExporterJson(); + DataExporterJson(QObject* parent = 0); + ~DataExporterJson(); /** - * Add a single frame index to the output file - * @param Index to write or -1 for latest - */ - void write(int idx = -1) override; + * Add a single frame index to the output file + * @param Index to write or -1 for latest + */ + void write(int idx = -1) override; /** - * Re-Serialize the entire structure in a clean fashion - */ - void writeAll(std::string f = "") override; + * Re-Serialize the entire structure in a clean fashion + */ + void writeAll(std::string f = "") override; /** - * Close the file - */ - void close() override; + * Close the file + */ + void close() override; - void loadFile(std::string file) override; + void loadFile(std::string file) override; /** - * Effectively a writeAll, close and open. - */ + * Effectively a writeAll, close and open. + */ void finalizeAndReInit() override; - QString getSuffix() { return ".json"; }; + QString getSuffix() + { + return ".json"; + }; private: - /** - * helper function to generate a part of an output line - */ - std::string writeTrackpoint(IModelTrackedPoint *e, int trajNumber); + * helper function to generate a part of an output line + */ + std::string writeTrackpoint(IModelTrackedPoint* e, int trajNumber); }; - diff --git a/Src/Model/DataExporters/DataExporterSerialize.cpp b/Src/Model/DataExporters/DataExporterSerialize.cpp index a6742207..aa973424 100644 --- a/Src/Model/DataExporters/DataExporterSerialize.cpp +++ b/Src/Model/DataExporters/DataExporterSerialize.cpp @@ -11,25 +11,26 @@ #include "Controller/ControllerDataExporter.h" -DataExporterSerialize::DataExporterSerialize(QObject *parent) : - DataExporterGeneric(parent) +DataExporterSerialize::DataExporterSerialize(QObject* parent) +: DataExporterGeneric(parent) { _root = 0; } - DataExporterSerialize::~DataExporterSerialize() { } -std::string DataExporterSerialize::writeTrackpoint(IModelTrackedPoint *e, int trajNumber) { +std::string DataExporterSerialize::writeTrackpoint(IModelTrackedPoint* e, + int trajNumber) +{ std::stringstream ss; - return ss.str(); } -void DataExporterSerialize::write(int idx) { +void DataExporterSerialize::write(int idx) +{ if (!_root) { qDebug() << "CORE: No output opened!"; return; @@ -38,56 +39,62 @@ void DataExporterSerialize::write(int idx) { _ofs << std::endl; } -void DataExporterSerialize::finalizeAndReInit() { - close(); //Not needed, but... +void DataExporterSerialize::finalizeAndReInit() +{ + close(); // Not needed, but... writeAll(); cleanup(); open(_root); } -void DataExporterSerialize::loadFile(std::string file){ +void DataExporterSerialize::loadFile(std::string file) +{ - ControllerDataExporter *ctr = _parent; - IModelTrackedComponentFactory* factory = ctr ? ctr->getComponentFactory() : nullptr; - if (!factory) { - return; - } + ControllerDataExporter* ctr = _parent; + IModelTrackedComponentFactory* factory = ctr ? ctr->getComponentFactory() + : nullptr; + if (!factory) { + return; + } - QFile f(file.c_str()); - f.open(QIODevice::ReadOnly); - QDataStream in(&f); + QFile f(file.c_str()); + f.open(QIODevice::ReadOnly); + QDataStream in(&f); - IModelTrackedTrajectory *root = _root; + IModelTrackedTrajectory* root = _root; in >> *root; - int children = -1; - in >> children; - - std::vector childids; - for (int i = 0; i < children; i++) { - IModelTrackedTrajectory *child = static_cast(factory->getNewTrackedTrajectory("0")); - in >> *child; - childids.push_back(child->getId()); - root->add(child, child->getId()); - } - - //i is the track number - for (int i = 0; i < childids.size(); i++) { - IModelTrackedTrajectory* curTraj = static_cast(root->getChild(childids[i])); - int trajSize = -1; - in >> trajSize; - //idx is the frame number - for (int idx = 0; idx < trajSize; idx++) { - IModelTrackedComponent *e = factory->getNewTrackedElement("0"); - int cid = 0; + int children = -1; + in >> children; + + std::vector childids; + for (int i = 0; i < children; i++) { + IModelTrackedTrajectory* child = static_cast( + factory->getNewTrackedTrajectory("0")); + in >> *child; + childids.push_back(child->getId()); + root->add(child, child->getId()); + } + + // i is the track number + for (int i = 0; i < childids.size(); i++) { + IModelTrackedTrajectory* curTraj = + static_cast(root->getChild(childids[i])); + int trajSize = -1; + in >> trajSize; + // idx is the frame number + for (int idx = 0; idx < trajSize; idx++) { + IModelTrackedComponent* e = factory->getNewTrackedElement("0"); + int cid = 0; in >> cid; - in >> *e; - curTraj->add(e, cid); - } - } + in >> *e; + curTraj->add(e, cid); + } + } }; -void DataExporterSerialize::writeAll(std::string f) { - //Sanity +void DataExporterSerialize::writeAll(std::string f) +{ + // Sanity if (!_root) { qDebug() << "CORE: No output opened!"; return; @@ -108,28 +115,30 @@ void DataExporterSerialize::writeAll(std::string f) { if (target.substr(target.size() - 4) != ".dat") target += ".dat"; - //Create final file - QFile file(target.c_str()); - file.open(QIODevice::WriteOnly); - QDataStream out(&file); - - //serialize tree nodes (!= leafs) - out << *_root; - out << _root->size(); - for (int i = 0; i < _root->size(); i++) { - IModelTrackedTrajectory *t = dynamic_cast(_root->getChild(i)); - out << *t; - } - + // Create final file + QFile file(target.c_str()); + file.open(QIODevice::WriteOnly); + QDataStream out(&file); + + // serialize tree nodes (!= leafs) + out << *_root; + out << _root->size(); + for (int i = 0; i < _root->size(); i++) { + IModelTrackedTrajectory* t = dynamic_cast( + _root->getChild(i)); + out << *t; + } - //i is the track number - for (int i = 0; i < _root->size(); i++) { - IModelTrackedTrajectory *t = dynamic_cast(_root->getChild(i)); + // i is the track number + for (int i = 0; i < _root->size(); i++) { + IModelTrackedTrajectory* t = dynamic_cast( + _root->getChild(i)); int cnt = 0; for (int idx = 0; idx < t->size(); idx++) { if (t) { - IModelTrackedComponent *e = dynamic_cast(t->getChild(idx)); + IModelTrackedComponent* e = + dynamic_cast(t->getChild(idx)); if (e) { cnt++; } @@ -137,10 +146,11 @@ void DataExporterSerialize::writeAll(std::string f) { } out << cnt; - //idx is the frame number - for (int idx = 0; idx < t->size(); idx++) { + // idx is the frame number + for (int idx = 0; idx < t->size(); idx++) { if (t) { - IModelTrackedComponent *e = dynamic_cast(t->getChild(idx)); + IModelTrackedComponent* e = + dynamic_cast(t->getChild(idx)); if (e) { out << idx; out << *e; @@ -150,11 +160,12 @@ void DataExporterSerialize::writeAll(std::string f) { } } -void DataExporterSerialize::close() { +void DataExporterSerialize::close() +{ _ofs.close(); - if ((!_root || _root->size() == 0) && _tmpFile!="" ) { - //Remove temporary file + if ((!_root || _root->size() == 0) && _tmpFile != "") { + // Remove temporary file QFile file(_tmpFile.c_str()); file.remove(); } diff --git a/Src/Model/DataExporters/DataExporterSerialize.h b/Src/Model/DataExporters/DataExporterSerialize.h index 93c868d6..09eb27b8 100644 --- a/Src/Model/DataExporters/DataExporterSerialize.h +++ b/Src/Model/DataExporters/DataExporterSerialize.h @@ -4,41 +4,42 @@ class DataExporterSerialize : public DataExporterGeneric { - Q_OBJECT + Q_OBJECT public: - DataExporterSerialize(QObject *parent = 0); - ~DataExporterSerialize(); + DataExporterSerialize(QObject* parent = 0); + ~DataExporterSerialize(); /** - * Add a single frame index to the output file - * @param Index to write or -1 for latest - */ - void write(int idx = -1) override; + * Add a single frame index to the output file + * @param Index to write or -1 for latest + */ + void write(int idx = -1) override; /** - * Re-Serialize the entire structure in a clean fashion - */ - void writeAll(std::string f = "") override; + * Re-Serialize the entire structure in a clean fashion + */ + void writeAll(std::string f = "") override; /** - * Close the file - */ - void close() override; + * Close the file + */ + void close() override; - void loadFile(std::string file) override; + void loadFile(std::string file) override; /** - * Effectively a writeAll, close and open. - */ + * Effectively a writeAll, close and open. + */ void finalizeAndReInit() override; - QString getSuffix() { return ".dat"; }; + QString getSuffix() + { + return ".dat"; + }; private: - /** - * helper function to generate a part of an output line - */ - std::string writeTrackpoint(IModelTrackedPoint *e, int trajNumber); + * helper function to generate a part of an output line + */ + std::string writeTrackpoint(IModelTrackedPoint* e, int trajNumber); }; - diff --git a/Src/Model/ImageStream.cpp b/Src/Model/ImageStream.cpp index e5ff8cdb..2176c652 100644 --- a/Src/Model/ImageStream.cpp +++ b/Src/Model/ImageStream.cpp @@ -1,8 +1,8 @@ #include "ImageStream.h" #include "util/stdext.h" -#include // assert -#include // std::invalid_argument +#include // assert +#include // std::invalid_argument #include #include #include @@ -19,653 +19,760 @@ #include "Controller/IControllerCfg.h" #if HAS_PYLON -#include "util/camera/pylon.h" -#include + #include "util/camera/pylon.h" + #include #endif #include -namespace BioTracker { - namespace Core { - - ImageStream::ImageStream(QObject *parent, Config *cfg) : QObject(parent), - m_current_frame(new cv::Mat(cv::Size(0, 0), CV_8UC3)), - m_current_frame_number(0) { - _cfg = cfg; - if (cfg) - m_frame_stride = cfg->FrameStride; - } - - size_t ImageStream::currentFrameNumber() const { - return m_current_frame_number; - } - - std::shared_ptr ImageStream::currentFrame() const { - return m_current_frame; - } - - bool ImageStream::setFrameNumber(size_t frame_number) { - // valid new frame number - if (frame_number < this->numFrames()) { - // skip update if frame number doesn't change - if (frame_number == this->currentFrameNumber()) { - return true; - } - else { - const bool success = this->setFrameNumber_impl(frame_number); - m_current_frame_number = frame_number; - return success; - } - } - // invalid new frame number - else { - this->clearImage(); - return false; - } - } - - bool ImageStream::lastFrame() const { - return this->currentFrameNumber() + 1 == this->numFrames(); - } - - bool ImageStream::end() const { - return (this->currentFrameNumber() >= this->numFrames() && this->numFrames() >= 0); - } - - bool ImageStream::currentFrameIsEmpty() const { - return this->currentFrame()->empty(); - } - - bool ImageStream::nextFrame() { - const size_t new_frame_number = this->currentFrameNumber() + m_frame_stride; - if (new_frame_number < this->numFrames()) { - const bool success = this->nextFrame_impl(); - m_current_frame_number = new_frame_number; - return success; - } - else { - this->clearImage(); - return false; - } - } - - bool ImageStream::previousFrame() { - if (this->currentFrameNumber() > 0) { - const size_t new_frame_numer = this->currentFrameNumber() - 1; - const bool success = this->previousFrame_impl(); - m_current_frame_number = new_frame_numer; - return success; - } - else { - this->clearImage(); - return false; - } - } - - void ImageStream::set_current_frame(std::shared_ptr img) { - m_current_frame.swap(img); - } - - void ImageStream::clearImage() { - m_current_frame.reset(); - m_current_frame_number = this->numFrames(); - } - - bool ImageStream::nextFrame_impl() { - assert(this->currentFrameNumber() + 1 < this->numFrames()); - const size_t new_frame_number = this->currentFrameNumber() + 1; - return this->setFrameNumber_impl(new_frame_number); - } - - bool ImageStream::previousFrame_impl() { - assert(this->currentFrameNumber() > 0); - const size_t new_frame_number = this->currentFrameNumber() - 1; - return this->setFrameNumber_impl(new_frame_number); - } - - bool ImageStream::hasNextInBatch(){ - return false; - } - - void ImageStream::stepToNextInBatch(){ - } - - std::vector ImageStream::getBatchItems(){ - return {}; - } - - ImageStream::~ImageStream() = default; - - - /*********************************************************/ - - - class ImageStream3NoMedia : public ImageStream { - public: - explicit ImageStream3NoMedia() = default ; - virtual GuiParam::MediaType type() const override { - return GuiParam::MediaType::NoMedia; - } - virtual size_t numFrames() const override { - return 0; - } - virtual bool toggleRecord() override { - return false; - } - virtual double fps() const override { - return 1.0; - } - virtual std::string currentFilename() const override { - return "No Media"; // TODO make this nicer.. - } - - private: - virtual bool setFrameNumber_impl(size_t) override { - return false; - } - }; - - - /*********************************************************/ - - - class ImageStream3Pictures : public ImageStream { - public: - explicit ImageStream3Pictures(Config *cfg, std::vector picture_files) - : ImageStream(0, cfg) - ,m_picture_files(std::move(picture_files)), m_currentFrame(0) { - - //Grab the codec from config file +namespace BioTracker +{ + namespace Core + { + + ImageStream::ImageStream(QObject* parent, Config* cfg) + : QObject(parent) + , m_current_frame(new cv::Mat(cv::Size(0, 0), CV_8UC3)) + , m_current_frame_number(0) + { + _cfg = cfg; + if (cfg) + m_frame_stride = cfg->FrameStride; + } + + size_t ImageStream::currentFrameNumber() const + { + return m_current_frame_number; + } + + std::shared_ptr ImageStream::currentFrame() const + { + return m_current_frame; + } + + bool ImageStream::setFrameNumber(size_t frame_number) + { + // valid new frame number + if (frame_number < this->numFrames()) { + // skip update if frame number doesn't change + if (frame_number == this->currentFrameNumber()) { + return true; + } else { + const bool success = this->setFrameNumber_impl( + frame_number); + m_current_frame_number = frame_number; + return success; + } + } + // invalid new frame number + else { + this->clearImage(); + return false; + } + } + + bool ImageStream::lastFrame() const + { + return this->currentFrameNumber() + 1 == this->numFrames(); + } + + bool ImageStream::end() const + { + return (this->currentFrameNumber() >= this->numFrames() && + this->numFrames() >= 0); + } + + bool ImageStream::currentFrameIsEmpty() const + { + return this->currentFrame()->empty(); + } + + bool ImageStream::nextFrame() + { + const size_t new_frame_number = this->currentFrameNumber() + + m_frame_stride; + if (new_frame_number < this->numFrames()) { + const bool success = this->nextFrame_impl(); + m_current_frame_number = new_frame_number; + return success; + } else { + this->clearImage(); + return false; + } + } + + bool ImageStream::previousFrame() + { + if (this->currentFrameNumber() > 0) { + const size_t new_frame_numer = this->currentFrameNumber() - 1; + const bool success = this->previousFrame_impl(); + m_current_frame_number = new_frame_numer; + return success; + } else { + this->clearImage(); + return false; + } + } + + void ImageStream::set_current_frame(std::shared_ptr img) + { + m_current_frame.swap(img); + } + + void ImageStream::clearImage() + { + m_current_frame.reset(); + m_current_frame_number = this->numFrames(); + } + + bool ImageStream::nextFrame_impl() + { + assert(this->currentFrameNumber() + 1 < this->numFrames()); + const size_t new_frame_number = this->currentFrameNumber() + 1; + return this->setFrameNumber_impl(new_frame_number); + } + + bool ImageStream::previousFrame_impl() + { + assert(this->currentFrameNumber() > 0); + const size_t new_frame_number = this->currentFrameNumber() - 1; + return this->setFrameNumber_impl(new_frame_number); + } + + bool ImageStream::hasNextInBatch() + { + return false; + } + + void ImageStream::stepToNextInBatch() + { + } + + std::vector ImageStream::getBatchItems() + { + return {}; + } + + ImageStream::~ImageStream() = default; + + /*********************************************************/ + + class ImageStream3NoMedia : public ImageStream + { + public: + explicit ImageStream3NoMedia() = default; + virtual GuiParam::MediaType type() const override + { + return GuiParam::MediaType::NoMedia; + } + virtual size_t numFrames() const override + { + return 0; + } + virtual bool toggleRecord() override + { + return false; + } + virtual double fps() const override + { + return 1.0; + } + virtual std::string currentFilename() const override + { + return "No Media"; // TODO make this nicer.. + } + + private: + virtual bool setFrameNumber_impl(size_t) override + { + return false; + } + }; + + /*********************************************************/ + + class ImageStream3Pictures : public ImageStream + { + public: + explicit ImageStream3Pictures( + Config* cfg, + std::vector picture_files) + : ImageStream(0, cfg) + , m_picture_files(std::move(picture_files)) + , m_currentFrame(0) + { + + // Grab the codec from config file double fps = _cfg->RecordFPS; if (fps > 0) { m_fps = fps; - } - else - { + } else { m_fps = 1; } - // load first image - if (this->numFrames() > 0) { - this->setFrameNumber_impl(0); - std::string filename = m_picture_files[0].string(); - std::shared_ptr new_frame = std::make_shared(cv::imread(filename)); - m_w = new_frame->size().width; - m_h = new_frame->size().height; - m_recording = false; - vCoder = std::make_shared(m_fps, _cfg); - } - - } - virtual GuiParam::MediaType type() const override { - return GuiParam::MediaType::Images; - } - virtual size_t numFrames() const override { - return m_picture_files.size(); - } - virtual bool toggleRecord() override { - if (this->numFrames() <= 0) { - return false; - } - m_recording = vCoder->toggle(m_w, m_h, m_fps); - - return m_recording; - } - virtual double fps() const override { - return m_fps; - } - virtual std::string currentFilename() const override { - assert(currentFrameNumber() < m_picture_files.size()); - return m_picture_files[currentFrameNumber()].string(); - } - - private: - virtual bool nextFrame_impl() override { - m_currentFrame += static_cast(m_frame_stride); - if (this->numFrames() > m_currentFrame) { - - const std::string &filename = m_picture_files[m_currentFrame].string(); - std::shared_ptr new_frame = std::make_shared(cv::imread(filename)); - this->set_current_frame(new_frame); - if (m_recording) { - if (vCoder) vCoder->add(new_frame); - } - return true; - } - return false; - } - - virtual bool setFrameNumber_impl(size_t frame_number) override { - const std::string &filename = m_picture_files[frame_number].string(); - std::shared_ptr new_frame = std::make_shared(cv::imread(filename)); - this->set_current_frame(new_frame); - m_currentFrame = static_cast(frame_number); - if (m_recording) { - if (vCoder) vCoder->add(new_frame); - } - return !new_frame->empty(); - } - std::vector m_picture_files; - std::shared_ptr vCoder; - double m_w; - double m_h; - bool m_recording; - int m_currentFrame; - double m_fps; - }; - - - /*********************************************************/ - - - class ImageStream3Video : public ImageStream { - public: - /** - * @throw file_not_found when the file does not exists - * @throw video_open_error when there is an error with the video - * @brief ImageStreamVideo - * @param filename path to the file - */ - explicit ImageStream3Video(Config *cfg, const std::vector &files) - : ImageStream(0, cfg) - { - openMedia(files); - } - virtual GuiParam::MediaType type() const override { - return GuiParam::MediaType::Video; - } - virtual size_t numFrames() const override { - return m_num_frames; - } - virtual bool toggleRecord() override { - if (!m_capture.isOpened()) { - return false; - } - m_recording = vCoder->toggle(m_w, m_h, m_fps); - - return m_recording; - } - virtual double fps() const override { - return m_fps; - } - virtual std::string currentFilename() const override { - return m_fileName; - } - - virtual bool hasNextInBatch() override{ - return !(m_batch.empty()); - } - - virtual void stepToNextInBatch() override{ - if (m_batch.empty()) { - throw video_open_error("batch is empty"); - } - openMedia(m_batch); - } - - virtual std::vector getBatchItems() override{ - std::vector batchItems; - for (auto x: m_batch){ - batchItems.push_back(x.string()); - } - return batchItems; - } - - private: - - void openMedia(std::vector files){ - - m_capture.open(files.front().string()); - m_num_frames = static_cast(m_capture.get(cv::CAP_PROP_FRAME_COUNT)); - m_fps = m_capture.get(cv::CAP_PROP_FPS); - m_fileName = files.front().string(); - - if (!boost::filesystem::exists(files.front())) { - throw file_not_found("Could not find file " + files.front().string()); - } - if (!m_capture.isOpened()) { - throw video_open_error(":("); - } + // load first image + if (this->numFrames() > 0) { + this->setFrameNumber_impl(0); + std::string filename = m_picture_files[0].string(); + std::shared_ptr new_frame = + std::make_shared(cv::imread(filename)); + m_w = new_frame->size().width; + m_h = new_frame->size().height; + m_recording = false; + vCoder = std::make_shared(m_fps, _cfg); + } + } + virtual GuiParam::MediaType type() const override + { + return GuiParam::MediaType::Images; + } + virtual size_t numFrames() const override + { + return m_picture_files.size(); + } + virtual bool toggleRecord() override + { + if (this->numFrames() <= 0) { + return false; + } + m_recording = vCoder->toggle(m_w, m_h, m_fps); + + return m_recording; + } + virtual double fps() const override + { + return m_fps; + } + virtual std::string currentFilename() const override + { + assert(currentFrameNumber() < m_picture_files.size()); + return m_picture_files[currentFrameNumber()].string(); + } + + private: + virtual bool nextFrame_impl() override + { + m_currentFrame += static_cast(m_frame_stride); + if (this->numFrames() > m_currentFrame) { + + const std::string& filename = + m_picture_files[m_currentFrame].string(); + std::shared_ptr new_frame = + std::make_shared(cv::imread(filename)); + this->set_current_frame(new_frame); + if (m_recording) { + if (vCoder) + vCoder->add(new_frame); + } + return true; + } + return false; + } + + virtual bool setFrameNumber_impl(size_t frame_number) override + { + const std::string& filename = + m_picture_files[frame_number].string(); + std::shared_ptr new_frame = std::make_shared( + cv::imread(filename)); + this->set_current_frame(new_frame); + m_currentFrame = static_cast(frame_number); + if (m_recording) { + if (vCoder) + vCoder->add(new_frame); + } + return !new_frame->empty(); + } + std::vector m_picture_files; + std::shared_ptr vCoder; + double m_w; + double m_h; + bool m_recording; + int m_currentFrame; + double m_fps; + }; + + /*********************************************************/ + + class ImageStream3Video : public ImageStream + { + public: + /** + * @throw file_not_found when the file does not exists + * @throw video_open_error when there is an error with the video + * @brief ImageStreamVideo + * @param filename path to the file + */ + explicit ImageStream3Video( + Config* cfg, + const std::vector& files) + : ImageStream(0, cfg) + { + openMedia(files); + } + virtual GuiParam::MediaType type() const override + { + return GuiParam::MediaType::Video; + } + virtual size_t numFrames() const override + { + return m_num_frames; + } + virtual bool toggleRecord() override + { + if (!m_capture.isOpened()) { + return false; + } + m_recording = vCoder->toggle(m_w, m_h, m_fps); + + return m_recording; + } + virtual double fps() const override + { + return m_fps; + } + virtual std::string currentFilename() const override + { + return m_fileName; + } + + virtual bool hasNextInBatch() override + { + return !(m_batch.empty()); + } + + virtual void stepToNextInBatch() override + { + if (m_batch.empty()) { + throw video_open_error("batch is empty"); + } + openMedia(m_batch); + } + + virtual std::vector getBatchItems() override + { + std::vector batchItems; + for (auto x : m_batch) { + batchItems.push_back(x.string()); + } + return batchItems; + } + + private: + void openMedia(std::vector files) + { + + m_capture.open(files.front().string()); + m_num_frames = static_cast( + m_capture.get(cv::CAP_PROP_FRAME_COUNT)); + m_fps = m_capture.get(cv::CAP_PROP_FPS); + m_fileName = files.front().string(); + + if (!boost::filesystem::exists(files.front())) { + throw file_not_found("Could not find file " + + files.front().string()); + } + if (!m_capture.isOpened()) { + throw video_open_error(":("); + } m_batch = files; - m_batch.erase(m_batch.begin(), m_batch.begin()+1); + m_batch.erase(m_batch.begin(), m_batch.begin() + 1); - //Grab the fps from config file + // Grab the fps from config file double fps = _cfg->RecordFPS; if (fps != -1) { m_fps = fps; } - m_w = m_capture.get(cv::CAP_PROP_FRAME_WIDTH); - m_h = m_capture.get(cv::CAP_PROP_FRAME_HEIGHT); - m_recording = false; - vCoder = std::make_shared(m_fps, _cfg); - - // load first image - if (this->numFrames() > 0) { - this->nextFrame_impl(); - } - - m_current_frame_number = 0; - } - - virtual bool nextFrame_impl() override { - cv::Mat new_frame; - for (int i = 0; i> new_frame; - std::shared_ptr mat(new cv::Mat(new_frame)); - this->set_current_frame(mat); - if (m_recording) { - if (vCoder) vCoder->add(mat); - } - return !new_frame.empty(); - } - - virtual bool setFrameNumber_impl(size_t frame_number) override { - // new frame is next frame --> use next frame function - if (this->currentFrameNumber() + 1 == frame_number) { - return this->nextFrame_impl(); - } - else { - // adjust frame position ("0-based index of the frame to be decoded/captured next.") - m_capture.set(cv::CAP_PROP_POS_FRAMES, static_cast(frame_number)); - return this->nextFrame_impl(); - } - } - - cv::VideoCapture m_capture; - size_t m_num_frames; - std::string m_fileName; - std::shared_ptr vCoder; + m_w = m_capture.get(cv::CAP_PROP_FRAME_WIDTH); + m_h = m_capture.get(cv::CAP_PROP_FRAME_HEIGHT); + m_recording = false; + vCoder = std::make_shared(m_fps, _cfg); + + // load first image + if (this->numFrames() > 0) { + this->nextFrame_impl(); + } + + m_current_frame_number = 0; + } + + virtual bool nextFrame_impl() override + { + cv::Mat new_frame; + for (int i = 0; i < m_frame_stride; i++) + m_capture >> new_frame; + std::shared_ptr mat(new cv::Mat(new_frame)); + this->set_current_frame(mat); + if (m_recording) { + if (vCoder) + vCoder->add(mat); + } + return !new_frame.empty(); + } + + virtual bool setFrameNumber_impl(size_t frame_number) override + { + // new frame is next frame --> use next frame function + if (this->currentFrameNumber() + 1 == frame_number) { + return this->nextFrame_impl(); + } else { + // adjust frame position ("0-based index of the frame to be + // decoded/captured next.") + m_capture.set(cv::CAP_PROP_POS_FRAMES, + static_cast(frame_number)); + return this->nextFrame_impl(); + } + } + + cv::VideoCapture m_capture; + size_t m_num_frames; + std::string m_fileName; + std::shared_ptr vCoder; std::vector m_batch; - double m_fps; - double m_w; - double m_h; - bool m_recording; - }; - - - /*********************************************************/ - class ImageStream3OpenCVCamera : public ImageStream { - public: - /** - * @throw file_not_found when device does not exists - * @throw device_open_error when there is an error with the device - * @brief ImageStreamCamera - * @param device_id according to the VideoCapture class of OpenCV - */ - explicit ImageStream3OpenCVCamera(Config *cfg, CameraConfiguration conf) - : ImageStream(0, cfg) - , m_capture(conf._selector.name) - , m_fps(m_capture.get(cv::CAP_PROP_FPS)) { - // Give the camera some extra time to get ready: - // Somehow opening it on first try sometimes does not succeed. - // Workaround: http://stackoverflow.com/questions/22019064/unable-to-read-frames-from-videocapture-from-secondary-webcam-with-opencv?rq=1 - // So, stubbornly try it a few times until it works. - std::this_thread::sleep_for(std::chrono::milliseconds(1000)); - - qDebug() << "\nStarting to record on camera no. " << conf._selector.index; - m_w = conf._width == -1 ? _cfg->CameraWidth : conf._width; - m_h = conf._height == -1 ? _cfg->CameraHeight : conf._height; - m_fps = conf._fps == -1 ? _cfg->RecordFPS : conf._fps; - m_recording = false; - vCoder = std::make_shared(m_fps, _cfg); - - int fails = 0; - while (!m_capture.isOpened() && fails < 5) { - m_capture.open(conf._selector.index); - std::this_thread::sleep_for(std::chrono::milliseconds(1000)); - fails++; - } - - if (!m_capture.isOpened()) { - qWarning() << "Unable to open camera!"; - throw device_open_error(":("); - } - - if (m_w != -1) m_capture.set(cv::CAP_PROP_FRAME_WIDTH, m_w); - if (m_h != -1) m_capture.set(cv::CAP_PROP_FRAME_HEIGHT, m_h); - if (m_fps != -1) m_capture.set(cv::CAP_PROP_FPS, m_fps); - - m_w = m_capture.get(cv::CAP_PROP_FRAME_WIDTH); - m_h = m_capture.get(cv::CAP_PROP_FRAME_HEIGHT); - m_fps = m_capture.get(cv::CAP_PROP_FPS); - qDebug() << "Cam open: " << m_capture.isOpened() << " w/h:" << m_w << "/" << m_h << " fps:" << m_fps; - // load first image - if (this->numFrames() > 0) { - this->nextFrame_impl(); - } - } - virtual GuiParam::MediaType type() const override { - return GuiParam::MediaType::Camera; - } - virtual size_t numFrames() const override { - return -1; //TODO - } - virtual bool toggleRecord() override { - if (!m_capture.isOpened()) { - return false; - } - m_recording = vCoder->toggle(m_w, m_h, m_fps); - - return m_recording; - } - virtual double fps() const override { - return m_fps; - } - virtual std::string currentFilename() const override { - return "Camera"; // TODO be more specific! - } - - private: - - virtual bool nextFrame_impl() override { - cv::Mat new_frame; - - for (int i = 0; i < m_frame_stride; i++) { - m_capture >> new_frame; - } - - std::shared_ptr mat(new cv::Mat(new_frame)); - this->set_current_frame(mat); - if (m_recording) { - if (vCoder) vCoder->add(mat); - } - return !mat->empty(); - } - - virtual bool setFrameNumber_impl(size_t) override { - // throw std::runtime_error("setFrameNumber not available for ImageStreamCamera"); - this->nextFrame_impl(); - return true; - } - - std::shared_ptr vCoder; - cv::VideoCapture m_capture; - double m_fps; - double m_w; - double m_h; - bool m_recording; - }; + double m_fps; + double m_w; + double m_h; + bool m_recording; + }; + + /*********************************************************/ + class ImageStream3OpenCVCamera : public ImageStream + { + public: + /** + * @throw file_not_found when device does not exists + * @throw device_open_error when there is an error with the device + * @brief ImageStreamCamera + * @param device_id according to the VideoCapture class of OpenCV + */ + explicit ImageStream3OpenCVCamera(Config* cfg, + CameraConfiguration conf) + : ImageStream(0, cfg) + , m_capture(conf._selector.name) + , m_fps(m_capture.get(cv::CAP_PROP_FPS)) + { + // Give the camera some extra time to get ready: + // Somehow opening it on first try sometimes does not succeed. + // Workaround: + // http://stackoverflow.com/questions/22019064/unable-to-read-frames-from-videocapture-from-secondary-webcam-with-opencv?rq=1 + // So, stubbornly try it a few times until it works. + std::this_thread::sleep_for(std::chrono::milliseconds(1000)); + + qDebug() << "\nStarting to record on camera no. " + << conf._selector.index; + m_w = conf._width == -1 ? _cfg->CameraWidth : conf._width; + m_h = conf._height == -1 ? _cfg->CameraHeight : conf._height; + m_fps = conf._fps == -1 ? _cfg->RecordFPS : conf._fps; + m_recording = false; + vCoder = std::make_shared(m_fps, _cfg); + + int fails = 0; + while (!m_capture.isOpened() && fails < 5) { + m_capture.open(conf._selector.index); + std::this_thread::sleep_for( + std::chrono::milliseconds(1000)); + fails++; + } + + if (!m_capture.isOpened()) { + qWarning() << "Unable to open camera!"; + throw device_open_error(":("); + } + + if (m_w != -1) + m_capture.set(cv::CAP_PROP_FRAME_WIDTH, m_w); + if (m_h != -1) + m_capture.set(cv::CAP_PROP_FRAME_HEIGHT, m_h); + if (m_fps != -1) + m_capture.set(cv::CAP_PROP_FPS, m_fps); + + m_w = m_capture.get(cv::CAP_PROP_FRAME_WIDTH); + m_h = m_capture.get(cv::CAP_PROP_FRAME_HEIGHT); + m_fps = m_capture.get(cv::CAP_PROP_FPS); + qDebug() << "Cam open: " << m_capture.isOpened() + << " w/h:" << m_w << "/" << m_h << " fps:" << m_fps; + // load first image + if (this->numFrames() > 0) { + this->nextFrame_impl(); + } + } + virtual GuiParam::MediaType type() const override + { + return GuiParam::MediaType::Camera; + } + virtual size_t numFrames() const override + { + return -1; // TODO + } + virtual bool toggleRecord() override + { + if (!m_capture.isOpened()) { + return false; + } + m_recording = vCoder->toggle(m_w, m_h, m_fps); + + return m_recording; + } + virtual double fps() const override + { + return m_fps; + } + virtual std::string currentFilename() const override + { + return "Camera"; // TODO be more specific! + } + + private: + virtual bool nextFrame_impl() override + { + cv::Mat new_frame; + + for (int i = 0; i < m_frame_stride; i++) { + m_capture >> new_frame; + } + + std::shared_ptr mat(new cv::Mat(new_frame)); + this->set_current_frame(mat); + if (m_recording) { + if (vCoder) + vCoder->add(mat); + } + return !mat->empty(); + } + + virtual bool setFrameNumber_impl(size_t) override + { + // throw std::runtime_error("setFrameNumber not + // available for ImageStreamCamera"); + this->nextFrame_impl(); + return true; + } + + std::shared_ptr vCoder; + cv::VideoCapture m_capture; + double m_fps; + double m_w; + double m_h; + bool m_recording; + }; #if HAS_PYLON - /*********************************************************/ - class ImageStream3PylonCamera : public ImageStream { - private: - Pylon::CGrabResultPtr m_grabbed; - public: - explicit ImageStream3PylonCamera(Config* cfg, CameraConfiguration conf) - : ImageStream(0, cfg) - , m_camera(getPylonDevice(conf._selector.index), Pylon::Cleanup_Delete) - { - m_fps = conf._fps == -1 ? _cfg->RecordFPS : conf._fps; - - m_camera.Open(); - - if (!m_camera.IsOpen()) { - qWarning() << "Unable to open camera!"; - throw device_open_error("Error loading camera"); - } - - m_imageSize = { - [&]() -> int { - if (conf._width != -1) return conf._width; - if (_cfg->CameraWidth != -1) return _cfg->CameraWidth; - return GenApi::CIntegerPtr(m_camera.GetNodeMap().GetNode("SensorWidth"))->GetValue(); - }(), - [&]() -> int { - if (conf._height != -1) return conf._height; - if (_cfg->CameraHeight != -1) return _cfg->CameraHeight; - return GenApi::CIntegerPtr(m_camera.GetNodeMap().GetNode("SensorHeight"))->GetValue(); - }() - }; - - GenApi::CBooleanPtr(m_camera.GetNodeMap().GetNode("AcquisitionFrameRateEnable"))->SetValue(1); - - if (m_fps == -1) { - m_fps = getFrameRate(); - } else { - setFrameRate(m_fps); - auto const actual_fps = getFrameRate(); - qInfo() << "Actual framerate:" << actual_fps; - if (std::abs(actual_fps - m_fps) > 0.1) { - throw device_open_error("Error setting framerate"); - } - m_fps = actual_fps; - } - - qDebug() << "\nStarting to record on camera " << m_camera.GetDeviceInfo().GetFriendlyName(); - m_camera.StartGrabbing(Pylon::GrabStrategy_LatestImages, Pylon::GrabLoop_ProvidedByUser); - nextFrame_impl(); - - m_recording = false; - m_encoder = std::make_unique(m_fps, _cfg); - } - - GuiParam::MediaType type() const override - { - return GuiParam::MediaType::Camera; - } - - std::size_t numFrames() const override - { - return std::numeric_limits::max(); - } - - bool toggleRecord() override - { - if (!m_camera.IsOpen()) { - return false; - } - m_recording = m_encoder->toggle(m_imageSize.width, m_imageSize.height, m_fps); - - return m_recording; - } - - double fps() const override - { - return m_fps; - } - - std::string currentFilename() const override - { - return std::string(m_camera.GetDeviceInfo().GetFriendlyName()); - } - - private: - - bool nextFrame_impl() override - { - for (std::size_t i = 1; i < m_frame_stride; ++i) { - if (!m_camera.RetrieveResult(2000, m_grabbed, Pylon::TimeoutHandling_Return)) { - return false; - } - } - - if (!m_camera.RetrieveResult(2000, m_grabbed, Pylon::TimeoutHandling_Return)) { - return false; - } - - auto view = toOpenCV(m_grabbed); - auto scaled = std::make_shared(); - cv::resize(view, *scaled, m_imageSize); - set_current_frame(scaled); - if (m_recording && m_encoder) - m_encoder->add(scaled); - - return !scaled->empty(); - } - - bool setFrameNumber_impl(size_t) override - { - return false; - } - - double getFrameRate() - { - if (m_camera.IsUsb()) { - return GenApi::CFloatPtr(m_camera.GetNodeMap().GetNode("AcquisitionFrameRate"))->GetValue(); - } - - throw std::logic_error("Unsupported device class"); - } - - void setFrameRate(double value) - { - if (m_camera.IsUsb()) { - GenApi::CFloatPtr(m_camera.GetNodeMap().GetNode("AcquisitionFrameRate")) ->SetValue(value); - } else { - throw std::logic_error("Unsupported camera type"); - } - } - - Pylon::PylonAutoInitTerm m_pylon; - Pylon::CInstantCamera m_camera; - double m_fps; - cv::Size m_imageSize; - bool m_recording; - - std::unique_ptr m_encoder; - }; -#endif + /*********************************************************/ + class ImageStream3PylonCamera : public ImageStream + { + private: + Pylon::CGrabResultPtr m_grabbed; + + public: + explicit ImageStream3PylonCamera(Config* cfg, + CameraConfiguration conf) + : ImageStream(0, cfg) + , m_camera(getPylonDevice(conf._selector.index), + Pylon::Cleanup_Delete) + { + m_fps = conf._fps == -1 ? _cfg->RecordFPS : conf._fps; + + m_camera.Open(); + + if (!m_camera.IsOpen()) { + qWarning() << "Unable to open camera!"; + throw device_open_error("Error loading camera"); + } - /*********************************************************/ + m_imageSize = {[&]() -> int { + if (conf._width != -1) + return conf._width; + if (_cfg->CameraWidth != -1) + return _cfg->CameraWidth; + return GenApi::CIntegerPtr( + m_camera.GetNodeMap().GetNode( + "SensorWidth")) + ->GetValue(); + }(), + [&]() -> int { + if (conf._height != -1) + return conf._height; + if (_cfg->CameraHeight != -1) + return _cfg->CameraHeight; + return GenApi::CIntegerPtr( + m_camera.GetNodeMap().GetNode( + "SensorHeight")) + ->GetValue(); + }()}; + + GenApi::CBooleanPtr(m_camera.GetNodeMap().GetNode( + "AcquisitionFrameRateEnable")) + ->SetValue(1); + + if (m_fps == -1) { + m_fps = getFrameRate(); + } else { + setFrameRate(m_fps); + auto const actual_fps = getFrameRate(); + qInfo() << "Actual framerate:" << actual_fps; + if (std::abs(actual_fps - m_fps) > 0.1) { + throw device_open_error("Error setting framerate"); + } + m_fps = actual_fps; + } + qDebug() << "\nStarting to record on camera " + << m_camera.GetDeviceInfo().GetFriendlyName(); + m_camera.StartGrabbing(Pylon::GrabStrategy_LatestImages, + Pylon::GrabLoop_ProvidedByUser); + nextFrame_impl(); + + m_recording = false; + m_encoder = std::make_unique(m_fps, _cfg); + } + + GuiParam::MediaType type() const override + { + return GuiParam::MediaType::Camera; + } + + std::size_t numFrames() const override + { + return std::numeric_limits::max(); + } + + bool toggleRecord() override + { + if (!m_camera.IsOpen()) { + return false; + } + m_recording = m_encoder->toggle(m_imageSize.width, + m_imageSize.height, + m_fps); + + return m_recording; + } + + double fps() const override + { + return m_fps; + } + + std::string currentFilename() const override + { + return std::string(m_camera.GetDeviceInfo().GetFriendlyName()); + } + + private: + bool nextFrame_impl() override + { + for (std::size_t i = 1; i < m_frame_stride; ++i) { + if (!m_camera.RetrieveResult( + 2000, + m_grabbed, + Pylon::TimeoutHandling_Return)) { + return false; + } + } - std::shared_ptr make_ImageStream3NoMedia() { - return std::make_shared(); - } + if (!m_camera.RetrieveResult(2000, + m_grabbed, + Pylon::TimeoutHandling_Return)) { + return false; + } - std::shared_ptr make_ImageStream3Pictures(Config *cfg, - std::vector filenames) { - return std::make_shared(cfg, std::move(filenames)); - } + auto view = toOpenCV(m_grabbed); + auto scaled = std::make_shared(); + cv::resize(view, *scaled, m_imageSize); + set_current_frame(scaled); + if (m_recording && m_encoder) + m_encoder->add(scaled); + + return !scaled->empty(); + } + + bool setFrameNumber_impl(size_t) override + { + return false; + } + + double getFrameRate() + { + if (m_camera.IsUsb()) { + return GenApi::CFloatPtr(m_camera.GetNodeMap().GetNode( + "AcquisitionFrameRate")) + ->GetValue(); + } + + throw std::logic_error("Unsupported device class"); + } + + void setFrameRate(double value) + { + if (m_camera.IsUsb()) { + GenApi::CFloatPtr( + m_camera.GetNodeMap().GetNode("AcquisitionFrameRate")) + ->SetValue(value); + } else { + throw std::logic_error("Unsupported camera type"); + } + } - std::shared_ptr make_ImageStream3Video(Config *cfg, const std::vector &files) { - try { - return std::make_shared(cfg, files); - } - catch (const video_open_error &) { - return make_ImageStream3NoMedia(); - } - } + Pylon::PylonAutoInitTerm m_pylon; + Pylon::CInstantCamera m_camera; + double m_fps; + cv::Size m_imageSize; + bool m_recording; - std::shared_ptr make_ImageStream3Camera(Config *cfg, CameraConfiguration conf) { - try { - switch (conf._selector.type) { - case CameraType::OpenCV: - return std::make_shared(cfg, conf); + std::unique_ptr m_encoder; + }; +#endif + + /*********************************************************/ + + std::shared_ptr make_ImageStream3NoMedia() + { + return std::make_shared(); + } + + std::shared_ptr make_ImageStream3Pictures( + Config* cfg, + std::vector filenames) + { + return std::make_shared( + cfg, + std::move(filenames)); + } + + std::shared_ptr make_ImageStream3Video( + Config* cfg, + const std::vector& files) + { + try { + return std::make_shared(cfg, files); + } catch (const video_open_error&) { + return make_ImageStream3NoMedia(); + } + } + + std::shared_ptr make_ImageStream3Camera( + Config* cfg, + CameraConfiguration conf) + { + try { + switch (conf._selector.type) { + case CameraType::OpenCV: + return std::make_shared(cfg, + conf); #if HAS_PYLON - case CameraType::Pylon: - return std::make_shared(cfg, conf); + case CameraType::Pylon: + return std::make_shared(cfg, + conf); #endif - default: - throw std::logic_error("Missing image stream implementation"); - } - } - catch (const device_open_error &) { - return make_ImageStream3NoMedia(); - } - } - - } + default: + throw std::logic_error( + "Missing image stream implementation"); + } + } catch (const device_open_error&) { + return make_ImageStream3NoMedia(); + } + } + + } } diff --git a/Src/Model/ImageStream.h b/Src/Model/ImageStream.h index 6c17284b..70f0048d 100644 --- a/Src/Model/ImageStream.h +++ b/Src/Model/ImageStream.h @@ -1,17 +1,17 @@ /**************************************************************************** - ** - ** This file is part of the BioTracker Framework - ** Origin of this class is BioTracker in version 2. - ** - ****************************************************************************/ + ** + ** This file is part of the BioTracker Framework + ** Origin of this class is BioTracker in version 2. + ** + ****************************************************************************/ #ifndef BIOTRACKER3IMAGESTREAM_H #define BIOTRACKER3IMAGESTREAM_H -#include // std::unique_ptr -#include // cv::Mat -#include // std::vector -#include // std::string +#include // std::unique_ptr +#include // cv::Mat +#include // std::vector +#include // std::string #include #include #include "QSharedPointer" @@ -21,165 +21,187 @@ #include "util/camera/base.h" #include "util/Config.h" -namespace BioTracker { -namespace Core { +namespace BioTracker +{ + namespace Core + { -/** - * The ImageStream class was part of BioTracker version 2. It is responsible for generation ImageStreams from files or camera devices. - */ -class ImageStream : public QObject { - Q_OBJECT - public: - explicit ImageStream(QObject* parent = 0, Config *cfg = nullptr); - - /** - * @return the stream's MediaType i.e. "Video", "Images", "NoMedia" + /** + * The ImageStream class was part of BioTracker version 2. It is + * responsible for generation ImageStreams from files or camera + * devices. */ - virtual GuiParam::MediaType type() const = 0; - - /** - * @return the total number of frames - */ - virtual size_t numFrames() const = 0; - - virtual bool toggleRecord() = 0; - - /** - * @return the current frame number - */ - size_t currentFrameNumber() const; - - /** - * @return true, if the current frame is the last frame - */ - bool lastFrame() const; - - /** - * @return true, if the stream's end is reached; i.e. current frame points behind it's last frame - */ - bool end() const; - - /** - * @return true, if currentFrame().empty(); - */ - bool currentFrameIsEmpty() const; - - /** - * @return the media's fps rate - */ - virtual double fps() const = 0; - - /** - * @return the filename of the current file defined through the frameNumber - */ - virtual std::string currentFilename() const = 0; - - /** - * returns the current frame. - * - if the current frame position is invalid or an error occurred, an empty image is returned. - */ - std::shared_ptr currentFrame() const; - - /** - * sets the current frame number and updates the current frame. - * - if frame_number is invalid, the current frame is invalidated. - * @return true if the operation was successful, i.e. the frame number is valid and no error occurred. - */ - bool setFrameNumber(size_t frame_number); - - /** - * advances the current frame frame. - * - if this function is called on the media's last frame, the current frame is invalidated. - * @return true if the operation was successful, i.e. the current frame isn't the last frame and no error occurred. - */ - bool nextFrame(); - - /** - * sets the current frame position to the previous frame. - * - if this function is called on the media's first frame, the current frame is invalidated. - * @return true if the operation was successful, i.e. the current frame isn't the first one and no error occurred. - */ - bool previousFrame(); - - /** - * Gets the title of the current image stream. - * A title should represent the identity of a source stream as a string. - * E.g. a video "MyTracking.mkv" should yield a name like "MyTracking". - * Streams from Camera No. 1 should yiel "Camera_1" or the like. - * Naming conventions are up to the stream implementations. - */ - std::string getTitle(); - - virtual bool hasNextInBatch(); - - virtual void stepToNextInBatch(); - - virtual std::vector getBatchItems(); - - virtual ~ImageStream(); - - protected: - /** - * sets the image returned by this->currentFrame(); - */ - void set_current_frame(std::shared_ptr img); - - /** - * Sets the title of the current image stream. - * A title should represent the identity of a source stream as a string. - * E.g. a video "MyTracking.mkv" should yield a name like "MyTracking". - * Streams from Camera No. 1 should yiel "Camera_1" or the like. - * Naming conventions are up to the stream implementations. - * The title is set by the stream itself and may not be modified from the outside. - */ - void setTitle(std::string title); - - /** - * The stride of the image stream. Think of it as "use only every n'th frame". - */ - size_t m_frame_stride; - - std::shared_ptr m_current_frame; - size_t m_current_frame_number; - std::string m_title; - Config *_cfg; - - private: - /** - * empties m_current_frame & sets m_current_frame_number to this->numFrames(); - */ - void clearImage(); - /** - * - called by ImageStreamImpl::setFrameNumber - * if frame_number < numFrames() && frame_number != this->currentFrameNumber(); - * - m_current_frame_number is updated afterwards - */ - virtual bool setFrameNumber_impl(size_t frame_number) = 0; - /** - * - called by ImageStreamImpl::nextFrame() - * if currentFrameNumber() + 1 < numFrames(); - * - m_current_frame_number is updated afterwards - */ - virtual bool nextFrame_impl(); - /** - * - called by ImageStreamImpl::previousFrame() - * if currentFrameNumber() > 0; - * - m_current_frame_number is updated afterwards - */ - virtual bool previousFrame_impl(); -}; - -std::shared_ptr make_ImageStream3NoMedia(); - -std::shared_ptr make_ImageStream3Pictures(Config *cfg, - std::vector filenames); - -std::shared_ptr make_ImageStream3Video(Config *cfg, const std::vector - &filename); - -std::shared_ptr make_ImageStream3Camera(Config *cfg, CameraConfiguration conf); - -} + class ImageStream : public QObject + { + Q_OBJECT + public: + explicit ImageStream(QObject* parent = 0, Config* cfg = nullptr); + + /** + * @return the stream's MediaType i.e. "Video", "Images", "NoMedia" + */ + virtual GuiParam::MediaType type() const = 0; + + /** + * @return the total number of frames + */ + virtual size_t numFrames() const = 0; + + virtual bool toggleRecord() = 0; + + /** + * @return the current frame number + */ + size_t currentFrameNumber() const; + + /** + * @return true, if the current frame is the last frame + */ + bool lastFrame() const; + + /** + * @return true, if the stream's end is reached; i.e. current frame + * points behind it's last frame + */ + bool end() const; + + /** + * @return true, if currentFrame().empty(); + */ + bool currentFrameIsEmpty() const; + + /** + * @return the media's fps rate + */ + virtual double fps() const = 0; + + /** + * @return the filename of the current file defined through the + * frameNumber + */ + virtual std::string currentFilename() const = 0; + + /** + * returns the current frame. + * - if the current frame position is invalid or an error occurred, + * an empty image is returned. + */ + std::shared_ptr currentFrame() const; + + /** + * sets the current frame number and updates the current frame. + * - if frame_number is invalid, the current frame is invalidated. + * @return true if the operation was successful, i.e. the frame + * number is valid and no error occurred. + */ + bool setFrameNumber(size_t frame_number); + + /** + * advances the current frame frame. + * - if this function is called on the media's last frame, the + * current frame is invalidated. + * @return true if the operation was successful, i.e. the current + * frame isn't the last frame and no error occurred. + */ + bool nextFrame(); + + /** + * sets the current frame position to the previous frame. + * - if this function is called on the media's first frame, the + * current frame is invalidated. + * @return true if the operation was successful, i.e. the current + * frame isn't the first one and no error occurred. + */ + bool previousFrame(); + + /** + * Gets the title of the current image stream. + * A title should represent the identity of a source stream as a + *string. E.g. a video "MyTracking.mkv" should yield a name like + *"MyTracking". Streams from Camera No. 1 should yiel "Camera_1" or + *the like. Naming conventions are up to the stream + *implementations. + */ + std::string getTitle(); + + virtual bool hasNextInBatch(); + + virtual void stepToNextInBatch(); + + virtual std::vector getBatchItems(); + + virtual ~ImageStream(); + + protected: + /** + * sets the image returned by this->currentFrame(); + */ + void set_current_frame(std::shared_ptr img); + + /** + * Sets the title of the current image stream. + * A title should represent the identity of a source stream as a + *string. E.g. a video "MyTracking.mkv" should yield a name like + *"MyTracking". Streams from Camera No. 1 should yiel "Camera_1" or + *the like. Naming conventions are up to the stream + *implementations. The title is set by the stream itself and may + *not be modified from the outside. + */ + void setTitle(std::string title); + + /** + * The stride of the image stream. Think of it as "use only every + * n'th frame". + */ + size_t m_frame_stride; + + std::shared_ptr m_current_frame; + size_t m_current_frame_number; + std::string m_title; + Config* _cfg; + + private: + /** + * empties m_current_frame & sets m_current_frame_number to + * this->numFrames(); + */ + void clearImage(); + /** + * - called by ImageStreamImpl::setFrameNumber + * if frame_number < numFrames() && frame_number != + * this->currentFrameNumber(); + * - m_current_frame_number is updated afterwards + */ + virtual bool setFrameNumber_impl(size_t frame_number) = 0; + /** + * - called by ImageStreamImpl::nextFrame() + * if currentFrameNumber() + 1 < numFrames(); + * - m_current_frame_number is updated afterwards + */ + virtual bool nextFrame_impl(); + /** + * - called by ImageStreamImpl::previousFrame() + * if currentFrameNumber() > 0; + * - m_current_frame_number is updated afterwards + */ + virtual bool previousFrame_impl(); + }; + + std::shared_ptr make_ImageStream3NoMedia(); + + std::shared_ptr make_ImageStream3Pictures( + Config* cfg, + std::vector filenames); + + std::shared_ptr make_ImageStream3Video( + Config* cfg, + const std::vector& filename); + + std::shared_ptr make_ImageStream3Camera( + Config* cfg, + CameraConfiguration conf); + + } } #endif // BIOTRACKER3IMAGESTREAM_H diff --git a/Src/Model/MediaPlayer.cpp b/Src/Model/MediaPlayer.cpp index 73be6a70..b05e8751 100644 --- a/Src/Model/MediaPlayer.cpp +++ b/Src/Model/MediaPlayer.cpp @@ -1,67 +1,124 @@ #include "MediaPlayer.h" #include "Utility/misc.h" - -//Settings related +// Settings related #include "util/types.h" #include "Controller/IControllerCfg.h" -using namespace BioTrackerUtilsMisc; //getTimeAndDate - -MediaPlayer::MediaPlayer(QObject* parent) : - IModel(parent) { - _cfg = static_cast(parent)->getConfig(); - m_currentFPS = 0; - m_fpsOfSourceFile = 0; - _imagew = 0; - _imageh = 0; - m_useCuda = false; - m_RecI = false; - m_RecO = false; - m_videoc = std::make_shared(_cfg->RecordFPS, _cfg); - m_NameOfCvMat = "Original"; +using namespace BioTrackerUtilsMisc; // getTimeAndDate + +MediaPlayer::MediaPlayer(QObject* parent) +: IModel(parent) +{ + _cfg = static_cast(parent)->getConfig(); + m_currentFPS = 0; + m_fpsOfSourceFile = 0; + _imagew = 0; + _imageh = 0; + m_useCuda = false; + m_RecI = false; + m_RecO = false; + m_videoc = std::make_shared(_cfg->RecordFPS, _cfg); + m_NameOfCvMat = "Original"; m_TrackingIsActive = false; - m_recd = false; - m_recordScaled = false; + m_recd = false; + m_recordScaled = false; // Initialize PlayerStateMachine and a Thread for the Player - // // Do not set a Parent for MediaPlayerStateMachine in order to run the Player in the QThread! + // // Do not set a Parent for MediaPlayerStateMachine in order to run + // the Player in the QThread! m_PlayerThread = new QThread(this); m_PlayerThread->setObjectName("PlayerThread"); m_Player = new MediaPlayerStateMachine(); - m_Player->setConfig(_cfg); + m_Player->setConfig(_cfg); // Connect MediaPlayer with PlayerStateMachine // Load ImageStreams in StateMachine - QObject::connect(this, &MediaPlayer::loadVideoStream, m_Player, &MediaPlayerStateMachine::receiveLoadVideoCommand); - QObject::connect(this, &MediaPlayer::loadCameraDevice, m_Player, &MediaPlayerStateMachine::receiveLoadCameraDevice); - QObject::connect(this, &MediaPlayer::loadPictures, m_Player, &MediaPlayerStateMachine::receiveLoadPictures); + QObject::connect(this, + &MediaPlayer::loadVideoStream, + m_Player, + &MediaPlayerStateMachine::receiveLoadVideoCommand); + QObject::connect(this, + &MediaPlayer::loadCameraDevice, + m_Player, + &MediaPlayerStateMachine::receiveLoadCameraDevice); + QObject::connect(this, + &MediaPlayer::loadPictures, + m_Player, + &MediaPlayerStateMachine::receiveLoadPictures); // Controll the Player - QObject::connect(this, &MediaPlayer::nextFrameCommand, m_Player, &MediaPlayerStateMachine::receiveNextFramCommand); - QObject::connect(this, &MediaPlayer::pauseCommand, m_Player, &MediaPlayerStateMachine::receivePauseCommand); - QObject::connect(this, &MediaPlayer::playCommand, m_Player, &MediaPlayerStateMachine::receivePlayCommand); - QObject::connect(this, &MediaPlayer::prevFrameCommand, m_Player, &MediaPlayerStateMachine::receivePrevFrameCommand); - QObject::connect(this, &MediaPlayer::stopCommand, m_Player, &MediaPlayerStateMachine::receiveStopCommand); - QObject::connect(this, &MediaPlayer::goToFrame, m_Player, &MediaPlayerStateMachine::receiveGoToFrame); - - QObject::connect(this, &MediaPlayer::pauseCommand, this, &MediaPlayer::receiveTrackingPaused); - QObject::connect(this, &MediaPlayer::stopCommand, this, &MediaPlayer::receiveTrackingPaused); - - QObject::connect(this, &MediaPlayer::toggleRecordImageStreamCommand, m_Player, &MediaPlayerStateMachine::receivetoggleRecordImageStream); + QObject::connect(this, + &MediaPlayer::nextFrameCommand, + m_Player, + &MediaPlayerStateMachine::receiveNextFramCommand); + QObject::connect(this, + &MediaPlayer::pauseCommand, + m_Player, + &MediaPlayerStateMachine::receivePauseCommand); + QObject::connect(this, + &MediaPlayer::playCommand, + m_Player, + &MediaPlayerStateMachine::receivePlayCommand); + QObject::connect(this, + &MediaPlayer::prevFrameCommand, + m_Player, + &MediaPlayerStateMachine::receivePrevFrameCommand); + QObject::connect(this, + &MediaPlayer::stopCommand, + m_Player, + &MediaPlayerStateMachine::receiveStopCommand); + QObject::connect(this, + &MediaPlayer::goToFrame, + m_Player, + &MediaPlayerStateMachine::receiveGoToFrame); + + QObject::connect(this, + &MediaPlayer::pauseCommand, + this, + &MediaPlayer::receiveTrackingPaused); + QObject::connect(this, + &MediaPlayer::stopCommand, + this, + &MediaPlayer::receiveTrackingPaused); + + QObject::connect(this, + &MediaPlayer::toggleRecordImageStreamCommand, + m_Player, + &MediaPlayerStateMachine::receivetoggleRecordImageStream); // Handle PlayerStateMachine results - QObject::connect(m_Player, &MediaPlayerStateMachine::emitPlayerParameters, this, &MediaPlayer::receivePlayerParameters); - QObject::connect(m_Player, &MediaPlayerStateMachine::emitPlayerParameters, this, &MediaPlayer::fwdPlayerParameters); + QObject::connect(m_Player, + &MediaPlayerStateMachine::emitPlayerParameters, + this, + &MediaPlayer::receivePlayerParameters); + QObject::connect(m_Player, + &MediaPlayerStateMachine::emitPlayerParameters, + this, + &MediaPlayer::fwdPlayerParameters); // Handle next state operation - QObject::connect(m_Player, &MediaPlayerStateMachine::emitPlayerOperationDone, this, &MediaPlayer::receivePlayerOperationDone); - QObject::connect(this, &MediaPlayer::runPlayerOperation, m_Player, &MediaPlayerStateMachine::receiveRunPlayerOperation); - - QObject::connect(m_Player, &MediaPlayerStateMachine::emitNextMediaInBatch, this, &MediaPlayer::emitNextMediaInBatch, Qt::DirectConnection); - QObject::connect(m_Player, &MediaPlayerStateMachine::emitNextMediaInBatchLoaded, this, &MediaPlayer::emitNextMediaInBatchLoaded, Qt::DirectConnection); + QObject::connect(m_Player, + &MediaPlayerStateMachine::emitPlayerOperationDone, + this, + &MediaPlayer::receivePlayerOperationDone); + QObject::connect(this, + &MediaPlayer::runPlayerOperation, + m_Player, + &MediaPlayerStateMachine::receiveRunPlayerOperation); + + QObject::connect(m_Player, + &MediaPlayerStateMachine::emitNextMediaInBatch, + this, + &MediaPlayer::emitNextMediaInBatch, + Qt::DirectConnection); + QObject::connect(m_Player, + &MediaPlayerStateMachine::emitNextMediaInBatchLoaded, + this, + &MediaPlayer::emitNextMediaInBatchLoaded, + Qt::DirectConnection); // Move the PlayerStateMachine to the Thread m_Player->moveToThread(m_PlayerThread); @@ -70,138 +127,166 @@ MediaPlayer::MediaPlayer(QObject* parent) : m_PlayerThread->start(); } -MediaPlayer::~MediaPlayer() { +MediaPlayer::~MediaPlayer() +{ stopCommand(); m_PlayerThread->quit(); - if (!m_PlayerThread->wait(2000)) - { + if (!m_PlayerThread->wait(2000)) { m_PlayerThread->terminate(); - m_PlayerThread->wait(); + m_PlayerThread->wait(); } } -void MediaPlayer::setTrackingActive() { +void MediaPlayer::setTrackingActive() +{ m_TrackingIsActive = true; } -void MediaPlayer::setTrackingDeactive() { +void MediaPlayer::setTrackingDeactive() +{ m_TrackingIsActive = false; } -bool MediaPlayer::getPlayState() { +bool MediaPlayer::getPlayState() +{ return m_Play; } -bool MediaPlayer::getForwardState() { +bool MediaPlayer::getForwardState() +{ return m_Forw; } -bool MediaPlayer::getBackwardState() { +bool MediaPlayer::getBackwardState() +{ return m_Back; } -bool MediaPlayer::getStopState() { +bool MediaPlayer::getStopState() +{ return m_Stop; } -bool MediaPlayer::getPauseState() { - return m_Paus; +bool MediaPlayer::getPauseState() +{ + return m_Paus; } -bool MediaPlayer::getRecIState() { - return m_RecI; +bool MediaPlayer::getRecIState() +{ + return m_RecI; } -bool MediaPlayer::getRecOState() { - return m_RecO; +bool MediaPlayer::getRecOState() +{ + return m_RecO; } -bool MediaPlayer::getTrackingState() { +bool MediaPlayer::getTrackingState() +{ return m_TrackingIsActive; } -size_t MediaPlayer::getTotalNumberOfFrames() { +size_t MediaPlayer::getTotalNumberOfFrames() +{ return m_TotalNumbFrames; } -size_t MediaPlayer::getCurrentFrameNumber() { +size_t MediaPlayer::getCurrentFrameNumber() +{ return m_CurrentFrameNumber; } -double MediaPlayer::getFpsOfSourceFile() { +double MediaPlayer::getFpsOfSourceFile() +{ return m_fpsOfSourceFile; } -double MediaPlayer::getCurrentFPS() { +double MediaPlayer::getCurrentFPS() +{ return m_currentFPS; } -double MediaPlayer::getTargetFPS() { +double MediaPlayer::getTargetFPS() +{ return m_targetFPS; } -void MediaPlayer::setTargetFPS(double fps) { - m_targetFPS = fps; +void MediaPlayer::setTargetFPS(double fps) +{ + m_targetFPS = fps; m_Player->receiveTargetFps(fps); } -QString MediaPlayer::getCurrentFileName() { +QString MediaPlayer::getCurrentFileName() +{ return m_CurrentFilename; } -std::shared_ptr MediaPlayer::getCurrentFrame() { +std::shared_ptr MediaPlayer::getCurrentFrame() +{ return m_CurrentFrame; } -int MediaPlayer::reopenVideoWriter() { - QRectF r = m_gv->sceneRect(); +int MediaPlayer::reopenVideoWriter() +{ + QRectF r = m_gv->sceneRect(); - if (_imagew != r.width() || _imageh != r.height() || !m_recd) { + if (_imagew != r.width() || _imageh != r.height() || !m_recd) { - if (m_useCuda) { + if (m_useCuda) { #ifdef WITH_CUDA - _imagew = r.width(); - _imageh = r.height(); - m_videoc = std::make_shared(_cfg->RecordFPS, _cfg); - EncodeConfig *cfg = m_videoc->m_nvEncoder->getEncodeConfig(); - cfg->width = _imagew; - cfg->height = _imageh; - cfg->fps = 30; - cfg->codec = NV_ENC_H264; - cfg->inputFormat = NV_ENC_BUFFER_FORMAT_NV12;//NV_ENC_BUFFER_FORMAT_YUV444 //NV_ENC_BUFFER_FORMAT_NV12 - const std::string f = getTimeAndDate("ViewCapture", ".avi"); - char* chr = strdup(f.c_str()); - m_videoc->start(); - free(chr); - m_recd = true; -#else - std::cout << "Error on recording: Asked to use cudacodec although build is not cuda-enabled. Not recording." << std::endl; + _imagew = r.width(); + _imageh = r.height(); + m_videoc = std::make_shared(_cfg->RecordFPS, _cfg); + EncodeConfig* cfg = m_videoc->m_nvEncoder->getEncodeConfig(); + cfg->width = _imagew; + cfg->height = _imageh; + cfg->fps = 30; + cfg->codec = NV_ENC_H264; + cfg->inputFormat = + NV_ENC_BUFFER_FORMAT_NV12; // NV_ENC_BUFFER_FORMAT_YUV444 + // //NV_ENC_BUFFER_FORMAT_NV12 + const std::string f = getTimeAndDate("ViewCapture", ".avi"); + char* chr = strdup(f.c_str()); + m_videoc->start(); + free(chr); + m_recd = true; +#else + std::cout << "Error on recording: Asked to use cudacodec although " + "build is not cuda-enabled. Not recording." + << std::endl; #endif - } - else { - if (m_videoWriter && m_videoWriter->isOpened()) - m_videoWriter->release(); - _imagew = r.width(); - _imageh = r.height(); - - int codec = cv::VideoWriter::fourcc('X', '2', '6', '4'); - m_videoWriter = std::make_shared(getTimeAndDate("./ViewCapture", ".avi"), codec, 30, cv::Size(r.width(), r.height()), 1); - m_recd = m_videoWriter->isOpened(); - } - } - return m_recd; + } else { + if (m_videoWriter && m_videoWriter->isOpened()) + m_videoWriter->release(); + _imagew = r.width(); + _imageh = r.height(); + + int codec = cv::VideoWriter::fourcc('X', '2', '6', '4'); + m_videoWriter = std::make_shared( + getTimeAndDate("./ViewCapture", ".avi"), + codec, + 30, + cv::Size(r.width(), r.height()), + 1); + m_recd = m_videoWriter->isOpened(); + } + } + return m_recd; } -QString MediaPlayer::takeScreenshot(GraphicsView *gv) { +QString MediaPlayer::takeScreenshot(GraphicsView* gv) +{ QRectF rscene = gv->sceneRect(); - QRectF rview = gv->rect(); - QSize size; + QRectF rview = gv->rect(); + QSize size; if (!m_recordScaled) size = rscene.size().toSize(); else size = rview.size().toSize(); - auto image = QImage(size, QImage::Format_RGB32); + auto image = QImage(size, QImage::Format_RGB32); auto painter = QPainter(&image); if (!m_recordScaled) @@ -209,51 +294,57 @@ QString MediaPlayer::takeScreenshot(GraphicsView *gv) { else gv->render(&painter); - auto filePath = QString::fromStdString(getTimeAndDate(_cfg->DirScreenshots.toStdString(), ".png")); + auto filePath = QString::fromStdString( + getTimeAndDate(_cfg->DirScreenshots.toStdString(), ".png")); image.save(filePath); - return filePath; + return filePath; } -void MediaPlayer::receiveTrackingPaused() { +void MediaPlayer::receiveTrackingPaused() +{ } -void MediaPlayer::receivePlayerParameters(std::shared_ptr param) { +void MediaPlayer::receivePlayerParameters( + std::shared_ptr param) +{ m_Back = param->m_Back; m_Paus = param->m_Paus; m_Play = param->m_Play; m_Stop = param->m_Stop; - m_Forw = param->m_Forw; - m_RecI = param->m_RecI; - m_RecO = param->m_RecO; + m_Forw = param->m_Forw; + m_RecI = param->m_RecI; + m_RecO = param->m_RecO; - m_CurrentFilename = param->m_CurrentFilename; - m_CurrentFrame = param->m_CurrentFrame; + m_CurrentFilename = param->m_CurrentFilename; + m_CurrentFrame = param->m_CurrentFrame; m_CurrentFrameNumber = param->m_CurrentFrameNumber; - m_fpsOfSourceFile = param->m_fpsSourceVideo; - m_TotalNumbFrames = param->m_TotalNumbFrames; + m_fpsOfSourceFile = param->m_fpsSourceVideo; + m_TotalNumbFrames = param->m_TotalNumbFrames; - m_CurrentFrame = param->m_CurrentFrame; - const bool isValidFrame = static_cast(m_CurrentFrame) && !m_CurrentFrame->empty(); + m_CurrentFrame = param->m_CurrentFrame; + const bool isValidFrame = static_cast(m_CurrentFrame) && + !m_CurrentFrame->empty(); - if (isValidFrame) - { + if (isValidFrame) { Q_EMIT renderCurrentImage(m_CurrentFrame, m_NameOfCvMat); if (m_TrackingIsActive) { - Q_EMIT trackCurrentImage(m_CurrentFrame, static_cast(m_CurrentFrameNumber)); - } - else { - Q_EMIT signalVisualizeCurrentModel(static_cast(m_CurrentFrameNumber)); - Q_EMIT signalCurrentFrameNumberToPlugin(static_cast(m_CurrentFrameNumber)); + Q_EMIT trackCurrentImage(m_CurrentFrame, + static_cast(m_CurrentFrameNumber)); + } else { + Q_EMIT signalVisualizeCurrentModel( + static_cast(m_CurrentFrameNumber)); + Q_EMIT signalCurrentFrameNumberToPlugin( + static_cast(m_CurrentFrameNumber)); } if (m_recd) { QRectF rscene = m_gv->sceneRect(); - QRectF rview = m_gv->rect(); - QSize size; + QRectF rview = m_gv->rect(); + QSize size; if (!m_recordScaled) size = rscene.size().toSize(); else @@ -264,28 +355,33 @@ void MediaPlayer::receivePlayerParameters(std::shared_ptrscene()->render(&m_painter); else m_gv->render(&m_painter); - auto view = cv::Mat(m_image.height(), m_image.width(), CV_8UC(m_image.depth() / 8), m_image.bits(), m_image.bytesPerLine()); + auto view = cv::Mat(m_image.height(), + m_image.width(), + CV_8UC(m_image.depth() / 8), + m_image.bits(), + m_image.bytesPerLine()); auto copy = std::make_shared(view.clone()); - cv::cvtColor(*copy, *copy, cv::ColorConversionCodes::COLOR_BGR2RGB); + cv::cvtColor(*copy, + *copy, + cv::ColorConversionCodes::COLOR_BGR2RGB); m_videoc->add(copy); } - } - else - { - qDebug() << "MediaPlayer: Received player parameters with invalid image."; + } else { + qDebug() + << "MediaPlayer: Received player parameters with invalid image."; } Q_EMIT notifyView(); } - -void MediaPlayer::rcvPauseState(bool state) { +void MediaPlayer::rcvPauseState(bool state) +{ _paused = state; if (!state) { @@ -293,13 +389,14 @@ void MediaPlayer::rcvPauseState(bool state) { } } -void MediaPlayer::receivePlayerOperationDone() { - end = std::chrono::system_clock::now(); - long s = std::chrono::duration_cast(end - start).count(); +void MediaPlayer::receivePlayerOperationDone() +{ + end = std::chrono::system_clock::now(); + long s = std::chrono::duration_cast(end - start) + .count(); if (!_paused) { m_currentFPS = floor(1.0 / (double(s) / 1000.0)); - } - else { + } else { m_currentFPS = 0; } @@ -308,26 +405,29 @@ void MediaPlayer::receivePlayerOperationDone() { start = std::chrono::system_clock::now(); } -void MediaPlayer::receiveChangeDisplayImage(QString str) { - int x = 0; +void MediaPlayer::receiveChangeDisplayImage(QString str) +{ + int x = 0; } -int MediaPlayer::toggleRecordImageStream() { - Q_EMIT toggleRecordImageStreamCommand(); - return 0; +int MediaPlayer::toggleRecordImageStream() +{ + Q_EMIT toggleRecordImageStreamCommand(); + return 0; } -int MediaPlayer::toggleRecordGraphicsScenes(GraphicsView *gv) { - - m_gv = gv; - QRectF rscene = m_gv->sceneRect(); //0us - QRectF rview = m_gv->rect(); //0us - QSize s1 = rscene.size().toSize(); //0us - QSize s2 = rview.size().toSize(); //0us - m_recordScaled = _cfg->RecordScaledOutput; - if (!m_recordScaled) - m_recd = m_videoc->toggle(s1.width(), s1.height(), 30); - else - m_recd = m_videoc->toggle(s2.width(), s2.height(), 30); - return m_recd; +int MediaPlayer::toggleRecordGraphicsScenes(GraphicsView* gv) +{ + + m_gv = gv; + QRectF rscene = m_gv->sceneRect(); // 0us + QRectF rview = m_gv->rect(); // 0us + QSize s1 = rscene.size().toSize(); // 0us + QSize s2 = rview.size().toSize(); // 0us + m_recordScaled = _cfg->RecordScaledOutput; + if (!m_recordScaled) + m_recd = m_videoc->toggle(s1.width(), s1.height(), 30); + else + m_recd = m_videoc->toggle(s2.width(), s2.height(), 30); + return m_recd; } diff --git a/Src/Model/MediaPlayer.h b/Src/Model/MediaPlayer.h index 668987d7..c506ad70 100644 --- a/Src/Model/MediaPlayer.h +++ b/Src/Model/MediaPlayer.h @@ -1,10 +1,9 @@ /**************************************************************************** - ** - ** This file is part of the BioTracker Framework - ** by Andreas Jörg - ** - ****************************************************************************/ - + ** + ** This file is part of the BioTracker Framework + ** by Andreas Jörg + ** + ****************************************************************************/ #ifndef MEDIAPLAYER_H #define MEDIAPLAYER_H @@ -21,85 +20,108 @@ #include "util/Config.h" /** - * The MediaPlayer class is an IModel class an part of the MediaPlayer component. This class creats a MediaPlayerStateMachine object and moves it to a QThread. - * The MediaPlayer class controlls and represents the results of the MediaPlayerStateMachine. The communication between a MediaPlayer object and a MediaPlayerStateMachine object is done by - * Qts SIGNALS and SLOTS. This is due to the fact that SIGNALS and SLTOS are thread safe. A disadvantage is that SIGNALS and SLOTS are slower then normal function calls. + * The MediaPlayer class is an IModel class an part of the MediaPlayer + * component. This class creats a MediaPlayerStateMachine object and moves it + * to a QThread. The MediaPlayer class controlls and represents the results of + * the MediaPlayerStateMachine. The communication between a MediaPlayer object + * and a MediaPlayerStateMachine object is done by Qts SIGNALS and SLOTS. This + * is due to the fact that SIGNALS and SLTOS are thread safe. A disadvantage is + * that SIGNALS and SLOTS are slower then normal function calls. * - * The constructor of this class is responsible for connecting to the MediaPlayerStateMachine. + * The constructor of this class is responsible for connecting to the + * MediaPlayerStateMachine. */ -class MediaPlayer : public IModel { +class MediaPlayer : public IModel +{ Q_OBJECT - public: +public: MediaPlayer(QObject* parent = 0); ~MediaPlayer(); - Q_SIGNALS: +Q_SIGNALS: /** - * Emit the path to a video stream. This signal will be received by the MediaPlayerStateMachine which runns in a separate Thread. - */ + * Emit the path to a video stream. This signal will be received by the + * MediaPlayerStateMachine which runns in a separate Thread. + */ void loadVideoStream(std::vector files); /** - * Emit the path to pictures. This signal will be received by the MediaPlayerStateMachine which runns in a separate Thread. - */ + * Emit the path to pictures. This signal will be received by the + * MediaPlayerStateMachine which runns in a separate Thread. + */ void loadPictures(std::vector files); /** - * Emit the camera device number. This signal will be received by the MediaPlayerStateMachine which runns in a separate Thread. - */ + * Emit the camera device number. This signal will be received by the + * MediaPlayerStateMachine which runns in a separate Thread. + */ void loadCameraDevice(CameraConfiguration conf); /** - * Emit a frame number. This signal will be received by the MediaPlayerStateMachine which runns in a separate Thread. - */ + * Emit a frame number. This signal will be received by the + * MediaPlayerStateMachine which runns in a separate Thread. + */ void goToFrame(int frame); /** - * Emit the next frame command. This signal will be received by the MediaPlayerStateMachine which runns in a separate Thread. - */ + * Emit the next frame command. This signal will be received by the + * MediaPlayerStateMachine which runns in a separate Thread. + */ void nextFrameCommand(); /** - * Emit previous frame command. This signal will be received by the MediaPlayerStateMachine which runns in a separate Thread. - */ + * Emit previous frame command. This signal will be received by the + * MediaPlayerStateMachine which runns in a separate Thread. + */ void prevFrameCommand(); /** - * Emit the play command. This signal will be received by the MediaPlayerStateMachine which runns in a separate Thread. - */ + * Emit the play command. This signal will be received by the + * MediaPlayerStateMachine which runns in a separate Thread. + */ void playCommand(); /** - * Emit stop command. This signal will be received by the MediaPlayerStateMachine which runns in a separate Thread. - */ + * Emit stop command. This signal will be received by the + * MediaPlayerStateMachine which runns in a separate Thread. + */ void stopCommand(); /** - * Emit the pause command. This signal will be received by the MediaPlayerStateMachine which runns in a separate Thread. - */ + * Emit the pause command. This signal will be received by the + * MediaPlayerStateMachine which runns in a separate Thread. + */ void pauseCommand(); /** - * This SIGNAL will be emmited if a state operation should be executed. This signal will be received by the MediaPlayerStateMachine which runns in a separate Thread. + * This SIGNAL will be emmited if a state operation should be executed. + * This signal will be received by the MediaPlayerStateMachine which runns + * in a separate Thread. */ void runPlayerOperation(); /** - * This SIGNAL will send a cv::Mat and a name to the MediaPlayer controller class. This controller will give the data to the TextureObject component. + * This SIGNAL will send a cv::Mat and a name to the MediaPlayer controller + * class. This controller will give the data to the TextureObject + * component. */ void renderCurrentImage(std::shared_ptr mat, QString name); /** - * This SIGNAL is only emmited if Tracking Is Active. The PluginLoader component will receive the cv::Mat and the current frame number. + * This SIGNAL is only emmited if Tracking Is Active. The PluginLoader + * component will receive the cv::Mat and the current frame number. */ void trackCurrentImage(std::shared_ptr mat, uint number); - /** - * This SIGNAL is only emmited if Tracking Is inactive. The core visualization controller will receive the framenumber and will try to visualize the tracking model. - */ - void signalVisualizeCurrentModel(uint frameNumber); + /** + * This SIGNAL is only emmited if Tracking Is inactive. The core + * visualization controller will receive the framenumber and will try to + * visualize the tracking model. + */ + void signalVisualizeCurrentModel(uint frameNumber); - void signalCurrentFrameNumberToPlugin(uint frameNumber); + void signalCurrentFrameNumberToPlugin(uint frameNumber); - void toggleRecordImageStreamCommand(); + void toggleRecordImageStreamCommand(); - void fwdPlayerParameters(std::shared_ptr parameters); + void fwdPlayerParameters( + std::shared_ptr parameters); void emitNextMediaInBatch(const std::string path); void emitNextMediaInBatchLoaded(const std::string path); - public: +public: void setTrackingActive(); void setTrackingDeactive(); void setTargetFPS(double fps); @@ -109,74 +131,79 @@ class MediaPlayer : public IModel { bool getBackwardState(); bool getStopState(); bool getPauseState(); - bool getRecIState(); - bool getRecOState(); + bool getRecIState(); + bool getRecOState(); bool getTrackingState(); - int toggleRecordGraphicsScenes(GraphicsView * gv); - int toggleRecordImageStream(); + int toggleRecordGraphicsScenes(GraphicsView* gv); + int toggleRecordImageStream(); - size_t getTotalNumberOfFrames(); - size_t getCurrentFrameNumber(); - double getFpsOfSourceFile(); - double getCurrentFPS(); - double getTargetFPS(); - QString getCurrentFileName(); + size_t getTotalNumberOfFrames(); + size_t getCurrentFrameNumber(); + double getFpsOfSourceFile(); + double getCurrentFPS(); + double getTargetFPS(); + QString getCurrentFileName(); std::shared_ptr getCurrentFrame(); - QString takeScreenshot(GraphicsView *gv); + QString takeScreenshot(GraphicsView* gv); - public Q_SLOTS: +public Q_SLOTS: /** - * MediaPlayer will receive the current playerParameters from the MediaPlayerStateMachine. + * MediaPlayer will receive the current playerParameters from the + * MediaPlayerStateMachine. */ - void receivePlayerParameters(std::shared_ptr param); + void receivePlayerParameters( + std::shared_ptr param); /** - * If the MediaPlayerStateMachine is finished with executing the current state it will trigger this SLOT. + * If the MediaPlayerStateMachine is finished with executing the current + * state it will trigger this SLOT. */ void receivePlayerOperationDone(); /** - * - */ + * + */ void receiveTrackingPaused(); - /** - * Catches the pause state from the controller. + /** + * Catches the pause state from the controller. * This will automatically wrap all cases of "stop" semantics. - * We do this although the info is basically passed implicitly via other commands, because it's easier + * We do this although the info is basically passed implicitly via other + * commands, because it's easier */ void rcvPauseState(bool state); - void receiveChangeDisplayImage(QString str); + void receiveChangeDisplayImage(QString str); - private: - //TODO Refactor members to _ instead of m_ +private: + // TODO Refactor members to _ instead of m_ - /** - * helper function which opens a video. If video size has changed, a new video is opened. - */ - int reopenVideoWriter(); - int _imagew; - int _imageh; - Config *_cfg; + /** + * helper function which opens a video. If video size has changed, a new + * video is opened. + */ + int reopenVideoWriter(); + int _imagew; + int _imageh; + Config* _cfg; - QPointer< QThread > m_PlayerThread; - QPointer< MediaPlayerStateMachine > m_Player; + QPointer m_PlayerThread; + QPointer m_Player; - //IPlayerState* m_CurrentPlayerState; - //IPlayerState* m_NextPlayerState; + // IPlayerState* m_CurrentPlayerState; + // IPlayerState* m_NextPlayerState; QMap m_States; - size_t m_TotalNumbFrames; - size_t m_CurrentFrameNumber; - double m_fpsOfSourceFile; - double m_currentFPS; - double m_targetFPS; - QString m_CurrentFilename; + size_t m_TotalNumbFrames; + size_t m_CurrentFrameNumber; + double m_fpsOfSourceFile; + double m_currentFPS; + double m_targetFPS; + QString m_CurrentFilename; std::shared_ptr m_CurrentFrame; bool m_Play; @@ -184,25 +211,23 @@ class MediaPlayer : public IModel { bool m_Back; bool m_Stop; bool m_Paus; - bool m_RecI; - bool m_RecO; + bool m_RecI; + bool m_RecO; - - bool m_recd; - bool m_recordScaled; + bool m_recd; + bool m_recordScaled; bool _paused = true; - bool m_useCuda; - GraphicsView *m_gv; - QImage m_image; - QPainter m_painter; - std::shared_ptr m_videoWriter; - std::shared_ptr m_videoc; + bool m_useCuda; + GraphicsView* m_gv; + QImage m_image; + QPainter m_painter; + std::shared_ptr m_videoWriter; + std::shared_ptr m_videoc; - bool m_TrackingIsActive; + bool m_TrackingIsActive; QString m_NameOfCvMat = "Original"; - std::chrono::system_clock::time_point start; std::chrono::system_clock::time_point end; }; diff --git a/Src/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.cpp b/Src/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.cpp index 7fa0d149..2a8b6a36 100644 --- a/Src/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.cpp +++ b/Src/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.cpp @@ -13,170 +13,192 @@ #include "util/types.h" #include -MediaPlayerStateMachine::MediaPlayerStateMachine(QObject* parent) : - IModel(parent), - m_ImageStream(BioTracker::Core::make_ImageStream3NoMedia()) { - m_PlayerParameters = playerParameters(); +MediaPlayerStateMachine::MediaPlayerStateMachine(QObject* parent) +: IModel(parent) +, m_ImageStream(BioTracker::Core::make_ImageStream3NoMedia()) +{ + m_PlayerParameters = playerParameters(); - m_States.insert(IPlayerState::PLAYER_STATES::STATE_INITIAL, - (new PStateInitial(this, m_ImageStream))); - m_States.insert(IPlayerState::PLAYER_STATES::STATE_INITIAL_STREAM, - (new PStateInitialStream(this, m_ImageStream))); - m_States.insert(IPlayerState::PLAYER_STATES::STATE_STEP_FORW, - (new PStateStepForw(this, m_ImageStream))); - m_States.insert(IPlayerState::PLAYER_STATES::STATE_PLAY, - (new PStatePlay(this, m_ImageStream))); - m_States.insert(IPlayerState::PLAYER_STATES::STATE_PAUSE, - (new PStatePause(this, m_ImageStream))); - m_States.insert(IPlayerState::PLAYER_STATES::STATE_STEP_BACK, - (new PStateStepBack(this, m_ImageStream))); - m_States.insert(IPlayerState::PLAYER_STATES::STATE_WAIT, - (new PStateWait(this, m_ImageStream))); - m_States.insert(IPlayerState::PLAYER_STATES::STATE_GOTOFRAME, - (new PStateGoToFrame(this, m_ImageStream))); + m_States.insert(IPlayerState::PLAYER_STATES::STATE_INITIAL, + (new PStateInitial(this, m_ImageStream))); + m_States.insert(IPlayerState::PLAYER_STATES::STATE_INITIAL_STREAM, + (new PStateInitialStream(this, m_ImageStream))); + m_States.insert(IPlayerState::PLAYER_STATES::STATE_STEP_FORW, + (new PStateStepForw(this, m_ImageStream))); + m_States.insert(IPlayerState::PLAYER_STATES::STATE_PLAY, + (new PStatePlay(this, m_ImageStream))); + m_States.insert(IPlayerState::PLAYER_STATES::STATE_PAUSE, + (new PStatePause(this, m_ImageStream))); + m_States.insert(IPlayerState::PLAYER_STATES::STATE_STEP_BACK, + (new PStateStepBack(this, m_ImageStream))); + m_States.insert(IPlayerState::PLAYER_STATES::STATE_WAIT, + (new PStateWait(this, m_ImageStream))); + m_States.insert(IPlayerState::PLAYER_STATES::STATE_GOTOFRAME, + (new PStateGoToFrame(this, m_ImageStream))); - QMap::iterator i; - for (i = m_States.begin(); i != m_States.end(); i++) { - QObject::connect(i.value(), &IPlayerState::emitNextMediaInBatch, this, - &MediaPlayerStateMachine::emitNextMediaInBatch); - QObject::connect(i.value(), &IPlayerState::emitNextMediaInBatchLoaded, this, - &MediaPlayerStateMachine::emitNextMediaInBatchLoaded); - } + QMap::iterator i; + for (i = m_States.begin(); i != m_States.end(); i++) { + QObject::connect(i.value(), + &IPlayerState::emitNextMediaInBatch, + this, + &MediaPlayerStateMachine::emitNextMediaInBatch); + QObject::connect(i.value(), + &IPlayerState::emitNextMediaInBatchLoaded, + this, + &MediaPlayerStateMachine::emitNextMediaInBatchLoaded); + } - setNextState(IPlayerState::PLAYER_STATES::STATE_INITIAL); + setNextState(IPlayerState::PLAYER_STATES::STATE_INITIAL); } +void MediaPlayerStateMachine::receiveRunPlayerOperation() +{ -void MediaPlayerStateMachine::receiveRunPlayerOperation() { + if (m_NextPlayerState != + m_States.value(IPlayerState::PLAYER_STATES::STATE_WAIT)) { - if (m_NextPlayerState != m_States.value(IPlayerState::PLAYER_STATES::STATE_WAIT)) { - - m_CurrentPlayerState = m_NextPlayerState; - m_CurrentPlayerState->operate(); - - updatePlayerParameter(); - emitSignals(); - } + m_CurrentPlayerState = m_NextPlayerState; + m_CurrentPlayerState->operate(); + updatePlayerParameter(); + emitSignals(); + } } -void MediaPlayerStateMachine::receiveLoadVideoCommand(std::vector files) { +void MediaPlayerStateMachine::receiveLoadVideoCommand( + std::vector files) +{ - m_stream = BioTracker::Core::make_ImageStream3Video(_cfg, files); + m_stream = BioTracker::Core::make_ImageStream3Video(_cfg, files); - m_PlayerParameters.m_TotalNumbFrames = m_stream->numFrames(); + m_PlayerParameters.m_TotalNumbFrames = m_stream->numFrames(); - for (auto x: m_States) { - x->changeImageStream(m_stream); - } - - setNextState(IPlayerState::STATE_INITIAL_STREAM); + for (auto x : m_States) { + x->changeImageStream(m_stream); + } + setNextState(IPlayerState::STATE_INITIAL_STREAM); } -void MediaPlayerStateMachine::receiveLoadPictures(std::vector files) { - m_stream = BioTracker::Core::make_ImageStream3Pictures(_cfg, files); - - m_PlayerParameters.m_TotalNumbFrames = m_stream->numFrames(); +void MediaPlayerStateMachine::receiveLoadPictures( + std::vector files) +{ + m_stream = BioTracker::Core::make_ImageStream3Pictures(_cfg, files); - for (auto x: m_States) { - x->changeImageStream(m_stream); - } + m_PlayerParameters.m_TotalNumbFrames = m_stream->numFrames(); - setNextState(IPlayerState::STATE_INITIAL_STREAM); + for (auto x : m_States) { + x->changeImageStream(m_stream); + } + setNextState(IPlayerState::STATE_INITIAL_STREAM); } -void MediaPlayerStateMachine::receiveLoadCameraDevice(CameraConfiguration conf) { - m_stream.reset(); - for (auto x: m_States) { - x->changeImageStream(m_stream); - } +void MediaPlayerStateMachine::receiveLoadCameraDevice(CameraConfiguration conf) +{ + m_stream.reset(); + for (auto x : m_States) { + x->changeImageStream(m_stream); + } - m_stream = BioTracker::Core::make_ImageStream3Camera(_cfg, conf); + m_stream = BioTracker::Core::make_ImageStream3Camera(_cfg, conf); - m_PlayerParameters.m_TotalNumbFrames = m_stream->numFrames(); + m_PlayerParameters.m_TotalNumbFrames = m_stream->numFrames(); - for (auto x: m_States) { - x->changeImageStream(m_stream); - } + for (auto x : m_States) { + x->changeImageStream(m_stream); + } - setNextState(IPlayerState::STATE_INITIAL_STREAM); + setNextState(IPlayerState::STATE_INITIAL_STREAM); } -void MediaPlayerStateMachine::receivePrevFrameCommand() { - setNextState(IPlayerState::STATE_STEP_BACK); +void MediaPlayerStateMachine::receivePrevFrameCommand() +{ + setNextState(IPlayerState::STATE_STEP_BACK); } -void MediaPlayerStateMachine::receiveNextFramCommand() { - setNextState(IPlayerState::STATE_STEP_FORW); +void MediaPlayerStateMachine::receiveNextFramCommand() +{ + setNextState(IPlayerState::STATE_STEP_FORW); } -void MediaPlayerStateMachine::receivePauseCommand() { - setNextState(IPlayerState::STATE_PAUSE); +void MediaPlayerStateMachine::receivePauseCommand() +{ + setNextState(IPlayerState::STATE_PAUSE); } -void MediaPlayerStateMachine::receiveStopCommand() { - setNextState(IPlayerState::STATE_INITIAL_STREAM); +void MediaPlayerStateMachine::receiveStopCommand() +{ + setNextState(IPlayerState::STATE_INITIAL_STREAM); } -void MediaPlayerStateMachine::receivePlayCommand() { - setNextState(IPlayerState::STATE_PLAY); +void MediaPlayerStateMachine::receivePlayCommand() +{ + setNextState(IPlayerState::STATE_PLAY); } -void MediaPlayerStateMachine::receiveGoToFrame(int frame) { - PStateGoToFrame* state = dynamic_cast (m_States.value(IPlayerState::PLAYER_STATES::STATE_GOTOFRAME)); - state->setFrameNumber(frame); - setNextState(IPlayerState::STATE_GOTOFRAME); +void MediaPlayerStateMachine::receiveGoToFrame(int frame) +{ + PStateGoToFrame* state = dynamic_cast( + m_States.value(IPlayerState::PLAYER_STATES::STATE_GOTOFRAME)); + state->setFrameNumber(frame); + setNextState(IPlayerState::STATE_GOTOFRAME); } -void MediaPlayerStateMachine::receiveTargetFps(double fps) { - m_PlayerParameters.m_fpsTarget = fps; - static_cast(m_States.value(IPlayerState::STATE_PLAY)) - ->setFps(fps); +void MediaPlayerStateMachine::receiveTargetFps(double fps) +{ + m_PlayerParameters.m_fpsTarget = fps; + static_cast(m_States.value(IPlayerState::STATE_PLAY)) + ->setFps(fps); } -void MediaPlayerStateMachine::receivetoggleRecordImageStream() { - if (m_stream) - m_PlayerParameters.m_RecI = m_stream->toggleRecord(); - else - m_PlayerParameters.m_RecI = false; - emitSignals(); - return; +void MediaPlayerStateMachine::receivetoggleRecordImageStream() +{ + if (m_stream) + m_PlayerParameters.m_RecI = m_stream->toggleRecord(); + else + m_PlayerParameters.m_RecI = false; + emitSignals(); + return; } -void MediaPlayerStateMachine::updatePlayerParameter() { +void MediaPlayerStateMachine::updatePlayerParameter() +{ - stateParameters stateParam = m_CurrentPlayerState->getStateParameters(); + stateParameters stateParam = m_CurrentPlayerState->getStateParameters(); - m_PlayerParameters.m_Back = stateParam.m_Back; - m_PlayerParameters.m_Forw = stateParam.m_Forw; - m_PlayerParameters.m_Paus = stateParam.m_Paus; - m_PlayerParameters.m_Play = stateParam.m_Play; - m_PlayerParameters.m_Stop = stateParam.m_Stop; + m_PlayerParameters.m_Back = stateParam.m_Back; + m_PlayerParameters.m_Forw = stateParam.m_Forw; + m_PlayerParameters.m_Paus = stateParam.m_Paus; + m_PlayerParameters.m_Play = stateParam.m_Play; + m_PlayerParameters.m_Stop = stateParam.m_Stop; - m_PlayerParameters.m_CurrentFilename = m_CurrentPlayerState->getCurrentFileName(); - m_PlayerParameters.m_TotalNumbFrames = m_CurrentPlayerState->m_ImageStream->numFrames(); + m_PlayerParameters.m_CurrentFilename = + m_CurrentPlayerState->getCurrentFileName(); + m_PlayerParameters.m_TotalNumbFrames = + m_CurrentPlayerState->m_ImageStream->numFrames(); - m_PlayerParameters.m_CurrentFrame = m_CurrentPlayerState->getCurrentFrame(); - m_PlayerParameters.m_CurrentFrameNumber = m_CurrentPlayerState->getCurrentFrameNumber(); - m_PlayerParameters.m_fpsSourceVideo = m_CurrentPlayerState->m_ImageStream->fps(); - m_PlayerParameters.m_batchItems = m_CurrentPlayerState->getBatchItems(); + m_PlayerParameters.m_CurrentFrame = + m_CurrentPlayerState->getCurrentFrame(); + m_PlayerParameters.m_CurrentFrameNumber = + m_CurrentPlayerState->getCurrentFrameNumber(); + m_PlayerParameters.m_fpsSourceVideo = + m_CurrentPlayerState->m_ImageStream->fps(); + m_PlayerParameters.m_batchItems = m_CurrentPlayerState->getBatchItems(); } -void MediaPlayerStateMachine::emitSignals() { - auto parametersCopy = - std::make_shared(m_PlayerParameters); - assert(parametersCopy->m_CurrentFrameNumber == - m_PlayerParameters.m_CurrentFrameNumber); - Q_EMIT emitPlayerParameters(parametersCopy); +void MediaPlayerStateMachine::emitSignals() +{ + auto parametersCopy = std::make_shared( + m_PlayerParameters); + assert(parametersCopy->m_CurrentFrameNumber == + m_PlayerParameters.m_CurrentFrameNumber); + Q_EMIT emitPlayerParameters(parametersCopy); } -void MediaPlayerStateMachine::setNextState(IPlayerState::PLAYER_STATES state) { - m_NextPlayerState = m_States.value(state); - - Q_EMIT emitPlayerOperationDone(); +void MediaPlayerStateMachine::setNextState(IPlayerState::PLAYER_STATES state) +{ + m_NextPlayerState = m_States.value(state); + Q_EMIT emitPlayerOperationDone(); } - - diff --git a/Src/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h b/Src/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h index 11892437..001832ec 100644 --- a/Src/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h +++ b/Src/Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h @@ -1,10 +1,9 @@ /**************************************************************************** - ** - ** This file is part of the BioTracker Framework - ** by Andreas Jörg - ** - ****************************************************************************/ - + ** + ** This file is part of the BioTracker Framework + ** by Andreas Jörg + ** + ****************************************************************************/ #ifndef BIOTRACKER3PLAYER_H #define BIOTRACKER3PLAYER_H @@ -30,25 +29,33 @@ #include "util/Config.h" /** - * The MediaPlayerStateMachine class is an IModel class and is responsible for the executing and setting Player Stats. The instance of this class runns in a separate Thread. + * The MediaPlayerStateMachine class is an IModel class and is responsible for + * the executing and setting Player Stats. The instance of this class runns in + * a separate Thread. */ -class MediaPlayerStateMachine : public IModel { +class MediaPlayerStateMachine : public IModel +{ Q_OBJECT - public: +public: explicit MediaPlayerStateMachine(QObject* parent = 0); /** - * This method can be called by the MediaPlayer class and by any State which is part of the MediaPlayerStateMachine. + * This method can be called by the MediaPlayer class and by any State + * which is part of the MediaPlayerStateMachine. */ - void setNextState(IPlayerState::PLAYER_STATES state); + void setNextState(IPlayerState::PLAYER_STATES state); - IPlayerState::PLAYER_STATES getState(); + IPlayerState::PLAYER_STATES getState(); - void setConfig(Config* cfg) { _cfg = cfg;}; + void setConfig(Config* cfg) + { + _cfg = cfg; + }; - public Q_SLOTS: +public Q_SLOTS: /** - * This SLOT is called by the MediaPlayer class. If this slot is triggered the next state will be executed. + * This SLOT is called by the MediaPlayer class. If this slot is triggered + * the next state will be executed. */ void receiveRunPlayerOperation(); @@ -64,37 +71,39 @@ class MediaPlayerStateMachine : public IModel { void receiveGoToFrame(int frame); void receiveTargetFps(double fps); - void receivetoggleRecordImageStream(); + void receivetoggleRecordImageStream(); - Q_SIGNALS: +Q_SIGNALS: /** - * After each state execution this SIGNAL is emmited and received by the MediaPlayer class. The parameter playerParameters contains all information that was changed during the execution of the current state. + * After each state execution this SIGNAL is emmited and received by the + * MediaPlayer class. The parameter playerParameters contains all + * information that was changed during the execution of the current state. */ - void emitPlayerParameters(std::shared_ptr parameters); + void emitPlayerParameters( + std::shared_ptr parameters); /** - * When the state operation got finished, this SIGNAL is emmited and received by the MediaPlayer class. + * When the state operation got finished, this SIGNAL is emmited and + * received by the MediaPlayer class. */ void emitPlayerOperationDone(); void emitNextMediaInBatch(const std::string path); void emitNextMediaInBatchLoaded(const std::string path); - private: +private: void updatePlayerParameter(); void emitSignals(); - - private: - IPlayerState* m_CurrentPlayerState; - IPlayerState* m_NextPlayerState; +private: + IPlayerState* m_CurrentPlayerState; + IPlayerState* m_NextPlayerState; QMap m_States; - std::shared_ptr m_ImageStream; + std::shared_ptr m_ImageStream; - playerParameters m_PlayerParameters; + playerParameters m_PlayerParameters; std::shared_ptr m_stream; - Config *_cfg; + Config* _cfg; }; - #endif // BIOTRACKER3PLAYER_H diff --git a/Src/Model/MediaPlayerStateMachine/PlayerParameters.h b/Src/Model/MediaPlayerStateMachine/PlayerParameters.h index 9b180289..ec4f3e5c 100644 --- a/Src/Model/MediaPlayerStateMachine/PlayerParameters.h +++ b/Src/Model/MediaPlayerStateMachine/PlayerParameters.h @@ -1,35 +1,37 @@ /**************************************************************************** - ** - ** This file is part of the BioTracker Framework - ** by Andreas Jörg - ** - ****************************************************************************/ + ** + ** This file is part of the BioTracker Framework + ** by Andreas Jörg + ** + ****************************************************************************/ #ifndef PLAYERPARAMETERS_H #define PLAYERPARAMETERS_H /** - * The playerParameters struct holds all data types of the current MediaPlayer state. + * The playerParameters struct holds all data types of the current MediaPlayer + * state. */ -struct playerParameters { +struct playerParameters +{ // PlayerStates bool m_Play; bool m_Forw; bool m_Back; bool m_Stop; - bool m_Paus; - bool m_RecI; - bool m_RecO; + bool m_Paus; + bool m_RecI; + bool m_RecO; // The other information - size_t m_TotalNumbFrames; - QString m_CurrentFilename; - std::string m_CurrentTitle; - size_t m_CurrentFrameNumber; + size_t m_TotalNumbFrames; + QString m_CurrentFilename; + std::string m_CurrentTitle; + size_t m_CurrentFrameNumber; std::shared_ptr m_CurrentFrame; - double m_fpsSourceVideo; - double m_fpsTarget; + double m_fpsSourceVideo; + double m_fpsTarget; std::vector m_batchItems; }; diff --git a/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateGoToFrame.cpp b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateGoToFrame.cpp index 10aa6f98..32c9218a 100644 --- a/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateGoToFrame.cpp +++ b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateGoToFrame.cpp @@ -1,38 +1,39 @@ #include "PStateGoToFrame.h" #include "Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h" - -PStateGoToFrame::PStateGoToFrame(MediaPlayerStateMachine* player, - std::shared_ptr imageStream) : - IPlayerState(player, imageStream) { +PStateGoToFrame::PStateGoToFrame( + MediaPlayerStateMachine* player, + std::shared_ptr imageStream) +: IPlayerState(player, imageStream) +{ m_StateParameters.m_Back = false; m_StateParameters.m_Forw = false; m_StateParameters.m_Paus = false; m_StateParameters.m_Play = false; - m_StateParameters.m_Stop = false; - m_StateParameters.m_RecI = false; - m_StateParameters.m_RecO = false; + m_StateParameters.m_Stop = false; + m_StateParameters.m_RecI = false; + m_StateParameters.m_RecO = false; m_FrameNumber = 0; m_GoToFrameNumber = 0; operate(); - } -void PStateGoToFrame::setFrameNumber(int frame) { +void PStateGoToFrame::setFrameNumber(int frame) +{ m_GoToFrameNumber = frame; } -void PStateGoToFrame::operate() { +void PStateGoToFrame::operate() +{ m_StateParameters.m_Play = true; m_StateParameters.m_Stop = true; m_StateParameters.m_Paus = false; - if (m_ImageStream->setFrameNumber(m_GoToFrameNumber)) { - m_Mat = m_ImageStream->currentFrame(); + m_Mat = m_ImageStream->currentFrame(); m_FrameNumber = m_ImageStream->currentFrameNumber(); } @@ -53,5 +54,4 @@ void PStateGoToFrame::operate() { } m_Player->setNextState(IPlayerState::STATE_WAIT); - } diff --git a/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateGoToFrame.h b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateGoToFrame.h index 5237479e..aa435a85 100644 --- a/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateGoToFrame.h +++ b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateGoToFrame.h @@ -1,10 +1,9 @@ /**************************************************************************** - ** - ** This file is part of the BioTracker Framework - ** by Andreas Jörg - ** - ****************************************************************************/ - + ** + ** This file is part of the BioTracker Framework + ** by Andreas Jörg + ** + ****************************************************************************/ #ifndef PSTATEGOTOFRAME_H #define PSTATEGOTOFRAME_H @@ -12,23 +11,27 @@ #include "IStates/IPlayerState.h" /** - * This State is responsible for jumping to a spezific frame number in the ImageStream. The following state will be STATE_WAIT + * This State is responsible for jumping to a spezific frame number in the + * ImageStream. The following state will be STATE_WAIT */ -class PStateGoToFrame : public IPlayerState { - public: - PStateGoToFrame(MediaPlayerStateMachine* player, std::shared_ptr imageStream); +class PStateGoToFrame : public IPlayerState +{ +public: + PStateGoToFrame( + MediaPlayerStateMachine* player, + std::shared_ptr imageStream); // IPlayerState interface - public Q_SLOTS: +public Q_SLOTS: void operate() override; - public: +public: /** * This function sets the next frame number. */ void setFrameNumber(int frame); - private: +private: int m_GoToFrameNumber; }; diff --git a/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateInitial.cpp b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateInitial.cpp index 7e232f41..5d2c62b1 100644 --- a/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateInitial.cpp +++ b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateInitial.cpp @@ -1,24 +1,27 @@ #include "PStateInitial.h" #include "Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h" -PStateInitial::PStateInitial(MediaPlayerStateMachine* player, - std::shared_ptr imageStream) : - IPlayerState(player, imageStream) { +PStateInitial::PStateInitial( + MediaPlayerStateMachine* player, + std::shared_ptr imageStream) +: IPlayerState(player, imageStream) +{ m_StateParameters.m_Back = false; m_StateParameters.m_Forw = false; m_StateParameters.m_Paus = false; m_StateParameters.m_Play = false; m_StateParameters.m_Stop = false; - m_StateParameters.m_RecI = false; - m_StateParameters.m_RecO = false; + m_StateParameters.m_RecI = false; + m_StateParameters.m_RecO = false; m_FrameNumber = 0; operate(); } -void PStateInitial::operate() { +void PStateInitial::operate() +{ m_StateParameters.m_Back = false; m_StateParameters.m_Forw = false; diff --git a/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateInitial.h b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateInitial.h index 03340ccb..2bf392ea 100644 --- a/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateInitial.h +++ b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateInitial.h @@ -1,9 +1,9 @@ /**************************************************************************** - ** - ** This file is part of the BioTracker Framework - ** by Andreas Jörg - ** - ****************************************************************************/ + ** + ** This file is part of the BioTracker Framework + ** by Andreas Jörg + ** + ****************************************************************************/ #ifndef PSTATEINITIAL_H #define PSTATEINITIAL_H @@ -11,14 +11,17 @@ #include "IStates/IPlayerState.h" /** - * This State is the first state when running BioTracker. It sets all parameters to false and sets as next state STATE_WAIT + * This State is the first state when running BioTracker. It sets all + * parameters to false and sets as next state STATE_WAIT */ -class PStateInitial : public IPlayerState { - public: - PStateInitial(MediaPlayerStateMachine* player, std::shared_ptr imageStream); +class PStateInitial : public IPlayerState +{ +public: + PStateInitial(MediaPlayerStateMachine* player, + std::shared_ptr imageStream); // IPlayerState interface - public Q_SLOTS: +public Q_SLOTS: void operate() override; }; diff --git a/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateInitialStream.cpp b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateInitialStream.cpp index b57f1fdd..dab4531f 100644 --- a/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateInitialStream.cpp +++ b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateInitialStream.cpp @@ -1,9 +1,11 @@ #include "PStateInitialStream.h" #include "Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h" -PStateInitialStream::PStateInitialStream(MediaPlayerStateMachine* player, - std::shared_ptr imageStream) : - IPlayerState(player, imageStream) { +PStateInitialStream::PStateInitialStream( + MediaPlayerStateMachine* player, + std::shared_ptr imageStream) +: IPlayerState(player, imageStream) +{ m_StateParameters.m_Back = false; m_StateParameters.m_Forw = false; @@ -12,10 +14,10 @@ PStateInitialStream::PStateInitialStream(MediaPlayerStateMachine* player, m_StateParameters.m_Stop = false; m_FrameNumber = 0; - } -void PStateInitialStream::operate() { +void PStateInitialStream::operate() +{ m_StateParameters.m_Play = true; m_StateParameters.m_Forw = true; @@ -24,10 +26,10 @@ void PStateInitialStream::operate() { m_StateParameters.m_Paus = false; bool xval = false; - xval = m_ImageStream->setFrameNumber(0); + xval = m_ImageStream->setFrameNumber(0); if (xval) { - m_Mat = m_ImageStream->currentFrame(); + m_Mat = m_ImageStream->currentFrame(); m_FrameNumber = m_ImageStream->currentFrameNumber(); } diff --git a/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateInitialStream.h b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateInitialStream.h index 1b6e1249..989c3175 100644 --- a/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateInitialStream.h +++ b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateInitialStream.h @@ -1,9 +1,9 @@ /**************************************************************************** - ** - ** This file is part of the BioTracker Framework - ** by Andreas Jörg - ** - ****************************************************************************/ + ** + ** This file is part of the BioTracker Framework + ** by Andreas Jörg + ** + ****************************************************************************/ #ifndef PSTATEINITIALSTREAM_H #define PSTATEINITIALSTREAM_H @@ -11,14 +11,18 @@ #include "IStates/IPlayerState.h" /** - * This State is active when a video or camera device was selected by the user. It sets as following state STATE_WAIT. + * This State is active when a video or camera device was selected by the user. + * It sets as following state STATE_WAIT. */ -class PStateInitialStream : public IPlayerState { - public: - PStateInitialStream(MediaPlayerStateMachine* player, std::shared_ptr imageStream); +class PStateInitialStream : public IPlayerState +{ +public: + PStateInitialStream( + MediaPlayerStateMachine* player, + std::shared_ptr imageStream); // IPlayerState interface - public Q_SLOTS: +public Q_SLOTS: void operate() override; }; diff --git a/Src/Model/MediaPlayerStateMachine/PlayerStates/PStatePause.cpp b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStatePause.cpp index 8b9cfe62..28dfe67a 100644 --- a/Src/Model/MediaPlayerStateMachine/PlayerStates/PStatePause.cpp +++ b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStatePause.cpp @@ -1,23 +1,25 @@ #include "PStatePause.h" #include "Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h" -PStatePause::PStatePause(MediaPlayerStateMachine* player, - std::shared_ptr imageStream) : - IPlayerState(player, imageStream) { +PStatePause::PStatePause( + MediaPlayerStateMachine* player, + std::shared_ptr imageStream) +: IPlayerState(player, imageStream) +{ m_StateParameters.m_Back = false; m_StateParameters.m_Forw = false; m_StateParameters.m_Paus = false; m_StateParameters.m_Play = false; m_StateParameters.m_Stop = false; - m_StateParameters.m_RecI = false; - m_StateParameters.m_RecO = false; + m_StateParameters.m_RecI = false; + m_StateParameters.m_RecO = false; m_FrameNumber = 0; - } -void PStatePause::operate() { +void PStatePause::operate() +{ m_StateParameters.m_Play = true; m_StateParameters.m_Forw = true; @@ -25,7 +27,7 @@ void PStatePause::operate() { m_StateParameters.m_Stop = true; m_StateParameters.m_Paus = false; - m_Mat = m_ImageStream->currentFrame(); + m_Mat = m_ImageStream->currentFrame(); m_FrameNumber = m_ImageStream->currentFrameNumber(); m_Player->setNextState(IPlayerState::STATE_WAIT); diff --git a/Src/Model/MediaPlayerStateMachine/PlayerStates/PStatePause.h b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStatePause.h index f2d3a06d..05a90a2d 100644 --- a/Src/Model/MediaPlayerStateMachine/PlayerStates/PStatePause.h +++ b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStatePause.h @@ -1,9 +1,9 @@ /**************************************************************************** - ** - ** This file is part of the BioTracker Framework - ** by Andreas Jörg - ** - ****************************************************************************/ + ** + ** This file is part of the BioTracker Framework + ** by Andreas Jörg + ** + ****************************************************************************/ #ifndef PSTATEPAUSE_H #define PSTATEPAUSE_H @@ -11,16 +11,18 @@ #include "IStates/IPlayerState.h" /** - * This state is active when the user clicks on the Pause button in the GUI. The next state will be STATE_WAIT. + * This state is active when the user clicks on the Pause button in the GUI. + * The next state will be STATE_WAIT. */ -class PStatePause : public IPlayerState { - public: - PStatePause(MediaPlayerStateMachine* player, std::shared_ptr imageStream); +class PStatePause : public IPlayerState +{ +public: + PStatePause(MediaPlayerStateMachine* player, + std::shared_ptr imageStream); // IPlayerState interface - public Q_SLOTS: +public Q_SLOTS: void operate() override; - }; #endif // PSTATEPAUSE_H diff --git a/Src/Model/MediaPlayerStateMachine/PlayerStates/PStatePlay.cpp b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStatePlay.cpp index 737c9994..d9e95613 100644 --- a/Src/Model/MediaPlayerStateMachine/PlayerStates/PStatePlay.cpp +++ b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStatePlay.cpp @@ -5,24 +5,25 @@ #include using namespace std::chrono; -PStatePlay::PStatePlay(MediaPlayerStateMachine* player, - std::shared_ptr imageStream) : - IPlayerState(player, imageStream) { +PStatePlay::PStatePlay( + MediaPlayerStateMachine* player, + std::shared_ptr imageStream) +: IPlayerState(player, imageStream) +{ m_StateParameters.m_Back = false; m_StateParameters.m_Forw = false; m_StateParameters.m_Paus = false; m_StateParameters.m_Play = false; m_StateParameters.m_Stop = false; - m_StateParameters.m_RecI = false; - m_StateParameters.m_RecO = false; + m_StateParameters.m_RecI = false; + m_StateParameters.m_RecO = false; m_FrameNumber = 0; - - } -void PStatePlay::operate() { +void PStatePlay::operate() +{ m_StateParameters.m_Play = true; m_StateParameters.m_Forw = false; @@ -30,42 +31,40 @@ void PStatePlay::operate() { m_StateParameters.m_Stop = true; m_StateParameters.m_Paus = true; - - bool isLastFrame = m_ImageStream->lastFrame(); - IPlayerState::PLAYER_STATES nextState = IPlayerState::STATE_INITIAL; + bool isLastFrame = m_ImageStream->lastFrame(); + IPlayerState::PLAYER_STATES nextState = IPlayerState::STATE_INITIAL; if (!isLastFrame) { m_ImageStream->nextFrame(); - m_Mat = m_ImageStream->currentFrame(); - m_FrameNumber = m_ImageStream->currentFrameNumber(); - nextState = IPlayerState::STATE_PLAY; - } else if (m_ImageStream->hasNextInBatch()){ - Q_EMIT emitNextMediaInBatch("Samplestring"); + m_Mat = m_ImageStream->currentFrame(); + m_FrameNumber = m_ImageStream->currentFrameNumber(); + nextState = IPlayerState::STATE_PLAY; + } else if (m_ImageStream->hasNextInBatch()) { + Q_EMIT emitNextMediaInBatch("Samplestring"); m_ImageStream->stepToNextInBatch(); m_ImageStream->nextFrame(); - m_Mat = m_ImageStream->currentFrame(); - m_FrameNumber = m_ImageStream->currentFrameNumber(); - nextState = IPlayerState::STATE_PLAY; - Q_EMIT emitNextMediaInBatchLoaded("Samplestring"); - } else - { + m_Mat = m_ImageStream->currentFrame(); + m_FrameNumber = m_ImageStream->currentFrameNumber(); + nextState = IPlayerState::STATE_PLAY; + Q_EMIT emitNextMediaInBatchLoaded("Samplestring"); + } else { nextState = IPlayerState::STATE_INITIAL_STREAM; - } - //If fps is limited, wait the neccessary time + // If fps is limited, wait the neccessary time end = std::chrono::system_clock::now(); if (_targetFps > 0) { - long long dt = std::chrono::duration_cast(end - start).count(); + long long dt = std::chrono::duration_cast( + end - start) + .count(); long long targetFps = (1. / _targetFps) * 1000.; if (dt < targetFps) { - std::this_thread::sleep_for(std::chrono::milliseconds(targetFps - dt)); + std::this_thread::sleep_for( + std::chrono::milliseconds(targetFps - dt)); } } start = std::chrono::system_clock::now(); - m_Player->setNextState(nextState); - } diff --git a/Src/Model/MediaPlayerStateMachine/PlayerStates/PStatePlay.h b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStatePlay.h index 056959b9..e506d083 100644 --- a/Src/Model/MediaPlayerStateMachine/PlayerStates/PStatePlay.h +++ b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStatePlay.h @@ -1,9 +1,9 @@ /**************************************************************************** - ** - ** This file is part of the BioTracker Framework - ** by Andreas Jörg - ** - ****************************************************************************/ + ** + ** This file is part of the BioTracker Framework + ** by Andreas Jörg + ** + ****************************************************************************/ #ifndef PSTATEPLAY_H #define PSTATEPLAY_H @@ -12,24 +12,29 @@ #include /** - * This Stat is active when a video fiel is playing or a camera device is streaming. If the current frame is the last in the ImageStream this state will set STATE_INITIAL as next state. - * If the current frame is not the last frame in the ImageStream, the next state will be STATE_PLAY. + * This Stat is active when a video fiel is playing or a camera device is + * streaming. If the current frame is the last in the ImageStream this state + * will set STATE_INITIAL as next state. If the current frame is not the last + * frame in the ImageStream, the next state will be STATE_PLAY. */ -class PStatePlay : public IPlayerState { - public: - PStatePlay(MediaPlayerStateMachine* player, std::shared_ptr imageStream); +class PStatePlay : public IPlayerState +{ +public: + PStatePlay(MediaPlayerStateMachine* player, + std::shared_ptr imageStream); - void setFps(double fps) { + void setFps(double fps) + { _targetFps = fps; } // IPlayerState interface - public Q_SLOTS: +public Q_SLOTS: void operate() override; private: std::chrono::system_clock::time_point end, start; - double _targetFps = 0; + double _targetFps = 0; }; #endif // PSTATEPLAY_H diff --git a/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateStepBack.cpp b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateStepBack.cpp index c924e4d3..d477909e 100644 --- a/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateStepBack.cpp +++ b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateStepBack.cpp @@ -1,32 +1,33 @@ #include "PStateStepBack.h" #include "Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h" -PStateStepBack::PStateStepBack(MediaPlayerStateMachine* player, - std::shared_ptr imageStream) : - IPlayerState(player, imageStream) { +PStateStepBack::PStateStepBack( + MediaPlayerStateMachine* player, + std::shared_ptr imageStream) +: IPlayerState(player, imageStream) +{ m_StateParameters.m_Back = false; m_StateParameters.m_Forw = false; m_StateParameters.m_Paus = false; m_StateParameters.m_Play = false; m_StateParameters.m_Stop = false; - m_StateParameters.m_RecI = false; - m_StateParameters.m_RecO = false; + m_StateParameters.m_RecI = false; + m_StateParameters.m_RecO = false; m_FrameNumber = 0; - } -void PStateStepBack::operate() { +void PStateStepBack::operate() +{ m_StateParameters.m_Play = true; m_StateParameters.m_Forw = true; m_StateParameters.m_Stop = true; m_StateParameters.m_Paus = false; - if (m_ImageStream->previousFrame()) { - m_Mat = m_ImageStream->currentFrame(); + m_Mat = m_ImageStream->currentFrame(); m_FrameNumber = m_ImageStream->currentFrameNumber(); } diff --git a/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateStepBack.h b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateStepBack.h index 5a805aed..5c9abe51 100644 --- a/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateStepBack.h +++ b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateStepBack.h @@ -1,9 +1,9 @@ /**************************************************************************** - ** - ** This file is part of the BioTracker Framework - ** by Andreas Jörg - ** - ****************************************************************************/ + ** + ** This file is part of the BioTracker Framework + ** by Andreas Jörg + ** + ****************************************************************************/ #ifndef PSTATESTEPBACK_H #define PSTATESTEPBACK_H @@ -11,14 +11,17 @@ #include "IStates/IPlayerState.h" /** - * This state will active if the user clicks on the Back button in the GUI. The following state will be STATE_WAIT. + * This state will active if the user clicks on the Back button in the GUI. The + * following state will be STATE_WAIT. */ -class PStateStepBack : public IPlayerState { - public: - PStateStepBack(MediaPlayerStateMachine* player, std::shared_ptr imageStream); +class PStateStepBack : public IPlayerState +{ +public: + PStateStepBack(MediaPlayerStateMachine* player, + std::shared_ptr imageStream); // IPlayerState interface - public Q_SLOTS: +public Q_SLOTS: void operate() override; }; diff --git a/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateStepForw.cpp b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateStepForw.cpp index fae818ab..e011bfa7 100644 --- a/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateStepForw.cpp +++ b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateStepForw.cpp @@ -1,32 +1,33 @@ #include "PStateStepForw.h" #include "Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h" -PStateStepForw::PStateStepForw(MediaPlayerStateMachine* player, - std::shared_ptr imageStream) : - IPlayerState(player, imageStream) { +PStateStepForw::PStateStepForw( + MediaPlayerStateMachine* player, + std::shared_ptr imageStream) +: IPlayerState(player, imageStream) +{ m_StateParameters.m_Back = false; m_StateParameters.m_Forw = false; m_StateParameters.m_Paus = false; m_StateParameters.m_Play = false; m_StateParameters.m_Stop = false; - m_StateParameters.m_RecI = false; - m_StateParameters.m_RecO = false; + m_StateParameters.m_RecI = false; + m_StateParameters.m_RecO = false; m_FrameNumber = 0; - } -void PStateStepForw::operate() { +void PStateStepForw::operate() +{ m_StateParameters.m_Play = true; m_StateParameters.m_Back = true; m_StateParameters.m_Stop = true; m_StateParameters.m_Paus = false; - if (m_ImageStream->nextFrame()) { - m_Mat = m_ImageStream->currentFrame(); + m_Mat = m_ImageStream->currentFrame(); m_FrameNumber = m_ImageStream->currentFrameNumber(); } diff --git a/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateStepForw.h b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateStepForw.h index 44b67703..44b9bed4 100644 --- a/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateStepForw.h +++ b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateStepForw.h @@ -1,9 +1,9 @@ /**************************************************************************** - ** - ** This file is part of the BioTracker Framework - ** by Andreas Jörg - ** - ****************************************************************************/ + ** + ** This file is part of the BioTracker Framework + ** by Andreas Jörg + ** + ****************************************************************************/ #ifndef PSTATESTEPFORW_H #define PSTATESTEPFORW_H @@ -11,14 +11,17 @@ #include "IStates/IPlayerState.h" /** - * This State is active if the user clicks the Forward button in the GUI. The next state will be STATE_WAIT. + * This State is active if the user clicks the Forward button in the GUI. The + * next state will be STATE_WAIT. */ -class PStateStepForw : public IPlayerState { - public: - PStateStepForw(MediaPlayerStateMachine* player, std::shared_ptr imageStream); +class PStateStepForw : public IPlayerState +{ +public: + PStateStepForw(MediaPlayerStateMachine* player, + std::shared_ptr imageStream); // IPlayerState interface - public Q_SLOTS: +public Q_SLOTS: void operate() override; }; diff --git a/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateWait.cpp b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateWait.cpp index c75d40b7..43da0dfb 100644 --- a/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateWait.cpp +++ b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateWait.cpp @@ -1,24 +1,25 @@ #include "PStateWait.h" #include "Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h" - -PStateWait::PStateWait(MediaPlayerStateMachine* player, - std::shared_ptr imageStream) : - IPlayerState(player, imageStream) { +PStateWait::PStateWait( + MediaPlayerStateMachine* player, + std::shared_ptr imageStream) +: IPlayerState(player, imageStream) +{ m_StateParameters.m_Back = false; m_StateParameters.m_Forw = false; m_StateParameters.m_Paus = false; m_StateParameters.m_Play = false; m_StateParameters.m_Stop = false; - m_StateParameters.m_RecI = false; - m_StateParameters.m_RecO = false; + m_StateParameters.m_RecI = false; + m_StateParameters.m_RecO = false; m_FrameNumber = 0; - } -void PStateWait::operate() { +void PStateWait::operate() +{ // Just Wait } diff --git a/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateWait.h b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateWait.h index 65927b72..ca7f35a6 100644 --- a/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateWait.h +++ b/Src/Model/MediaPlayerStateMachine/PlayerStates/PStateWait.h @@ -1,10 +1,9 @@ /**************************************************************************** - ** - ** This file is part of the BioTracker Framework - ** by Andreas Jörg - ** - ****************************************************************************/ - + ** + ** This file is part of the BioTracker Framework + ** by Andreas Jörg + ** + ****************************************************************************/ #ifndef PSTATEWAIT_H #define PSTATEWAIT_H @@ -14,12 +13,14 @@ /** * This state dose nothing. There is also no next state set by this state. */ -class PStateWait : public IPlayerState { - public: - PStateWait(MediaPlayerStateMachine* player, std::shared_ptr imageStream); +class PStateWait : public IPlayerState +{ +public: + PStateWait(MediaPlayerStateMachine* player, + std::shared_ptr imageStream); // IPlayerState interface - public Q_SLOTS: +public Q_SLOTS: void operate() override; }; diff --git a/Src/Model/TextureObject.cpp b/Src/Model/TextureObject.cpp index 45181f02..e12207ca 100644 --- a/Src/Model/TextureObject.cpp +++ b/Src/Model/TextureObject.cpp @@ -1,15 +1,17 @@ #include "TextureObject.h" -TextureObject::TextureObject(QObject *parent, QString name) : - IModel(parent), - m_Name(name) +TextureObject::TextureObject(QObject* parent, QString name) +: IModel(parent) +, m_Name(name) { // OpenCV's coordinate system originates in the upper left corner. - // OpenGL originates in the lower left. Thus the image has to be flipped vertically + // OpenGL originates in the lower left. Thus the image has to be flipped + // vertically m_texture = QImage(1, 1, QImage::Format_RGB888); } -void TextureObject::set(std::shared_ptr img) { +void TextureObject::set(std::shared_ptr img) +{ if (img->empty()) { return; } @@ -35,8 +37,9 @@ void TextureObject::set(std::shared_ptr img) { // otherwise: the range is outside of native [0 ... 255] so we // actually need to do some refitting - // mapping 1-step out from [0 .. 255] range 1-step in the [min .. max] range - const double sizeRatio = 256.0/abs(static_cast(max - min)); + // mapping 1-step out from [0 .. 255] range 1-step in the [min .. + // max] range + const double sizeRatio = 256.0 / abs(static_cast(max - min)); const double convertedMin = abs(static_cast(min * sizeRatio)); img->convertTo(img8U, CV_8U, sizeRatio, convertedMin); } @@ -45,13 +48,11 @@ void TextureObject::set(std::shared_ptr img) { img->copyTo(m_img); } - m_texture = QImage( - m_img.data, - m_img.cols, - m_img.rows, - static_cast(m_img.step), - QImage::Format_RGB888 - ); + m_texture = QImage(m_img.data, + m_img.cols, + m_img.rows, + static_cast(m_img.step), + QImage::Format_RGB888); Q_EMIT notifyView(); } diff --git a/Src/Model/TextureObject.h b/Src/Model/TextureObject.h index dd0b7ff2..625bb2d8 100644 --- a/Src/Model/TextureObject.h +++ b/Src/Model/TextureObject.h @@ -1,10 +1,9 @@ /**************************************************************************** - ** - ** This file is part of the BioTracker Framework - ** by Andreas Jörg and BioTracker in version 2. - ** - ****************************************************************************/ - + ** + ** This file is part of the BioTracker Framework + ** by Andreas Jörg and BioTracker in version 2. + ** + ****************************************************************************/ #ifndef BIOTRACKER3TEXTUREOBJECT_H #define BIOTRACKER3TEXTUREOBJECT_H @@ -16,31 +15,37 @@ #include "QString" /** - * The TextureObject class in an IModel class. It is responsible for converting cv::Mats to QImages. These QImages are then displayed in the TextureObjectView. - * This class was adapted from the TextureObject class in BioTracker 2. + * The TextureObject class in an IModel class. It is responsible for converting + * cv::Mats to QImages. These QImages are then displayed in the + * TextureObjectView. This class was adapted from the TextureObject class in + * BioTracker 2. */ -class TextureObject : public IModel { +class TextureObject : public IModel +{ Q_OBJECT - public: +public: explicit TextureObject(QObject* parent = 0, QString name = "NoName"); - void set(std::shared_ptr img); + void set(std::shared_ptr img); QString getName(); - QImage const& get() const { + QImage const& get() const + { return m_texture; } - int width() const { + int width() const + { return m_texture.width(); } - int height() const { + int height() const + { return m_texture.height(); } - private: +private: QString m_Name; cv::Mat m_img; - QImage m_texture; + QImage m_texture; }; #endif // BIOTRACKER3TEXTUREOBJECT_H diff --git a/Src/Model/UndoCommands/TrackCommands.cpp b/Src/Model/UndoCommands/TrackCommands.cpp index 8e3f6f8f..4304bdf8 100644 --- a/Src/Model/UndoCommands/TrackCommands.cpp +++ b/Src/Model/UndoCommands/TrackCommands.cpp @@ -5,83 +5,104 @@ #include "QPoint" #include "QDebug" -AddTrackCommand::AddTrackCommand(int id, QPoint pos, QUndoCommand *parent) - :QUndoCommand(parent), _id(id), _pos(pos) +AddTrackCommand::AddTrackCommand(int id, QPoint pos, QUndoCommand* parent) +: QUndoCommand(parent) +, _id(id) +, _pos(pos) { - _added = false; - setText(QString("Add trajectory ") + QString::number(id)); + _added = false; + setText(QString("Add trajectory ") + QString::number(id)); } void AddTrackCommand::undo() { - emitRemoveTrajectoryId(_id); + emitRemoveTrajectoryId(_id); } void AddTrackCommand::redo() { - if (!_added) { - Q_EMIT emitAddTrajectory(_pos); - _added = true; - } - else { - emitValidateTrajectory(_id); - } + if (!_added) { + Q_EMIT emitAddTrajectory(_pos); + _added = true; + } else { + emitValidateTrajectory(_id); + } } -RemoveTrackCommand::RemoveTrackCommand(IModelTrackedTrajectory* traj, QUndoCommand *parent) - :QUndoCommand(parent), _traj(traj) +RemoveTrackCommand::RemoveTrackCommand(IModelTrackedTrajectory* traj, + QUndoCommand* parent) +: QUndoCommand(parent) +, _traj(traj) { - setText(QString("Remove trajectory ") + QString::number(traj->getId())); + setText(QString("Remove trajectory ") + QString::number(traj->getId())); } void RemoveTrackCommand::undo() { - emitValidateTrajectory(_traj->getId()); + emitValidateTrajectory(_traj->getId()); } void RemoveTrackCommand::redo() { - emitRemoveTrajectory(_traj); + emitRemoveTrajectory(_traj); } -RemoveElementCommand::RemoveElementCommand(IModelTrackedTrajectory* traj, uint frameNumber, QUndoCommand *parent) - :QUndoCommand(parent), _traj(traj), _frameNumber(frameNumber) +RemoveElementCommand::RemoveElementCommand(IModelTrackedTrajectory* traj, + uint frameNumber, + QUndoCommand* parent) +: QUndoCommand(parent) +, _traj(traj) +, _frameNumber(frameNumber) { - - setText("Remove entity " + QString::number(_frameNumber) + " of trajectory " + QString::number(traj->getId())); + setText("Remove entity " + QString::number(_frameNumber) + + " of trajectory " + QString::number(traj->getId())); } void RemoveElementCommand::undo() { - emitValidateEntity(_traj, _frameNumber); + emitValidateEntity(_traj, _frameNumber); } void RemoveElementCommand::redo() { - emitRemoveElement(_traj, _frameNumber); + emitRemoveElement(_traj, _frameNumber); } -MoveElementCommand::MoveElementCommand(IModelTrackedTrajectory* traj, uint frameNumber, QPoint oldPos, QPoint newPos, int toMove, QUndoCommand *parent) - :QUndoCommand(parent), _traj(traj), _frameNumber(frameNumber), _oldPos(oldPos), _newPos(newPos), _toMove(toMove) +MoveElementCommand::MoveElementCommand(IModelTrackedTrajectory* traj, + uint frameNumber, + QPoint oldPos, + QPoint newPos, + int toMove, + QUndoCommand* parent) +: QUndoCommand(parent) +, _traj(traj) +, _frameNumber(frameNumber) +, _oldPos(oldPos) +, _newPos(newPos) +, _toMove(toMove) { - setText("Move entity " + QString::number(_frameNumber) + " of trajectory " + QString::number(traj->getId()) + " to " + QString::number(_newPos.x()) + ", " + QString::number(_newPos.y())); + setText("Move entity " + QString::number(_frameNumber) + + " of trajectory " + QString::number(traj->getId()) + " to " + + QString::number(_newPos.x()) + ", " + + QString::number(_newPos.y())); } void MoveElementCommand::undo() { - emitMoveElement(_traj, _frameNumber, _oldPos, _toMove); + emitMoveElement(_traj, _frameNumber, _oldPos, _toMove); } void MoveElementCommand::redo() { - emitMoveElement(_traj, _frameNumber, _newPos, _toMove); - _toMove = 1; + emitMoveElement(_traj, _frameNumber, _newPos, _toMove); + _toMove = 1; } /*bool MoveElementCommand::mergeWith(const QUndoCommand * command) //{ -// const MoveElementCommand *moveCommandToMerge = static_cast(command); +// const MoveElementCommand *moveCommandToMerge = static_cast(command); // IModelTrackedTrajectory* trajToMerge = moveCommandToMerge->_traj; // uint frameNumberToMerge = moveCommandToMerge->_frameNumber; // @@ -93,56 +114,75 @@ void MoveElementCommand::redo() // }*/ -SwapTrackIdCommand::SwapTrackIdCommand(IModelTrackedTrajectory* traj0, IModelTrackedTrajectory* traj1, QUndoCommand *parent) - :QUndoCommand(parent), _traj0(traj0), _traj1(traj1) +SwapTrackIdCommand::SwapTrackIdCommand(IModelTrackedTrajectory* traj0, + IModelTrackedTrajectory* traj1, + QUndoCommand* parent) +: QUndoCommand(parent) +, _traj0(traj0) +, _traj1(traj1) { - setText("Swap id's of " + QString::number(_traj0->getId()) + " and " + QString::number(_traj1->getId())); + setText("Swap id's of " + QString::number(_traj0->getId()) + " and " + + QString::number(_traj1->getId())); } void SwapTrackIdCommand::undo() { - emitSwapIds(_traj1, _traj0); + emitSwapIds(_traj1, _traj0); } void SwapTrackIdCommand::redo() { - emitSwapIds(_traj0, _traj1); + emitSwapIds(_traj0, _traj1); } -FixTrackCommand::FixTrackCommand(IModelTrackedTrajectory* traj, bool isFixed, QUndoCommand *parent) - :QUndoCommand(parent), _traj(traj), _isFixed(isFixed) +FixTrackCommand::FixTrackCommand(IModelTrackedTrajectory* traj, + bool isFixed, + QUndoCommand* parent) +: QUndoCommand(parent) +, _traj(traj) +, _isFixed(isFixed) { - if (_isFixed) { - setText("Fix tracking data of trajectory " + QString::number(_traj->getId())); - } - else { - setText("Unfix tracking data of trajectory " + QString::number(_traj->getId())); - - } + if (_isFixed) { + setText("Fix tracking data of trajectory " + + QString::number(_traj->getId())); + } else { + setText("Unfix tracking data of trajectory " + + QString::number(_traj->getId())); + } } void FixTrackCommand::undo() { - emitFixTrack(_traj, !_isFixed); + emitFixTrack(_traj, !_isFixed); } void FixTrackCommand::redo() { - emitFixTrack(_traj, _isFixed); + emitFixTrack(_traj, _isFixed); } -RotateEntityCommand::RotateEntityCommand(IModelTrackedTrajectory* traj, double oldAngle, double angle, uint frameNumber, QUndoCommand *parent) - :QUndoCommand(parent), _traj(traj), _newAngle(angle), _oldAngle(oldAngle), _frameNumber(frameNumber) +RotateEntityCommand::RotateEntityCommand(IModelTrackedTrajectory* traj, + double oldAngle, + double angle, + uint frameNumber, + QUndoCommand* parent) +: QUndoCommand(parent) +, _traj(traj) +, _newAngle(angle) +, _oldAngle(oldAngle) +, _frameNumber(frameNumber) { - setText("Rotate entity "+ QString::number(_frameNumber) + " of trajectory " + QString::number(_traj->getId()) + " to " + QString::number(_newAngle)); + setText("Rotate entity " + QString::number(_frameNumber) + + " of trajectory " + QString::number(_traj->getId()) + " to " + + QString::number(_newAngle)); } void RotateEntityCommand::undo() { - emitEntityRotation(_traj, _oldAngle, _frameNumber); + emitEntityRotation(_traj, _oldAngle, _frameNumber); } void RotateEntityCommand::redo() { - emitEntityRotation(_traj, _newAngle, _frameNumber); + emitEntityRotation(_traj, _newAngle, _frameNumber); } \ No newline at end of file diff --git a/Src/Model/UndoCommands/TrackCommands.h b/Src/Model/UndoCommands/TrackCommands.h index 7bce9de6..b020c57d 100644 --- a/Src/Model/UndoCommands/TrackCommands.h +++ b/Src/Model/UndoCommands/TrackCommands.h @@ -10,161 +10,176 @@ // http://doc.qt.io/qt-5/qundo.html /** -* Add track command with data to do and undo: -* position, id, traj, added -*/ + * Add track command with data to do and undo: + * position, id, traj, added + */ class AddTrackCommand : public QObject, public QUndoCommand { - Q_OBJECT + Q_OBJECT public: - AddTrackCommand(int id, QPoint pos, - QUndoCommand *parent = 0); - void undo() override; - void redo() override; + AddTrackCommand(int id, QPoint pos, QUndoCommand* parent = 0); + void undo() override; + void redo() override; signals: - void emitAddTrajectory(QPoint pos); - void emitValidateTrajectory(int id); - void emitRemoveTrajectoryId(int id); + void emitAddTrajectory(QPoint pos); + void emitValidateTrajectory(int id); + void emitRemoveTrajectoryId(int id); private: - IModelTrackedTrajectory* _traj; - int _id; - QPoint _pos; - bool _added; + IModelTrackedTrajectory* _traj; + int _id; + QPoint _pos; + bool _added; }; /** -* Remove Track command with data to do and undo: -* traj -*/ + * Remove Track command with data to do and undo: + * traj + */ class RemoveTrackCommand : public QObject, public QUndoCommand { - Q_OBJECT + Q_OBJECT public: - RemoveTrackCommand(IModelTrackedTrajectory* traj, - QUndoCommand *parent = 0); + RemoveTrackCommand(IModelTrackedTrajectory* traj, + QUndoCommand* parent = 0); - void undo() override; - void redo() override; + void undo() override; + void redo() override; signals: - void emitValidateTrajectory(int id); - void emitRemoveTrajectory(IModelTrackedTrajectory* traj); + void emitValidateTrajectory(int id); + void emitRemoveTrajectory(IModelTrackedTrajectory* traj); private: - IModelTrackedTrajectory* _traj; + IModelTrackedTrajectory* _traj; }; /** -* Remove Entity command with data to do and undo: -* traj, framenumber -*/ + * Remove Entity command with data to do and undo: + * traj, framenumber + */ class RemoveElementCommand : public QObject, public QUndoCommand { - Q_OBJECT + Q_OBJECT public: - RemoveElementCommand(IModelTrackedTrajectory* traj, uint frameNumber, - QUndoCommand *parent = 0); + RemoveElementCommand(IModelTrackedTrajectory* traj, + uint frameNumber, + QUndoCommand* parent = 0); - void undo() override; - void redo() override; + void undo() override; + void redo() override; signals: - void emitValidateEntity(IModelTrackedTrajectory* traj, uint frameNumber); - void emitRemoveElement(IModelTrackedTrajectory* traj, uint frameNumber); + void emitValidateEntity(IModelTrackedTrajectory* traj, uint frameNumber); + void emitRemoveElement(IModelTrackedTrajectory* traj, uint frameNumber); private: - IModelTrackedTrajectory* _traj; - uint _frameNumber; + IModelTrackedTrajectory* _traj; + uint _frameNumber; }; /** -* Move Entity command with data to do and undo: -* traj, oldPos, newPos, hwo many left to move (for a multimove), framenuber -*/ + * Move Entity command with data to do and undo: + * traj, oldPos, newPos, hwo many left to move (for a multimove), framenuber + */ class MoveElementCommand : public QObject, public QUndoCommand { - Q_OBJECT + Q_OBJECT public: - MoveElementCommand(IModelTrackedTrajectory* traj, uint frameNumber, QPoint oldPos, QPoint newPos, int toMove, - QUndoCommand *parent = 0); - - void undo() override; - void redo() override; - //bool mergeWith(const QUndoCommand *command) override; + MoveElementCommand(IModelTrackedTrajectory* traj, + uint frameNumber, + QPoint oldPos, + QPoint newPos, + int toMove, + QUndoCommand* parent = 0); + + void undo() override; + void redo() override; + // bool mergeWith(const QUndoCommand *command) override; signals: - void emitMoveElement(IModelTrackedTrajectory* traj, uint _frameNumber, QPoint pos, int toMove); + void emitMoveElement(IModelTrackedTrajectory* traj, + uint _frameNumber, + QPoint pos, + int toMove); private: - IModelTrackedTrajectory* _traj; - uint _frameNumber; - QPoint _oldPos; - QPoint _newPos; - int _toMove; + IModelTrackedTrajectory* _traj; + uint _frameNumber; + QPoint _oldPos; + QPoint _newPos; + int _toMove; }; /** -* Swap Track Id command with data to do and undo: -* traj 0 and traj 1 -*/ + * Swap Track Id command with data to do and undo: + * traj 0 and traj 1 + */ class SwapTrackIdCommand : public QObject, public QUndoCommand { - Q_OBJECT + Q_OBJECT public: - SwapTrackIdCommand(IModelTrackedTrajectory* traj0, IModelTrackedTrajectory* traj1, - QUndoCommand *parent = 0); + SwapTrackIdCommand(IModelTrackedTrajectory* traj0, + IModelTrackedTrajectory* traj1, + QUndoCommand* parent = 0); - void undo() override; - void redo() override; + void undo() override; + void redo() override; signals: - void emitSwapIds(IModelTrackedTrajectory* traj0, IModelTrackedTrajectory* traj1); + void emitSwapIds(IModelTrackedTrajectory* traj0, + IModelTrackedTrajectory* traj1); private: - IModelTrackedTrajectory* _traj0; - IModelTrackedTrajectory* _traj1; + IModelTrackedTrajectory* _traj0; + IModelTrackedTrajectory* _traj1; }; /** -* Fix Track command with data to do and undo: -* fix toggle and traj -*/ + * Fix Track command with data to do and undo: + * fix toggle and traj + */ class FixTrackCommand : public QObject, public QUndoCommand { - Q_OBJECT + Q_OBJECT public: - FixTrackCommand(IModelTrackedTrajectory* traj, bool isFixed, - QUndoCommand *parent = 0); + FixTrackCommand(IModelTrackedTrajectory* traj, + bool isFixed, + QUndoCommand* parent = 0); - void undo() override; - void redo() override; + void undo() override; + void redo() override; signals: - void emitFixTrack(IModelTrackedTrajectory* traj, bool toggle); + void emitFixTrack(IModelTrackedTrajectory* traj, bool toggle); private: - IModelTrackedTrajectory* _traj; - bool _isFixed; + IModelTrackedTrajectory* _traj; + bool _isFixed; }; /** -* Rotate Entity command with data to do and undo: -* traj, old angle, new angle, fraemenumber -*/ + * Rotate Entity command with data to do and undo: + * traj, old angle, new angle, fraemenumber + */ class RotateEntityCommand : public QObject, public QUndoCommand { - Q_OBJECT + Q_OBJECT public: - RotateEntityCommand(IModelTrackedTrajectory* traj, double oldAngleDeg, double newAngleDeg, uint frameNumber, - QUndoCommand *parent = 0); - - void undo() override; - void redo() override; + RotateEntityCommand(IModelTrackedTrajectory* traj, + double oldAngleDeg, + double newAngleDeg, + uint frameNumber, + QUndoCommand* parent = 0); + + void undo() override; + void redo() override; signals: - void emitEntityRotation(IModelTrackedTrajectory* traj, double angle, uint frameNumber); + void emitEntityRotation(IModelTrackedTrajectory* traj, + double angle, + uint frameNumber); private: - IModelTrackedTrajectory* _traj; - double _oldAngle; - double _newAngle; - uint _frameNumber; + IModelTrackedTrajectory* _traj; + double _oldAngle; + double _newAngle; + uint _frameNumber; }; -#endif //TRACKCOMMANDS_H +#endif // TRACKCOMMANDS_H diff --git a/Src/Model/null_Model.cpp b/Src/Model/null_Model.cpp index db2793d0..4328117f 100644 --- a/Src/Model/null_Model.cpp +++ b/Src/Model/null_Model.cpp @@ -2,5 +2,4 @@ null_Model::null_Model() { - } diff --git a/Src/Model/null_Model.h b/Src/Model/null_Model.h index c169409b..7c7ad8df 100644 --- a/Src/Model/null_Model.h +++ b/Src/Model/null_Model.h @@ -1,9 +1,9 @@ /**************************************************************************** - ** - ** This file is part of the BioTracker Framework - ** by Andreas Jörg - ** - ****************************************************************************/ + ** + ** This file is part of the BioTracker Framework + ** by Andreas Jörg + ** + ****************************************************************************/ #ifndef NULL_MODEL_H #define NULL_MODEL_H @@ -13,9 +13,10 @@ /** * The null_Model class is only for initialization of IModel classes. */ -class null_Model : public IModel { +class null_Model : public IModel +{ Q_OBJECT - public: +public: null_Model(); }; diff --git a/Src/PluginLoader.cpp b/Src/PluginLoader.cpp index db3c4684..5e41759b 100644 --- a/Src/PluginLoader.cpp +++ b/Src/PluginLoader.cpp @@ -5,136 +5,142 @@ #include #ifdef _WIN32 - #include - #include - #include - #include - #include - #include - #define MAX_KEY_LENGTH 255 - #define MAX_VALUE_NAME 16383 + #include + #include + #include + #include + #include + #include + #define MAX_KEY_LENGTH 255 + #define MAX_VALUE_NAME 16383 std::vector QueryKey(HKEY hKey, std::string path) { - // See - // https://docs.microsoft.com/en-us/windows/desktop/sysinfo/enumerating-registry-subkeys - std::vector list; - TCHAR achClass[MAX_PATH] = TEXT(""); // buffer for class name - DWORD cchClassName = MAX_PATH; // size of class string - DWORD cSubKeys = 0; // number of subkeys - DWORD cbMaxSubKey; // longest subkey size - DWORD cchMaxClass; // longest class string - DWORD cValues; // number of values for key - DWORD cchMaxValue; // longest value name - DWORD cbMaxValueData; // longest value data - DWORD cbSecurityDescriptor; // size of security descriptor - FILETIME ftLastWriteTime; // last write time - - DWORD i, retCode; - - TCHAR achValue[MAX_VALUE_NAME]; - DWORD cchValue = MAX_VALUE_NAME; - - // Get the class name and the value count. - retCode = RegQueryInfoKey(hKey, // key handle - achClass, // buffer for class name - &cchClassName, // size of class string - NULL, // reserved - &cSubKeys, // number of subkeys - &cbMaxSubKey, // longest subkey size - &cchMaxClass, // longest class string - &cValues, // number of values for this key - &cchMaxValue, // longest value name - &cbMaxValueData, // longest value data - &cbSecurityDescriptor, // security descriptor - &ftLastWriteTime); // last write time - - // Enumerate the key values. - if (cValues) { - // printf( "\nNumber of values: %d\n", cValues); - - for (i = 0, retCode = ERROR_SUCCESS; i < cValues; i++) { - cchValue = MAX_VALUE_NAME; - achValue[0] = '\0'; - retCode = - RegEnumValue(hKey, i, achValue, &cchValue, NULL, NULL, NULL, NULL); - - if (retCode == ERROR_SUCCESS) { - CRegKey regKey; - CHAR szBuffer[512]; - ULONG dwBufferSize = sizeof(szBuffer); - - if (auto error_code = regKey.Open(HKEY_LOCAL_MACHINE, - path.c_str(), - KEY_READ); - error_code != ERROR_SUCCESS) { - qWarning() << "Error opening windows registry path " - << path.c_str() << ": " << error_code; - regKey.Close(); - continue; - } - if (auto error_code = regKey.QueryStringValue(achValue, - szBuffer, - &dwBufferSize); - error_code != ERROR_SUCCESS) { - qWarning() << "Error opening windows registry value " - << achValue << ": " << error_code; - regKey.Close(); - continue; - } - - std::string fp = szBuffer; - std::replace(fp.begin(), fp.end(), '\\', '/'); - list.push_back(fp); - } - } - } - return list; + // See + // https://docs.microsoft.com/en-us/windows/desktop/sysinfo/enumerating-registry-subkeys + std::vector list; + TCHAR achClass[MAX_PATH] = TEXT(""); // buffer for class name + DWORD cchClassName = MAX_PATH; // size of class string + DWORD cSubKeys = 0; // number of subkeys + DWORD cbMaxSubKey; // longest subkey size + DWORD cchMaxClass; // longest class string + DWORD cValues; // number of values for key + DWORD cchMaxValue; // longest value name + DWORD cbMaxValueData; // longest value data + DWORD cbSecurityDescriptor; // size of security descriptor + FILETIME ftLastWriteTime; // last write time + + DWORD i, retCode; + + TCHAR achValue[MAX_VALUE_NAME]; + DWORD cchValue = MAX_VALUE_NAME; + + // Get the class name and the value count. + retCode = RegQueryInfoKey(hKey, // key handle + achClass, // buffer for class name + &cchClassName, // size of class string + NULL, // reserved + &cSubKeys, // number of subkeys + &cbMaxSubKey, // longest subkey size + &cchMaxClass, // longest class string + &cValues, // number of values for this key + &cchMaxValue, // longest value name + &cbMaxValueData, // longest value data + &cbSecurityDescriptor, // security descriptor + &ftLastWriteTime); // last write time + + // Enumerate the key values. + if (cValues) { + // printf( "\nNumber of values: %d\n", cValues); + + for (i = 0, retCode = ERROR_SUCCESS; i < cValues; i++) { + cchValue = MAX_VALUE_NAME; + achValue[0] = '\0'; + retCode = RegEnumValue(hKey, + i, + achValue, + &cchValue, + NULL, + NULL, + NULL, + NULL); + + if (retCode == ERROR_SUCCESS) { + CRegKey regKey; + CHAR szBuffer[512]; + ULONG dwBufferSize = sizeof(szBuffer); + + if (auto error_code = regKey.Open(HKEY_LOCAL_MACHINE, + path.c_str(), + KEY_READ); + error_code != ERROR_SUCCESS) { + qWarning() << "Error opening windows registry path " + << path.c_str() << ": " << error_code; + regKey.Close(); + continue; + } + if (auto error_code = regKey.QueryStringValue(achValue, + szBuffer, + &dwBufferSize); + error_code != ERROR_SUCCESS) { + qWarning() << "Error opening windows registry value " + << achValue << ": " << error_code; + regKey.Close(); + continue; + } + + std::string fp = szBuffer; + std::replace(fp.begin(), fp.end(), '\\', '/'); + list.push_back(fp); + } + } + } + return list; } #endif std::vector PluginLoader::queryRegistryBehaviors(std::string path) { - std::vector list; + std::vector list; #ifdef _WIN32 - HKEY hTestKey; + HKEY hTestKey; - if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, - TEXT(path.c_str()), - 0, - KEY_READ, - &hTestKey) == ERROR_SUCCESS) { - list = QueryKey(hTestKey, path); - } + if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, + TEXT(path.c_str()), + 0, + KEY_READ, + &hTestKey) == ERROR_SUCCESS) { + list = QueryKey(hTestKey, path); + } - RegCloseKey(hTestKey); + RegCloseKey(hTestKey); #endif - return list; + return list; } #ifdef _WIN32 const char* WinGetEnv(const char* name) { - const DWORD buffSize = 65535; - static char buffer[buffSize]; - if (GetEnvironmentVariableA(name, buffer, buffSize)) { - return buffer; - } else { - return 0; - } + const DWORD buffSize = 65535; + static char buffer[buffSize]; + if (GetEnvironmentVariableA(name, buffer, buffSize)) { + return buffer; + } else { + return 0; + } } bool WinSetEnv(const char* name, const char* toWhat) { - return SetEnvironmentVariableA(name, toWhat); + return SetEnvironmentVariableA(name, toWhat); } #endif bool is_shared_library(std::filesystem::path const& p) { - auto extension = p.extension(); - return extension == ".so" || extension == ".dylib" || extension == ".dll"; + auto extension = p.extension(); + return extension == ".so" || extension == ".dylib" || extension == ".dll"; } const char* PluginLoader::addDllPath(std::string f) @@ -142,198 +148,198 @@ const char* PluginLoader::addDllPath(std::string f) // Get the directory of the DLL/*.so and add it to the PATH env variable. // This way dependencies can be shipped in the same directory #ifdef _WIN32 - QFileInfo finf(f.c_str()); - // rather than the buggy _getenv: - // https://docs.microsoft.com/de-de/windows/desktop/api/winbase/nf-winbase-getenvironmentvariable - auto old_path = WinGetEnv("PATH"); - auto path = std::ostringstream(); - if (old_path) { - path << old_path << ";" << finf.absolutePath().toStdString().c_str(); - WinSetEnv("PATH", path.str().c_str()); - } else { - qWarning() << "Failed to get and modify PATH enviromental variable."; - } - return old_path; + QFileInfo finf(f.c_str()); + // rather than the buggy _getenv: + // https://docs.microsoft.com/de-de/windows/desktop/api/winbase/nf-winbase-getenvironmentvariable + auto old_path = WinGetEnv("PATH"); + auto path = std::ostringstream(); + if (old_path) { + path << old_path << ";" << finf.absolutePath().toStdString().c_str(); + WinSetEnv("PATH", path.str().c_str()); + } else { + qWarning() << "Failed to get and modify PATH enviromental variable."; + } + return old_path; #endif - return ""; + return ""; } void PluginLoader::delDllPath(const char* oldPath) { // reset path. We don't want some weird cross-effects #ifdef _WIN32 - if (oldPath) { - WinSetEnv("PATH", oldPath); - } + if (oldPath) { + WinSetEnv("PATH", oldPath); + } #endif } bool endsWith(std::string value, std::string ending) { - std::transform(value.begin(), value.end(), value.begin(), ::tolower); - std::transform(ending.begin(), ending.end(), ending.begin(), ::tolower); - if (ending.size() > value.size()) - return false; - return std::equal(ending.rbegin(), ending.rend(), value.rbegin()); + std::transform(value.begin(), value.end(), value.begin(), ::tolower); + std::transform(ending.begin(), ending.end(), ending.begin(), ::tolower); + if (ending.size() > value.size()) + return false; + return std::equal(ending.rbegin(), ending.rend(), value.rbegin()); } bool validSuffix(std::string f, std::string suffix) { - return (endsWith(f, suffix + ".dll") || endsWith(f, suffix + ".so")); + return (endsWith(f, suffix + ".dll") || endsWith(f, suffix + ".so")); } std::vector PluginLoader::searchDirectoriesForPlugins( - std::vector list, - std::string suffix) + std::vector list, + std::string suffix) { - // Search directories - std::vector filesFromFolders; - - for (auto f : list) { - auto path = std::filesystem::path(f); - if (path.empty()) { - continue; - } - if (std::filesystem::is_directory(path)) { - try { - for (auto& e : std::filesystem::directory_iterator(path)) { - auto p = e.path(); - if (is_shared_library(p) && - p.replace_extension().extension() == suffix) { - filesFromFolders.push_back(e.path().string()); - } - } - } catch (std::filesystem::filesystem_error const& e) { - qWarning() << e.what(); - } - } else if (is_shared_library(path)) { - filesFromFolders.push_back(f); - } else { - qWarning() << "Neither a directory, nor a shared library:" - << f.data(); - } - } - - return filesFromFolders; + // Search directories + std::vector filesFromFolders; + + for (auto f : list) { + auto path = std::filesystem::path(f); + if (path.empty()) { + continue; + } + if (std::filesystem::is_directory(path)) { + try { + for (auto& e : std::filesystem::directory_iterator(path)) { + auto p = e.path(); + if (is_shared_library(p) && + p.replace_extension().extension() == suffix) { + filesFromFolders.push_back(e.path().string()); + } + } + } catch (std::filesystem::filesystem_error const& e) { + qWarning() << e.what(); + } + } else if (is_shared_library(path)) { + filesFromFolders.push_back(f); + } else { + qWarning() << "Neither a directory, nor a shared library:" + << f.data(); + } + } + + return filesFromFolders; } PluginLoader::PluginLoader(QObject* parent) { - m_MetaData = nullptr; - m_PluginLoader = new QPluginLoader(this); - m_PluginListModel = new QStringListModel(); + m_MetaData = nullptr; + m_PluginLoader = new QPluginLoader(this); + m_PluginListModel = new QStringListModel(); } PluginLoader::~PluginLoader() { - delete m_PluginLoader; - delete m_PluginListModel; + delete m_PluginLoader; + delete m_PluginListModel; } bool PluginLoader::loadPluginFromFilename(QString const& filename) { - bool retval = false; - if (m_PluginLoader->isLoaded()) { - m_PluginLoader->unload(); - } + bool retval = false; + if (m_PluginLoader->isLoaded()) { + m_PluginLoader->unload(); + } - bool isLib = QLibrary::isLibrary(filename); + bool isLib = QLibrary::isLibrary(filename); - if (isLib) { + if (isLib) { - auto oldPath = PluginLoader::addDllPath(filename.toStdString()); - m_PluginLoader->setFileName(filename); + auto oldPath = PluginLoader::addDllPath(filename.toStdString()); + m_PluginLoader->setFileName(filename); - readMetaDataFromPlugin(); + readMetaDataFromPlugin(); - retval = m_PluginLoader->load(); - QString s = m_PluginLoader->errorString(); - std::string ss = s.toStdString(); - addPluginnameToLists(getCurrentPluginName(), filename); + retval = m_PluginLoader->load(); + QString s = m_PluginLoader->errorString(); + std::string ss = s.toStdString(); + addPluginnameToLists(getCurrentPluginName(), filename); - if (!m_PluginLoader->isLoaded()) { - qWarning() << ss.c_str(); - retval = false; - } - PluginLoader::delDllPath(oldPath); - } else { - retval = false; - } + if (!m_PluginLoader->isLoaded()) { + qWarning() << ss.c_str(); + retval = false; + } + PluginLoader::delDllPath(oldPath); + } else { + retval = false; + } - return retval; + return retval; } void PluginLoader::addPluginnameToLists(QString mstring, QString filename) { - if (!m_PluginList.contains(mstring)) - m_PluginList.append(mstring); - m_PluginListModel->setStringList(m_PluginList); - m_PluginMap.insert(std::pair(mstring, filename)); + if (!m_PluginList.contains(mstring)) + m_PluginList.append(mstring); + m_PluginListModel->setStringList(m_PluginList); + m_PluginMap.insert(std::pair(mstring, filename)); } bool PluginLoader::loadPluginFromName(QString name) { - QString filename = m_PluginMap.find(name)->second; - return loadPluginFromFilename(filename); + QString filename = m_PluginMap.find(name)->second; + return loadPluginFromFilename(filename); } int PluginLoader::addToPluginList(QString filename, QString suffix) { - if (!validSuffix(filename.toStdString(), suffix.toStdString())) - return 1; - - bool isLib = QLibrary::isLibrary(filename); - - if (isLib) { - - QPluginLoader loader; - loader.setFileName(filename); - QJsonValue pluginMeda(loader.metaData().value("MetaData")); - QJsonObject metaObj = pluginMeda.toObject(); - QString mstring = metaObj.value("name").toString(); - addPluginnameToLists(mstring, filename); - } else { - return 2; - qWarning() << "Error reading plugin: " << filename; - } - return 0; + if (!validSuffix(filename.toStdString(), suffix.toStdString())) + return 1; + + bool isLib = QLibrary::isLibrary(filename); + + if (isLib) { + + QPluginLoader loader; + loader.setFileName(filename); + QJsonValue pluginMeda(loader.metaData().value("MetaData")); + QJsonObject metaObj = pluginMeda.toObject(); + QString mstring = metaObj.value("name").toString(); + addPluginnameToLists(mstring, filename); + } else { + return 2; + qWarning() << "Error reading plugin: " << filename; + } + return 0; } QStringListModel* PluginLoader::getPluginList() { - return m_PluginListModel; + return m_PluginListModel; } QObject* PluginLoader::getPluginInstance() { - return (m_PluginLoader->instance()); + return (m_PluginLoader->instance()); } QJsonObject PluginLoader::getPluginMetaData() const { - if (m_MetaData == nullptr) - qFatal("(getPluginMetaData) No plugin loaded"); - return *m_MetaData; + if (m_MetaData == nullptr) + qFatal("(getPluginMetaData) No plugin loaded"); + return *m_MetaData; } void PluginLoader::readMetaDataFromPlugin() { - m_MetaData = std::make_shared( - m_PluginLoader->metaData().value("MetaData").toObject()); + m_MetaData = std::make_shared( + m_PluginLoader->metaData().value("MetaData").toObject()); } bool PluginLoader::getIsPluginLoaded() { - return m_isPluginLoaded; + return m_isPluginLoaded; } QString PluginLoader::getCurrentPluginName() { - if (m_MetaData == nullptr) - return "Error name"; - return m_MetaData->value("name").toString(); + if (m_MetaData == nullptr) + return "Error name"; + return m_MetaData->value("name").toString(); } const std::map& PluginLoader::getPluginMap() const { - return m_PluginMap; + return m_PluginMap; } diff --git a/Src/PluginLoader.h b/Src/PluginLoader.h index 747c9c2c..ea93edee 100644 --- a/Src/PluginLoader.h +++ b/Src/PluginLoader.h @@ -16,94 +16,95 @@ class PluginLoader : QObject { - Q_OBJECT + Q_OBJECT public: - explicit PluginLoader(QObject* parent = 0); + explicit PluginLoader(QObject* parent = 0); - ~PluginLoader(); + ~PluginLoader(); - /** - * Loads a file as a QT plugin and reads it's name from the metadata. - * It will then be added to the stringlist and is selectable via - * "loadPluginFromName". This function does not actually set the plugin - * instance. - */ - int addToPluginList(QString filename, QString suffix); + /** + * Loads a file as a QT plugin and reads it's name from the metadata. + * It will then be added to the stringlist and is selectable via + * "loadPluginFromName". This function does not actually set the plugin + * instance. + */ + int addToPluginList(QString filename, QString suffix); - /** - * Returns a QStrinListModel with the names of all seen Plugins. - */ - QStringListModel* getPluginList(); + /** + * Returns a QStrinListModel with the names of all seen Plugins. + */ + QStringListModel* getPluginList(); - /** - * Loads a BioTracker Plugin from a file path. It returns true if the Plugin - * could be loaded, otherwise false. The loaded plugin acts as singleton! - */ - bool loadPluginFromFilename(QString const& filename); + /** + * Loads a BioTracker Plugin from a file path. It returns true if the + * Plugin could be loaded, otherwise false. The loaded plugin acts as + * singleton! + */ + bool loadPluginFromFilename(QString const& filename); - /** - * Loads a plugin from it's name (given in the metadata) instead of the - * filename. Only works if it is already known to the pluginloader, i.e. was - * loaded manually or automatically before or or has been added to the - * pluginlist via "addToPluginList" - */ - bool loadPluginFromName(QString name); + /** + * Loads a plugin from it's name (given in the metadata) instead of the + * filename. Only works if it is already known to the pluginloader, i.e. + * was loaded manually or automatically before or or has been added to the + * pluginlist via "addToPluginList" + */ + bool loadPluginFromName(QString name); - QJsonObject getPluginMetaData() const; + QJsonObject getPluginMetaData() const; - static std::vector queryRegistryBehaviors(std::string path); + static std::vector queryRegistryBehaviors(std::string path); - static std::vector searchDirectoriesForPlugins( - std::vector list, - std::string suffix); + static std::vector searchDirectoriesForPlugins( + std::vector list, + std::string suffix); - // return oldPath - static const char* addDllPath(std::string file); + // return oldPath + static const char* addDllPath(std::string file); - static void delDllPath(const char* oldPath); + static void delDllPath(const char* oldPath); - // Is a plugin loaded or not? - bool getIsPluginLoaded(); + // Is a plugin loaded or not? + bool getIsPluginLoaded(); - // Gets the name of the currently loaded plugin - QString getCurrentPluginName(); + // Gets the name of the currently loaded plugin + QString getCurrentPluginName(); - /** - * Returns the Instance of the BioTracker Plugin. - */ - QObject* getPluginInstance(); + /** + * Returns the Instance of the BioTracker Plugin. + */ + QObject* getPluginInstance(); - /** - * Returns a map containing the mapping "plugin name -> filename" - */ - std::map const& getPluginMap() const; + /** + * Returns a map containing the mapping "plugin name -> filename" + */ + std::map const& getPluginMap() const; private: - void addPluginnameToLists(QString name, QString filename); + void addPluginnameToLists(QString name, QString filename); - // a map containing the mapping "plugin name -> filename" - std::map m_PluginMap; + // a map containing the mapping "plugin name -> filename" + std::map m_PluginMap; - /** - * Gets the metadata from the currently loaded plugin. - * Currently this is nothing but the advertised name of the plugin - */ - void readMetaDataFromPlugin(); + /** + * Gets the metadata from the currently loaded plugin. + * Currently this is nothing but the advertised name of the plugin + */ + void readMetaDataFromPlugin(); - // The QT object to actually load the plugins - QPluginLoader* m_PluginLoader; + // The QT object to actually load the plugins + QPluginLoader* m_PluginLoader; - std::shared_ptr m_MetaData; + std::shared_ptr m_MetaData; - // nomen est omen - bool m_isPluginLoaded; + // nomen est omen + bool m_isPluginLoaded; - // List of all available plugins - QStringList m_PluginList; + // List of all available plugins + QStringList m_PluginList; - // Entire ListModel of the metadata (actually containing all metadata, not - // only name) - QStringListModel* m_PluginListModel; + // Entire ListModel of the metadata (actually containing all metadata, not + // only name) + QStringListModel* m_PluginListModel; }; #endif // PLUGINLOADER_H diff --git a/Src/View/AnnotationsView.cpp b/Src/View/AnnotationsView.cpp index ebf63c8a..be252cca 100644 --- a/Src/View/AnnotationsView.cpp +++ b/Src/View/AnnotationsView.cpp @@ -15,62 +15,64 @@ AnnotationsView::~AnnotationsView() void AnnotationsView::prepareUpdate() { - prepareGeometryChange(); + prepareGeometryChange(); } void AnnotationsView::setColor(QColor color) { - _annoColor = color; + _annoColor = color; } QRectF AnnotationsView::boundingRect() const { - auto model = static_cast(getModel()); + auto model = static_cast(getModel()); - QRectF rect{}; - for (auto &annotation : model->annotations) - { - rect = rect.united(annotation->boundingRect()); - } + QRectF rect{}; + for (auto& annotation : model->annotations) { + rect = rect.united(annotation->boundingRect()); + } - if (model->currentAnnotation) - rect = rect.united(model->currentAnnotation->boundingRect()); - return rect; + if (model->currentAnnotation) + rect = rect.united(model->currentAnnotation->boundingRect()); + return rect; } - -void AnnotationsView::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) +void AnnotationsView::paint(QPainter* painter, + const QStyleOptionGraphicsItem* option, + QWidget* widget) { - setZValue(-1); - auto model = static_cast(getModel()); - const auto currentFrame = model->getCurrentFrame(); - for (auto &annotation : model->annotations) - { - if (annotation->isHidden()) - continue; - // Is the current frame in the annotation's range? - if ((currentFrame >= annotation->startFrame && currentFrame <= annotation->endFrame) - || (currentFrame == annotation->startFrame && annotation->startFrame > annotation->endFrame)) - painter->setPen(QPen(_annoColor, 3, Qt::SolidLine, Qt::RoundCap)); - else - { - QColor transparentGray = Qt::gray; - transparentGray.setAlphaF(0.2); - painter->setPen(QPen(transparentGray, 2.5, Qt::DashLine, Qt::RoundCap)); - } - annotation->paint(painter, option, widget); - } + setZValue(-1); + auto model = static_cast(getModel()); + const auto currentFrame = model->getCurrentFrame(); + for (auto& annotation : model->annotations) { + if (annotation->isHidden()) + continue; + // Is the current frame in the annotation's range? + if ((currentFrame >= annotation->startFrame && + currentFrame <= annotation->endFrame) || + (currentFrame == annotation->startFrame && + annotation->startFrame > annotation->endFrame)) + painter->setPen(QPen(_annoColor, 3, Qt::SolidLine, Qt::RoundCap)); + else { + QColor transparentGray = Qt::gray; + transparentGray.setAlphaF(0.2); + painter->setPen( + QPen(transparentGray, 2.5, Qt::DashLine, Qt::RoundCap)); + } + annotation->paint(painter, option, widget); + } - if (model->currentAnnotation) - { - QColor transparentYellow = _annoColor; - transparentYellow.setAlphaF(0.5); - painter->setPen(QPen(transparentYellow, 3, Qt::SolidLine, Qt::RoundCap)); - model->currentAnnotation->paint(painter, option, widget); - } - if (model->selection) - { - painter->setPen(QPen(Qt::red, 3, Qt::SolidLine, Qt::RoundCap)); - Annotations::Annotation::drawHandleLocation(painter, *model->selection.handle, ""); - } + if (model->currentAnnotation) { + QColor transparentYellow = _annoColor; + transparentYellow.setAlphaF(0.5); + painter->setPen( + QPen(transparentYellow, 3, Qt::SolidLine, Qt::RoundCap)); + model->currentAnnotation->paint(painter, option, widget); + } + if (model->selection) { + painter->setPen(QPen(Qt::red, 3, Qt::SolidLine, Qt::RoundCap)); + Annotations::Annotation::drawHandleLocation(painter, + *model->selection.handle, + ""); + } } \ No newline at end of file diff --git a/Src/View/AnnotationsView.h b/Src/View/AnnotationsView.h index f54a9af6..bb7c654b 100644 --- a/Src/View/AnnotationsView.h +++ b/Src/View/AnnotationsView.h @@ -9,31 +9,37 @@ class GraphicsView; /** -* This view inherits from IView and QGraphicsItem. -* It is responsible for drawing the annotations. -* It is shown on to of the media panel. -*/ + * This view inherits from IView and QGraphicsItem. + * It is responsible for drawing the annotations. + * It is shown on to of the media panel. + */ class AnnotationsView : public IView, public QGraphicsItem { public: - using IView::IView; - AnnotationsView() = delete; - virtual ~AnnotationsView(); + using IView::IView; + AnnotationsView() = delete; + virtual ~AnnotationsView(); public: - void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) override; - void prepareUpdate(); - void setColor(QColor color); + void paint(QPainter* painter, + const QStyleOptionGraphicsItem* option, + QWidget* widget) override; + void prepareUpdate(); + void setColor(QColor color); + protected: - QRectF boundingRect() const; + QRectF boundingRect() const; - // IView interface + // IView interface public: - void setNewModel(IModel *model) override { setModel(model); }; + void setNewModel(IModel* model) override + { + setModel(model); + }; + protected: - void connectModelView() override {}; + void connectModelView() override{}; - //members - QColor _annoColor = QColor(Qt::yellow); /**< color of all annotations */ + // members + QColor _annoColor = QColor(Qt::yellow); /**< color of all annotations */ }; - diff --git a/Src/View/AreaDesciptor/AreaDescriptor.cpp b/Src/View/AreaDesciptor/AreaDescriptor.cpp index 61616564..ec26cce6 100644 --- a/Src/View/AreaDesciptor/AreaDescriptor.cpp +++ b/Src/View/AreaDesciptor/AreaDescriptor.cpp @@ -1,8 +1,9 @@ #include "AreaDescriptor.h" #include "Controller/IControllerCfg.h" -AreaDescriptor::AreaDescriptor(IController *controller, IModel *model) : - IView(controller, model) { +AreaDescriptor::AreaDescriptor(IController* controller, IModel* model) +: IView(controller, model) +{ _cfg = static_cast(controller)->getConfig(); }; diff --git a/Src/View/AreaDesciptor/AreaDescriptor.h b/Src/View/AreaDesciptor/AreaDescriptor.h index 81e3a64a..261ad1ac 100644 --- a/Src/View/AreaDesciptor/AreaDescriptor.h +++ b/Src/View/AreaDesciptor/AreaDescriptor.h @@ -7,24 +7,24 @@ class AreaDescriptor : public QObject, public IView, public QGraphicsItem { Q_OBJECT - Q_INTERFACES(QGraphicsItem) + Q_INTERFACES(QGraphicsItem) public: - AreaDescriptor(IController *controller, IModel *model); - ~AreaDescriptor(); + AreaDescriptor(IController* controller, IModel* model); + ~AreaDescriptor(); - virtual void setBrush(QBrush brush) = 0; - virtual void setRect(std::vector rect) = 0; - virtual std::vector getRect() = 0; - virtual void updateRect() = 0; + virtual void setBrush(QBrush brush) = 0; + virtual void setRect(std::vector rect) = 0; + virtual std::vector getRect() = 0; + virtual void updateRect() = 0; - void setDimensions(int x, int y) { + void setDimensions(int x, int y) + { _vdimX = x; _vdimY = y; } -protected: - int _vdimX = 1; - int _vdimY = 1; - Config *_cfg; +protected: + int _vdimX = 1; + int _vdimY = 1; + Config* _cfg; }; - diff --git a/Src/View/AreaDesciptor/EllipseDescriptor.cpp b/Src/View/AreaDesciptor/EllipseDescriptor.cpp index 9ce177bf..4646aa3b 100644 --- a/Src/View/AreaDesciptor/EllipseDescriptor.cpp +++ b/Src/View/AreaDesciptor/EllipseDescriptor.cpp @@ -7,154 +7,180 @@ #include #include -EllipseDescriptor::EllipseDescriptor(IController *controller, IModel *model) : - AreaDescriptor(controller, model) +EllipseDescriptor::EllipseDescriptor(IController* controller, IModel* model) +: AreaDescriptor(controller, model) { - setAcceptHoverEvents(true); - setAcceptedMouseButtons(Qt::MouseButtons::enum_type::LeftButton); - - _brush = QBrush(Qt::blue); - - - _v = (dynamic_cast(getModel()))->getVertices(); - for (int i = 0; i < 4; i++) { - std::shared_ptr ri = std::make_shared(QRect(_v[i].x - 10, _v[i].y - 10, 20, 20), this); - ri->setBrush(_brush); - } + setAcceptHoverEvents(true); + setAcceptedMouseButtons(Qt::MouseButtons::enum_type::LeftButton); + + _brush = QBrush(Qt::blue); + + _v = (dynamic_cast(getModel()))->getVertices(); + for (int i = 0; i < 4; i++) { + std::shared_ptr ri = + std::make_shared( + QRect(_v[i].x - 10, _v[i].y - 10, 20, 20), + this); + ri->setBrush(_brush); + } - updateEllipse(); + updateEllipse(); - _isInit = false; + _isInit = false; } -void EllipseDescriptor::init() { - _rectificationMarkerOrig->setBrush(_brush); - _rectificationMarkerEnd->setBrush(_brush); +void EllipseDescriptor::init() +{ + _rectificationMarkerOrig->setBrush(_brush); + _rectificationMarkerEnd->setBrush(_brush); } -void EllipseDescriptor::updateEllipse() { +void EllipseDescriptor::updateEllipse() +{ - _v = (dynamic_cast(getModel()))->getVertices(); - _rectification = std::make_shared(QRect(_v[0].x, _v[0].y, _v[1].x-_v[0].x, _v[1].y- _v[0].y), this); - _rectificationMarkerOrig = std::make_shared(QRect(_v[0].x, _v[0].y, 10, 10), this); - _rectificationMarkerEnd = std::make_shared(QRect(_v[1].x, _v[1].y, 10, 10), this); - _rectificationMarkerOrig->setBrush(_brush); - _rectificationMarkerEnd->setBrush(_brush); + _v = (dynamic_cast(getModel()))->getVertices(); + _rectification = std::make_shared( + QRect(_v[0].x, _v[0].y, _v[1].x - _v[0].x, _v[1].y - _v[0].y), + this); + _rectificationMarkerOrig = std::make_shared( + QRect(_v[0].x, _v[0].y, 10, 10), + this); + _rectificationMarkerEnd = std::make_shared( + QRect(_v[1].x, _v[1].y, 10, 10), + this); + _rectificationMarkerOrig->setBrush(_brush); + _rectificationMarkerEnd->setBrush(_brush); } EllipseDescriptor::~EllipseDescriptor() { } -void EllipseDescriptor::setBrush(QBrush brush) { - _brush = brush; - _rectificationMarkerOrig->setBrush(_brush); - _rectificationMarkerEnd->setBrush(_brush); +void EllipseDescriptor::setBrush(QBrush brush) +{ + _brush = brush; + _rectificationMarkerOrig->setBrush(_brush); + _rectificationMarkerEnd->setBrush(_brush); } -void EllipseDescriptor::updateRect() { - setRect(getRect()); +void EllipseDescriptor::updateRect() +{ + setRect(getRect()); } -void EllipseDescriptor::setRect(std::vector rect) { - if(rect.size() >= 2){ - _v = (dynamic_cast(getModel()))->getVertices(); - updateEllipse(); - } +void EllipseDescriptor::setRect(std::vector rect) +{ + if (rect.size() >= 2) { + _v = (dynamic_cast(getModel()))->getVertices(); + updateEllipse(); + } } -void EllipseDescriptor::receiveDragUpdate(BiotrackerTypes::AreaType vectorType, int id, double x, double y) { +void EllipseDescriptor::receiveDragUpdate(BiotrackerTypes::AreaType vectorType, + int id, + double x, + double y) +{ int atype = (dynamic_cast(getModel()))->getAreaType(); if (atype == vectorType) { _dragVectorId = id; - _drag = QPoint(x, y); - } - else { + _drag = QPoint(x, y); + } else { _dragVectorId = -1; } update(); } -std::vector EllipseDescriptor::getRect() { - return (dynamic_cast(getModel()))->getVertices(); +std::vector EllipseDescriptor::getRect() +{ + return (dynamic_cast(getModel()))->getVertices(); } - -void EllipseDescriptor::getNotified() { - +void EllipseDescriptor::getNotified() +{ } QRectF EllipseDescriptor::boundingRect() const { - return QRect(10, 10, 10, 10); + return QRect(10, 10, 10, 10); } -bool isInverted(int x1, int y1, int x2, int y2) { +bool isInverted(int x1, int y1, int x2, int y2) +{ if ((x1 > x2 && y1 < y2) || (x1 < x2 && y1 > y2)) { return true; } return false; } -void EllipseDescriptor::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +void EllipseDescriptor::paint(QPainter* painter, + const QStyleOptionGraphicsItem* option, + QWidget* widget) { - if (!_isInit) - init(); + if (!_isInit) + init(); - //TODO remove hardcoding and code duplication + // TODO remove hardcoding and code duplication if (_dragVectorId >= 0) { QColor transparentGray = Qt::gray; transparentGray.setAlphaF(0.75); painter->setPen(QPen(transparentGray, 1, Qt::SolidLine)); painter->drawRect(_drag.x(), _drag.y(), 10, 10); - auto fst = _dragVectorId != 0 ? _rectificationMarkerOrig : _rectificationMarkerEnd; - bool inv = isInverted(fst->rect().x(), fst->rect().y(), _drag.x(), _drag.y()); + auto fst = _dragVectorId != 0 ? _rectificationMarkerOrig + : _rectificationMarkerEnd; + bool inv = + isInverted(fst->rect().x(), fst->rect().y(), _drag.x(), _drag.y()); int x = fst->rect().x() + (_drag.x() - fst->rect().x()) / 2.0; int y = fst->rect().y() + (_drag.y() - fst->rect().y()) / 2.0; - if (inv) { - //Create a canvas to draw on + // Create a canvas to draw on QImage image(_vdimX, _vdimY, QImage::Format_ARGB32_Premultiplied); image.fill(Qt::transparent); QPainter p(&image); - //Create dark rect which spans the screen + // Create dark rect which spans the screen p.setCompositionMode(QPainter::CompositionMode_SourceOver); - QRectF r(0,0, _vdimX, _vdimY); + QRectF r(0, 0, _vdimX, _vdimY); QColor b; - b.setRgb(0,0,0, 200); + b.setRgb(0, 0, 0, 200); QBrush brush(b); p.fillRect(r, brush); p.drawRect(r); - //Cut out the rectangle + // Cut out the rectangle p.setCompositionMode(QPainter::CompositionMode_DestinationOut); b.setNamedColor("white"); b.setAlpha(125); QBrush bbb(b); p.setBrush(bbb); - p.drawEllipse(QRect(fst->rect().x(), fst->rect().y(), _drag.x() - fst->rect().x(), _drag.y() - fst->rect().y())); - - //Draw canvas onto the actual image - painter->setOpacity(0.5); //mixed with the previous alphas! - painter->drawImage(0,0, image); - } - else - { - //This part is way simpler, as we only need to draw a somewhat transparent & filled ellipse + p.drawEllipse(QRect(fst->rect().x(), + fst->rect().y(), + _drag.x() - fst->rect().x(), + _drag.y() - fst->rect().y())); + + // Draw canvas onto the actual image + painter->setOpacity(0.5); // mixed with the previous alphas! + painter->drawImage(0, 0, image); + } else { + // This part is way simpler, as we only need to draw a somewhat + // transparent & filled ellipse QColor b; b.setNamedColor("black"); b.setAlpha(125); QBrush brush(b); painter->setBrush(brush); painter->setOpacity(0.5); - painter->drawEllipse(QRect(fst->rect().x(), fst->rect().y(), _drag.x() - fst->rect().x(), _drag.y() - fst->rect().y())); + painter->drawEllipse(QRect(fst->rect().x(), + fst->rect().y(), + _drag.x() - fst->rect().x(), + _drag.y() - fst->rect().y())); } } } -bool EllipseDescriptor::sceneEventFilter(QGraphicsItem *watched, QEvent *event) { - return 1; +bool EllipseDescriptor::sceneEventFilter(QGraphicsItem* watched, QEvent* event) +{ + return 1; } diff --git a/Src/View/AreaDesciptor/EllipseDescriptor.h b/Src/View/AreaDesciptor/EllipseDescriptor.h index 27011fc7..89ead7a1 100644 --- a/Src/View/AreaDesciptor/EllipseDescriptor.h +++ b/Src/View/AreaDesciptor/EllipseDescriptor.h @@ -8,50 +8,57 @@ class EllipseDescriptor : public AreaDescriptor { Q_OBJECT public: - EllipseDescriptor(IController *controller = 0, IModel *model = 0); - ~EllipseDescriptor(); - void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; + EllipseDescriptor(IController* controller = 0, IModel* model = 0); + ~EllipseDescriptor(); + void paint(QPainter* painter, + const QStyleOptionGraphicsItem* option, + QWidget* widget) override; - QRectF boundingRect() const override; - void setBrush(QBrush brush) override; + QRectF boundingRect() const override; + void setBrush(QBrush brush) override; + void setRect(std::vector rect) override; + std::vector getRect() override; - void setRect(std::vector rect) override; - std::vector getRect() override; + void updateRect() override; - void updateRect() override; - - // IViewTrackedComponent interface - public Q_SLOTS: - void getNotified(); - void receiveDragUpdate(BiotrackerTypes::AreaType vectorType, int id, double x, double y); + // IViewTrackedComponent interface +public Q_SLOTS: + void getNotified(); + void receiveDragUpdate(BiotrackerTypes::AreaType vectorType, + int id, + double x, + double y); protected: - bool sceneEventFilter(QGraphicsItem * watched, QEvent * event) override; + bool sceneEventFilter(QGraphicsItem* watched, QEvent* event) override; private: - void init(); - void updateEllipse(); - bool _isInit; - - std::vector _v; - //float _ellipseRotation; - - QGraphicsItem *_watchingDrag; - QBrush _brush; - - //Rects - std::shared_ptr _rectification; - std::shared_ptr _rectificationMarkerOrig; - std::shared_ptr _rectificationMarkerEnd; - - int _dragVectorId; - QPoint _drag; - - // IView interface -public: - void setNewModel(IModel *model) override { setModel(model); }; -protected: - void connectModelView() override {}; -}; + void init(); + void updateEllipse(); + bool _isInit; + + std::vector _v; + // float _ellipseRotation; + + QGraphicsItem* _watchingDrag; + QBrush _brush; + + // Rects + std::shared_ptr _rectification; + std::shared_ptr _rectificationMarkerOrig; + std::shared_ptr _rectificationMarkerEnd; + int _dragVectorId; + QPoint _drag; + + // IView interface +public: + void setNewModel(IModel* model) override + { + setModel(model); + }; + +protected: + void connectModelView() override{}; +}; diff --git a/Src/View/AreaDesciptor/RectDescriptor.cpp b/Src/View/AreaDesciptor/RectDescriptor.cpp index 06501cc5..de793b33 100644 --- a/Src/View/AreaDesciptor/RectDescriptor.cpp +++ b/Src/View/AreaDesciptor/RectDescriptor.cpp @@ -16,111 +16,131 @@ double orientation(cv::Point2f p1, cv::Point2f p2) return std::atan2(p1.y - p2.y, p1.x - p2.x); } -RectDescriptor::RectDescriptor(IController *controller, IModel *model) : - AreaDescriptor(controller, model) +RectDescriptor::RectDescriptor(IController* controller, IModel* model) +: AreaDescriptor(controller, model) { _dragVectorId = -1; - _dragType = BiotrackerTypes::AreaType::NONE; - setAcceptHoverEvents(true); + _dragType = BiotrackerTypes::AreaType::NONE; + setAcceptHoverEvents(true); - _brush = QBrush(Qt::blue); + _brush = QBrush(Qt::blue); - _v = (dynamic_cast(getModel()))->getVertices(); + _v = (dynamic_cast(getModel()))->getVertices(); setRect(_v); - _isInit = false; + _isInit = false; } -void RectDescriptor::init() { - for (int i = 0; i < 4; i++) { - _rectification[i]->setAcceptHoverEvents(true); - _rectification[i]->installSceneEventFilter(this); - } +void RectDescriptor::init() +{ + for (int i = 0; i < 4; i++) { + _rectification[i]->setAcceptHoverEvents(true); + _rectification[i]->installSceneEventFilter(this); + } } -void RectDescriptor::setBrush(QBrush brush) { - for (int i = 0; i < 4; i++) { - _rectification[i]->setBrush(brush); - } - _brush = brush; +void RectDescriptor::setBrush(QBrush brush) +{ + for (int i = 0; i < 4; i++) { + _rectification[i]->setBrush(brush); + } + _brush = brush; } -bool RectDescriptor::inShape(QPoint p) { - return false; +bool RectDescriptor::inShape(QPoint p) +{ + return false; } -void RectDescriptor::updateRect() { - setRect(getRect()); +void RectDescriptor::updateRect() +{ + setRect(getRect()); } -void RectDescriptor::setRect(std::vector rect) { - std::vector> rectification; - std::vector> rectificationLines; +void RectDescriptor::setRect(std::vector rect) +{ + std::vector> rectification; + std::vector> rectificationLines; std::vector> rectificationNumbers; - _v = (dynamic_cast(getModel()))->getVertices(); + _v = (dynamic_cast(getModel()))->getVertices(); - for (int i = 0; i < 4; i++) { - std::shared_ptr ri = std::make_shared(QRect(rect[i].x - 10, rect[i].y - 10, 20, 20), this); - ri->setBrush(_brush); - rectification.push_back(ri); - //Numbers at corners + for (int i = 0; i < 4; i++) { + std::shared_ptr ri = + std::make_shared( + QRect(rect[i].x - 10, rect[i].y - 10, 20, 20), + this); + ri->setBrush(_brush); + rectification.push_back(ri); + // Numbers at corners if ((dynamic_cast(getModel()))->getShowNumbers()) { - std::shared_ptr ti = std::make_shared(QString::number(i), this); + std::shared_ptr ti = + std::make_shared(QString::number(i), + this); ti->setPos(_v[i].x + 10, _v[i].y + 10); ti->setFont(QFont("Arial", 20)); rectificationNumbers.push_back(ti); } - } + } - for (int i = 0; i < 4; i++) { + for (int i = 0; i < 4; i++) { - auto fst = rectification[i]; - auto snd = rectification[(i + 1) % 4]; + auto fst = rectification[i]; + auto snd = rectification[(i + 1) % 4]; - std::shared_ptr ri = std::make_shared( - QLine(fst->rect().x() + 10, fst->rect().y() + 10, snd->rect().x() + 10, snd->rect().y() + 10), this); + std::shared_ptr ri = + std::make_shared(QLine(fst->rect().x() + 10, + fst->rect().y() + 10, + snd->rect().x() + 10, + snd->rect().y() + 10), + this); rectificationLines.push_back(ri); if ((dynamic_cast(getModel()))->getShowNumbers()) { std::string label = "???"; if (i % 2 == 0) { label = std::to_string(_cfg->RectificationHeight); - label.erase(label.find_last_not_of('0') + 1, std::string::npos); - } - else { + label.erase(label.find_last_not_of('0') + 1, + std::string::npos); + } else { label = std::to_string(_cfg->RectificationWidth); - label.erase(label.find_last_not_of('0') + 1, std::string::npos); + label.erase(label.find_last_not_of('0') + 1, + std::string::npos); } - std::shared_ptr ti = std::make_shared(label.c_str(), this); + std::shared_ptr ti = + std::make_shared(label.c_str(), this); cv::Point2f a(fst->rect().x() + 10, fst->rect().y() + 10); cv::Point2f b(snd->rect().x() + 10, snd->rect().y() + 10); - double alpha = orientation(a, b) * 180 / CV_PI; - //Fix upside down text - alpha = alpha > 0 ? 180 - alpha : alpha; + double alpha = orientation(a, b) * 180 / CV_PI; + // Fix upside down text + alpha = alpha > 0 ? 180 - alpha : alpha; cv::Point2f c = a + (b - a) * 0.5; ti->setPos(c.x, c.y); ti->setFont(QFont("Arial", 20)); - ti->setRotation(-1*alpha); + ti->setRotation(-1 * alpha); rectificationNumbers.push_back(ti); } - } - _rectification = rectification; - _rectificationLines = rectificationLines; + } + _rectification = rectification; + _rectificationLines = rectificationLines; _rectificationNumbers = rectificationNumbers; } -std::vector RectDescriptor::getRect() { - return (dynamic_cast(getModel()))->getVertices(); +std::vector RectDescriptor::getRect() +{ + return (dynamic_cast(getModel()))->getVertices(); } -void RectDescriptor::receiveDragUpdate(BiotrackerTypes::AreaType vectorType, int id, double x, double y) { +void RectDescriptor::receiveDragUpdate(BiotrackerTypes::AreaType vectorType, + int id, + double x, + double y) +{ _dragType = (dynamic_cast(getModel()))->getAreaType(); if (_dragType == vectorType) { _dragVectorId = id; - _drag = QPoint(x,y); - } - else { + _drag = QPoint(x, y); + } else { _dragVectorId = -1; } update(); @@ -130,51 +150,63 @@ RectDescriptor::~RectDescriptor() { } -void RectDescriptor::getNotified() { - +void RectDescriptor::getNotified() +{ } QRectF RectDescriptor::boundingRect() const { - return QRect(10,10,10,10); + return QRect(10, 10, 10, 10); } -void RectDescriptor::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +void RectDescriptor::paint(QPainter* painter, + const QStyleOptionGraphicsItem* option, + QWidget* widget) { - if (!_isInit) - init(); + if (!_isInit) + init(); - //We want smooth lines! + // We want smooth lines! painter->setRenderHint(QPainter::Antialiasing); - //TODO remove hardcoding and code duplication + // TODO remove hardcoding and code duplication if (_dragVectorId >= 0 && _dragType != BiotrackerTypes::AreaType::NONE) { QColor transparentGray = Qt::gray; transparentGray.setAlphaF(0.75); - painter->setPen(QPen(transparentGray, 1, Qt::SolidLine)); - painter->drawRect(_drag.x()-10, _drag.y()-10, 20, 20); + painter->setPen(QPen(transparentGray, 1, Qt::SolidLine)); + painter->drawRect(_drag.x() - 10, _drag.y() - 10, 20, 20); int fstId = (_dragVectorId - 1) % 4; - fstId = (fstId == -1 ? 3 : fstId); - auto fst = _rectification[fstId]; - auto snd = _rectification[(_dragVectorId + 1) % 4]; - painter->drawLine(QLine(fst->rect().x() + 10, fst->rect().y() + 10, _drag.x(), _drag.y())); - painter->drawLine(QLine(snd->rect().x() + 10, snd->rect().y() + 10, _drag.x(), _drag.y())); + fstId = (fstId == -1 ? 3 : fstId); + auto fst = _rectification[fstId]; + auto snd = _rectification[(_dragVectorId + 1) % 4]; + painter->drawLine(QLine(fst->rect().x() + 10, + fst->rect().y() + 10, + _drag.x(), + _drag.y())); + painter->drawLine(QLine(snd->rect().x() + 10, + snd->rect().y() + 10, + _drag.x(), + _drag.y())); } } -void RectDescriptor::updateLinePositions() { +void RectDescriptor::updateLinePositions() +{ - for (int i = 0; i < 4; i++) { + for (int i = 0; i < 4; i++) { - auto fst = _rectification[i]; - auto snd = _rectification[(i + 1) % 4]; - auto ln = _rectificationLines[i]; - ln->setLine(QLine(fst->rect().x() + 10, fst->rect().y() + 10, snd->rect().x() + 10, snd->rect().y() + 10)); - } - + auto fst = _rectification[i]; + auto snd = _rectification[(i + 1) % 4]; + auto ln = _rectificationLines[i]; + ln->setLine(QLine(fst->rect().x() + 10, + fst->rect().y() + 10, + snd->rect().x() + 10, + snd->rect().y() + 10)); + } } -bool RectDescriptor::sceneEventFilter(QGraphicsItem *watched, QEvent *event) { +bool RectDescriptor::sceneEventFilter(QGraphicsItem* watched, QEvent* event) +{ - return 0; + return 0; } diff --git a/Src/View/AreaDesciptor/RectDescriptor.h b/Src/View/AreaDesciptor/RectDescriptor.h index 4499390b..270fc7d6 100644 --- a/Src/View/AreaDesciptor/RectDescriptor.h +++ b/Src/View/AreaDesciptor/RectDescriptor.h @@ -10,54 +10,63 @@ class RectDescriptor : public AreaDescriptor { Q_OBJECT public: - RectDescriptor(IController *controller = 0, IModel *model = 0); - ~RectDescriptor(); - void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; + RectDescriptor(IController* controller = 0, IModel* model = 0); + ~RectDescriptor(); + void paint(QPainter* painter, + const QStyleOptionGraphicsItem* option, + QWidget* widget) override; - QRectF boundingRect() const override; + QRectF boundingRect() const override; - bool inShape(QPoint p); + bool inShape(QPoint p); - void setBrush(QBrush brush) override; - void setRect(std::vector rect) override; - std::vector getRect() override; + void setBrush(QBrush brush) override; + void setRect(std::vector rect) override; + std::vector getRect() override; - void updateRect() override; - - // IViewTrackedComponent interface + void updateRect() override; + + // IViewTrackedComponent interface public Q_SLOTS: - void getNotified(); - void receiveDragUpdate(BiotrackerTypes::AreaType vectorType, int id, double x, double y); + void getNotified(); + void receiveDragUpdate(BiotrackerTypes::AreaType vectorType, + int id, + double x, + double y); protected: - bool sceneEventFilter(QGraphicsItem * watched, QEvent * event) override; - void updateLinePositions(); + bool sceneEventFilter(QGraphicsItem* watched, QEvent* event) override; + void updateLinePositions(); private: - void init(); - bool _isInit; + void init(); + bool _isInit; - QGraphicsItem *_watchingDrag; - int _dragX; - int _dragY; + QGraphicsItem* _watchingDrag; + int _dragX; + int _dragY; - std::vector _v; + std::vector _v; - //Rects - std::vector> _rectification; + // Rects + std::vector> _rectification; std::vector> _rectificationLines; - std::vector> _rectificationNumbers; + std::vector> + _rectificationNumbers; - QBrush _brush; + QBrush _brush; BiotrackerTypes::AreaType _dragType; - int _dragVectorId; - QPoint _drag; + int _dragVectorId; + QPoint _drag; - // IView interface + // IView interface public: - void setNewModel(IModel *model) override { setModel(model); }; + void setNewModel(IModel* model) override + { + setModel(model); + }; + protected: - void connectModelView() override {}; + void connectModelView() override{}; }; - diff --git a/Src/View/CameraDevice.cpp b/Src/View/CameraDevice.cpp index 63e3eefb..648dc1c4 100644 --- a/Src/View/CameraDevice.cpp +++ b/Src/View/CameraDevice.cpp @@ -5,14 +5,15 @@ #include "util/types.h" #include "util/camera/base.h" #if HAS_PYLON -#include "util/camera/pylon.h" + #include "util/camera/pylon.h" #endif #include #include #include "opencv2/highgui/highgui.hpp" -CameraDevice::CameraDevice(QWidget *parent) : QWidget(parent), - ui(new Ui::CameraDevice) +CameraDevice::CameraDevice(QWidget* parent) +: QWidget(parent) +, ui(new Ui::CameraDevice) { ui->setupUi(this); m_ximeaId = -1; @@ -34,7 +35,7 @@ CameraConfiguration CameraDevice::grabUICameraConfiguration() std::string sx = ui->lineEdit->text().toStdString(); std::string sy = ui->lineEdit_2->text().toStdString(); std::string sf = ui->lineEdit_3->text().toStdString(); - int x, y, f; + int x, y, f; x = (sx == "Default" ? -1 : std::stoi(sx)); y = (sy == "Default" ? -1 : std::stoi(sy)); f = (sf == "Default" ? -1 : std::stoi(sf)); @@ -46,7 +47,7 @@ CameraConfiguration CameraDevice::grabUICameraConfiguration() void CameraDevice::on_buttonBox_accepted() { CameraConfiguration conf = grabUICameraConfiguration(); - Q_EMIT emitSelectedCameraDevice(conf); + Q_EMIT emitSelectedCameraDevice(conf); this->close(); } @@ -56,17 +57,16 @@ void CameraDevice::on_showPreviewButton_clicked() auto conf = grabUICameraConfiguration(); cv::Mat image; - switch (conf._selector.type) - { - case CameraType::OpenCV: - { + switch (conf._selector.type) { + case CameraType::OpenCV: { if (conf._selector.index == cv::CAP_XIAPI) { m_capture.open(cv::CAP_XIAPI); } else { m_capture.open(conf._selector.name); } - for (auto num_tries = 0; !m_capture.isOpened() && num_tries < 50; ++num_tries) + for (auto num_tries = 0; !m_capture.isOpened() && num_tries < 50; + ++num_tries) std::this_thread::sleep_for(std::chrono::milliseconds(100)); if (conf._width != -1) @@ -76,22 +76,22 @@ void CameraDevice::on_showPreviewButton_clicked() if (conf._fps != -1) m_capture.set(cv::CAP_PROP_FPS, conf._fps); - if (!m_capture.isOpened()) - { + if (!m_capture.isOpened()) { ui->label_NoImage->setText("Error loading camera"); return; } cv::Mat mat; - for (auto i = 0; i < 10; ++i) - { + for (auto i = 0; i < 10; ++i) { m_capture.grab(); m_capture.retrieve(mat); } - auto height = conf._height != -1 ? conf._height : ui->label_NoImage->height(); - auto ar = mat.rows ? static_cast(mat.cols) / mat.rows : 1; - auto width = conf._width != -1 ? conf._width : static_cast(height * ar); + auto height = conf._height != -1 ? conf._height + : ui->label_NoImage->height(); + auto ar = mat.rows ? static_cast(mat.cols) / mat.rows : 1; + auto width = conf._width != -1 ? conf._width + : static_cast(height * ar); cv::Mat scaled; cv::resize(mat, scaled, cv::Size{width, height}); @@ -99,21 +99,26 @@ void CameraDevice::on_showPreviewButton_clicked() cv::cvtColor(scaled, scaled, cv::COLOR_GRAY2RGB); cv::cvtColor(scaled, scaled, cv::COLOR_BGR2RGB); - ui->label_NoImage->setPixmap(QPixmap::fromImage(QImage(scaled.data, scaled.cols, scaled.rows, static_cast(scaled.step1()), QImage::Format_RGB888))); + ui->label_NoImage->setPixmap( + QPixmap::fromImage(QImage(scaled.data, + scaled.cols, + scaled.rows, + static_cast(scaled.step1()), + QImage::Format_RGB888))); m_capture.release(); break; } #if HAS_PYLON - case CameraType::Pylon: - { + case CameraType::Pylon: { Pylon::PylonAutoInitTerm pylon; - auto camera = Pylon::CInstantCamera{getPylonDevice(conf._selector.index)}; + auto camera = Pylon::CInstantCamera{ + getPylonDevice(conf._selector.index)}; camera.Open(); - for (auto num_tries = 0; !camera.IsOpen() && num_tries < 50; ++num_tries) + for (auto num_tries = 0; !camera.IsOpen() && num_tries < 50; + ++num_tries) std::this_thread::sleep_for(std::chrono::milliseconds(100)); - if (!camera.IsOpen()) - { + if (!camera.IsOpen()) { ui->label_NoImage->setText("Error loading camera"); return; } @@ -122,14 +127,21 @@ void CameraDevice::on_showPreviewButton_clicked() camera.GrabOne(5000, grab_result); auto view = toOpenCV(grab_result); - auto height = conf._height != -1 ? conf._height : ui->label_NoImage->height(); - auto ar = view.rows ? static_cast(view.cols) / view.rows : 1; - auto width = conf._width != -1 ? conf._width : static_cast(height * ar); + auto height = conf._height != -1 ? conf._height + : ui->label_NoImage->height(); + auto ar = view.rows ? static_cast(view.cols) / view.rows : 1; + auto width = conf._width != -1 ? conf._width + : static_cast(height * ar); cv::Mat scaled; cv::resize(view, scaled, cv::Size{width, height}); - ui->label_NoImage->setPixmap(QPixmap::fromImage(QImage(scaled.data, scaled.cols, scaled.rows, static_cast(scaled.step1()), QImage::Format_RGB888))); + ui->label_NoImage->setPixmap( + QPixmap::fromImage(QImage(scaled.data, + scaled.cols, + scaled.rows, + static_cast(scaled.step1()), + QImage::Format_RGB888))); break; } #endif @@ -145,20 +157,21 @@ void CameraDevice::on_comboBox_currentIndexChanged(int index) void CameraDevice::listAllCameras() { cameras = QCameraInfo::availableCameras(); - for (int index = 0; index < cameras.size(); ++index) - { - ui->comboBox->addItem( - cameras[index].description(), - QVariant::fromValue(CameraSelector{CameraType::OpenCV, index, cameras[index].deviceName().toStdString()})); + for (int index = 0; index < cameras.size(); ++index) { + ui->comboBox->addItem(cameras[index].description(), + QVariant::fromValue(CameraSelector{ + CameraType::OpenCV, + index, + cameras[index].deviceName().toStdString()})); } { cv::VideoCapture ximea_camera(cv::CAP_XIAPI); - if (ximea_camera.isOpened()) - { + if (ximea_camera.isOpened()) { ui->comboBox->addItem( "XIMEA default", - QVariant::fromValue(CameraSelector{CameraType::OpenCV, cv::CAP_XIAPI, ""})); + QVariant::fromValue( + CameraSelector{CameraType::OpenCV, cv::CAP_XIAPI, ""})); } } @@ -166,15 +179,15 @@ void CameraDevice::listAllCameras() { Pylon::PylonAutoInitTerm pylon; - auto &factory = Pylon::CTlFactory::GetInstance(); + auto& factory = Pylon::CTlFactory::GetInstance(); Pylon::DeviceInfoList_t devices; factory.EnumerateDevices(devices); - for (int index = 0; index < devices.size(); ++index) - { + for (int index = 0; index < devices.size(); ++index) { ui->comboBox->addItem( QString{devices[index].GetFriendlyName()}, - QVariant::fromValue(CameraSelector{CameraType::Pylon, index, ""})); + QVariant::fromValue( + CameraSelector{CameraType::Pylon, index, ""})); } } #endif diff --git a/Src/View/CameraDevice.h b/Src/View/CameraDevice.h index 4bbc8b5a..894d8700 100644 --- a/Src/View/CameraDevice.h +++ b/Src/View/CameraDevice.h @@ -10,8 +10,9 @@ #include "util/camera/base.h" #include -namespace Ui { -class CameraDevice; +namespace Ui +{ + class CameraDevice; } class CameraDevice : public QWidget @@ -19,13 +20,13 @@ class CameraDevice : public QWidget Q_OBJECT public: - explicit CameraDevice(QWidget *parent = 0); + explicit CameraDevice(QWidget* parent = 0); ~CameraDevice(); private Q_SLOTS: void on_buttonBox_accepted(); - void on_showPreviewButton_clicked(); + void on_showPreviewButton_clicked(); void on_comboBox_currentIndexChanged(int index); @@ -35,19 +36,19 @@ private Q_SLOTS: void emitSelectedCameraDevice(CameraConfiguration conf); private: - CameraConfiguration grabUICameraConfiguration(); - void listAllCameras(); + CameraConfiguration grabUICameraConfiguration(); + void listAllCameras(); private: - Ui::CameraDevice *ui; - cv::VideoCapture m_capture; + Ui::CameraDevice* ui; + cv::VideoCapture m_capture; - QPointer< QCamera > camera; - QPointer< QCameraViewfinder > viewfinder; + QPointer camera; + QPointer viewfinder; QList cameras; - int m_ximeaId; + int m_ximeaId; }; #endif // CAMERADEVICE_H diff --git a/Src/View/ComponentShape.cpp b/Src/View/ComponentShape.cpp index e23e6d49..df935d2e 100644 --- a/Src/View/ComponentShape.cpp +++ b/Src/View/ComponentShape.cpp @@ -31,978 +31,1110 @@ #include "View/Utility/Tracer.h" - /* -* This is the cpp file of the ComponentShape class -* Collapse/Fold all methods to have a better overview. -*/ - -ComponentShape::ComponentShape(QGraphicsObject* parent, - IModelTrackedTrajectory* trajectory, int id) : - QGraphicsObject(parent), m_trajectory(trajectory), m_id(id), m_parent(parent) + * This is the cpp file of the ComponentShape class + * Collapse/Fold all methods to have a better overview. + */ + +ComponentShape::ComponentShape(QGraphicsObject* parent, + IModelTrackedTrajectory* trajectory, + int id) +: QGraphicsObject(parent) +, m_trajectory(trajectory) +, m_id(id) +, m_parent(parent) { - setData(0, m_id); - setData(1, "point"); - - m_polygons = QList(); - m_useDefaultDimensions = true; - m_penWidth = 2; - m_transparency = 255; - m_penStyle = Qt::SolidLine; - m_penStylePrev = Qt::SolidLine; - m_marked = false; - - //set default permissions - m_pMovable = true; - m_pRemovable = true; - m_pSwappable = true; - m_pRotatable = true; - - m_fixed = false; - m_currentFramenumber = 0; - m_rotation = 0; - //m_trajectoryWasActiveOnce = false; - - //create tracing layer - m_tracingLayer = new QGraphicsRectItem(); - m_tracingLayer->setZValue(3); - this->scene()->addItem(m_tracingLayer); - - //create orientation line - m_rotationLine = QLineF(); - - //set flags - setFlag(ItemIsMovable); - setFlag(ItemIsSelectable); - setAcceptedMouseButtons(Qt::LeftButton); - - setVisible(true); + setData(0, m_id); + setData(1, "point"); + + m_polygons = QList(); + m_useDefaultDimensions = true; + m_penWidth = 2; + m_transparency = 255; + m_penStyle = Qt::SolidLine; + m_penStylePrev = Qt::SolidLine; + m_marked = false; + + // set default permissions + m_pMovable = true; + m_pRemovable = true; + m_pSwappable = true; + m_pRotatable = true; + + m_fixed = false; + m_currentFramenumber = 0; + m_rotation = 0; + // m_trajectoryWasActiveOnce = false; + + // create tracing layer + m_tracingLayer = new QGraphicsRectItem(); + m_tracingLayer->setZValue(3); + this->scene()->addItem(m_tracingLayer); + + // create orientation line + m_rotationLine = QLineF(); + + // set flags + setFlag(ItemIsMovable); + setFlag(ItemIsSelectable); + setAcceptedMouseButtons(Qt::LeftButton); + + setVisible(true); } -ComponentShape::~ComponentShape() { - delete m_tracingLayer; +ComponentShape::~ComponentShape() +{ + delete m_tracingLayer; } -//*****************************QGraphicsItem interface*************************************** +//*****************************QGraphicsItem +// interface*************************************** QRectF ComponentShape::boundingRect() const { - if (this->data(1) == "ellipse" || this->data(1) == "point" || this->data(1) == "rectangle") { - return QRectF(0, 0, m_w, m_h); - } - else if (this->data(1) == "polygon") { - //outer polygon bounding rect - return m_polygons[0].boundingRect(); - } - else { - //Note: This log might not appear (on console) as the application dies of assert before the buffer is served - qDebug() << "Could not create a bounding rect for current track " << m_id; - assert(0); - } - + if (this->data(1) == "ellipse" || this->data(1) == "point" || + this->data(1) == "rectangle") { + return QRectF(0, 0, m_w, m_h); + } else if (this->data(1) == "polygon") { + // outer polygon bounding rect + return m_polygons[0].boundingRect(); + } else { + // Note: This log might not appear (on console) as the application dies + // of assert before the buffer is served + qDebug() << "Could not create a bounding rect for current track " + << m_id; + assert(0); + } } QPainterPath ComponentShape::shape() const { - QPainterPath path; - if (this->data(1) == "ellipse") { - path.addEllipse(0, 0, m_w, m_h); - } - else if (this->data(1) == "point") { - int dim = m_w <= m_h ? m_w : m_h; - // path.addEllipse(0, 0, dim , dim); - QRectF ellipse; - //ellipse = QRectF(0, m_h - m_w , m_w, m_w); - qreal origin_x = m_rotationLine.p1().x() - dim / 2; - qreal origin_y = m_rotationLine.p1().y() - dim / 2; - ellipse = QRectF(origin_x, origin_y, dim, dim); - - path.addEllipse(ellipse); - - } - else if (this->data(1) == "rectangle") { - path.addRect(0, 0, m_w, m_h); - } - else if (this->data(1) == "polygon") { - //outer polygon - path.addPolygon(m_polygons[0]); - } - else { - qDebug() << "Could not create a interaction area for trajectory " << m_id; - assert(0); - } - return path; + QPainterPath path; + if (this->data(1) == "ellipse") { + path.addEllipse(0, 0, m_w, m_h); + } else if (this->data(1) == "point") { + int dim = m_w <= m_h ? m_w : m_h; + // path.addEllipse(0, 0, dim , dim); + QRectF ellipse; + // ellipse = QRectF(0, m_h - m_w , m_w, m_w); + qreal origin_x = m_rotationLine.p1().x() - dim / 2; + qreal origin_y = m_rotationLine.p1().y() - dim / 2; + ellipse = QRectF(origin_x, origin_y, dim, dim); + + path.addEllipse(ellipse); + + } else if (this->data(1) == "rectangle") { + path.addRect(0, 0, m_w, m_h); + } else if (this->data(1) == "polygon") { + // outer polygon + path.addPolygon(m_polygons[0]); + } else { + qDebug() << "Could not create a interaction area for trajectory " + << m_id; + assert(0); + } + return path; } -void ComponentShape::paint(QPainter * painter, - const QStyleOptionGraphicsItem * option, QWidget * widget) +void ComponentShape::paint(QPainter* painter, + const QStyleOptionGraphicsItem* option, + QWidget* widget) { - Q_UNUSED(option); - Q_UNUSED(widget); - - - if (m_currentFramenumber < 0) - return; - //Antialiasing - if (m_antialiasing) { - painter->setRenderHint(QPainter::Antialiasing); - } - - //check if scene is set - if (!(this->scene())) { - qDebug() << "componentscene is null\n"; - } - - QPen pen = QPen(m_penColor, m_penWidth, m_penStyle); - QBrush brush = QBrush(m_brushColor); - painter->setPen(pen); - painter->setBrush(brush); - - // draw orientation line - if (m_orientationLine && !m_rotationLine.isNull()) { - painter->drawLine(m_rotationLine); - } - - //TODO enums for types? - - //draw ellipse - if (this->data(1) == "ellipse") { - QRectF ellipse = QRectF(0, 0, m_w, m_h); - painter->drawEllipse(ellipse); - } - - //draw rectangle - if (this->data(1) == "rectangle") { - QRect rectangle = QRect(0, 0, m_w, m_h); - painter->drawRect(rectangle); - } - - //draw point - //take the smaller of width and height - //a point should always have the same height and width - if (this->data(1) == "point") { - QRectF ellipse; - if (m_w <= m_h) { - //ellipse = QRectF(0, m_h - m_w , m_w, m_w); - qreal origin_x = m_rotationLine.p1().x() - m_w / 2; - qreal origin_y = m_rotationLine.p1().y() - m_w / 2; - ellipse = QRectF(origin_x, origin_y, m_w, m_w); - } - else { - qreal origin_x = m_rotationLine.p1().x() - m_h / 2; - qreal origin_y = m_rotationLine.p1().y() - m_h / 2; - ellipse = QRectF(origin_x, origin_y, m_h, m_h); - } - painter->drawEllipse(ellipse); - } - - //draw polygon - if (this->data(1) == "polygon") { - foreach(QPolygonF polygonF, m_polygons) { - painter->drawPolygon(polygonF); - } - } - - // draw id in center - if (m_showId) { - painter->drawText(this->boundingRect(), Qt::AlignCenter, QString::number(m_id)); - } + Q_UNUSED(option); + Q_UNUSED(widget); + + if (m_currentFramenumber < 0) + return; + // Antialiasing + if (m_antialiasing) { + painter->setRenderHint(QPainter::Antialiasing); + } + + // check if scene is set + if (!(this->scene())) { + qDebug() << "componentscene is null\n"; + } + + QPen pen = QPen(m_penColor, m_penWidth, m_penStyle); + QBrush brush = QBrush(m_brushColor); + painter->setPen(pen); + painter->setBrush(brush); + + // draw orientation line + if (m_orientationLine && !m_rotationLine.isNull()) { + painter->drawLine(m_rotationLine); + } + + // TODO enums for types? + + // draw ellipse + if (this->data(1) == "ellipse") { + QRectF ellipse = QRectF(0, 0, m_w, m_h); + painter->drawEllipse(ellipse); + } + + // draw rectangle + if (this->data(1) == "rectangle") { + QRect rectangle = QRect(0, 0, m_w, m_h); + painter->drawRect(rectangle); + } + + // draw point + // take the smaller of width and height + // a point should always have the same height and width + if (this->data(1) == "point") { + QRectF ellipse; + if (m_w <= m_h) { + // ellipse = QRectF(0, m_h - m_w , m_w, m_w); + qreal origin_x = m_rotationLine.p1().x() - m_w / 2; + qreal origin_y = m_rotationLine.p1().y() - m_w / 2; + ellipse = QRectF(origin_x, origin_y, m_w, m_w); + } else { + qreal origin_x = m_rotationLine.p1().x() - m_h / 2; + qreal origin_y = m_rotationLine.p1().y() - m_h / 2; + ellipse = QRectF(origin_x, origin_y, m_h, m_h); + } + painter->drawEllipse(ellipse); + } + + // draw polygon + if (this->data(1) == "polygon") { + foreach (QPolygonF polygonF, m_polygons) { + painter->drawPolygon(polygonF); + } + } + + // draw id in center + if (m_showId) { + painter->drawText(this->boundingRect(), + Qt::AlignCenter, + QString::number(m_id)); + } } bool ComponentShape::advance() { - return false; + return false; } -void ComponentShape::mousePressEvent(QGraphicsSceneMouseEvent * event) +void ComponentShape::mousePressEvent(QGraphicsSceneMouseEvent* event) { - m_mousePressTime = QTime::currentTime(); - m_mousePressTime.start(); - m_mousePressPos = pos().toPoint(); - - if (event->button() == Qt::LeftButton) { - // handle left mouse button here - setCursor(Qt::ClosedHandCursor); - update(); - } - //pass on - QGraphicsItem::mousePressEvent(event); + m_mousePressTime = QTime::currentTime(); + m_mousePressTime.start(); + m_mousePressPos = pos().toPoint(); + + if (event->button() == Qt::LeftButton) { + // handle left mouse button here + setCursor(Qt::ClosedHandCursor); + update(); + } + // pass on + QGraphicsItem::mousePressEvent(event); } -void ComponentShape::mouseReleaseEvent(QGraphicsSceneMouseEvent * event) +void ComponentShape::mouseReleaseEvent(QGraphicsSceneMouseEvent* event) { - if (event->button() == Qt::LeftButton) { - setCursor(Qt::ArrowCursor); - - QPoint currentPos = this->pos().toPoint(); - int manhattanLength = (currentPos - m_mousePressPos).manhattanLength(); - int moveTime = m_mousePressTime.elapsed(); - if (manhattanLength > 5 || moveTime > 200) { - m_dragged = true; - } - - - if (m_dragged) { - - //broadcast move so other selected elements get moved too - //maybe unconventional and slow but couldn't find another way; Dropevents in view and dropevents in shape didn't seem to work - broadcastMove(); - } - else { - this->setPos(m_mousePressPos); - this->update(); - } - m_dragged = false; - - update(); - } - //pass on - QGraphicsItem::mouseReleaseEvent(event); - + if (event->button() == Qt::LeftButton) { + setCursor(Qt::ArrowCursor); + + QPoint currentPos = this->pos().toPoint(); + int manhattanLength = (currentPos - m_mousePressPos).manhattanLength(); + int moveTime = m_mousePressTime.elapsed(); + if (manhattanLength > 5 || moveTime > 200) { + m_dragged = true; + } + + if (m_dragged) { + + // broadcast move so other selected elements get moved too + // maybe unconventional and slow but couldn't find another way; + // Dropevents in view and dropevents in shape didn't seem to work + broadcastMove(); + } else { + this->setPos(m_mousePressPos); + this->update(); + } + m_dragged = false; + + update(); + } + // pass on + QGraphicsItem::mouseReleaseEvent(event); } -void ComponentShape::mouseMoveEvent(QGraphicsSceneMouseEvent * event) { - //pass on - QGraphicsItem::mouseMoveEvent(event); +void ComponentShape::mouseMoveEvent(QGraphicsSceneMouseEvent* event) +{ + // pass on + QGraphicsItem::mouseMoveEvent(event); } QVariant ComponentShape::itemChange(GraphicsItemChange change, - const QVariant &value) + const QVariant& value) { - if (change == ItemSelectedHasChanged && scene()) { - if (this->isSelected()) { - m_penColorLast = m_penColor; - m_penColor = Qt::red; - m_penStylePrev = m_penStyle; - if (m_fixed) { - m_penStyle = Qt::DashDotLine; - } - else { - m_penStyle = Qt::DashLine; - } - this->setZValue(2); - trace(); - update(); - } - else { - m_penColor = m_penColorLast; - m_penStyle = m_penStylePrev; - this->setZValue(0); - trace(); - update(); - - } - } - return QGraphicsItem::itemChange(change, value); + if (change == ItemSelectedHasChanged && scene()) { + if (this->isSelected()) { + m_penColorLast = m_penColor; + m_penColor = Qt::red; + m_penStylePrev = m_penStyle; + if (m_fixed) { + m_penStyle = Qt::DashDotLine; + } else { + m_penStyle = Qt::DashLine; + } + this->setZValue(2); + trace(); + update(); + } else { + m_penColor = m_penColorLast; + m_penStyle = m_penStylePrev; + this->setZValue(0); + trace(); + update(); + } + } + return QGraphicsItem::itemChange(change, value); } -void ComponentShape::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) +void ComponentShape::contextMenuEvent(QGraphicsSceneContextMenuEvent* event) { - QMenu menu; - - /* - create the info box - */ - QWidgetAction* infoBox = new QWidgetAction(this); - - QString info = QString("ID: "); - info.append(QString::number(m_id)); - QLabel* infoLabel = new QLabel(info); - infoLabel->setWordWrap(true); - infoLabel->setStyleSheet("QLabel {font-weight: bold; text-align: center}"); - infoLabel->setAlignment(Qt::AlignCenter); - infoBox->setDefaultWidget(infoLabel); - menu.addAction(infoBox); - - // - menu.addSeparator(); - - /* - create set object name - line edit - */ - QWidgetAction* objectNameAction = new QWidgetAction(this); - QLineEdit* objectEdit = new QLineEdit(); - - if (objectName() == "") { - objectEdit->setPlaceholderText("no object name set"); - } - else { - objectEdit->setText(objectName()); - } - objectEdit->setAlignment(Qt::AlignHCenter); - objectEdit->setFrame(false); - objectEdit->setToolTip("Change the trajectory's name. This will not be saved in the data output (yet)!"); - - QObject::connect(objectEdit, &QLineEdit::textEdited, this, &ComponentShape::setObjectNameContext); - - objectNameAction->setDefaultWidget(objectEdit); - menu.addAction(objectNameAction); - - /* - show info window for current frame - */ - menu.addSeparator(); - QAction *showInfoAction = menu.addAction("Show full info", dynamic_cast(this), SLOT(createInfoWindow())); - menu.addSeparator(); - - /* - coloring - */ - QAction *changeBrushColorAction = menu.addAction("Change fill color", dynamic_cast(this), SLOT(changeBrushColor())); - QAction *changePenColorAction = menu.addAction("Change border color", dynamic_cast(this), SLOT(changePenColor())); - - /* - transparency slider - */ - QMenu* transparencyMenu = new QMenu("Transparency"); - QWidgetAction* sliderBox = new QWidgetAction(this); - QSlider* transparencySlider = new QSlider(Qt::Horizontal); - - transparencySlider->setMinimum(0); - transparencySlider->setMaximum(255); - transparencySlider->setSingleStep(1); - transparencySlider->setTickPosition(QSlider::TicksBothSides); - transparencySlider->setTickInterval(64); - transparencySlider->setValue(m_transparency); - - QObject::connect(transparencySlider, &QSlider::sliderMoved, this, &ComponentShape::receiveTransparency); - - sliderBox->setDefaultWidget(transparencySlider); - transparencyMenu->addAction(sliderBox); - - menu.addMenu(transparencyMenu); - - // - menu.addSeparator(); - /* - dimension menu - */ - QMenu* dimensionMenu = new QMenu("Dimensions"); - - //Width - QWidgetAction* widthBox = new QWidgetAction(this); - QSpinBox* widthSpin = new QSpinBox; - widthSpin->setPrefix("Width: "); - widthSpin->setMinimum(1); - widthSpin->setMaximum(100000); - widthSpin->setValue(m_w); - QObject::connect(widthSpin, QOverload::of(&QSpinBox::valueChanged), this, &ComponentShape::receiveWidth); - widthBox->setDefaultWidget(widthSpin); - dimensionMenu->addAction(widthBox); - - //Height - QWidgetAction* heightBox = new QWidgetAction(this); - QSpinBox* heightSpin = new QSpinBox; - heightSpin->setPrefix("Height: "); - heightSpin->setMinimum(1); - heightSpin->setMaximum(100000); - heightSpin->setValue(m_h); - QObject::connect(heightSpin, QOverload::of(&QSpinBox::valueChanged), this, &ComponentShape::receiveHeight); - heightBox->setDefaultWidget(heightSpin); - dimensionMenu->addAction(heightBox); - - // - menu.addMenu(dimensionMenu); - - /* - toggle orientation line - */ - - QAction *showOrientationAction = menu.addAction("Show orientation line", dynamic_cast(this), SLOT(receiveToggleOrientationLine(bool))); - showOrientationAction->setCheckable(true); - showOrientationAction->setChecked(m_orientationLine); - - /* - toggle id - */ - - QAction *showIDAction = menu.addAction("Show ID", dynamic_cast(this), SLOT(receiveShowId(bool))); - showIDAction->setCheckable(true); - showIDAction->setChecked(m_showId); - - - /* - tracing menu - */ - QMenu* tracingMenu = new QMenu("Tracing"); - //tracing type - QWidgetAction* typeBox = new QWidgetAction(this); - QComboBox* typeCombo = new QComboBox; - QStringList types; - types << "No tracing" << "Shape" << "Path" << "Arrow Path"; - typeCombo->addItems(types); - typeCombo->setCurrentText(m_tracingStyle); - QObject::connect(typeCombo, QOverload::of(&QComboBox::currentIndexChanged), this, &ComponentShape::receiveTracingStyle); - typeBox->setDefaultWidget(typeCombo); - QMenu* tracingTypeMenu = new QMenu("Type"); - tracingTypeMenu->addAction(typeBox); - tracingMenu->addMenu(tracingTypeMenu); - - //tracingHistory - QWidgetAction* historyBox = new QWidgetAction(this); - QSpinBox* historySpinBox = new QSpinBox; - historySpinBox->setPrefix("History: "); - historySpinBox->setMinimum(1); - historySpinBox->setMaximum(100000); - historySpinBox->setValue(m_tracingLength); - QObject::connect(historySpinBox, QOverload::of(&QSpinBox::valueChanged), this, &ComponentShape::receiveTracingLength); - historyBox->setDefaultWidget(historySpinBox); - tracingMenu->addAction(historyBox); - - //tracingSteps - QWidgetAction* stepsBox = new QWidgetAction(this); - QSpinBox* stepsSpinBox = new QSpinBox; - stepsSpinBox->setPrefix("Steps: "); - stepsSpinBox->setMinimum(1); - stepsSpinBox->setMaximum(100000); - stepsSpinBox->setValue(m_tracingSteps); - QObject::connect(stepsSpinBox, QOverload::of(&QSpinBox::valueChanged), this, &ComponentShape::receiveTracingSteps); - stepsBox->setDefaultWidget(stepsSpinBox); - tracingMenu->addAction(stepsBox); - - //tracingDegradation - QWidgetAction* degrBox = new QWidgetAction(this); - QComboBox* degrCombo = new QComboBox; - QStringList degrTypes; - degrTypes << "None" << "Transparency" << "False color"; - degrCombo->addItems(degrTypes); - degrCombo->setCurrentText(m_tracingTimeDegradation); - QObject::connect(degrCombo, QOverload::of(&QComboBox::currentIndexChanged), this, &ComponentShape::receiveTracingTimeDegradation); - degrBox->setDefaultWidget(degrCombo); - QMenu* tracingTimeDegrMenu = new QMenu("Time degradation"); - tracingTimeDegrMenu->addAction(degrBox); - tracingMenu->addMenu(tracingTimeDegrMenu); - - //toggle orientation line - - QAction *showTrOrientationAction = tracingMenu->addAction("Show tracer orientation line", dynamic_cast(this), SLOT(receiveTracerOrientationLine(bool))); - showTrOrientationAction->setCheckable(true); - showTrOrientationAction->setChecked(m_tracingOrientationLine); - - //tracer number - QAction *showTrNumberAction = tracingMenu->addAction("Show framenumber on tracers", dynamic_cast(this), SLOT(receiveTracerFrameNumber(bool))); - showTrNumberAction->setCheckable(true); - showTrNumberAction->setChecked(m_tracerFrameNumber); - - //tracer proportions - QWidgetAction* propBox = new QWidgetAction(this); - QDoubleSpinBox* propSpinBox = new QDoubleSpinBox; - propSpinBox->setPrefix("Proportions: "); - propSpinBox->setDecimals(2); - propSpinBox->setSingleStep(0.001f); - propSpinBox->setMinimum(0.01f); - propSpinBox->setMaximum(99.99f); - propSpinBox->setValue(m_tracerProportions); - QObject::connect(propSpinBox, QOverload::of(&QDoubleSpinBox::valueChanged), this, &ComponentShape::receiveTracerProportions); - propBox->setDefaultWidget(propSpinBox); - tracingMenu->addAction(propBox); - - - menu.addMenu(tracingMenu); - - // - menu.addSeparator(); - - /* - removing - */ - QAction *removeTrackAction = menu.addAction("Remove track", dynamic_cast(this), SLOT(removeTrack())); - QAction *removeTrackEntityAction = menu.addAction("Remove track entity", dynamic_cast(this), SLOT(removeTrackEntity())); - if (!m_pRemovable) { - removeTrackAction->setEnabled(false); - removeTrackEntityAction->setEnabled(false); - } - - /* - fixing - */ - QString fixText = m_fixed ? "Unfix track" : "Fix Track"; - QAction *fixTrackAction = menu.addAction(fixText, dynamic_cast(this), SLOT(toggleFixTrack())); - - /* - marking - */ - QString markText = m_marked ? "Unmark" : "Mark"; - QAction *markAction = menu.addAction(markText, dynamic_cast(this), SLOT(markShape())); - QAction *unmarkAction = menu.addAction(markText, dynamic_cast(this), SLOT(unmarkShape())); - markAction->setVisible(!m_marked); - unmarkAction->setVisible(m_marked); - - // - menu.addSeparator(); - - /* - morphing - */ - QMenu* morphMenu = new QMenu("Morph into..."); - if (data(1) == "rectangle" || data(1) == "ellipse" || data(1) == "point" || data(1) == "polygon") { - QAction* morphPoint = morphMenu->addAction("Point", dynamic_cast(this), SLOT(morphIntoPoint())); - QAction* morphEllipse = morphMenu->addAction("Ellipse", dynamic_cast(this), SLOT(morphIntoEllipse())); - QAction* morphRect = morphMenu->addAction("Rectangle", dynamic_cast(this), SLOT(morphIntoRect())); - QAction* morphPoylgon = morphMenu->addAction("Polygon", dynamic_cast(this), SLOT(morphIntoPolygon())); - } - else { - morphMenu->setEnabled(false); - } - menu.addMenu(morphMenu); - - // - QAction *selectedAction = menu.exec(event->screenPos()); + QMenu menu; + + /* + create the info box + */ + QWidgetAction* infoBox = new QWidgetAction(this); + + QString info = QString("ID: "); + info.append(QString::number(m_id)); + QLabel* infoLabel = new QLabel(info); + infoLabel->setWordWrap(true); + infoLabel->setStyleSheet("QLabel {font-weight: bold; text-align: center}"); + infoLabel->setAlignment(Qt::AlignCenter); + infoBox->setDefaultWidget(infoLabel); + menu.addAction(infoBox); + + // + menu.addSeparator(); + + /* + create set object name - line edit + */ + QWidgetAction* objectNameAction = new QWidgetAction(this); + QLineEdit* objectEdit = new QLineEdit(); + + if (objectName() == "") { + objectEdit->setPlaceholderText("no object name set"); + } else { + objectEdit->setText(objectName()); + } + objectEdit->setAlignment(Qt::AlignHCenter); + objectEdit->setFrame(false); + objectEdit->setToolTip( + "Change the trajectory's name. This will not be saved in the data " + "output (yet)!"); + + QObject::connect(objectEdit, + &QLineEdit::textEdited, + this, + &ComponentShape::setObjectNameContext); + + objectNameAction->setDefaultWidget(objectEdit); + menu.addAction(objectNameAction); + + /* + show info window for current frame + */ + menu.addSeparator(); + QAction* showInfoAction = menu.addAction( + "Show full info", + dynamic_cast(this), + SLOT(createInfoWindow())); + menu.addSeparator(); + + /* + coloring + */ + QAction* changeBrushColorAction = menu.addAction( + "Change fill color", + dynamic_cast(this), + SLOT(changeBrushColor())); + QAction* changePenColorAction = menu.addAction( + "Change border color", + dynamic_cast(this), + SLOT(changePenColor())); + + /* + transparency slider + */ + QMenu* transparencyMenu = new QMenu("Transparency"); + QWidgetAction* sliderBox = new QWidgetAction(this); + QSlider* transparencySlider = new QSlider(Qt::Horizontal); + + transparencySlider->setMinimum(0); + transparencySlider->setMaximum(255); + transparencySlider->setSingleStep(1); + transparencySlider->setTickPosition(QSlider::TicksBothSides); + transparencySlider->setTickInterval(64); + transparencySlider->setValue(m_transparency); + + QObject::connect(transparencySlider, + &QSlider::sliderMoved, + this, + &ComponentShape::receiveTransparency); + + sliderBox->setDefaultWidget(transparencySlider); + transparencyMenu->addAction(sliderBox); + + menu.addMenu(transparencyMenu); + + // + menu.addSeparator(); + /* + dimension menu + */ + QMenu* dimensionMenu = new QMenu("Dimensions"); + + // Width + QWidgetAction* widthBox = new QWidgetAction(this); + QSpinBox* widthSpin = new QSpinBox; + widthSpin->setPrefix("Width: "); + widthSpin->setMinimum(1); + widthSpin->setMaximum(100000); + widthSpin->setValue(m_w); + QObject::connect(widthSpin, + QOverload::of(&QSpinBox::valueChanged), + this, + &ComponentShape::receiveWidth); + widthBox->setDefaultWidget(widthSpin); + dimensionMenu->addAction(widthBox); + + // Height + QWidgetAction* heightBox = new QWidgetAction(this); + QSpinBox* heightSpin = new QSpinBox; + heightSpin->setPrefix("Height: "); + heightSpin->setMinimum(1); + heightSpin->setMaximum(100000); + heightSpin->setValue(m_h); + QObject::connect(heightSpin, + QOverload::of(&QSpinBox::valueChanged), + this, + &ComponentShape::receiveHeight); + heightBox->setDefaultWidget(heightSpin); + dimensionMenu->addAction(heightBox); + + // + menu.addMenu(dimensionMenu); + + /* + toggle orientation line + */ + + QAction* showOrientationAction = menu.addAction( + "Show orientation line", + dynamic_cast(this), + SLOT(receiveToggleOrientationLine(bool))); + showOrientationAction->setCheckable(true); + showOrientationAction->setChecked(m_orientationLine); + + /* + toggle id + */ + + QAction* showIDAction = menu.addAction("Show ID", + dynamic_cast(this), + SLOT(receiveShowId(bool))); + showIDAction->setCheckable(true); + showIDAction->setChecked(m_showId); + + /* + tracing menu + */ + QMenu* tracingMenu = new QMenu("Tracing"); + // tracing type + QWidgetAction* typeBox = new QWidgetAction(this); + QComboBox* typeCombo = new QComboBox; + QStringList types; + types << "No tracing" + << "Shape" + << "Path" + << "Arrow Path"; + typeCombo->addItems(types); + typeCombo->setCurrentText(m_tracingStyle); + QObject::connect( + typeCombo, + QOverload::of(&QComboBox::currentIndexChanged), + this, + &ComponentShape::receiveTracingStyle); + typeBox->setDefaultWidget(typeCombo); + QMenu* tracingTypeMenu = new QMenu("Type"); + tracingTypeMenu->addAction(typeBox); + tracingMenu->addMenu(tracingTypeMenu); + + // tracingHistory + QWidgetAction* historyBox = new QWidgetAction(this); + QSpinBox* historySpinBox = new QSpinBox; + historySpinBox->setPrefix("History: "); + historySpinBox->setMinimum(1); + historySpinBox->setMaximum(100000); + historySpinBox->setValue(m_tracingLength); + QObject::connect(historySpinBox, + QOverload::of(&QSpinBox::valueChanged), + this, + &ComponentShape::receiveTracingLength); + historyBox->setDefaultWidget(historySpinBox); + tracingMenu->addAction(historyBox); + + // tracingSteps + QWidgetAction* stepsBox = new QWidgetAction(this); + QSpinBox* stepsSpinBox = new QSpinBox; + stepsSpinBox->setPrefix("Steps: "); + stepsSpinBox->setMinimum(1); + stepsSpinBox->setMaximum(100000); + stepsSpinBox->setValue(m_tracingSteps); + QObject::connect(stepsSpinBox, + QOverload::of(&QSpinBox::valueChanged), + this, + &ComponentShape::receiveTracingSteps); + stepsBox->setDefaultWidget(stepsSpinBox); + tracingMenu->addAction(stepsBox); + + // tracingDegradation + QWidgetAction* degrBox = new QWidgetAction(this); + QComboBox* degrCombo = new QComboBox; + QStringList degrTypes; + degrTypes << "None" + << "Transparency" + << "False color"; + degrCombo->addItems(degrTypes); + degrCombo->setCurrentText(m_tracingTimeDegradation); + QObject::connect( + degrCombo, + QOverload::of(&QComboBox::currentIndexChanged), + this, + &ComponentShape::receiveTracingTimeDegradation); + degrBox->setDefaultWidget(degrCombo); + QMenu* tracingTimeDegrMenu = new QMenu("Time degradation"); + tracingTimeDegrMenu->addAction(degrBox); + tracingMenu->addMenu(tracingTimeDegrMenu); + + // toggle orientation line + + QAction* showTrOrientationAction = tracingMenu->addAction( + "Show tracer orientation line", + dynamic_cast(this), + SLOT(receiveTracerOrientationLine(bool))); + showTrOrientationAction->setCheckable(true); + showTrOrientationAction->setChecked(m_tracingOrientationLine); + + // tracer number + QAction* showTrNumberAction = tracingMenu->addAction( + "Show framenumber on tracers", + dynamic_cast(this), + SLOT(receiveTracerFrameNumber(bool))); + showTrNumberAction->setCheckable(true); + showTrNumberAction->setChecked(m_tracerFrameNumber); + + // tracer proportions + QWidgetAction* propBox = new QWidgetAction(this); + QDoubleSpinBox* propSpinBox = new QDoubleSpinBox; + propSpinBox->setPrefix("Proportions: "); + propSpinBox->setDecimals(2); + propSpinBox->setSingleStep(0.001f); + propSpinBox->setMinimum(0.01f); + propSpinBox->setMaximum(99.99f); + propSpinBox->setValue(m_tracerProportions); + QObject::connect(propSpinBox, + QOverload::of(&QDoubleSpinBox::valueChanged), + this, + &ComponentShape::receiveTracerProportions); + propBox->setDefaultWidget(propSpinBox); + tracingMenu->addAction(propBox); + + menu.addMenu(tracingMenu); + + // + menu.addSeparator(); + + /* + removing + */ + QAction* removeTrackAction = menu.addAction( + "Remove track", + dynamic_cast(this), + SLOT(removeTrack())); + QAction* removeTrackEntityAction = menu.addAction( + "Remove track entity", + dynamic_cast(this), + SLOT(removeTrackEntity())); + if (!m_pRemovable) { + removeTrackAction->setEnabled(false); + removeTrackEntityAction->setEnabled(false); + } + + /* + fixing + */ + QString fixText = m_fixed ? "Unfix track" : "Fix Track"; + QAction* fixTrackAction = menu.addAction( + fixText, + dynamic_cast(this), + SLOT(toggleFixTrack())); + + /* + marking + */ + QString markText = m_marked ? "Unmark" : "Mark"; + QAction* markAction = menu.addAction(markText, + dynamic_cast(this), + SLOT(markShape())); + QAction* unmarkAction = menu.addAction(markText, + dynamic_cast(this), + SLOT(unmarkShape())); + markAction->setVisible(!m_marked); + unmarkAction->setVisible(m_marked); + + // + menu.addSeparator(); + + /* + morphing + */ + QMenu* morphMenu = new QMenu("Morph into..."); + if (data(1) == "rectangle" || data(1) == "ellipse" || data(1) == "point" || + data(1) == "polygon") { + QAction* morphPoint = morphMenu->addAction( + "Point", + dynamic_cast(this), + SLOT(morphIntoPoint())); + QAction* morphEllipse = morphMenu->addAction( + "Ellipse", + dynamic_cast(this), + SLOT(morphIntoEllipse())); + QAction* morphRect = morphMenu->addAction( + "Rectangle", + dynamic_cast(this), + SLOT(morphIntoRect())); + QAction* morphPoylgon = morphMenu->addAction( + "Polygon", + dynamic_cast(this), + SLOT(morphIntoPolygon())); + } else { + morphMenu->setEnabled(false); + } + menu.addMenu(morphMenu); + + // + QAction* selectedAction = menu.exec(event->screenPos()); } - //************************************************************************* /// updates this with data from new current entity bool ComponentShape::updateAttributes(uint frameNumber) { - m_currentFramenumber = frameNumber; - - // if trajectory does not exist anymore, delete the shape - if (!m_trajectory) { - this->hide(); - m_tracingLayer->hide(); - this->deleteLater(); - return false; - } - - // check if trajectory is valid and current entity exists - if (m_trajectory->size() != 0 && m_trajectory->getValid() && m_trajectory->getChild(frameNumber)) { - m_id = m_trajectory->getId(); - //update m_fixed - m_fixed = m_trajectory->getFixed(); - if (!m_fixed) - { - if (this->isSelected()) { m_penStyle = Qt::DashLine; } - else { m_penStyle = Qt::SolidLine; } - } - else { - if (this->isSelected()) { m_penStyle = Qt::DashDotLine; } - else { m_penStyle = Qt::DotLine; } - } - - //update dimensions - prepareGeometryChange(); - - //type checker - bool hasType = false; - - //if point, ellipse, rectangle and valid - IModelTrackedPoint* pointLike = dynamic_cast(m_trajectory->getChild(m_currentFramenumber)); - if (pointLike && (pointLike->getValid())) { - hasType = true; - //update width and height or use defaults - if (m_useDefaultDimensions) { - if (pointLike->hasW()) { m_w = pointLike->getW(); } - else { m_w = m_wDefault; } - if (pointLike->hasH()) { m_h = pointLike->getH(); } - else { m_h = m_hDefault; } - } - //update rotation - if (pointLike->hasDeg()) { - this->setTransformOriginPoint(m_w / 2, m_h / 2); - if (m_h > m_w || data(1) == "polygon") { - m_rotation = -90 - pointLike->getDeg(); - this->setRotation(m_rotation); - } - else { - m_rotation = -pointLike->getDeg(); - this->setRotation(m_rotation); - } - - //update rotation line - m_rotationLine.setP1(QPointF(m_w / 2, m_h / 2)); - if (m_h > m_w || data(1) == "polygon") { - m_rotationLine.setAngle(-90); - } - else { - m_rotationLine.setAngle(0); - } - qreal length = (m_w + m_h) / 2 * 3; - m_rotationLine.setLength(length); - - //update rotation handle - m_rotationHandleLayer->setTransformOriginPoint(m_w / 2, m_h / 2); - m_rotationHandleLayer->setRotation(0); - m_rotationHandle->setPos(m_rotationLine.p2()); - } - else { - m_rotationLine = QLineF(); - } - - //update Position - this->setPos(pointLike->getXpx() - m_w / 2, pointLike->getYpx() - m_h / 2); - m_oldPos = this->pos().toPoint(); - - - /* - -when morphing into polygon: - -construct polygon from pos and width,height - -pentagon - - x / \ - / \ - | | - \_ _/ - - */ - m_polygons = QList(); - - QPolygonF polygon; - QPointF startPoint = QPointF(m_w / 2, 0); - polygon << startPoint; - polygon << QPointF(m_w, m_h / 2); - polygon << QPointF(3 * m_w / 4, m_h); - polygon << QPointF(m_w / 4, m_h); - polygon << QPointF(0, m_h / 2); - polygon << startPoint; - - if (polygon.isClosed()) { - m_polygons.append(polygon); - } - - //create tracers - trace(); - - this->show(); - update(); - - return true; - } - else { - this->hide(); - return true; - } - // if polygon - IModelTrackedPolygon* polygons = dynamic_cast(m_trajectory->getChild(frameNumber)); - if (polygons && (polygons->getValid() || m_currentFramenumber == 0)) { - hasType = true; - //update polygon - if (polygons->hasPolygon()) { - m_polygons = polygons->getPolygon(); - } - //also update position - this->setPos(polygons->getXpx() - m_w / 2, polygons->getYpx() - m_h / 2); - m_oldPos = this->pos().toPoint(); - - //update width and height or use defaults --> for morphing - if (m_useDefaultDimensions) { - m_w = m_polygons[0].boundingRect().width(); - m_h = m_polygons[0].boundingRect().height(); - } - - //create tracers - trace(); - - this->show(); - update(); - - return true; - } - //has no type - if (!hasType) { - qDebug() << "The current entity has no known type"; - - } - } - else { - //trajectory is empty or null or invald or current entity is null - this->hide(); - m_tracingLayer->hide(); - //delete this; - return false; - } + m_currentFramenumber = frameNumber; + + // if trajectory does not exist anymore, delete the shape + if (!m_trajectory) { + this->hide(); + m_tracingLayer->hide(); + this->deleteLater(); + return false; + } + + // check if trajectory is valid and current entity exists + if (m_trajectory->size() != 0 && m_trajectory->getValid() && + m_trajectory->getChild(frameNumber)) { + m_id = m_trajectory->getId(); + // update m_fixed + m_fixed = m_trajectory->getFixed(); + if (!m_fixed) { + if (this->isSelected()) { + m_penStyle = Qt::DashLine; + } else { + m_penStyle = Qt::SolidLine; + } + } else { + if (this->isSelected()) { + m_penStyle = Qt::DashDotLine; + } else { + m_penStyle = Qt::DotLine; + } + } + + // update dimensions + prepareGeometryChange(); + + // type checker + bool hasType = false; + + // if point, ellipse, rectangle and valid + IModelTrackedPoint* pointLike = dynamic_cast( + m_trajectory->getChild(m_currentFramenumber)); + if (pointLike && (pointLike->getValid())) { + hasType = true; + // update width and height or use defaults + if (m_useDefaultDimensions) { + if (pointLike->hasW()) { + m_w = pointLike->getW(); + } else { + m_w = m_wDefault; + } + if (pointLike->hasH()) { + m_h = pointLike->getH(); + } else { + m_h = m_hDefault; + } + } + // update rotation + if (pointLike->hasDeg()) { + this->setTransformOriginPoint(m_w / 2, m_h / 2); + if (m_h > m_w || data(1) == "polygon") { + m_rotation = -90 - pointLike->getDeg(); + this->setRotation(m_rotation); + } else { + m_rotation = -pointLike->getDeg(); + this->setRotation(m_rotation); + } + + // update rotation line + m_rotationLine.setP1(QPointF(m_w / 2, m_h / 2)); + if (m_h > m_w || data(1) == "polygon") { + m_rotationLine.setAngle(-90); + } else { + m_rotationLine.setAngle(0); + } + qreal length = (m_w + m_h) / 2 * 3; + m_rotationLine.setLength(length); + + // update rotation handle + m_rotationHandleLayer->setTransformOriginPoint(m_w / 2, + m_h / 2); + m_rotationHandleLayer->setRotation(0); + m_rotationHandle->setPos(m_rotationLine.p2()); + } else { + m_rotationLine = QLineF(); + } + + // update Position + this->setPos(pointLike->getXpx() - m_w / 2, + pointLike->getYpx() - m_h / 2); + m_oldPos = this->pos().toPoint(); + + /* + -when morphing into polygon: + -construct polygon from pos and width,height + -pentagon + + x / \ + / \ + | | + \_ _/ + + */ + m_polygons = QList(); + + QPolygonF polygon; + QPointF startPoint = QPointF(m_w / 2, 0); + polygon << startPoint; + polygon << QPointF(m_w, m_h / 2); + polygon << QPointF(3 * m_w / 4, m_h); + polygon << QPointF(m_w / 4, m_h); + polygon << QPointF(0, m_h / 2); + polygon << startPoint; + + if (polygon.isClosed()) { + m_polygons.append(polygon); + } + + // create tracers + trace(); + + this->show(); + update(); + + return true; + } else { + this->hide(); + return true; + } + // if polygon + IModelTrackedPolygon* polygons = dynamic_cast( + m_trajectory->getChild(frameNumber)); + if (polygons && (polygons->getValid() || m_currentFramenumber == 0)) { + hasType = true; + // update polygon + if (polygons->hasPolygon()) { + m_polygons = polygons->getPolygon(); + } + // also update position + this->setPos(polygons->getXpx() - m_w / 2, + polygons->getYpx() - m_h / 2); + m_oldPos = this->pos().toPoint(); + + // update width and height or use defaults --> for morphing + if (m_useDefaultDimensions) { + m_w = m_polygons[0].boundingRect().width(); + m_h = m_polygons[0].boundingRect().height(); + } + + // create tracers + trace(); + + this->show(); + update(); + + return true; + } + // has no type + if (!hasType) { + qDebug() << "The current entity has no known type"; + } + } else { + // trajectory is empty or null or invald or current entity is null + this->hide(); + m_tracingLayer->hide(); + // delete this; + return false; + } } /// attemps to draw tracers, if _tracingStyle is set tracers are drawn void ComponentShape::trace() { - //TRACING - - IModelTrackedPoint* currentChild = dynamic_cast - (m_trajectory->getChild(m_currentFramenumber)); - //return if current entity is not existant - if (!currentChild) - return; - - QPointF currentPoint = QPointF(currentChild->getXpx(), currentChild->getYpx()); - - //update the tracing layer - m_tracingLayer->setPos(this->pos()); - m_tracingLayer->setFlag(QGraphicsItem::ItemHasNoContents); - m_tracingLayer->show(); - - // really unefficient to flush each time - //flush tracing shape history, open up the memory --> thats slow - QList tracers = m_tracingLayer->childItems(); - foreach(QGraphicsItem * tracer, tracers) - { - delete tracer; - } - - //return if tracing disabled - if (m_trajectory->size() == 0 || m_tracingLength <= 0 || m_tracingStyle == "No tracing") { - return; - } - - QPointF lastPointDifference = QPointF(0, 0);// + QPointF(m_h / 2, m_w / 2); - - //create each n'th (m_tracingSteps) tracer of tracing history (m_tracingLength) - for (int i = 1; i <= m_tracingLength && i <= m_currentFramenumber; i += m_tracingSteps) { - - IModelTrackedPoint* historyChild = dynamic_cast - (m_trajectory->getChild(m_currentFramenumber - i)); - if (historyChild && historyChild->getValid()) { - - //positioning - QPointF historyPoint = QPointF(historyChild->getXpx(), historyChild->getYpx()); - QPointF historyPointDifference = historyPoint - currentPoint; - QPointF adjustedHistoryPointDifference = historyPointDifference; - - //time degradation colors - QPen timeDegradationPen = QPen(m_penColor, m_penWidth, m_penStyle); - QBrush timeDegradationBrush = QBrush(m_brushColor); - QColor timeDegradationBrushColor; - QColor timeDegradationPenColor; - - if (m_tracingTimeDegradation == "Transparency") { - - float tr = (float)m_transparency; - float trForThis = tr != 0 ? tr - (tr / (float)m_tracingLength) * (i - 1) : 0.0f; - - timeDegradationPenColor = QColor(m_penColor.red(), - m_penColor.green(), m_penColor.blue(), trForThis); - timeDegradationPen = QPen(timeDegradationPenColor, m_penWidth, Qt::SolidLine); - - timeDegradationBrushColor = QColor(m_brushColor.red(), - m_brushColor.green(), m_brushColor.blue(), trForThis); - timeDegradationBrush = QBrush(timeDegradationBrushColor); - - } - else if (m_tracingTimeDegradation == "False color") { - float hue = (240.0f - ((240.0f / (float)m_tracingLength) * i)); - timeDegradationPenColor = QColor::fromHsv((int)hue, 255.0f, 255.0f); - timeDegradationPenColor.setAlpha(m_transparency); - timeDegradationBrushColor = QColor::fromHsv((int)hue, 255.0f, 255.0f); - timeDegradationBrushColor.setAlpha(m_transparency); - timeDegradationPen = QPen(m_penColor, m_penWidth, m_penStyle); - timeDegradationBrush = QBrush(timeDegradationBrushColor); - } - - // check tracing type - - //SHAPE - if (m_tracingStyle == "Shape") { - - //orientation line - if (m_tracingOrientationLine) { - QLineF orientationLine = QLineF(); - orientationLine.setP1(adjustedHistoryPointDifference); - orientationLine.setAngle(historyChild->getDeg()); - qreal length = (m_w + m_h) / 2 / m_tracerProportions * 3; - orientationLine.setLength(15); - - QGraphicsLineItem* orientationItem = new QGraphicsLineItem(orientationLine, - m_tracingLayer); - } - - float tracerDeg = historyChild->hasDeg() ? historyChild->getDeg() : 0.0; - float tracerW = m_w * m_tracerProportions; - float tracerH = m_h * m_tracerProportions; - int tracerNumber = m_currentFramenumber - i; - - Tracer* tracer = new Tracer(this->data(1), tracerNumber, tracerDeg, - adjustedHistoryPointDifference, tracerW, tracerH, - timeDegradationPen, timeDegradationBrush, m_tracingLayer); - - QObject::connect(tracer, &Tracer::emitGoToFrame, - this, &ComponentShape::emitGoToFrame); - } - - //PATH - else if (m_tracingStyle == "Path") { - - if (lastPointDifference != adjustedHistoryPointDifference) { - - QLineF base = QLineF(lastPointDifference, adjustedHistoryPointDifference); - QGraphicsLineItem* lineItem = new QGraphicsLineItem(base, m_tracingLayer); - lineItem->setPen(QPen(timeDegradationPenColor, m_penWidth, m_penStyle)); - - lastPointDifference = adjustedHistoryPointDifference; - } - } - - //ARROWPATH - else if (m_tracingStyle == "Arrow path") { - - if (lastPointDifference != adjustedHistoryPointDifference) { - - QLineF base = QLineF(lastPointDifference, adjustedHistoryPointDifference); - - int armLength = std::floor(base.length() / 9) + 2; - - QLineF arm0 = base.normalVector(); - arm0.setLength(armLength); - arm0.setAngle(base.angle() + 20); - - QLineF arm1 = base.normalVector(); - arm1.setLength(armLength); - arm1.setAngle(base.angle() - 20); - - QGraphicsLineItem* baseItem = new QGraphicsLineItem(base, m_tracingLayer); - baseItem->setPen(QPen(timeDegradationBrushColor, m_penWidth, m_penStyle)); - QGraphicsLineItem* arm0Item = new QGraphicsLineItem(arm0, m_tracingLayer); - arm0Item->setPen(timeDegradationPen); - QGraphicsLineItem* arm1Item = new QGraphicsLineItem(arm1, m_tracingLayer); - arm1Item->setPen(timeDegradationPen); - - lastPointDifference = adjustedHistoryPointDifference; - - } - } - - //add framenumber to each tracer - if (m_tracerFrameNumber) { - uint tracerNumber = m_currentFramenumber - i; - QFont font = QFont(); - int fontPixelSize = (int)((m_w + m_h) / 5) * m_tracerProportions; - font.setPixelSize(fontPixelSize); - //font.setBold(true); - QGraphicsSimpleTextItem* tracerNumberText = - new QGraphicsSimpleTextItem(QString::number(tracerNumber), m_tracingLayer); - tracerNumberText->setFont(font); - tracerNumberText->setBrush(QBrush(Qt::white)); //sloooow - QPen pen = QPen(Qt::black); - pen.setWidth(0); - tracerNumberText->setPen(pen); //sloooow - tracerNumberText->setPos(adjustedHistoryPointDifference + - QPointF(-m_w * m_tracerProportions / 2.0f, -m_h * m_tracerProportions / 5)); - } - } - } + // TRACING + + IModelTrackedPoint* currentChild = dynamic_cast( + m_trajectory->getChild(m_currentFramenumber)); + // return if current entity is not existant + if (!currentChild) + return; + + QPointF currentPoint = QPointF(currentChild->getXpx(), + currentChild->getYpx()); + + // update the tracing layer + m_tracingLayer->setPos(this->pos()); + m_tracingLayer->setFlag(QGraphicsItem::ItemHasNoContents); + m_tracingLayer->show(); + + // really unefficient to flush each time + // flush tracing shape history, open up the memory --> thats slow + QList tracers = m_tracingLayer->childItems(); + foreach (QGraphicsItem* tracer, tracers) { + delete tracer; + } + + // return if tracing disabled + if (m_trajectory->size() == 0 || m_tracingLength <= 0 || + m_tracingStyle == "No tracing") { + return; + } + + QPointF lastPointDifference = QPointF(0, + 0); // + QPointF(m_h / 2, m_w / 2); + + // create each n'th (m_tracingSteps) tracer of tracing history + // (m_tracingLength) + for (int i = 1; i <= m_tracingLength && i <= m_currentFramenumber; + i += m_tracingSteps) { + + IModelTrackedPoint* historyChild = dynamic_cast( + m_trajectory->getChild(m_currentFramenumber - i)); + if (historyChild && historyChild->getValid()) { + + // positioning + QPointF historyPoint = QPointF(historyChild->getXpx(), + historyChild->getYpx()); + QPointF historyPointDifference = historyPoint - currentPoint; + QPointF adjustedHistoryPointDifference = historyPointDifference; + + // time degradation colors + QPen timeDegradationPen = QPen(m_penColor, m_penWidth, m_penStyle); + QBrush timeDegradationBrush = QBrush(m_brushColor); + QColor timeDegradationBrushColor; + QColor timeDegradationPenColor; + + if (m_tracingTimeDegradation == "Transparency") { + + float tr = (float) m_transparency; + float trForThis = tr != 0 + ? tr - (tr / (float) m_tracingLength) * + (i - 1) + : 0.0f; + + timeDegradationPenColor = QColor(m_penColor.red(), + m_penColor.green(), + m_penColor.blue(), + trForThis); + timeDegradationPen = QPen(timeDegradationPenColor, + m_penWidth, + Qt::SolidLine); + + timeDegradationBrushColor = QColor(m_brushColor.red(), + m_brushColor.green(), + m_brushColor.blue(), + trForThis); + timeDegradationBrush = QBrush(timeDegradationBrushColor); + + } else if (m_tracingTimeDegradation == "False color") { + float hue = (240.0f - + ((240.0f / (float) m_tracingLength) * i)); + timeDegradationPenColor = QColor::fromHsv((int) hue, + 255.0f, + 255.0f); + timeDegradationPenColor.setAlpha(m_transparency); + timeDegradationBrushColor = QColor::fromHsv((int) hue, + 255.0f, + 255.0f); + timeDegradationBrushColor.setAlpha(m_transparency); + timeDegradationPen = QPen(m_penColor, m_penWidth, m_penStyle); + timeDegradationBrush = QBrush(timeDegradationBrushColor); + } + + // check tracing type + + // SHAPE + if (m_tracingStyle == "Shape") { + + // orientation line + if (m_tracingOrientationLine) { + QLineF orientationLine = QLineF(); + orientationLine.setP1(adjustedHistoryPointDifference); + orientationLine.setAngle(historyChild->getDeg()); + qreal length = (m_w + m_h) / 2 / m_tracerProportions * 3; + orientationLine.setLength(15); + + QGraphicsLineItem* orientationItem = new QGraphicsLineItem( + orientationLine, + m_tracingLayer); + } + + float tracerDeg = historyChild->hasDeg() + ? historyChild->getDeg() + : 0.0; + float tracerW = m_w * m_tracerProportions; + float tracerH = m_h * m_tracerProportions; + int tracerNumber = m_currentFramenumber - i; + + Tracer* tracer = new Tracer(this->data(1), + tracerNumber, + tracerDeg, + adjustedHistoryPointDifference, + tracerW, + tracerH, + timeDegradationPen, + timeDegradationBrush, + m_tracingLayer); + + QObject::connect(tracer, + &Tracer::emitGoToFrame, + this, + &ComponentShape::emitGoToFrame); + } + + // PATH + else if (m_tracingStyle == "Path") { + + if (lastPointDifference != adjustedHistoryPointDifference) { + + QLineF base = QLineF(lastPointDifference, + adjustedHistoryPointDifference); + QGraphicsLineItem* lineItem = new QGraphicsLineItem( + base, + m_tracingLayer); + lineItem->setPen( + QPen(timeDegradationPenColor, m_penWidth, m_penStyle)); + + lastPointDifference = adjustedHistoryPointDifference; + } + } + + // ARROWPATH + else if (m_tracingStyle == "Arrow path") { + + if (lastPointDifference != adjustedHistoryPointDifference) { + + QLineF base = QLineF(lastPointDifference, + adjustedHistoryPointDifference); + + int armLength = std::floor(base.length() / 9) + 2; + + QLineF arm0 = base.normalVector(); + arm0.setLength(armLength); + arm0.setAngle(base.angle() + 20); + + QLineF arm1 = base.normalVector(); + arm1.setLength(armLength); + arm1.setAngle(base.angle() - 20); + + QGraphicsLineItem* baseItem = new QGraphicsLineItem( + base, + m_tracingLayer); + baseItem->setPen(QPen(timeDegradationBrushColor, + m_penWidth, + m_penStyle)); + QGraphicsLineItem* arm0Item = new QGraphicsLineItem( + arm0, + m_tracingLayer); + arm0Item->setPen(timeDegradationPen); + QGraphicsLineItem* arm1Item = new QGraphicsLineItem( + arm1, + m_tracingLayer); + arm1Item->setPen(timeDegradationPen); + + lastPointDifference = adjustedHistoryPointDifference; + } + } + + // add framenumber to each tracer + if (m_tracerFrameNumber) { + uint tracerNumber = m_currentFramenumber - i; + QFont font = QFont(); + int fontPixelSize = (int) ((m_w + m_h) / 5) * + m_tracerProportions; + font.setPixelSize(fontPixelSize); + // font.setBold(true); + QGraphicsSimpleTextItem* tracerNumberText = + new QGraphicsSimpleTextItem(QString::number(tracerNumber), + m_tracingLayer); + tracerNumberText->setFont(font); + tracerNumberText->setBrush(QBrush(Qt::white)); // sloooow + QPen pen = QPen(Qt::black); + pen.setWidth(0); + tracerNumberText->setPen(pen); // sloooow + tracerNumberText->setPos( + adjustedHistoryPointDifference + + QPointF(-m_w * m_tracerProportions / 2.0f, + -m_h * m_tracerProportions / 5)); + } + } + } } -IModelTrackedTrajectory * ComponentShape::getTrajectory() +IModelTrackedTrajectory* ComponentShape::getTrajectory() { - return m_trajectory; + return m_trajectory; } -void ComponentShape::setPermission(std::pair permission) +void ComponentShape::setPermission( + std::pair permission) { - m_permissions.insert(permission); - - - switch (permission.first) - { - case ENUMS::COREPERMISSIONS::COMPONENTMOVE: - m_pMovable = permission.second; - this->setFlag(ItemIsMovable, permission.second); - break; - case ENUMS::COREPERMISSIONS::COMPONENTREMOVE: - m_pRemovable = permission.second; - break; - case ENUMS::COREPERMISSIONS::COMPONENTSWAP: - m_pSwappable = permission.second; - break; - case ENUMS::COREPERMISSIONS::COMPONENTROTATE: - m_pRotatable = permission.second; - - if (m_pRotatable) { - m_rotationHandleLayer->setVisible(m_orientationLine); - m_rotationHandle->setVisible(m_orientationLine); - } - else { - m_rotationHandleLayer->hide(); - m_rotationHandle->hide(); - } - break; - } + m_permissions.insert(permission); + + switch (permission.first) { + case ENUMS::COREPERMISSIONS::COMPONENTMOVE: + m_pMovable = permission.second; + this->setFlag(ItemIsMovable, permission.second); + break; + case ENUMS::COREPERMISSIONS::COMPONENTREMOVE: + m_pRemovable = permission.second; + break; + case ENUMS::COREPERMISSIONS::COMPONENTSWAP: + m_pSwappable = permission.second; + break; + case ENUMS::COREPERMISSIONS::COMPONENTROTATE: + m_pRotatable = permission.second; + + if (m_pRotatable) { + m_rotationHandleLayer->setVisible(m_orientationLine); + m_rotationHandle->setVisible(m_orientationLine); + } else { + m_rotationHandleLayer->hide(); + m_rotationHandle->hide(); + } + break; + } } int ComponentShape::getId() { - return m_id; + return m_id; } bool ComponentShape::isSwappable() { - return m_permissions[ENUMS::COREPERMISSIONS::COMPONENTSWAP]; + return m_permissions[ENUMS::COREPERMISSIONS::COMPONENTSWAP]; } bool ComponentShape::isRemovable() { - return m_pRemovable; + return m_pRemovable; } bool ComponentShape::isRotatable() { - return m_pRotatable; + return m_pRotatable; } QPoint ComponentShape::getOldPos() { - return m_oldPos; + return m_oldPos; } -//set default members from core params +// set default members from core params void ComponentShape::setMembers(CoreParameter* coreParams) { - //from coreParams - m_antialiasing = coreParams->m_antialiasingEntities; - - - m_tracingStyle = coreParams->m_tracingStyle; - m_tracingTimeDegradation = coreParams->m_tracingTimeDegradation; - m_tracingLength = coreParams->m_tracingHistory; - m_tracingSteps = coreParams->m_tracingSteps; - m_tracerProportions = coreParams->m_tracerProportions; - m_tracingOrientationLine = coreParams->m_tracerOrientationLine; - m_tracerFrameNumber = coreParams->m_tracerFrameNumber; - - m_orientationLine = coreParams->m_trackOrientationLine; - m_showId = coreParams->m_trackShowId; - - m_brushColor = *(coreParams->m_colorBrush); - m_penColor = *(coreParams->m_colorBorder); - - m_dragged = false; - setFlag(QGraphicsItem::ItemIgnoresTransformations, coreParams->m_ignoreZoom); - - // set dimensions and default dimensions - if (coreParams->m_trackWidth > 0) { - m_w = coreParams->m_trackWidth; - m_wDefault = coreParams->m_trackWidth; - } - if (coreParams->m_trackHeight > 0) { - m_h = coreParams->m_trackHeight; - m_hDefault = coreParams->m_trackHeight; - } - - //initialize helpers - m_rotationHandleLayer = new QGraphicsRectItem(this); - m_rotationHandleLayer->setPos(0, 0); - m_rotationHandleLayer->setFlag(QGraphicsItem::ItemHasNoContents); - - m_rotationHandle = new RotationHandle(QPoint(m_w / 2, m_h / 2), m_rotationHandleLayer); - m_rotationHandle->setAntialiasing(m_antialiasing); - QObject::connect(m_rotationHandle, &RotationHandle::emitShapeRotation, this, &ComponentShape::receiveShapeRotation); - - if (m_pRotatable) { - m_rotationHandleLayer->setVisible(m_orientationLine); - m_rotationHandle->setVisible(m_orientationLine); - } - - update(); + // from coreParams + m_antialiasing = coreParams->m_antialiasingEntities; + + m_tracingStyle = coreParams->m_tracingStyle; + m_tracingTimeDegradation = coreParams->m_tracingTimeDegradation; + m_tracingLength = coreParams->m_tracingHistory; + m_tracingSteps = coreParams->m_tracingSteps; + m_tracerProportions = coreParams->m_tracerProportions; + m_tracingOrientationLine = coreParams->m_tracerOrientationLine; + m_tracerFrameNumber = coreParams->m_tracerFrameNumber; + + m_orientationLine = coreParams->m_trackOrientationLine; + m_showId = coreParams->m_trackShowId; + + m_brushColor = *(coreParams->m_colorBrush); + m_penColor = *(coreParams->m_colorBorder); + + m_dragged = false; + setFlag(QGraphicsItem::ItemIgnoresTransformations, + coreParams->m_ignoreZoom); + + // set dimensions and default dimensions + if (coreParams->m_trackWidth > 0) { + m_w = coreParams->m_trackWidth; + m_wDefault = coreParams->m_trackWidth; + } + if (coreParams->m_trackHeight > 0) { + m_h = coreParams->m_trackHeight; + m_hDefault = coreParams->m_trackHeight; + } + + // initialize helpers + m_rotationHandleLayer = new QGraphicsRectItem(this); + m_rotationHandleLayer->setPos(0, 0); + m_rotationHandleLayer->setFlag(QGraphicsItem::ItemHasNoContents); + + m_rotationHandle = new RotationHandle(QPoint(m_w / 2, m_h / 2), + m_rotationHandleLayer); + m_rotationHandle->setAntialiasing(m_antialiasing); + QObject::connect(m_rotationHandle, + &RotationHandle::emitShapeRotation, + this, + &ComponentShape::receiveShapeRotation); + + if (m_pRotatable) { + m_rotationHandleLayer->setVisible(m_orientationLine); + m_rotationHandle->setVisible(m_orientationLine); + } + + update(); } -double ComponentShape::constrainAngle(double x) { - x = fmod(x, 360); - if (x < 0) - x += 360; - return x; +double ComponentShape::constrainAngle(double x) +{ + x = fmod(x, 360); + if (x < 0) + x += 360; + return x; } - //################################SLOTS############################# //**************************context menu actions******************** @@ -1010,360 +1142,374 @@ double ComponentShape::constrainAngle(double x) { void ComponentShape::changeBrushColor() { - this->m_brushColor = QColorDialog::getColor(m_brushColor, nullptr, QString("Choose fill color"), QColorDialog::ShowAlphaChannel); - //m_transparency = m_brushColor.alpha(); - trace(); - update(); + this->m_brushColor = QColorDialog::getColor( + m_brushColor, + nullptr, + QString("Choose fill color"), + QColorDialog::ShowAlphaChannel); + // m_transparency = m_brushColor.alpha(); + trace(); + update(); } void ComponentShape::changePenColor() { - QColor newColor = QColorDialog::getColor(m_penColor, nullptr, QString("Choose border color"), QColorDialog::ShowAlphaChannel); - //m_transparency = newColor.alpha(); - - if (!isSelected()) { - m_penColorLast = m_penColor; - m_penColor = newColor; - - trace(); - update(); - } - else { - m_penColorLast = newColor; - } - + QColor newColor = QColorDialog::getColor(m_penColor, + nullptr, + QString("Choose border color"), + QColorDialog::ShowAlphaChannel); + // m_transparency = newColor.alpha(); + + if (!isSelected()) { + m_penColorLast = m_penColor; + m_penColor = newColor; + + trace(); + update(); + } else { + m_penColorLast = newColor; + } } void ComponentShape::changeBrushColor(QColor color) { - m_brushColor = color; + m_brushColor = color; - trace(); - update(); + trace(); + update(); } void ComponentShape::changePenColor(QColor color) { - if (!isSelected()) { - m_penColorLast = m_penColor; - m_penColor = color; - trace(); - update(); - } - else { - m_penColorLast = color; - } + if (!isSelected()) { + m_penColorLast = m_penColor; + m_penColor = color; + trace(); + update(); + } else { + m_penColorLast = color; + } } bool ComponentShape::removeTrack() { - if (m_pRemovable) { - qDebug() << "Removing track..."; + if (m_pRemovable) { + qDebug() << "Removing track..."; - //emit to set trajectory invalid - Q_EMIT emitRemoveTrajectory(m_trajectory); + // emit to set trajectory invalid + Q_EMIT emitRemoveTrajectory(m_trajectory); - } - else { - qDebug() << "Track is not removable"; - } - return m_pRemovable; + } else { + qDebug() << "Track is not removable"; + } + return m_pRemovable; } bool ComponentShape::removeTrackEntity() { - if (m_pRemovable) { - qDebug() << "Removing track entity..."; - - //emit to set trajectory invalid - Q_EMIT emitRemoveTrackEntity(m_trajectory, m_currentFramenumber); - } - else { - qDebug() << "track entity is not removable"; - } - return m_pRemovable; + if (m_pRemovable) { + qDebug() << "Removing track entity..."; + + // emit to set trajectory invalid + Q_EMIT emitRemoveTrackEntity(m_trajectory, m_currentFramenumber); + } else { + qDebug() << "track entity is not removable"; + } + return m_pRemovable; } void ComponentShape::markShape(int penwidth) { - if (!m_marked) { - m_penWidth = 3; - } - else { - m_penWidth = penwidth; - } - m_marked = true; - trace(); - update(); + if (!m_marked) { + m_penWidth = 3; + } else { + m_penWidth = penwidth; + } + m_marked = true; + trace(); + update(); } void ComponentShape::unmarkShape() { - m_marked = false; - m_penWidth = 2; + m_marked = false; + m_penWidth = 2; - trace(); - update(); + trace(); + update(); } void ComponentShape::toggleFixTrack() { - //if traj is currently fixed-> emit flase, else emit true - bool fixToggle = m_fixed ? false : true; - Q_EMIT emitToggleFixTrack(m_trajectory, fixToggle); - update(); - trace(); + // if traj is currently fixed-> emit flase, else emit true + bool fixToggle = m_fixed ? false : true; + Q_EMIT emitToggleFixTrack(m_trajectory, fixToggle); + update(); + trace(); } -//TODO create ui file for this and do this there +// TODO create ui file for this and do this there void ComponentShape::createInfoWindow() { - QTableWidget* infoTable = new QTableWidget(); - - infoTable->setRowCount(0); - infoTable->setColumnCount(2); - - infoTable->setHorizontalHeaderItem(0, new QTableWidgetItem("Property")); - infoTable->setHorizontalHeaderItem(1, new QTableWidgetItem("Value")); - infoTable->verticalHeader()->hide(); - - QLinkedList> infoList; - infoList.append(QPair("ID", QString::number(m_id))); - infoList.append(QPair("Framenumber", QString::number(m_currentFramenumber))); - infoList.append(QPair("Seen for frames", QString::number(m_trajectory->validCount()))); - infoList.append(QPair("Width", QString::number(m_w))); - infoList.append(QPair("Height", QString::number(m_h))); - infoList.append(QPair("Orientation (in Degrees)", QString::number(m_rotation))); - infoList.append(QPair("Fixed", QString::number(m_fixed))); - - QLinkedList>::const_iterator info; - for (info = infoList.constBegin(); info != infoList.constEnd(); ++info) { - infoTable->insertRow(infoTable->rowCount()); - - - QTableWidgetItem* infoKey = new QTableWidgetItem(info->first); - QTableWidgetItem* infoKeyInfo = new QTableWidgetItem(info->second); - infoKey->setFlags(Qt::NoItemFlags | Qt::ItemIsEnabled | Qt::ItemIsSelectable); - infoKeyInfo->setFlags(Qt::NoItemFlags | Qt::ItemIsEnabled | Qt::ItemIsSelectable); - - infoTable->setItem(infoTable->rowCount() - 1, 0, infoKey); - infoTable->setItem(infoTable->rowCount() - 1, 1, infoKeyInfo); - - } - - //infoTable->horizontalHeader()->setStretchLastSection( true ); - infoTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); - - QWidget* infoWidget = new QWidget(); - const QString title = QString("Information for track %1 on frame %2").arg(QString::number(m_id), QString::number(m_currentFramenumber)); - infoWidget->setWindowTitle(title); - QVBoxLayout* vLayout = new QVBoxLayout(); - - - infoWidget->resize(infoTable->size()); - vLayout->addWidget(infoTable); - infoWidget->setLayout(vLayout); - - infoWidget->show(); - - + QTableWidget* infoTable = new QTableWidget(); + + infoTable->setRowCount(0); + infoTable->setColumnCount(2); + + infoTable->setHorizontalHeaderItem(0, new QTableWidgetItem("Property")); + infoTable->setHorizontalHeaderItem(1, new QTableWidgetItem("Value")); + infoTable->verticalHeader()->hide(); + + QLinkedList> infoList; + infoList.append(QPair("ID", QString::number(m_id))); + infoList.append( + QPair("Framenumber", + QString::number(m_currentFramenumber))); + infoList.append( + QPair("Seen for frames", + QString::number(m_trajectory->validCount()))); + infoList.append(QPair("Width", QString::number(m_w))); + infoList.append(QPair("Height", QString::number(m_h))); + infoList.append(QPair("Orientation (in Degrees)", + QString::number(m_rotation))); + infoList.append( + QPair("Fixed", QString::number(m_fixed))); + + QLinkedList>::const_iterator info; + for (info = infoList.constBegin(); info != infoList.constEnd(); ++info) { + infoTable->insertRow(infoTable->rowCount()); + + QTableWidgetItem* infoKey = new QTableWidgetItem(info->first); + QTableWidgetItem* infoKeyInfo = new QTableWidgetItem(info->second); + infoKey->setFlags(Qt::NoItemFlags | Qt::ItemIsEnabled | + Qt::ItemIsSelectable); + infoKeyInfo->setFlags(Qt::NoItemFlags | Qt::ItemIsEnabled | + Qt::ItemIsSelectable); + + infoTable->setItem(infoTable->rowCount() - 1, 0, infoKey); + infoTable->setItem(infoTable->rowCount() - 1, 1, infoKeyInfo); + } + + // infoTable->horizontalHeader()->setStretchLastSection( true ); + infoTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); + + QWidget* infoWidget = new QWidget(); + const QString title = QString("Information for track %1 on frame %2") + .arg(QString::number(m_id), + QString::number(m_currentFramenumber)); + infoWidget->setWindowTitle(title); + QVBoxLayout* vLayout = new QVBoxLayout(); + + infoWidget->resize(infoTable->size()); + vLayout->addWidget(infoTable); + infoWidget->setLayout(vLayout); + + infoWidget->show(); } -// this is only visual, the object name is not set in the exported file -void ComponentShape::setObjectNameContext(QString name) { - setObjectName(name); - m_trajectory->setObjectName(name); +// this is only visual, the object name is not set in the exported file +void ComponentShape::setObjectNameContext(QString name) +{ + setObjectName(name); + m_trajectory->setObjectName(name); } -void ComponentShape::morphIntoRect() { - setData(1, "rectangle"); - updateAttributes(m_currentFramenumber); - trace(); +void ComponentShape::morphIntoRect() +{ + setData(1, "rectangle"); + updateAttributes(m_currentFramenumber); + trace(); } -void ComponentShape::morphIntoEllipse() { - setData(1, "ellipse"); - updateAttributes(m_currentFramenumber); - trace(); +void ComponentShape::morphIntoEllipse() +{ + setData(1, "ellipse"); + updateAttributes(m_currentFramenumber); + trace(); } -void ComponentShape::morphIntoPoint() { - setData(1, "point"); - updateAttributes(m_currentFramenumber); - trace(); +void ComponentShape::morphIntoPoint() +{ + setData(1, "point"); + updateAttributes(m_currentFramenumber); + trace(); } void ComponentShape::morphIntoPolygon() { - setData(1, "polygon"); + setData(1, "polygon"); - updateAttributes(m_currentFramenumber); - trace(); + updateAttributes(m_currentFramenumber); + trace(); } -//************************************************************************ +//************************************************************************ //*************************** SLOTS to set members***************************** void ComponentShape::receiveTracingLength(int tracingLength) { - m_tracingLength = tracingLength; - trace(); - update(); + m_tracingLength = tracingLength; + trace(); + update(); } void ComponentShape::receiveTracingStyle(QString style) { - m_tracingStyle = style; - trace(); - update(); + m_tracingStyle = style; + trace(); + update(); } void ComponentShape::receiveTracingSteps(int steps) { - m_tracingSteps = steps; - trace(); - update(); + m_tracingSteps = steps; + trace(); + update(); } void ComponentShape::receiveTracingTimeDegradation(QString timeDegradation) { - m_tracingTimeDegradation = timeDegradation; - trace(); - update(); + m_tracingTimeDegradation = timeDegradation; + trace(); + update(); } void ComponentShape::receiveTracerProportions(float proportion) { - m_tracerProportions = proportion; - trace(); - update(); + m_tracerProportions = proportion; + trace(); + update(); } void ComponentShape::receiveTracerOrientationLine(bool toggle) { - m_tracingOrientationLine = toggle; - trace(); - update(); + m_tracingOrientationLine = toggle; + trace(); + update(); } void ComponentShape::receiveTracerFrameNumber(bool toggle) { - m_tracerFrameNumber = toggle; - trace(); - update(); + m_tracerFrameNumber = toggle; + trace(); + update(); } void ComponentShape::receiveAntialiasing(bool toggle) { - m_antialiasing = toggle; - m_rotationHandle->setAntialiasing(toggle); - trace(); - update(); + m_antialiasing = toggle; + m_rotationHandle->setAntialiasing(toggle); + trace(); + update(); } void ComponentShape::receiveDimensions(int width, int height) { - m_useDefaultDimensions = false; - m_w = width; - m_h = height; - updateAttributes(m_currentFramenumber); - trace(); - update(); + m_useDefaultDimensions = false; + m_w = width; + m_h = height; + updateAttributes(m_currentFramenumber); + trace(); + update(); } -void ComponentShape::receiveHeight(int height) { - m_useDefaultDimensions = false; - m_h = height; - updateAttributes(m_currentFramenumber); - trace(); - update(); +void ComponentShape::receiveHeight(int height) +{ + m_useDefaultDimensions = false; + m_h = height; + updateAttributes(m_currentFramenumber); + trace(); + update(); } -void ComponentShape::receiveWidth(int width) { - m_useDefaultDimensions = false; - m_w = width; - updateAttributes(m_currentFramenumber); - trace(); - update(); +void ComponentShape::receiveWidth(int width) +{ + m_useDefaultDimensions = false; + m_w = width; + updateAttributes(m_currentFramenumber); + trace(); + update(); } void ComponentShape::setDimensionsToDefault() { - m_useDefaultDimensions = true; - m_w = m_wDefault; - m_h = m_hDefault; - updateAttributes(m_currentFramenumber); - trace(); - update(); + m_useDefaultDimensions = true; + m_w = m_wDefault; + m_h = m_hDefault; + updateAttributes(m_currentFramenumber); + trace(); + update(); } void ComponentShape::receiveToggleOrientationLine(bool toggle) { - m_orientationLine = toggle; - if (m_pRotatable) { - m_rotationHandleLayer->setVisible(toggle); - m_rotationHandle->setVisible(toggle); - } - trace(); - update(); + m_orientationLine = toggle; + if (m_pRotatable) { + m_rotationHandleLayer->setVisible(toggle); + m_rotationHandle->setVisible(toggle); + } + trace(); + update(); } void ComponentShape::receiveShowId(bool toggle) { - m_showId = toggle; - trace(); - update(); + m_showId = toggle; + trace(); + update(); } void ComponentShape::receiveShapeRotation(double angle, bool rotateEntity) { - m_rotationHandleLayer->setTransformOriginPoint(m_w / 2, m_h / 2); - //m_rotationHandleLayer->setRotation(-angle); - - this->setTransformOriginPoint(m_w / 2, m_h / 2); - if (m_h > m_w || data(1) == "polygon") { - m_rotationHandleLayer->setRotation(-angle + 90); - this->setRotation(m_rotation + angle - 90); - } - else { - m_rotationHandleLayer->setRotation(-angle); - this->setRotation(m_rotation + angle); - } - - if (rotateEntity) { - - this->pos(); - - double toAngle = -angle - m_rotation; - double oldAngle = -m_rotation; - - double toAngleNorm = constrainAngle(toAngle); - double oldAngleNorm = constrainAngle(oldAngle); - Q_EMIT emitEntityRotation(m_trajectory, oldAngleNorm, toAngleNorm, m_currentFramenumber); - } - - update(); + m_rotationHandleLayer->setTransformOriginPoint(m_w / 2, m_h / 2); + // m_rotationHandleLayer->setRotation(-angle); + + this->setTransformOriginPoint(m_w / 2, m_h / 2); + if (m_h > m_w || data(1) == "polygon") { + m_rotationHandleLayer->setRotation(-angle + 90); + this->setRotation(m_rotation + angle - 90); + } else { + m_rotationHandleLayer->setRotation(-angle); + this->setRotation(m_rotation + angle); + } + + if (rotateEntity) { + + this->pos(); + + double toAngle = -angle - m_rotation; + double oldAngle = -m_rotation; + + double toAngleNorm = constrainAngle(toAngle); + double oldAngleNorm = constrainAngle(oldAngle); + Q_EMIT emitEntityRotation(m_trajectory, + oldAngleNorm, + toAngleNorm, + m_currentFramenumber); + } + + update(); } -//currently disabled +// currently disabled void ComponentShape::receiveIgnoreZoom(bool toggle) { - setFlag(QGraphicsItem::ItemIgnoresTransformations, toggle); - trace(); - update(); + setFlag(QGraphicsItem::ItemIgnoresTransformations, toggle); + trace(); + update(); } -void ComponentShape::receiveTransparency(int alpha) { - m_transparency = alpha; - m_brushColor.setAlpha(alpha); - m_penColor.setAlpha(alpha); - - QColor penColorHandle = m_rotationHandle->pen().color(); - penColorHandle.setAlpha(alpha); - m_rotationHandle->setPen(QPen(penColorHandle)); +void ComponentShape::receiveTransparency(int alpha) +{ + m_transparency = alpha; + m_brushColor.setAlpha(alpha); + m_penColor.setAlpha(alpha); - QColor brushColorHandle = m_rotationHandle->brush().color(); - brushColorHandle.setAlpha(alpha); - m_rotationHandle->setBrush(QBrush(brushColorHandle)); + QColor penColorHandle = m_rotationHandle->pen().color(); + penColorHandle.setAlpha(alpha); + m_rotationHandle->setPen(QPen(penColorHandle)); - trace(); - update(); + QColor brushColorHandle = m_rotationHandle->brush().color(); + brushColorHandle.setAlpha(alpha); + m_rotationHandle->setBrush(QBrush(brushColorHandle)); + trace(); + update(); } diff --git a/Src/View/ComponentShape.h b/Src/View/ComponentShape.h index 12490040..04eace35 100644 --- a/Src/View/ComponentShape.h +++ b/Src/View/ComponentShape.h @@ -1,7 +1,7 @@ #ifndef COMPONENTSHAPE_H #define COMPONENTSHAPE_H -#include "QGraphicsObject" +#include "QGraphicsObject" #include "Interfaces/IView/IViewTrackedComponent.h" #include "Interfaces/IModel/IModelTrackedComponent.h" #include "qpainter.h" @@ -11,213 +11,236 @@ #include "QTime" #include "View/Utility/RotationHandle.h" - /** -* This class inherits QGraphicsObject. -* It is a child of the TrackedComponentView and is generated by it for -* each trajectory in the tracking data. It visualizes the corresponding entity of the -* trajectory in the current frame of the medium. If there is no tracking data for that frame, -* this shape is hidden. It deletes itself when the trajectory is a nullpointer. -* It contains user interaction functionality to move, remove and rotate the -* corresponding entity or trajectory. -* The form/type is set when created (from entity: ellipse, point, rectangle, polygon) -* It can be changed by the user via the context menu -*/ + * This class inherits QGraphicsObject. + * It is a child of the TrackedComponentView and is generated by it for + * each trajectory in the tracking data. It visualizes the corresponding entity + * of the trajectory in the current frame of the medium. If there is no + * tracking data for that frame, this shape is hidden. It deletes itself when + * the trajectory is a nullpointer. It contains user interaction functionality + * to move, remove and rotate the corresponding entity or trajectory. The + * form/type is set when created (from entity: ellipse, point, rectangle, + * polygon) It can be changed by the user via the context menu + */ class ComponentShape : public QGraphicsObject { - Q_OBJECT + Q_OBJECT public: - //Constructor - ComponentShape(QGraphicsObject* parent = 0, IModelTrackedTrajectory* trajectory = 0, int id = -1); - ~ComponentShape(); - - //QGraphicsItem interface - QRectF boundingRect() const override; - void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; - QPainterPath shape() const override; - bool advance(); - //////////////////////////////// - - - /** - * called by view when tracking data was modified - * updates this with data from new current entity - * --> rotation, position, etc.... - */ - bool updateAttributes(uint framenumber); - - /// returns the corresponding traj - IModelTrackedTrajectory* getTrajectory(); - - /// set permission to enable/disable certain user interactions - void setPermission(std::pair permission); - - /// returns ID of corresponding trajectory - int getId(); - - /// returns swappable permission - bool isSwappable(); - /// returns removeable permission - bool isRemovable(); - /// returns rotatable permission - bool isRotatable(); - - /// helper function - QPoint getOldPos(); - - /// attemps to draw tracers, if _tracingStyle is set tracers are drawn - void trace(); - - /// called in constructor to setup the members with default vlaues from coreparameter component - void setMembers(CoreParameter* coreParams); - - //public members - int m_currentFramenumber; /**< current visualized framenumber --> entity */ - //to fix a bug when moving; TODO better - int m_w; /**< width of this; if polygon width of bounding rect of polygon */ - int m_h; /**< height of this; if polygon height of bounding rect of polygon */ - - QGraphicsRectItem* m_tracingLayer; /**< the layer with all tracers; is counter-rotated if component shape is rotated */ - + // Constructor + ComponentShape(QGraphicsObject* parent = 0, + IModelTrackedTrajectory* trajectory = 0, + int id = -1); + ~ComponentShape(); + + // QGraphicsItem interface + QRectF boundingRect() const override; + void paint(QPainter* painter, + const QStyleOptionGraphicsItem* option, + QWidget* widget) override; + QPainterPath shape() const override; + bool advance(); + //////////////////////////////// + + /** + * called by view when tracking data was modified + * updates this with data from new current entity + * --> rotation, position, etc.... + */ + bool updateAttributes(uint framenumber); + + /// returns the corresponding traj + IModelTrackedTrajectory* getTrajectory(); + + /// set permission to enable/disable certain user interactions + void setPermission(std::pair permission); + + /// returns ID of corresponding trajectory + int getId(); + + /// returns swappable permission + bool isSwappable(); + /// returns removeable permission + bool isRemovable(); + /// returns rotatable permission + bool isRotatable(); + + /// helper function + QPoint getOldPos(); + + /// attemps to draw tracers, if _tracingStyle is set tracers are drawn + void trace(); + + /// called in constructor to setup the members with default vlaues from + /// coreparameter component + void setMembers(CoreParameter* coreParams); + + // public members + int m_currentFramenumber; /**< current visualized framenumber --> entity */ + // to fix a bug when moving; TODO better + int m_w; /**< width of this; if polygon width of bounding rect of polygon + */ + int m_h; /**< height of this; if polygon height of bounding rect of polygon + */ + + QGraphicsRectItem* + m_tracingLayer; /**< the layer with all tracers; is counter-rotated if + component shape is rotated */ signals: - /* - * These are the signals sent to the command component. - * They are all modifiying the trakcing data. - * They contain all the data to reverse them (in the commands component). - */ - void emitRemoveTrajectory(IModelTrackedTrajectory* trajectory); - void emitRemoveTrackEntity(IModelTrackedTrajectory* trajectory, uint frameNumber); - void emitMoveElement(IModelTrackedTrajectory* trajectory, QPoint oldPos, QPoint newPos, uint frameNumber, int sizeOfStackToMove); - void emitToggleFixTrack(IModelTrackedTrajectory* trajectory, bool toggle); - void emitEntityRotation(IModelTrackedTrajectory* trajectory, double oldAngleDeg, double newAngleDeg, uint frameNumber); - ///////////////////////////////////////////// - - void emitGoToFrame(int frame); - /// each user movement gets broadcasted to other shapes - void broadcastMove(); - - public Q_SLOTS: - //context menu actions - //(actions only give trigger signals and therefore can only connect to parameterless slots) - void changeBrushColor(); - void changePenColor(); - void changeBrushColor(QColor color); - void changePenColor(QColor color); - bool removeTrack(); - bool removeTrackEntity(); - void markShape(int penwidth = 0); - void unmarkShape(); - void toggleFixTrack(); - void createInfoWindow(); - void setObjectNameContext(QString name); - void morphIntoRect(); - void morphIntoEllipse(); - void morphIntoPoint(); - void morphIntoPolygon(); - ////////////////////////////////////////////// - - - //Tracing - void receiveTracingLength(int tracingLength); - void receiveTracingStyle(QString style); - void receiveTracingSteps(int steps); - void receiveTracingTimeDegradation(QString timeDegradation); - void receiveTracerProportions(float proportion); - void receiveTracerOrientationLine(bool toggle); - void receiveTracerFrameNumber(bool toggle); - //Visual - void receiveAntialiasing(bool toggle); - void receiveTransparency(int alpha); - //Dimensions - void receiveDimensions(int width, int height); - void receiveHeight(int height); - void receiveWidth(int width); - void setDimensionsToDefault(); - void receiveToggleOrientationLine(bool toggle); - void receiveShowId(bool toggle); - void receiveShapeRotation(double angle, bool rotateEntity); - //Ignore zoom (disabled) - void receiveIgnoreZoom(bool toggle); - + /* + * These are the signals sent to the command component. + * They are all modifiying the trakcing data. + * They contain all the data to reverse them (in the commands component). + */ + void emitRemoveTrajectory(IModelTrackedTrajectory* trajectory); + void emitRemoveTrackEntity(IModelTrackedTrajectory* trajectory, + uint frameNumber); + void emitMoveElement(IModelTrackedTrajectory* trajectory, + QPoint oldPos, + QPoint newPos, + uint frameNumber, + int sizeOfStackToMove); + void emitToggleFixTrack(IModelTrackedTrajectory* trajectory, bool toggle); + void emitEntityRotation(IModelTrackedTrajectory* trajectory, + double oldAngleDeg, + double newAngleDeg, + uint frameNumber); + ///////////////////////////////////////////// + + void emitGoToFrame(int frame); + /// each user movement gets broadcasted to other shapes + void broadcastMove(); + +public Q_SLOTS: + // context menu actions + //(actions only give trigger signals and therefore can only connect to + // parameterless slots) + void changeBrushColor(); + void changePenColor(); + void changeBrushColor(QColor color); + void changePenColor(QColor color); + bool removeTrack(); + bool removeTrackEntity(); + void markShape(int penwidth = 0); + void unmarkShape(); + void toggleFixTrack(); + void createInfoWindow(); + void setObjectNameContext(QString name); + void morphIntoRect(); + void morphIntoEllipse(); + void morphIntoPoint(); + void morphIntoPolygon(); + ////////////////////////////////////////////// + + // Tracing + void receiveTracingLength(int tracingLength); + void receiveTracingStyle(QString style); + void receiveTracingSteps(int steps); + void receiveTracingTimeDegradation(QString timeDegradation); + void receiveTracerProportions(float proportion); + void receiveTracerOrientationLine(bool toggle); + void receiveTracerFrameNumber(bool toggle); + // Visual + void receiveAntialiasing(bool toggle); + void receiveTransparency(int alpha); + // Dimensions + void receiveDimensions(int width, int height); + void receiveHeight(int height); + void receiveWidth(int width); + void setDimensionsToDefault(); + void receiveToggleOrientationLine(bool toggle); + void receiveShowId(bool toggle); + void receiveShapeRotation(double angle, bool rotateEntity); + // Ignore zoom (disabled) + void receiveIgnoreZoom(bool toggle); protected: - //QGraphicsItem interface - QVariant itemChange(GraphicsItemChange change, const QVariant &value) override; - void mousePressEvent(QGraphicsSceneMouseEvent *event) override; - void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override; - void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; - void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override; - //////////////////////////////// - - //constrains angles under 0 or over 360 degrees to [0, 360] - double constrainAngle(double x); + // QGraphicsItem interface + QVariant itemChange(GraphicsItemChange change, + const QVariant& value) override; + void mousePressEvent(QGraphicsSceneMouseEvent* event) override; + void mouseReleaseEvent(QGraphicsSceneMouseEvent* event) override; + void mouseMoveEvent(QGraphicsSceneMouseEvent* event) override; + void contextMenuEvent(QGraphicsSceneContextMenuEvent* event) override; + //////////////////////////////// + + // constrains angles under 0 or over 360 degrees to [0, 360] + double constrainAngle(double x); private: - - /* - * MEMBERS - */ - - QGraphicsObject *m_parent; - - //permissions - std::map m_permissions; /**< list of permissions */ - bool m_pMovable; /**< permission to move the component shape */ - bool m_pRemovable; /**< permission to remove the component shape */ - bool m_pSwappable; /**< permission to move the component shape */ - bool m_pRotatable; /**< permission to move the component shape */ - - //dimensions - - //int m_z; - int m_wDefault = 20; /**< default width, will be set by entity */ - int m_hDefault = 20; /**< default height, will be set by entity */ - bool m_useDefaultDimensions; /**< true, if dimensions were changed by user, they will stay */ - - // appearance - QColor m_penColor; /**< border color */ - QColor m_penColorLast; /**< last border color */ - QColor m_brushColor; /**< fill color */ - int m_transparency; /**< transparency of this */ - bool m_marked; /**< if marked, border is thick */ - int m_penWidth; /**< border_thickness */ - Qt::PenStyle m_penStyle; /**< style of border */ - Qt::PenStyle m_penStylePrev; /**< last stlye of border */ - bool m_antialiasing; /**< if true, antialiasing in enabled */ - - // tracing - QString m_tracingStyle; /**< tracing style (none, path, arrow, shape) */ - int m_tracingLength; /**< sets how many tracers are drawn (history) */ - int m_tracingSteps; /**< sets each x'th tracer is drawn */ - QString m_tracingTimeDegradation; /**< sets tracer color style (default, transparency, false color) */ - float m_tracerProportions; /**< set the tracers proportion relative to component shape */ - bool m_tracingOrientationLine; /**< toggles if orientation line is shwon for tracers */ - bool m_tracerFrameNumber; /**< toggles if tracer's framenumber is shown (very slow) */ - - // rotation - float m_rotation; /**< the current rotation of the compontent shape and entity */ - QLineF m_rotationLine; /**< the orientation line */ - RotationHandle* m_rotationHandle; /**< the handle with wich the user can change the rotation */ - QGraphicsRectItem* m_rotationHandleLayer;/**< help layer for rotation handle */ - bool m_orientationLine; /**< toggles if _rotationLine is shown */ - - // misc - int m_id; /**< the traj's ID */ - bool m_showId; /**< toggles if id is shown in center */ - IModelTrackedTrajectory* m_trajectory; /**< the corresponding traj */ - QList m_polygons; /**< list of polygons to draw (if entity inherited from polygon) */ - bool m_fixed; /**< if fixed, border is dotted and tracker cannot change traj data */ - //bool m_trajectoryWasActiveOnce; /**< unused */ - QPoint m_oldPos; /**< position before moving by hand */ - - // dragging - bool m_dragged; /**< true if currently dragged */ - QTime m_mousePressTime; /**< helper for dragging */ - QPoint m_mousePressPos; /**< helper for dragging */ + /* + * MEMBERS + */ + + QGraphicsObject* m_parent; + + // permissions + std::map + m_permissions; /**< list of permissions */ + bool m_pMovable; /**< permission to move the component shape */ + bool m_pRemovable; /**< permission to remove the component shape */ + bool m_pSwappable; /**< permission to move the component shape */ + bool m_pRotatable; /**< permission to move the component shape */ + + // dimensions + + // int m_z; + int m_wDefault = 20; /**< default width, will be set by entity */ + int m_hDefault = 20; /**< default height, will be set by entity */ + bool m_useDefaultDimensions; /**< true, if dimensions were changed by user, + they will stay */ + + // appearance + QColor m_penColor; /**< border color */ + QColor m_penColorLast; /**< last border color */ + QColor m_brushColor; /**< fill color */ + int m_transparency; /**< transparency of this */ + bool m_marked; /**< if marked, border is thick */ + int m_penWidth; /**< border_thickness */ + Qt::PenStyle m_penStyle; /**< style of border */ + Qt::PenStyle m_penStylePrev; /**< last stlye of border */ + bool m_antialiasing; /**< if true, antialiasing in enabled */ + + // tracing + QString m_tracingStyle; /**< tracing style (none, path, arrow, shape) */ + int m_tracingLength; /**< sets how many tracers are drawn (history) */ + int m_tracingSteps; /**< sets each x'th tracer is drawn */ + QString m_tracingTimeDegradation; /**< sets tracer color style (default, + transparency, false color) */ + float m_tracerProportions; /**< set the tracers proportion relative to + component shape */ + bool m_tracingOrientationLine; /**< toggles if orientation line is shwon + for tracers */ + bool m_tracerFrameNumber; /**< toggles if tracer's framenumber is shown + (very slow) */ + + // rotation + float m_rotation; /**< the current rotation of the compontent shape and + entity */ + QLineF m_rotationLine; /**< the orientation line */ + RotationHandle* m_rotationHandle; /**< the handle with wich the user can + change the rotation */ + QGraphicsRectItem* + m_rotationHandleLayer; /**< help layer for rotation handle */ + bool m_orientationLine; /**< toggles if _rotationLine is shown */ + + // misc + int m_id; /**< the traj's ID */ + bool m_showId; /**< toggles if id is shown in center */ + IModelTrackedTrajectory* m_trajectory; /**< the corresponding traj */ + QList m_polygons; /**< list of polygons to draw (if entity + inherited from polygon) */ + bool m_fixed; /**< if fixed, border is dotted and tracker cannot change + traj data */ + // bool m_trajectoryWasActiveOnce; /**< unused */ + QPoint m_oldPos; /**< position before moving by hand */ + + // dragging + bool m_dragged; /**< true if currently dragged */ + QTime m_mousePressTime; /**< helper for dragging */ + QPoint m_mousePressPos; /**< helper for dragging */ }; - #endif // COMPONENTSHAPE_H diff --git a/Src/View/CoreParameterView.cpp b/Src/View/CoreParameterView.cpp index ea63afa2..fcc8a9ac 100644 --- a/Src/View/CoreParameterView.cpp +++ b/Src/View/CoreParameterView.cpp @@ -11,18 +11,22 @@ #include #include "Controller/IControllerCfg.h" -CoreParameterView::CoreParameterView(QWidget *parent, IController *controller, IModel *model) : - IViewWidget(parent, controller, model), - ui(new Ui::CoreParameterView) +CoreParameterView::CoreParameterView(QWidget* parent, + IController* controller, + IModel* model) +: IViewWidget(parent, controller, model) +, ui(new Ui::CoreParameterView) { - _cfg = static_cast(controller)->getConfig(); - ui->setupUi(this); + _cfg = static_cast(controller)->getConfig(); + ui->setupUi(this); ui->lineEditRectWidth->setValidator(new QDoubleValidator(this)); ui->lineEditRectHeight->setValidator(new QDoubleValidator(this)); - double h = std::max(_cfg->RectificationHeight, std::numeric_limits::epsilon()); - double w = std::max(_cfg->RectificationWidth, std::numeric_limits::epsilon()); + double h = std::max(_cfg->RectificationHeight, + std::numeric_limits::epsilon()); + double w = std::max(_cfg->RectificationWidth, + std::numeric_limits::epsilon()); std::string sw = std::to_string(w); std::string sh = std::to_string(h); sh.erase(sh.find_last_not_of('0') + 1, std::string::npos); @@ -30,154 +34,160 @@ CoreParameterView::CoreParameterView(QWidget *parent, IController *controller, I ui->lineEditRectWidth->setText(sw.c_str()); ui->lineEditRectHeight->setText(sh.c_str()); - //TODO implement it correctly before enabling again - ui->checkBoxIgnoreZoom->hide(); - - CoreParameter* coreParams = dynamic_cast(model); + // TODO implement it correctly before enabling again + ui->checkBoxIgnoreZoom->hide(); - int trial = dynamic_cast(controller)->getTrialNumber(); + CoreParameter* coreParams = dynamic_cast(model); + + int trial = + dynamic_cast(controller)->getTrialNumber(); ui->label_ExpTrialNo->setText(std::to_string(trial).c_str()); - fillUI(); - setStyle(); + fillUI(); + setStyle(); - getNotified(); + getNotified(); } CoreParameterView::~CoreParameterView() { - delete ui; + delete ui; } -QWidget * CoreParameterView::getTrackerHook() +QWidget* CoreParameterView::getTrackerHook() { - //return ui->tabWidgetParameters; - //dead code - return nullptr; + // return ui->tabWidgetParameters; + // dead code + return nullptr; } -void CoreParameterView::setPermission(std::pair permission) +void CoreParameterView::setPermission( + std::pair permission) { - //first check if permission is for view, if not pass permission to shapes -> view has all permissions, shapes only certain ones - if (permission.first == ENUMS::COREPERMISSIONS::COMPONENTVIEW && permission.second == false) { - //disable everything but the area descriptor groupbox - ui->checkBoxEnableCoreView->setEnabled(false); - ui->groupBoxTracks->setEnabled(false); - ui->groupBoxTracing->setEnabled(false); - ui->groupBoxMiscellaneous->setEnabled(false); - ui->groupBoxAnno->setEnabled(false); - ui->groupBoxRectificationParm->setEnabled(true); - _expertSwitch->setEnabled(false); - return; - } - //does not need to be propagated to shapes; only handled by view - //TODO: move this to controller - if (permission.first == ENUMS::COREPERMISSIONS::COMPONENTADD && permission.second == false) { - this->ui->pushButton_addTraj->setDisabled(true); - return; - } - - + // first check if permission is for view, if not pass permission to shapes + // -> view has all permissions, shapes only certain ones + if (permission.first == ENUMS::COREPERMISSIONS::COMPONENTVIEW && + permission.second == false) { + // disable everything but the area descriptor groupbox + ui->checkBoxEnableCoreView->setEnabled(false); + ui->groupBoxTracks->setEnabled(false); + ui->groupBoxTracing->setEnabled(false); + ui->groupBoxMiscellaneous->setEnabled(false); + ui->groupBoxAnno->setEnabled(false); + ui->groupBoxRectificationParm->setEnabled(true); + _expertSwitch->setEnabled(false); + return; + } + // does not need to be propagated to shapes; only handled by view + // TODO: move this to controller + if (permission.first == ENUMS::COREPERMISSIONS::COMPONENTADD && + permission.second == false) { + this->ui->pushButton_addTraj->setDisabled(true); + return; + } } -void CoreParameterView::triggerUpdate() { +void CoreParameterView::triggerUpdate() +{ on_checkBoxDisplayTrackingArea_stateChanged(0); on_checkBoxDisplayRectification_stateChanged(0); on_checkboxTrackingAreaAsEllipse_stateChanged(0); } -void CoreParameterView::areaDescriptorTypeChanged(QString type) { +void CoreParameterView::areaDescriptorTypeChanged(QString type) +{ if (type != "0") { ui->checkboxTrackingAreaAsEllipse->setChecked(true); - } - else { + } else { ui->checkboxTrackingAreaAsEllipse->setChecked(false); } } -void CoreParameterView::on_checkBoxEnableCoreView_stateChanged(int v) -{ - CoreParameter* coreParams = dynamic_cast(getModel()); - //disable - if (ui->checkBoxEnableCoreView->checkState() == Qt::Unchecked) { - //disable all groupboxes but the area descriptor one - ui->groupBoxTracks->setEnabled(false); - ui->groupBoxTracing->setEnabled(false); - ui->groupBoxMiscellaneous->setEnabled(false); - ui->groupBoxAnno->setEnabled(false); - ui->groupBoxRectificationParm->setEnabled(true); - _expertSwitch->setEnabled(false); - - - emitViewSwitch(false); - coreParams->m_viewSwitch = false; - } - //enable - else if (ui->checkBoxEnableCoreView->checkState() == Qt::Checked){ - //enable all groupboxes - ui->groupBoxTracks->setEnabled(true); - ui->groupBoxTracing->setEnabled(true); - ui->groupBoxMiscellaneous->setEnabled(true); - ui->groupBoxAnno->setEnabled(true); - ui->groupBoxRectificationParm->setEnabled(true); - _expertSwitch->setEnabled(true); - - emitViewSwitch(true); - coreParams->m_viewSwitch = true; - } -} - -void CoreParameterView::on_comboBoxTracingStyle_currentIndexChanged(const QString & text) -{ - CoreParameter* coreParams = dynamic_cast(getModel()); - coreParams->m_tracingStyle = text; - emitTracingStyle(text); +void CoreParameterView::on_checkBoxEnableCoreView_stateChanged(int v) +{ + CoreParameter* coreParams = dynamic_cast(getModel()); + // disable + if (ui->checkBoxEnableCoreView->checkState() == Qt::Unchecked) { + // disable all groupboxes but the area descriptor one + ui->groupBoxTracks->setEnabled(false); + ui->groupBoxTracing->setEnabled(false); + ui->groupBoxMiscellaneous->setEnabled(false); + ui->groupBoxAnno->setEnabled(false); + ui->groupBoxRectificationParm->setEnabled(true); + _expertSwitch->setEnabled(false); + + emitViewSwitch(false); + coreParams->m_viewSwitch = false; + } + // enable + else if (ui->checkBoxEnableCoreView->checkState() == Qt::Checked) { + // enable all groupboxes + ui->groupBoxTracks->setEnabled(true); + ui->groupBoxTracing->setEnabled(true); + ui->groupBoxMiscellaneous->setEnabled(true); + ui->groupBoxAnno->setEnabled(true); + ui->groupBoxRectificationParm->setEnabled(true); + _expertSwitch->setEnabled(true); + + emitViewSwitch(true); + coreParams->m_viewSwitch = true; + } +} + +void CoreParameterView::on_comboBoxTracingStyle_currentIndexChanged( + const QString& text) +{ + CoreParameter* coreParams = dynamic_cast(getModel()); + coreParams->m_tracingStyle = text; + emitTracingStyle(text); } void CoreParameterView::on_spinBoxTracingHistoryLength_valueChanged(int i) { - CoreParameter* coreParams = dynamic_cast(getModel()); - //int value = ui->spinBoxTracingHistoryLength->value(); - coreParams->m_tracingHistory = i; - emitTracingHistoryLength(i); + CoreParameter* coreParams = dynamic_cast(getModel()); + // int value = ui->spinBoxTracingHistoryLength->value(); + coreParams->m_tracingHistory = i; + emitTracingHistoryLength(i); } void CoreParameterView::on_spinBoxTracingSteps_valueChanged(int i) { - CoreParameter* coreParams = dynamic_cast(getModel()); - //int value = ui->spinBoxTracingSteps->value(); - coreParams->m_tracingSteps = i; - emitTracingSteps(i); + CoreParameter* coreParams = dynamic_cast(getModel()); + // int value = ui->spinBoxTracingSteps->value(); + coreParams->m_tracingSteps = i; + emitTracingSteps(i); } -void CoreParameterView::on_comboBoxTracingTimeDegradation_currentIndexChanged(const QString & text) +void CoreParameterView::on_comboBoxTracingTimeDegradation_currentIndexChanged( + const QString& text) { - CoreParameter* coreParams = dynamic_cast(getModel()); - coreParams->m_tracingTimeDegradation = text; - emitTracingTimeDegradation(text); + CoreParameter* coreParams = dynamic_cast(getModel()); + coreParams->m_tracingTimeDegradation = text; + emitTracingTimeDegradation(text); } void CoreParameterView::on_checkBoxTracerFrameNumber_stateChanged(int toggle) { - CoreParameter* coreParams = dynamic_cast(getModel()); - coreParams->m_tracerFrameNumber = toggle; - emitTracerFrameNumber(toggle); + CoreParameter* coreParams = dynamic_cast(getModel()); + coreParams->m_tracerFrameNumber = toggle; + emitTracerFrameNumber(toggle); } void CoreParameterView::on_spinBoxTracerProportions_valueChanged(double d) { - CoreParameter* coreParams = dynamic_cast(getModel()); - //float value = (float)ui->spinBoxTracerProportions->value(); - coreParams->m_tracerProportions = d; - emitTracerProportions(d); + CoreParameter* coreParams = dynamic_cast(getModel()); + // float value = (float)ui->spinBoxTracerProportions->value(); + coreParams->m_tracerProportions = d; + emitTracerProportions(d); } -void CoreParameterView::on_checkBoxTracerOrientationLine_stateChanged(int toggle) +void CoreParameterView::on_checkBoxTracerOrientationLine_stateChanged( + int toggle) { - CoreParameter* coreParams = dynamic_cast(getModel()); - coreParams->m_tracerOrientationLine = toggle; - emitTracerOrientationLine(toggle); + CoreParameter* coreParams = dynamic_cast(getModel()); + coreParams->m_tracerOrientationLine = toggle; + emitTracerOrientationLine(toggle); } // void CoreParameterView::on_pushButtonSelectAll_clicked() @@ -192,341 +202,418 @@ void CoreParameterView::on_checkBoxTracerOrientationLine_stateChanged(int toggle void CoreParameterView::on_checkBoxIgnoreZoom_stateChanged(int v) { - CoreParameter* coreParams = dynamic_cast(getModel()); - coreParams->m_ignoreZoom = v; - emitIgnoreZoom(v); + CoreParameter* coreParams = dynamic_cast(getModel()); + coreParams->m_ignoreZoom = v; + emitIgnoreZoom(v); } -//TODO show current color +// TODO show current color void CoreParameterView::on_pushButtonColorChangeBorder_clicked() { - emitColorChangeBorderAll(); + emitColorChangeBorderAll(); } void CoreParameterView::on_pushButtonColorChangeBorderSelected_clicked() { - emitColorChangeBorderSelected(); + emitColorChangeBorderSelected(); } -//TODO show current color +// TODO show current color void CoreParameterView::on_pushButtonColorChangeBrush_clicked() { - emitColorChangeBrushAll(); + emitColorChangeBrushAll(); } void CoreParameterView::on_pushButtonColorchangeBrushSelected_clicked() { - emitColorChangeBrushSelected(); + emitColorChangeBrushSelected(); } void CoreParameterView::on_checkBoxTrackOrientationLine_stateChanged(int v) { - CoreParameter* coreParams = dynamic_cast(getModel()); - coreParams->m_trackOrientationLine = v; - emitTrackOrientationLine(v); + CoreParameter* coreParams = dynamic_cast(getModel()); + coreParams->m_trackOrientationLine = v; + emitTrackOrientationLine(v); } void CoreParameterView::on_checkBoxShowId_stateChanged(int v) { - CoreParameter* coreParams = dynamic_cast(getModel()); - coreParams->m_trackShowId = v; - emitTrackShowId(v); + CoreParameter* coreParams = dynamic_cast(getModel()); + coreParams->m_trackShowId = v; + emitTrackShowId(v); } -// if dimensions are set for all tracks they are going to be set for new tracks aswell +// if dimensions are set for all tracks they are going to be set for new tracks +// aswell void CoreParameterView::on_pushButtonTrackDimensionSetterAll_clicked() { - int width = ui->spinboxTrackWidth->value(); - int height = ui->spinBoxTrackHeight->value(); + int width = ui->spinboxTrackWidth->value(); + int height = ui->spinBoxTrackHeight->value(); - CoreParameter* coreParams = dynamic_cast(getModel()); - if (coreParams) { - coreParams->m_trackWidth = width; - coreParams->m_trackHeight = height; + CoreParameter* coreParams = dynamic_cast(getModel()); + if (coreParams) { + coreParams->m_trackWidth = width; + coreParams->m_trackHeight = height; - emitTrackDimensionsAll(width, height); - } + emitTrackDimensionsAll(width, height); + } } void CoreParameterView::on_pushButtonTrackDimensionSetterSelected_clicked() { - int width = ui->spinboxTrackWidth->value(); - int height = ui->spinBoxTrackHeight->value(); - emitTrackDimensionsSelected(width, height); + int width = ui->spinboxTrackWidth->value(); + int height = ui->spinBoxTrackHeight->value(); + emitTrackDimensionsSelected(width, height); } void CoreParameterView::on_pushButtonDefaultDimensions_clicked() { - emitTrackDimensionsSetDefault(); + emitTrackDimensionsSetDefault(); } -void CoreParameterView::on_lineEditRectWidth_textChanged(QString s) { - double w = std::max(::atof(ui->lineEditRectWidth->text().toStdString().c_str()), std::numeric_limits::epsilon()); - double h = std::max(::atof(ui->lineEditRectHeight->text().toStdString().c_str()), std::numeric_limits::epsilon()); - Q_EMIT emitRectDimensions(w,h); +void CoreParameterView::on_lineEditRectWidth_textChanged(QString s) +{ + double w = std::max( + ::atof(ui->lineEditRectWidth->text().toStdString().c_str()), + std::numeric_limits::epsilon()); + double h = std::max( + ::atof(ui->lineEditRectHeight->text().toStdString().c_str()), + std::numeric_limits::epsilon()); + Q_EMIT emitRectDimensions(w, h); } -void CoreParameterView::on_lineEditRectHeight_textChanged(QString s) { - double w = std::max(::atof(ui->lineEditRectWidth->text().toStdString().c_str()), std::numeric_limits::epsilon()); - double h = std::max(::atof(ui->lineEditRectHeight->text().toStdString().c_str()), std::numeric_limits::epsilon()); - Q_EMIT emitRectDimensions(w, h); +void CoreParameterView::on_lineEditRectHeight_textChanged(QString s) +{ + double w = std::max( + ::atof(ui->lineEditRectWidth->text().toStdString().c_str()), + std::numeric_limits::epsilon()); + double h = std::max( + ::atof(ui->lineEditRectHeight->text().toStdString().c_str()), + std::numeric_limits::epsilon()); + Q_EMIT emitRectDimensions(w, h); } -void CoreParameterView::on_checkBoxDisplayTrackingArea_stateChanged(int v) { - Q_EMIT emitDisplayTrackingArea(ui->checkBoxDisplayTrackingArea->isChecked()); +void CoreParameterView::on_checkBoxDisplayTrackingArea_stateChanged(int v) +{ + Q_EMIT emitDisplayTrackingArea( + ui->checkBoxDisplayTrackingArea->isChecked()); } -void CoreParameterView::on_checkBoxDisplayRectification_stateChanged(int v) { - Q_EMIT emitDisplayRectification(ui->checkBoxDisplayRectification->isChecked()); +void CoreParameterView::on_checkBoxDisplayRectification_stateChanged(int v) +{ + Q_EMIT emitDisplayRectification( + ui->checkBoxDisplayRectification->isChecked()); } -void CoreParameterView::on_checkboxTrackingAreaAsEllipse_stateChanged(int v) { - Q_EMIT emitTrackingAreaAsEllipse(ui->checkboxTrackingAreaAsEllipse->isChecked()); +void CoreParameterView::on_checkboxTrackingAreaAsEllipse_stateChanged(int v) +{ + Q_EMIT emitTrackingAreaAsEllipse( + ui->checkboxTrackingAreaAsEllipse->isChecked()); } void CoreParameterView::on_pushButtonAnnoColor_clicked() { - QPalette pal = ui->pushButtonAnnoColor->palette(); - QColor oldColor = pal.color(QPalette::Button); - QColor newAnnoColor = QColorDialog::getColor(oldColor, Q_NULLPTR ,"Set new annotation color", QColorDialog::ShowAlphaChannel); - - if (newAnnoColor.isValid()) { - QPalette pal = ui->pushButtonAnnoColor->palette(); - pal.setColor(QPalette::Button, newAnnoColor); - ui->pushButtonAnnoColor->setAutoFillBackground(true); - ui->pushButtonAnnoColor->setPalette(pal); - ui->pushButtonAnnoColor->update(); - ui->pushButtonAnnoColor->setAutoFillBackground(true); - ui->pushButtonAnnoColor->setFlat(true); - - Q_EMIT emitSetAnnoColor(newAnnoColor); - } - - + QPalette pal = ui->pushButtonAnnoColor->palette(); + QColor oldColor = pal.color(QPalette::Button); + QColor newAnnoColor = QColorDialog::getColor( + oldColor, + Q_NULLPTR, + "Set new annotation color", + QColorDialog::ShowAlphaChannel); + + if (newAnnoColor.isValid()) { + QPalette pal = ui->pushButtonAnnoColor->palette(); + pal.setColor(QPalette::Button, newAnnoColor); + ui->pushButtonAnnoColor->setAutoFillBackground(true); + ui->pushButtonAnnoColor->setPalette(pal); + ui->pushButtonAnnoColor->update(); + ui->pushButtonAnnoColor->setAutoFillBackground(true); + ui->pushButtonAnnoColor->setFlat(true); + + Q_EMIT emitSetAnnoColor(newAnnoColor); + } } -void CoreParameterView::toggleExpertOptions(bool toggle){ - ui->groupBoxTracerDimensions->setVisible(toggle); - ui->groupBoxMiscellaneous->setVisible(toggle); - ui->groupBoxTrackDimensions->setVisible(toggle); - ui->groupBoxTracerDimensions->setVisible(toggle); - ui->groupBoxAnno->setVisible(toggle); +void CoreParameterView::toggleExpertOptions(bool toggle) +{ + ui->groupBoxTracerDimensions->setVisible(toggle); + ui->groupBoxMiscellaneous->setVisible(toggle); + ui->groupBoxTrackDimensions->setVisible(toggle); + ui->groupBoxTracerDimensions->setVisible(toggle); + ui->groupBoxAnno->setVisible(toggle); - ui->checkBoxTracerFrameNumber->setVisible(toggle); - ui->checkBoxShowId->setVisible(toggle); + ui->checkBoxTracerFrameNumber->setVisible(toggle); + ui->checkBoxShowId->setVisible(toggle); } void CoreParameterView::on_checkBoxAntialiasingEntities_toggled(bool toggle) { - CoreParameter* coreParams = dynamic_cast(getModel()); - coreParams->m_antialiasingEntities = toggle; - emitToggleAntialiasingEntities(toggle); + CoreParameter* coreParams = dynamic_cast(getModel()); + coreParams->m_antialiasingEntities = toggle; + emitToggleAntialiasingEntities(toggle); } void CoreParameterView::on_checkBoxAntialiasingFull_toggled(bool toggle) { - CoreParameter* coreParams = dynamic_cast(getModel()); - coreParams->m_antialiasingFull = toggle; - emitToggleAntialiasingFull(toggle); -} - -void CoreParameterView::fillUI() -{ - //add switchbutton for expert options - _expertSwitch = new SwitchButton("not advanced", "advanced"); - ui->widgetParameterLayout->addWidget(_expertSwitch); - QObject::connect(_expertSwitch , &SwitchButton::emitSetEnabled, this, &CoreParameterView::toggleExpertOptions, Qt::DirectConnection); - - //setup ui from params - CoreParameter* coreParams = dynamic_cast(getModel()); - - //view toggle - ui->checkBoxEnableCoreView->setChecked(coreParams->m_viewSwitch); - //track ignore zoom - ui->checkBoxIgnoreZoom->setChecked(coreParams->m_ignoreZoom); - //track orientation line - ui->checkBoxTrackOrientationLine->setChecked(coreParams->m_trackOrientationLine); - //track show id - ui->checkBoxShowId->setChecked(coreParams->m_trackShowId); - //tracer proportions - ui->spinBoxTracerProportions->setValue(coreParams->m_tracerProportions); - //tracer orientation line - ui->checkBoxTracerOrientationLine->setChecked(coreParams->m_tracerOrientationLine); - //tracing style - if (coreParams->m_tracingStyle == "No tracing") { ui->comboBoxTracingStyle->setCurrentIndex(0); } - //tracing time degradation - if (coreParams->m_tracingTimeDegradation == "None") { ui->comboBoxTracingTimeDegradation->setCurrentIndex(0); } - //tracing history - if (coreParams->m_tracingHistory) { ui->spinBoxTracingHistoryLength->setValue(coreParams->m_tracingHistory); } - //tracing steps - if (coreParams->m_tracingSteps) { ui->spinBoxTracingSteps->setValue(coreParams->m_tracingSteps); } - //tracer frame number - ui->checkBoxTracerFrameNumber->setChecked(coreParams->m_tracerFrameNumber); - //antialiasing - ui->checkBoxAntialiasingEntities->setChecked(coreParams->m_antialiasingEntities); - ui->checkBoxAntialiasingFull->setChecked(coreParams->m_antialiasingFull); - //track width - if (coreParams->m_trackWidth) { ui->spinboxTrackWidth->setValue(coreParams->m_trackWidth); } - //track height - if (coreParams->m_trackHeight) { ui->spinBoxTrackHeight->setValue(coreParams->m_trackHeight); } - - //annotation color button - QPalette pal = ui->pushButtonAnnoColor->palette(); - pal.setColor(QPalette::Button, Qt::yellow); - ui->pushButtonAnnoColor->setAutoFillBackground(true); - ui->pushButtonAnnoColor->setPalette(pal); - ui->pushButtonAnnoColor->setFlat(true); - ui->pushButtonAnnoColor->update(); - - //enable/disable widgets - - //expert options - if (_expertSwitch->state()) { - ui->groupBoxTracerDimensions->show(); - ui->groupBoxMiscellaneous->show(); - ui->groupBoxTrackDimensions->show(); - ui->groupBoxAnno->show(); - ui->checkBoxTracerFrameNumber->show(); - ui->checkBoxShowId->show(); - } - else { - ui->groupBoxTracerDimensions->hide(); - ui->groupBoxMiscellaneous->hide(); - ui->groupBoxTrackDimensions->hide(); - ui->groupBoxAnno->hide(); - ui->checkBoxTracerFrameNumber->hide(); - ui->checkBoxShowId->hide(); - - } -} - -void CoreParameterView::setStyle() -{ - //main groupboxes - ui->groupBoxTracks->setStyleSheet("QGroupBox { background-color: #bbdefb;}"); - ui->groupBoxRectificationParm->setStyleSheet("QGroupBox { background-color: #d1c4e9; }"); - ui->groupBoxTracing->setStyleSheet("QGroupBox { background-color: #c8e6c9; }"); - ui->groupBoxMiscellaneous->setStyleSheet("QGroupBox { background-color: #ffecb3; }"); - ui->groupBoxAnno->setStyleSheet("QGroupBox { background-color: #fad8ba; }"); - - //expert options are slightly darker - ui->groupBoxTrackDimensions->setStyleSheet("QGroupBox { background-color: #90caf9;}"); - ui->groupBoxTracerDimensions->setStyleSheet("QGroupBox { background-color: #a5d6a7;}"); - - //default groupbox style - ui->widgetParameter->setStyleSheet("QGroupBox" - " {border: 1px solid #e5e5e5; border-radius: 5px; margin-top: 1ex; /* leave space at the top for the title */}" - "QGroupBox::title {subcontrol-origin: margin; padding: -1px 3px; background-color: #e5e5e5; }"); + CoreParameter* coreParams = dynamic_cast(getModel()); + coreParams->m_antialiasingFull = toggle; + emitToggleAntialiasingFull(toggle); } -void CoreParameterView::resetTrial() +void CoreParameterView::fillUI() { - _trialActive = false; - _trialStarted = false; - Q_EMIT emitTrialStarted(false); - ui->pushButton_startExp->setText("Start a new Trial"); + // add switchbutton for expert options + _expertSwitch = new SwitchButton("not advanced", "advanced"); + ui->widgetParameterLayout->addWidget(_expertSwitch); + QObject::connect(_expertSwitch, + &SwitchButton::emitSetEnabled, + this, + &CoreParameterView::toggleExpertOptions, + Qt::DirectConnection); + + // setup ui from params + CoreParameter* coreParams = dynamic_cast(getModel()); + + // view toggle + ui->checkBoxEnableCoreView->setChecked(coreParams->m_viewSwitch); + // track ignore zoom + ui->checkBoxIgnoreZoom->setChecked(coreParams->m_ignoreZoom); + // track orientation line + ui->checkBoxTrackOrientationLine->setChecked( + coreParams->m_trackOrientationLine); + // track show id + ui->checkBoxShowId->setChecked(coreParams->m_trackShowId); + // tracer proportions + ui->spinBoxTracerProportions->setValue(coreParams->m_tracerProportions); + // tracer orientation line + ui->checkBoxTracerOrientationLine->setChecked( + coreParams->m_tracerOrientationLine); + // tracing style + if (coreParams->m_tracingStyle == "No tracing") { + ui->comboBoxTracingStyle->setCurrentIndex(0); + } + // tracing time degradation + if (coreParams->m_tracingTimeDegradation == "None") { + ui->comboBoxTracingTimeDegradation->setCurrentIndex(0); + } + // tracing history + if (coreParams->m_tracingHistory) { + ui->spinBoxTracingHistoryLength->setValue( + coreParams->m_tracingHistory); + } + // tracing steps + if (coreParams->m_tracingSteps) { + ui->spinBoxTracingSteps->setValue(coreParams->m_tracingSteps); + } + // tracer frame number + ui->checkBoxTracerFrameNumber->setChecked(coreParams->m_tracerFrameNumber); + // antialiasing + ui->checkBoxAntialiasingEntities->setChecked( + coreParams->m_antialiasingEntities); + ui->checkBoxAntialiasingFull->setChecked(coreParams->m_antialiasingFull); + // track width + if (coreParams->m_trackWidth) { + ui->spinboxTrackWidth->setValue(coreParams->m_trackWidth); + } + // track height + if (coreParams->m_trackHeight) { + ui->spinBoxTrackHeight->setValue(coreParams->m_trackHeight); + } + + // annotation color button + QPalette pal = ui->pushButtonAnnoColor->palette(); + pal.setColor(QPalette::Button, Qt::yellow); + ui->pushButtonAnnoColor->setAutoFillBackground(true); + ui->pushButtonAnnoColor->setPalette(pal); + ui->pushButtonAnnoColor->setFlat(true); + ui->pushButtonAnnoColor->update(); + + // enable/disable widgets + + // expert options + if (_expertSwitch->state()) { + ui->groupBoxTracerDimensions->show(); + ui->groupBoxMiscellaneous->show(); + ui->groupBoxTrackDimensions->show(); + ui->groupBoxAnno->show(); + ui->checkBoxTracerFrameNumber->show(); + ui->checkBoxShowId->show(); + } else { + ui->groupBoxTracerDimensions->hide(); + ui->groupBoxMiscellaneous->hide(); + ui->groupBoxTrackDimensions->hide(); + ui->groupBoxAnno->hide(); + ui->checkBoxTracerFrameNumber->hide(); + ui->checkBoxShowId->hide(); + } +} +void CoreParameterView::setStyle() +{ + // main groupboxes + ui->groupBoxTracks->setStyleSheet( + "QGroupBox { background-color: #bbdefb;}"); + ui->groupBoxRectificationParm->setStyleSheet( + "QGroupBox { background-color: #d1c4e9; }"); + ui->groupBoxTracing->setStyleSheet( + "QGroupBox { background-color: #c8e6c9; }"); + ui->groupBoxMiscellaneous->setStyleSheet( + "QGroupBox { background-color: #ffecb3; }"); + ui->groupBoxAnno->setStyleSheet( + "QGroupBox { background-color: #fad8ba; }"); + + // expert options are slightly darker + ui->groupBoxTrackDimensions->setStyleSheet( + "QGroupBox { background-color: #90caf9;}"); + ui->groupBoxTracerDimensions->setStyleSheet( + "QGroupBox { background-color: #a5d6a7;}"); + + // default groupbox style + ui->widgetParameter->setStyleSheet( + "QGroupBox" + " {border: 1px solid #e5e5e5; border-radius: 5px; margin-top: 1ex; /* " + "leave space at the top for the title */}" + "QGroupBox::title {subcontrol-origin: margin; padding: -1px 3px; " + "background-color: #e5e5e5; }"); +} + +void CoreParameterView::resetTrial() +{ + _trialActive = false; + _trialStarted = false; + Q_EMIT emitTrialStarted(false); + ui->pushButton_startExp->setText("Start a new Trial"); } void CoreParameterView::getNotified() { - CoreParameter* coreParams = dynamic_cast(getModel()); - ui->labelNumberOfTracks->setText(QString::number(coreParams->m_trackNumber)); + CoreParameter* coreParams = dynamic_cast(getModel()); + ui->labelNumberOfTracks->setText( + QString::number(coreParams->m_trackNumber)); ui->label_ExpObjCnt->setText(QString::number(coreParams->m_trackNumber)); - int trial = dynamic_cast(getController())->getTrialNumber() + 1; + int trial = dynamic_cast(getController()) + ->getTrialNumber() + + 1; ui->label_ExpTrialNo->setText(std::to_string(trial).c_str()); } /************EXPERIMENT TAB*******************/ -void CoreParameterView::on_pushButton_startExp_clicked() { - if (!_trialActive) { - - if (_currentFile == "No Media"){ - int ret = QMessageBox::information(this, tr("BioTracker"), - tr("Please select a source video first. \nYou can do so in the \"File\" menu."), +void CoreParameterView::on_pushButton_startExp_clicked() +{ + if (!_trialActive) { + + if (_currentFile == "No Media") { + int ret = QMessageBox::information( + this, + tr("BioTracker"), + tr("Please select a source video first. \nYou can do so in " + "the \"File\" menu."), QMessageBox::Ok); - } - else { - if (!_trialStarted) { + } else { + if (!_trialStarted) { QMessageBox::StandardButton reply; - reply = QMessageBox::question(this, "Confirmation", "Are you sure you want to start a new trial?" - "\nThis will reset the previous tracking data!", - QMessageBox::Yes|QMessageBox::No); + reply = QMessageBox::question( + this, + "Confirmation", + "Are you sure you want to start a new trial?" + "\nThis will reset the previous tracking data!", + QMessageBox::Yes | QMessageBox::No); if (reply == QMessageBox::No) { qDebug() << "CORE: New trial aborted"; return; } - _trialStarted = true; - emitTrialStarted(true); - emitFinalizeExperiment(); - emitPausePlayback(); - QMessageBox::information(0, "New trial", "You started a new trial! Previous data was saved and reset.\n\nGo to the timespot in the video you want to track at." - "\n\nPlease add the number of objects you want to track as trajectories.\nResume the video." ); - } - else { - emitStartPlayback(); - } - emitDeactivateTrackingSwitch(); + _trialStarted = true; + emitTrialStarted(true); + emitFinalizeExperiment(); + emitPausePlayback(); + QMessageBox::information( + 0, + "New trial", + "You started a new trial! Previous data was saved and " + "reset.\n\nGo to the timespot in the video you want to " + "track at." + "\n\nPlease add the number of objects you want to track " + "as trajectories.\nResume the video."); + } else { + emitStartPlayback(); + } + emitDeactivateTrackingSwitch(); emitEnableTracking(); ui->pushButton_startExp->setText("Pause Trial"); - ui->label_ExpSt->setText("Active - tracking"); + ui->label_ExpSt->setText("Active - tracking"); _trialActive = true; } - } - else { + } else { emitDisableTracking(); emitPausePlayback(); ui->pushButton_startExp->setText("Resume Trial"); - ui->label_ExpSt->setText("Paused - not tracking"); + ui->label_ExpSt->setText("Paused - not tracking"); _trialActive = false; } } -void CoreParameterView::on_pushButton_finalizeExp_clicked() { +void CoreParameterView::on_pushButton_finalizeExp_clicked() +{ QMessageBox::StandardButton reply; - reply = QMessageBox::question(this, "Confirmation", "Are you sure you want to finalize the trial?" - "\nThis will save the current trial tracking" - " data in a new file in the 'Trials' directory" - " and reset it afterwards!", - QMessageBox::Yes|QMessageBox::No); + reply = QMessageBox::question( + this, + "Confirmation", + "Are you sure you want to finalize the trial?" + "\nThis will save the current trial tracking" + " data in a new file in the 'Trials' directory" + " and reset it afterwards!", + QMessageBox::Yes | QMessageBox::No); if (reply == QMessageBox::No) { qDebug() << "CORE: Finalize trial aborted!"; return; } Q_EMIT emitStopPlayback(); - Q_EMIT emitActivateTrackingSwitch(); + Q_EMIT emitActivateTrackingSwitch(); Q_EMIT emitDisableTracking(); - _trialActive = false; - _trialStarted = false; + _trialActive = false; + _trialStarted = false; ui->pushButton_startExp->setText("Start a new Trial"); - ui->label_ExpSt->setText("No Trial started!"); - Q_EMIT emitTrialStarted(false); + ui->label_ExpSt->setText("No Trial started!"); + Q_EMIT emitTrialStarted(false); Q_EMIT emitFinalizeExperiment(); } void CoreParameterView::on_trialHelpButton_clicked() { - QMessageBox::information(0, "Trials", "'Start a new Trial' will cause all the previous data to be saved and then reset.\n\n" - "Go to the time spot you want to track and create a trajectory for each object you want to track.\n" - "Resume the video and the tracker will track your objects.\n\n" - "If you want to pause the tracking you can just pause the video. Resuming the video will continue the tracking.\n" - "If you want to pause the video and resume without tracking you will have to click 'Pause Trial' causing the tracking to be disabled.\n" - "You can now watch the video without tracking.\n\n" - "'Resume trial' will cause the tracking to be activated AND the video to be resumed"); -} - -void CoreParameterView::on_pushButton_saveData_clicked(){ - emitSaveDataToFile(); + QMessageBox::information( + 0, + "Trials", + "'Start a new Trial' will cause all the previous data to be saved and " + "then reset.\n\n" + "Go to the time spot you want to track and create a trajectory for " + "each object you want to track.\n" + "Resume the video and the tracker will track your objects.\n\n" + "If you want to pause the tracking you can just pause the video. " + "Resuming the video will continue the tracking.\n" + "If you want to pause the video and resume without tracking you will " + "have to click 'Pause Trial' causing the tracking to be disabled.\n" + "You can now watch the video without tracking.\n\n" + "'Resume trial' will cause the tracking to be activated AND the video " + "to be resumed"); +} + +void CoreParameterView::on_pushButton_saveData_clicked() +{ + emitSaveDataToFile(); } -void CoreParameterView::on_pushButton_resetData_clicked(){ +void CoreParameterView::on_pushButton_resetData_clicked() +{ QMessageBox::StandardButton reply; - reply = QMessageBox::question(this, "Confirmation", "Are you sure you want to reset the current tracking data?" - "This will firstly save the data and then reset it!", - QMessageBox::Yes|QMessageBox::No); + reply = QMessageBox::question( + this, + "Confirmation", + "Are you sure you want to reset the current tracking data?" + "This will firstly save the data and then reset it!", + QMessageBox::Yes | QMessageBox::No); if (reply == QMessageBox::No) { qDebug() << "CORE: Data reset aborted"; return; @@ -534,14 +621,15 @@ void CoreParameterView::on_pushButton_resetData_clicked(){ Q_EMIT emitFinalizeExperiment(); } - -void CoreParameterView::on_pushButton_addTraj_clicked(){ - emitAddTrack(); +void CoreParameterView::on_pushButton_addTraj_clicked() +{ + emitAddTrack(); } -void CoreParameterView::rcvPlayerParameters(std::shared_ptr parameters) { +void CoreParameterView::rcvPlayerParameters( + std::shared_ptr parameters) +{ QFileInfo f(parameters->m_CurrentFilename); _currentFile = f.baseName(); ui->label_ExpSrcCnt->setText(_currentFile); } - diff --git a/Src/View/CoreParameterView.h b/Src/View/CoreParameterView.h index 9ad399cd..ba197e4b 100644 --- a/Src/View/CoreParameterView.h +++ b/Src/View/CoreParameterView.h @@ -6,192 +6,196 @@ #include "Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h" #include "util/Config.h" -namespace Ui { - class CoreParameterView; +namespace Ui +{ + class CoreParameterView; } /** -* This class contains the 'Experiment' tab and the 'Visualisation options' tab in the GUI -* It basically displays the current set parameters -* The -*/ + * This class contains the 'Experiment' tab and the 'Visualisation options' + *tab in the GUI It basically displays the current set parameters The + */ class CoreParameterView : public IViewWidget { - Q_OBJECT + Q_OBJECT public: - explicit CoreParameterView(QWidget *parent = 0, IController *controller = 0, IModel *model = 0); - ~CoreParameterView(); - - QWidget* getTrackerHook(); - void setPermission(std::pair permission); - - // Triggers re-sending essential signals - void triggerUpdate(); - - void areaDescriptorTypeChanged(QString type); - - private slots: - - /* - VIEW TAB - */ - //Enable view - void on_checkBoxEnableCoreView_stateChanged(int v); - //Tracing - void on_comboBoxTracingStyle_currentIndexChanged(const QString & text); - void on_spinBoxTracingHistoryLength_valueChanged(int i); - void on_spinBoxTracingSteps_valueChanged(int i); - void on_comboBoxTracingTimeDegradation_currentIndexChanged(const QString & text); - void on_checkBoxTracerFrameNumber_stateChanged(int toggle); - - void on_spinBoxTracerProportions_valueChanged(double d); - void on_checkBoxTracerOrientationLine_stateChanged(int toggle); - - //Track - //void on_pushButtonSelectAll_clicked(); - //void on_pushButtonAddTrack_clicked(); - - void on_checkBoxIgnoreZoom_stateChanged(int v); - - //Track color - void on_pushButtonColorChangeBorder_clicked(); - void on_pushButtonColorChangeBorderSelected_clicked(); - void on_pushButtonColorChangeBrush_clicked(); - void on_pushButtonColorchangeBrushSelected_clicked(); - - //Track dimensions - void on_checkBoxTrackOrientationLine_stateChanged(int v); - void on_checkBoxShowId_stateChanged(int v); - - - void on_pushButtonTrackDimensionSetterAll_clicked(); - void on_pushButtonTrackDimensionSetterSelected_clicked(); - void on_pushButtonDefaultDimensions_clicked(); - - //Area descriptor - void on_lineEditRectWidth_textChanged(QString s); - void on_lineEditRectHeight_textChanged(QString s); - void on_checkBoxDisplayTrackingArea_stateChanged(int v); - void on_checkBoxDisplayRectification_stateChanged(int v); - void on_checkboxTrackingAreaAsEllipse_stateChanged(int v); - - //Annotations - void on_pushButtonAnnoColor_clicked(); - - //Finalize experiment - //void on_pushButtonFinalizeExperiment_clicked(); - - //Misc - //void on_checkBoxExpertOptions_stateChanged(int v); - void toggleExpertOptions(bool toggle); - void on_checkBoxAntialiasingEntities_toggled(bool toggle); - void on_checkBoxAntialiasingFull_toggled(bool toggle); - - /* - EXPERIMENT TAB - */ - - //label_ExpTrialNo - //label_ExpSrcCnt - //label_ExpObjCnt - //pushButton_startExp - //pushButton_finalizeExp - void on_pushButton_startExp_clicked(); - void on_pushButton_finalizeExp_clicked(); - void on_trialHelpButton_clicked(); - void on_pushButton_saveData_clicked(); - void on_pushButton_resetData_clicked(); - void on_pushButton_addTraj_clicked(); - public slots: - void rcvPlayerParameters(std::shared_ptr parameters); - + explicit CoreParameterView(QWidget* parent = 0, + IController* controller = 0, + IModel* model = 0); + ~CoreParameterView(); + + QWidget* getTrackerHook(); + void setPermission(std::pair permission); + + // Triggers re-sending essential signals + void triggerUpdate(); + + void areaDescriptorTypeChanged(QString type); + +private slots: + + /* + VIEW TAB + */ + // Enable view + void on_checkBoxEnableCoreView_stateChanged(int v); + // Tracing + void on_comboBoxTracingStyle_currentIndexChanged(const QString& text); + void on_spinBoxTracingHistoryLength_valueChanged(int i); + void on_spinBoxTracingSteps_valueChanged(int i); + void on_comboBoxTracingTimeDegradation_currentIndexChanged( + const QString& text); + void on_checkBoxTracerFrameNumber_stateChanged(int toggle); + + void on_spinBoxTracerProportions_valueChanged(double d); + void on_checkBoxTracerOrientationLine_stateChanged(int toggle); + + // Track + // void on_pushButtonSelectAll_clicked(); + // void on_pushButtonAddTrack_clicked(); + + void on_checkBoxIgnoreZoom_stateChanged(int v); + + // Track color + void on_pushButtonColorChangeBorder_clicked(); + void on_pushButtonColorChangeBorderSelected_clicked(); + void on_pushButtonColorChangeBrush_clicked(); + void on_pushButtonColorchangeBrushSelected_clicked(); + + // Track dimensions + void on_checkBoxTrackOrientationLine_stateChanged(int v); + void on_checkBoxShowId_stateChanged(int v); + + void on_pushButtonTrackDimensionSetterAll_clicked(); + void on_pushButtonTrackDimensionSetterSelected_clicked(); + void on_pushButtonDefaultDimensions_clicked(); + + // Area descriptor + void on_lineEditRectWidth_textChanged(QString s); + void on_lineEditRectHeight_textChanged(QString s); + void on_checkBoxDisplayTrackingArea_stateChanged(int v); + void on_checkBoxDisplayRectification_stateChanged(int v); + void on_checkboxTrackingAreaAsEllipse_stateChanged(int v); + + // Annotations + void on_pushButtonAnnoColor_clicked(); + + // Finalize experiment + // void on_pushButtonFinalizeExperiment_clicked(); + + // Misc + // void on_checkBoxExpertOptions_stateChanged(int v); + void toggleExpertOptions(bool toggle); + void on_checkBoxAntialiasingEntities_toggled(bool toggle); + void on_checkBoxAntialiasingFull_toggled(bool toggle); + + /* + EXPERIMENT TAB + */ + + // label_ExpTrialNo + // label_ExpSrcCnt + // label_ExpObjCnt + // pushButton_startExp + // pushButton_finalizeExp + void on_pushButton_startExp_clicked(); + void on_pushButton_finalizeExp_clicked(); + void on_trialHelpButton_clicked(); + void on_pushButton_saveData_clicked(); + void on_pushButton_resetData_clicked(); + void on_pushButton_addTraj_clicked(); +public slots: + void rcvPlayerParameters( + std::shared_ptr parameters); public: - signals : - - /* - EXPERIMENT TAB - */ - void emitEnableTracking(); - void emitDisableTracking(); - void emitActivateTrackingSwitch(); - void emitDeactivateTrackingSwitch(); - void emitStartPlayback(); - void emitStopPlayback(); - void emitPausePlayback(); - void emitTrialStarted(bool started); - void emitSaveDataToFile(); - - - //Enable view - void emitViewSwitch(bool lever); - //Select all tracks - //void emitSelectAll(); - //Add tracks - void emitAddTrack(); - //Ignore zoom - void emitIgnoreZoom(bool toggle); - //Track color - void emitColorChangeBorderAll(); - void emitColorChangeBorderSelected(); - void emitColorChangeBrushAll(); - void emitColorChangeBrushSelected(); - //Track dimensions - void emitTrackOrientationLine(bool toggle); - void emitTrackShowId(bool toggle); - void emitTrackDimensionsAll(int width, int height); - void emitTrackDimensionsSelected(int width, int height); - void emitTrackDimensionsSetDefault(); - //Tracing - void emitTracingHistoryLength(int history); - void emitTracingStyle(QString style); - void emitTracingSteps(int steps); - void emitTracingTimeDegradation(QString degradation); - void emitTracerFrameNumber(bool toggle); - //Tracing dimensions - void emitTracerProportions(float proportion); - void emitTracerOrientationLine(bool toggle); - - //Area descriptor - void emitRectDimensions(double w, double h); - void emitDisplayTrackingArea(bool b); - void emitDisplayRectification(bool b); - void emitTrackingAreaAsEllipse(bool b); - - //Annotations - void emitSetAnnoColor(QColor color); - - //Finalize Experiment - void emitFinalizeExperiment(); - - //Misc - void emitToggleAntialiasingEntities(bool toggle); - void emitToggleAntialiasingFull(bool toggle); +signals: + + /* + EXPERIMENT TAB + */ + void emitEnableTracking(); + void emitDisableTracking(); + void emitActivateTrackingSwitch(); + void emitDeactivateTrackingSwitch(); + void emitStartPlayback(); + void emitStopPlayback(); + void emitPausePlayback(); + void emitTrialStarted(bool started); + void emitSaveDataToFile(); + + // Enable view + void emitViewSwitch(bool lever); + // Select all tracks + // void emitSelectAll(); + // Add tracks + void emitAddTrack(); + // Ignore zoom + void emitIgnoreZoom(bool toggle); + // Track color + void emitColorChangeBorderAll(); + void emitColorChangeBorderSelected(); + void emitColorChangeBrushAll(); + void emitColorChangeBrushSelected(); + // Track dimensions + void emitTrackOrientationLine(bool toggle); + void emitTrackShowId(bool toggle); + void emitTrackDimensionsAll(int width, int height); + void emitTrackDimensionsSelected(int width, int height); + void emitTrackDimensionsSetDefault(); + // Tracing + void emitTracingHistoryLength(int history); + void emitTracingStyle(QString style); + void emitTracingSteps(int steps); + void emitTracingTimeDegradation(QString degradation); + void emitTracerFrameNumber(bool toggle); + // Tracing dimensions + void emitTracerProportions(float proportion); + void emitTracerOrientationLine(bool toggle); + + // Area descriptor + void emitRectDimensions(double w, double h); + void emitDisplayTrackingArea(bool b); + void emitDisplayRectification(bool b); + void emitTrackingAreaAsEllipse(bool b); + + // Annotations + void emitSetAnnoColor(QColor color); + + // Finalize Experiment + void emitFinalizeExperiment(); + + // Misc + void emitToggleAntialiasingEntities(bool toggle); + void emitToggleAntialiasingFull(bool toggle); private: - Ui::CoreParameterView *ui; /**< processed ui file */ + Ui::CoreParameterView* ui; /**< processed ui file */ + + bool m_viewSwitch; /**< switch to enable/disable visualization options tab + */ + SwitchButton* + _expertSwitch; /**< switch to expand visualization options tab */ + bool _trialActive = false; /**< currently trial active? */ + bool _trialStarted = false; /**< was trial started? */ + QString _currentFile = + "No Media"; /**< show media name in experiment tab */ - bool m_viewSwitch; /**< switch to enable/disable visualization options tab */ - SwitchButton* _expertSwitch; /**< switch to expand visualization options tab */ - bool _trialActive = false; /**< currently trial active? */ - bool _trialStarted = false; /**< was trial started? */ - QString _currentFile = "No Media"; /**< show media name in experiment tab */ + Config* _cfg; - Config *_cfg; - - // IViewWidget interface - public slots: + // IViewWidget interface +public slots: - void getNotified(); + void getNotified(); - /// fills the ui elements with the current default parameters - void fillUI(); + /// fills the ui elements with the current default parameters + void fillUI(); - /// styles the "visualisation options" tab - void setStyle(); - void resetTrial(); + /// styles the "visualisation options" tab + void setStyle(); + void resetTrial(); }; #endif // COREPARAMETERVIEW_H diff --git a/Src/View/GLVideoView.cpp b/Src/View/GLVideoView.cpp index 888ae1df..7741842c 100644 --- a/Src/View/GLVideoView.cpp +++ b/Src/View/GLVideoView.cpp @@ -5,22 +5,21 @@ #include "Model/TextureObject.h" - -GLVideoView::GLVideoView(QWidget *parent, IController *controller, IModel *model): - IViewOpenGLWidget(parent, controller, model) +GLVideoView::GLVideoView(QWidget* parent, + IController* controller, + IModel* model) +: IViewOpenGLWidget(parent, controller, model) { } GLVideoView::~GLVideoView() { - } void GLVideoView::paintGL() { - TextureObject *textureObject = dynamic_cast(getModel()); - QImage img = textureObject->get(); - + TextureObject* textureObject = dynamic_cast(getModel()); + QImage img = textureObject->get(); QPainter painter(this); @@ -28,28 +27,25 @@ void GLVideoView::paintGL() painter.drawRect(QRect(0, 0, this->width(), this->height())); painter.setBrush(QColor(0, 0, 0, 0)); - QRect window; - QRect viewport; - const float viewport_skew = BioTracker::Core::ScreenHelper::calculate_viewport( - textureObject->width(), - textureObject->height(), - this->width(), - this->height(), - window, - viewport - ); + QRect window; + QRect viewport; + const float viewport_skew = + BioTracker::Core::ScreenHelper::calculate_viewport( + textureObject->width(), + textureObject->height(), + this->width(), + this->height(), + window, + viewport); painter.setWindow(window); painter.setViewport(viewport); - QRectF target(0, 0 , textureObject->width(), textureObject->height()); + QRectF target(0, 0, textureObject->width(), textureObject->height()); QRectF source(0, 0, textureObject->width(), textureObject->height()); - - painter.drawImage(target, img, source); QPainter p(this); - } void GLVideoView::getNotified() diff --git a/Src/View/GLVideoView.h b/Src/View/GLVideoView.h index 9931c060..e60bcd0c 100644 --- a/Src/View/GLVideoView.h +++ b/Src/View/GLVideoView.h @@ -6,20 +6,19 @@ #include "QPainter" #include "Interfaces/IView/IViewWidget.h" -class GLVideoView: public IViewOpenGLWidget +class GLVideoView : public IViewOpenGLWidget { public: - GLVideoView(QWidget *parent, IController *controller = 0, IModel *model = 0); + GLVideoView(QWidget* parent, + IController* controller = 0, + IModel* model = 0); ~GLVideoView(); private: void paintGL() override; - public Q_SLOTS: void getNotified(); - - }; #endif // BIOTRACKER3VIDEOVIEW_H diff --git a/Src/View/GraphicsScene.cpp b/Src/View/GraphicsScene.cpp index 4584e2e3..5fa099e1 100644 --- a/Src/View/GraphicsScene.cpp +++ b/Src/View/GraphicsScene.cpp @@ -1,12 +1,12 @@ #include "GraphicsScene.h" -GraphicsScene::GraphicsScene(QObject *parent, IController *controller, IModel *model) : - IViewGraphicsScene(parent, controller, model) +GraphicsScene::GraphicsScene(QObject* parent, + IController* controller, + IModel* model) +: IViewGraphicsScene(parent, controller, model) { - } void GraphicsScene::getNotified() { - } diff --git a/Src/View/GraphicsScene.h b/Src/View/GraphicsScene.h index d590051a..37367584 100644 --- a/Src/View/GraphicsScene.h +++ b/Src/View/GraphicsScene.h @@ -6,7 +6,9 @@ class GraphicsScene : public IViewGraphicsScene { public: - GraphicsScene(QObject *parent = 0, IController *controller = 0, IModel *model = 0); + GraphicsScene(QObject* parent = 0, + IController* controller = 0, + IModel* model = 0); // IViewGraphicsScene interface public Q_SLOTS: diff --git a/Src/View/GraphicsView.cpp b/Src/View/GraphicsView.cpp index 8aa23a68..b0ada981 100644 --- a/Src/View/GraphicsView.cpp +++ b/Src/View/GraphicsView.cpp @@ -8,148 +8,141 @@ #include "../Controller/ControllerGraphicScene.h" #include "../Model/Annotations.h" - -GraphicsView::GraphicsView(QWidget *parent, IController *controller, IModel *model) : - IViewGraphicsView(parent, controller, model) +GraphicsView::GraphicsView(QWidget* parent, + IController* controller, + IModel* model) +: IViewGraphicsView(parent, controller, model) { - m_GraphicsScene = new QGraphicsScene(); - m_BackgroundImage = NULL; + m_GraphicsScene = new QGraphicsScene(); + m_BackgroundImage = NULL; + + this->setScene(m_GraphicsScene); - this->setScene(m_GraphicsScene); - - this->setBackgroundBrush(QBrush(Qt::white)); + this->setBackgroundBrush(QBrush(Qt::white)); - this->show(); + this->show(); - setTransformationAnchor(AnchorUnderMouse); - setViewportUpdateMode(FullViewportUpdate); + setTransformationAnchor(AnchorUnderMouse); + setViewportUpdateMode(FullViewportUpdate); - setDragMode(RubberBandDrag); + setDragMode(RubberBandDrag); } -void GraphicsView::addGraphicsItem(QGraphicsItem *item) +void GraphicsView::addGraphicsItem(QGraphicsItem* item) { - m_GraphicsScene->addItem(item); + m_GraphicsScene->addItem(item); - update(); + update(); } -void GraphicsView::removeGraphicsItem(QGraphicsItem *item) +void GraphicsView::removeGraphicsItem(QGraphicsItem* item) { - m_GraphicsScene->removeItem(item); + m_GraphicsScene->removeItem(item); - update(); + update(); } -void GraphicsView::addPixmapItem(QGraphicsItem *item) +void GraphicsView::addPixmapItem(QGraphicsItem* item) { - m_BackgroundImage = item; - m_GraphicsScene->addItem(item); - item->setZValue(-5); + m_BackgroundImage = item; + m_GraphicsScene->addItem(item); + item->setZValue(-5); - update(); + update(); } void GraphicsView::getNotified() { - } -void GraphicsView::wheelEvent(QWheelEvent *event) +void GraphicsView::wheelEvent(QWheelEvent* event) { - //if ctrl pressed, use original functionality - if (event->modifiers() & Qt::ControlModifier) - { - QGraphicsView::wheelEvent(event); - } - //otherwise, do yours - else - { - if (event->delta() > 0) - { - scale(1.1, 1.1); - } - else - { - scale(0.9, 0.9); - } - } + // if ctrl pressed, use original functionality + if (event->modifiers() & Qt::ControlModifier) { + QGraphicsView::wheelEvent(event); + } + // otherwise, do yours + else { + if (event->delta() > 0) { + scale(1.1, 1.1); + } else { + scale(0.9, 0.9); + } + } } -void GraphicsView::keyReleaseEvent(QKeyEvent *event) +void GraphicsView::keyReleaseEvent(QKeyEvent* event) { - emit(onKeyReleaseEvent(event)); + emit(onKeyReleaseEvent(event)); } -void GraphicsView::keyPressEvent(QKeyEvent * event) +void GraphicsView::keyPressEvent(QKeyEvent* event) { - emit(onKeyPressEvent(event)); + emit(onKeyPressEvent(event)); } -void GraphicsView::mousePressEvent(QMouseEvent *event) +void GraphicsView::mousePressEvent(QMouseEvent* event) { - // The middle mouse button is not forwarded but handled here. - if (event->buttons() & Qt::MidButton) - { - m_ViewportDragOrigin = event->pos(); - } - else - { - const QPointF imagePosition = mapToScene(event->pos()); - const QPoint imagePositionInt = QPoint(imagePosition.x(), imagePosition.y()); - event->ignore(); - emit(onMousePressEvent(event, imagePositionInt)); - if (!event->isAccepted()) - QGraphicsView::mousePressEvent(event); - } + // The middle mouse button is not forwarded but handled here. + if (event->buttons() & Qt::MidButton) { + m_ViewportDragOrigin = event->pos(); + } else { + const QPointF imagePosition = mapToScene(event->pos()); + const QPoint imagePositionInt = QPoint(imagePosition.x(), + imagePosition.y()); + event->ignore(); + emit(onMousePressEvent(event, imagePositionInt)); + if (!event->isAccepted()) + QGraphicsView::mousePressEvent(event); + } } -void GraphicsView::mouseReleaseEvent(QMouseEvent*event) +void GraphicsView::mouseReleaseEvent(QMouseEvent* event) { - if (!(event->buttons() & Qt::MidButton)) - { - const QPointF imagePosition = mapToScene(event->pos()); - const QPoint imagePositionInt = QPoint(imagePosition.x(), imagePosition.y()); - event->ignore(); - emit(onMouseReleaseEvent(event, imagePositionInt)); - if (!event->isAccepted()) - QGraphicsView::mouseReleaseEvent(event); - } + if (!(event->buttons() & Qt::MidButton)) { + const QPointF imagePosition = mapToScene(event->pos()); + const QPoint imagePositionInt = QPoint(imagePosition.x(), + imagePosition.y()); + event->ignore(); + emit(onMouseReleaseEvent(event, imagePositionInt)); + if (!event->isAccepted()) + QGraphicsView::mouseReleaseEvent(event); + } } -void GraphicsView::mouseMoveEvent(QMouseEvent*event) +void GraphicsView::mouseMoveEvent(QMouseEvent* event) { - viewport()->update(); - // The middle mouse button is not forwarded but handled here. - if (event->buttons() & Qt::MidButton) - { - const QPoint currentPosition{ event->pos() }; - // Ignore position-reset events.. - if (currentPosition != m_ViewportDragOrigin) - { - const QPoint currentPositionScene = currentPosition; - const QPoint originPositionScene = m_ViewportDragOrigin; - const auto offset = currentPositionScene - originPositionScene; - - QGraphicsView::horizontalScrollBar()->setValue(horizontalScrollBar()->value() + offset.x() + 1); - QGraphicsView::verticalScrollBar()->setValue(verticalScrollBar()->value() + offset.y() + 1); - // Freeze mouse position in place. - QCursor::setPos(mapToGlobal(m_ViewportDragOrigin)); - } - } - else - { - const QPointF imagePosition = mapToScene(event->pos()); - const QPoint imagePositionInt = QPoint(imagePosition.x(), imagePosition.y()); - m_cursorPos = imagePositionInt; - emitCursorPosition(m_cursorPos); //to mainwindow - event->ignore(); - emit(onMouseMoveEvent(event, imagePositionInt)); - if (!event->isAccepted()) - QGraphicsView::mouseMoveEvent(event); - } + viewport()->update(); + // The middle mouse button is not forwarded but handled here. + if (event->buttons() & Qt::MidButton) { + const QPoint currentPosition{event->pos()}; + // Ignore position-reset events.. + if (currentPosition != m_ViewportDragOrigin) { + const QPoint currentPositionScene = currentPosition; + const QPoint originPositionScene = m_ViewportDragOrigin; + const auto offset = currentPositionScene - originPositionScene; + + QGraphicsView::horizontalScrollBar()->setValue( + horizontalScrollBar()->value() + offset.x() + 1); + QGraphicsView::verticalScrollBar()->setValue( + verticalScrollBar()->value() + offset.y() + 1); + // Freeze mouse position in place. + QCursor::setPos(mapToGlobal(m_ViewportDragOrigin)); + } + } else { + const QPointF imagePosition = mapToScene(event->pos()); + const QPoint imagePositionInt = QPoint(imagePosition.x(), + imagePosition.y()); + m_cursorPos = imagePositionInt; + emitCursorPosition(m_cursorPos); // to mainwindow + event->ignore(); + emit(onMouseMoveEvent(event, imagePositionInt)); + if (!event->isAccepted()) + QGraphicsView::mouseMoveEvent(event); + } } -void GraphicsView::receiveToggleAntialiasingFull(bool toggle){ - setRenderHint(QPainter::Antialiasing, toggle); +void GraphicsView::receiveToggleAntialiasingFull(bool toggle) +{ + setRenderHint(QPainter::Antialiasing, toggle); } \ No newline at end of file diff --git a/Src/View/GraphicsView.h b/Src/View/GraphicsView.h index a289bc70..64f4e54b 100644 --- a/Src/View/GraphicsView.h +++ b/Src/View/GraphicsView.h @@ -8,48 +8,47 @@ class GraphicsView : public IViewGraphicsView { Q_OBJECT public: - GraphicsView(QWidget *parent = 0, IController *controller = 0, IModel *model = 0); + GraphicsView(QWidget* parent = 0, + IController* controller = 0, + IModel* model = 0); - void addGraphicsItem(QGraphicsItem *item); - void addPixmapItem(QGraphicsItem *item); - void removeGraphicsItem(QGraphicsItem *item); + void addGraphicsItem(QGraphicsItem* item); + void addPixmapItem(QGraphicsItem* item); + void removeGraphicsItem(QGraphicsItem* item); - QGraphicsScene *m_GraphicsScene;//MARKER - - void mousePressEvent(QMouseEvent *event) override; - void mouseReleaseEvent(QMouseEvent*event) override; - void mouseMoveEvent(QMouseEvent*event) override; - void keyReleaseEvent(QKeyEvent *event) override; - void keyPressEvent(QKeyEvent *event) override; + QGraphicsScene* m_GraphicsScene; // MARKER + void mousePressEvent(QMouseEvent* event) override; + void mouseReleaseEvent(QMouseEvent* event) override; + void mouseMoveEvent(QMouseEvent* event) override; + void keyReleaseEvent(QKeyEvent* event) override; + void keyPressEvent(QKeyEvent* event) override; // IGraphicsView interface public Q_SLOTS: void getNotified() override; - void receiveToggleAntialiasingFull(bool toggle); + void receiveToggleAntialiasingFull(bool toggle); // QWidget interface protected: - void wheelEvent(QWheelEvent *event) override; + void wheelEvent(QWheelEvent* event) override; private: - QGraphicsItem *m_BackgroundImage; - QPoint m_ViewportDragOrigin{ 0, 0 }; - QPoint m_cursorPos; + QGraphicsItem* m_BackgroundImage; + QPoint m_ViewportDragOrigin{0, 0}; + QPoint m_cursorPos; Q_SIGNALS: - // If you connect to these signals, you MUST use Qt::DirectConnection. - // You also SHOULD call event->accept() if you handle it. - // You MAY want to only handle events with isAccepted() == false. - void onMousePressEvent(QMouseEvent *event, QPoint imagePosition); - void onMouseReleaseEvent(QMouseEvent*event, QPoint imagePosition); - void onMouseMoveEvent(QMouseEvent*event, QPoint imagePosition); - void onKeyReleaseEvent(QKeyEvent *event); - void onKeyPressEvent(QKeyEvent *event); - - void emitCursorPosition(QPoint pos); - - + // If you connect to these signals, you MUST use Qt::DirectConnection. + // You also SHOULD call event->accept() if you handle it. + // You MAY want to only handle events with isAccepted() == false. + void onMousePressEvent(QMouseEvent* event, QPoint imagePosition); + void onMouseReleaseEvent(QMouseEvent* event, QPoint imagePosition); + void onMouseMoveEvent(QMouseEvent* event, QPoint imagePosition); + void onKeyReleaseEvent(QKeyEvent* event); + void onKeyPressEvent(QKeyEvent* event); + + void emitCursorPosition(QPoint pos); }; #endif // GRAPHICSVIEW_H diff --git a/Src/View/MainWindow.cpp b/Src/View/MainWindow.cpp index 6d72e6b8..3cb1d402 100644 --- a/Src/View/MainWindow.cpp +++ b/Src/View/MainWindow.cpp @@ -27,1032 +27,1164 @@ #include "VideoControllWidget.h" -MainWindow::MainWindow(QWidget* parent, IController* controller, IModel* model) : - IViewMainWindow(parent, controller, model), - ui(new Ui::MainWindow) { - _cfg = static_cast(controller)->getConfig(); - _previouslySelectedTracker = ""; - _currentParameterView = 0; - _currentCoreParameterView = 0; - _currentElementView = 0; - ui->setupUi(this); - - //add cursor position label - QLabel* _cursorPosition = new QLabel("0,0"); - _cursorPosition->setObjectName("_cursorPosition"); - statusBar()->insertPermanentWidget(0, _cursorPosition); +MainWindow::MainWindow(QWidget* parent, IController* controller, IModel* model) +: IViewMainWindow(parent, controller, model) +, ui(new Ui::MainWindow) +{ + _cfg = static_cast(controller)->getConfig(); + _previouslySelectedTracker = ""; + _currentParameterView = 0; + _currentCoreParameterView = 0; + _currentElementView = 0; + ui->setupUi(this); - //TODO - ui->actionToggle_compact_menu_toolbar_2->setEnabled(false); + // add cursor position label + QLabel* _cursorPosition = new QLabel("0,0"); + _cursorPosition->setObjectName("_cursorPosition"); + statusBar()->insertPermanentWidget(0, _cursorPosition); - //setup toolbars - setupUpperToolBar(); - setupVideoToolBar(); - ui->toolBarTools->setEnabled(false); + // TODO + ui->actionToggle_compact_menu_toolbar_2->setEnabled(false); - ui->toolBox->setStyleSheet("QToolBox::tab {" - " background-color: #e5e5e5;}" - ); + // setup toolbars + setupUpperToolBar(); + setupVideoToolBar(); + ui->toolBarTools->setEnabled(false); - //resize to full size - QWidget::showMaximized(); + ui->toolBox->setStyleSheet( + "QToolBox::tab {" + " background-color: #e5e5e5;}"); - createIntroductionWizard(); + // resize to full size + QWidget::showMaximized(); - //set window icon - QApplication::setWindowIcon(QIcon(":/Logo/resources/logo/BT-3_non_transparent_rounded.ico")); + createIntroductionWizard(); + // set window icon + QApplication::setWindowIcon( + QIcon(":/Logo/resources/logo/BT-3_non_transparent_rounded.ico")); } -MainWindow::~MainWindow() { - delete ui; +MainWindow::~MainWindow() +{ + delete ui; } //******************************************SETUP******************************************* -void MainWindow::setupUpperToolBar() { - - _trackerActivator = new SwitchButton("not tracking", "tracking"); - _trackerActivator->setToolTip("Activate/Disable tracking"); - QObject::connect(_trackerActivator, &SwitchButton::emitSetEnabled, this, &MainWindow::receiveSetTracking, Qt::DirectConnection); - //QAction* activatorAction = ui->toolBarMenu->addWidget(_trackerActivator); - - /////////////////////media groupbox - _mediaBox = new QGroupBox("Load media"); - //style groupbox (initial red border -> no video loaded) - _mediaBox->setStyleSheet("QGroupBox" - " {border: 1px solid #e56262;}"); - // "QGroupBox::title {subcontrol-origin: margin;subcontrol-position: top center; padding: 0 3px;}"); - QFont font = QFont(); - font.setPointSize(8); - font.setBold(true); - _mediaBox->setFont(font); - - QHBoxLayout* mediaBoxLayout = new QHBoxLayout; - mediaBoxLayout->setContentsMargins(0, 0, 0, 0); - //mediaBoxLayout->setSpacing(0); - QToolButton* cameraButton = new QToolButton; - cameraButton->setIconSize(QSize(24, 24)); - cameraButton->setDefaultAction(ui->actionOpen_Camera); - cameraButton->setAutoRaise(true); - - QToolButton* videoButton = new QToolButton; - videoButton->setIconSize(QSize(24, 24)); - videoButton->setDefaultAction(ui->actionOpen_Video); - videoButton->setAutoRaise(true); - - QToolButton* imageButton = new QToolButton; - imageButton->setIconSize(QSize(24, 24)); - imageButton->setDefaultAction(ui->actionOpen_Picture); - imageButton->setAutoRaise(true); - - mediaBoxLayout->addWidget(videoButton); - mediaBoxLayout->addWidget(imageButton); - mediaBoxLayout->addWidget(cameraButton); - - _mediaBox->setLayout(mediaBoxLayout); - - - ui->toolBarMenu->addWidget(_mediaBox); - - ////////trackerbox - _trackerBox = new QGroupBox("Load tracker"); - //style groupbox - _trackerBox->setStyleSheet("QGroupBox" - " {border: 1px solid #e56262;}"); - // "QGroupBox::title {subcontrol-origin: margin;subcontrol-position: top center; padding: 0 3px;}"); - - QFont font0 = QFont(); - font0.setPointSize(8); - font0.setBold(true); - _trackerBox->setFont(font0); - - QHBoxLayout* trackerBoxLayout = new QHBoxLayout; - trackerBoxLayout->setContentsMargins(0, 0, 0, 0); - - QToolButton* trackerButton = new QToolButton; - trackerButton->setIconSize(QSize(24, 24)); - trackerButton->setDefaultAction(ui->actionLoad_Tracker); - trackerButton->setAutoRaise(true); - - trackerBoxLayout->addWidget(trackerButton); - _trackerBox->setLayout(trackerBoxLayout); - - ui->toolBarMenu->addWidget(_trackerBox); - - - ////////loadSaveBox - QGroupBox* loadSaveBox = new QGroupBox("Load/Save Data"); - //style loadSaveBox - // loadSaveBox->setStyleSheet("QGroupBox" - // " {border: 1px solid #e5e5e5;border-radius: 5px;margin-top: 1ex; /* leave space at the top for the title */}" - // "QGroupBox::title {subcontrol-origin: margin;subcontrol-position: top center; padding: 0 3px;}"); - - QFont font2 = QFont(); - font2.setPointSize(8); - font2.setBold(true); - loadSaveBox->setFont(font2); - - QHBoxLayout* loadSaveBoxLayout = new QHBoxLayout; - loadSaveBoxLayout->setContentsMargins(5, 0, 5, 0); - - QToolButton* loadFileButton = new QToolButton; - loadFileButton->setIconSize(QSize(24, 24)); - loadFileButton->setDefaultAction(ui->actionLoad_trackingdata); - loadFileButton->setAutoRaise(true); - - QToolButton* saveFileButton = new QToolButton; - saveFileButton->setIconSize(QSize(24, 24)); - saveFileButton->setDefaultAction(ui->actionSave_trackingdata); - saveFileButton->setAutoRaise(true); - - loadSaveBoxLayout->addWidget(loadFileButton); - loadSaveBoxLayout->addWidget(saveFileButton); - loadSaveBox->setLayout(loadSaveBoxLayout); - - ui->toolBarMenu->addWidget(loadSaveBox); - - //////////////////choose tracker groupbox - QGroupBox* chooseTrackerBox = new QGroupBox("Choose tracker"); - //style groupbox - // chooseTrackerBox->setStyleSheet("QGroupBox" - // " {border: 1px solid #e5e5e5;border-radius: 5px;margin-top: 1ex; /* leave space at the top for the title */}" - // "QGroupBox::title {subcontrol-origin: margin;subcontrol-position: top center; padding: 0 3px;}"); - - QFont font1 = QFont(); - font1.setPointSize(8); - font1.setBold(true); - chooseTrackerBox->setFont(font1); - // - QHBoxLayout* chooseTrackerBoxLayout = new QHBoxLayout; - chooseTrackerBoxLayout->addWidget(ui->comboBox_TrackerSelect); - chooseTrackerBoxLayout->addWidget(_trackerActivator); - - chooseTrackerBox->setLayout(chooseTrackerBoxLayout); - - ui->toolBarMenu->addWidget(chooseTrackerBox); - - -} +void MainWindow::setupUpperToolBar() +{ -void MainWindow::checkTrackerGroupBox() { - _trackerBox->setStyleSheet("QGroupBox" - " {border: 1px solid #82c985;}"); + _trackerActivator = new SwitchButton("not tracking", "tracking"); + _trackerActivator->setToolTip("Activate/Disable tracking"); + QObject::connect(_trackerActivator, + &SwitchButton::emitSetEnabled, + this, + &MainWindow::receiveSetTracking, + Qt::DirectConnection); + // QAction* activatorAction = + // ui->toolBarMenu->addWidget(_trackerActivator); + + /////////////////////media groupbox + _mediaBox = new QGroupBox("Load media"); + // style groupbox (initial red border -> no video loaded) + _mediaBox->setStyleSheet( + "QGroupBox" + " {border: 1px solid #e56262;}"); + // "QGroupBox::title {subcontrol-origin: margin;subcontrol-position: top + // center; padding: 0 3px;}"); + QFont font = QFont(); + font.setPointSize(8); + font.setBold(true); + _mediaBox->setFont(font); + + QHBoxLayout* mediaBoxLayout = new QHBoxLayout; + mediaBoxLayout->setContentsMargins(0, 0, 0, 0); + // mediaBoxLayout->setSpacing(0); + QToolButton* cameraButton = new QToolButton; + cameraButton->setIconSize(QSize(24, 24)); + cameraButton->setDefaultAction(ui->actionOpen_Camera); + cameraButton->setAutoRaise(true); + + QToolButton* videoButton = new QToolButton; + videoButton->setIconSize(QSize(24, 24)); + videoButton->setDefaultAction(ui->actionOpen_Video); + videoButton->setAutoRaise(true); + + QToolButton* imageButton = new QToolButton; + imageButton->setIconSize(QSize(24, 24)); + imageButton->setDefaultAction(ui->actionOpen_Picture); + imageButton->setAutoRaise(true); + + mediaBoxLayout->addWidget(videoButton); + mediaBoxLayout->addWidget(imageButton); + mediaBoxLayout->addWidget(cameraButton); + + _mediaBox->setLayout(mediaBoxLayout); + + ui->toolBarMenu->addWidget(_mediaBox); + + ////////trackerbox + _trackerBox = new QGroupBox("Load tracker"); + // style groupbox + _trackerBox->setStyleSheet( + "QGroupBox" + " {border: 1px solid #e56262;}"); + // "QGroupBox::title {subcontrol-origin: margin;subcontrol-position: top + // center; padding: 0 3px;}"); + + QFont font0 = QFont(); + font0.setPointSize(8); + font0.setBold(true); + _trackerBox->setFont(font0); + + QHBoxLayout* trackerBoxLayout = new QHBoxLayout; + trackerBoxLayout->setContentsMargins(0, 0, 0, 0); + + QToolButton* trackerButton = new QToolButton; + trackerButton->setIconSize(QSize(24, 24)); + trackerButton->setDefaultAction(ui->actionLoad_Tracker); + trackerButton->setAutoRaise(true); + + trackerBoxLayout->addWidget(trackerButton); + _trackerBox->setLayout(trackerBoxLayout); + + ui->toolBarMenu->addWidget(_trackerBox); + + ////////loadSaveBox + QGroupBox* loadSaveBox = new QGroupBox("Load/Save Data"); + // style loadSaveBox + // loadSaveBox->setStyleSheet("QGroupBox" + // " {border: 1px solid #e5e5e5;border-radius: 5px;margin-top: 1ex; /* + // leave space at the top for the title */}" "QGroupBox::title + // {subcontrol-origin: margin;subcontrol-position: top center; padding: 0 + // 3px;}"); + + QFont font2 = QFont(); + font2.setPointSize(8); + font2.setBold(true); + loadSaveBox->setFont(font2); + + QHBoxLayout* loadSaveBoxLayout = new QHBoxLayout; + loadSaveBoxLayout->setContentsMargins(5, 0, 5, 0); + + QToolButton* loadFileButton = new QToolButton; + loadFileButton->setIconSize(QSize(24, 24)); + loadFileButton->setDefaultAction(ui->actionLoad_trackingdata); + loadFileButton->setAutoRaise(true); + + QToolButton* saveFileButton = new QToolButton; + saveFileButton->setIconSize(QSize(24, 24)); + saveFileButton->setDefaultAction(ui->actionSave_trackingdata); + saveFileButton->setAutoRaise(true); + + loadSaveBoxLayout->addWidget(loadFileButton); + loadSaveBoxLayout->addWidget(saveFileButton); + loadSaveBox->setLayout(loadSaveBoxLayout); + + ui->toolBarMenu->addWidget(loadSaveBox); + + //////////////////choose tracker groupbox + QGroupBox* chooseTrackerBox = new QGroupBox("Choose tracker"); + // style groupbox + // chooseTrackerBox->setStyleSheet("QGroupBox" + // " {border: 1px solid #e5e5e5;border-radius: 5px;margin-top: 1ex; /* + // leave space at the top for the title */}" "QGroupBox::title + // {subcontrol-origin: margin;subcontrol-position: top center; padding: 0 + // 3px;}"); + + QFont font1 = QFont(); + font1.setPointSize(8); + font1.setBold(true); + chooseTrackerBox->setFont(font1); + // + QHBoxLayout* chooseTrackerBoxLayout = new QHBoxLayout; + chooseTrackerBoxLayout->addWidget(ui->comboBox_TrackerSelect); + chooseTrackerBoxLayout->addWidget(_trackerActivator); + + chooseTrackerBox->setLayout(chooseTrackerBoxLayout); + + ui->toolBarMenu->addWidget(chooseTrackerBox); +} + +void MainWindow::checkTrackerGroupBox() +{ + _trackerBox->setStyleSheet( + "QGroupBox" + " {border: 1px solid #82c985;}"); } -void MainWindow::checkMediaGroupBox() { - _mediaBox->setStyleSheet("QGroupBox" - " {border: 1px solid #82c985;}"); +void MainWindow::checkMediaGroupBox() +{ + _mediaBox->setStyleSheet( + "QGroupBox" + " {border: 1px solid #82c985;}"); } -void MainWindow::setupVideoToolBar() { - +void MainWindow::setupVideoToolBar() +{ } +void MainWindow::addVideoControllWidget(IView* widget) +{ + QLayout* layout = new QGridLayout(); + // layout->addWidget(dynamic_cast(widget)); -void MainWindow::addVideoControllWidget(IView* widget) { - QLayout* layout = new QGridLayout(); - //layout->addWidget(dynamic_cast(widget)); - - QWidget* controlW = dynamic_cast(widget); - if (controlW) { - layout->addWidget(controlW->findChild("sld_video")); - } - ui->videoControls->setLayout(layout); - - //ui->videoControls->adjustSize(); + QWidget* controlW = dynamic_cast(widget); + if (controlW) { + layout->addWidget(controlW->findChild("sld_video")); + } + ui->videoControls->setLayout(layout); + // ui->videoControls->adjustSize(); } -void MainWindow::addVideoView(IView* videoView) { - m_graphView = dynamic_cast(videoView); - m_graphView->setParent(ui->trackingArea); +void MainWindow::addVideoView(IView* videoView) +{ + m_graphView = dynamic_cast(videoView); + m_graphView->setParent(ui->trackingArea); - ui->videoViewLayout->addWidget(m_graphView); + ui->videoViewLayout->addWidget(m_graphView); } -void MainWindow::addTrackerElementsView(IView *elemView) +void MainWindow::addTrackerElementsView(IView* elemView) { - QGraphicsObject *graphObj = dynamic_cast(elemView); - graphObj->setParent(ui->trackingArea); + QGraphicsObject* graphObj = dynamic_cast(elemView); + graphObj->setParent(ui->trackingArea); - m_graphView->addGraphicsItem(graphObj); - QRectF viewSceneRect = m_graphView->sceneRect(); + m_graphView->addGraphicsItem(graphObj); + QRectF viewSceneRect = m_graphView->sceneRect(); - _currentElementView = graphObj; + _currentElementView = graphObj; } -void MainWindow::addCoreElementsView(IView * coreView) +void MainWindow::addCoreElementsView(IView* coreView) { - QGraphicsObject *graphObj = dynamic_cast(coreView); - graphObj->setParent(ui->trackingArea); + QGraphicsObject* graphObj = dynamic_cast(coreView); + graphObj->setParent(ui->trackingArea); - m_graphView->addGraphicsItem(graphObj); - _currentCoreView = graphObj; + m_graphView->addGraphicsItem(graphObj); + _currentCoreView = graphObj; } -void MainWindow::addNotificationBrowser(IView * notificationBrowser) +void MainWindow::addNotificationBrowser(IView* notificationBrowser) { - QWidget* notificationWidget = dynamic_cast(notificationBrowser); - if (notificationWidget) { - notificationWidget->updateGeometry(); + QWidget* notificationWidget = dynamic_cast(notificationBrowser); + if (notificationWidget) { + notificationWidget->updateGeometry(); - ui->notificationTab->layout()->addWidget(notificationWidget); + ui->notificationTab->layout()->addWidget(notificationWidget); - notificationWidget->setVisible(1); - } + notificationWidget->setVisible(1); + } - //createIntroductionWizard(); + // createIntroductionWizard(); } -void MainWindow::addTrackerParameterView(IView *parameter) +void MainWindow::addTrackerParameterView(IView* parameter) { - QWidget* pluginParameter = dynamic_cast(parameter); - - - while (auto item = ui->trackerOptions->layout()->takeAt(0)) { - delete item->widget(); - } + QWidget* pluginParameter = dynamic_cast(parameter); - ui->trackerOptions->layout()->addWidget(pluginParameter); + while (auto item = ui->trackerOptions->layout()->takeAt(0)) { + delete item->widget(); + } + ui->trackerOptions->layout()->addWidget(pluginParameter); } -void MainWindow::addCoreParameterView(IView * coreParameterView) +void MainWindow::addCoreParameterView(IView* coreParameterView) { - QWidget* coreParameter = dynamic_cast(coreParameterView); - if (coreParameter) { - //add experiment widget to toolbar - QWidget* experimentWidget = coreParameter->findChild("experimentWidget"); - if (experimentWidget) { - ui->experimentItem->layout()->addWidget(experimentWidget); - } - - - ui->widget_alg->updateGeometry(); - coreParameter->updateGeometry(); - coreParameter->setContentsMargins(QMargins(0, 0, 0, 0)); - coreParameter->setParent(ui->widget_alg); - - QHBoxLayout* hLayout = new QHBoxLayout; - hLayout->addWidget(coreParameter, 100, 0); - hLayout->setContentsMargins(QMargins(0, 0, 0, 0)); //left, top, right, bottom - hLayout->setMargin(0); - - ui->widget_alg->setLayout(hLayout); - - coreParameter->setVisible(1); - _currentCoreParameterView = coreParameterView; - - - - //resize rightpanel - QList splitterSizes; - splitterSizes << 20000 << 10000; //2:1 TODO make this fixed (right panel fixed start size) - ui->mainSplitter->setSizes(splitterSizes); - - } + QWidget* coreParameter = dynamic_cast(coreParameterView); + if (coreParameter) { + // add experiment widget to toolbar + QWidget* experimentWidget = coreParameter->findChild( + "experimentWidget"); + if (experimentWidget) { + ui->experimentItem->layout()->addWidget(experimentWidget); + } + + ui->widget_alg->updateGeometry(); + coreParameter->updateGeometry(); + coreParameter->setContentsMargins(QMargins(0, 0, 0, 0)); + coreParameter->setParent(ui->widget_alg); + + QHBoxLayout* hLayout = new QHBoxLayout; + hLayout->addWidget(coreParameter, 100, 0); + hLayout->setContentsMargins( + QMargins(0, 0, 0, 0)); // left, top, right, bottom + hLayout->setMargin(0); + + ui->widget_alg->setLayout(hLayout); + + coreParameter->setVisible(1); + _currentCoreParameterView = coreParameterView; + + // resize rightpanel + QList splitterSizes; + splitterSizes << 20000 << 10000; // 2:1 TODO make this fixed (right + // panel fixed start size) + ui->mainSplitter->setSizes(splitterSizes); + } } -void MainWindow::setTrackerList(QStringListModel* trackerList, QString current) { - ui->comboBox_TrackerSelect->setModel(trackerList); - ui->comboBox_TrackerSelect->setCurrentText(current); +void MainWindow::setTrackerList(QStringListModel* trackerList, QString current) +{ + ui->comboBox_TrackerSelect->setModel(trackerList); + ui->comboBox_TrackerSelect->setCurrentText(current); } -//TODO put this in a class -void MainWindow::createIntroductionWizard() { - m_introWiz = new QWizard; - - //BioTracker::Core::Settings *disableIntroWiz = GET_CORESETTINGS(CORE_CONFIGURATION); - bool disabled = _cfg->DisableWizard; - - //dont show again checkbox - QCheckBox* noShowCheck = new QCheckBox("Don't show this again"); - noShowCheck->setChecked(disabled); - QObject::connect(noShowCheck, &QCheckBox::toggled, this, &MainWindow::toggleNoShowWiz); - +// TODO put this in a class +void MainWindow::createIntroductionWizard() +{ + m_introWiz = new QWizard; + + // BioTracker::Core::Settings *disableIntroWiz = + // GET_CORESETTINGS(CORE_CONFIGURATION); + bool disabled = _cfg->DisableWizard; + + // dont show again checkbox + QCheckBox* noShowCheck = new QCheckBox("Don't show this again"); + noShowCheck->setChecked(disabled); + QObject::connect(noShowCheck, + &QCheckBox::toggled, + this, + &MainWindow::toggleNoShowWiz); + + // introduction + QWizardPage* p1 = new QWizardPage; + { + p1->setTitle("BioTracker 3 - Introduction"); + + QPixmap logoImg(":/Logo/resources/logo/BT3-big.png"); + QPixmap scaledImg = logoImg.scaled(QSize(600, 400), + Qt::KeepAspectRatio, + Qt::SmoothTransformation); + + QLabel* imgLabel = new QLabel; + imgLabel->setPixmap(scaledImg); + imgLabel->setAttribute(Qt::WA_TranslucentBackground); + imgLabel->setSizePolicy(QSizePolicy::Expanding, + QSizePolicy::Expanding); + imgLabel->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); + + QFile file(":/Introduction/resources/introduction/intro.txt"); + QLabel* introLabel = new QLabel; + introLabel->setWordWrap(true); + + // read introduction text from file + QString line; + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QTextStream stream(&file); + while (!stream.atEnd()) { + line.append(stream.readLine() + "\n"); + } + introLabel->setText(line); + } + file.close(); + + QVBoxLayout* layout = new QVBoxLayout; + layout->addWidget(imgLabel); + QScrollArea* textScroll = new QScrollArea; + textScroll->setFrameShape(QFrame::NoFrame); + textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + textScroll->setWidget(introLabel); + textScroll->setWidgetResizable(true); + layout->addWidget(textScroll); + layout->setAlignment(Qt::AlignHCenter); + p1->setLayout(layout); + } - //introduction - QWizardPage* p1 = new QWizardPage; - { - p1->setTitle("BioTracker 3 - Introduction"); + // overview + QWizardPage* p2 = new QWizardPage; + { + p2->setTitle("BioTracker 3 - Overview"); + QLabel* label = new QLabel( + "This is the BioTracker. Don't let yourself be overwhelmed as it " + "is actually pretty simple."); + label->setWordWrap(true); + + QPixmap overviewImg( + ":/Introduction/resources/introduction/images/BioTracker.PNG"); + QPixmap scaledImg = overviewImg.scaled(QSize(600, 400), + Qt::KeepAspectRatio, + Qt::SmoothTransformation); + + QLabel* imgLabel = new QLabel; + imgLabel->setPixmap(scaledImg); + imgLabel->setSizePolicy(QSizePolicy::Expanding, + QSizePolicy::Expanding); + // imgLabel->setScaledContents(true); + + QVBoxLayout* layout = new QVBoxLayout; + layout->addWidget(imgLabel); + QScrollArea* textScroll = new QScrollArea; + textScroll->setFrameShape(QFrame::NoFrame); + textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + textScroll->setWidget(label); + textScroll->setWidgetResizable(true); + layout->addWidget(textScroll); + layout->setAlignment(Qt::AlignHCenter); + p2->setLayout(layout); + } - QPixmap logoImg(":/Logo/resources/logo/BT3-big.png"); - QPixmap scaledImg = logoImg.scaled(QSize(600, 400), Qt::KeepAspectRatio, Qt::SmoothTransformation); + // toolbars + QWizardPage* p3 = new QWizardPage; + { + p3->setTitle("BioTracker 3 - Toolbars"); + + // image + QPixmap overviewImg( + ":/Introduction/resources/introduction/images/toolbars.png"); + QPixmap scaledImg = overviewImg.scaled(QSize(600, 400), + Qt::KeepAspectRatio, + Qt::SmoothTransformation); + QLabel* imgLabel = new QLabel; + + imgLabel->setPixmap(scaledImg); + + // read toolbar text from file + QFile file(":/Introduction/resources/introduction/toolbars.txt"); + QLabel* label = new QLabel(); + label->setWordWrap(true); + + QString line; + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QTextStream stream(&file); + while (!stream.atEnd()) { + line.append(stream.readLine() + "\n"); + } + label->setText(line); + } + file.close(); + + QVBoxLayout* layout = new QVBoxLayout; + layout->addWidget(imgLabel); + QScrollArea* textScroll = new QScrollArea; + textScroll->setFrameShape(QFrame::NoFrame); + textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + textScroll->setWidget(label); + textScroll->setWidgetResizable(true); + layout->addWidget(textScroll); + layout->setAlignment(Qt::AlignHCenter); + p3->setLayout(layout); + } - QLabel* imgLabel = new QLabel; - imgLabel->setPixmap(scaledImg); - imgLabel->setAttribute(Qt::WA_TranslucentBackground); - imgLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - imgLabel->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); + // right panel - overview + QWizardPage* p4 = new QWizardPage; + { + p4->setTitle("BioTracker 3 - Right panel overview"); + + // image + QPixmap overviewImg( + ":/Introduction/resources/introduction/images/right_panel.png"); + QPixmap scaledImg = overviewImg.scaled(QSize(600, 400), + Qt::KeepAspectRatio, + Qt::SmoothTransformation); + QLabel* imgLabel = new QLabel; + imgLabel->setPixmap(scaledImg); + + // read right panel text from file + QFile file(":/Introduction/resources/introduction/right_panel.txt"); + QLabel* label = new QLabel(); + label->setWordWrap(true); + + QString line; + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QTextStream stream(&file); + while (!stream.atEnd()) { + line.append(stream.readLine() + "\n"); + } + label->setText(line); + } + file.close(); + + QVBoxLayout* layout = new QVBoxLayout; + layout->addWidget(imgLabel); + QScrollArea* textScroll = new QScrollArea; + textScroll->setFrameShape(QFrame::NoFrame); + textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + textScroll->setWidget(label); + textScroll->setWidgetResizable(true); + layout->addWidget(textScroll); + layout->setAlignment(Qt::AlignHCenter); + + p4->setLayout(layout); + } - QFile file(":/Introduction/resources/introduction/intro.txt"); - QLabel *introLabel = new QLabel; - introLabel->setWordWrap(true); + // how to track + QWizardPage* p5 = new QWizardPage; + { + p5->setTitle("BioTracker 3 - Tracking"); + + // image + QPixmap overviewImg( + ":/Introduction/resources/introduction/images/tracking.png"); + QPixmap scaledImg = overviewImg.scaled(QSize(600, 400), + Qt::KeepAspectRatio, + Qt::SmoothTransformation); + QLabel* imgLabel = new QLabel; + imgLabel->setPixmap(scaledImg); + + // read tracking text from file + QFile file(":/Introduction/resources/introduction/tracking.txt"); + QLabel* label = new QLabel(); + label->setWordWrap(true); + + QString line; + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QTextStream stream(&file); + while (!stream.atEnd()) { + line.append(stream.readLine() + "\n"); + } + label->setText(line); + } + file.close(); + + QVBoxLayout* layout = new QVBoxLayout; + layout->addWidget(imgLabel); + QScrollArea* textScroll = new QScrollArea; + textScroll->setFrameShape(QFrame::NoFrame); + textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + textScroll->setWidget(label); + textScroll->setWidgetResizable(true); + layout->addWidget(textScroll); + layout->setAlignment(Qt::AlignHCenter); + + p5->setLayout(layout); + } - //read introduction text from file - QString line; - if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { - QTextStream stream(&file); - while (!stream.atEnd()) { - line.append(stream.readLine() + "\n"); - } - introLabel->setText(line); - } - file.close(); + // context menus + QWizardPage* p6 = new QWizardPage; + { + p6->setTitle("BioTracker 3 - Context menus"); + + // images + QPixmap contextEntityImg( + ":/Introduction/resources/introduction/images/context_entity.png"); + QPixmap scaledImg1 = contextEntityImg.scaled(QSize(300, 400), + Qt::KeepAspectRatio, + Qt::SmoothTransformation); + QLabel* imgEntityLabel = new QLabel; + imgEntityLabel->setPixmap(scaledImg1); + + QPixmap contextVideoImg( + ":/Introduction/resources/introduction/images/context_video.png"); + QPixmap scaledImg2 = contextVideoImg.scaled(QSize(300, 400), + Qt::KeepAspectRatio, + Qt::SmoothTransformation); + QLabel* imgVideoLabel = new QLabel; + imgVideoLabel->setPixmap(scaledImg2); + + // read tracking text from file + QFile file(":/Introduction/resources/introduction/context_menus.txt"); + QLabel* label = new QLabel(); + label->setWordWrap(true); + + QString line; + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QTextStream stream(&file); + while (!stream.atEnd()) { + line.append(stream.readLine() + "\n"); + } + label->setText(line); + } + file.close(); + + QVBoxLayout* outerLayout = new QVBoxLayout; + QHBoxLayout* imgLayout = new QHBoxLayout; + imgLayout->addWidget(imgEntityLabel); + imgLayout->addWidget(imgVideoLabel); + QFrame* imgFrame = new QFrame; + imgFrame->setFrameStyle(QFrame::Panel | QFrame::Sunken); + imgFrame->setLayout(imgLayout); + + outerLayout->addWidget(imgFrame); + QScrollArea* textScroll = new QScrollArea; + textScroll->setFrameShape(QFrame::NoFrame); + textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + textScroll->setWidget(label); + textScroll->setWidgetResizable(true); + outerLayout->addWidget(textScroll); + outerLayout->addWidget(noShowCheck); + + outerLayout->setAlignment(Qt::AlignHCenter); + + p6->setLayout(outerLayout); + } - QVBoxLayout *layout = new QVBoxLayout; - layout->addWidget(imgLabel); - QScrollArea* textScroll = new QScrollArea; - textScroll->setFrameShape(QFrame::NoFrame); - textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - textScroll->setWidget(introLabel); - textScroll->setWidgetResizable(true); - layout->addWidget(textScroll); - layout->setAlignment(Qt::AlignHCenter); - p1->setLayout(layout); - - } - - //overview - QWizardPage* p2 = new QWizardPage; - { - p2->setTitle("BioTracker 3 - Overview"); - QLabel *label = new QLabel("This is the BioTracker. Don't let yourself be overwhelmed as it is actually pretty simple."); - label->setWordWrap(true); - - QPixmap overviewImg(":/Introduction/resources/introduction/images/BioTracker.PNG"); - QPixmap scaledImg = overviewImg.scaled(QSize(600, 400), Qt::KeepAspectRatio, Qt::SmoothTransformation); - - QLabel* imgLabel = new QLabel; - imgLabel->setPixmap(scaledImg); - imgLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - //imgLabel->setScaledContents(true); - - QVBoxLayout *layout = new QVBoxLayout; - layout->addWidget(imgLabel); - QScrollArea* textScroll = new QScrollArea; - textScroll->setFrameShape(QFrame::NoFrame); - textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - textScroll->setWidget(label); - textScroll->setWidgetResizable(true); - layout->addWidget(textScroll); - layout->setAlignment(Qt::AlignHCenter); - p2->setLayout(layout); - } - - //toolbars - QWizardPage* p3 = new QWizardPage; - { - p3->setTitle("BioTracker 3 - Toolbars"); - - //image - QPixmap overviewImg(":/Introduction/resources/introduction/images/toolbars.png"); - QPixmap scaledImg = overviewImg.scaled(QSize(600, 400), Qt::KeepAspectRatio, Qt::SmoothTransformation); - QLabel* imgLabel = new QLabel; - - imgLabel->setPixmap(scaledImg); - - //read toolbar text from file - QFile file(":/Introduction/resources/introduction/toolbars.txt"); - QLabel *label = new QLabel(); - label->setWordWrap(true); - - QString line; - if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { - QTextStream stream(&file); - while (!stream.atEnd()) { - line.append(stream.readLine() + "\n"); - } - label->setText(line); - } - file.close(); - - - QVBoxLayout *layout = new QVBoxLayout; - layout->addWidget(imgLabel); - QScrollArea* textScroll = new QScrollArea; - textScroll->setFrameShape(QFrame::NoFrame); - textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - textScroll->setWidget(label); - textScroll->setWidgetResizable(true); - layout->addWidget(textScroll); - layout->setAlignment(Qt::AlignHCenter); - p3->setLayout(layout); - } - - - //right panel - overview - QWizardPage* p4 = new QWizardPage; - { - p4->setTitle("BioTracker 3 - Right panel overview"); - - //image - QPixmap overviewImg(":/Introduction/resources/introduction/images/right_panel.png"); - QPixmap scaledImg = overviewImg.scaled(QSize(600, 400), Qt::KeepAspectRatio, Qt::SmoothTransformation); - QLabel* imgLabel = new QLabel; - imgLabel->setPixmap(scaledImg); - - //read right panel text from file - QFile file(":/Introduction/resources/introduction/right_panel.txt"); - QLabel *label = new QLabel(); - label->setWordWrap(true); - - QString line; - if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { - QTextStream stream(&file); - while (!stream.atEnd()) { - line.append(stream.readLine() + "\n"); - } - label->setText(line); - } - file.close(); - - - QVBoxLayout *layout = new QVBoxLayout; - layout->addWidget(imgLabel); - QScrollArea* textScroll = new QScrollArea; - textScroll->setFrameShape(QFrame::NoFrame); - textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - textScroll->setWidget(label); - textScroll->setWidgetResizable(true); - layout->addWidget(textScroll); - layout->setAlignment(Qt::AlignHCenter); - - p4->setLayout(layout); - } - - - //how to track - QWizardPage* p5 = new QWizardPage; - { - p5->setTitle("BioTracker 3 - Tracking"); - - //image - QPixmap overviewImg(":/Introduction/resources/introduction/images/tracking.png"); - QPixmap scaledImg = overviewImg.scaled(QSize(600, 400), Qt::KeepAspectRatio, Qt::SmoothTransformation); - QLabel* imgLabel = new QLabel; - imgLabel->setPixmap(scaledImg); - - //read tracking text from file - QFile file(":/Introduction/resources/introduction/tracking.txt"); - QLabel *label = new QLabel(); - label->setWordWrap(true); - - QString line; - if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { - QTextStream stream(&file); - while (!stream.atEnd()) { - line.append(stream.readLine() + "\n"); - } - label->setText(line); - } - file.close(); - - - QVBoxLayout *layout = new QVBoxLayout; - layout->addWidget(imgLabel); - QScrollArea* textScroll = new QScrollArea; - textScroll->setFrameShape(QFrame::NoFrame); - textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - textScroll->setWidget(label); - textScroll->setWidgetResizable(true); - layout->addWidget(textScroll); - layout->setAlignment(Qt::AlignHCenter); - - p5->setLayout(layout); - } - - //context menus - QWizardPage* p6 = new QWizardPage; - { - p6->setTitle("BioTracker 3 - Context menus"); - - //images - QPixmap contextEntityImg(":/Introduction/resources/introduction/images/context_entity.png"); - QPixmap scaledImg1 = contextEntityImg.scaled(QSize(300, 400), Qt::KeepAspectRatio, Qt::SmoothTransformation); - QLabel* imgEntityLabel = new QLabel; - imgEntityLabel->setPixmap(scaledImg1); - - QPixmap contextVideoImg(":/Introduction/resources/introduction/images/context_video.png"); - QPixmap scaledImg2 = contextVideoImg.scaled(QSize(300, 400), Qt::KeepAspectRatio, Qt::SmoothTransformation); - QLabel* imgVideoLabel = new QLabel; - imgVideoLabel->setPixmap(scaledImg2); - - //read tracking text from file - QFile file(":/Introduction/resources/introduction/context_menus.txt"); - QLabel *label = new QLabel(); - label->setWordWrap(true); - - QString line; - if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { - QTextStream stream(&file); - while (!stream.atEnd()) { - line.append(stream.readLine() + "\n"); - } - label->setText(line); - } - file.close(); - - - QVBoxLayout *outerLayout = new QVBoxLayout; - QHBoxLayout *imgLayout = new QHBoxLayout; - imgLayout->addWidget(imgEntityLabel); - imgLayout->addWidget(imgVideoLabel); - QFrame* imgFrame = new QFrame; - imgFrame->setFrameStyle(QFrame::Panel | QFrame::Sunken); - imgFrame->setLayout(imgLayout); - - outerLayout->addWidget(imgFrame); - QScrollArea* textScroll = new QScrollArea; - textScroll->setFrameShape(QFrame::NoFrame); - textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - textScroll->setWidget(label); - textScroll->setWidgetResizable(true); - outerLayout->addWidget(textScroll); - outerLayout->addWidget(noShowCheck); - - outerLayout->setAlignment(Qt::AlignHCenter); - - p6->setLayout(outerLayout); - } - - - m_introWiz->addPage(p1); - m_introWiz->addPage(p2); - m_introWiz->addPage(p3); - m_introWiz->addPage(p4); - m_introWiz->addPage(p5); - m_introWiz->addPage(p6); - //m_introWiz->addPage(p7); - - - m_introWiz->setWindowTitle("Introduction"); - if (!disabled) { - QRect rec = QApplication::desktop()->availableGeometry(); - m_introWiz->resize(m_introWiz->width(), 500); - m_introWiz->show(); - //m_introWiz->showMaximized(); - } + m_introWiz->addPage(p1); + m_introWiz->addPage(p2); + m_introWiz->addPage(p3); + m_introWiz->addPage(p4); + m_introWiz->addPage(p5); + m_introWiz->addPage(p6); + // m_introWiz->addPage(p7); + + m_introWiz->setWindowTitle("Introduction"); + if (!disabled) { + QRect rec = QApplication::desktop()->availableGeometry(); + m_introWiz->resize(m_introWiz->width(), 500); + m_introWiz->show(); + // m_introWiz->showMaximized(); + } } /////////////////////////////////////////// -void MainWindow::setCorePermission(std::pair permission) { - if (permission.first == ENUMS::COREPERMISSIONS::COMPONENTADD) { - ui->actionAdd_Track->setEnabled(permission.second); - return; - } - if (permission.first == ENUMS::COREPERMISSIONS::COMPONENTREMOVE) { - ui->actionDelete_selected_tracks->setEnabled(permission.second); - return; - } - if (permission.first == ENUMS::COREPERMISSIONS::COMPONENTSWAP) { - ui->actionSwap_ID_s->setEnabled(permission.second); - return; - } -} - -void MainWindow::on_comboBox_TrackerSelect_currentIndexChanged(QString s) { - QString ct = ui->comboBox_TrackerSelect->currentText(); - if (!ct.isEmpty() && _previouslySelectedTracker != ct) { - _previouslySelectedTracker = ct; - Q_EMIT selectPlugin(ct); - } +void MainWindow::setCorePermission( + std::pair permission) +{ + if (permission.first == ENUMS::COREPERMISSIONS::COMPONENTADD) { + ui->actionAdd_Track->setEnabled(permission.second); + return; + } + if (permission.first == ENUMS::COREPERMISSIONS::COMPONENTREMOVE) { + ui->actionDelete_selected_tracks->setEnabled(permission.second); + return; + } + if (permission.first == ENUMS::COREPERMISSIONS::COMPONENTSWAP) { + ui->actionSwap_ID_s->setEnabled(permission.second); + return; + } } -void MainWindow::setCursorPositionLabel(QPoint pos) +void MainWindow::on_comboBox_TrackerSelect_currentIndexChanged(QString s) { - QString posString = QString("%1, %2").arg(QString::number(pos.x()), QString::number(pos.y())); - + QString ct = ui->comboBox_TrackerSelect->currentText(); + if (!ct.isEmpty() && _previouslySelectedTracker != ct) { + _previouslySelectedTracker = ct; + Q_EMIT selectPlugin(ct); + } +} - QLabel* currentChild = statusBar()->findChild("_cursorPosition"); - currentChild->setText(posString); +void MainWindow::setCursorPositionLabel(QPoint pos) +{ + QString posString = QString("%1, %2").arg(QString::number(pos.x()), + QString::number(pos.y())); + QLabel* currentChild = statusBar()->findChild("_cursorPosition"); + currentChild->setText(posString); } -void MainWindow::activeTrackingCheckBox() { - //ui->checkBox_TrackingActivated->setEnabled(true); - _trackerActivator->setEnabled(true); - checkTrackerGroupBox(); - ui->toolBarTools->setEnabled(true); +void MainWindow::activeTrackingCheckBox() +{ + // ui->checkBox_TrackingActivated->setEnabled(true); + _trackerActivator->setEnabled(true); + checkTrackerGroupBox(); + ui->toolBarTools->setEnabled(true); } -void MainWindow::deactivateTrackingCheckBox() { - //ui->checkBox_TrackingActivated->setEnabled(false); - _trackerActivator->setEnabled(false); +void MainWindow::deactivateTrackingCheckBox() +{ + // ui->checkBox_TrackingActivated->setEnabled(false); + _trackerActivator->setEnabled(false); } -void MainWindow::saveDataToFile() { - static const QString fileFilter( - "tracking data files (*.csv *.dat *.json)"); +void MainWindow::saveDataToFile() +{ + static const QString fileFilter( + "tracking data files (*.csv *.dat *.json)"); - boost::filesystem::path file; + boost::filesystem::path file; - std::string locStr = _cfg->DefaultLocationManualSave.toStdString(); - QString locStrQ = QString::fromStdString(locStr); + std::string locStr = _cfg->DefaultLocationManualSave.toStdString(); + QString locStrQ = QString::fromStdString(locStr); - QString f = QFileDialog::getSaveFileName(this, "Save trajectory data to file", locStrQ, fileFilter, 0); + QString f = QFileDialog::getSaveFileName(this, + "Save trajectory data to file", + locStrQ, + fileFilter, + 0); - if (f != "") { - qobject_cast (getController())->saveTrajectoryFile(f.toStdString()); - } + if (f != "") { + qobject_cast(getController()) + ->saveTrajectoryFile(f.toStdString()); + } } ////////////////////////////////////////////////SLOTS///////////////////////////////////// -void MainWindow::toggleNoShowWiz(bool toggle) { - _cfg->DisableWizard = toggle;//Todo implicit cast bool->int +void MainWindow::toggleNoShowWiz(bool toggle) +{ + _cfg->DisableWizard = toggle; // Todo implicit cast bool->int } -void MainWindow::receiveSelectedCameraDevice(CameraConfiguration conf) { - qobject_cast (getController())->loadCameraDevice(conf); - +void MainWindow::receiveSelectedCameraDevice(CameraConfiguration conf) +{ + qobject_cast(getController()) + ->loadCameraDevice(conf); } -void MainWindow::on_rightPanelViewControllerButton_clicked() { - QList splitterSizes = QList(); - if (ui->widgetParameterAreaOuterCanvas->isVisible()) { - _lastRightPanelWidth = ui->mainSplitter->sizes()[1]; //save last width to restore on show - _lastVideoWidgetWidth = ui->mainSplitter->sizes()[0]; - - ui->widgetParameterAreaOuterCanvas->hide(); - splitterSizes << 20000 << ui->rightPanelViewControllerWidget->minimumSizeHint().width(); - - ui->rightPanelViewControllerButton->setText("<"); - //set menu action unchecked - ui->actionRight_panel->setChecked(false); - } - else { - ui->widgetParameterAreaOuterCanvas->show(); - splitterSizes << _lastVideoWidgetWidth << _lastRightPanelWidth; - ui->rightPanelViewControllerButton->setText(">"); - - //set menu action checked - ui->actionRight_panel->setChecked(true); - } - ui->mainSplitter->setSizes(splitterSizes); +void MainWindow::on_rightPanelViewControllerButton_clicked() +{ + QList splitterSizes = QList(); + if (ui->widgetParameterAreaOuterCanvas->isVisible()) { + _lastRightPanelWidth = + ui->mainSplitter->sizes()[1]; // save last width to restore on show + _lastVideoWidgetWidth = ui->mainSplitter->sizes()[0]; + + ui->widgetParameterAreaOuterCanvas->hide(); + splitterSizes + << 20000 + << ui->rightPanelViewControllerWidget->minimumSizeHint().width(); + + ui->rightPanelViewControllerButton->setText("<"); + // set menu action unchecked + ui->actionRight_panel->setChecked(false); + } else { + ui->widgetParameterAreaOuterCanvas->show(); + splitterSizes << _lastVideoWidgetWidth << _lastRightPanelWidth; + ui->rightPanelViewControllerButton->setText(">"); + + // set menu action checked + ui->actionRight_panel->setChecked(true); + } + ui->mainSplitter->setSizes(splitterSizes); } -void MainWindow::on_bottomPanelViewControllerButton_clicked() { - ui->videoControls->setVisible(ui->bottomPanelViewControllerButton->text() == "^"); - ui->bottomPanelViewControllerButton->setText(ui->bottomPanelViewControllerButton->text() == "v" ? "^" : "v"); +void MainWindow::on_bottomPanelViewControllerButton_clicked() +{ + ui->videoControls->setVisible( + ui->bottomPanelViewControllerButton->text() == "^"); + ui->bottomPanelViewControllerButton->setText( + ui->bottomPanelViewControllerButton->text() == "v" ? "^" : "v"); } -void MainWindow::activateTracking() { - _trackerActivator->setState(true); +void MainWindow::activateTracking() +{ + _trackerActivator->setState(true); } -void MainWindow::deactivateTracking() { - _trackerActivator->setState(false); +void MainWindow::deactivateTracking() +{ + _trackerActivator->setState(false); } -void MainWindow::receiveSetTracking(bool toggle) { - if (toggle) { - qobject_cast (getController())->activeTracking(); - } - else { - qobject_cast (getController())->deactiveTrackring(); - } +void MainWindow::receiveSetTracking(bool toggle) +{ + if (toggle) { + qobject_cast(getController())->activeTracking(); + } else { + qobject_cast(getController()) + ->deactiveTrackring(); + } } -void MainWindow::resetTrackerViews() { - if (_currentElementView && _currentCoreView) { - _currentElementView->setParent(0); - _currentCoreView->setParent(0); - m_graphView->removeGraphicsItem(_currentElementView); - m_graphView->removeGraphicsItem(_currentCoreView); - } +void MainWindow::resetTrackerViews() +{ + if (_currentElementView && _currentCoreView) { + _currentElementView->setParent(0); + _currentCoreView->setParent(0); + m_graphView->removeGraphicsItem(_currentElementView); + m_graphView->removeGraphicsItem(_currentCoreView); + } - _currentElementView = nullptr; - _currentCoreView = nullptr; + _currentElementView = nullptr; + _currentCoreView = nullptr; } -//////////////////////////utility toolbar action slots/////////////////////////// -void MainWindow::on_actionAdd_Track_triggered() { - qobject_cast (getController())->emitAddTrack(); +//////////////////////////utility toolbar action +/// slots/////////////////////////// +void MainWindow::on_actionAdd_Track_triggered() +{ + qobject_cast(getController())->emitAddTrack(); } -void MainWindow::on_actionDelete_selected_tracks_triggered() { - qobject_cast (getController())->emitDeleteSelectedTracks(); +void MainWindow::on_actionDelete_selected_tracks_triggered() +{ + qobject_cast(getController()) + ->emitDeleteSelectedTracks(); } -void MainWindow::on_actionSwap_ID_s_triggered() { - qobject_cast (getController())->emitSwapIds(); - +void MainWindow::on_actionSwap_ID_s_triggered() +{ + qobject_cast(getController())->emitSwapIds(); } -void MainWindow::on_actionSelect_all_triggered() { - qobject_cast (getController())->emitSelectAll(); +void MainWindow::on_actionSelect_all_triggered() +{ + qobject_cast(getController())->emitSelectAll(); } -void MainWindow::on_actionChange_the_border_color_triggered() { - qobject_cast (getController())->emitChangeColorBorder(); +void MainWindow::on_actionChange_the_border_color_triggered() +{ + qobject_cast(getController()) + ->emitChangeColorBorder(); } -void MainWindow::on_actionChange_the_fill_color_triggered() { - qobject_cast (getController())->emitChangeColorFill(); +void MainWindow::on_actionChange_the_fill_color_triggered() +{ + qobject_cast(getController()) + ->emitChangeColorFill(); } -void MainWindow::on_actionAdd_label_Annotation_triggered() { - qobject_cast (getController())->emitAddLabelAnno(); +void MainWindow::on_actionAdd_label_Annotation_triggered() +{ + qobject_cast(getController())->emitAddLabelAnno(); } -void MainWindow::on_actionAdd_rectangular_annotation_triggered() { - qobject_cast (getController())->emitAddRectAnno(); +void MainWindow::on_actionAdd_rectangular_annotation_triggered() +{ + qobject_cast(getController())->emitAddRectAnno(); } -void MainWindow::on_actionAdd_arrow_annotation_triggered() { - qobject_cast (getController())->emitAddArrAnno(); +void MainWindow::on_actionAdd_arrow_annotation_triggered() +{ + qobject_cast(getController())->emitAddArrAnno(); } -void MainWindow::on_actionAdd_elliptical_annotation_triggered() { - qobject_cast (getController())->emitAddEllAnno(); +void MainWindow::on_actionAdd_elliptical_annotation_triggered() +{ + qobject_cast(getController())->emitAddEllAnno(); } -void MainWindow::on_actionDelete_selected_Annotation_triggered() { - qobject_cast (getController())->emitDelSelAnno(); +void MainWindow::on_actionDelete_selected_Annotation_triggered() +{ + qobject_cast(getController())->emitDelSelAnno(); } - ///////////////////////////////menu->file slots///////////////////////////// -void MainWindow::on_actionOpen_Video_triggered() { - static const QString videoFilter("Video files (*.avi *.wmv *.mp4 *.mkv *.mov)"); +void MainWindow::on_actionOpen_Video_triggered() +{ + static const QString videoFilter( + "Video files (*.avi *.wmv *.mp4 *.mkv *.mov)"); - QString filename = QFileDialog::getOpenFileName(this, - "Open video", "", videoFilter, 0); + QString filename = + QFileDialog::getOpenFileName(this, "Open video", "", videoFilter, 0); - if (!filename.isEmpty()) { - dynamic_cast (getController())->loadVideo({filename.toStdString().c_str()}); - } + if (!filename.isEmpty()) { + dynamic_cast(getController()) + ->loadVideo({filename.toStdString().c_str()}); + } } -void MainWindow::on_actionOpen_Video_batch_triggered() { - static const QString videoFilter("Video files (*.avi *.wmv *.mp4 *.mkv *.mov)"); +void MainWindow::on_actionOpen_Video_batch_triggered() +{ + static const QString videoFilter( + "Video files (*.avi *.wmv *.mp4 *.mkv *.mov)"); std::vector files; - for (QString const& path : QFileDialog::getOpenFileNames(this, - "Open image files", "", videoFilter, 0)) { + for (QString const& path : + QFileDialog::getOpenFileNames(this, + "Open image files", + "", + videoFilter, + 0)) { files.push_back(boost::filesystem::path(path.toStdString())); } if (!files.empty()) { - qobject_cast (getController())->loadVideo(files); + qobject_cast(getController())->loadVideo(files); } } -void MainWindow::on_actionLoad_Tracker_triggered() { - static const QString pluginFilter("BioTracker Tracking Plugin files (*.bio_tracker.so *.bio_tracker.dll *.bio_tracker.dylib)"); - - QString filename = QFileDialog::getOpenFileName(this, - "Open BioTracker Tracking Plugin", "", pluginFilter, 0); - - if (!filename.isEmpty()) { - qobject_cast (getController())->loadTracker(filename); - } +void MainWindow::on_actionLoad_Tracker_triggered() +{ + static const QString pluginFilter( + "BioTracker Tracking Plugin files (*.bio_tracker.so *.bio_tracker.dll " + "*.bio_tracker.dylib)"); + + QString filename = QFileDialog::getOpenFileName( + this, + "Open BioTracker Tracking Plugin", + "", + pluginFilter, + 0); + + if (!filename.isEmpty()) { + qobject_cast(getController()) + ->loadTracker(filename); + } } -void MainWindow::on_actionOpen_Picture_triggered() { - static const QString imageFilter( - "image files (*.png *.jpg *.jpeg *.gif *.bmp *.jpe *.ppm *.tiff *.tif *.sr *.ras *.pbm *.pgm *.jp2 *.dib)"); +void MainWindow::on_actionOpen_Picture_triggered() +{ + static const QString imageFilter( + "image files (*.png *.jpg *.jpeg *.gif *.bmp *.jpe *.ppm *.tiff *.tif " + "*.sr *.ras *.pbm *.pgm *.jp2 *.dib)"); - std::vector files; - for (QString const& path : QFileDialog::getOpenFileNames(this, - "Open image files", "", imageFilter, 0)) { - files.push_back(boost::filesystem::path(path.toStdString())); - } + std::vector files; + for (QString const& path : + QFileDialog::getOpenFileNames(this, + "Open image files", + "", + imageFilter, + 0)) { + files.push_back(boost::filesystem::path(path.toStdString())); + } - if (!files.empty()) { - qobject_cast (getController())->loadPictures(files); - } + if (!files.empty()) { + qobject_cast(getController()) + ->loadPictures(files); + } } -void MainWindow::on_actionLoad_trackingdata_triggered() { - static const QString imageFilter( - "tracking data files (*.csv *.dat *.json)"); +void MainWindow::on_actionLoad_trackingdata_triggered() +{ + static const QString imageFilter( + "tracking data files (*.csv *.dat *.json)"); - std::vector files; - for (QString const& path : QFileDialog::getOpenFileNames(this, - "Open tracking file", "", imageFilter, 0)) { - files.push_back(boost::filesystem::path(path.toStdString())); - } + std::vector files; + for (QString const& path : + QFileDialog::getOpenFileNames(this, + "Open tracking file", + "", + imageFilter, + 0)) { + files.push_back(boost::filesystem::path(path.toStdString())); + } - if (!files.empty()) { - qobject_cast (getController())->loadTrajectoryFile(files[0].string()); - } + if (!files.empty()) { + qobject_cast(getController()) + ->loadTrajectoryFile(files[0].string()); + } } -void MainWindow::on_actionSave_trackingdata_triggered() { - saveDataToFile(); +void MainWindow::on_actionSave_trackingdata_triggered() +{ + saveDataToFile(); } -void MainWindow::on_actionOpen_Camera_triggered() { - m_CameraDevice = new CameraDevice(); +void MainWindow::on_actionOpen_Camera_triggered() +{ + m_CameraDevice = new CameraDevice(); - m_CameraDevice->show(); + m_CameraDevice->show(); - QObject::connect(m_CameraDevice, &CameraDevice::emitSelectedCameraDevice, this, &MainWindow::receiveSelectedCameraDevice); + QObject::connect(m_CameraDevice, + &CameraDevice::emitSelectedCameraDevice, + this, + &MainWindow::receiveSelectedCameraDevice); } -void MainWindow::on_actionQuit_triggered() { - qobject_cast (getController())->exit(); +void MainWindow::on_actionQuit_triggered() +{ + qobject_cast(getController())->exit(); } ///////////////////////////////menu->edit slots///////////////////////////// void MainWindow::on_actionUndo_triggered() { - qobject_cast (getController())->emitUndoCommand(); + qobject_cast(getController())->emitUndoCommand(); } void MainWindow::on_actionRedo_triggered() { - qobject_cast (getController())->emitRedoCommand(); + qobject_cast(getController())->emitRedoCommand(); } void MainWindow::on_actionShowActionList_triggered() { - qobject_cast (getController())->emitShowActionListCommand(); + qobject_cast(getController()) + ->emitShowActionListCommand(); } -void MainWindow::on_actionSettings_triggered() { - m_SettingsWindow = new SettingsWindow(0, _cfg); +void MainWindow::on_actionSettings_triggered() +{ + m_SettingsWindow = new SettingsWindow(0, _cfg); - m_SettingsWindow->show(); + m_SettingsWindow->show(); } ///////////////////////////////menu->view slots///////////////////////////// -//toggle toolbars actions -void MainWindow::on_actionToggle_menu_toolbar_triggered() { - bool currentState = ui->toolBarMenu->isVisible(); - ui->toolBarMenu->setVisible(!currentState); - ui->actionToggle_menu_toolbar->setText(!currentState ? "Hide menu toolbar" : "Show menu toolbar"); +// toggle toolbars actions +void MainWindow::on_actionToggle_menu_toolbar_triggered() +{ + bool currentState = ui->toolBarMenu->isVisible(); + ui->toolBarMenu->setVisible(!currentState); + ui->actionToggle_menu_toolbar->setText( + !currentState ? "Hide menu toolbar" : "Show menu toolbar"); } -void MainWindow::on_actionToggle_view_toolbar_triggered() { - bool currentState = ui->toolBarTools->isVisible(); - ui->toolBarTools->setVisible(!currentState); - ui->actionToggle_view_toolbar->setText(!currentState ? "Hide view toolbar" : "Show view toolbar"); +void MainWindow::on_actionToggle_view_toolbar_triggered() +{ + bool currentState = ui->toolBarTools->isVisible(); + ui->toolBarTools->setVisible(!currentState); + ui->actionToggle_view_toolbar->setText( + !currentState ? "Hide view toolbar" : "Show view toolbar"); } -void MainWindow::on_actionToggle_video_toolbar_triggered() { - bool currentState = ui->toolBarVideo->isVisible(); - ui->toolBarVideo->setVisible(!currentState); - ui->actionToggle_video_toolbar->setText(!currentState ? "Hide view toolbar" : "Show view toolbar"); +void MainWindow::on_actionToggle_video_toolbar_triggered() +{ + bool currentState = ui->toolBarVideo->isVisible(); + ui->toolBarVideo->setVisible(!currentState); + ui->actionToggle_video_toolbar->setText( + !currentState ? "Hide view toolbar" : "Show view toolbar"); } -void MainWindow::on_actionToggle_compact_menu_toolbar_2_triggered() { - ui->toolBarMenu->setStyleSheet("QGroupBox" - " {border-style: none; margin-top: 0ex; font-size: 1px;}" - "QGroupBox::title {font-size: 1px; padding: 0 3px;}"); - - +void MainWindow::on_actionToggle_compact_menu_toolbar_2_triggered() +{ + ui->toolBarMenu->setStyleSheet( + "QGroupBox" + " {border-style: none; margin-top: 0ex; font-size: 1px;}" + "QGroupBox::title {font-size: 1px; padding: 0 3px;}"); } -void MainWindow::on_toolBarMenu_visibilityChanged(bool visible) { - ui->actionToggle_menu_toolbar->setText(visible ? "Hide menu toolbar" : "Show menu toolbar"); +void MainWindow::on_toolBarMenu_visibilityChanged(bool visible) +{ + ui->actionToggle_menu_toolbar->setText(visible ? "Hide menu toolbar" + : "Show menu toolbar"); } -void MainWindow::on_toolBarTools_visibilityChanged(bool visible) { - ui->actionToggle_view_toolbar->setText(visible ? "Hide view toolbar" : "Show view toolbar"); +void MainWindow::on_toolBarTools_visibilityChanged(bool visible) +{ + ui->actionToggle_view_toolbar->setText(visible ? "Hide view toolbar" + : "Show view toolbar"); } -void MainWindow::on_toolBarVideo_visibilityChanged(bool visible) { - ui->actionToggle_video_toolbar->setText(visible ? "Hide video toolbar" : "Show video toolbar"); +void MainWindow::on_toolBarVideo_visibilityChanged(bool visible) +{ + ui->actionToggle_video_toolbar->setText(visible ? "Hide video toolbar" + : "Show video toolbar"); } -void MainWindow::on_actionBottom_panel_triggered(bool checked) { - ui->bottomPanelViewControllerButton->click(); +void MainWindow::on_actionBottom_panel_triggered(bool checked) +{ + ui->bottomPanelViewControllerButton->click(); } -void MainWindow::on_actionRight_panel_triggered(bool checked) { - ui->rightPanelViewControllerButton->click(); +void MainWindow::on_actionRight_panel_triggered(bool checked) +{ + ui->rightPanelViewControllerButton->click(); } -void MainWindow::on_actionToggle_fullscreen_triggered() { - if (isFullScreen()) { - showNormal(); - } - else { - showFullScreen(); - } +void MainWindow::on_actionToggle_fullscreen_triggered() +{ + if (isFullScreen()) { + showNormal(); + } else { + showFullScreen(); + } } -//////////////////////////////////menu->Go to slots////////////////////////////////// +//////////////////////////////////menu->Go to +/// slots////////////////////////////////// -void MainWindow::on_actionOpen_Plugins_directory_triggered() { - QDesktopServices::openUrl(QUrl::fromLocalFile(_cfg->DirPlugins)); +void MainWindow::on_actionOpen_Plugins_directory_triggered() +{ + QDesktopServices::openUrl(QUrl::fromLocalFile(_cfg->DirPlugins)); } -void MainWindow::on_actionOpen_Track_directory_triggered() { - QDesktopServices::openUrl(QUrl::fromLocalFile(_cfg->DirTracks)); +void MainWindow::on_actionOpen_Track_directory_triggered() +{ + QDesktopServices::openUrl(QUrl::fromLocalFile(_cfg->DirTracks)); } -void MainWindow::on_actionOpen_Trial_directory_triggered() { - QDesktopServices::openUrl(QUrl::fromLocalFile(_cfg->DirTrials)); +void MainWindow::on_actionOpen_Trial_directory_triggered() +{ + QDesktopServices::openUrl(QUrl::fromLocalFile(_cfg->DirTrials)); } -void MainWindow::on_actionOpen_Screenshot_directory_triggered() { - QDesktopServices::openUrl(QUrl::fromLocalFile(_cfg->DirScreenshots)); +void MainWindow::on_actionOpen_Screenshot_directory_triggered() +{ + QDesktopServices::openUrl(QUrl::fromLocalFile(_cfg->DirScreenshots)); } -void MainWindow::on_actionOpen_Videos_directory_triggered() { - QDesktopServices::openUrl(QUrl::fromLocalFile(_cfg->DirVideos)); +void MainWindow::on_actionOpen_Videos_directory_triggered() +{ + QDesktopServices::openUrl(QUrl::fromLocalFile(_cfg->DirVideos)); } +//////////////////////////////////menu->Help +/// slots////////////////////////////// -//////////////////////////////////menu->Help slots////////////////////////////// - -void MainWindow::on_actionUser_guide_triggered() { - QDesktopServices::openUrl(QUrl("https://github.com/BioroboticsLab/biotracker_core/wiki")); +void MainWindow::on_actionUser_guide_triggered() +{ + QDesktopServices::openUrl( + QUrl("https://github.com/BioroboticsLab/biotracker_core/wiki")); } -void MainWindow::on_actionAbout_triggered() { - std::string version = ""; - version = "BioTracker3

      "; +void MainWindow::on_actionAbout_triggered() +{ + std::string version = ""; + version = "BioTracker3

      "; - version = "Source Version: "; - version += SOURCE_VERSION; - version += +"

      "; + version = "Source Version: "; + version += SOURCE_VERSION; + version += +"

      "; - version += "External libraries used:

      "; - std::string qt = MyQT_VERSION; - version += "QT " + qt + "
      "; + version += "External libraries used:

      "; + std::string qt = MyQT_VERSION; + version += "QT " + qt + "
      "; - std::string cv = MyCV_VERSION; - version += "OpenCV " + cv + "
      "; + std::string cv = MyCV_VERSION; + version += "OpenCV " + cv + "
      "; - std::string boost = MyBT_VERSION; - version += "Boost " + boost + "
      "; + std::string boost = MyBT_VERSION; + version += "Boost " + boost + "
      "; - version += "

      Icons by
      icons8
      "; + version += "

      Icons by icons8
      "; - version += "

      Published under LGPL licence"; + version += "

      Published under LGPL licence"; - QMessageBox msgBox(this); - msgBox.setWindowTitle("About BioTracker"); - msgBox.setTextFormat(Qt::RichText); //this is what makes the links clickable - msgBox.setText(tr(version.c_str())); - msgBox.exec(); + QMessageBox msgBox(this); + msgBox.setWindowTitle("About BioTracker"); + msgBox.setTextFormat( + Qt::RichText); // this is what makes the links clickable + msgBox.setText(tr(version.c_str())); + msgBox.exec(); - //QMessageBox::about(this, tr("About BioTracker"), tr(version.c_str())); + // QMessageBox::about(this, tr("About BioTracker"), tr(version.c_str())); } -void MainWindow::on_actionShortcuts_triggered() { - - QTableWidget* scTable = new QTableWidget(); - - scTable->setRowCount(0); - scTable->setColumnCount(2); - - scTable->setHorizontalHeaderItem(0, new QTableWidgetItem("Shortcut")); - scTable->setHorizontalHeaderItem(1, new QTableWidgetItem("Description")); - scTable->verticalHeader()->hide(); - - - QLinkedList> scList; +void MainWindow::on_actionShortcuts_triggered() +{ - //read from file in resources and add to linked list - QFile shortcutFile(":Shortcuts/resources/shortcuts.txt"); + QTableWidget* scTable = new QTableWidget(); - if (!shortcutFile.open(QIODevice::ReadOnly | QIODevice::Text)) - return; + scTable->setRowCount(0); + scTable->setColumnCount(2); - QString line; - while (!shortcutFile.atEnd()) { - QTextStream stream(&shortcutFile); - while (!stream.atEnd()) { - line = stream.readLine(); - QStringList shortCutAndDescription = line.split(':'); - if (shortCutAndDescription.size() == 2) { - scList.append(QPair(shortCutAndDescription[0], shortCutAndDescription[1])); - } - } + scTable->setHorizontalHeaderItem(0, new QTableWidgetItem("Shortcut")); + scTable->setHorizontalHeaderItem(1, new QTableWidgetItem("Description")); + scTable->verticalHeader()->hide(); - } + QLinkedList> scList; - QLinkedList>::const_iterator sc; - for (sc = scList.constBegin(); sc != scList.constEnd(); ++sc) { - scTable->insertRow(scTable->rowCount()); + // read from file in resources and add to linked list + QFile shortcutFile(":Shortcuts/resources/shortcuts.txt"); + if (!shortcutFile.open(QIODevice::ReadOnly | QIODevice::Text)) + return; - QTableWidgetItem* scKey = new QTableWidgetItem(sc->first); - QTableWidgetItem* scKeyInfo = new QTableWidgetItem(sc->second); - scKey->setFlags(Qt::NoItemFlags | Qt::ItemIsEnabled | Qt::ItemIsSelectable); - scKeyInfo->setFlags(Qt::NoItemFlags | Qt::ItemIsEnabled | Qt::ItemIsSelectable); + QString line; + while (!shortcutFile.atEnd()) { + QTextStream stream(&shortcutFile); + while (!stream.atEnd()) { + line = stream.readLine(); + QStringList shortCutAndDescription = line.split(':'); + if (shortCutAndDescription.size() == 2) { + scList.append( + QPair(shortCutAndDescription[0], + shortCutAndDescription[1])); + } + } + } - scTable->setItem(scTable->rowCount() - 1, 0, scKey); - scTable->setItem(scTable->rowCount() - 1, 1, scKeyInfo); - } + QLinkedList>::const_iterator sc; + for (sc = scList.constBegin(); sc != scList.constEnd(); ++sc) { + scTable->insertRow(scTable->rowCount()); + QTableWidgetItem* scKey = new QTableWidgetItem(sc->first); + QTableWidgetItem* scKeyInfo = new QTableWidgetItem(sc->second); + scKey->setFlags(Qt::NoItemFlags | Qt::ItemIsEnabled | + Qt::ItemIsSelectable); + scKeyInfo->setFlags(Qt::NoItemFlags | Qt::ItemIsEnabled | + Qt::ItemIsSelectable); - //scTable->horizontalHeader()->setStretchLastSection( true ); - scTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); + scTable->setItem(scTable->rowCount() - 1, 0, scKey); + scTable->setItem(scTable->rowCount() - 1, 1, scKeyInfo); + } - QWidget* outerWidget = new QWidget(); - outerWidget->setWindowTitle("Shortcuts"); - outerWidget->resize(scTable->size()); - QVBoxLayout* vLayout = new QVBoxLayout(); + // scTable->horizontalHeader()->setStretchLastSection( true ); + scTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); - vLayout->addWidget(scTable); + QWidget* outerWidget = new QWidget(); + outerWidget->setWindowTitle("Shortcuts"); + outerWidget->resize(scTable->size()); + QVBoxLayout* vLayout = new QVBoxLayout(); - outerWidget->setLayout(vLayout); + vLayout->addWidget(scTable); + outerWidget->setLayout(vLayout); - outerWidget->show(); + outerWidget->show(); } -void MainWindow::on_actionShow_introduction_triggered() { - m_introWiz->show(); +void MainWindow::on_actionShow_introduction_triggered() +{ + m_introWiz->show(); } ///////////// -void MainWindow::closeEvent(QCloseEvent *event) { - qobject_cast (getController())->exit(); +void MainWindow::closeEvent(QCloseEvent* event) +{ + qobject_cast(getController())->exit(); } \ No newline at end of file diff --git a/Src/View/MainWindow.h b/Src/View/MainWindow.h index e8f7357c..b79435f6 100644 --- a/Src/View/MainWindow.h +++ b/Src/View/MainWindow.h @@ -20,173 +20,178 @@ #include "Utility/SwitchButton.h" #include "Controller/IControllerCfg.h" -namespace Ui { - class MainWindow; +namespace Ui +{ + class MainWindow; } class IController; - /** -* This class inherits IViewMainWindow. -* It is the canvas (GUI) for most of the view of other components. -* It also provides its own fuctionality, like an introduction dialog -*/ -class MainWindow : public IViewMainWindow { - Q_OBJECT + * This class inherits IViewMainWindow. + * It is the canvas (GUI) for most of the view of other components. + * It also provides its own fuctionality, like an introduction dialog + */ +class MainWindow : public IViewMainWindow +{ + Q_OBJECT public: - explicit MainWindow(QWidget* parent = 0, IController* controller = 0, IModel* model = 0); - ~MainWindow(); - - void addVideoControllWidget(IView* widget); - void addVideoView(IView* videoView); - void addTrackerParameterView(IView* parameter); - void addCoreParameterView(IView* coreParameterView); - //void addExperimentView(QWidget* experimentWidget); - void addTrackerElementsView(IView *elemView); - void addCoreElementsView(IView* coreView); - void addNotificationBrowser(IView* notificationBrowser); - void setTrackerList(QStringListModel* trackerList, QString current); - void setCursorPositionLabel(QPoint pos); - void setCorePermission(std::pair permission); + explicit MainWindow(QWidget* parent = 0, + IController* controller = 0, + IModel* model = 0); + ~MainWindow(); + void addVideoControllWidget(IView* widget); + void addVideoView(IView* videoView); + void addTrackerParameterView(IView* parameter); + void addCoreParameterView(IView* coreParameterView); + // void addExperimentView(QWidget* experimentWidget); + void addTrackerElementsView(IView* elemView); + void addCoreElementsView(IView* coreView); + void addNotificationBrowser(IView* notificationBrowser); + void setTrackerList(QStringListModel* trackerList, QString current); + void setCursorPositionLabel(QPoint pos); + void setCorePermission(std::pair permission); - void activeTrackingCheckBox(); - void deactivateTrackingCheckBox(); + void activeTrackingCheckBox(); + void deactivateTrackingCheckBox(); - void closeEvent(QCloseEvent *event); + void closeEvent(QCloseEvent* event); - void setupUpperToolBar(); - void setupVideoToolBar(); + void setupUpperToolBar(); + void setupVideoToolBar(); - //intro wizard - void createIntroductionWizard(); + // intro wizard + void createIntroductionWizard(); - void saveDataToFile(); + void saveDataToFile(); - void checkTrackerGroupBox(); - void checkMediaGroupBox(); - void activateTracking(); + void checkTrackerGroupBox(); + void checkMediaGroupBox(); + void activateTracking(); - void deactivateTracking(); + void deactivateTracking(); - void resetTrackerViews(); + void resetTrackerViews(); Q_SIGNALS: - void selectPlugin(QString ct); + void selectPlugin(QString ct); - private Q_SLOTS: +private Q_SLOTS: - void toggleNoShowWiz(bool toggle); + void toggleNoShowWiz(bool toggle); - //menu->File - void on_actionOpen_Video_triggered(); - - void on_actionOpen_Video_batch_triggered(); + // menu->File + void on_actionOpen_Video_triggered(); - void on_actionLoad_Tracker_triggered(); + void on_actionOpen_Video_batch_triggered(); - void on_actionOpen_Picture_triggered(); + void on_actionLoad_Tracker_triggered(); - void on_actionLoad_trackingdata_triggered(); + void on_actionOpen_Picture_triggered(); - void on_actionSave_trackingdata_triggered(); + void on_actionLoad_trackingdata_triggered(); - void on_actionQuit_triggered(); + void on_actionSave_trackingdata_triggered(); - void on_actionOpen_Camera_triggered(); + void on_actionQuit_triggered(); - //menu->Edit + void on_actionOpen_Camera_triggered(); - void on_actionUndo_triggered(); + // menu->Edit - void on_actionRedo_triggered(); + void on_actionUndo_triggered(); - void on_actionShowActionList_triggered(); + void on_actionRedo_triggered(); - void on_actionSettings_triggered(); + void on_actionShowActionList_triggered(); - //menu->View - //menu->View->Toolbars - void on_actionToggle_menu_toolbar_triggered(); - void on_actionToggle_view_toolbar_triggered(); - void on_actionToggle_compact_menu_toolbar_2_triggered(); - void on_actionToggle_video_toolbar_triggered(); - void on_actionToggle_fullscreen_triggered(); + void on_actionSettings_triggered(); - //menu->Go to - void on_actionOpen_Plugins_directory_triggered(); - void on_actionOpen_Track_directory_triggered(); - void on_actionOpen_Trial_directory_triggered(); - void on_actionOpen_Screenshot_directory_triggered(); - void on_actionOpen_Videos_directory_triggered(); + // menu->View + // menu->View->Toolbars + void on_actionToggle_menu_toolbar_triggered(); + void on_actionToggle_view_toolbar_triggered(); + void on_actionToggle_compact_menu_toolbar_2_triggered(); + void on_actionToggle_video_toolbar_triggered(); + void on_actionToggle_fullscreen_triggered(); + // menu->Go to + void on_actionOpen_Plugins_directory_triggered(); + void on_actionOpen_Track_directory_triggered(); + void on_actionOpen_Trial_directory_triggered(); + void on_actionOpen_Screenshot_directory_triggered(); + void on_actionOpen_Videos_directory_triggered(); - //view toolbar actions - void on_actionAdd_Track_triggered(); - void on_actionDelete_selected_tracks_triggered(); - void on_actionSwap_ID_s_triggered(); - void on_actionSelect_all_triggered(); - void on_actionChange_the_border_color_triggered(); - void on_actionChange_the_fill_color_triggered(); - void on_actionAdd_label_Annotation_triggered(); - void on_actionAdd_rectangular_annotation_triggered(); - void on_actionAdd_arrow_annotation_triggered(); - void on_actionAdd_elliptical_annotation_triggered(); - void on_actionDelete_selected_Annotation_triggered(); + // view toolbar actions + void on_actionAdd_Track_triggered(); + void on_actionDelete_selected_tracks_triggered(); + void on_actionSwap_ID_s_triggered(); + void on_actionSelect_all_triggered(); + void on_actionChange_the_border_color_triggered(); + void on_actionChange_the_fill_color_triggered(); + void on_actionAdd_label_Annotation_triggered(); + void on_actionAdd_rectangular_annotation_triggered(); + void on_actionAdd_arrow_annotation_triggered(); + void on_actionAdd_elliptical_annotation_triggered(); + void on_actionDelete_selected_Annotation_triggered(); - //menu->Help + // menu->Help - void on_actionAbout_triggered(); + void on_actionAbout_triggered(); - void on_actionShortcuts_triggered(); + void on_actionShortcuts_triggered(); - void on_actionUser_guide_triggered(); + void on_actionUser_guide_triggered(); - void on_actionShow_introduction_triggered(); - //GUI + void on_actionShow_introduction_triggered(); + // GUI - void receiveSelectedCameraDevice(CameraConfiguration conf); + void receiveSelectedCameraDevice(CameraConfiguration conf); - void on_comboBox_TrackerSelect_currentIndexChanged(QString s); + void on_comboBox_TrackerSelect_currentIndexChanged(QString s); - void receiveSetTracking(bool toggle); + void receiveSetTracking(bool toggle); - //hider - void on_rightPanelViewControllerButton_clicked(); - void on_bottomPanelViewControllerButton_clicked(); - void on_actionBottom_panel_triggered(bool checked = false); - void on_actionRight_panel_triggered(bool checked = false); - //ui signals - void on_toolBarMenu_visibilityChanged(bool visible); - void on_toolBarTools_visibilityChanged(bool visible); - void on_toolBarVideo_visibilityChanged(bool visible); + // hider + void on_rightPanelViewControllerButton_clicked(); + void on_bottomPanelViewControllerButton_clicked(); + void on_actionBottom_panel_triggered(bool checked = false); + void on_actionRight_panel_triggered(bool checked = false); + // ui signals + void on_toolBarMenu_visibilityChanged(bool visible); + void on_toolBarTools_visibilityChanged(bool visible); + void on_toolBarVideo_visibilityChanged(bool visible); private: - Ui::MainWindow* ui; /**< ui file */ - GraphicsView *m_graphView; /**< media panel */ - QLabel *_cursorPosition; /**< cursor Position in media panel */ - int _lastRightPanelWidth; /**< lastRightPanelWidth for layouting */ - int _lastVideoWidgetWidth; /**< lastVideoWidgetWidth for layouting */ - QLabel* cursorPositionLabel; /**< cursonpositionlabel in status bar */ - - QPointer< CameraDevice > m_CameraDevice; /**< pointer on camera device */ - QPointer< SettingsWindow > m_SettingsWindow; /**< settings window */ - - IView *_currentParameterView; /**< current tracker paramter view */ - IView *_currentCoreParameterView; /**< current core parameter view */ - QGraphicsObject *_currentElementView; /**< current visualisation view of tracker */ - QGraphicsObject *_currentCoreView; /**< current visualisation view of core app */ - //QWidget* _currentTrackerP; /**< current tracker paramter view */ - QString _previouslySelectedTracker; /**< previous tracker */ - - SwitchButton* _trackerActivator; /**< tracking switch */ - QGroupBox* _mediaBox; /**< tracker groupbox in menu toolbar */ - QGroupBox* _trackerBox; /**< media groupbox in menu toolbar */ - - QWizard* m_introWiz; /**< introduction wizard-dialog */ - Config *_cfg; + Ui::MainWindow* ui; /**< ui file */ + GraphicsView* m_graphView; /**< media panel */ + QLabel* _cursorPosition; /**< cursor Position in media panel */ + int _lastRightPanelWidth; /**< lastRightPanelWidth for layouting */ + int _lastVideoWidgetWidth; /**< lastVideoWidgetWidth for layouting */ + QLabel* cursorPositionLabel; /**< cursonpositionlabel in status bar */ + + QPointer m_CameraDevice; /**< pointer on camera device */ + QPointer m_SettingsWindow; /**< settings window */ + + IView* _currentParameterView; /**< current tracker paramter view */ + IView* _currentCoreParameterView; /**< current core parameter view */ + QGraphicsObject* + _currentElementView; /**< current visualisation view of tracker */ + QGraphicsObject* + _currentCoreView; /**< current visualisation view of core app */ + // QWidget* _currentTrackerP; /**< current tracker paramter + // view + // */ + QString _previouslySelectedTracker; /**< previous tracker */ + + SwitchButton* _trackerActivator; /**< tracking switch */ + QGroupBox* _mediaBox; /**< tracker groupbox in menu toolbar */ + QGroupBox* _trackerBox; /**< media groupbox in menu toolbar */ + + QWizard* m_introWiz; /**< introduction wizard-dialog */ + Config* _cfg; }; #endif // BIOTRACKER3MAINWINDOW_H diff --git a/Src/View/NotificationLogBrowser.cpp b/Src/View/NotificationLogBrowser.cpp index 51bdb883..a17a0fb6 100644 --- a/Src/View/NotificationLogBrowser.cpp +++ b/Src/View/NotificationLogBrowser.cpp @@ -1,53 +1,56 @@ #include "NotificationLogBrowser.h" #include "QVBoxLayout" - -NotificationLogBrowser::NotificationLogBrowser(QWidget *parent, IController *controller, IModel *model) : - IViewWidget(parent, controller, model) +NotificationLogBrowser::NotificationLogBrowser(QWidget* parent, + IController* controller, + IModel* model) +: IViewWidget(parent, controller, model) { - QVBoxLayout *layout = new QVBoxLayout(this); - - browser = new QTextBrowser(this); - browser->setLineWrapMode(QTextEdit::NoWrap); + QVBoxLayout* layout = new QVBoxLayout(this); - layout->addWidget(browser); + browser = new QTextBrowser(this); + browser->setLineWrapMode(QTextEdit::NoWrap); - setLayout(layout); + layout->addWidget(browser); - m_font = QFont(); - m_font.setPointSize(8); - setFont(m_font); + setLayout(layout); - resize(200, 400); + m_font = QFont(); + m_font.setPointSize(8); + setFont(m_font); - this->show(); + resize(200, 400); + this->show(); } NotificationLogBrowser::~NotificationLogBrowser() { } -void NotificationLogBrowser::outputMessage(QtMsgType type, const QString & msg) +void NotificationLogBrowser::outputMessage(QtMsgType type, const QString& msg) { - switch (type) { - case QtDebugMsg: - browser->append(msg); - break; - - case QtWarningMsg: - browser->append(tr("- %1 ").arg(msg)); - break; - - case QtCriticalMsg: - browser->append(tr("- %1 ").arg(msg)); - break; - - case QtFatalMsg: - browser->append(tr("- %1 ").arg(msg)); - break; - } + switch (type) { + case QtDebugMsg: + browser->append(msg); + break; + + case QtWarningMsg: + browser->append( + tr("- %1 ").arg(msg)); + break; + + case QtCriticalMsg: + browser->append(tr("- %1 ").arg(msg)); + break; + + case QtFatalMsg: + browser->append( + tr("- %1 ") + .arg(msg)); + break; + } } -void NotificationLogBrowser::getNotified() { - +void NotificationLogBrowser::getNotified() +{ } diff --git a/Src/View/NotificationLogBrowser.h b/Src/View/NotificationLogBrowser.h index eaa6c1b3..a739c03f 100644 --- a/Src/View/NotificationLogBrowser.h +++ b/Src/View/NotificationLogBrowser.h @@ -6,28 +6,29 @@ #include /** -* This is the view of the notifications component. -* It displays all intercepted qdebug messages (color-coded). -* http://doc.qt.io/qt-5/qdebug.html -*/ + * This is the view of the notifications component. + * It displays all intercepted qdebug messages (color-coded). + * http://doc.qt.io/qt-5/qdebug.html + */ class NotificationLogBrowser : public IViewWidget { - Q_OBJECT + Q_OBJECT public: - explicit NotificationLogBrowser(QWidget *parent = 0, IController *controller = 0, IModel *model = 0); - ~NotificationLogBrowser(); + explicit NotificationLogBrowser(QWidget* parent = 0, + IController* controller = 0, + IModel* model = 0); + ~NotificationLogBrowser(); - void outputMessage(QtMsgType type, const QString &msg); + void outputMessage(QtMsgType type, const QString& msg); - // IViewWidget interface - public slots: - void getNotified(); + // IViewWidget interface +public slots: + void getNotified(); private: - QTextBrowser *browser; - QFont m_font; - + QTextBrowser* browser; + QFont m_font; }; -#endif //NOTIFICATIONLOGBROWSER_H \ No newline at end of file +#endif // NOTIFICATIONLOGBROWSER_H \ No newline at end of file diff --git a/Src/View/SettingsWindow.cpp b/Src/View/SettingsWindow.cpp index d76d20fc..c5146dc5 100644 --- a/Src/View/SettingsWindow.cpp +++ b/Src/View/SettingsWindow.cpp @@ -4,70 +4,72 @@ #include -SettingsWindow::SettingsWindow(QWidget *parent, Config *cfg) : - QWidget(parent), - ui(new Ui::SettingsForm) +SettingsWindow::SettingsWindow(QWidget* parent, Config* cfg) +: QWidget(parent) +, ui(new Ui::SettingsForm) { - _cfg = cfg; - ui->setupUi(this); + _cfg = cfg; + ui->setupUi(this); - for (int i=0; icomboBoxVideoCodec->addItem(codecList[i].first.c_str()); + for (int i = 0; i < codecList.size(); i++) + ui->comboBoxVideoCodec->addItem(codecList[i].first.c_str()); - int defaultIndex = _cfg->VideoCodecUsed; - ui->comboBoxVideoCodec->setCurrentIndex(defaultIndex); + int defaultIndex = _cfg->VideoCodecUsed; + ui->comboBoxVideoCodec->setCurrentIndex(defaultIndex); - bool dropFrames = _cfg->DropFrames; - ui->checkBoxDropFrames->setChecked(dropFrames); + bool dropFrames = _cfg->DropFrames; + ui->checkBoxDropFrames->setChecked(dropFrames); - bool recordScaled = _cfg->RecordScaledOutput; - ui->checkBox_scaledOutput->setChecked(recordScaled); + bool recordScaled = _cfg->RecordScaledOutput; + ui->checkBox_scaledOutput->setChecked(recordScaled); + for (int i = 0; i < exporterList.size(); i++) + ui->comboBoxDefaultExporter->addItem(exporterList[i].c_str()); - for (int i = 0; icomboBoxDefaultExporter->addItem(exporterList[i].c_str()); + int exporter = _cfg->DataExporter; + ui->comboBoxDefaultExporter->setCurrentIndex(exporter); - int exporter = _cfg->DataExporter; - ui->comboBoxDefaultExporter->setCurrentIndex(exporter); + ui->lineEdit_nthFrame->setValidator(new QIntValidator(this)); + int stride = _cfg->FrameStride; + ui->lineEdit_nthFrame->setText(std::to_string(stride).c_str()); + ui->lineEdit_qp->setValidator(new QIntValidator(this)); + int qp = _cfg->GpuQp; + ui->lineEdit_qp->setText(std::to_string(qp).c_str()); - ui->lineEdit_nthFrame->setValidator(new QIntValidator(this)); - int stride = _cfg->FrameStride; - ui->lineEdit_nthFrame->setText(std::to_string(stride).c_str()); - - ui->lineEdit_qp->setValidator(new QIntValidator(this)); - int qp = _cfg->GpuQp; - ui->lineEdit_qp->setText(std::to_string(qp).c_str()); - - ui->lineEditLocationManSave->setText(_cfg->DefaultLocationManualSave); + ui->lineEditLocationManSave->setText(_cfg->DefaultLocationManualSave); #ifndef WITH_CUDA - ui->lineEdit_qp->setVisible(false); - ui->label_qp->setVisible(false); + ui->lineEdit_qp->setVisible(false); + ui->label_qp->setVisible(false); #endif } -void SettingsWindow::on_buttonSaveClose_clicked() { - - _cfg->RecordScaledOutput = ui->checkBox_scaledOutput->isChecked(); - _cfg->DropFrames = ui->checkBoxDropFrames->isChecked(); - _cfg->VideoCodecUsed = ui->comboBoxVideoCodec->currentIndex(); - _cfg->DataExporter = ui->comboBoxDefaultExporter->currentIndex(); - _cfg->FrameStride = (ui->lineEdit_nthFrame->text()).toInt(); - _cfg->GpuQp = (ui->lineEdit_qp->text()).toInt(); - _cfg->DefaultLocationManualSave = (ui->lineEditLocationManSave->text()); - - this->close(); -} +void SettingsWindow::on_buttonSaveClose_clicked() +{ -void SettingsWindow::on_pushButtonSetNewLocManSave_clicked() { - QString dirStr = QFileDialog::getExistingDirectory(this, tr("Select Directory"), "", QFileDialog::ShowDirsOnly); - if (dirStr != "") { - ui->lineEditLocationManSave->setText(dirStr); - } -} + _cfg->RecordScaledOutput = ui->checkBox_scaledOutput->isChecked(); + _cfg->DropFrames = ui->checkBoxDropFrames->isChecked(); + _cfg->VideoCodecUsed = ui->comboBoxVideoCodec->currentIndex(); + _cfg->DataExporter = ui->comboBoxDefaultExporter->currentIndex(); + _cfg->FrameStride = (ui->lineEdit_nthFrame->text()).toInt(); + _cfg->GpuQp = (ui->lineEdit_qp->text()).toInt(); + _cfg->DefaultLocationManualSave = (ui->lineEditLocationManSave->text()); + this->close(); +} +void SettingsWindow::on_pushButtonSetNewLocManSave_clicked() +{ + QString dirStr = QFileDialog::getExistingDirectory( + this, + tr("Select Directory"), + "", + QFileDialog::ShowDirsOnly); + if (dirStr != "") { + ui->lineEditLocationManSave->setText(dirStr); + } +} SettingsWindow::~SettingsWindow() { diff --git a/Src/View/SettingsWindow.h b/Src/View/SettingsWindow.h index 430de2d0..7c333aeb 100644 --- a/Src/View/SettingsWindow.h +++ b/Src/View/SettingsWindow.h @@ -10,22 +10,24 @@ #include "ui_SettingsWindow.h" #include "Controller/IControllerCfg.h" -namespace Ui { - class SettingsWindow; +namespace Ui +{ + class SettingsWindow; } class SettingsWindow : public QWidget { - Q_OBJECT + Q_OBJECT public: - explicit SettingsWindow(QWidget *parent, Config *cfg); - ~SettingsWindow(); + explicit SettingsWindow(QWidget* parent, Config* cfg); + ~SettingsWindow(); private Q_SLOTS: - void on_buttonSaveClose_clicked(); - void on_pushButtonSetNewLocManSave_clicked(); + void on_buttonSaveClose_clicked(); + void on_pushButtonSetNewLocManSave_clicked(); + private: - Ui::SettingsForm *ui; - Config *_cfg; + Ui::SettingsForm* ui; + Config* _cfg; }; \ No newline at end of file diff --git a/Src/View/TextureObjectView.cpp b/Src/View/TextureObjectView.cpp index 2c749e25..aec69c9d 100644 --- a/Src/View/TextureObjectView.cpp +++ b/Src/View/TextureObjectView.cpp @@ -3,45 +3,52 @@ #include "QGraphicsScene" #include "View/GraphicsView.h" - -TextureObjectView::TextureObjectView(QObject *parent, IController *controller, IModel *model) : - IViewGraphicsPixmapItem(parent, controller, model) +TextureObjectView::TextureObjectView(QObject* parent, + IController* controller, + IModel* model) +: IViewGraphicsPixmapItem(parent, controller, model) { setZValue(-1); - _oldBoundingRect = QRectF(); + _oldBoundingRect = QRectF(); } void TextureObjectView::getNotified() { - TextureObject *texture = dynamic_cast(getModel()); - QPixmap pma; + TextureObject* texture = dynamic_cast(getModel()); + QPixmap pma; pma.convertFromImage(texture->get()); setPixmap(pma); - //if frame is set, set the boundingrect of the scene to the size of the frame - if (texture->height() > 1) { - QGraphicsScene *scene = this->scene(); + // if frame is set, set the boundingrect of the scene to the size of the + // frame + if (texture->height() > 1) { + QGraphicsScene* scene = this->scene(); - QRectF currentBoundingRect = this->boundingRect(); + QRectF currentBoundingRect = this->boundingRect(); - //check if bounding rect changed -> this means that a new video has been loaded, right? - if (currentBoundingRect != _oldBoundingRect) { - QRectF boundingWithMargins = currentBoundingRect.marginsAdded(QMarginsF(150, 150, 150, 150)); - scene->setSceneRect(boundingWithMargins); + // check if bounding rect changed -> this means that a new video has + // been loaded, right? + if (currentBoundingRect != _oldBoundingRect) { + QRectF boundingWithMargins = currentBoundingRect.marginsAdded( + QMarginsF(150, 150, 150, 150)); + scene->setSceneRect(boundingWithMargins); - GraphicsView* view = dynamic_cast(scene->views()[0]); - view->fitInView(boundingWithMargins, Qt::KeepAspectRatio); - - _oldBoundingRect = currentBoundingRect; - } + GraphicsView* view = dynamic_cast( + scene->views()[0]); + view->fitInView(boundingWithMargins, Qt::KeepAspectRatio); - } + _oldBoundingRect = currentBoundingRect; + } + } update(); } void TextureObjectView::connectModelView() { - QObject::connect(getModel(), &IModel::notifyView, this, &TextureObjectView::getNotified); + QObject::connect(getModel(), + &IModel::notifyView, + this, + &TextureObjectView::getNotified); getNotified(); } diff --git a/Src/View/TextureObjectView.h b/Src/View/TextureObjectView.h index 071bbb22..b4bc0f66 100644 --- a/Src/View/TextureObjectView.h +++ b/Src/View/TextureObjectView.h @@ -7,7 +7,9 @@ class TextureObjectView : public IViewGraphicsPixmapItem { Q_OBJECT public: - TextureObjectView(QObject *parent = 0, IController *controller = 0, IModel *model = 0); + TextureObjectView(QObject* parent = 0, + IController* controller = 0, + IModel* model = 0); // IGraphicsPixmapItem interface public Q_SLOTS: @@ -17,8 +19,8 @@ public Q_SLOTS: protected: void connectModelView() override; - //member - QRectF _oldBoundingRect; + // member + QRectF _oldBoundingRect; }; #endif // TEXTUREOBJECTVIEW_H diff --git a/Src/View/TrackedComponentView.cpp b/Src/View/TrackedComponentView.cpp index 9454444f..7dca627d 100644 --- a/Src/View/TrackedComponentView.cpp +++ b/Src/View/TrackedComponentView.cpp @@ -20,689 +20,827 @@ class QGraphicsSceneHoverEvent; -TrackedComponentView::TrackedComponentView(QGraphicsItem *parent, IController *controller, IModel *model) : - IViewTrackedComponent(parent, controller, model) -{ - - m_boundingRect = QRectF(0, 0, 4080, 4080); - m_currentFrameNumber = 0; - setAcceptHoverEvents(true); - setAcceptDrops(true); - _watchingDrag = 0; - - m_permissions.insert(std::pair(ENUMS::COREPERMISSIONS::COMPONENTVIEW, true)); - m_permissions.insert(std::pair(ENUMS::COREPERMISSIONS::COMPONENTADD, true)); - m_permissions.insert(std::pair(ENUMS::COREPERMISSIONS::COMPONENTMOVE, true)); - m_permissions.insert(std::pair(ENUMS::COREPERMISSIONS::COMPONENTREMOVE, true)); - m_permissions.insert(std::pair(ENUMS::COREPERMISSIONS::COMPONENTSWAP, true)); - m_permissions.insert(std::pair(ENUMS::COREPERMISSIONS::COMPONENTROTATE, true)); -} - -void TrackedComponentView::rcvDimensionUpdate(int x, int y) { - m_boundingRect = QRectF(0, 0, x, y); - update(); +TrackedComponentView::TrackedComponentView(QGraphicsItem* parent, + IController* controller, + IModel* model) +: IViewTrackedComponent(parent, controller, model) +{ + + m_boundingRect = QRectF(0, 0, 4080, 4080); + m_currentFrameNumber = 0; + setAcceptHoverEvents(true); + setAcceptDrops(true); + _watchingDrag = 0; + + m_permissions.insert(std::pair( + ENUMS::COREPERMISSIONS::COMPONENTVIEW, + true)); + m_permissions.insert(std::pair( + ENUMS::COREPERMISSIONS::COMPONENTADD, + true)); + m_permissions.insert(std::pair( + ENUMS::COREPERMISSIONS::COMPONENTMOVE, + true)); + m_permissions.insert(std::pair( + ENUMS::COREPERMISSIONS::COMPONENTREMOVE, + true)); + m_permissions.insert(std::pair( + ENUMS::COREPERMISSIONS::COMPONENTSWAP, + true)); + m_permissions.insert(std::pair( + ENUMS::COREPERMISSIONS::COMPONENTROTATE, + true)); +} + +void TrackedComponentView::rcvDimensionUpdate(int x, int y) +{ + m_boundingRect = QRectF(0, 0, x, y); + update(); } QRectF TrackedComponentView::boundingRect() const { - return m_boundingRect; + return m_boundingRect; } -void TrackedComponentView::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +void TrackedComponentView::paint(QPainter* painter, + const QStyleOptionGraphicsItem* option, + QWidget* widget) { - IModelTrackedTrajectory *all = dynamic_cast(getModel()); + IModelTrackedTrajectory* all = dynamic_cast( + getModel()); - // check if model exists - if (!all) { - return; - } + // check if model exists + if (!all) { + return; + } } void TrackedComponentView::getNotified() { - updateShapes(m_currentFrameNumber); - update(); + updateShapes(m_currentFrameNumber); + update(); } -bool TrackedComponentView::sceneEventFilter(QGraphicsItem *watched, QEvent *event) { - return true; +bool TrackedComponentView::sceneEventFilter(QGraphicsItem* watched, + QEvent* event) +{ + return true; } -bool TrackedComponentView::eventFilter(QObject *target, QEvent *event) +bool TrackedComponentView::eventFilter(QObject* target, QEvent* event) { - return false; + return false; } -void TrackedComponentView::hoverEnterEvent(QGraphicsSceneHoverEvent *event) +void TrackedComponentView::hoverEnterEvent(QGraphicsSceneHoverEvent* event) { } -void TrackedComponentView::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) +void TrackedComponentView::hoverLeaveEvent(QGraphicsSceneHoverEvent* event) { } -QVariant TrackedComponentView::itemChange(GraphicsItemChange change, const QVariant & value) +QVariant TrackedComponentView::itemChange(GraphicsItemChange change, + const QVariant& value) { - if (change == ItemSceneHasChanged && this->scene()) { - createChildShapesAtStart(); - } - return QGraphicsItem::itemChange(change, value); + if (change == ItemSceneHasChanged && this->scene()) { + createChildShapesAtStart(); + } + return QGraphicsItem::itemChange(change, value); } -void TrackedComponentView::mousePressEvent(QGraphicsSceneMouseEvent *event) { - // right clicking the view unselects all selected items so do this to avoid this behavior - if (event->button() != Qt::LeftButton) { - event->accept(); - return; - } - QGraphicsItem::mousePressEvent(event); +void TrackedComponentView::mousePressEvent(QGraphicsSceneMouseEvent* event) +{ + // right clicking the view unselects all selected items so do this to avoid + // this behavior + if (event->button() != Qt::LeftButton) { + event->accept(); + return; + } + QGraphicsItem::mousePressEvent(event); } /// opens a context menu when right clicked -void TrackedComponentView::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) -{ - - lastClickedPos = event->pos().toPoint(); - - QMenu menu; - - - // create the info box - QWidgetAction* infoBox = new QWidgetAction(this); - QString info = QString("Position (x,y) : "); - info.append(QString("(" + QString::number(lastClickedPos.x()) + ", " + QString::number(lastClickedPos.y()) + ")")); - QLabel* infoLabel = new QLabel(info); - infoLabel->setWordWrap(true); - infoLabel->setStyleSheet("QLabel {font-weight: bold; text-align: center}"); - infoLabel->setAlignment(Qt::AlignCenter); - infoBox->setDefaultWidget(infoLabel); - menu.addAction(infoBox); - menu.addSeparator(); - QAction *addComponentAction = menu.addAction("Add trajectory here", dynamic_cast(this), SLOT(addTrajectory())); - QAction *swapIdsAction = menu.addAction("Swap ID's", dynamic_cast(this), SLOT(swapIds())); - QAction *unmarkAllAction = menu.addAction("Unmark all...", dynamic_cast(this), SLOT(unmarkAll())); - QAction *removeSelectedAction = menu.addAction("Remove selected trajectories", dynamic_cast(this), SLOT(removeTrajectories())); - - - // manage permissions - addComponentAction->setEnabled(m_permissions[ENUMS::COREPERMISSIONS::COMPONENTADD]); - swapIdsAction->setEnabled(m_permissions[ENUMS::COREPERMISSIONS::COMPONENTSWAP]); - removeSelectedAction->setEnabled(m_permissions[ENUMS::COREPERMISSIONS::COMPONENTREMOVE]); - - // manage swapping - swapIdsAction->setEnabled(false); - QList allSelectedItems = this->scene()->selectedItems(); - // check if two shapes are selected - if (allSelectedItems.size() == 2 && dynamic_cast(allSelectedItems[0]) && dynamic_cast(allSelectedItems[1])) { - ComponentShape* selectedItem0 = dynamic_cast(allSelectedItems[0]); - ComponentShape* selectedItem1 = dynamic_cast(allSelectedItems[1]); - // check if both shapes are swappable (check permission for each shape) and general permission - if (selectedItem0->isSwappable() && selectedItem1->isSwappable() && m_permissions[ENUMS::COREPERMISSIONS::COMPONENTSWAP]) { - swapIdsAction->setEnabled(true); - } - } - - // execute menu - QAction *selectedAction = menu.exec(event->screenPos()); - lastClickedPos = QPoint(0, 0); -} - -/// set permissions for this and all component shapes, which were send by the plugin -void TrackedComponentView::setPermission(std::pair permission) -{ - m_permissions[permission.first] = permission.second; - qDebug() << permission.first << " set to" << permission.second; - - - //first check if permission is for view, if not pass permission to shapes -> view has all permissions, shapes only certain ones - if (permission.first == ENUMS::COREPERMISSIONS::COMPONENTVIEW) { - this->setVisible(permission.second); - return; - } - //does not need to be propagated to shapes; only handled by view - if (permission.first == ENUMS::COREPERMISSIONS::COMPONENTADD) { - return; - } - - QGraphicsItem* child; - foreach(child, this->childItems()) { - ComponentShape* shape = dynamic_cast(child); - if (shape) { - shape->setPermission(permission); - } - } +void TrackedComponentView::contextMenuEvent( + QGraphicsSceneContextMenuEvent* event) +{ + + lastClickedPos = event->pos().toPoint(); + + QMenu menu; + + // create the info box + QWidgetAction* infoBox = new QWidgetAction(this); + QString info = QString("Position (x,y) : "); + info.append(QString("(" + QString::number(lastClickedPos.x()) + ", " + + QString::number(lastClickedPos.y()) + ")")); + QLabel* infoLabel = new QLabel(info); + infoLabel->setWordWrap(true); + infoLabel->setStyleSheet("QLabel {font-weight: bold; text-align: center}"); + infoLabel->setAlignment(Qt::AlignCenter); + infoBox->setDefaultWidget(infoLabel); + menu.addAction(infoBox); + menu.addSeparator(); + QAction* addComponentAction = menu.addAction( + "Add trajectory here", + dynamic_cast(this), + SLOT(addTrajectory())); + QAction* swapIdsAction = menu.addAction( + "Swap ID's", + dynamic_cast(this), + SLOT(swapIds())); + QAction* unmarkAllAction = menu.addAction( + "Unmark all...", + dynamic_cast(this), + SLOT(unmarkAll())); + QAction* removeSelectedAction = menu.addAction( + "Remove selected trajectories", + dynamic_cast(this), + SLOT(removeTrajectories())); + + // manage permissions + addComponentAction->setEnabled( + m_permissions[ENUMS::COREPERMISSIONS::COMPONENTADD]); + swapIdsAction->setEnabled( + m_permissions[ENUMS::COREPERMISSIONS::COMPONENTSWAP]); + removeSelectedAction->setEnabled( + m_permissions[ENUMS::COREPERMISSIONS::COMPONENTREMOVE]); + + // manage swapping + swapIdsAction->setEnabled(false); + QList allSelectedItems = this->scene()->selectedItems(); + // check if two shapes are selected + if (allSelectedItems.size() == 2 && + dynamic_cast(allSelectedItems[0]) && + dynamic_cast(allSelectedItems[1])) { + ComponentShape* selectedItem0 = dynamic_cast( + allSelectedItems[0]); + ComponentShape* selectedItem1 = dynamic_cast( + allSelectedItems[1]); + // check if both shapes are swappable (check permission for each shape) + // and general permission + if (selectedItem0->isSwappable() && selectedItem1->isSwappable() && + m_permissions[ENUMS::COREPERMISSIONS::COMPONENTSWAP]) { + swapIdsAction->setEnabled(true); + } + } + + // execute menu + QAction* selectedAction = menu.exec(event->screenPos()); + lastClickedPos = QPoint(0, 0); +} + +/// set permissions for this and all component shapes, which were send by the +/// plugin +void TrackedComponentView::setPermission( + std::pair permission) +{ + m_permissions[permission.first] = permission.second; + qDebug() << permission.first << " set to" << permission.second; + + // first check if permission is for view, if not pass permission to shapes + // -> view has all permissions, shapes only certain ones + if (permission.first == ENUMS::COREPERMISSIONS::COMPONENTVIEW) { + this->setVisible(permission.second); + return; + } + // does not need to be propagated to shapes; only handled by view + if (permission.first == ENUMS::COREPERMISSIONS::COMPONENTADD) { + return; + } + + QGraphicsItem* child; + foreach (child, this->childItems()) { + ComponentShape* shape = dynamic_cast(child); + if (shape) { + shape->setPermission(permission); + } + } } /// at plugin load, draw each element of initial main trajectory -void TrackedComponentView::createChildShapesAtStart() { - - //flush all old children (e.g. from previous trackers) - foreach(QGraphicsItem* child, this->childItems()) { - child->hide(); - delete child; - } - - // check if scene is set - assert(this->scene()); - - // create a shape for each model-component upon plugin-init - IModelTrackedTrajectory *all = dynamic_cast(getModel()); - if (all) { - for (int i = 0; i < all->size(); i++) { - IModelTrackedTrajectory* trajectory = dynamic_cast(all->getChild(i)); - if (trajectory) { - //create componentshape for trajectory - ComponentShape* newShape = new ComponentShape(this, trajectory, trajectory->getId()); - connectShape(newShape); - } - - IModelTrackedPoint *rect = dynamic_cast(all->getChild(i)); - if (rect) { - int x = rect->getX(); - int y = rect->getY(); - int w = 20; - int h = 20; - - QGraphicsRectItem* rect = new QGraphicsRectItem(x - w / 2, y - h / 2, w, h, this); - rect->setPen(QPen(Qt::blue)); - rect->setBrush(QBrush(Qt::blue)); - rect->setFlag(ItemIsMovable); - rect->setFlag(ItemIsSelectable); - rect->setFlag(ItemSendsGeometryChanges); - rect->setData(0, i); - - } - - } - } - -} - -/// connect a newly created component shape to all slots it needs and set permissions -void TrackedComponentView::connectShape(ComponentShape* shape) { - CoreParameter* coreParams = dynamic_cast - (dynamic_cast(getController())->getCoreParameter()); - - //set type - IModelTrackedTrajectory* trajectory = shape->getTrajectory(); - - IModelTrackedPoint* point = dynamic_cast(trajectory->getChild(m_currentFrameNumber)); - if (point) { shape->setData(1, "point"); } - IModelTrackedEllipse* ellipse = dynamic_cast(trajectory->getChild(m_currentFrameNumber)); - if (ellipse) { shape->setData(1, "ellipse"); } - IModelTrackedRectangle* rectangle = dynamic_cast(trajectory->getChild(m_currentFrameNumber)); - if (rectangle) { shape->setData(1, "rectangle"); } - IModelTrackedPolygon* polygon = dynamic_cast(trajectory->getChild(m_currentFrameNumber)); - if (polygon) { shape->setData(1, "polygon"); } - - - //connect slots/signals - QObject::connect(shape, SIGNAL(emitRemoveTrajectory(IModelTrackedTrajectory*)), - dynamic_cast(this->getController()), - SIGNAL(emitRemoveTrajectory(IModelTrackedTrajectory*)), Qt::DirectConnection); - QObject::connect(shape, SIGNAL(emitRemoveTrackEntity(IModelTrackedTrajectory*, uint)), - dynamic_cast(this->getController()), - SIGNAL(emitRemoveTrackEntity(IModelTrackedTrajectory*, uint)), Qt::DirectConnection); - QObject::connect(shape, SIGNAL(emitMoveElement(IModelTrackedTrajectory*, QPoint, QPoint, uint, int)), - dynamic_cast(this->getController()), - SIGNAL(emitMoveElement(IModelTrackedTrajectory*, QPoint, QPoint, uint, int)), Qt::DirectConnection); - QObject::connect(shape, SIGNAL(emitToggleFixTrack(IModelTrackedTrajectory*, bool)), - dynamic_cast(this->getController()), - SIGNAL(emitToggleFixTrack(IModelTrackedTrajectory*, bool)), Qt::DirectConnection); - QObject::connect(shape, SIGNAL(emitEntityRotation(IModelTrackedTrajectory*, double, double, uint)), - dynamic_cast(this->getController()), - SIGNAL(emitEntityRotation(IModelTrackedTrajectory*, double, double, uint)), Qt::DirectConnection); - QObject::connect(shape, &ComponentShape::emitGoToFrame, - dynamic_cast(this->getController()), - &ControllerTrackedComponentCore::emitGoToFrame, Qt::DirectConnection); - - QObject::connect(shape, SIGNAL(broadcastMove()), this, SLOT(receiveBroadcastMove()), Qt::DirectConnection); - - //set the shapes members - shape->m_currentFramenumber = m_currentFrameNumber; - shape->setMembers(coreParams); - - //set permissions - shape->setPermission(std::pair - (ENUMS::COREPERMISSIONS::COMPONENTMOVE, m_permissions[ENUMS::COREPERMISSIONS::COMPONENTMOVE])); - shape->setPermission(std::pair - (ENUMS::COREPERMISSIONS::COMPONENTREMOVE, m_permissions[ENUMS::COREPERMISSIONS::COMPONENTREMOVE])); - shape->setPermission(std::pair - (ENUMS::COREPERMISSIONS::COMPONENTSWAP, m_permissions[ENUMS::COREPERMISSIONS::COMPONENTSWAP])); - shape->setPermission(std::pair - (ENUMS::COREPERMISSIONS::COMPONENTROTATE, m_permissions[ENUMS::COREPERMISSIONS::COMPONENTROTATE])); - - //update the shape - shape->updateAttributes(m_currentFrameNumber); -} - -/*********************************************************************//** -*******************************SLOTS************************************* -*************************************************************************/ +void TrackedComponentView::createChildShapesAtStart() +{ + + // flush all old children (e.g. from previous trackers) + foreach (QGraphicsItem* child, this->childItems()) { + child->hide(); + delete child; + } + + // check if scene is set + assert(this->scene()); + + // create a shape for each model-component upon plugin-init + IModelTrackedTrajectory* all = dynamic_cast( + getModel()); + if (all) { + for (int i = 0; i < all->size(); i++) { + IModelTrackedTrajectory* trajectory = + dynamic_cast(all->getChild(i)); + if (trajectory) { + // create componentshape for trajectory + ComponentShape* newShape = + new ComponentShape(this, trajectory, trajectory->getId()); + connectShape(newShape); + } + + IModelTrackedPoint* rect = dynamic_cast( + all->getChild(i)); + if (rect) { + int x = rect->getX(); + int y = rect->getY(); + int w = 20; + int h = 20; + + QGraphicsRectItem* rect = + new QGraphicsRectItem(x - w / 2, y - h / 2, w, h, this); + rect->setPen(QPen(Qt::blue)); + rect->setBrush(QBrush(Qt::blue)); + rect->setFlag(ItemIsMovable); + rect->setFlag(ItemIsSelectable); + rect->setFlag(ItemSendsGeometryChanges); + rect->setData(0, i); + } + } + } +} + +/// connect a newly created component shape to all slots it needs and set +/// permissions +void TrackedComponentView::connectShape(ComponentShape* shape) +{ + CoreParameter* coreParams = dynamic_cast( + dynamic_cast(getController()) + ->getCoreParameter()); + + // set type + IModelTrackedTrajectory* trajectory = shape->getTrajectory(); + + IModelTrackedPoint* point = dynamic_cast( + trajectory->getChild(m_currentFrameNumber)); + if (point) { + shape->setData(1, "point"); + } + IModelTrackedEllipse* ellipse = dynamic_cast( + trajectory->getChild(m_currentFrameNumber)); + if (ellipse) { + shape->setData(1, "ellipse"); + } + IModelTrackedRectangle* rectangle = dynamic_cast( + trajectory->getChild(m_currentFrameNumber)); + if (rectangle) { + shape->setData(1, "rectangle"); + } + IModelTrackedPolygon* polygon = dynamic_cast( + trajectory->getChild(m_currentFrameNumber)); + if (polygon) { + shape->setData(1, "polygon"); + } + + // connect slots/signals + QObject::connect( + shape, + SIGNAL(emitRemoveTrajectory(IModelTrackedTrajectory*)), + dynamic_cast(this->getController()), + SIGNAL(emitRemoveTrajectory(IModelTrackedTrajectory*)), + Qt::DirectConnection); + QObject::connect( + shape, + SIGNAL(emitRemoveTrackEntity(IModelTrackedTrajectory*, uint)), + dynamic_cast(this->getController()), + SIGNAL(emitRemoveTrackEntity(IModelTrackedTrajectory*, uint)), + Qt::DirectConnection); + QObject::connect( + shape, + SIGNAL(emitMoveElement(IModelTrackedTrajectory*, + QPoint, + QPoint, + uint, + int)), + dynamic_cast(this->getController()), + SIGNAL(emitMoveElement(IModelTrackedTrajectory*, + QPoint, + QPoint, + uint, + int)), + Qt::DirectConnection); + QObject::connect( + shape, + SIGNAL(emitToggleFixTrack(IModelTrackedTrajectory*, bool)), + dynamic_cast(this->getController()), + SIGNAL(emitToggleFixTrack(IModelTrackedTrajectory*, bool)), + Qt::DirectConnection); + QObject::connect( + shape, + SIGNAL(emitEntityRotation(IModelTrackedTrajectory*, + double, + double, + uint)), + dynamic_cast(this->getController()), + SIGNAL(emitEntityRotation(IModelTrackedTrajectory*, + double, + double, + uint)), + Qt::DirectConnection); + QObject::connect( + shape, + &ComponentShape::emitGoToFrame, + dynamic_cast(this->getController()), + &ControllerTrackedComponentCore::emitGoToFrame, + Qt::DirectConnection); + + QObject::connect(shape, + SIGNAL(broadcastMove()), + this, + SLOT(receiveBroadcastMove()), + Qt::DirectConnection); + + // set the shapes members + shape->m_currentFramenumber = m_currentFrameNumber; + shape->setMembers(coreParams); + + // set permissions + shape->setPermission(std::pair( + ENUMS::COREPERMISSIONS::COMPONENTMOVE, + m_permissions[ENUMS::COREPERMISSIONS::COMPONENTMOVE])); + shape->setPermission(std::pair( + ENUMS::COREPERMISSIONS::COMPONENTREMOVE, + m_permissions[ENUMS::COREPERMISSIONS::COMPONENTREMOVE])); + shape->setPermission(std::pair( + ENUMS::COREPERMISSIONS::COMPONENTSWAP, + m_permissions[ENUMS::COREPERMISSIONS::COMPONENTSWAP])); + shape->setPermission(std::pair( + ENUMS::COREPERMISSIONS::COMPONENTROTATE, + m_permissions[ENUMS::COREPERMISSIONS::COMPONENTROTATE])); + + // update the shape + shape->updateAttributes(m_currentFrameNumber); +} + +/*********************************************************************/ /** + *******************************SLOTS************************************* + *************************************************************************/ /** -* updates componentshapes, deletes all if tracking data empty and creates new if new trajectories were added -* componentshapes are children of this view (see qt's parent-child-system) -*/ -void TrackedComponentView::updateShapes(uint framenumber) { - m_currentFrameNumber = framenumber; - - IModelTrackedTrajectory *all = dynamic_cast(getModel()); - if (!all || all->size() == 0) { - //if root is nullptr, delete all children - foreach(auto child, this->childItems()) { - delete child; - } - return; - } - - //update each shape; shape hides itself if trajectory is empty or not existant or currentchild - foreach(auto child, this->childItems()) { - ComponentShape* shape = dynamic_cast(child); - if (shape) { - shape->updateAttributes(m_currentFrameNumber); - } - } - - // check for new trajectories; for each create a new shape - if (this->childItems().size() < all->size()) { - - //iterate over trajectories from back to increase performance - for (int i = all->size() - 1; i >= 0 && this->childItems().size() <= all->size(); i--) { - IModelTrackedTrajectory* trajectory = dynamic_cast(all->getChild(i)); - - //check if trajectory already has shape object - if (trajectory && !checkTrajectory(trajectory)) { - ComponentShape* newShape = new ComponentShape(this, trajectory, trajectory->getId()); - connectShape(newShape); - } - else { - //already there or nullptr - } - - //all trajectories already have shapes - if (all->size() == this->childItems().size()) { - break; - } - } - } + * updates componentshapes, deletes all if tracking data empty and creates new + * if new trajectories were added componentshapes are children of this view + * (see qt's parent-child-system) + */ +void TrackedComponentView::updateShapes(uint framenumber) +{ + m_currentFrameNumber = framenumber; + + IModelTrackedTrajectory* all = dynamic_cast( + getModel()); + if (!all || all->size() == 0) { + // if root is nullptr, delete all children + foreach (auto child, this->childItems()) { + delete child; + } + return; + } + + // update each shape; shape hides itself if trajectory is empty or not + // existant or currentchild + foreach (auto child, this->childItems()) { + ComponentShape* shape = dynamic_cast(child); + if (shape) { + shape->updateAttributes(m_currentFrameNumber); + } + } + + // check for new trajectories; for each create a new shape + if (this->childItems().size() < all->size()) { + + // iterate over trajectories from back to increase performance + for (int i = all->size() - 1; + i >= 0 && this->childItems().size() <= all->size(); + i--) { + IModelTrackedTrajectory* trajectory = + dynamic_cast(all->getChild(i)); + + // check if trajectory already has shape object + if (trajectory && !checkTrajectory(trajectory)) { + ComponentShape* newShape = + new ComponentShape(this, trajectory, trajectory->getId()); + connectShape(newShape); + } else { + // already there or nullptr + } + + // all trajectories already have shapes + if (all->size() == this->childItems().size()) { + break; + } + } + } } /** -* gets triggered when one or more shape is moved; emits move signal to tracker for all selected shapes -* if not broadcasted, only the position of actually moved componentshape is saved in tracking data -* the rest would be reset after update -*/ + * gets triggered when one or more shape is moved; emits move signal to tracker + * for all selected shapes if not broadcasted, only the position of actually + * moved componentshape is saved in tracking data the rest would be reset after + * update + */ void TrackedComponentView::receiveBroadcastMove() { - QList allSelectedItems = this->scene()->selectedItems(); - QList allSelectedEntitiesList; - - - QGraphicsItem* item; - - foreach(item, allSelectedItems) { - ComponentShape* shape = dynamic_cast(item); - if (shape) { - if (shape->isSelected()) { - allSelectedEntitiesList.append(shape); - } - } - } - - int numberSelectedEntitiesToMove = allSelectedEntitiesList.size(); - ComponentShape* entity; - foreach(entity, allSelectedEntitiesList) { - ComponentShape* shape = dynamic_cast(entity); - if (shape) { - if (shape->isSelected()) { - IModelTrackedTrajectory* shapeTrajectory = shape->getTrajectory(); - //calculate the current pos and emit it to the commands component - shape->emitMoveElement(shapeTrajectory, shape->getOldPos() + QPoint(shape->m_w / 2, shape->m_h / 2), - shape->pos().toPoint() + - QPoint(shape->m_w / 2, shape->m_h / 2), m_currentFrameNumber, numberSelectedEntitiesToMove); - numberSelectedEntitiesToMove--; - } - } - } + QList allSelectedItems = this->scene()->selectedItems(); + QList allSelectedEntitiesList; + + QGraphicsItem* item; + + foreach (item, allSelectedItems) { + ComponentShape* shape = dynamic_cast(item); + if (shape) { + if (shape->isSelected()) { + allSelectedEntitiesList.append(shape); + } + } + } + + int numberSelectedEntitiesToMove = allSelectedEntitiesList.size(); + ComponentShape* entity; + foreach (entity, allSelectedEntitiesList) { + ComponentShape* shape = dynamic_cast(entity); + if (shape) { + if (shape->isSelected()) { + IModelTrackedTrajectory* shapeTrajectory = + shape->getTrajectory(); + // calculate the current pos and emit it to the commands + // component + shape->emitMoveElement( + shapeTrajectory, + shape->getOldPos() + + QPoint(shape->m_w / 2, shape->m_h / 2), + shape->pos().toPoint() + + QPoint(shape->m_w / 2, shape->m_h / 2), + m_currentFrameNumber, + numberSelectedEntitiesToMove); + numberSelectedEntitiesToMove--; + } + } + } } void TrackedComponentView::receiveViewSwitch(bool lever) { - this->setVisible(lever); + this->setVisible(lever); - QList childrenItems = this->childItems(); - QGraphicsItem* childItem; - foreach(childItem, childrenItems) { - ComponentShape* childShape = dynamic_cast(childItem); - if (childShape) { - childShape->m_tracingLayer->setVisible(lever); - } - } + QList childrenItems = this->childItems(); + QGraphicsItem* childItem; + foreach (childItem, childrenItems) { + ComponentShape* childShape = dynamic_cast(childItem); + if (childShape) { + childShape->m_tracingLayer->setVisible(lever); + } + } } void TrackedComponentView::receiveTrackDimensionsAll(int width, int height) { - QList childrenItems = this->childItems(); - QGraphicsItem* childItem; - foreach(childItem, childrenItems) { - ComponentShape* childShape = dynamic_cast(childItem); - if (childShape) { - childShape->receiveDimensions(width, height); - } - } + QList childrenItems = this->childItems(); + QGraphicsItem* childItem; + foreach (childItem, childrenItems) { + ComponentShape* childShape = dynamic_cast(childItem); + if (childShape) { + childShape->receiveDimensions(width, height); + } + } } -void TrackedComponentView::receiveTrackDimensionsSelected(int width, int height) +void TrackedComponentView::receiveTrackDimensionsSelected(int width, + int height) { - QList childrenItems = this->childItems(); - QGraphicsItem* childItem; - foreach(childItem, childrenItems) { - ComponentShape* childShape = dynamic_cast(childItem); - if (childShape && childShape->isSelected()) { - childShape->receiveDimensions(width, height); - } - } + QList childrenItems = this->childItems(); + QGraphicsItem* childItem; + foreach (childItem, childrenItems) { + ComponentShape* childShape = dynamic_cast(childItem); + if (childShape && childShape->isSelected()) { + childShape->receiveDimensions(width, height); + } + } } void TrackedComponentView::receiveTrackOrientationLine(bool toggle) { - QList childrenItems = this->childItems(); - QGraphicsItem* childItem; - foreach(childItem, childrenItems) { - ComponentShape* childShape = dynamic_cast(childItem); - if (childShape) { - childShape->receiveToggleOrientationLine(toggle); - } - } + QList childrenItems = this->childItems(); + QGraphicsItem* childItem; + foreach (childItem, childrenItems) { + ComponentShape* childShape = dynamic_cast(childItem); + if (childShape) { + childShape->receiveToggleOrientationLine(toggle); + } + } } void TrackedComponentView::receiveTrackShowId(bool toggle) { - QList childrenItems = this->childItems(); - QGraphicsItem* childItem; - foreach(childItem, childrenItems) { - ComponentShape* childShape = dynamic_cast(childItem); - if (childShape) { - childShape->receiveShowId(toggle); - } - } + QList childrenItems = this->childItems(); + QGraphicsItem* childItem; + foreach (childItem, childrenItems) { + ComponentShape* childShape = dynamic_cast(childItem); + if (childShape) { + childShape->receiveShowId(toggle); + } + } } void TrackedComponentView::receiveTrackDimensionsSetDefault() { - QList childrenItems = this->childItems(); - QGraphicsItem* childItem; - foreach(childItem, childrenItems) { - ComponentShape* childShape = dynamic_cast(childItem); - if (childShape) { - childShape->setDimensionsToDefault(); - } - } + QList childrenItems = this->childItems(); + QGraphicsItem* childItem; + foreach (childItem, childrenItems) { + ComponentShape* childShape = dynamic_cast(childItem); + if (childShape) { + childShape->setDimensionsToDefault(); + } + } } void TrackedComponentView::receiveTracingSteps(int steps) { - QList childrenItems = this->childItems(); - QGraphicsItem* childItem; - foreach(childItem, childrenItems) { - ComponentShape* childShape = dynamic_cast(childItem); - if (childShape) { - childShape->receiveTracingSteps(steps); - } - } + QList childrenItems = this->childItems(); + QGraphicsItem* childItem; + foreach (childItem, childrenItems) { + ComponentShape* childShape = dynamic_cast(childItem); + if (childShape) { + childShape->receiveTracingSteps(steps); + } + } } void TrackedComponentView::receiveTracingStyle(QString style) { - QList childrenItems = this->childItems(); - QGraphicsItem* childItem; - foreach(childItem, childrenItems) { - ComponentShape* childShape = dynamic_cast(childItem); - if (childShape) { - childShape->receiveTracingStyle(style); - } - } + QList childrenItems = this->childItems(); + QGraphicsItem* childItem; + foreach (childItem, childrenItems) { + ComponentShape* childShape = dynamic_cast(childItem); + if (childShape) { + childShape->receiveTracingStyle(style); + } + } } void TrackedComponentView::receiveTracingHistoryLength(int history) { - QList childrenItems = this->childItems(); - QGraphicsItem* childItem; - foreach(childItem, childrenItems) { - ComponentShape* childShape = dynamic_cast(childItem); - if (childShape) { - childShape->receiveTracingLength(history); - } - } + QList childrenItems = this->childItems(); + QGraphicsItem* childItem; + foreach (childItem, childrenItems) { + ComponentShape* childShape = dynamic_cast(childItem); + if (childShape) { + childShape->receiveTracingLength(history); + } + } } void TrackedComponentView::receiveTracingTimeDegradation(QString degradation) { - QList childrenItems = this->childItems(); - QGraphicsItem* childItem; - foreach(childItem, childrenItems) { - ComponentShape* childShape = dynamic_cast(childItem); - if (childShape) { - childShape->receiveTracingTimeDegradation(degradation); - } - } + QList childrenItems = this->childItems(); + QGraphicsItem* childItem; + foreach (childItem, childrenItems) { + ComponentShape* childShape = dynamic_cast(childItem); + if (childShape) { + childShape->receiveTracingTimeDegradation(degradation); + } + } } void TrackedComponentView::receiveColorChangeBrushAll() { - QList childrenItems = this->childItems(); - QGraphicsItem* childItem; - const QColorDialog::ColorDialogOptions options = QFlag(QColorDialog::ShowAlphaChannel - || QColorDialog::DontUseNativeDialog); - QColor color = QColorDialog::getColor(Qt::white, nullptr, QString("Choose fill color"), options); - // QColorDialog* cDialog = new QColorDialog(Qt::white); - // cDialog->show(); - // cDialog->activateWindow(); - // cDialog->raise(); - // cDialog->setFocus(); - - foreach(childItem, childrenItems) { - ComponentShape* childShape = dynamic_cast(childItem); - if (childShape) { - childShape->changeBrushColor(color); - } - } + QList childrenItems = this->childItems(); + QGraphicsItem* childItem; + const QColorDialog::ColorDialogOptions options = QFlag( + QColorDialog::ShowAlphaChannel || QColorDialog::DontUseNativeDialog); + QColor color = QColorDialog::getColor(Qt::white, + nullptr, + QString("Choose fill color"), + options); + // QColorDialog* cDialog = new QColorDialog(Qt::white); + // cDialog->show(); + // cDialog->activateWindow(); + // cDialog->raise(); + // cDialog->setFocus(); + + foreach (childItem, childrenItems) { + ComponentShape* childShape = dynamic_cast(childItem); + if (childShape) { + childShape->changeBrushColor(color); + } + } } void TrackedComponentView::receiveColorChangeBorderAll() { - QList childrenItems = this->childItems(); - QGraphicsItem* childItem; - QColor color = QColorDialog::getColor(Qt::white, nullptr, - QString("Choose border color"), QColorDialog::ShowAlphaChannel); - foreach(childItem, childrenItems) { - ComponentShape* childShape = dynamic_cast(childItem); - if (childShape) { - childShape->changePenColor(color); - } - } + QList childrenItems = this->childItems(); + QGraphicsItem* childItem; + QColor color = QColorDialog::getColor(Qt::white, + nullptr, + QString("Choose border color"), + QColorDialog::ShowAlphaChannel); + foreach (childItem, childrenItems) { + ComponentShape* childShape = dynamic_cast(childItem); + if (childShape) { + childShape->changePenColor(color); + } + } } void TrackedComponentView::receiveColorChangeBorderSelected() { - QList childrenItems = this->childItems(); - QGraphicsItem* childItem; - QColor color = QColorDialog::getColor(Qt::white, nullptr, - QString("Choose border color"), QColorDialog::ShowAlphaChannel); - foreach(childItem, childrenItems) { - ComponentShape* childShape = dynamic_cast(childItem); - if (childShape && childShape->isSelected()) { - childShape->changePenColor(color); - } - } + QList childrenItems = this->childItems(); + QGraphicsItem* childItem; + QColor color = QColorDialog::getColor(Qt::white, + nullptr, + QString("Choose border color"), + QColorDialog::ShowAlphaChannel); + foreach (childItem, childrenItems) { + ComponentShape* childShape = dynamic_cast(childItem); + if (childShape && childShape->isSelected()) { + childShape->changePenColor(color); + } + } } void TrackedComponentView::receiveColorChangeBrushSelected() { - QList childrenItems = this->childItems(); - QGraphicsItem* childItem; - QColor color = QColorDialog::getColor(Qt::white, nullptr, - QString("Choose fill color"), QColorDialog::ShowAlphaChannel);; - foreach(childItem, childrenItems) { - ComponentShape* childShape = dynamic_cast(childItem); - if (childShape && childShape->isSelected()) { - childShape->changeBrushColor(color); - } - } + QList childrenItems = this->childItems(); + QGraphicsItem* childItem; + QColor color = QColorDialog::getColor(Qt::white, + nullptr, + QString("Choose fill color"), + QColorDialog::ShowAlphaChannel); + ; + foreach (childItem, childrenItems) { + ComponentShape* childShape = dynamic_cast(childItem); + if (childShape && childShape->isSelected()) { + childShape->changeBrushColor(color); + } + } } void TrackedComponentView::receiveSelectAll() { - QList childrenItems = this->childItems(); - QGraphicsItem* childItem; - foreach(childItem, childrenItems) { - if (dynamic_cast(childItem)) { - childItem->setSelected(true); - } - } + QList childrenItems = this->childItems(); + QGraphicsItem* childItem; + foreach (childItem, childrenItems) { + if (dynamic_cast(childItem)) { + childItem->setSelected(true); + } + } } ///////////////////////context menu action slots/////////////// void TrackedComponentView::addTrajectory() { - IModelTrackedTrajectory *all = dynamic_cast(getModel()); - int id = -1; - if (all) { - id = all->size() + 1; - } - - if (id <= 0) { - qWarning() << "ID cannot be smaller than or equal 0"; - } - - if (!lastClickedPos.isNull()) { - //qDebug() << "TCV: new track at position " << lastClickedPos; - emitAddTrajectory(lastClickedPos, id); - lastClickedPos = QPoint(0, 0); - } - else { - //qDebug() << "TCV: new track at center of top left quarter of video"; - QPoint topLeftQuarterCenter = QPoint(this->boundingRect().width() / 8, this->boundingRect().height() / 8); - emitAddTrajectory(topLeftQuarterCenter, id); - } + IModelTrackedTrajectory* all = dynamic_cast( + getModel()); + int id = -1; + if (all) { + id = all->size() + 1; + } + + if (id <= 0) { + qWarning() << "ID cannot be smaller than or equal 0"; + } + + if (!lastClickedPos.isNull()) { + // qDebug() << "TCV: new track at position " << lastClickedPos; + emitAddTrajectory(lastClickedPos, id); + lastClickedPos = QPoint(0, 0); + } else { + // qDebug() << "TCV: new track at center of top left quarter of video"; + QPoint topLeftQuarterCenter = QPoint(this->boundingRect().width() / 8, + this->boundingRect().height() / + 8); + emitAddTrajectory(topLeftQuarterCenter, id); + } } void TrackedComponentView::swapIds() { - QList allSelectedItems = this->scene()->selectedItems(); - if (allSelectedItems.size() != 2) { - qWarning() << "There need to be exactly two tracks selected to swap ID's!"; - return; - } - ComponentShape* shape0 = dynamic_cast(allSelectedItems[0]); - ComponentShape* shape1 = dynamic_cast(allSelectedItems[1]); - if (shape0 && shape1 && shape0->isSwappable() && shape1->isSwappable()) { - IModelTrackedTrajectory* trajectory0 = dynamic_cast(shape0->getTrajectory()); - IModelTrackedTrajectory* trajectory1 = dynamic_cast(shape1->getTrajectory()); - emitSwapIds(trajectory0, trajectory1); - } - else { - qWarning() << "Selected objects are not swappable"; - } + QList allSelectedItems = this->scene()->selectedItems(); + if (allSelectedItems.size() != 2) { + qWarning() + << "There need to be exactly two tracks selected to swap ID's!"; + return; + } + ComponentShape* shape0 = dynamic_cast( + allSelectedItems[0]); + ComponentShape* shape1 = dynamic_cast( + allSelectedItems[1]); + if (shape0 && shape1 && shape0->isSwappable() && shape1->isSwappable()) { + IModelTrackedTrajectory* trajectory0 = + dynamic_cast(shape0->getTrajectory()); + IModelTrackedTrajectory* trajectory1 = + dynamic_cast(shape1->getTrajectory()); + emitSwapIds(trajectory0, trajectory1); + } else { + qWarning() << "Selected objects are not swappable"; + } } void TrackedComponentView::removeTrajectories() { - QList allSelectedItems = this->scene()->selectedItems(); - QGraphicsItem* item; - foreach(item, allSelectedItems) { - ComponentShape* shape = dynamic_cast(item); - if (shape) { - shape->removeTrack(); - } - } + QList allSelectedItems = this->scene()->selectedItems(); + QGraphicsItem* item; + foreach (item, allSelectedItems) { + ComponentShape* shape = dynamic_cast(item); + if (shape) { + shape->removeTrack(); + } + } } -void TrackedComponentView::unmarkAll() { - QList childrenItems = this->childItems(); - QGraphicsItem* childItem; - foreach(childItem, childrenItems) { - ComponentShape* childShape = dynamic_cast(childItem); - if (childShape) { - childShape->unmarkShape(); - } - } +void TrackedComponentView::unmarkAll() +{ + QList childrenItems = this->childItems(); + QGraphicsItem* childItem; + foreach (childItem, childrenItems) { + ComponentShape* childShape = dynamic_cast(childItem); + if (childShape) { + childShape->unmarkShape(); + } + } } /////////////////////////////////////////////////////// -bool TrackedComponentView::checkTrajectory(IModelTrackedTrajectory* trajectory) { - bool isVisualized = false; +bool TrackedComponentView::checkTrajectory(IModelTrackedTrajectory* trajectory) +{ + bool isVisualized = false; - for (int i = 0; i < this->childItems().size(); i++) { - ComponentShape* shape = dynamic_cast(this->childItems()[i]); - if (shape) { - if (shape->getTrajectory() == trajectory) { - isVisualized = true; - break; - } - } - } - return isVisualized; + for (int i = 0; i < this->childItems().size(); i++) { + ComponentShape* shape = dynamic_cast( + this->childItems()[i]); + if (shape) { + if (shape->getTrajectory() == trajectory) { + isVisualized = true; + break; + } + } + } + return isVisualized; } void TrackedComponentView::receiveTracerProportions(float proportion) { - QList childrenItems = this->childItems(); - QGraphicsItem* childItem; - foreach(childItem, childrenItems) { - ComponentShape* childShape = dynamic_cast(childItem); - if (childShape) { - childShape->receiveTracerProportions(proportion); - } - } + QList childrenItems = this->childItems(); + QGraphicsItem* childItem; + foreach (childItem, childrenItems) { + ComponentShape* childShape = dynamic_cast(childItem); + if (childShape) { + childShape->receiveTracerProportions(proportion); + } + } } void TrackedComponentView::receiveTracerOrientationLine(bool toggle) { - QList childrenItems = this->childItems(); - QGraphicsItem* childItem; - foreach(childItem, childrenItems) { - ComponentShape* childShape = dynamic_cast(childItem); - if (childShape) { - childShape->receiveTracerOrientationLine(toggle); - } - } + QList childrenItems = this->childItems(); + QGraphicsItem* childItem; + foreach (childItem, childrenItems) { + ComponentShape* childShape = dynamic_cast(childItem); + if (childShape) { + childShape->receiveTracerOrientationLine(toggle); + } + } } -void TrackedComponentView::receiveTracerFrameNumber(bool toggle) { - QList childrenItems = this->childItems(); - QGraphicsItem* childItem; - foreach(childItem, childrenItems) { - ComponentShape* childShape = dynamic_cast(childItem); - if (childShape) { - childShape->receiveTracerFrameNumber(toggle); - } - } +void TrackedComponentView::receiveTracerFrameNumber(bool toggle) +{ + QList childrenItems = this->childItems(); + QGraphicsItem* childItem; + foreach (childItem, childrenItems) { + ComponentShape* childShape = dynamic_cast(childItem); + if (childShape) { + childShape->receiveTracerFrameNumber(toggle); + } + } } void TrackedComponentView::receiveToggleAntialiasingEntities(bool toggle) { - QList childrenItems = this->childItems(); - QGraphicsItem* childItem; - foreach(childItem, childrenItems) { - ComponentShape* childShape = dynamic_cast(childItem); - if (childShape) { - childShape->receiveAntialiasing(toggle); - } - } + QList childrenItems = this->childItems(); + QGraphicsItem* childItem; + foreach (childItem, childrenItems) { + ComponentShape* childShape = dynamic_cast(childItem); + if (childShape) { + childShape->receiveAntialiasing(toggle); + } + } } void TrackedComponentView::receiveIgnoreZoom(bool toggle) { - QList childrenItems = this->childItems(); - QGraphicsItem* childItem; - foreach(childItem, childrenItems) { - ComponentShape* childShape = dynamic_cast(childItem); - if (childShape) { - childShape->receiveIgnoreZoom(toggle); - } - } + QList childrenItems = this->childItems(); + QGraphicsItem* childItem; + foreach (childItem, childrenItems) { + ComponentShape* childShape = dynamic_cast(childItem); + if (childShape) { + childShape->receiveIgnoreZoom(toggle); + } + } } diff --git a/Src/View/TrackedComponentView.h b/Src/View/TrackedComponentView.h index 9790bdd9..ef859d78 100644 --- a/Src/View/TrackedComponentView.h +++ b/Src/View/TrackedComponentView.h @@ -11,179 +11,198 @@ #include "View/ComponentShape.h" /** -* This class inherits from the IViewTrackedComponent class and is therefore part of the Composite Pattern. -* This view is visualized in the media panel of the main window on top of the loaded medium. -* It creates a component shape for each trajectory. The component shape is the visualized current entity of the trajectory. -* Each time the tracking plugins singals tracking done to the core app, all component shapes are updated (updateshapes(framnumber)) -*/ + * This class inherits from the IViewTrackedComponent class and is therefore + * part of the Composite Pattern. This view is visualized in the media panel of + * the main window on top of the loaded medium. It creates a component shape + * for each trajectory. The component shape is the visualized current entity of + * the trajectory. Each time the tracking plugins singals tracking done to the + * core app, all component shapes are updated (updateshapes(framnumber)) + */ class TrackedComponentView : public IViewTrackedComponent { - Q_OBJECT + Q_OBJECT public: - TrackedComponentView(QGraphicsItem *parent = 0, IController *controller = 0, IModel *model = 0); + TrackedComponentView(QGraphicsItem* parent = 0, + IController* controller = 0, + IModel* model = 0); - // QGraphicsItem interface + // QGraphicsItem interface public: - QRectF boundingRect() const override; - void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; + QRectF boundingRect() const override; + void paint(QPainter* painter, + const QStyleOptionGraphicsItem* option, + QWidget* widget) override; - ///creates initial componentshapes - void createChildShapesAtStart(); + /// creates initial componentshapes + void createChildShapesAtStart(); - /// connect a newly created component shape to all slots it needs and set permissions - void connectShape(ComponentShape* shape); + /// connect a newly created component shape to all slots it needs and set + /// permissions + void connectShape(ComponentShape* shape); - // check if trajectory already has corresponding component shape - bool checkTrajectory(IModelTrackedTrajectory* trajectory); + // check if trajectory already has corresponding component shape + bool checkTrajectory(IModelTrackedTrajectory* trajectory); - // IView interface - void setPermission(std::pair permission); + // IView interface + void setPermission(std::pair permission); - /** - * SIGNALS - */ + /** + * SIGNALS + */ signals: - void emitUpdateCornersChanged(int id, int relX, int relY); + void emitUpdateCornersChanged(int id, int relX, int relY); - /// signal to commands component to add a new trajectory - void emitAddTrajectory(QPoint pos, int id); + /// signal to commands component to add a new trajectory + void emitAddTrajectory(QPoint pos, int id); - /// signal to commands component to swap ID's of two trajectories - void emitSwapIds(IModelTrackedTrajectory* trajectory0, IModelTrackedTrajectory* trajectory1); + /// signal to commands component to swap ID's of two trajectories + void emitSwapIds(IModelTrackedTrajectory* trajectory0, + IModelTrackedTrajectory* trajectory1); - /** - * SLOTS - */ - public slots: - // IViewTrackedComponent interface - void getNotified() override; + /** + * SLOTS + */ +public slots: + // IViewTrackedComponent interface + void getNotified() override; - /// updates dimensions on load of new medium - void rcvDimensionUpdate(int x, int y); + /// updates dimensions on load of new medium + void rcvDimensionUpdate(int x, int y); - ////////////// contextmenu actions (must be parameterless because Qt actions require it) + ////////////// contextmenu actions (must be parameterless because Qt + /// actions require it) - /// add a new trajectory --> view updates componentshapes and generates a new component shape for that trajectory - void addTrajectory(); + /// add a new trajectory --> view updates componentshapes and generates a + /// new component shape for that trajectory + void addTrajectory(); - /// swap id's of excatcly two selected trajectories --> also componetshapes - void swapIds(); + /// swap id's of excatcly two selected trajectories --> also componetshapes + void swapIds(); - /// remove all selected trajectories --> also removes componentshapes - void removeTrajectories(); + /// remove all selected trajectories --> also removes componentshapes + void removeTrajectories(); - /// unmark all component shapes (border from fat to slim) - void unmarkAll(); + /// unmark all component shapes (border from fat to slim) + void unmarkAll(); - ////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////// - /// update shapes when receiving tracking done - void updateShapes(uint framenumber); + /// update shapes when receiving tracking done + void updateShapes(uint framenumber); - /// broadcast the movment to all selected componentshapes so they are moved too - void receiveBroadcastMove(); + /// broadcast the movment to all selected componentshapes so they are moved + /// too + void receiveBroadcastMove(); - /// receive toggle to hide or show the view and all its component shapes - void receiveViewSwitch(bool lever); + /// receive toggle to hide or show the view and all its component shapes + void receiveViewSwitch(bool lever); - /// select all tracks - void receiveSelectAll(); + /// select all tracks + void receiveSelectAll(); - /* - * set dimensions of componentshapes - */ + /* + * set dimensions of componentshapes + */ - /// set dimensions for all component shapes - void receiveTrackDimensionsAll(int width, int height); + /// set dimensions for all component shapes + void receiveTrackDimensionsAll(int width, int height); - /// set dimensions for selected component shapes - void receiveTrackDimensionsSelected(int width, int height); + /// set dimensions for selected component shapes + void receiveTrackDimensionsSelected(int width, int height); - /// set dimensions for to default for all componentshapes - void receiveTrackDimensionsSetDefault(); + /// set dimensions for to default for all componentshapes + void receiveTrackDimensionsSetDefault(); - /* - * Change Color of componentshapes - */ + /* + * Change Color of componentshapes + */ - /// open color dialog and set border color for all componentshapes - void receiveColorChangeBorderAll(); + /// open color dialog and set border color for all componentshapes + void receiveColorChangeBorderAll(); - /// open color dialog and set border color for selected componentshapes - void receiveColorChangeBorderSelected(); + /// open color dialog and set border color for selected componentshapes + void receiveColorChangeBorderSelected(); - /// open color dialog and set fill color for all componentshapes - void receiveColorChangeBrushAll(); + /// open color dialog and set fill color for all componentshapes + void receiveColorChangeBrushAll(); - /// open color dialog and set fill color for all componentshapes - void receiveColorChangeBrushSelected(); + /// open color dialog and set fill color for all componentshapes + void receiveColorChangeBrushSelected(); - /* - * Tracing of componentshapes - */ + /* + * Tracing of componentshapes + */ - /// set tracing history length for all componentshapes - void receiveTracingHistoryLength(int history); + /// set tracing history length for all componentshapes + void receiveTracingHistoryLength(int history); - /// set tracing style for all componentshapes - void receiveTracingStyle(QString style); + /// set tracing style for all componentshapes + void receiveTracingStyle(QString style); - /// set tracing steps for all componentshapes - void receiveTracingSteps(int steps); + /// set tracing steps for all componentshapes + void receiveTracingSteps(int steps); - /// set tracing time degradation style for all componentshapes - void receiveTracingTimeDegradation(QString degradation); + /// set tracing time degradation style for all componentshapes + void receiveTracingTimeDegradation(QString degradation); - /// toggle show framenumber of tracers for all componentshapes - void receiveTracerFrameNumber(bool toggle); + /// toggle show framenumber of tracers for all componentshapes + void receiveTracerFrameNumber(bool toggle); - /// set tracing proportions for all componentshapes - void receiveTracerProportions(float proportion); + /// set tracing proportions for all componentshapes + void receiveTracerProportions(float proportion); - /// set tracer orientation line for all componentshapes - void receiveTracerOrientationLine(bool toggle); + /// set tracer orientation line for all componentshapes + void receiveTracerOrientationLine(bool toggle); - /* - * Misc - */ + /* + * Misc + */ - /// toggle antialiasing for all componentshapes - void receiveToggleAntialiasingEntities(bool toggle); + /// toggle antialiasing for all componentshapes + void receiveToggleAntialiasingEntities(bool toggle); - /// set ignore zoom for all componentshapes (unused) - void receiveIgnoreZoom(bool toggle); + /// set ignore zoom for all componentshapes (unused) + void receiveIgnoreZoom(bool toggle); - /// toggle orientation line for all component shapes - void receiveTrackOrientationLine(bool toggle); + /// toggle orientation line for all component shapes + void receiveTrackOrientationLine(bool toggle); - /// toggle show id for all component shapes - void receiveTrackShowId(bool toggle); + /// toggle show id for all component shapes + void receiveTrackShowId(bool toggle); public: - /// updates tracking data model when new trakcing plugin is loaded - void setNewModel(IModel *model) override { setModel(model); }; + /// updates tracking data model when new trakcing plugin is loaded + void setNewModel(IModel* model) override + { + setModel(model); + }; private: - QRectF m_boundingRect; /**< bounding rect of the view */ - - std::map> _rectification; /**< id of the component */ - QGraphicsItem *_watchingDrag = nullptr; /**< unused drag bool */ - int _dragX = 0; /**< unused drag x-coordinate */ - int _dragY = 0; /**< unused drag y-coordinate */ - std::map m_permissions; /**< list of permissions to set for new component shapes */ - QPoint lastClickedPos; /**< last clicked position in the view */ - - // QGraphicsItem interface + QRectF m_boundingRect; /**< bounding rect of the view */ + + std::map> + _rectification; /**< id of the component */ + QGraphicsItem* _watchingDrag = nullptr; /**< unused drag bool */ + int _dragX = 0; /**< unused drag x-coordinate */ + int _dragY = 0; /**< unused drag y-coordinate */ + std::map + m_permissions; /**< list of permissions to set for new component shapes + */ + QPoint lastClickedPos; /**< last clicked position in the view */ + + // QGraphicsItem interface protected: - bool sceneEventFilter(QGraphicsItem * watched, QEvent * event) override; - bool eventFilter(QObject * target, QEvent * event) override; - void hoverEnterEvent(QGraphicsSceneHoverEvent *event) override; - void hoverLeaveEvent(QGraphicsSceneHoverEvent *event) override; - QVariant itemChange(GraphicsItemChange change, const QVariant &value) override; - void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override; - void mousePressEvent(QGraphicsSceneMouseEvent *event); - - int m_currentFrameNumber = 0; /**< current visualized framenumber of the medium */ + bool sceneEventFilter(QGraphicsItem* watched, QEvent* event) override; + bool eventFilter(QObject* target, QEvent* event) override; + void hoverEnterEvent(QGraphicsSceneHoverEvent* event) override; + void hoverLeaveEvent(QGraphicsSceneHoverEvent* event) override; + QVariant itemChange(GraphicsItemChange change, + const QVariant& value) override; + void contextMenuEvent(QGraphicsSceneContextMenuEvent* event) override; + void mousePressEvent(QGraphicsSceneMouseEvent* event); + + int m_currentFrameNumber = + 0; /**< current visualized framenumber of the medium */ }; #endif // TRACKEDCOMPONENTVIEW_H diff --git a/Src/View/TrackedImageView.cpp b/Src/View/TrackedImageView.cpp index 853a2b00..a5b3b426 100644 --- a/Src/View/TrackedImageView.cpp +++ b/Src/View/TrackedImageView.cpp @@ -5,22 +5,21 @@ #include "Model/TextureObject.h" -TrackedImageView::TrackedImageView(QWidget *parent, IController *controller, IModel *model): - IViewOpenGLWidget(parent, controller, model) +TrackedImageView::TrackedImageView(QWidget* parent, + IController* controller, + IModel* model) +: IViewOpenGLWidget(parent, controller, model) { - } TrackedImageView::~TrackedImageView() { - } void TrackedImageView::paintGL() { - TextureObject *textureObject = dynamic_cast(getModel()); - QImage img = textureObject->get(); - + TextureObject* textureObject = dynamic_cast(getModel()); + QImage img = textureObject->get(); QPainter painter(this); @@ -28,25 +27,23 @@ void TrackedImageView::paintGL() painter.drawRect(QRect(0, 0, this->width(), this->height())); painter.setBrush(QColor(0, 0, 0, 0)); - QRect window; - QRect viewport; - const float viewport_skew = BioTracker::Core::ScreenHelper::calculate_viewport( - textureObject->width(), - textureObject->height(), - this->width(), - this->height(), - window, - viewport - ); + QRect window; + QRect viewport; + const float viewport_skew = + BioTracker::Core::ScreenHelper::calculate_viewport( + textureObject->width(), + textureObject->height(), + this->width(), + this->height(), + window, + viewport); painter.setWindow(window); painter.setViewport(viewport); - QRectF target(0, 0 , textureObject->width(), textureObject->height()); + QRectF target(0, 0, textureObject->width(), textureObject->height()); QRectF source(0, 0, textureObject->width(), textureObject->height()); - - painter.drawImage(target, img, source); QPainter p(this); } diff --git a/Src/View/TrackedImageView.h b/Src/View/TrackedImageView.h index 0bdfb749..da2ed712 100644 --- a/Src/View/TrackedImageView.h +++ b/Src/View/TrackedImageView.h @@ -9,7 +9,7 @@ class TrackedImageView : public IViewOpenGLWidget { public: - TrackedImageView(QWidget *parent, IController *controller, IModel *model); + TrackedImageView(QWidget* parent, IController* controller, IModel* model); ~TrackedImageView(); // QOpenGLWidget interface diff --git a/Src/View/Utility/RotationHandle.cpp b/Src/View/Utility/RotationHandle.cpp index b487bb13..d5e3ed51 100644 --- a/Src/View/Utility/RotationHandle.cpp +++ b/Src/View/Utility/RotationHandle.cpp @@ -6,14 +6,16 @@ #include "QGraphicsScene" #include "qdebug.h" -RotationHandle::RotationHandle(QPoint origin, QAbstractGraphicsShapeItem* parent) : - QAbstractGraphicsShapeItem(parent), _origin(origin) +RotationHandle::RotationHandle(QPoint origin, + QAbstractGraphicsShapeItem* parent) +: QAbstractGraphicsShapeItem(parent) +, _origin(origin) { - setFlag(ItemIsMovable); - setPen(QPen(Qt::black)); - setBrush(QBrush(Qt::red)); - //setFlag(QGraphicsItem::ItemIsSelectable); - //setFlag(ItemIgnoresTransformations); + setFlag(ItemIsMovable); + setPen(QPen(Qt::black)); + setBrush(QBrush(Qt::red)); + // setFlag(QGraphicsItem::ItemIsSelectable); + // setFlag(ItemIgnoresTransformations); } RotationHandle::~RotationHandle() @@ -22,75 +24,77 @@ RotationHandle::~RotationHandle() QRectF RotationHandle::boundingRect() const { - return QRectF(-5, -5, 10, 10); + return QRectF(-5, -5, 10, 10); } -void RotationHandle::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) +void RotationHandle::paint(QPainter* painter, + const QStyleOptionGraphicsItem* option, + QWidget* widget) { - if (m_antialiasing) { - painter->setRenderHint(QPainter::Antialiasing); - } - painter->setPen(this->pen()); - painter->setBrush(this->brush()); + if (m_antialiasing) { + painter->setRenderHint(QPainter::Antialiasing); + } + painter->setPen(this->pen()); + painter->setBrush(this->brush()); - painter->drawEllipse(QRect(-5, -5, 10, 10)); + painter->drawEllipse(QRect(-5, -5, 10, 10)); - //painter->drawRect(boundingRect()); + // painter->drawRect(boundingRect()); } -void RotationHandle::mousePressEvent(QGraphicsSceneMouseEvent * event) +void RotationHandle::mousePressEvent(QGraphicsSceneMouseEvent* event) { - if (event->button() == Qt::LeftButton) { - // handle left mouse button here - - //unselect all selected items so this can be moved - QList allSelectedItems = scene()->selectedItems(); - QGraphicsItem* item; - foreach(item, allSelectedItems) { - item->setSelected(false); - } - - - setCursor(Qt::ClosedHandCursor); - update(); - } - - //pass on - QGraphicsItem::mousePressEvent(event); + if (event->button() == Qt::LeftButton) { + // handle left mouse button here + + // unselect all selected items so this can be moved + QList allSelectedItems = scene()->selectedItems(); + QGraphicsItem* item; + foreach (item, allSelectedItems) { + item->setSelected(false); + } + + setCursor(Qt::ClosedHandCursor); + update(); + } + + // pass on + QGraphicsItem::mousePressEvent(event); } -void RotationHandle::mouseReleaseEvent(QGraphicsSceneMouseEvent * event) +void RotationHandle::mouseReleaseEvent(QGraphicsSceneMouseEvent* event) { - if (event->button() == Qt::LeftButton) { - // handle left mouse button here - setCursor(Qt::ArrowCursor); + if (event->button() == Qt::LeftButton) { + // handle left mouse button here + setCursor(Qt::ArrowCursor); - double angleRad = atan2(this->y() - _origin.y(), this->x() - _origin.x()); - double angleDeg = qRadiansToDegrees(angleRad); + double angleRad = atan2(this->y() - _origin.y(), + this->x() - _origin.x()); + double angleDeg = qRadiansToDegrees(angleRad); - Q_EMIT emitShapeRotation(angleDeg, true); + Q_EMIT emitShapeRotation(angleDeg, true); - update(); - } - //pass on - QGraphicsItem::mouseReleaseEvent(event); + update(); + } + // pass on + QGraphicsItem::mouseReleaseEvent(event); } -void RotationHandle::mouseMoveEvent(QGraphicsSceneMouseEvent * event) +void RotationHandle::mouseMoveEvent(QGraphicsSceneMouseEvent* event) { - double angleRad = atan2(this->y() - _origin.y(), this->x() - _origin.x()); - double angleDeg = qRadiansToDegrees(angleRad); + double angleRad = atan2(this->y() - _origin.y(), this->x() - _origin.x()); + double angleDeg = qRadiansToDegrees(angleRad); - Q_EMIT emitShapeRotation(angleDeg); + Q_EMIT emitShapeRotation(angleDeg); - update(); + update(); - //pass on - QGraphicsItem::mouseMoveEvent(event); + // pass on + QGraphicsItem::mouseMoveEvent(event); } void RotationHandle::setAntialiasing(bool toggle) { - m_antialiasing = toggle; - update(); + m_antialiasing = toggle; + update(); } diff --git a/Src/View/Utility/RotationHandle.h b/Src/View/Utility/RotationHandle.h index 688f5fa1..be886524 100644 --- a/Src/View/Utility/RotationHandle.h +++ b/Src/View/Utility/RotationHandle.h @@ -1,39 +1,42 @@ #pragma once #ifndef ROTATIONHANDLE_H -#define ROTATIONHANDLE_H + #define ROTATIONHANDLE_H -#include "QGraphicsObject" + #include "QGraphicsObject" /** -* This class inherits QAbstractGraphicsShapeItem. -* It is a child of an componentshape and is used to rotate it. -* (the rotation then gets forwarded to the command compontent, -* which then forwards it to the tracking plugin -* It is attached to the end of the orientation line of the component shape -*/ -class RotationHandle : public QObject, public QAbstractGraphicsShapeItem { - Q_OBJECT + * This class inherits QAbstractGraphicsShapeItem. + * It is a child of an componentshape and is used to rotate it. + * (the rotation then gets forwarded to the command compontent, + * which then forwards it to the tracking plugin + * It is attached to the end of the orientation line of the component shape + */ +class RotationHandle : public QObject, public QAbstractGraphicsShapeItem +{ + Q_OBJECT public: - RotationHandle(QPoint origin, QAbstractGraphicsShapeItem* parent = 0); - ~RotationHandle(); + RotationHandle(QPoint origin, QAbstractGraphicsShapeItem* parent = 0); + ~RotationHandle(); - QRectF boundingRect() const override; - void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; + QRectF boundingRect() const override; + void paint(QPainter* painter, + const QStyleOptionGraphicsItem* option, + QWidget* widget) override; - void mousePressEvent(QGraphicsSceneMouseEvent * event) override; - void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override; - void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; + void mousePressEvent(QGraphicsSceneMouseEvent* event) override; + void mouseReleaseEvent(QGraphicsSceneMouseEvent* event) override; + void mouseMoveEvent(QGraphicsSceneMouseEvent* event) override; - void setAntialiasing(bool toggle); + void setAntialiasing(bool toggle); signals: - void emitShapeRotation(double angle, bool rotateEntity = false); + void emitShapeRotation(double angle, bool rotateEntity = false); private: - QPoint _origin; /**< the position in the coordinate frame of the shape object */ - bool m_antialiasing; /**< if true, antialiasing is enabled */ - + QPoint _origin; /**< the position in the coordinate frame of the shape + object */ + bool m_antialiasing; /**< if true, antialiasing is enabled */ }; #endif // ROTATIONHANDLE_H \ No newline at end of file diff --git a/Src/View/Utility/SwitchButton.cpp b/Src/View/Utility/SwitchButton.cpp index c45a833a..27604992 100644 --- a/Src/View/Utility/SwitchButton.cpp +++ b/Src/View/Utility/SwitchButton.cpp @@ -2,101 +2,131 @@ #include "QPainter" #include "QMouseEvent" -void SwitchButton::setHeight(int h) { - _height = h - 2 * _margin; +void SwitchButton::setHeight(int h) +{ + _height = h - 2 * _margin; } -SwitchButton::SwitchButton(QString s0, QString s1, QWidget *parent) : QAbstractButton(parent), -_height(16), -_opacity(0.000), -_switch(false), -_margin(3), -_thumb("#d5d5d5"), -_anim(new QPropertyAnimation(this, "offset", this)), -_s0(s0), -_s1(s1) +SwitchButton::SwitchButton(QString s0, QString s1, QWidget* parent) +: QAbstractButton(parent) +, _height(16) +, _opacity(0.000) +, _switch(false) +, _margin(3) +, _thumb("#d5d5d5") +, _anim(new QPropertyAnimation(this, "offset", this)) +, _s0(s0) +, _s1(s1) { - setOffset(_height / 2); - _y = _height / 2; - setBrush(QColor("#009688")); + setOffset(_height / 2); + _y = _height / 2; + setBrush(QColor("#009688")); }; +void SwitchButton::paintEvent(QPaintEvent* e) +{ + QPainter p(this); + p.setPen(Qt::NoPen); + if (isEnabled()) { -void SwitchButton::paintEvent(QPaintEvent *e) { - QPainter p(this); - p.setPen(Qt::NoPen); - if (isEnabled()) { - - //background rect - //p.setBrush(_switch ? brush() : Qt::black); - p.setBrush(_switch ? Qt::green : Qt::red); - //p.setOpacity(_switch ? 0.5 : 0.38); - p.setOpacity(0.5); - p.setRenderHint(QPainter::Antialiasing, true); - p.drawRoundedRect(QRect(_margin, _margin, width() - 2 * _margin, height() - 2 * _margin), 8.0, 8.0); + // background rect + // p.setBrush(_switch ? brush() : Qt::black); + p.setBrush(_switch ? Qt::green : Qt::red); + // p.setOpacity(_switch ? 0.5 : 0.38); + p.setOpacity(0.5); + p.setRenderHint(QPainter::Antialiasing, true); + p.drawRoundedRect(QRect(_margin, + _margin, + width() - 2 * _margin, + height() - 2 * _margin), + 8.0, + 8.0); - //handle - p.setBrush(_thumb); - p.setOpacity(1.0); - p.drawEllipse(QRectF(offset() - (_height / 2), _y - (_height / 2), height(), height())); + // handle + p.setBrush(_thumb); + p.setOpacity(1.0); + p.drawEllipse(QRectF(offset() - (_height / 2), + _y - (_height / 2), + height(), + height())); - //text - p.setPen(Qt::black); - QFont font = p.font(); - font.setPixelSize(height() - 3 * _margin); - p.setFont(font); - QRectF textRect = QRectF(_margin, _margin, width() - 2 * _margin, height() - 2 * _margin); - p.drawText(textRect, Qt::AlignHCenter | Qt::AlignVCenter, _switch ? _s1 : _s0); - } - else { - p.setRenderHint(QPainter::Antialiasing, true); - p.setBrush(Qt::black); - p.setOpacity(0.12); - p.drawRoundedRect(QRect(_margin, _margin, width() - 2 * _margin, height() - 2 * _margin), 8.0, 8.0); - p.setOpacity(1.0); - p.setBrush(QColor("#BDBDBD")); - p.drawEllipse(QRectF(offset() - (_height / 2), _y - (_height / 2), height(), height())); + // text + p.setPen(Qt::black); + QFont font = p.font(); + font.setPixelSize(height() - 3 * _margin); + p.setFont(font); + QRectF textRect = QRectF(_margin, + _margin, + width() - 2 * _margin, + height() - 2 * _margin); + p.drawText(textRect, + Qt::AlignHCenter | Qt::AlignVCenter, + _switch ? _s1 : _s0); + } else { + p.setRenderHint(QPainter::Antialiasing, true); + p.setBrush(Qt::black); + p.setOpacity(0.12); + p.drawRoundedRect(QRect(_margin, + _margin, + width() - 2 * _margin, + height() - 2 * _margin), + 8.0, + 8.0); + p.setOpacity(1.0); + p.setBrush(QColor("#BDBDBD")); + p.drawEllipse(QRectF(offset() - (_height / 2), + _y - (_height / 2), + height(), + height())); - //text - p.setPen(Qt::black); - QFont font = p.font(); - font.setPixelSize(height() - 3 * _margin); - p.setFont(font); - QRectF textRect = QRectF(_margin, _margin, width() - 2 * _margin, height() - 2 * _margin); - p.drawText(textRect, Qt::AlignHCenter | Qt::AlignVCenter, _switch ? _s1 : _s0); - } + // text + p.setPen(Qt::black); + QFont font = p.font(); + font.setPixelSize(height() - 3 * _margin); + p.setFont(font); + QRectF textRect = QRectF(_margin, + _margin, + width() - 2 * _margin, + height() - 2 * _margin); + p.drawText(textRect, + Qt::AlignHCenter | Qt::AlignVCenter, + _switch ? _s1 : _s0); + } } -void SwitchButton::mouseReleaseEvent(QMouseEvent *e) { - if (e->button() & Qt::LeftButton) { - _switch = _switch ? false : true; - animateSwitch(); +void SwitchButton::mouseReleaseEvent(QMouseEvent* e) +{ + if (e->button() & Qt::LeftButton) { + _switch = _switch ? false : true; + animateSwitch(); - emitSetEnabled(_switch); - } - QAbstractButton::mouseReleaseEvent(e); + emitSetEnabled(_switch); + } + QAbstractButton::mouseReleaseEvent(e); } -void SwitchButton::enterEvent(QEvent *e) { - setCursor(Qt::PointingHandCursor); - QAbstractButton::enterEvent(e); +void SwitchButton::enterEvent(QEvent* e) +{ + setCursor(Qt::PointingHandCursor); + QAbstractButton::enterEvent(e); } -void SwitchButton::animateSwitch() { - if (_switch) { - _anim->setStartValue(_height / 2); - _anim->setEndValue(width() - _height); - _anim->setDuration(240); - _anim->start(); - } - else { - _anim->setStartValue(offset()); - _anim->setEndValue(_height / 2); - _anim->setDuration(240); - _anim->start(); - } +void SwitchButton::animateSwitch() +{ + if (_switch) { + _anim->setStartValue(_height / 2); + _anim->setEndValue(width() - _height); + _anim->setDuration(240); + _anim->start(); + } else { + _anim->setStartValue(offset()); + _anim->setEndValue(_height / 2); + _anim->setDuration(240); + _anim->start(); + } } -QSize SwitchButton::sizeHint() const { - return QSize(8 * (_height + _margin), _height + 2 * _margin); +QSize SwitchButton::sizeHint() const +{ + return QSize(8 * (_height + _margin), _height + 2 * _margin); } \ No newline at end of file diff --git a/Src/View/Utility/SwitchButton.h b/Src/View/Utility/SwitchButton.h index d71010db..ef4985a6 100644 --- a/Src/View/Utility/SwitchButton.h +++ b/Src/View/Utility/SwitchButton.h @@ -1,57 +1,76 @@ #pragma once #ifndef SWITCHBUTTON_H -#define SWITCHBUTTON_H + #define SWITCHBUTTON_H -#include "QAbstractButton" -#include "QPropertyAnimation" + #include "QAbstractButton" + #include "QPropertyAnimation" /** -* This class inherits QAbstractButton. -* It is an utility class to create android-like animated switches -* inspiration: https://stackoverflow.com/questions/14780517/toggle-switch-in-qt -*/ -class SwitchButton : public QAbstractButton { - Q_OBJECT - Q_PROPERTY(int offset READ offset WRITE setOffset) - Q_PROPERTY(QBrush brush READ brush WRITE setBrush) - Q_PROPERTY(bool _switch READ state WRITE setState) + * This class inherits QAbstractButton. + * It is an utility class to create android-like animated switches + * inspiration: + * https://stackoverflow.com/questions/14780517/toggle-switch-in-qt + */ +class SwitchButton : public QAbstractButton +{ + Q_OBJECT + Q_PROPERTY(int offset READ offset WRITE setOffset) + Q_PROPERTY(QBrush brush READ brush WRITE setBrush) + Q_PROPERTY(bool _switch READ state WRITE setState) public: - SwitchButton(QString s0, QString s1, QWidget* parent = 0); - //~SwitchButton(); + SwitchButton(QString s0, QString s1, QWidget* parent = 0); + //~SwitchButton(); - QSize sizeHint() const override; + QSize sizeHint() const override; - void setHeight(int h); - int offset() const { return _x; } - void setOffset(int o) { _x = o; update(); } - QBrush brush() const { return _brush; } - void setBrush(const QBrush &brsh) { _brush = brsh; } - bool state() const { return _switch; } - void setState(bool toggle) { _switch = toggle; animateSwitch(); update(); } + void setHeight(int h); + int offset() const + { + return _x; + } + void setOffset(int o) + { + _x = o; + update(); + } + QBrush brush() const + { + return _brush; + } + void setBrush(const QBrush& brsh) + { + _brush = brsh; + } + bool state() const + { + return _switch; + } + void setState(bool toggle) + { + _switch = toggle; + animateSwitch(); + update(); + } - void animateSwitch(); + void animateSwitch(); signals: - void emitSetEnabled(bool toggle); + void emitSetEnabled(bool toggle); protected: - void paintEvent(QPaintEvent* event) override; - void mouseReleaseEvent(QMouseEvent*) override; - void enterEvent(QEvent *e) override; - - - bool _switch; /**< state fo the switch */ - qreal _opacity; /**< opacity */ - int _x, _y, _height, _margin; /**< position and dimensions */ - QBrush _thumb, _track, _brush; - QPropertyAnimation *_anim = nullptr;/**< animation */ - QString _s0; /**< text in state 0 */ - QString _s1; /**< text in state 1 */ + void paintEvent(QPaintEvent* event) override; + void mouseReleaseEvent(QMouseEvent*) override; + void enterEvent(QEvent* e) override; + bool _switch; /**< state fo the switch */ + qreal _opacity; /**< opacity */ + int _x, _y, _height, _margin; /**< position and dimensions */ + QBrush _thumb, _track, _brush; + QPropertyAnimation* _anim = nullptr; /**< animation */ + QString _s0; /**< text in state 0 */ + QString _s1; /**< text in state 1 */ }; - - #endif // SWITCHBUTTON_H \ No newline at end of file diff --git a/Src/View/Utility/Tracer.cpp b/Src/View/Utility/Tracer.cpp index 160bd3d0..ce8a1512 100644 --- a/Src/View/Utility/Tracer.cpp +++ b/Src/View/Utility/Tracer.cpp @@ -6,13 +6,25 @@ #include "QMenu" #include "QGraphicsSceneContextMenuEvent" -Tracer::Tracer(QVariant type, int frame, float orientation, QPointF pos, float w, float h, QPen pen, QBrush brush, QAbstractGraphicsShapeItem* parent) - :QAbstractGraphicsShapeItem(parent), _type(type.toString()), _frame(frame), _w(w), _h(h) +Tracer::Tracer(QVariant type, + int frame, + float orientation, + QPointF pos, + float w, + float h, + QPen pen, + QBrush brush, + QAbstractGraphicsShapeItem* parent) +: QAbstractGraphicsShapeItem(parent) +, _type(type.toString()) +, _frame(frame) +, _w(w) +, _h(h) { - setPos(pos); - setPen(pen); - setBrush(brush); - setRotation(_h > _w ? -90 - orientation : -orientation); + setPos(pos); + setPen(pen); + setBrush(brush); + setRotation(_h > _w ? -90 - orientation : -orientation); } Tracer::~Tracer() @@ -21,41 +33,43 @@ Tracer::~Tracer() QRectF Tracer::boundingRect() const { - return QRect(-_w / 2, -_h / 2, _w, _h); + return QRect(-_w / 2, -_h / 2, _w, _h); } -void Tracer::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +void Tracer::paint(QPainter* painter, + const QStyleOptionGraphicsItem* option, + QWidget* widget) { - painter->setPen(pen()); - painter->setBrush(brush()); - - if (_type == "point") { - int dim = _w <= _h ? _w : _h; - painter->drawEllipse(QRect(-dim / 2, -dim / 2, dim, dim)); - } - else if (_type == "ellipse") { - - painter->drawEllipse(QRect(-_w / 2, -_h / 2, _w, _h)); - } - else if (_type == "rectangle") { - - painter->drawRect(QRect(-_w / 2, -_h / 2, _w, _h)); - } - //default for polygon shape are point tracers for simplicity - else if (_type == "polygon") { - int dim = _w <= _h ? _w : _h; - painter->drawEllipse(QRect(-dim / 2, -dim / 2, dim, dim)); - } + painter->setPen(pen()); + painter->setBrush(brush()); + + if (_type == "point") { + int dim = _w <= _h ? _w : _h; + painter->drawEllipse(QRect(-dim / 2, -dim / 2, dim, dim)); + } else if (_type == "ellipse") { + + painter->drawEllipse(QRect(-_w / 2, -_h / 2, _w, _h)); + } else if (_type == "rectangle") { + + painter->drawRect(QRect(-_w / 2, -_h / 2, _w, _h)); + } + // default for polygon shape are point tracers for simplicity + else if (_type == "polygon") { + int dim = _w <= _h ? _w : _h; + painter->drawEllipse(QRect(-dim / 2, -dim / 2, dim, dim)); + } } -void Tracer::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) +void Tracer::contextMenuEvent(QGraphicsSceneContextMenuEvent* event) { - QMenu menu; - menu.addAction("Go to frame ", dynamic_cast(this), SLOT(goToFrame())); - menu.exec(event->screenPos()); + QMenu menu; + menu.addAction("Go to frame ", + dynamic_cast(this), + SLOT(goToFrame())); + menu.exec(event->screenPos()); } void Tracer::goToFrame() { - Q_EMIT emitGoToFrame(_frame); + Q_EMIT emitGoToFrame(_frame); } diff --git a/Src/View/Utility/Tracer.h b/Src/View/Utility/Tracer.h index fc35425a..abe3c51e 100644 --- a/Src/View/Utility/Tracer.h +++ b/Src/View/Utility/Tracer.h @@ -1,49 +1,57 @@ #pragma once #ifndef TRACER_H -#define TRACER_H + #define TRACER_H -#include "QAbstractGraphicsShapeItem" + #include "QAbstractGraphicsShapeItem" /** -* This class inherits QAbstractGraphicsShapeItem. -* It is created by and an child of a componenntshape. -* It is a helper class used to visualize shape type tracers. -* It has a context menu to set medium to the tracer's frame -* Apart from the polygon it is visualized as the componentshapes -* current type. -*/ -class Tracer : public QObject, public QAbstractGraphicsShapeItem { - Q_OBJECT + * This class inherits QAbstractGraphicsShapeItem. + * It is created by and an child of a componenntshape. + * It is a helper class used to visualize shape type tracers. + * It has a context menu to set medium to the tracer's frame + * Apart from the polygon it is visualized as the componentshapes + * current type. + */ +class Tracer : public QObject, public QAbstractGraphicsShapeItem +{ + Q_OBJECT public: - Tracer(QVariant type, int frame, float orientation, QPointF pos, - float w, float h, QPen pen, QBrush brush, QAbstractGraphicsShapeItem* parent); - ~Tracer(); + Tracer(QVariant type, + int frame, + float orientation, + QPointF pos, + float w, + float h, + QPen pen, + QBrush brush, + QAbstractGraphicsShapeItem* parent); + ~Tracer(); signals: - void emitGoToFrame(int frame); + void emitGoToFrame(int frame); - public slots: +public slots: - //signals the media player rewind to the tracer's frame - void goToFrame(); + // signals the media player rewind to the tracer's frame + void goToFrame(); protected: - // Interface of QAbstractGraphicsShapeItem - QRectF boundingRect() const override; - void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; - void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override; - - - //member - QString _type; /**< type visualized */ - int _frame; /**< corresponding frame */ - float _orientation; /**< orientation of tracer --> of corresponding entity */ - QPointF pos; /**< position in coordinateframe of parent shape object */ - float _w; /**< width */ - float _h; /**< height */ + // Interface of QAbstractGraphicsShapeItem + QRectF boundingRect() const override; + void paint(QPainter* painter, + const QStyleOptionGraphicsItem* option, + QWidget* widget) override; + void contextMenuEvent(QGraphicsSceneContextMenuEvent* event) override; + + // member + QString _type; /**< type visualized */ + int _frame; /**< corresponding frame */ + float + _orientation; /**< orientation of tracer --> of corresponding entity */ + QPointF pos; /**< position in coordinateframe of parent shape object */ + float _w; /**< width */ + float _h; /**< height */ }; - - #endif // TRACER_H diff --git a/Src/View/VideoControllWidget.cpp b/Src/View/VideoControllWidget.cpp index 1bb498bd..4b0bb766 100644 --- a/Src/View/VideoControllWidget.cpp +++ b/Src/View/VideoControllWidget.cpp @@ -8,112 +8,136 @@ #include #include -VideoControllWidget::VideoControllWidget(QWidget* parent, IController* controller, IModel* model) : - IViewWidget(parent, controller, model), - ui(new Ui::VideoControllWidget) { - ui->setupUi(this); - m_RecO = false; - m_RecI = false; - m_Paus = false; - - m_iconPause.addFile(QStringLiteral("qrc:/Images/resources/pause-sign.png"), - QSize(), QIcon::Normal, QIcon::Off); - m_iconPlay.addFile(QStringLiteral("qrc:/Images/resources/arrow-forward1.png"), - QSize(), QIcon::Normal, QIcon::Off); - - ui->sld_video->setMinimum(0); - this->setSelectedView("Original"); - updateGeometry(); +VideoControllWidget::VideoControllWidget(QWidget* parent, + IController* controller, + IModel* model) +: IViewWidget(parent, controller, model) +, ui(new Ui::VideoControllWidget) +{ + ui->setupUi(this); + m_RecO = false; + m_RecI = false; + m_Paus = false; + + m_iconPause.addFile(QStringLiteral("qrc:/Images/resources/pause-sign.png"), + QSize(), + QIcon::Normal, + QIcon::Off); + m_iconPlay.addFile( + QStringLiteral("qrc:/Images/resources/arrow-forward1.png"), + QSize(), + QIcon::Normal, + QIcon::Off); + + ui->sld_video->setMinimum(0); + this->setSelectedView("Original"); + updateGeometry(); } -VideoControllWidget::~VideoControllWidget() { - delete ui; +VideoControllWidget::~VideoControllWidget() +{ + delete ui; } -void VideoControllWidget::setSelectedView(QString str) { - ControllerPlayer* controller = dynamic_cast(getController()); - controller->changeImageView(str); +void VideoControllWidget::setSelectedView(QString str) +{ + ControllerPlayer* controller = dynamic_cast( + getController()); + controller->changeImageView(str); } -void VideoControllWidget::setVideoViewComboboxModel(QStringListModel* comboboxModel) { +void VideoControllWidget::setVideoViewComboboxModel( + QStringListModel* comboboxModel) +{ } -void VideoControllWidget::getNotified() { - MediaPlayer* mediaPlayer = dynamic_cast(getModel()); - - ui->actionNext_frame->setEnabled(mediaPlayer->getForwardState()); - ui->actionPrev_frame->setEnabled(mediaPlayer->getBackwardState()); - ui->actionPlay_Pause->setEnabled(mediaPlayer->getPlayState()); - ui->actionStop->setEnabled(mediaPlayer->getStopState()); - - m_Paus = mediaPlayer->getPauseState(); - - if (m_Paus) { - ui->actionPlay_Pause->setIcon(QIcon(":/Images/resources/pause-sign.png")); - } - else { - ui->actionPlay_Pause->setIcon(QIcon(":/Images/resources/arrow-forward1.png")); - } - - m_RecI = mediaPlayer->getRecIState(); - if (m_RecI) { - ui->actionRecord_cam->setIcon(QIcon(":/Images/resources/recordingCam.png")); - } - else { - ui->actionRecord_cam->setIcon(QIcon(":/Images/resources/recordCam.png")); - } - - int currentFrameNr = static_cast(mediaPlayer->getCurrentFrameNumber()); - int totalNumberOfFrames = static_cast(mediaPlayer->getTotalNumberOfFrames()); - int mediaFps = mediaPlayer->getFpsOfSourceFile(); - //ui->frame_num_edit->setText(QString::number(currentFrameNr)); - ui->frame_num_spin->setMaximum(totalNumberOfFrames); - ui->frame_num_spin->setValue(currentFrameNr); - ui->sld_video->setValue(currentFrameNr); - - QString currentVideoTime = QDateTime::fromMSecsSinceEpoch(((float)currentFrameNr / (float)mediaFps) * 1000).toUTC().toString("hh:mm:ss:zzz"); - - - ui->time_edit->setText(currentVideoTime); - - - //Write current fps label every 1/2 second - std::chrono::system_clock::time_point now = std::chrono::system_clock::now(); - long long dt = std::chrono::duration_cast(now - lastFpsSet).count(); - int fps = mediaPlayer->getCurrentFPS(); - if (dt > 500 || fps <= 0) { - ui->lcd_currentFpsNum->display(fps); - lastFpsSet = now; - - // for average fps calculation - _fpsSum += fps; - _fpsCounter += 1; - - } - - ui->fps_label->setText(QString::number(mediaFps)); - double cfps = mediaPlayer->getCurrentFPS(); - - - if (totalNumberOfFrames >= 1) { - ui->sld_video->setEnabled(true); - ui->sld_video->setMaximum(totalNumberOfFrames - 1); - - int intervalPower = floor(log10(totalNumberOfFrames)); - int tickInterval = pow(10, intervalPower > 0 ? floor(log10(totalNumberOfFrames)) - 1 : 0); - - ui->sld_video->setTickInterval(tickInterval); - } +void VideoControllWidget::getNotified() +{ + MediaPlayer* mediaPlayer = dynamic_cast(getModel()); + + ui->actionNext_frame->setEnabled(mediaPlayer->getForwardState()); + ui->actionPrev_frame->setEnabled(mediaPlayer->getBackwardState()); + ui->actionPlay_Pause->setEnabled(mediaPlayer->getPlayState()); + ui->actionStop->setEnabled(mediaPlayer->getStopState()); + + m_Paus = mediaPlayer->getPauseState(); + + if (m_Paus) { + ui->actionPlay_Pause->setIcon( + QIcon(":/Images/resources/pause-sign.png")); + } else { + ui->actionPlay_Pause->setIcon( + QIcon(":/Images/resources/arrow-forward1.png")); + } + + m_RecI = mediaPlayer->getRecIState(); + if (m_RecI) { + ui->actionRecord_cam->setIcon( + QIcon(":/Images/resources/recordingCam.png")); + } else { + ui->actionRecord_cam->setIcon( + QIcon(":/Images/resources/recordCam.png")); + } + + int currentFrameNr = static_cast( + mediaPlayer->getCurrentFrameNumber()); + int totalNumberOfFrames = static_cast( + mediaPlayer->getTotalNumberOfFrames()); + int mediaFps = mediaPlayer->getFpsOfSourceFile(); + // ui->frame_num_edit->setText(QString::number(currentFrameNr)); + ui->frame_num_spin->setMaximum(totalNumberOfFrames); + ui->frame_num_spin->setValue(currentFrameNr); + ui->sld_video->setValue(currentFrameNr); + + QString currentVideoTime = + QDateTime::fromMSecsSinceEpoch( + ((float) currentFrameNr / (float) mediaFps) * 1000) + .toUTC() + .toString("hh:mm:ss:zzz"); + + ui->time_edit->setText(currentVideoTime); + + // Write current fps label every 1/2 second + std::chrono::system_clock::time_point now = + std::chrono::system_clock::now(); + long long dt = std::chrono::duration_cast( + now - lastFpsSet) + .count(); + int fps = mediaPlayer->getCurrentFPS(); + if (dt > 500 || fps <= 0) { + ui->lcd_currentFpsNum->display(fps); + lastFpsSet = now; + + // for average fps calculation + _fpsSum += fps; + _fpsCounter += 1; + } + + ui->fps_label->setText(QString::number(mediaFps)); + double cfps = mediaPlayer->getCurrentFPS(); + + if (totalNumberOfFrames >= 1) { + ui->sld_video->setEnabled(true); + ui->sld_video->setMaximum(totalNumberOfFrames - 1); + + int intervalPower = floor(log10(totalNumberOfFrames)); + int tickInterval = pow( + 10, + intervalPower > 0 ? floor(log10(totalNumberOfFrames)) - 1 : 0); + + ui->sld_video->setTickInterval(tickInterval); + } } - // void VideoControllWidget::on_button_nextFrame_clicked() { -// ControllerPlayer* controller = dynamic_cast(getController()); +// ControllerPlayer* controller = +// dynamic_cast(getController()); // controller->nextFrame(); // } // void VideoControllWidget::on_button_playPause_clicked() { -// ControllerPlayer* controller = dynamic_cast(getController()); +// ControllerPlayer* controller = +// dynamic_cast(getController()); // if (m_Paus) { // controller->pause(); @@ -123,26 +147,27 @@ void VideoControllWidget::getNotified() { // } // void VideoControllWidget::on_button_stop_clicked() { -// ControllerPlayer* controller = dynamic_cast(getController()); -// controller->stop(); +// ControllerPlayer* controller = +// dynamic_cast(getController()); controller->stop(); // } // void VideoControllWidget::on_button_previousFrame_clicked() { -// ControllerPlayer* controller = dynamic_cast(getController()); +// ControllerPlayer* controller = +// dynamic_cast(getController()); // controller->prevFrame(); // } -void VideoControllWidget::on_DurationChanged(int position) { - +void VideoControllWidget::on_DurationChanged(int position) +{ } -void VideoControllWidget::on_PositionChanged(int position) { - +void VideoControllWidget::on_PositionChanged(int position) +{ } - // void VideoControllWidget::on_button_record_clicked() { -// ControllerPlayer* controller = dynamic_cast(getController()); +// ControllerPlayer* controller = +// dynamic_cast(getController()); // int success = controller->recordOutput(); // if (success == 1) { @@ -160,161 +185,188 @@ void VideoControllWidget::on_PositionChanged(int position) { // } // void VideoControllWidget::on_button_record_cam_clicked() { -// ControllerPlayer* controller = dynamic_cast(getController()); +// ControllerPlayer* controller = +// dynamic_cast(getController()); // int success = controller->recordInput(); // } // void VideoControllWidget::on_button_screenshot_clicked() { -// ControllerPlayer* controller = dynamic_cast(getController()); +// ControllerPlayer* controller = +// dynamic_cast(getController()); // controller->takeScreenshot(); // } -void VideoControllWidget::on_sld_video_sliderReleased() { +void VideoControllWidget::on_sld_video_sliderReleased() +{ } void VideoControllWidget::on_sld_video_actionTriggered(int action) { - ControllerPlayer* controller = dynamic_cast(getController()); - int position = ui->sld_video->sliderPosition(); - controller->setGoToFrame(position); + ControllerPlayer* controller = dynamic_cast( + getController()); + int position = ui->sld_video->sliderPosition(); + controller->setGoToFrame(position); } - /** - * If the video slider is moved, this function sets the value to the current frame number lable + * If the video slider is moved, this function sets the value to the current + * frame number lable */ -void VideoControllWidget::on_sld_video_sliderMoved(int position) { - //ui->frame_num_edit->setText(QString::number(position)); - ui->frame_num_spin->setValue(position); - MediaPlayer* mediaPlayer = dynamic_cast(getModel()); - int mediaFps = mediaPlayer->getFpsOfSourceFile(); - QString currentVideoTime = QDateTime::fromMSecsSinceEpoch(((float)position / (float)mediaFps) * 1000).toUTC().toString("hh:mm:ss:zzz"); - ui->time_edit->setText(currentVideoTime); +void VideoControllWidget::on_sld_video_sliderMoved(int position) +{ + // ui->frame_num_edit->setText(QString::number(position)); + ui->frame_num_spin->setValue(position); + MediaPlayer* mediaPlayer = dynamic_cast(getModel()); + int mediaFps = mediaPlayer->getFpsOfSourceFile(); + QString currentVideoTime = QDateTime::fromMSecsSinceEpoch( + ((float) position / (float) mediaFps) * + 1000) + .toUTC() + .toString("hh:mm:ss:zzz"); + ui->time_edit->setText(currentVideoTime); } -void VideoControllWidget::on_doubleSpinBoxTargetFps_editingFinished() { - double val = ui->doubleSpinBoxTargetFps->value(); - ControllerPlayer* controller = dynamic_cast(getController()); - controller->setTargetFps(val); +void VideoControllWidget::on_doubleSpinBoxTargetFps_editingFinished() +{ + double val = ui->doubleSpinBoxTargetFps->value(); + ControllerPlayer* controller = dynamic_cast( + getController()); + controller->setTargetFps(val); } -void VideoControllWidget::on_frame_num_spin_editingFinished() { - int val = ui->frame_num_spin->value(); - ControllerPlayer* controller = dynamic_cast(getController()); - controller->setGoToFrame(val); +void VideoControllWidget::on_frame_num_spin_editingFinished() +{ + int val = ui->frame_num_spin->value(); + ControllerPlayer* controller = dynamic_cast( + getController()); + controller->setGoToFrame(val); } - -//actions -void VideoControllWidget::on_actionPlay_Pause_triggered(bool checked) { - ControllerPlayer* controller = dynamic_cast(getController()); - - if (m_Paus) { - controller->pause(); - //qDebug() << "The average fps of this run was: " << _fpsSum / _fpsCounter; - } - else { - controller->play(); - _fpsSum = 0; - _fpsCounter = 0; - } +// actions +void VideoControllWidget::on_actionPlay_Pause_triggered(bool checked) +{ + ControllerPlayer* controller = dynamic_cast( + getController()); + + if (m_Paus) { + controller->pause(); + // qDebug() << "The average fps of this run was: " << _fpsSum / + // _fpsCounter; + } else { + controller->play(); + _fpsSum = 0; + _fpsCounter = 0; + } } -void VideoControllWidget::on_actionStop_triggered(bool checked) { - ControllerPlayer* controller = dynamic_cast(getController()); - controller->stop(); +void VideoControllWidget::on_actionStop_triggered(bool checked) +{ + ControllerPlayer* controller = dynamic_cast( + getController()); + controller->stop(); } -void VideoControllWidget::on_actionNext_frame_triggered(bool checked) { - ControllerPlayer* controller = dynamic_cast(getController()); - controller->nextFrame(); +void VideoControllWidget::on_actionNext_frame_triggered(bool checked) +{ + ControllerPlayer* controller = dynamic_cast( + getController()); + controller->nextFrame(); } -void VideoControllWidget::on_actionPrev_frame_triggered(bool checked) { - ControllerPlayer* controller = dynamic_cast(getController()); - controller->prevFrame(); +void VideoControllWidget::on_actionPrev_frame_triggered(bool checked) +{ + ControllerPlayer* controller = dynamic_cast( + getController()); + controller->prevFrame(); } -void VideoControllWidget::on_actionScreenshot_triggered(bool checked) { - ControllerPlayer* controller = dynamic_cast(getController()); - QString filePathStr = controller->takeScreenshot(); - QFileInfo fi(filePathStr); - QString filePathAbs = fi.absoluteFilePath(); - QString msgText = "The Screenshot has been saved to:\n " + filePathAbs; - - //QMessageBox::information(nullptr, "Screenshot taken!", msgText); - - QMessageBox msgBox; - msgBox.setText("You took a screenshot!"); - msgBox.setInformativeText(msgText); - msgBox.setStandardButtons(QMessageBox::Ok); - msgBox.setDefaultButton(QMessageBox::Ok); - QPushButton *goToFileDirButton = msgBox.addButton(tr("Show in folder"), QMessageBox::ActionRole); - QPushButton *openFileButton = msgBox.addButton(tr("Open screenshot"), QMessageBox::ActionRole); - - msgBox.setIcon(QMessageBox::Information); - msgBox.exec(); - - if (msgBox.clickedButton() == goToFileDirButton) { - QUrl fileDirUrl = QUrl::fromLocalFile(fi.absolutePath()); - QDesktopServices::openUrl(fileDirUrl); - } - else if (msgBox.clickedButton() == openFileButton) { - QUrl fileUrl = QUrl::fromLocalFile(filePathAbs); - QDesktopServices::openUrl(fileUrl); - } +void VideoControllWidget::on_actionScreenshot_triggered(bool checked) +{ + ControllerPlayer* controller = dynamic_cast( + getController()); + QString filePathStr = controller->takeScreenshot(); + QFileInfo fi(filePathStr); + QString filePathAbs = fi.absoluteFilePath(); + QString msgText = "The Screenshot has been saved to:\n " + filePathAbs; + + // QMessageBox::information(nullptr, "Screenshot taken!", msgText); + + QMessageBox msgBox; + msgBox.setText("You took a screenshot!"); + msgBox.setInformativeText(msgText); + msgBox.setStandardButtons(QMessageBox::Ok); + msgBox.setDefaultButton(QMessageBox::Ok); + QPushButton* goToFileDirButton = msgBox.addButton(tr("Show in folder"), + QMessageBox::ActionRole); + QPushButton* openFileButton = msgBox.addButton(tr("Open screenshot"), + QMessageBox::ActionRole); + + msgBox.setIcon(QMessageBox::Information); + msgBox.exec(); + + if (msgBox.clickedButton() == goToFileDirButton) { + QUrl fileDirUrl = QUrl::fromLocalFile(fi.absolutePath()); + QDesktopServices::openUrl(fileDirUrl); + } else if (msgBox.clickedButton() == openFileButton) { + QUrl fileUrl = QUrl::fromLocalFile(filePathAbs); + QDesktopServices::openUrl(fileUrl); + } } -void VideoControllWidget::on_actionRecord_cam_triggered(bool checked) { - ControllerPlayer* controller = dynamic_cast(getController()); +void VideoControllWidget::on_actionRecord_cam_triggered(bool checked) +{ + ControllerPlayer* controller = dynamic_cast( + getController()); - int success = controller->recordInput(); + int success = controller->recordInput(); } -void VideoControllWidget::on_actionRecord_all_triggered(bool checked) { - ControllerPlayer* controller = dynamic_cast(getController()); - - int success = controller->recordOutput(); - if (success == 1) { - QPixmap pix(":/Images/resources/recording.png"); - QIcon icon(pix); - ui->actionRecord_all->setIcon(icon); - //ui->actionRecord_all->setIconSize(QSize(32,32)); - } - else { - QPixmap pix(":/Images/resources/record.png"); - QIcon icon(pix); - ui->actionRecord_all->setIcon(icon); - //ui->actionRecord_all->setIconSize(QSize(32, 32)); - } +void VideoControllWidget::on_actionRecord_all_triggered(bool checked) +{ + ControllerPlayer* controller = dynamic_cast( + getController()); + + int success = controller->recordOutput(); + if (success == 1) { + QPixmap pix(":/Images/resources/recording.png"); + QIcon icon(pix); + ui->actionRecord_all->setIcon(icon); + // ui->actionRecord_all->setIconSize(QSize(32,32)); + } else { + QPixmap pix(":/Images/resources/record.png"); + QIcon icon(pix); + ui->actionRecord_all->setIcon(icon); + // ui->actionRecord_all->setIconSize(QSize(32, 32)); + } } MainWindow* VideoControllWidget::getMainWindow() { - foreach(QWidget *widget, qApp->topLevelWidgets()) - if (MainWindow *mainWindow = dynamic_cast(widget)) - return mainWindow; - return NULL; + foreach (QWidget* widget, qApp->topLevelWidgets()) + if (MainWindow* mainWindow = dynamic_cast(widget)) + return mainWindow; + return NULL; } -void VideoControllWidget::setupVideoToolbar() { - MainWindow* mw = getMainWindow(); - - if (mw) { - QToolBar* videoToolBar = mw->findChild("toolBarVideo"); - if (videoToolBar) { - - videoToolBar->addAction(ui->actionPrev_frame); - videoToolBar->addSeparator(); - videoToolBar->addAction(ui->actionPlay_Pause); - videoToolBar->addSeparator(); - videoToolBar->addAction(ui->actionStop); - videoToolBar->addSeparator(); - videoToolBar->addAction(ui->actionNext_frame); - videoToolBar->addSeparator(); - videoToolBar->addAction(ui->actionScreenshot); - videoToolBar->addSeparator(); - videoToolBar->addAction(ui->actionRecord_cam); - videoToolBar->addSeparator(); - videoToolBar->addAction(ui->actionRecord_all); - videoToolBar->addSeparator(); - - videoToolBar->addWidget(ui->scrollAreaVideoInfo); - } - } +void VideoControllWidget::setupVideoToolbar() +{ + MainWindow* mw = getMainWindow(); + + if (mw) { + QToolBar* videoToolBar = mw->findChild("toolBarVideo"); + if (videoToolBar) { + + videoToolBar->addAction(ui->actionPrev_frame); + videoToolBar->addSeparator(); + videoToolBar->addAction(ui->actionPlay_Pause); + videoToolBar->addSeparator(); + videoToolBar->addAction(ui->actionStop); + videoToolBar->addSeparator(); + videoToolBar->addAction(ui->actionNext_frame); + videoToolBar->addSeparator(); + videoToolBar->addAction(ui->actionScreenshot); + videoToolBar->addSeparator(); + videoToolBar->addAction(ui->actionRecord_cam); + videoToolBar->addSeparator(); + videoToolBar->addAction(ui->actionRecord_all); + videoToolBar->addSeparator(); + + videoToolBar->addWidget(ui->scrollAreaVideoInfo); + } + } } diff --git a/Src/View/VideoControllWidget.h b/Src/View/VideoControllWidget.h index f057b211..c3bbec43 100644 --- a/Src/View/VideoControllWidget.h +++ b/Src/View/VideoControllWidget.h @@ -10,16 +10,19 @@ #include "View/MainWindow.h" #include - -namespace Ui { -class VideoControllWidget; +namespace Ui +{ + class VideoControllWidget; } -class VideoControllWidget : public IViewWidget { +class VideoControllWidget : public IViewWidget +{ Q_OBJECT - public: - explicit VideoControllWidget(QWidget* parent = 0, IController* controller = 0, IModel* model = 0); +public: + explicit VideoControllWidget(QWidget* parent = 0, + IController* controller = 0, + IModel* model = 0); ~VideoControllWidget(); void setSelectedView(QString str); @@ -32,37 +35,35 @@ class VideoControllWidget : public IViewWidget { void setVideoControllsStates(QVector states); MainWindow* getMainWindow(); - void setupVideoToolbar(); - + void setupVideoToolbar(); - public Q_SLOTS: +public Q_SLOTS: void getNotified(); - private Q_SLOTS: +private Q_SLOTS: void on_DurationChanged(int position); void on_PositionChanged(int position); - // void on_button_nextFrame_clicked(); - // void on_button_playPause_clicked(); - // void on_button_record_clicked(); - // void on_button_record_cam_clicked(); + // void on_button_nextFrame_clicked(); + // void on_button_playPause_clicked(); + // void on_button_record_clicked(); + // void on_button_record_cam_clicked(); - // void on_button_stop_clicked(); + // void on_button_stop_clicked(); - // void on_button_screenshot_clicked(); + // void on_button_screenshot_clicked(); - // void on_button_previousFrame_clicked(); + // void on_button_previousFrame_clicked(); void on_sld_video_sliderReleased(); void on_sld_video_sliderMoved(int position); - void on_sld_video_actionTriggered(int action); + void on_sld_video_actionTriggered(int action); void on_doubleSpinBoxTargetFps_editingFinished(); void on_frame_num_spin_editingFinished(); - void on_actionPlay_Pause_triggered(bool checked = false); void on_actionStop_triggered(bool checked = false); void on_actionNext_frame_triggered(bool checked = false); @@ -71,7 +72,7 @@ class VideoControllWidget : public IViewWidget { void on_actionRecord_cam_triggered(bool checked = false); void on_actionRecord_all_triggered(bool checked = false); - private: +private: Ui::VideoControllWidget* ui; QIcon m_iconPause; @@ -79,21 +80,21 @@ class VideoControllWidget : public IViewWidget { size_t m_TotalNumbFrames; - bool m_Paus; - bool m_RecI; - bool m_RecO; + bool m_Paus; + bool m_RecI; + bool m_RecO; - QAction* action_play_pause; - QAction* action_stop; - QAction* action_next_frame; - QAction* action_prev_frame; - QAction* action_rec_cam; - QAction* action_rec; + QAction* action_play_pause; + QAction* action_stop; + QAction* action_next_frame; + QAction* action_prev_frame; + QAction* action_rec_cam; + QAction* action_rec; - std::chrono::system_clock::time_point lastFpsSet; + std::chrono::system_clock::time_point lastFpsSet; - uint _fpsSum = 0; - int _fpsCounter = 0; + uint _fpsSum = 0; + int _fpsCounter = 0; }; #endif // BIOTRACKER3VIDEOCONTROLLWIDGET_H diff --git a/Src/main.cpp b/Src/main.cpp index cacb25c6..1f702acd 100644 --- a/Src/main.cpp +++ b/Src/main.cpp @@ -6,7 +6,7 @@ #include #include #include -#include +#include #include "Model/MediaPlayerStateMachine/PlayerParameters.h" #include "util/types.h" #include "util/camera/base.h" @@ -19,85 +19,98 @@ #include #if HAS_PYLON - #include + #include #endif -//This will hide the console. -//See https://stackoverflow.com/questions/2139637/hide-console-of-windows-application +// This will hide the console. +// See +// https://stackoverflow.com/questions/2139637/hide-console-of-windows-application #ifdef _WIN32 //#pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup") #endif // Get the default Qt message handler. -static const QtMessageHandler QT_DEFAULT_MESSAGE_HANDLER = qInstallMessageHandler(0); +static const QtMessageHandler QT_DEFAULT_MESSAGE_HANDLER = + qInstallMessageHandler(0); -void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg) +void myMessageOutput(QtMsgType type, + const QMessageLogContext& context, + const QString& msg) { if (type == QtMsgType::QtInfoMsg) return; - QString fmsg = qFormatLogMessage(type, context, msg); - QString outf = IConfig::dataLocation+"/log.txt"; - std::string debugs = outf.toStdString(); - QFile outFile(outf); + QString fmsg = qFormatLogMessage(type, context, msg); + QString outf = IConfig::dataLocation + "/log.txt"; + std::string debugs = outf.toStdString(); + QFile outFile(outf); outFile.open(QIODevice::WriteOnly | QIODevice::Append); - QTextStream ts(&outFile); + QTextStream ts(&outFile); ts << fmsg << endl; (*QT_DEFAULT_MESSAGE_HANDLER)(type, context, msg); } -int main(int argc, char* argv[]) { +int main(int argc, char* argv[]) +{ QApplication app(argc, argv); - + app.setOrganizationName("FU Berlin"); app.setApplicationName("BioTracker"); - IConfig::configLocation = QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation); - IConfig::dataLocation = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); - Config *cfg = new Config(); - CLI::optionParser(argc, argv, cfg); - QString cfgLoc = cfg->CfgCustomLocation.isEmpty()?Config::configLocation:cfg->CfgCustomLocation; + IConfig::configLocation = QStandardPaths::writableLocation( + QStandardPaths::AppConfigLocation); + IConfig::dataLocation = QStandardPaths::writableLocation( + QStandardPaths::AppDataLocation); + Config* cfg = new Config(); + CLI::optionParser(argc, argv, cfg); + QString cfgLoc = cfg->CfgCustomLocation.isEmpty() ? Config::configLocation + : cfg->CfgCustomLocation; cfg->load(cfgLoc, "config.ini"); cfg->save(cfgLoc, "config.ini"); #if HAS_PYLON - const auto cache = boost::filesystem::path{QStandardPaths::writableLocation(QStandardPaths::CacheLocation).toStdString()}; + const auto cache = boost::filesystem::path{ + QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + .toStdString()}; const auto genicamCache = cache / "genicam_xml_cache"; boost::filesystem::create_directories(genicamCache); GenICam::SetGenICamCacheFolder(GenICam::gcstring{genicamCache.c_str()}); - qputenv(GENICAM_CACHE_VERSION, QByteArray::fromStdString(genicamCache.string())); + qputenv(GENICAM_CACHE_VERSION, + QByteArray::fromStdString(genicamCache.string())); #endif qRegisterMetaType("cv::Mat"); qRegisterMetaType>("std::shared_ptr"); qRegisterMetaType("std::size_t"); qRegisterMetaType("size_t"); - qRegisterMetaType>("std::vector"); + qRegisterMetaType>( + "std::vector"); qRegisterMetaType("BiotrackerTypes::AreaType"); qRegisterMetaType>("QVector"); qRegisterMetaType>( "std::shared_ptr"); qRegisterMetaType("CameraConfiguration"); - qRegisterMetaTypeStreamOperators>("QList"); - + qRegisterMetaTypeStreamOperators>( + "QList"); + qInstallMessageHandler(myMessageOutput); QDir qd; - qd.mkpath(IConfig::configLocation); - qd.mkpath(IConfig::dataLocation); - qd.mkpath(cfg->DirPlugins); - qd.mkpath(cfg->DirVideos); + qd.mkpath(IConfig::configLocation); + qd.mkpath(IConfig::dataLocation); + qd.mkpath(cfg->DirPlugins); + qd.mkpath(cfg->DirVideos); qd.mkpath(cfg->DirTracks); - qd.mkpath(cfg->DirTrials); + qd.mkpath(cfg->DirTrials); qd.mkpath(cfg->DirScreenshots); qd.mkpath(cfg->DirTemp); BioTracker3App bioTracker3(&app); - GuiContext context(&bioTracker3, cfg); + GuiContext context(&bioTracker3, cfg); bioTracker3.setBioTrackerContext(&context); - bioTracker3.runBioTracker(); + bioTracker3.runBioTracker(); app.exec(); } diff --git a/Src/util/CLIcommands.h b/Src/util/CLIcommands.h index 5444ad0c..7943094e 100644 --- a/Src/util/CLIcommands.h +++ b/Src/util/CLIcommands.h @@ -1,7 +1,5 @@ #pragma once - - #include #include #include @@ -17,65 +15,73 @@ #include "util/types.h" #include "util/Config.h" -class CLI { +class CLI +{ public: - static void optionParser(int ac, char* av[], Config* cfg) - { - //Taken from http://www.boost.org/doc/libs/1_64_0/libs/program_options/example/option_groups.cpp - using namespace boost; - using namespace boost::program_options; - try { - // Declare three groups of options. - options_description general("General options"); - general.add_options() - ("help", "Produce this help message") - ("usePlugin", value(), "Uses plugin from given filepath") - ("video", value(), "Loads a video from given filepath") - ("cfg", value(), "Provide custom path to a config file") - ; - - options_description gui("GUI options"); - //gui.add_options() - // ("display", value(), "display to use") - // ; + static void optionParser(int ac, char* av[], Config* cfg) + { + // Taken from + // http://www.boost.org/doc/libs/1_64_0/libs/program_options/example/option_groups.cpp + using namespace boost; + using namespace boost::program_options; + try { + // Declare three groups of options. + options_description general("General options"); + general.add_options()("help", "Produce this help message")( + "usePlugin", + value(), + "Uses plugin from given filepath")( + "video", + value(), + "Loads a video from given filepath")( + "cfg", + value(), + "Provide custom path to a config file"); - // For "Open with ..." - positional_options_description unnamed; - unnamed.add("video", 1); + options_description gui("GUI options"); + // gui.add_options() + // ("display", value(), "display to use") + // ; - // Declare an options description instance which will include - // all the options - options_description all("Allowed options"); - all.add(general).add(gui); + // For "Open with ..." + positional_options_description unnamed; + unnamed.add("video", 1); - // Declare an options description instance which will be shown - // to the user - options_description visible("Allowed options"); - visible.add(general).add(gui); + // Declare an options description instance which will include + // all the options + options_description all("Allowed options"); + all.add(general).add(gui); + // Declare an options description instance which will be shown + // to the user + options_description visible("Allowed options"); + visible.add(general).add(gui); - variables_map vm; - store(command_line_parser(ac, av).options(all).positional(unnamed).run(), vm); + variables_map vm; + store(command_line_parser(ac, av) + .options(all) + .positional(unnamed) + .run(), + vm); - if (vm.count("help")) { - std::cout << visible; - exit(0); - } - if (vm.count("usePlugin")) { - auto str = vm["usePlugin"].as(); - cfg->UsePlugins = QString(str.c_str()); - } - if (vm.count("video")) { - auto str = vm["video"].as(); - cfg->LoadVideo = QString(str.c_str()); - } - if (vm.count("cfg")) { - auto str = vm["cfg"].as(); - cfg->CfgCustomLocation = QString(str.c_str()); - } - } - catch (std::exception& e) { - std::cout << e.what() << "\n"; - } - } + if (vm.count("help")) { + std::cout << visible; + exit(0); + } + if (vm.count("usePlugin")) { + auto str = vm["usePlugin"].as(); + cfg->UsePlugins = QString(str.c_str()); + } + if (vm.count("video")) { + auto str = vm["video"].as(); + cfg->LoadVideo = QString(str.c_str()); + } + if (vm.count("cfg")) { + auto str = vm["cfg"].as(); + cfg->CfgCustomLocation = QString(str.c_str()); + } + } catch (std::exception& e) { + std::cout << e.what() << "\n"; + } + } }; diff --git a/Src/util/Config.cpp b/Src/util/Config.cpp index 8076e959..3cdbfd31 100644 --- a/Src/util/Config.cpp +++ b/Src/util/Config.cpp @@ -13,39 +13,38 @@ const QString Config::DefaultArena = "10,10;10,100;100,100;100,10"; template -Stream &operator>>(Stream& s, QString& q) +Stream& operator>>(Stream& s, QString& q) { std::string tmp; s >> tmp; q = tmp.data(); - return s; + return s; } template -Stream &operator<<(Stream& s, QString const& q) +Stream& operator<<(Stream& s, QString const& q) { - return s << q.toStdString(); + return s << q.toStdString(); } +void workMap(boost::property_tree::basic_ptree* tree, + std::string rep, + std::map* mp) +{ - -void workMap(boost::property_tree::basic_ptree *tree, - std::string rep, - std::map *mp){ - auto bakCM = *mp; mp->clear(); - for (auto kv : *tree) { - if (boost::starts_with(kv.first, rep)){ - for (auto xx : kv.second) { - std::string snd = tree->get(rep+"."+xx.first); + for (auto kv : *tree) { + if (boost::starts_with(kv.first, rep)) { + for (auto xx : kv.second) { + std::string snd = tree->get(rep + "." + xx.first); std::string fst = xx.first; - (*mp)[fst]=snd; + (*mp)[fst] = snd; } } } - + if (mp->empty()) *mp = bakCM; } @@ -59,75 +58,106 @@ void Config::load(QString dir, QString file) d.mkpath(dir); QFile fin(dir + "/" + file); - if(!fin.exists()) - { + if (!fin.exists()) { fin.open(QIODevice::ReadWrite); fin.close(); } - + read_ini((dir + "/" + file).toStdString(), tree); Config* config = this; - std::string globalPrefix = "General."; - config->DisableWizard = tree.get(globalPrefix+"DisableWizard",config->DisableWizard); - config->FrameStride = tree.get(globalPrefix+"FrameStride",config->FrameStride); - config->RectificationHeight = tree.get(globalPrefix+"RectificationHeight",config->RectificationHeight); - config->RectificationWidth = tree.get(globalPrefix+"RectificationWidth",config->RectificationWidth); - config->AppertureType = tree.get(globalPrefix+"AppertureType",config->AppertureType); - config->CsvSeperator = tree.get(globalPrefix+"CsvSeperator",config->CsvSeperator); - config->CoreConfigFile = tree.get(globalPrefix+"CoreConfigFile",config->CoreConfigFile); - config->VideoCodecUsed = tree.get(globalPrefix+"VideoCodecUsed",config->VideoCodecUsed); - config->DropFrames = tree.get(globalPrefix+"DropFrames",config->DropFrames); - config->RecordScaledOutput = tree.get(globalPrefix+"RecordScaledOutput",config->RecordScaledOutput); - config->DataExporter = tree.get(globalPrefix+"DataExporter",config->DataExporter); - config->RecordFPS = tree.get(globalPrefix+"RecordFPS",config->RecordFPS); - config->CameraWidth = tree.get(globalPrefix+"CameraWidth",config->CameraWidth); - config->CameraHeight = tree.get(globalPrefix+"CameraHeight",config->CameraHeight); - config->GpuQp = tree.get(globalPrefix+"GpuQp",config->GpuQp); - config->DefaultLocationManualSave = tree.get(globalPrefix+"DefaultLocationManualSave",config->DefaultLocationManualSave); - config->DirPlugins = tree.get(globalPrefix+"DirPlugins",config->DirPlugins); - config->DirVideos = tree.get(globalPrefix+"DirVideos",config->DirVideos); - config->DirTracks = tree.get(globalPrefix+"DirTracks",config->DirTracks); - config->DirTrials = tree.get(globalPrefix+"DirTrials",config->DirTrials); - config->DirScreenshots = tree.get(globalPrefix+"DirScreenshots",config->DirScreenshots); - config->DirTemp = tree.get(globalPrefix+"DirTemp",config->DirTemp); - config->AreaDefinitions = tree.get(globalPrefix+"AreaDefinitions",config->AreaDefinitions); - config->UseRegistryLocations = tree.get(globalPrefix+"UseRegistryLocations",config->UseRegistryLocations); + std::string globalPrefix = "General."; + config->DisableWizard = tree.get(globalPrefix + "DisableWizard", + config->DisableWizard); + config->FrameStride = tree.get(globalPrefix + "FrameStride", + config->FrameStride); + config->RectificationHeight = tree.get( + globalPrefix + "RectificationHeight", + config->RectificationHeight); + config->RectificationWidth = tree.get(globalPrefix + + "RectificationWidth", + config->RectificationWidth); + config->AppertureType = tree.get(globalPrefix + "AppertureType", + config->AppertureType); + config->CsvSeperator = tree.get(globalPrefix + "CsvSeperator", + config->CsvSeperator); + config->CoreConfigFile = tree.get(globalPrefix + "CoreConfigFile", + config->CoreConfigFile); + config->VideoCodecUsed = tree.get(globalPrefix + "VideoCodecUsed", + config->VideoCodecUsed); + config->DropFrames = tree.get(globalPrefix + "DropFrames", + config->DropFrames); + config->RecordScaledOutput = tree.get(globalPrefix + + "RecordScaledOutput", + config->RecordScaledOutput); + config->DataExporter = tree.get(globalPrefix + "DataExporter", + config->DataExporter); + config->RecordFPS = tree.get(globalPrefix + "RecordFPS", + config->RecordFPS); + config->CameraWidth = tree.get(globalPrefix + "CameraWidth", + config->CameraWidth); + config->CameraHeight = tree.get(globalPrefix + "CameraHeight", + config->CameraHeight); + config->GpuQp = tree.get(globalPrefix + "GpuQp", config->GpuQp); + config->DefaultLocationManualSave = tree.get( + globalPrefix + "DefaultLocationManualSave", + config->DefaultLocationManualSave); + config->DirPlugins = tree.get(globalPrefix + "DirPlugins", + config->DirPlugins); + config->DirVideos = tree.get(globalPrefix + "DirVideos", + config->DirVideos); + config->DirTracks = tree.get(globalPrefix + "DirTracks", + config->DirTracks); + config->DirTrials = tree.get(globalPrefix + "DirTrials", + config->DirTrials); + config->DirScreenshots = tree.get(globalPrefix + "DirScreenshots", + config->DirScreenshots); + config->DirTemp = tree.get(globalPrefix + "DirTemp", + config->DirTemp); + config->AreaDefinitions = tree.get(globalPrefix + + "AreaDefinitions", + config->AreaDefinitions); + config->UseRegistryLocations = tree.get(globalPrefix + + "UseRegistryLocations", + config->UseRegistryLocations); } void Config::save(QString dir, QString file) { using namespace boost::property_tree; - auto tree = ptree{}; - Config *config = this; + auto tree = ptree{}; + Config* config = this; std::string globalPrefix = "General."; - tree.put(globalPrefix+"DisableWizard", config->DisableWizard); - tree.put(globalPrefix+"FrameStride", config->FrameStride); - tree.put(globalPrefix+"RectificationHeight", config->RectificationHeight); - tree.put(globalPrefix+"RectificationWidth", config->RectificationWidth); - tree.put(globalPrefix+"AppertureType", config->AppertureType); - tree.put(globalPrefix+"CsvSeperator", config->CsvSeperator); - tree.put(globalPrefix+"CoreConfigFile", config->CoreConfigFile); - tree.put(globalPrefix+"VideoCodecUsed", config->VideoCodecUsed); - tree.put(globalPrefix+"DropFrames", config->DropFrames); - tree.put(globalPrefix+"RecordScaledOutput", config->RecordScaledOutput); - tree.put(globalPrefix+"DataExporter", config->DataExporter); - tree.put(globalPrefix+"RecordFPS", config->RecordFPS); - tree.put(globalPrefix+"CameraWidth", config->CameraWidth); - tree.put(globalPrefix+"CameraHeight", config->CameraHeight); - tree.put(globalPrefix+"GpuQp", config->GpuQp); - tree.put(globalPrefix+"DefaultLocationManualSave", config->DefaultLocationManualSave); - tree.put(globalPrefix+"DirPlugins", config->DirPlugins); - tree.put(globalPrefix+"DirVideos", config->DirVideos); - tree.put(globalPrefix+"DirTracks", config->DirTracks); - tree.put(globalPrefix+"DirTrials", config->DirTrials); - tree.put(globalPrefix+"DirScreenshots", config->DirScreenshots); - tree.put(globalPrefix+"DirTemp", config->DirTemp); - tree.put(globalPrefix+"AreaDefinitions", config->AreaDefinitions); - tree.put(globalPrefix+"UseRegistryLocations", config->UseRegistryLocations); + tree.put(globalPrefix + "DisableWizard", config->DisableWizard); + tree.put(globalPrefix + "FrameStride", config->FrameStride); + tree.put(globalPrefix + "RectificationHeight", + config->RectificationHeight); + tree.put(globalPrefix + "RectificationWidth", config->RectificationWidth); + tree.put(globalPrefix + "AppertureType", config->AppertureType); + tree.put(globalPrefix + "CsvSeperator", config->CsvSeperator); + tree.put(globalPrefix + "CoreConfigFile", config->CoreConfigFile); + tree.put(globalPrefix + "VideoCodecUsed", config->VideoCodecUsed); + tree.put(globalPrefix + "DropFrames", config->DropFrames); + tree.put(globalPrefix + "RecordScaledOutput", config->RecordScaledOutput); + tree.put(globalPrefix + "DataExporter", config->DataExporter); + tree.put(globalPrefix + "RecordFPS", config->RecordFPS); + tree.put(globalPrefix + "CameraWidth", config->CameraWidth); + tree.put(globalPrefix + "CameraHeight", config->CameraHeight); + tree.put(globalPrefix + "GpuQp", config->GpuQp); + tree.put(globalPrefix + "DefaultLocationManualSave", + config->DefaultLocationManualSave); + tree.put(globalPrefix + "DirPlugins", config->DirPlugins); + tree.put(globalPrefix + "DirVideos", config->DirVideos); + tree.put(globalPrefix + "DirTracks", config->DirTracks); + tree.put(globalPrefix + "DirTrials", config->DirTrials); + tree.put(globalPrefix + "DirScreenshots", config->DirScreenshots); + tree.put(globalPrefix + "DirTemp", config->DirTemp); + tree.put(globalPrefix + "AreaDefinitions", config->AreaDefinitions); + tree.put(globalPrefix + "UseRegistryLocations", + config->UseRegistryLocations); write_ini((dir + "/" + file).toStdString(), tree); } diff --git a/Src/util/Config.h b/Src/util/Config.h index bcdd3be0..c48b1889 100644 --- a/Src/util/Config.h +++ b/Src/util/Config.h @@ -7,39 +7,38 @@ class Config : public IConfig { public: - - int DisableWizard = 0; - int FrameStride = 1; - double RectificationHeight = 100; - double RectificationWidth = 100; - int AppertureType = 0; - QString CsvSeperator = ";"; - QString CoreConfigFile = "BiotrackerCore.ini"; - int VideoCodecUsed = 0; - int DropFrames = 0; - int RecordScaledOutput = 0; - int DataExporter = 0; - int RecordFPS = -1; - int CameraWidth = -1; - int CameraHeight = -1; - double GpuQp = 20; - int UseRegistryLocations = true; + int DisableWizard = 0; + int FrameStride = 1; + double RectificationHeight = 100; + double RectificationWidth = 100; + int AppertureType = 0; + QString CsvSeperator = ";"; + QString CoreConfigFile = "BiotrackerCore.ini"; + int VideoCodecUsed = 0; + int DropFrames = 0; + int RecordScaledOutput = 0; + int DataExporter = 0; + int RecordFPS = -1; + int CameraWidth = -1; + int CameraHeight = -1; + double GpuQp = 20; + int UseRegistryLocations = true; QString DefaultLocationManualSave = ""; - QString DirPlugins = IConfig::dataLocation + "/Plugins/"; - QString DirVideos = IConfig::dataLocation + "/Videos/"; - QString DirTracks = IConfig::dataLocation + "/Tracks/"; - QString DirTrials = IConfig::dataLocation + "/Tracks/Trials/"; - QString DirScreenshots = IConfig::dataLocation + "/Screenshots/"; - QString DirTemp = IConfig::dataLocation + "/temp/"; + QString DirPlugins = IConfig::dataLocation + "/Plugins/"; + QString DirVideos = IConfig::dataLocation + "/Videos/"; + QString DirTracks = IConfig::dataLocation + "/Tracks/"; + QString DirTrials = IConfig::dataLocation + "/Tracks/Trials/"; + QString DirScreenshots = IConfig::dataLocation + "/Screenshots/"; + QString DirTemp = IConfig::dataLocation + "/temp/"; QString AreaDefinitions = IConfig::configLocation + "/areas.csv"; // Temporary CLI configuration - QString LoadVideo = ""; - QString UsePlugins = ""; + QString LoadVideo = ""; + QString UsePlugins = ""; QString CfgCustomLocation = ""; void load(QString dir, QString file = "config.ini") override; void save(QString dir, QString file) override; - + static const QString DefaultArena; }; diff --git a/Src/util/Exceptions.h b/Src/util/Exceptions.h index d31b8df8..48bc845b 100644 --- a/Src/util/Exceptions.h +++ b/Src/util/Exceptions.h @@ -2,33 +2,40 @@ #include - -namespace BioTracker { -namespace Core { - -struct video_open_error : std::invalid_argument { - using std::invalid_argument::invalid_argument; -}; - -struct file_not_found : std::invalid_argument { - using std::invalid_argument::invalid_argument; -}; - -struct directory_not_found : std::invalid_argument { - using std::invalid_argument::invalid_argument; -}; - -struct device_open_error : std::invalid_argument { - using std::invalid_argument::invalid_argument; -}; - -struct invalid_tracker_lib_error : std::invalid_argument { - using std::invalid_argument::invalid_argument; -}; - -struct path_creation_error : std::runtime_error { - using std::runtime_error::runtime_error; -}; - -} +namespace BioTracker +{ + namespace Core + { + + struct video_open_error : std::invalid_argument + { + using std::invalid_argument::invalid_argument; + }; + + struct file_not_found : std::invalid_argument + { + using std::invalid_argument::invalid_argument; + }; + + struct directory_not_found : std::invalid_argument + { + using std::invalid_argument::invalid_argument; + }; + + struct device_open_error : std::invalid_argument + { + using std::invalid_argument::invalid_argument; + }; + + struct invalid_tracker_lib_error : std::invalid_argument + { + using std::invalid_argument::invalid_argument; + }; + + struct path_creation_error : std::runtime_error + { + using std::runtime_error::runtime_error; + }; + + } } diff --git a/Src/util/Messages.h b/Src/util/Messages.h index 53e9b117..e0abbfc9 100644 --- a/Src/util/Messages.h +++ b/Src/util/Messages.h @@ -1,35 +1,40 @@ #pragma once -namespace BioTracker { -namespace Core { - -namespace Messages { -namespace System { - -static const std::string APPLICATION_CANNOT_START = - "Application cannot start"; -static const std::string NO_OPENGL = - "This system has no OpenGL support!"; -static const std::string MISSING_CONFIGURATION_FILE = - "Configuration file is missing! Using default parameters."; - +namespace BioTracker +{ + namespace Core + { + + namespace Messages + { + namespace System + { + + static const std::string APPLICATION_CANNOT_START = + "Application cannot start"; + static const std::string NO_OPENGL = + "This system has no OpenGL support!"; + static const std::string MISSING_CONFIGURATION_FILE = + "Configuration file is missing! Using default parameters."; + + } + + enum class MessageType : size_t + { + NOTIFICATION = 0, + WARNING, + FAIL, + FILE_OPEN + }; + + inline MessageType fromInt(const size_t v) + { + return static_cast(v); + } + + } + + using Messages::MessageType; + + } } - -enum class MessageType : size_t { - NOTIFICATION = 0, - WARNING, - FAIL, - FILE_OPEN -}; - -inline MessageType fromInt(const size_t v) { - return static_cast(v); -} - -} - -using Messages::MessageType; - -} -} - diff --git a/Src/util/PanZoomState.h b/Src/util/PanZoomState.h index 47dffca5..24da99f3 100644 --- a/Src/util/PanZoomState.h +++ b/Src/util/PanZoomState.h @@ -3,31 +3,37 @@ #include "boost/optional.hpp" #include -namespace BioTracker { -namespace Core { +namespace BioTracker +{ + namespace Core + { -/** -* @brief Used to store mouse cursor offsets while panning. -*/ -struct CurrentPanState { - QPointF lastPos; + /** + * @brief Used to store mouse cursor offsets while panning. + */ + struct CurrentPanState + { + QPointF lastPos; - CurrentPanState(const QPointF lastPos) - : lastPos(lastPos) { - } -}; + CurrentPanState(const QPointF lastPos) + : lastPos(lastPos) + { + } + }; -/** - * @brief Stores the current zoom and pan offsets. While panning, panState stores the last mouse cursor position. - */ -struct PanZoomState { - float zoomFactor = 0.f; - float panX = 0.f; - float panY = 0.f; - bool isChanged = false; + /** + * @brief Stores the current zoom and pan offsets. While panning, + * panState stores the last mouse cursor position. + */ + struct PanZoomState + { + float zoomFactor = 0.f; + float panX = 0.f; + float panY = 0.f; + bool isChanged = false; - boost::optional panState; -}; + boost::optional panState; + }; -} + } } diff --git a/Src/util/ParamNames.h b/Src/util/ParamNames.h index 72b2d583..529a4511 100644 --- a/Src/util/ParamNames.h +++ b/Src/util/ParamNames.h @@ -7,86 +7,99 @@ #include #include -namespace ConfigParam { -static const boost::filesystem::path CONFIG_PATH = boost::filesystem::path( - QDir::toNativeSeparators( - QStandardPaths::writableLocation(QStandardPaths::ConfigLocation)).toStdString()); -static const boost::filesystem::path BASE_PATH = CONFIG_PATH / "BioTracker"; -static const boost::filesystem::path CONFIGURATION_FILE = BASE_PATH / "config.json"; -static const boost::filesystem::path GEOMETRY_FILE = BASE_PATH / "geometry.cfg"; -static const boost::filesystem::path STATE_FILE = BASE_PATH / "state.cfg"; -static const boost::filesystem::path MODULE_PATH = BASE_PATH / "modules"; +namespace ConfigParam +{ + static const boost::filesystem::path CONFIG_PATH = boost::filesystem::path( + QDir::toNativeSeparators( + QStandardPaths::writableLocation(QStandardPaths::ConfigLocation)) + .toStdString()); + static const boost::filesystem::path BASE_PATH = CONFIG_PATH / + "BioTracker"; + static const boost::filesystem::path CONFIGURATION_FILE = BASE_PATH / + "config.json"; + static const boost::filesystem::path GEOMETRY_FILE = BASE_PATH / + "geometry.cfg"; + static const boost::filesystem::path STATE_FILE = BASE_PATH / "state.cfg"; + static const boost::filesystem::path MODULE_PATH = BASE_PATH / "modules"; } -namespace TrackerParam { -static const std::string TRACKING_ENABLED = "TRACKERPARAM.TRACKING_ENABLED"; +namespace TrackerParam +{ + static const std::string TRACKING_ENABLED = + "TRACKERPARAM.TRACKING_ENABLED"; -static const std::string SELECTED_TRACKER = "TRACKERPARAM.SELECTED_TRACKER"; + static const std::string SELECTED_TRACKER = + "TRACKERPARAM.SELECTED_TRACKER"; } -namespace GuiParam { -enum class MediaType : uint8_t { - NoMedia = 0, - Video, - Images, - Camera -}; - -enum class VideoMode : uint8_t { - Playing = 0, - Paused, - Stopped, - Init -}; - - -static const std::string MEDIA_TYPE = "GUIPARAM.MEDIA_TYPE"; -static const std::string SHORTCUT_PLAY = "GUIPARAM.SHORTCUT_PLAY"; -static const std::string SHORTCUT_NEXT = "GUIPARAM.SHORTCUT_NEXT"; -static const std::string SHORTCUT_PREV = "GUIPARAM.SHORTCUT_PREV"; -static const std::string SHORTCUT_ZOOM = "GUIPARAM.SHORTCUT_ZOOM"; -static const std::string SHORTCUT_TRACKING = "GUIPARAM.SHORTCUT_TRACKING"; - -static const std::string PAUSED_AT_FRAME = "GUIPARAM.PAUSED_AT_FRAME"; +namespace GuiParam +{ + enum class MediaType : uint8_t + { + NoMedia = 0, + Video, + Images, + Camera + }; + + enum class VideoMode : uint8_t + { + Playing = 0, + Paused, + Stopped, + Init + }; + + static const std::string MEDIA_TYPE = "GUIPARAM.MEDIA_TYPE"; + static const std::string SHORTCUT_PLAY = "GUIPARAM.SHORTCUT_PLAY"; + static const std::string SHORTCUT_NEXT = "GUIPARAM.SHORTCUT_NEXT"; + static const std::string SHORTCUT_PREV = "GUIPARAM.SHORTCUT_PREV"; + static const std::string SHORTCUT_ZOOM = "GUIPARAM.SHORTCUT_ZOOM"; + static const std::string SHORTCUT_TRACKING = "GUIPARAM.SHORTCUT_TRACKING"; + + static const std::string PAUSED_AT_FRAME = "GUIPARAM.PAUSED_AT_FRAME"; } -namespace PictureParam { -//path to picture -static const std::string PICTURE_FILES = "PICTUREPARAM.PICTURE_FILES"; +namespace PictureParam +{ + // path to picture + static const std::string PICTURE_FILES = "PICTUREPARAM.PICTURE_FILES"; } -namespace CaptureParam { -// Video path -static const std::string CAP_VIDEO_FILE = "CAPTUREPARAM.CAP_VIDEO_FILE"; -static const std::string CAP_SCREENSHOT_PATH = - "CAPTUREPARAM.CAP_SCREENSHOT_PATH"; -static const std::string CAP_CAMERA_ID = "CAPTUREPARAM.CAP_CAMERA_ID"; - -// Video paths -static const std::string ENABLE_RECORD_RAW = - "CAPTUREPARAM.ENABLE_RECORD_RAW"; -static const std::string ENABLE_RECORD_TRACKING = - "CAPTUREPARAM.ENABLE_RECORD_TRACKING"; -static const std::string ENABLE_RECORD_TRACK_INFO = - "CAPTUREPARAM.ENABLE_RECORD_TRACK_INFO"; - -static const std::string RECORDING_TRACKING_PATH = - "CAPTUREPARAM.RECORDING_TRACKING_PATH"; -static const std::string RECORDING_RAW_PATH = - "CAPTUREPARAM.RECORDING_RAW_PATH"; -static const std::string TRACKING_INFO_OUTPUT_PATH = - "CAPTUREPARAM.TRACKING_INFO_OUTPUT_PATH"; - -enum CAP_TYPE_ENUM { - CAP_FROM_CAM = 0, - CAP_FROM_FILE = 1 -}; - -enum CAP_STATE_ENUM { - CAP_FINISHED = 0, - CAP_PAUSE = 1, - CAP_AVAILABLE = 2, - CAP_EXITED = 3 -}; +namespace CaptureParam +{ + // Video path + static const std::string CAP_VIDEO_FILE = "CAPTUREPARAM.CAP_VIDEO_FILE"; + static const std::string CAP_SCREENSHOT_PATH = + "CAPTUREPARAM.CAP_SCREENSHOT_PATH"; + static const std::string CAP_CAMERA_ID = "CAPTUREPARAM.CAP_CAMERA_ID"; + + // Video paths + static const std::string ENABLE_RECORD_RAW = + "CAPTUREPARAM.ENABLE_RECORD_RAW"; + static const std::string ENABLE_RECORD_TRACKING = + "CAPTUREPARAM.ENABLE_RECORD_TRACKING"; + static const std::string ENABLE_RECORD_TRACK_INFO = + "CAPTUREPARAM.ENABLE_RECORD_TRACK_INFO"; + + static const std::string RECORDING_TRACKING_PATH = + "CAPTUREPARAM.RECORDING_TRACKING_PATH"; + static const std::string RECORDING_RAW_PATH = + "CAPTUREPARAM.RECORDING_RAW_PATH"; + static const std::string TRACKING_INFO_OUTPUT_PATH = + "CAPTUREPARAM.TRACKING_INFO_OUTPUT_PATH"; + + enum CAP_TYPE_ENUM + { + CAP_FROM_CAM = 0, + CAP_FROM_FILE = 1 + }; + + enum CAP_STATE_ENUM + { + CAP_FINISHED = 0, + CAP_PAUSE = 1, + CAP_AVAILABLE = 2, + CAP_EXITED = 3 + }; } - diff --git a/Src/util/ScreenHelper.h b/Src/util/ScreenHelper.h index ee8496ad..a9050c27 100644 --- a/Src/util/ScreenHelper.h +++ b/Src/util/ScreenHelper.h @@ -1,208 +1,233 @@ #pragma once -#include // QRect -#include // QPoint +#include // QRect +#include // QPoint #include "PanZoomState.h" #include "math.h" /** * Screen helper functions */ -namespace BioTracker { -namespace Core { -namespace ScreenHelper { - -/** - * @brief calculate_viewport - * @param im_w width of the image - * @param im_h height of the image - * @param w width of the videoview - * @param h height of the videoview - * @param window OUT parameter - * @param viewport OUT parameter - */ -inline float calculate_viewport( - const int im_w, const int im_h, - const int w, const int h, - QRect &window, QRect &viewport) { - - // We use setWindow and setViewport to fit the video into the - // given video widget frame (with width "w" and height "h") - // we later need to adjust an offset caused the use of different - // dimensions for window and viewport. - const float im_wf = static_cast(im_w); - const float im_hf = static_cast(im_h); - const float w_f = static_cast(w); - const float h_f = static_cast(h); - - float ratio = 0; - int offset_top = 0; - int offset_left = 0; - - if ((im_wf/im_hf) > (w_f/h_f)) { - // image ratio is bigger (wider image than window) - ratio = im_wf / w_f; - const float px = w_f / im_wf; - const float px_im_hf = px * im_hf; - offset_top = h/2 - static_cast(px_im_hf / 2); - } else { - // window ratio is bigger (narrow image) - ratio = im_hf / h_f; - const float px = h_f / im_hf; - const float px_im_wf = px * im_wf; - offset_left = w/2 - static_cast(px_im_wf / 2); - } - - const int screen_w = static_cast(im_wf * ratio); - const int screen_h = static_cast(im_hf * ratio); - - window.setX(0); - window.setY(0); - window.setWidth(screen_w); - window.setHeight(screen_h); - - viewport.setX(offset_left); - viewport.setY(offset_top); - viewport.setWidth(im_w); - viewport.setHeight(im_h); - - // adjust the panning as the viewport is potentially scewed - // and mouse movements given by the window are not translated - // one-to-one anymore - return screen_w / im_wf; -} - -/** - * @brief getImDimsInScreenCoords - * Calculates the actual dimension of the image with all zoom, pan and - * viewport transformations applied - * @return a rectangle that represents the position and dimension of the - * image in the videoview element - */ -inline QRect getImDimsInScreenCoords( - const PanZoomState zoomState, - const int im_w, const int im_h, - const int w, const int h) { - - QRect viewport, window; - const float viewportRatio = calculate_viewport(im_w, im_h, w, h, window, viewport); - const float zoom = 1 + zoomState.zoomFactor; - // back-translate the pan to non-zoomed coordinate space - float realPanX = -zoomState.panX; - float realPanY = -zoomState.panY; - realPanX += (viewport.x()); - realPanY += (viewport.y()); - - // The image in screen coords - QRect actualIm( - static_cast(realPanX), static_cast(realPanY), - static_cast((im_w / viewportRatio) * zoom), - static_cast((im_h / viewportRatio) * zoom) - ); - return actualIm; -} - -/** - * @brief imageToScreenCoords - */ -inline QPoint imageToScreenCoords( - const PanZoomState zoomState, - const int im_w, const int im_h, - const int w, const int h, - const QPoint poi) { - QPoint result; - const QRect actualIm = getImDimsInScreenCoords(zoomState, im_w, im_h, w, h); - const float one_step_x = actualIm.width() / static_cast(im_w); - const float one_step_y = actualIm.height() / static_cast(im_h); - const int actualPosXInIm = static_cast(round(poi.x() * one_step_x)); - const int actualPosYInIm = static_cast(round(poi.y() * one_step_y)); - result.setX(actualPosXInIm + actualIm.x()); - result.setY(actualPosYInIm + actualIm.y()); - return result; -} - -/** - * @brief screenToImageCoords - * Translate the window coordinates to the actual image coords - * @param im_w image width - * @param im_h image height - * @param w width of the videoview - * @param h height of the videoview - * @param poi Point in Screen Coords - */ -inline QPoint screenToImageCoords( - const BioTracker::Core::PanZoomState zoomState, - const int im_w, const int im_h, - const int w, const int h, - QPoint poi) { - QPoint result(0, 0); - - // The image in screen coords - QRect actualIm = getImDimsInScreenCoords(zoomState, im_w, im_h, w, h); - - const float im_wf = static_cast(im_w); - const float im_hf = static_cast(im_h); - const float one_step_x = im_wf / actualIm.width(); - const float one_step_y = im_hf / actualIm.height(); - - const float transformedX = (-actualIm.x() + poi.x()) * one_step_x; - const float transformedY = (-actualIm.y() + poi.y()) * one_step_y; - - result.setX(static_cast(round(transformedX))); - result.setY(static_cast(round(transformedY))); - - return result; -} - -/** - * @brief zoomTo - * Modifies the panzoomstate so that the cursor (zoomCenter) will point to the same - * location in the image as prior to the zoom - * @param im_w width of the image (in px) - * @param im_h height of the image (in px) - * @param w width of the videoview element - * @param h height of the videoview element - */ -inline PanZoomState zoomTo( - PanZoomState state, - const int im_w, - const int im_h, - const int w, - const int h, - const float deltaZoom, - const QPoint zoomCenter) { - - const QPoint imPos = screenToImageCoords(state, im_w, im_h, w, h, zoomCenter); - - const float oldZoomFactor = state.zoomFactor; - const float newZoomFactor = state.zoomFactor - (deltaZoom/2000); - - if (newZoomFactor <= -1.0f) { - // MAX VALUE - return state; +namespace BioTracker +{ + namespace Core + { + namespace ScreenHelper + { + + /** + * @brief calculate_viewport + * @param im_w width of the image + * @param im_h height of the image + * @param w width of the videoview + * @param h height of the videoview + * @param window OUT parameter + * @param viewport OUT parameter + */ + inline float calculate_viewport(const int im_w, + const int im_h, + const int w, + const int h, + QRect& window, + QRect& viewport) + { + + // We use setWindow and setViewport to fit the video into the + // given video widget frame (with width "w" and height "h") + // we later need to adjust an offset caused the use of + // different dimensions for window and viewport. + const float im_wf = static_cast(im_w); + const float im_hf = static_cast(im_h); + const float w_f = static_cast(w); + const float h_f = static_cast(h); + + float ratio = 0; + int offset_top = 0; + int offset_left = 0; + + if ((im_wf / im_hf) > (w_f / h_f)) { + // image ratio is bigger (wider image than window) + ratio = im_wf / w_f; + const float px = w_f / im_wf; + const float px_im_hf = px * im_hf; + offset_top = h / 2 - static_cast(px_im_hf / 2); + } else { + // window ratio is bigger (narrow image) + ratio = im_hf / h_f; + const float px = h_f / im_hf; + const float px_im_wf = px * im_wf; + offset_left = w / 2 - static_cast(px_im_wf / 2); + } + + const int screen_w = static_cast(im_wf * ratio); + const int screen_h = static_cast(im_hf * ratio); + + window.setX(0); + window.setY(0); + window.setWidth(screen_w); + window.setHeight(screen_h); + + viewport.setX(offset_left); + viewport.setY(offset_top); + viewport.setWidth(im_w); + viewport.setHeight(im_h); + + // adjust the panning as the viewport is potentially scewed + // and mouse movements given by the window are not translated + // one-to-one anymore + return screen_w / im_wf; + } + + /** + * @brief getImDimsInScreenCoords + * Calculates the actual dimension of the image with all zoom, pan + * and viewport transformations applied + * @return a rectangle that represents the position and dimension + * of the image in the videoview element + */ + inline QRect getImDimsInScreenCoords(const PanZoomState zoomState, + const int im_w, + const int im_h, + const int w, + const int h) + { + + QRect viewport, window; + const float viewportRatio = + calculate_viewport(im_w, im_h, w, h, window, viewport); + const float zoom = 1 + zoomState.zoomFactor; + // back-translate the pan to non-zoomed coordinate space + float realPanX = -zoomState.panX; + float realPanY = -zoomState.panY; + realPanX += (viewport.x()); + realPanY += (viewport.y()); + + // The image in screen coords + QRect actualIm( + static_cast(realPanX), + static_cast(realPanY), + static_cast((im_w / viewportRatio) * zoom), + static_cast((im_h / viewportRatio) * zoom)); + return actualIm; + } + + /** + * @brief imageToScreenCoords + */ + inline QPoint imageToScreenCoords(const PanZoomState zoomState, + const int im_w, + const int im_h, + const int w, + const int h, + const QPoint poi) + { + QPoint result; + const QRect actualIm = + getImDimsInScreenCoords(zoomState, im_w, im_h, w, h); + const float one_step_x = actualIm.width() / + static_cast(im_w); + const float one_step_y = actualIm.height() / + static_cast(im_h); + const int actualPosXInIm = static_cast( + round(poi.x() * one_step_x)); + const int actualPosYInIm = static_cast( + round(poi.y() * one_step_y)); + result.setX(actualPosXInIm + actualIm.x()); + result.setY(actualPosYInIm + actualIm.y()); + return result; + } + + /** + * @brief screenToImageCoords + * Translate the window coordinates to the actual image coords + * @param im_w image width + * @param im_h image height + * @param w width of the videoview + * @param h height of the videoview + * @param poi Point in Screen Coords + */ + inline QPoint screenToImageCoords( + const BioTracker::Core::PanZoomState zoomState, + const int im_w, + const int im_h, + const int w, + const int h, + QPoint poi) + { + QPoint result(0, 0); + + // The image in screen coords + QRect actualIm = + getImDimsInScreenCoords(zoomState, im_w, im_h, w, h); + + const float im_wf = static_cast(im_w); + const float im_hf = static_cast(im_h); + const float one_step_x = im_wf / actualIm.width(); + const float one_step_y = im_hf / actualIm.height(); + + const float transformedX = (-actualIm.x() + poi.x()) * + one_step_x; + const float transformedY = (-actualIm.y() + poi.y()) * + one_step_y; + + result.setX(static_cast(round(transformedX))); + result.setY(static_cast(round(transformedY))); + + return result; + } + + /** + * @brief zoomTo + * Modifies the panzoomstate so that the cursor (zoomCenter) will + * point to the same location in the image as prior to the zoom + * @param im_w width of the image (in px) + * @param im_h height of the image (in px) + * @param w width of the videoview element + * @param h height of the videoview element + */ + inline PanZoomState zoomTo(PanZoomState state, + const int im_w, + const int im_h, + const int w, + const int h, + const float deltaZoom, + const QPoint zoomCenter) + { + + const QPoint imPos = + screenToImageCoords(state, im_w, im_h, w, h, zoomCenter); + + const float oldZoomFactor = state.zoomFactor; + const float newZoomFactor = state.zoomFactor - + (deltaZoom / 2000); + + if (newZoomFactor <= -1.0f) { + // MAX VALUE + return state; + } + + const float zoom = 1 + newZoomFactor; + + const float oldPanX = state.panX / (1 + oldZoomFactor); + const float oldPanY = state.panY / (1 + oldZoomFactor); + + // zoom with origin in (0/0) + state.panX = oldPanX * zoom; + state.panY = oldPanY * zoom; + state.zoomFactor = newZoomFactor; + + // As we do not want to zoom to (0/0) but rather keep the focus + // on the chosen image position (zoomCenter) we now have to + // "back-translate" to our initial position + const QPoint translatedZoomCenter = + imageToScreenCoords(state, im_w, im_h, w, h, imPos); + const QPoint translate = translatedZoomCenter - zoomCenter; + state.panX += translate.x(); + state.panY += translate.y(); + state.isChanged = true; + return state; + } + + } } - - const float zoom = 1 + newZoomFactor; - - const float oldPanX = state.panX / (1 + oldZoomFactor); - const float oldPanY = state.panY / (1 + oldZoomFactor); - - // zoom with origin in (0/0) - state.panX = oldPanX * zoom; - state.panY = oldPanY * zoom; - state.zoomFactor = newZoomFactor; - - // As we do not want to zoom to (0/0) but rather keep the focus on the chosen - // image position (zoomCenter) we now have to "back-translate" to our initial - // position - const QPoint translatedZoomCenter = imageToScreenCoords(state, im_w, im_h, w, h, imPos); - const QPoint translate = translatedZoomCenter - zoomCenter; - state.panX += translate.x(); - state.panY += translate.y(); - state.isChanged = true; - return state; -} - -} -} } diff --git a/Src/util/VideoCoder.cpp b/Src/util/VideoCoder.cpp index 0b3ce610..5d717bc4 100644 --- a/Src/util/VideoCoder.cpp +++ b/Src/util/VideoCoder.cpp @@ -3,261 +3,274 @@ #include #ifdef _WIN32 -#include -#include + #include + #include #endif -using namespace BioTrackerUtilsMisc; //getTimeAndDate +using namespace BioTrackerUtilsMisc; // getTimeAndDate #define mySleep(x) std::this_thread::sleep_for(std::chrono::milliseconds(x)); -void MutexLinkedList::push(std::shared_ptr imbuffer, bool dropFrames) { - - if (dropFrames) { - while (images.size() > MAXIMUMQUEUE) - pop(); - } - else { - while (images.size() > MAXIMUMQUEUE) - mySleep(10); - } +void MutexLinkedList::push(std::shared_ptr imbuffer, + bool dropFrames) +{ - _Access.lock(); + if (dropFrames) { + while (images.size() > MAXIMUMQUEUE) + pop(); + } else { + while (images.size() > MAXIMUMQUEUE) + mySleep(10); + } - images.push_back(imbuffer); - unsigned long s = static_cast(images.size()); - unsigned long w = imbuffer->getWidth(); - unsigned long h = imbuffer->getHeight(); - //if (s*w*h / 1024 / 1024 > BUFFER_HARDLIMIT) { - // std::cout << "ERROR: Buffer exceeds hardlimit (" << BUFFER_HARDLIMIT << " MB). Exiting. " << std::endl; - // std::exit(1); - //} - _Access.unlock(); + _Access.lock(); + + images.push_back(imbuffer); + unsigned long s = static_cast(images.size()); + unsigned long w = imbuffer->getWidth(); + unsigned long h = imbuffer->getHeight(); + // if (s*w*h / 1024 / 1024 > BUFFER_HARDLIMIT) { + // std::cout << "ERROR: Buffer exceeds hardlimit (" << BUFFER_HARDLIMIT << + //" MB). Exiting. " << std::endl; std::exit(1); + //} + _Access.unlock(); } -std::shared_ptr MutexLinkedList::pop() { - _Access.lock(); - if (images.size()>0) { - std::shared_ptr img = images.front(); - images.pop_front(); - _Access.unlock(); - return img; - } - _Access.unlock(); +std::shared_ptr MutexLinkedList::pop() +{ + _Access.lock(); + if (images.size() > 0) { + std::shared_ptr img = images.front(); + images.pop_front(); + _Access.unlock(); + return img; + } + _Access.unlock(); - return std::make_shared(); + return std::make_shared(); } -void MutexLinkedList::MutexLinkedList::clear() { - _Access.lock(); - while (images.size()>0) { - images.pop_front(); - } - _Access.unlock(); +void MutexLinkedList::MutexLinkedList::clear() +{ + _Access.lock(); + while (images.size() > 0) { + images.pop_front(); + } + _Access.unlock(); } - -//Simple function to get the current size of the buffer in elements. -//Locks the data structure. -int MutexLinkedList::size() { - int tsize = 0; - _Access.lock(); - tsize = static_cast(images.size()); - _Access.unlock(); - return tsize; +// Simple function to get the current size of the buffer in elements. +// Locks the data structure. +int MutexLinkedList::size() +{ + int tsize = 0; + _Access.lock(); + tsize = static_cast(images.size()); + _Access.unlock(); + return tsize; } /////////////////////////////////////////////////////////////////////////////////////////////// void YuvConverter::convert() { - int w = inImg.size().width; - int h = inImg.size().height; - unsigned char *prtM = inImg.data; - unsigned int stride = 1; - //Y - int x, y; - for (y = 0; y < h; y++) { - for (x = 0; x < w; x++) { - //This works but is horribly slow! - //out0[y * w + x] = inImg.at(y, x)[0]; - //out1[y * w + x] = inImg.at(y, x)[1]; - //out2[y * w + x] = inImg.at(y, x)[2]; - //This works and is quite a bunch faster - out0[y * w + x] = (uint8_t)(*prtM); - prtM++; - out1[y * w + x] = (uint8_t)(*prtM); - prtM++; - out2[y * w + x] = (uint8_t)(*prtM); - prtM++; - } - } + int w = inImg.size().width; + int h = inImg.size().height; + unsigned char* prtM = inImg.data; + unsigned int stride = 1; + // Y + int x, y; + for (y = 0; y < h; y++) { + for (x = 0; x < w; x++) { + // This works but is horribly slow! + // out0[y * w + x] = inImg.at(y, x)[0]; + // out1[y * w + x] = inImg.at(y, x)[1]; + // out2[y * w + x] = inImg.at(y, x)[2]; + // This works and is quite a bunch faster + out0[y * w + x] = (uint8_t)(*prtM); + prtM++; + out1[y * w + x] = (uint8_t)(*prtM); + prtM++; + out2[y * w + x] = (uint8_t)(*prtM); + prtM++; + } + } } void YuvConverter::convert420() { - int w = inImg.size().width; - int h = inImg.size().height; - unsigned char *prtM = inImg.data; - unsigned int stride = 1; - //Y - int x, y; - for (y = 0; y < (h / 3 * 2); y++) { - for (x = 0; x < w; x++) { - unsigned char ch = (uint8_t)(*prtM); - out0[y * w + x] = ch; - prtM++; - } - } - - for (y = 0; y < (h / 3 * 1); y++) { - for (x = 0; x < w/2; x++) { - out2[y * w + x] = (uint8_t)(*prtM); - prtM++; - out1[y * w + x] = (uint8_t)(*prtM); - prtM++; - } - } + int w = inImg.size().width; + int h = inImg.size().height; + unsigned char* prtM = inImg.data; + unsigned int stride = 1; + // Y + int x, y; + for (y = 0; y < (h / 3 * 2); y++) { + for (x = 0; x < w; x++) { + unsigned char ch = (uint8_t)(*prtM); + out0[y * w + x] = ch; + prtM++; + } + } + + for (y = 0; y < (h / 3 * 1); y++) { + for (x = 0; x < w / 2; x++) { + out2[y * w + x] = (uint8_t)(*prtM); + prtM++; + out1[y * w + x] = (uint8_t)(*prtM); + prtM++; + } + } } /////////////////////////////////////////////////////////////////////////////////////////////// -void Worker::run() { +void Worker::run() +{ #ifdef WITH_CUDA - if (m_nvEncoder) { - unsigned char *o0 = m_nvEncoder->getYuvChannel(0); - unsigned char *o1 = m_nvEncoder->getYuvChannel(1); - unsigned char *o2 = m_nvEncoder->getYuvChannel(2); - std::shared_ptr mat; - while (1) { - while ((mat = ll.pop())->getWidth() == -1) { - mySleep(10); - if (m_abort) return; - } - if (m_abort) return; - - cv::Mat writeMat; - cv::cvtColor(*(mat->_img), writeMat, CV_BGR2YUV_I420);//CV_BGR2YUV_I420 //CV_BGR2YUV - int chans = writeMat.channels(); - YuvConverter yc(writeMat, o0, o1, o2); - yc.convert420(); - m_nvEncoder->encodeNext(); - } - } - else + if (m_nvEncoder) { + unsigned char* o0 = m_nvEncoder->getYuvChannel(0); + unsigned char* o1 = m_nvEncoder->getYuvChannel(1); + unsigned char* o2 = m_nvEncoder->getYuvChannel(2); + std::shared_ptr mat; + while (1) { + while ((mat = ll.pop())->getWidth() == -1) { + mySleep(10); + if (m_abort) + return; + } + if (m_abort) + return; + + cv::Mat writeMat; + cv::cvtColor(*(mat->_img), + writeMat, + CV_BGR2YUV_I420); // CV_BGR2YUV_I420 //CV_BGR2YUV + int chans = writeMat.channels(); + YuvConverter yc(writeMat, o0, o1, o2); + yc.convert420(); + m_nvEncoder->encodeNext(); + } + } else #endif - { - std::shared_ptr mat; - while (1) { - while ((mat = ll.pop())->getWidth() == -1) { - mySleep(10); - if (m_abort) return; - } - if (m_abort) return; - - m_vWriter->write(*mat->_img); - } - - } + { + std::shared_ptr mat; + while (1) { + while ((mat = ll.pop())->getWidth() == -1) { + mySleep(10); + if (m_abort) + return; + } + if (m_abort) + return; + + m_vWriter->write(*mat->_img); + } + } } -int VideoCoder::toggle(int w, int h, double fps) { +int VideoCoder::toggle(int w, int h, double fps) +{ - //Grab the codec from config file - std::string codecStr = codecList[_cfg->VideoCodecUsed].second; - std::string videoDir = _cfg->DirVideos.toStdString(); - m_dropFrames = _cfg->DropFrames; - m_qp = _cfg->GpuQp; + // Grab the codec from config file + std::string codecStr = codecList[_cfg->VideoCodecUsed].second; + std::string videoDir = _cfg->DirVideos.toStdString(); + m_dropFrames = _cfg->DropFrames; + m_qp = _cfg->GpuQp; if (fps == -1) { fps = m_fps; } - - if (!m_recording) - { - worker = std::make_shared(); - - //Check which one to use - if (codecStr == "X264") { - int codec = cv::VideoWriter::fourcc('X', 'V', 'I', 'D'); - vWriter = std::make_shared(getTimeAndDate(videoDir+"CameraCapture", ".avi"), codec, fps, cv::Size(w, h), 1); - m_recording = vWriter->isOpened(); + if (!m_recording) { + worker = std::make_shared(); + + // Check which one to use + if (codecStr == "X264") { + int codec = cv::VideoWriter::fourcc('X', 'V', 'I', 'D'); + vWriter = std::make_shared( + getTimeAndDate(videoDir + "CameraCapture", ".avi"), + codec, + fps, + cv::Size(w, h), + 1); + m_recording = vWriter->isOpened(); vWriter->set(cv::VIDEOWRITER_PROP_QUALITY, 100); - std::cout << "Video is open:" << m_recording << std::endl; - m_recType = 2; - int ok = start(); - m_recording = (ok == 1 ? false : true); - } - else if (codecStr == "X264GPU") { + std::cout << "Video is open:" << m_recording << std::endl; + m_recType = 2; + int ok = start(); + m_recording = (ok == 1 ? false : true); + } else if (codecStr == "X264GPU") { #ifdef WITH_CUDA - auto cfg = m_nvEncoder->getEncodeConfig(); - cfg->fps = fps; - cfg->width = w; - cfg->height = h; - cfg->codec = NV_ENC_H264; - cfg->inputFormat = NV_ENC_BUFFER_FORMAT_NV12;//NV_ENC_BUFFER_FORMAT_NV12;//NV_ENC_BUFFER_FORMAT_YUV444 - const std::string f = getTimeAndDate(std::string(CFG_DIR_VIDEOS) + "CameraCapture", ".avi"); - char* chr = strdup(f.c_str()); - m_nvEncoder->setOutfile(chr); - cfg->qp = m_qp; - m_recType = 1; - int ok = start(); - free(chr); - m_recording = (ok == 1 ? false : true); - std::cout << "Video is open:" << m_recording << std::endl; + auto cfg = m_nvEncoder->getEncodeConfig(); + cfg->fps = fps; + cfg->width = w; + cfg->height = h; + cfg->codec = NV_ENC_H264; + cfg->inputFormat = + NV_ENC_BUFFER_FORMAT_NV12; // NV_ENC_BUFFER_FORMAT_NV12;//NV_ENC_BUFFER_FORMAT_YUV444 + const std::string f = getTimeAndDate(std::string(CFG_DIR_VIDEOS) + + "CameraCapture", + ".avi"); + char* chr = strdup(f.c_str()); + m_nvEncoder->setOutfile(chr); + cfg->qp = m_qp; + m_recType = 1; + int ok = start(); + free(chr); + m_recording = (ok == 1 ? false : true); + std::cout << "Video is open:" << m_recording << std::endl; #endif - } - } - else { - m_recording = false; - if (m_recType == 1) - stop(); - if (m_recType == 2) - stop();//vWriter->release(); - vWriter = 0; - } - if (!m_recording) - m_recType = 0; - return m_recording; + } + } else { + m_recording = false; + if (m_recType == 1) + stop(); + if (m_recType == 2) + stop(); // vWriter->release(); + vWriter = 0; + } + if (!m_recording) + m_recType = 0; + return m_recording; } -void VideoCoder::add(std::shared_ptr m, int needsConversion) { - worker->ll.push(std::make_shared(m, needsConversion), m_dropFrames); +void VideoCoder::add(std::shared_ptr m, int needsConversion) +{ + worker->ll.push(std::make_shared(m, needsConversion), + m_dropFrames); } -int VideoCoder::start() { +int VideoCoder::start() +{ #ifdef WITH_CUDA - if (m_recType == 1) { - int ok = m_nvEncoder->init(); - if (ok > 0) - return ok; - worker->m_nvEncoder = m_nvEncoder; - worker->start(); - } - else + if (m_recType == 1) { + int ok = m_nvEncoder->init(); + if (ok > 0) + return ok; + worker->m_nvEncoder = m_nvEncoder; + worker->start(); + } else #endif - if (m_recType == 2) { - worker->m_vWriter = vWriter; - worker->start(); - } + if (m_recType == 2) { + worker->m_vWriter = vWriter; + worker->start(); + } - return 0; + return 0; } -void VideoCoder::stop() { - if (m_recType > 0) { - worker->m_abort = true; - worker->wait(); +void VideoCoder::stop() +{ + if (m_recType > 0) { + worker->m_abort = true; + worker->wait(); #ifdef WITH_CUDA - if (m_nvEncoder) - m_nvEncoder->close(); + if (m_nvEncoder) + m_nvEncoder->close(); #endif - if (vWriter) - vWriter->release(); - worker->ll.clear(); - } + if (vWriter) + vWriter->release(); + worker->ll.clear(); + } } - - - diff --git a/Src/util/VideoCoder.h b/Src/util/VideoCoder.h index 1084c4f8..74422805 100644 --- a/Src/util/VideoCoder.h +++ b/Src/util/VideoCoder.h @@ -1,6 +1,5 @@ #pragma once - #include #include @@ -10,7 +9,7 @@ #include "Utility/misc.h" #ifdef WITH_CUDA -#include "EncoderInterface.h" + #include "EncoderInterface.h" #endif #include "types.h" @@ -21,48 +20,61 @@ class YuvConverter { private: - cv::Mat& inImg; - unsigned char* out0; - unsigned char* out1; - unsigned char* out2; + cv::Mat& inImg; + unsigned char* out0; + unsigned char* out1; + unsigned char* out2; + public: - YuvConverter(cv::Mat& inputImgage - , unsigned char* o0 - , unsigned char* o1 - , unsigned char* o2) - : inImg(inputImgage), out0(o0), out1(o1), out2(o2) { - } - void convert(); - void convert420(); + YuvConverter(cv::Mat& inputImgage, + unsigned char* o0, + unsigned char* o1, + unsigned char* o2) + : inImg(inputImgage) + , out0(o0) + , out1(o1) + , out2(o2) + { + } + void convert(); + void convert420(); }; -class ImageBuffer { +class ImageBuffer +{ public: - std::shared_ptr _img; - int _needsConversion; - - ImageBuffer(std::shared_ptr pimg, int ncv) : _img(pimg), _needsConversion(ncv) { - - } - ImageBuffer(){} - - int getWidth() { - if (_img) - return _img->size().width; - return -1; - } - - int getHeight() { - if (_img) - return _img->size().height; - return -1; - } + std::shared_ptr _img; + int _needsConversion; + + ImageBuffer(std::shared_ptr pimg, int ncv) + : _img(pimg) + , _needsConversion(ncv) + { + } + ImageBuffer() + { + } + + int getWidth() + { + if (_img) + return _img->size().width; + return -1; + } + + int getHeight() + { + if (_img) + return _img->size().height; + return -1; + } }; -class MutexLinkedList { +class MutexLinkedList +{ public: - std::list> images; - std::mutex _Access; + std::list> images; + std::mutex _Access; void push(std::shared_ptr imbuffer, bool dropFrames = false); @@ -70,79 +82,82 @@ class MutexLinkedList { void clear(); + // Simple function to get the current size of the buffer in elements. + // Locks the data structure. + virtual int size(); - //Simple function to get the current size of the buffer in elements. - //Locks the data structure. - virtual int size(); - - MutexLinkedList() {} - ~MutexLinkedList() {} + MutexLinkedList() + { + } + ~MutexLinkedList() + { + } }; class Worker : public QThread { - Q_OBJECT + Q_OBJECT public: - MutexLinkedList ll; - bool m_abort; + MutexLinkedList ll; + bool m_abort; #ifdef WITH_CUDA - std::shared_ptr m_nvEncoder; + std::shared_ptr m_nvEncoder; #endif - std::shared_ptr m_vWriter; + std::shared_ptr m_vWriter; - Worker() { - m_abort = false; - }; - void run(); + Worker() + { + m_abort = false; + }; + void run(); - public slots: - - //void doWork(const QString ¶meter); +public slots: + // void doWork(const QString ¶meter); }; class VideoCoder : public QObject { - Q_OBJECT + Q_OBJECT public: - VideoCoder(double fps, Config *cfg) { + VideoCoder(double fps, Config* cfg) + { #ifdef WITH_CUDA - m_nvEncoder = std::make_shared(); + m_nvEncoder = std::make_shared(); #endif - m_recType = 0; - m_recording = false; - m_dropFrames = false; - m_fps = fps; - _cfg = cfg; - } + m_recType = 0; + m_recording = false; + m_dropFrames = false; + m_fps = fps; + _cfg = cfg; + } - ~VideoCoder() { - stop(); - } + ~VideoCoder() + { + stop(); + } - int toggle(int w, int h, double fps = -1); + int toggle(int w, int h, double fps = -1); - void add(std::shared_ptr m, int needsConversion = 0); + void add(std::shared_ptr m, int needsConversion = 0); - int start(); - void stop(); + int start(); + void stop(); #ifdef WITH_CUDA - std::shared_ptr m_nvEncoder; + std::shared_ptr m_nvEncoder; #endif private: - - std::shared_ptr worker; - std::shared_ptr vWriter; - int m_recType; - int m_recording; - bool m_dropFrames; - int m_qp; - double m_fps; - Config *_cfg; + std::shared_ptr worker; + std::shared_ptr vWriter; + int m_recType; + int m_recording; + bool m_dropFrames; + int m_qp; + double m_fps; + Config* _cfg; signals: - void operate(const QString &); + void operate(const QString&); }; - diff --git a/Src/util/camera/base.h b/Src/util/camera/base.h index 0998ba98..31cfa079 100644 --- a/Src/util/camera/base.h +++ b/Src/util/camera/base.h @@ -6,17 +6,17 @@ enum class CameraType { - OpenCV, + OpenCV, #if HAS_PYLON - Pylon, + Pylon, #endif }; struct CameraSelector { - CameraType type; - int index; - std::string name; + CameraType type; + int index; + std::string name; }; Q_DECLARE_METATYPE(CameraSelector); @@ -24,17 +24,34 @@ Q_DECLARE_METATYPE(CameraSelector); class CameraConfiguration { public: - CameraConfiguration() : - _selector{CameraType::OpenCV, 0}, _width(-1), _height(-1), _fps(30), _recordInput(false), _fourcc("X264") { - } - CameraConfiguration(CameraSelector p_selector, int p_width, int p_height, double p_fps, bool p_recordInput, std::string p_fourcc) : - _selector(p_selector), _width(p_width), _height(p_height), _fps(p_fps), _recordInput(p_recordInput), _fourcc(p_fourcc) { - } + CameraConfiguration() + : _selector{CameraType::OpenCV, 0} + , _width(-1) + , _height(-1) + , _fps(30) + , _recordInput(false) + , _fourcc("X264") + { + } + CameraConfiguration(CameraSelector p_selector, + int p_width, + int p_height, + double p_fps, + bool p_recordInput, + std::string p_fourcc) + : _selector(p_selector) + , _width(p_width) + , _height(p_height) + , _fps(p_fps) + , _recordInput(p_recordInput) + , _fourcc(p_fourcc) + { + } - CameraSelector _selector; - int _width; - int _height; - bool _recordInput; - double _fps; - std::string _fourcc; + CameraSelector _selector; + int _width; + int _height; + bool _recordInput; + double _fps; + std::string _fourcc; }; diff --git a/Src/util/camera/pylon.cpp b/Src/util/camera/pylon.cpp index 757fb398..a2d0c0c8 100644 --- a/Src/util/camera/pylon.cpp +++ b/Src/util/camera/pylon.cpp @@ -2,40 +2,38 @@ #if HAS_PYLON -#include + #include -Pylon::IPylonDevice *getPylonDevice(int index) +Pylon::IPylonDevice* getPylonDevice(int index) { - Pylon::PylonAutoInitTerm pylon; - auto &factory = Pylon::CTlFactory::GetInstance(); - Pylon::DeviceInfoList_t devices; - factory.EnumerateDevices(devices); - if (0 <= index && index < devices.size()) - return factory.CreateDevice(devices[index]); - throw std::out_of_range("No such Pylon camera available"); + Pylon::PylonAutoInitTerm pylon; + auto& factory = Pylon::CTlFactory::GetInstance(); + Pylon::DeviceInfoList_t devices; + factory.EnumerateDevices(devices); + if (0 <= index && index < devices.size()) + return factory.CreateDevice(devices[index]); + throw std::out_of_range("No such Pylon camera available"); } cv::Mat toOpenCV(Pylon::CGrabResultPtr image) { - auto size = cv::Size{static_cast(image->GetWidth()), static_cast(image->GetHeight())}; - auto data = image->GetBuffer(); + auto size = cv::Size{static_cast(image->GetWidth()), + static_cast(image->GetHeight())}; + auto data = image->GetBuffer(); - switch (image->GetPixelType()) - { - case Pylon::PixelType_Mono8: - { - auto mat = cv::Mat{size, CV_8UC1, data}; - cv::cvtColor(mat, mat, cv::COLOR_GRAY2BGR); - return mat; - } - case Pylon::PixelType_BayerBG8: - { - auto mat = cv::Mat{size, CV_8UC1, data}; - cv::cvtColor(mat, mat, cv::COLOR_BayerBG2BGR_EA); - return mat; - } - default: - throw std::logic_error("Pixel type support not implemented"); - } + switch (image->GetPixelType()) { + case Pylon::PixelType_Mono8: { + auto mat = cv::Mat{size, CV_8UC1, data}; + cv::cvtColor(mat, mat, cv::COLOR_GRAY2BGR); + return mat; + } + case Pylon::PixelType_BayerBG8: { + auto mat = cv::Mat{size, CV_8UC1, data}; + cv::cvtColor(mat, mat, cv::COLOR_BayerBG2BGR_EA); + return mat; + } + default: + throw std::logic_error("Pixel type support not implemented"); + } } #endif diff --git a/Src/util/camera/pylon.h b/Src/util/camera/pylon.h index 59cac525..fc9b364b 100644 --- a/Src/util/camera/pylon.h +++ b/Src/util/camera/pylon.h @@ -2,12 +2,12 @@ #if HAS_PYLON -#include "util/camera/base.h" + #include "util/camera/base.h" -#include -#include + #include + #include Pylon::IPylonDevice* getPylonDevice(int index); -cv::Mat toOpenCV(Pylon::CGrabResultPtr image); +cv::Mat toOpenCV(Pylon::CGrabResultPtr image); #endif diff --git a/Src/util/stdext.h b/Src/util/stdext.h index ada7c5d7..38b2114a 100644 --- a/Src/util/stdext.h +++ b/Src/util/stdext.h @@ -7,40 +7,47 @@ */ #include -#if (!defined(_MSC_VER) && __cplusplus <= 201103L) || (defined(_MSC_VER) && _MSC_VER < 1800) -#include -#include -#include - -namespace std { -template struct _Unique_if { - typedef unique_ptr _Single_object; -}; - -template struct _Unique_if { - typedef unique_ptr _Unknown_bound; -}; - -template struct _Unique_if { - typedef void _Known_bound; -}; - -template -typename _Unique_if::_Single_object -make_unique(Args &&... args) { - return unique_ptr(new T(std::forward(args)...)); -} - -template -typename _Unique_if::_Unknown_bound -make_unique(size_t n) { - typedef typename remove_extent::type U; - return unique_ptr(new U[n]()); -} - -template -typename _Unique_if::_Known_bound -make_unique(Args &&...) = delete; +#if (!defined(_MSC_VER) && __cplusplus <= 201103L) || \ + (defined(_MSC_VER) && _MSC_VER < 1800) + #include + #include + #include + +namespace std +{ + template + struct _Unique_if + { + typedef unique_ptr _Single_object; + }; + + template + struct _Unique_if + { + typedef unique_ptr _Unknown_bound; + }; + + template + struct _Unique_if + { + typedef void _Known_bound; + }; + + template + typename _Unique_if::_Single_object make_unique(Args&&... args) + { + return unique_ptr(new T(std::forward(args)...)); + } + + template + typename _Unique_if::_Unknown_bound make_unique(size_t n) + { + typedef typename remove_extent::type U; + return unique_ptr(new U[n]()); + } + + template + typename _Unique_if::_Known_bound make_unique(Args&&...) = delete; } #endif diff --git a/Src/util/types.h b/Src/util/types.h index 4d303447..0fd514fd 100644 --- a/Src/util/types.h +++ b/Src/util/types.h @@ -1,42 +1,41 @@ #pragma once - #include #include -namespace BiotrackerTypes{ - enum AreaType { - NONE = -1, - RECT = 0, +namespace BiotrackerTypes +{ + enum AreaType + { + NONE = -1, + RECT = 0, APPERTURE = 1, - COMBINED = 2 + COMBINED = 2 }; } namespace AREADESCRIPTOR { - const std::string CN_ARENA = "TRACKERPARAM/CN_CORNERS_ARENA"; - const std::string CN_APPERTURE = "TRACKERPARAM/CN_CORNERS_APPERTURE"; - const std::string CN_APPERTURE_TYPE = "TRACKERPARAM/CN_CORNERS_APPERTURE_TYPE"; + const std::string CN_ARENA = "TRACKERPARAM/CN_CORNERS_ARENA"; + const std::string CN_APPERTURE = "TRACKERPARAM/CN_CORNERS_APPERTURE"; + const std::string CN_APPERTURE_TYPE = + "TRACKERPARAM/CN_CORNERS_APPERTURE_TYPE"; const std::string DISP_AREA = "TRACKERPARAM/DISPLAY_TRACKING_AREA"; const std::string DISP_RECT = "TRACKERPARAM/DISPLAY_RECTIFICATION_AREA"; - const std::string RECT_W = "RECTIFICATION/WIDTH"; - const int RECT_W_DEFAULT = 100; - const std::string RECT_H = "RECTIFICATION/HEIGHT"; - const int RECT_H_DEFAULT = 100; + const std::string RECT_W = "RECTIFICATION/WIDTH"; + const int RECT_W_DEFAULT = 100; + const std::string RECT_H = "RECTIFICATION/HEIGHT"; + const int RECT_H_DEFAULT = 100; } - const std::vector> codecList = { - std::pair("X264 (CPU)", "X264"), + std::pair("X264 (CPU)", "X264"), #ifdef WITH_CUDA - std::pair("X264 (GPU)", "X264GPU") + std::pair("X264 (GPU)", "X264GPU") #endif }; -const std::vector exporterList = { - std::string("CSV"), - std::string("Serialize"), - std::string("Json") -}; +const std::vector exporterList = {std::string("CSV"), + std::string("Serialize"), + std::string("Json")}; From 0da23b32adaf61bb48f446985b42ff17aeabec45 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Wed, 3 Aug 2022 13:45:55 +0200 Subject: [PATCH 170/171] Replace std::shared_ptr with cv::Mat cv::Mat is already reference counted. Follow interface changes, allow selection of tracking images in main app --- Src/Controller/ControllerAreaDescriptor.cpp | 6 +- Src/Controller/ControllerPlayer.cpp | 8 +- Src/Controller/ControllerPlayer.h | 4 +- Src/Controller/ControllerPlugin.cpp | 1340 +++++---- Src/Controller/ControllerPlugin.h | 7 +- Src/Controller/ControllerTextureObject.cpp | 90 +- Src/Controller/ControllerTextureObject.h | 15 +- Src/IStates/IPlayerState.cpp | 2 +- Src/IStates/IPlayerState.h | 8 +- Src/Model/AreaDescriptor/AreaInfo.cpp | 12 +- Src/Model/ImageStream.cpp | 57 +- Src/Model/ImageStream.h | 12 +- Src/Model/MediaPlayer.cpp | 23 +- Src/Model/MediaPlayer.h | 34 +- .../PlayerParameters.h | 4 +- Src/Model/TextureObject.cpp | 20 +- Src/Model/TextureObject.h | 2 +- Src/View/MainWindow.cpp | 2413 +++++++++-------- Src/View/MainWindow.h | 4 +- Src/main.cpp | 233 +- Src/util/VideoCoder.cpp | 2 +- Src/util/VideoCoder.h | 11 +- 22 files changed, 2183 insertions(+), 2124 deletions(-) diff --git a/Src/Controller/ControllerAreaDescriptor.cpp b/Src/Controller/ControllerAreaDescriptor.cpp index 6dac7474..ae0ff9e8 100644 --- a/Src/Controller/ControllerAreaDescriptor.cpp +++ b/Src/Controller/ControllerAreaDescriptor.cpp @@ -121,9 +121,9 @@ void ControllerAreaDescriptor::rcvPlayerParameters( _currentFilename = parameters->m_CurrentFilename; // Set area descriptor dimensions - AreaDescriptor* ad = static_cast(m_ViewApperture); - std::shared_ptr m = parameters->m_CurrentFrame; - if (ad && m != nullptr) { + auto ad = static_cast(m_ViewApperture); + auto m = parameters->m_CurrentFrame; + if (ad && m) { _w = m->size().width; _h = m->size().height; ad->setDimensions(_w, _h); diff --git a/Src/Controller/ControllerPlayer.cpp b/Src/Controller/ControllerPlayer.cpp index 14f2bee8..664c2b56 100644 --- a/Src/Controller/ControllerPlayer.cpp +++ b/Src/Controller/ControllerPlayer.cpp @@ -73,19 +73,17 @@ void ControllerPlayer::setGoToFrame(int frame) qobject_cast(m_Model)->goToFrame(frame); } -void ControllerPlayer::receiveRenderImage(std::shared_ptr mat, - QString name) +void ControllerPlayer::receiveRenderImage(cv::Mat img, QString name) { IController* ctr = m_BioTrackerContext->requestController( ENUMS::CONTROLLERTYPE::TEXTUREOBJECT); QPointer ctrTextureObject = qobject_cast(ctr); - ctrTextureObject->receiveCvMat(mat, name); + ctrTextureObject->updateTexture(name, img); } -void ControllerPlayer::receiveImageToTracker(std::shared_ptr mat, - uint number) +void ControllerPlayer::receiveImageToTracker(cv::Mat mat, uint number) { IController* ctr = m_BioTrackerContext->requestController( ENUMS::CONTROLLERTYPE::PLUGIN); diff --git a/Src/Controller/ControllerPlayer.h b/Src/Controller/ControllerPlayer.h index 040e65c7..dc5da90f 100644 --- a/Src/Controller/ControllerPlayer.h +++ b/Src/Controller/ControllerPlayer.h @@ -107,12 +107,12 @@ public Q_SLOTS: * MediaPlayer class and hands it over to the ControllerTextureObject for * rendering. */ - void receiveRenderImage(std::shared_ptr mat, QString name); + void receiveRenderImage(cv::Mat mat, QString name); /** * This SLOT receives a cv::Mat and its frame number and hands it over to * the ControllerPlugin for Tracking in the BioTracker Plugin. */ - void receiveImageToTracker(std::shared_ptr mat, uint number); + void receiveImageToTracker(cv::Mat mat, uint number); /** * This SLOT receives a framenumber and hands it over to the * ControllerTrackedComponentCore for visualizing in the main app. diff --git a/Src/Controller/ControllerPlugin.cpp b/Src/Controller/ControllerPlugin.cpp index cf04edd2..6b5f0293 100644 --- a/Src/Controller/ControllerPlugin.cpp +++ b/Src/Controller/ControllerPlugin.cpp @@ -1,671 +1,669 @@ -#include "ControllerPlugin.h" - -#include "Controller/ControllerPlayer.h" -#include "Controller/ControllerTextureObject.h" -#include "Controller/ControllerTrackedComponentCore.h" -#include "ControllerMainWindow.h" -#include "QDebug" -#include "util/types.h" -#include "ControllerDataExporter.h" -#include "ControllerAreaDescriptor.h" -#include "Controller/ControllerCoreParameter.h" -#include "Controller/ControllerCommands.h" - -#define REGISTRY_PATH "SOFTWARE\\FUBioroboticsLab\\BioTracker\\Plugins" -#define TRACKER_SUFFIX ".bio_tracker" - -ControllerPlugin::ControllerPlugin(QObject* parent, - IBioTrackerContext* context, - ENUMS::CONTROLLERTYPE ctr) -: IControllerCfg(parent, context, ctr) -{ - m_BioTrackerPlugin = NULL; - - m_TrackingThread = new QThread(this); - m_TrackingThread->setObjectName("TrackingThread"); - m_TrackingThread->start(); -} - -ControllerPlugin::~ControllerPlugin() -{ - - // They might not exist (no plugins available!) - if (m_BioTrackerPlugin) - delete m_BioTrackerPlugin; - if (pluginLoader) - delete pluginLoader; - - m_TrackingThread->quit(); - m_TrackingThread->wait(); -} - -void ControllerPlugin::addToPluginList(QString str) -{ - - std::string s = str.toStdString(); - pluginLoader->addToPluginList(str, TRACKER_SUFFIX); - - // Add Plugin name to Main Window - IController* ctrA = m_BioTrackerContext->requestController( - ENUMS::CONTROLLERTYPE::MAINWINDOW); - QPointer ctrMainWindow = - qobject_cast(ctrA); - - ctrMainWindow->setTrackerList(pluginLoader->getPluginList(), - pluginLoader->getCurrentPluginName()); -} - -void ControllerPlugin::loadPluginFromFileName(QString str) -{ - - if (pluginLoader->loadPluginFromFilename(str)) { - m_BioTrackerPlugin = qobject_cast( - pluginLoader->getPluginInstance()); - createPlugin(); - - // Add Plugin name to Main Window - IController* ctrA = m_BioTrackerContext->requestController( - ENUMS::CONTROLLERTYPE::MAINWINDOW); - QPointer ctrMainWindow = - qobject_cast(ctrA); - - ctrMainWindow->setTrackerList(pluginLoader->getPluginList(), - pluginLoader->getCurrentPluginName()); - - // Add Tracker Parameter to Main Window - IView* parms = m_BioTrackerPlugin->getTrackerParameterWidget(); - ctrMainWindow->setTrackerParamterWidget(parms); - - // Add Tracker tracked components (Elements) to Main Window - IView* elems = m_BioTrackerPlugin->getTrackerElementsWidget(); - ctrMainWindow->setTrackerElementsWidget(elems); - - IController* ctrB = m_BioTrackerContext->requestController( - ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); - QPointer ctrTrackedComponentCore = - qobject_cast(ctrB); - - // Add Tracker tracked components model to - // ControllerTrackedComponentCore - ctrTrackedComponentCore->addModel( - m_BioTrackerPlugin->getTrackerComponentModel()); - // Add tracked component view to main window - ctrMainWindow->setCoreElementsWidget( - ctrTrackedComponentCore->getTrackingElementsWidgetCore()); - - IController* ctrDE = m_BioTrackerContext->requestController( - ENUMS::CONTROLLERTYPE::DATAEXPORT); - QPointer ctrDataExp = - qobject_cast(ctrDE); - ctrDataExp->setDataStructure( - m_BioTrackerPlugin->getTrackerComponentModel()); - ctrDataExp->setComponentFactory( - m_BioTrackerPlugin->getComponentFactory()); - - m_BioTrackerPlugin->sendCorePermissions(); - } else { - qWarning() << "Failed to load plugin from filename!"; - } -} - -void ControllerPlugin::selectPlugin(QString str) -{ - if (str.isEmpty()) - return; - - if (pluginLoader->getCurrentPluginName() != str) - loadPluginFromFileName(pluginLoader->getPluginMap().find(str)->second); -} - -void ControllerPlugin::createModel() -{ - m_Model = nullptr; - pluginLoader = new PluginLoader(this); -} - -void ControllerPlugin::createView() -{ -} - -void ControllerPlugin::connectModelToController() -{ -} - -void ControllerPlugin::loadPluginsFromPluginSubfolder() -{ - - ////////////// - QDir d(_cfg->DirPlugins); - d.setFilter(QDir::Filter::Files); - QStringList nameFilter; - QFileInfoList fl = d.entryInfoList(nameFilter, QDir::Filter::Files); - - // Grab list of behaviors from config & registry - std::vector list = _cfg->UseRegistryLocations == 1 - ? PluginLoader::queryRegistryBehaviors( - REGISTRY_PATH) - : std::vector(); - // Search directories - std::vector filesFromFolders = - PluginLoader::searchDirectoriesForPlugins(list, TRACKER_SUFFIX); - for (auto x : filesFromFolders) - addToPluginList(x.c_str()); - - foreach (QFileInfo fi, fl) { - QString s = fi.absoluteFilePath(); - addToPluginList(s); - } - - // Load plugins as per CLI - if (!_cfg->UsePlugins.isEmpty()) { - addToPluginList(_cfg->UsePlugins.toStdString().c_str()); - } -} - -void ControllerPlugin::connectControllerToController() -{ - - // Add Plugin name to Main Window - IController* ctrA = m_BioTrackerContext->requestController( - ENUMS::CONTROLLERTYPE::MAINWINDOW); - QPointer ctrMainWindow = - qobject_cast(ctrA); - - ctrMainWindow->deactiveTrackingCheckBox(); - - loadPluginsFromPluginSubfolder(); - - // connect ControllerTrackedComponentView - IController* ctrB = m_BioTrackerContext->requestController( - ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); - QPointer ctrTrackedComponentCore = - qobject_cast(ctrB); - - QObject::connect(this, - SIGNAL(emitUpdateView()), - ctrTrackedComponentCore, - SLOT(receiveUpdateView())); - - // connect ControllerCommands - IController* ctrD = m_BioTrackerContext->requestController( - ENUMS::CONTROLLERTYPE::COMMANDS); - QPointer ctrCommands = - qobject_cast(ctrD); - - QObject::connect(ctrCommands, - SIGNAL(emitAddTrajectory(QPoint)), - this, - SLOT(receiveAddTrajectory(QPoint)), - Qt::DirectConnection); - QObject::connect(ctrCommands, - SIGNAL(emitRemoveTrajectory(IModelTrackedTrajectory*)), - this, - SLOT(receiveRemoveTrajectory(IModelTrackedTrajectory*)), - Qt::DirectConnection); - QObject::connect(ctrCommands, - SIGNAL(emitRemoveTrajectoryId(int)), - this, - SLOT(receiveRemoveTrajectoryId(int)), - Qt::DirectConnection); - QObject::connect( - ctrCommands, - SIGNAL(emitRemoveTrackEntity(IModelTrackedTrajectory*, uint)), - this, - SLOT(receiveRemoveTrackEntity(IModelTrackedTrajectory*, uint)), - Qt::DirectConnection); - QObject::connect(ctrCommands, - SIGNAL(emitValidateTrajectory(int)), - this, - SLOT(receiveValidateTrajectory(int)), - Qt::DirectConnection); - QObject::connect( - ctrCommands, - SIGNAL(emitValidateEntity(IModelTrackedTrajectory*, uint)), - this, - SLOT(receiveValidateEntity(IModelTrackedTrajectory*, uint)), - Qt::DirectConnection); - QObject::connect( - ctrCommands, - SIGNAL(emitMoveElement(IModelTrackedTrajectory*, uint, QPoint, int)), - this, - SLOT(receiveMoveElement(IModelTrackedTrajectory*, uint, QPoint, int)), - Qt::DirectConnection); - QObject::connect(ctrCommands, - SIGNAL(emitSwapIds(IModelTrackedTrajectory*, - IModelTrackedTrajectory*)), - this, - SLOT(receiveSwapIds(IModelTrackedTrajectory*, - IModelTrackedTrajectory*)), - Qt::DirectConnection); - QObject::connect( - ctrCommands, - SIGNAL(emitToggleFixTrack(IModelTrackedTrajectory*, bool)), - this, - SLOT(receiveToggleFixTrack(IModelTrackedTrajectory*, bool)), - Qt::DirectConnection); - QObject::connect( - ctrCommands, - SIGNAL(emitEntityRotation(IModelTrackedTrajectory*, double, uint)), - this, - SLOT(receiveEntityRotation(IModelTrackedTrajectory*, double, uint)), - Qt::DirectConnection); - - // connect ControllerPlayer - IController* ctrC = m_BioTrackerContext->requestController( - ENUMS::CONTROLLERTYPE::PLAYER); - QPointer ctrPlayer = qobject_cast( - ctrC); - QObject::connect(ctrPlayer, - SIGNAL(emitPauseState(bool)), - this, - SLOT(receivePauseState(bool)), - Qt::DirectConnection); - - QObject::connect(ctrPlayer, - SIGNAL(signalCurrentFrameNumberToPlugin(uint)), - this, - SLOT(receiveCurrentFrameNumberToPlugin(uint)), - Qt::DirectConnection); -} - -void ControllerPlugin::createPlugin() -{ - m_BioTrackerPlugin = qobject_cast( - pluginLoader->getPluginInstance()); - if (!m_BioTrackerPlugin) { - qFatal("Error at loading plugin."); - } - m_BioTrackerPlugin->createPlugin(); - - m_BioTrackerPlugin->moveToThread(m_TrackingThread); - - connectPlugin(); - - IController* ctrAreaDesc = m_BioTrackerContext->requestController( - ENUMS::CONTROLLERTYPE::AREADESCRIPTOR); - ControllerAreaDescriptor* ctAreaDesc = - qobject_cast(ctrAreaDesc); - ctAreaDesc->triggerUpdateAreaDescriptor(); - - Q_EMIT signalCurrentFrameNumberToPlugin(m_currentFrameNumber); -} - -void ControllerPlugin::connectPlugin() -{ - IController* ctrA = m_BioTrackerContext->requestController( - ENUMS::CONTROLLERTYPE::PLAYER); - QPointer ctrPlayer = qobject_cast( - ctrA); - - IModel* model = ctrPlayer->getModel(); - - IController* ctrB = m_BioTrackerContext->requestController( - ENUMS::CONTROLLERTYPE::TEXTUREOBJECT); - ControllerTextureObject* ctrTexture = - qobject_cast(ctrB); - - IController* ctrAreaDesc = m_BioTrackerContext->requestController( - ENUMS::CONTROLLERTYPE::AREADESCRIPTOR); - ControllerAreaDescriptor* ctAreaDesc = - qobject_cast(ctrAreaDesc); - - IController* ctrData = m_BioTrackerContext->requestController( - ENUMS::CONTROLLERTYPE::DATAEXPORT); - ControllerDataExporter* ctDataEx = qobject_cast( - ctrData); - - IController* ctrC = m_BioTrackerContext->requestController( - ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); - ControllerTrackedComponentCore* ctrCompView = - qobject_cast(ctrC); - - IController* ctrD = m_BioTrackerContext->requestController( - ENUMS::CONTROLLERTYPE::COREPARAMETER); - ControllerCoreParameter* ctrCoreParam = - qobject_cast(ctrD); - - IController* ctrE = m_BioTrackerContext->requestController( - ENUMS::CONTROLLERTYPE::MAINWINDOW); - QPointer ctrMainWindow = - qobject_cast(ctrE); - - QObject* obj = dynamic_cast(m_BioTrackerPlugin); - - QObject::connect(obj, - SIGNAL(emitTrackingDone(uint)), - ctDataEx, - SLOT(receiveTrackingDone(uint))); - - QObject::connect(obj, - SIGNAL(emitCvMat(std::shared_ptr, QString)), - ctrTexture, - SLOT(receiveCvMat(std::shared_ptr, QString))); - - QObject::connect(obj, - SIGNAL(emitTrackingDone(uint)), - ctrCompView, - SLOT(receiveVisualizeTrackingModel(uint))); - - QObject::connect(obj, - SIGNAL(emitChangeDisplayImage(QString)), - ctrPlayer, - SLOT(receiveChangeDisplayImage(QString))); - - QObject::connect(ctAreaDesc, - SIGNAL(updateAreaDescriptor(IModelAreaDescriptor*)), - obj, - SLOT(receiveAreaDescriptor(IModelAreaDescriptor*))); - - QObject::connect( - obj, - SIGNAL(emitCorePermission(std::pair)), - ctrCompView, - SLOT(setCorePermission(std::pair))); - - QObject::connect( - obj, - SIGNAL(emitCorePermission(std::pair)), - ctrCoreParam, - SLOT(setCorePermission(std::pair))); - - QObject::connect( - obj, - SIGNAL(emitCorePermission(std::pair)), - ctrMainWindow, - SLOT(setCorePermission(std::pair))); - - QObject::connect(obj, - SIGNAL(emitDimensionUpdate(int, int)), - ctrCompView, - SIGNAL(emitDimensionUpdate(int, int))); - - // data model actions - QObject::connect(this, - SIGNAL(emitRemoveTrajectory(IModelTrackedTrajectory*)), - obj, - SLOT(receiveRemoveTrajectory(IModelTrackedTrajectory*))); - QObject::connect( - this, - SIGNAL(emitRemoveTrackEntity(IModelTrackedTrajectory*, uint)), - obj, - SIGNAL(emitRemoveTrackEntity(IModelTrackedTrajectory*, uint))); - QObject::connect(this, - SIGNAL(emitAddTrajectory(QPoint)), - obj, - SLOT(receiveAddTrajectory(QPoint))); - QObject::connect( - this, - SIGNAL(emitMoveElement(IModelTrackedTrajectory*, uint, QPoint)), - obj, - SIGNAL(emitMoveElement(IModelTrackedTrajectory*, uint, QPoint))); - QObject::connect(this, - SIGNAL(emitSwapIds(IModelTrackedTrajectory*, - IModelTrackedTrajectory*)), - obj, - SLOT(receiveSwapIds(IModelTrackedTrajectory*, - IModelTrackedTrajectory*))); - QObject::connect( - this, - SIGNAL(emitToggleFixTrack(IModelTrackedTrajectory*, bool)), - obj, - SIGNAL(emitToggleFixTrack(IModelTrackedTrajectory*, bool))); - - QObject::connect(this, - SIGNAL(emitRemoveTrajectoryId(int)), - obj, - SIGNAL(emitRemoveTrajectoryId(int))); - QObject::connect(this, - SIGNAL(emitValidateTrajectory(int)), - obj, - SIGNAL(emitValidateTrajectory(int))); - QObject::connect( - this, - SIGNAL(emitValidateEntity(IModelTrackedTrajectory*, uint)), - obj, - SIGNAL(emitValidateEntity(IModelTrackedTrajectory*, uint))); - QObject::connect( - this, - SIGNAL(emitEntityRotation(IModelTrackedTrajectory*, double, uint)), - obj, - SIGNAL(emitEntityRotation(IModelTrackedTrajectory*, double, uint))); - - connect(this, - &ControllerPlugin::frameRetrieved, - m_BioTrackerPlugin, - &IBioTrackerPlugin::receiveCurrentFrameFromMainApp); - QObject::connect(this, - SIGNAL(signalCurrentFrameNumberToPlugin(uint)), - obj, - SLOT(receiveCurrentFrameNumberFromMainApp(uint))); -} - -void ControllerPlugin::disconnectPlugin() -{ -} - -// first send all the commands currently in the command queue then the next -// image can be sent -void ControllerPlugin::sendCurrentFrameToPlugin(std::shared_ptr mat, - uint number) -{ - m_currentFrameNumber = number; - - // Prevent calling the plugin if none is loaded - if (m_BioTrackerPlugin) { - while (!m_editQueue.isEmpty()) { - queueElement edit = m_editQueue.dequeue(); - - switch (edit.type) { - case EDIT::REMOVE_TRACK: - emitRemoveTrajectory(edit.trajectory0); - break; - case EDIT::REMOVE_TRACK_ID: - emitRemoveTrajectoryId(edit.id); - break; - case EDIT::REMOVE_ENTITY: - emitRemoveTrackEntity(edit.trajectory0, edit.frameNumber); - break; - case EDIT::ADD: - emitAddTrajectory(edit.pos); - break; - case EDIT::MOVE: - emitMoveElement(edit.trajectory0, edit.frameNumber, edit.pos); - break; - case EDIT::SWAP: - emitSwapIds(edit.trajectory0, edit.trajectory1); - break; - case EDIT::FIX: - emitToggleFixTrack(edit.trajectory0, edit.toggle); - break; - case EDIT::VALIDATE: - emitValidateTrajectory(edit.id); - break; - case EDIT::VALIDATE_ENTITY: - emitValidateEntity(edit.trajectory0, edit.frameNumber); - break; - case EDIT::ROTATE_ENTITY: - emitEntityRotation(edit.trajectory0, - edit.angle, - edit.frameNumber); - break; - } - } - emit frameRetrieved(mat, number); - } -} - -//############################SLOTS################################################## - -// receivers of commands - -void ControllerPlugin::receiveRemoveTrajectory( - IModelTrackedTrajectory* trajectory) -{ - if (m_paused) { - emitRemoveTrajectory(trajectory); - emitUpdateView(); - } else { - queueElement removeTrackEdit; - removeTrackEdit.type = EDIT::REMOVE_TRACK; - removeTrackEdit.trajectory0 = trajectory; - m_editQueue.enqueue(removeTrackEdit); - } -} - -void ControllerPlugin::receiveRemoveTrajectoryId(int id) -{ - if (m_paused) { - emitRemoveTrajectoryId(id); - emitUpdateView(); - } else { - queueElement removeTrackEdit; - removeTrackEdit.type = EDIT::REMOVE_TRACK_ID; - removeTrackEdit.id = id; - m_editQueue.enqueue(removeTrackEdit); - } -} - -void ControllerPlugin::receiveRemoveTrackEntity( - IModelTrackedTrajectory* trajectory, - uint frameNumber) -{ - if (m_paused) { - emitRemoveTrackEntity(trajectory, frameNumber); - emitUpdateView(); - } else { - queueElement removeEntityEdit; - removeEntityEdit.type = EDIT::REMOVE_ENTITY; - removeEntityEdit.trajectory0 = trajectory; - removeEntityEdit.frameNumber = frameNumber; - m_editQueue.enqueue(removeEntityEdit); - } -} - -void ControllerPlugin::receiveAddTrajectory(QPoint pos) -{ - if (m_paused) { - emitAddTrajectory(pos); - emitUpdateView(); - } else { - queueElement addEdit; - addEdit.type = EDIT::ADD; - addEdit.pos = pos; - m_editQueue.enqueue(addEdit); - } -} - -void ControllerPlugin::receiveMoveElement(IModelTrackedTrajectory* trajectory, - uint frameNumber, - QPoint pos, - int toMove) -{ - if (m_paused) { - emitMoveElement(trajectory, frameNumber, pos); - // only emit the update after the last move is processed - if (toMove == 1) { - emitUpdateView(); - } - } else { - queueElement moveEdit; - moveEdit.type = EDIT::MOVE; - moveEdit.trajectory0 = trajectory; - moveEdit.pos = pos; - moveEdit.frameNumber = frameNumber; - m_editQueue.enqueue(moveEdit); - } -} - -void ControllerPlugin::receiveSwapIds(IModelTrackedTrajectory* trajectory0, - IModelTrackedTrajectory* trajectory1) -{ - if (m_paused) { - emitSwapIds(trajectory0, trajectory1); - emitUpdateView(); - } else { - queueElement swapEdit; - swapEdit.type = EDIT::SWAP; - swapEdit.trajectory0 = trajectory0; - swapEdit.trajectory1 = trajectory1; - m_editQueue.enqueue(swapEdit); - } -} - -void ControllerPlugin::receiveValidateTrajectory(int id) -{ - if (m_paused) { - emitValidateTrajectory(id); - emitUpdateView(); - } else { - queueElement validateEdit; - validateEdit.type = EDIT::VALIDATE; - validateEdit.id = id; - m_editQueue.enqueue(validateEdit); - } -} - -void ControllerPlugin::receiveValidateEntity( - IModelTrackedTrajectory* trajectory, - uint frameNumber) -{ - if (m_paused) { - emitValidateEntity(trajectory, frameNumber); - emitUpdateView(); - } else { - queueElement validateEntityEdit; - validateEntityEdit.type = EDIT::VALIDATE_ENTITY; - validateEntityEdit.trajectory0 = trajectory; - validateEntityEdit.frameNumber = frameNumber; - m_editQueue.enqueue(validateEntityEdit); - } -} - -void ControllerPlugin::receiveToggleFixTrack( - IModelTrackedTrajectory* trajectory, - bool toggle) -{ - if (m_paused) { - emitToggleFixTrack(trajectory, toggle); - emitUpdateView(); - } else { - queueElement fixEdit; - fixEdit.type = EDIT::FIX; - fixEdit.trajectory0 = trajectory; - fixEdit.toggle = toggle; - m_editQueue.enqueue(fixEdit); - } -} - -void ControllerPlugin::receiveEntityRotation( - IModelTrackedTrajectory* trajectory, - double angle, - uint frameNumber) -{ - if (m_paused) { - emitEntityRotation(trajectory, angle, frameNumber); - emitUpdateView(); - } else { - queueElement rotEdit; - rotEdit.type = EDIT::ROTATE_ENTITY; - rotEdit.trajectory0 = trajectory; - rotEdit.angle = angle; - rotEdit.frameNumber = frameNumber; - m_editQueue.enqueue(rotEdit); - } -} - -//********************************************************************* - -void ControllerPlugin::receivePauseState(bool state) -{ - m_paused = state; -} - -void ControllerPlugin::receiveCurrentFrameNumberToPlugin(uint frameNumber) -{ - m_currentFrameNumber = frameNumber; - Q_EMIT signalCurrentFrameNumberToPlugin(frameNumber); -} - -void ControllerPlugin::receiveTrackingDone() -{ -} +#include "ControllerPlugin.h" + +#include "Controller/ControllerPlayer.h" +#include "Controller/ControllerTextureObject.h" +#include "Controller/ControllerTrackedComponentCore.h" +#include "ControllerMainWindow.h" +#include "QDebug" +#include "util/types.h" +#include "ControllerDataExporter.h" +#include "ControllerAreaDescriptor.h" +#include "Controller/ControllerCoreParameter.h" +#include "Controller/ControllerCommands.h" + +#define REGISTRY_PATH "SOFTWARE\\FUBioroboticsLab\\BioTracker\\Plugins" +#define TRACKER_SUFFIX ".bio_tracker" + +ControllerPlugin::ControllerPlugin(QObject* parent, + IBioTrackerContext* context, + ENUMS::CONTROLLERTYPE ctr) +: IControllerCfg(parent, context, ctr) +{ + m_BioTrackerPlugin = NULL; + + m_TrackingThread = new QThread(this); + m_TrackingThread->setObjectName("TrackingThread"); + m_TrackingThread->start(); +} + +ControllerPlugin::~ControllerPlugin() +{ + + // They might not exist (no plugins available!) + if (m_BioTrackerPlugin) + delete m_BioTrackerPlugin; + if (pluginLoader) + delete pluginLoader; + + m_TrackingThread->quit(); + m_TrackingThread->wait(); +} + +void ControllerPlugin::addToPluginList(QString str) +{ + + std::string s = str.toStdString(); + pluginLoader->addToPluginList(str, TRACKER_SUFFIX); + + // Add Plugin name to Main Window + IController* ctrA = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::MAINWINDOW); + QPointer ctrMainWindow = + qobject_cast(ctrA); + + ctrMainWindow->setTrackerList(pluginLoader->getPluginList(), + pluginLoader->getCurrentPluginName()); +} + +void ControllerPlugin::loadPluginFromFileName(QString str) +{ + + if (pluginLoader->loadPluginFromFilename(str)) { + m_BioTrackerPlugin = qobject_cast( + pluginLoader->getPluginInstance()); + initPlugin(); + + // Add Plugin name to Main Window + IController* ctrA = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::MAINWINDOW); + QPointer ctrMainWindow = + qobject_cast(ctrA); + + ctrMainWindow->setTrackerList(pluginLoader->getPluginList(), + pluginLoader->getCurrentPluginName()); + + // Add Tracker Parameter to Main Window + IView* parms = m_BioTrackerPlugin->getTrackerParameterWidget(); + ctrMainWindow->setTrackerParamterWidget(parms); + + // Add Tracker tracked components (Elements) to Main Window + IView* elems = m_BioTrackerPlugin->getTrackerElementsWidget(); + ctrMainWindow->setTrackerElementsWidget(elems); + + IController* ctrB = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); + QPointer ctrTrackedComponentCore = + qobject_cast(ctrB); + + // Add Tracker tracked components model to + // ControllerTrackedComponentCore + ctrTrackedComponentCore->addModel( + m_BioTrackerPlugin->getTrackerComponentModel()); + // Add tracked component view to main window + ctrMainWindow->setCoreElementsWidget( + ctrTrackedComponentCore->getTrackingElementsWidgetCore()); + + IController* ctrDE = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::DATAEXPORT); + QPointer ctrDataExp = + qobject_cast(ctrDE); + ctrDataExp->setDataStructure( + m_BioTrackerPlugin->getTrackerComponentModel()); + ctrDataExp->setComponentFactory( + m_BioTrackerPlugin->getComponentFactory()); + + m_BioTrackerPlugin->sendCorePermissions(); + } else { + qWarning() << "Failed to load plugin from filename!"; + } +} + +void ControllerPlugin::selectPlugin(QString str) +{ + if (str.isEmpty()) + return; + + if (pluginLoader->getCurrentPluginName() != str) + loadPluginFromFileName(pluginLoader->getPluginMap().find(str)->second); +} + +void ControllerPlugin::createModel() +{ + m_Model = nullptr; + pluginLoader = new PluginLoader(this); +} + +void ControllerPlugin::createView() +{ +} + +void ControllerPlugin::connectModelToController() +{ +} + +void ControllerPlugin::loadPluginsFromPluginSubfolder() +{ + + ////////////// + QDir d(_cfg->DirPlugins); + d.setFilter(QDir::Filter::Files); + QStringList nameFilter; + QFileInfoList fl = d.entryInfoList(nameFilter, QDir::Filter::Files); + + // Grab list of behaviors from config & registry + std::vector list = _cfg->UseRegistryLocations == 1 + ? PluginLoader::queryRegistryBehaviors( + REGISTRY_PATH) + : std::vector(); + // Search directories + std::vector filesFromFolders = + PluginLoader::searchDirectoriesForPlugins(list, TRACKER_SUFFIX); + for (auto x : filesFromFolders) + addToPluginList(x.c_str()); + + foreach (QFileInfo fi, fl) { + QString s = fi.absoluteFilePath(); + addToPluginList(s); + } + + // Load plugins as per CLI + if (!_cfg->UsePlugins.isEmpty()) { + addToPluginList(_cfg->UsePlugins.toStdString().c_str()); + } +} + +void ControllerPlugin::connectControllerToController() +{ + + // Add Plugin name to Main Window + IController* ctrA = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::MAINWINDOW); + QPointer ctrMainWindow = + qobject_cast(ctrA); + + ctrMainWindow->deactiveTrackingCheckBox(); + + loadPluginsFromPluginSubfolder(); + + // connect ControllerTrackedComponentView + IController* ctrB = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); + QPointer ctrTrackedComponentCore = + qobject_cast(ctrB); + + QObject::connect(this, + SIGNAL(emitUpdateView()), + ctrTrackedComponentCore, + SLOT(receiveUpdateView())); + + // connect ControllerCommands + IController* ctrD = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::COMMANDS); + QPointer ctrCommands = + qobject_cast(ctrD); + + QObject::connect(ctrCommands, + SIGNAL(emitAddTrajectory(QPoint)), + this, + SLOT(receiveAddTrajectory(QPoint)), + Qt::DirectConnection); + QObject::connect(ctrCommands, + SIGNAL(emitRemoveTrajectory(IModelTrackedTrajectory*)), + this, + SLOT(receiveRemoveTrajectory(IModelTrackedTrajectory*)), + Qt::DirectConnection); + QObject::connect(ctrCommands, + SIGNAL(emitRemoveTrajectoryId(int)), + this, + SLOT(receiveRemoveTrajectoryId(int)), + Qt::DirectConnection); + QObject::connect( + ctrCommands, + SIGNAL(emitRemoveTrackEntity(IModelTrackedTrajectory*, uint)), + this, + SLOT(receiveRemoveTrackEntity(IModelTrackedTrajectory*, uint)), + Qt::DirectConnection); + QObject::connect(ctrCommands, + SIGNAL(emitValidateTrajectory(int)), + this, + SLOT(receiveValidateTrajectory(int)), + Qt::DirectConnection); + QObject::connect( + ctrCommands, + SIGNAL(emitValidateEntity(IModelTrackedTrajectory*, uint)), + this, + SLOT(receiveValidateEntity(IModelTrackedTrajectory*, uint)), + Qt::DirectConnection); + QObject::connect( + ctrCommands, + SIGNAL(emitMoveElement(IModelTrackedTrajectory*, uint, QPoint, int)), + this, + SLOT(receiveMoveElement(IModelTrackedTrajectory*, uint, QPoint, int)), + Qt::DirectConnection); + QObject::connect(ctrCommands, + SIGNAL(emitSwapIds(IModelTrackedTrajectory*, + IModelTrackedTrajectory*)), + this, + SLOT(receiveSwapIds(IModelTrackedTrajectory*, + IModelTrackedTrajectory*)), + Qt::DirectConnection); + QObject::connect( + ctrCommands, + SIGNAL(emitToggleFixTrack(IModelTrackedTrajectory*, bool)), + this, + SLOT(receiveToggleFixTrack(IModelTrackedTrajectory*, bool)), + Qt::DirectConnection); + QObject::connect( + ctrCommands, + SIGNAL(emitEntityRotation(IModelTrackedTrajectory*, double, uint)), + this, + SLOT(receiveEntityRotation(IModelTrackedTrajectory*, double, uint)), + Qt::DirectConnection); + + // connect ControllerPlayer + IController* ctrC = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::PLAYER); + QPointer ctrPlayer = qobject_cast( + ctrC); + QObject::connect(ctrPlayer, + SIGNAL(emitPauseState(bool)), + this, + SLOT(receivePauseState(bool)), + Qt::DirectConnection); + + QObject::connect(ctrPlayer, + SIGNAL(signalCurrentFrameNumberToPlugin(uint)), + this, + SLOT(receiveCurrentFrameNumberToPlugin(uint)), + Qt::DirectConnection); +} + +void ControllerPlugin::initPlugin() +{ + m_BioTrackerPlugin = qobject_cast( + pluginLoader->getPluginInstance()); + if (!m_BioTrackerPlugin) { + qFatal("Error at loading plugin."); + } + + connectPlugin(); + m_BioTrackerPlugin->init(); + + m_BioTrackerPlugin->moveToThread(m_TrackingThread); + + IController* ctrAreaDesc = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::AREADESCRIPTOR); + ControllerAreaDescriptor* ctAreaDesc = + qobject_cast(ctrAreaDesc); + ctAreaDesc->triggerUpdateAreaDescriptor(); + + Q_EMIT signalCurrentFrameNumberToPlugin(m_currentFrameNumber); +} + +void ControllerPlugin::connectPlugin() +{ + IController* ctrA = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::PLAYER); + QPointer ctrPlayer = qobject_cast( + ctrA); + + IModel* model = ctrPlayer->getModel(); + + IController* ctrB = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::TEXTUREOBJECT); + ControllerTextureObject* ctrTexture = + qobject_cast(ctrB); + + IController* ctrAreaDesc = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::AREADESCRIPTOR); + ControllerAreaDescriptor* ctAreaDesc = + qobject_cast(ctrAreaDesc); + + IController* ctrData = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::DATAEXPORT); + ControllerDataExporter* ctDataEx = qobject_cast( + ctrData); + + IController* ctrC = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); + ControllerTrackedComponentCore* ctrCompView = + qobject_cast(ctrC); + + IController* ctrD = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::COREPARAMETER); + ControllerCoreParameter* ctrCoreParam = + qobject_cast(ctrD); + + IController* ctrE = m_BioTrackerContext->requestController( + ENUMS::CONTROLLERTYPE::MAINWINDOW); + QPointer ctrMainWindow = + qobject_cast(ctrE); + + auto obj = dynamic_cast(m_BioTrackerPlugin); + + QObject::connect(obj, + SIGNAL(emitTrackingDone(uint)), + ctDataEx, + SLOT(receiveTrackingDone(uint))); + + QObject::connect(obj, + &IBioTrackerPlugin::trackingImageNamesChanged, + ctrTexture, + &ControllerTextureObject::setTextureNames); + QObject::connect(obj, + &IBioTrackerPlugin::trackingImagesChanged, + ctrTexture, + &ControllerTextureObject::updateTextures); + + QObject::connect(obj, + SIGNAL(emitTrackingDone(uint)), + ctrCompView, + SLOT(receiveVisualizeTrackingModel(uint))); + + QObject::connect(ctAreaDesc, + SIGNAL(updateAreaDescriptor(IModelAreaDescriptor*)), + obj, + SLOT(receiveAreaDescriptor(IModelAreaDescriptor*))); + + QObject::connect( + obj, + SIGNAL(emitCorePermission(std::pair)), + ctrCompView, + SLOT(setCorePermission(std::pair))); + + QObject::connect( + obj, + SIGNAL(emitCorePermission(std::pair)), + ctrCoreParam, + SLOT(setCorePermission(std::pair))); + + QObject::connect( + obj, + SIGNAL(emitCorePermission(std::pair)), + ctrMainWindow, + SLOT(setCorePermission(std::pair))); + + QObject::connect(obj, + SIGNAL(emitDimensionUpdate(int, int)), + ctrCompView, + SIGNAL(emitDimensionUpdate(int, int))); + + // data model actions + QObject::connect(this, + SIGNAL(emitRemoveTrajectory(IModelTrackedTrajectory*)), + obj, + SLOT(receiveRemoveTrajectory(IModelTrackedTrajectory*))); + QObject::connect( + this, + SIGNAL(emitRemoveTrackEntity(IModelTrackedTrajectory*, uint)), + obj, + SIGNAL(emitRemoveTrackEntity(IModelTrackedTrajectory*, uint))); + QObject::connect(this, + SIGNAL(emitAddTrajectory(QPoint)), + obj, + SLOT(receiveAddTrajectory(QPoint))); + QObject::connect( + this, + SIGNAL(emitMoveElement(IModelTrackedTrajectory*, uint, QPoint)), + obj, + SIGNAL(emitMoveElement(IModelTrackedTrajectory*, uint, QPoint))); + QObject::connect(this, + SIGNAL(emitSwapIds(IModelTrackedTrajectory*, + IModelTrackedTrajectory*)), + obj, + SLOT(receiveSwapIds(IModelTrackedTrajectory*, + IModelTrackedTrajectory*))); + QObject::connect( + this, + SIGNAL(emitToggleFixTrack(IModelTrackedTrajectory*, bool)), + obj, + SIGNAL(emitToggleFixTrack(IModelTrackedTrajectory*, bool))); + + QObject::connect(this, + SIGNAL(emitRemoveTrajectoryId(int)), + obj, + SIGNAL(emitRemoveTrajectoryId(int))); + QObject::connect(this, + SIGNAL(emitValidateTrajectory(int)), + obj, + SIGNAL(emitValidateTrajectory(int))); + QObject::connect( + this, + SIGNAL(emitValidateEntity(IModelTrackedTrajectory*, uint)), + obj, + SIGNAL(emitValidateEntity(IModelTrackedTrajectory*, uint))); + QObject::connect( + this, + SIGNAL(emitEntityRotation(IModelTrackedTrajectory*, double, uint)), + obj, + SIGNAL(emitEntityRotation(IModelTrackedTrajectory*, double, uint))); + + connect(this, + &ControllerPlugin::frameRetrieved, + m_BioTrackerPlugin, + &IBioTrackerPlugin::receiveCurrentFrameFromMainApp); + QObject::connect(this, + SIGNAL(signalCurrentFrameNumberToPlugin(uint)), + obj, + SLOT(receiveCurrentFrameNumberFromMainApp(uint))); +} + +void ControllerPlugin::disconnectPlugin() +{ +} + +// first send all the commands currently in the command queue then the next +// image can be sent +void ControllerPlugin::sendCurrentFrameToPlugin(cv::Mat mat, uint number) +{ + m_currentFrameNumber = number; + + // Prevent calling the plugin if none is loaded + if (m_BioTrackerPlugin) { + while (!m_editQueue.isEmpty()) { + queueElement edit = m_editQueue.dequeue(); + + switch (edit.type) { + case EDIT::REMOVE_TRACK: + emitRemoveTrajectory(edit.trajectory0); + break; + case EDIT::REMOVE_TRACK_ID: + emitRemoveTrajectoryId(edit.id); + break; + case EDIT::REMOVE_ENTITY: + emitRemoveTrackEntity(edit.trajectory0, edit.frameNumber); + break; + case EDIT::ADD: + emitAddTrajectory(edit.pos); + break; + case EDIT::MOVE: + emitMoveElement(edit.trajectory0, edit.frameNumber, edit.pos); + break; + case EDIT::SWAP: + emitSwapIds(edit.trajectory0, edit.trajectory1); + break; + case EDIT::FIX: + emitToggleFixTrack(edit.trajectory0, edit.toggle); + break; + case EDIT::VALIDATE: + emitValidateTrajectory(edit.id); + break; + case EDIT::VALIDATE_ENTITY: + emitValidateEntity(edit.trajectory0, edit.frameNumber); + break; + case EDIT::ROTATE_ENTITY: + emitEntityRotation(edit.trajectory0, + edit.angle, + edit.frameNumber); + break; + } + } + emit frameRetrieved(mat, number); + } +} + +//############################SLOTS################################################## + +// receivers of commands + +void ControllerPlugin::receiveRemoveTrajectory( + IModelTrackedTrajectory* trajectory) +{ + if (m_paused) { + emitRemoveTrajectory(trajectory); + emitUpdateView(); + } else { + queueElement removeTrackEdit; + removeTrackEdit.type = EDIT::REMOVE_TRACK; + removeTrackEdit.trajectory0 = trajectory; + m_editQueue.enqueue(removeTrackEdit); + } +} + +void ControllerPlugin::receiveRemoveTrajectoryId(int id) +{ + if (m_paused) { + emitRemoveTrajectoryId(id); + emitUpdateView(); + } else { + queueElement removeTrackEdit; + removeTrackEdit.type = EDIT::REMOVE_TRACK_ID; + removeTrackEdit.id = id; + m_editQueue.enqueue(removeTrackEdit); + } +} + +void ControllerPlugin::receiveRemoveTrackEntity( + IModelTrackedTrajectory* trajectory, + uint frameNumber) +{ + if (m_paused) { + emitRemoveTrackEntity(trajectory, frameNumber); + emitUpdateView(); + } else { + queueElement removeEntityEdit; + removeEntityEdit.type = EDIT::REMOVE_ENTITY; + removeEntityEdit.trajectory0 = trajectory; + removeEntityEdit.frameNumber = frameNumber; + m_editQueue.enqueue(removeEntityEdit); + } +} + +void ControllerPlugin::receiveAddTrajectory(QPoint pos) +{ + if (m_paused) { + emitAddTrajectory(pos); + emitUpdateView(); + } else { + queueElement addEdit; + addEdit.type = EDIT::ADD; + addEdit.pos = pos; + m_editQueue.enqueue(addEdit); + } +} + +void ControllerPlugin::receiveMoveElement(IModelTrackedTrajectory* trajectory, + uint frameNumber, + QPoint pos, + int toMove) +{ + if (m_paused) { + emitMoveElement(trajectory, frameNumber, pos); + // only emit the update after the last move is processed + if (toMove == 1) { + emitUpdateView(); + } + } else { + queueElement moveEdit; + moveEdit.type = EDIT::MOVE; + moveEdit.trajectory0 = trajectory; + moveEdit.pos = pos; + moveEdit.frameNumber = frameNumber; + m_editQueue.enqueue(moveEdit); + } +} + +void ControllerPlugin::receiveSwapIds(IModelTrackedTrajectory* trajectory0, + IModelTrackedTrajectory* trajectory1) +{ + if (m_paused) { + emitSwapIds(trajectory0, trajectory1); + emitUpdateView(); + } else { + queueElement swapEdit; + swapEdit.type = EDIT::SWAP; + swapEdit.trajectory0 = trajectory0; + swapEdit.trajectory1 = trajectory1; + m_editQueue.enqueue(swapEdit); + } +} + +void ControllerPlugin::receiveValidateTrajectory(int id) +{ + if (m_paused) { + emitValidateTrajectory(id); + emitUpdateView(); + } else { + queueElement validateEdit; + validateEdit.type = EDIT::VALIDATE; + validateEdit.id = id; + m_editQueue.enqueue(validateEdit); + } +} + +void ControllerPlugin::receiveValidateEntity( + IModelTrackedTrajectory* trajectory, + uint frameNumber) +{ + if (m_paused) { + emitValidateEntity(trajectory, frameNumber); + emitUpdateView(); + } else { + queueElement validateEntityEdit; + validateEntityEdit.type = EDIT::VALIDATE_ENTITY; + validateEntityEdit.trajectory0 = trajectory; + validateEntityEdit.frameNumber = frameNumber; + m_editQueue.enqueue(validateEntityEdit); + } +} + +void ControllerPlugin::receiveToggleFixTrack( + IModelTrackedTrajectory* trajectory, + bool toggle) +{ + if (m_paused) { + emitToggleFixTrack(trajectory, toggle); + emitUpdateView(); + } else { + queueElement fixEdit; + fixEdit.type = EDIT::FIX; + fixEdit.trajectory0 = trajectory; + fixEdit.toggle = toggle; + m_editQueue.enqueue(fixEdit); + } +} + +void ControllerPlugin::receiveEntityRotation( + IModelTrackedTrajectory* trajectory, + double angle, + uint frameNumber) +{ + if (m_paused) { + emitEntityRotation(trajectory, angle, frameNumber); + emitUpdateView(); + } else { + queueElement rotEdit; + rotEdit.type = EDIT::ROTATE_ENTITY; + rotEdit.trajectory0 = trajectory; + rotEdit.angle = angle; + rotEdit.frameNumber = frameNumber; + m_editQueue.enqueue(rotEdit); + } +} + +//********************************************************************* + +void ControllerPlugin::receivePauseState(bool state) +{ + m_paused = state; +} + +void ControllerPlugin::receiveCurrentFrameNumberToPlugin(uint frameNumber) +{ + m_currentFrameNumber = frameNumber; + Q_EMIT signalCurrentFrameNumberToPlugin(frameNumber); +} + +void ControllerPlugin::receiveTrackingDone() +{ +} diff --git a/Src/Controller/ControllerPlugin.h b/Src/Controller/ControllerPlugin.h index ec3b11a5..9789554c 100644 --- a/Src/Controller/ControllerPlugin.h +++ b/Src/Controller/ControllerPlugin.h @@ -79,7 +79,7 @@ class ControllerPlugin : public IControllerCfg * This function hands the received cv::Mat pointer and the current frame * number to the PluginLoader. */ - void sendCurrentFrameToPlugin(std::shared_ptr mat, uint number); + void sendCurrentFrameToPlugin(cv::Mat mat, uint number); void selectPlugin(QString str); @@ -103,7 +103,7 @@ class ControllerPlugin : public IControllerCfg uint frameNumber); void emitUpdateView(); - void frameRetrieved(std::shared_ptr mat, uint frameNumber); + void frameRetrieved(cv::Mat mat, uint frameNumber); void signalCurrentFrameNumberToPlugin(uint frameNumber); // IController interface @@ -113,9 +113,8 @@ class ControllerPlugin : public IControllerCfg void connectModelToController() override; void connectControllerToController() override; - void createPlugin(); - void connectPlugin(); + void initPlugin(); void disconnectPlugin(); private Q_SLOTS: diff --git a/Src/Controller/ControllerTextureObject.cpp b/Src/Controller/ControllerTextureObject.cpp index b293ad95..41dd5921 100644 --- a/Src/Controller/ControllerTextureObject.cpp +++ b/Src/Controller/ControllerTextureObject.cpp @@ -6,21 +6,25 @@ #include "Model/MediaPlayerStateMachine/MediaPlayerStateMachine.h" #include "View/TextureObjectView.h" +#include + ControllerTextureObject::ControllerTextureObject(QObject* parent, IBioTrackerContext* context, ENUMS::CONTROLLERTYPE ctr) : IControllerCfg(parent, context, ctr) { m_TextureViewNamesModel = new QStringListModel(); - m_TextureViewNamesModel->setStringList(m_TextureViewNames); + createNewTextureObjectModel("Original"); } void ControllerTextureObject::changeTextureModel(QString name) { - if (name == QString("")) - name = m_DefaultTextureName; + if (!hasTexture(name)) { + qCritical().noquote() + << QString("Invalid texture name '%1'").arg(name); + return; + } - checkIfTextureModelExists(name); m_Model = m_TextureObjects.value(name); changeTextureView(m_Model); @@ -46,12 +50,43 @@ void ControllerTextureObject::connectControllerToController() ctrGraphics->addTextureObject(item); } -void ControllerTextureObject::receiveCvMat(std::shared_ptr mat, - QString name) +void ControllerTextureObject::setTextureNames(QVector names) +{ + changeTextureModel("Original"); + + for (auto name : m_TextureViewNamesModel->stringList()) { + if (name != "Original") { + m_TextureObjects.remove(name); + } + } + + m_TextureViewNamesModel->setStringList({"Original"}); + + for (auto name : names) { + createNewTextureObjectModel(name); + } +} + +void ControllerTextureObject::updateTexture(QString name, cv::Mat img) { - checkIfTextureModelExists(name); + if (name.isEmpty() || !hasTexture(name)) { + qCritical().noquote() + << QString("Invalid texture name '%1'").arg(name); + return; + } + + if (!hasTexture(name)) { + createNewTextureObjectModel(name); + } - m_TextureObjects.value(name)->set(mat); + m_TextureObjects.value(name)->set(img); +} + +void ControllerTextureObject::updateTextures(QMap textures) +{ + for (const auto name : textures.keys()) { + updateTexture(name, textures[name]); + } } void ControllerTextureObject::createModel() @@ -70,33 +105,42 @@ void ControllerTextureObject::connectModelToController() { } -void ControllerTextureObject::checkIfTextureModelExists(QString name) +bool ControllerTextureObject::hasTexture(QString name) { - if (name == QString("")) - name = m_DefaultTextureName; - - bool itemIsInList = false; - for (int i = 0; i < m_TextureViewNames.size(); ++i) { + if (name.isEmpty()) { + return false; + } - if (m_TextureViewNames.at(i) == name) { - itemIsInList = true; + for (int i = 0; i < m_TextureViewNamesModel->rowCount(); ++i) { + if (m_TextureViewNamesModel->data(m_TextureViewNamesModel->index(i)) + .toString() == name) { + return true; } } - if (!itemIsInList) { - createNewTextureObjectModel(name); - } + return false; } void ControllerTextureObject::createNewTextureObjectModel(QString name) { - TextureObject* newTextureModel = new TextureObject(this, name); - m_TextureObjects.insert(name, newTextureModel); - m_TextureViewNames.append(name); - m_TextureViewNamesModel->setStringList(m_TextureViewNames); + m_TextureObjects.insert(name, new TextureObject(this, name)); + + if (m_TextureViewNamesModel->insertRow( + m_TextureViewNamesModel->rowCount())) { + auto index = m_TextureViewNamesModel->index( + m_TextureViewNamesModel->rowCount() - 1); + m_TextureViewNamesModel->setData(index, name); + } else { + qFatal("Failed to add new texture model"); + } } void ControllerTextureObject::changeTextureView(IModel* model) { m_View->setNewModel(model); } + +QAbstractListModel* ControllerTextureObject::textureNamesModel() +{ + return m_TextureViewNamesModel; +} diff --git a/Src/Controller/ControllerTextureObject.h b/Src/Controller/ControllerTextureObject.h index 4af23bc9..d3aeae0b 100644 --- a/Src/Controller/ControllerTextureObject.h +++ b/Src/Controller/ControllerTextureObject.h @@ -13,10 +13,12 @@ #include "QString" #include "Model/TextureObject.h" +#include #include "QStringList" #include "QStringListModel" #include "QPointer" + /** * This is the Controller class of the software component TextureObject. This * component is responsible for rendering cv::Mats on a disply canvas. Other @@ -50,12 +52,13 @@ class ControllerTextureObject : public IControllerCfg public: void connectControllerToController() override; + QAbstractListModel* textureNamesModel(); + bool hasTexture(QString name); + public Q_SLOTS: - /** - * This SLOT can be triggered by any component that wants to render a - * cv::Mat. - */ - void receiveCvMat(std::shared_ptr mat, QString name); + void setTextureNames(QVector names); + void updateTexture(QString name, cv::Mat img); + void updateTextures(QMap textures); protected: void createModel() override; @@ -63,7 +66,6 @@ public Q_SLOTS: void connectModelToController() override; private: - void checkIfTextureModelExists(QString name); void createNewTextureObjectModel(QString name); void changeTextureView(IModel* model); @@ -72,7 +74,6 @@ public Q_SLOTS: QString m_DefaultTextureName = "Original"; - QStringList m_TextureViewNames; QPointer m_TextureViewNamesModel; }; diff --git a/Src/IStates/IPlayerState.cpp b/Src/IStates/IPlayerState.cpp index a7c57e8e..2e6ede49 100644 --- a/Src/IStates/IPlayerState.cpp +++ b/Src/IStates/IPlayerState.cpp @@ -13,7 +13,7 @@ IPlayerState::IPlayerState( m_FrameNumber = 0; } -std::shared_ptr IPlayerState::getCurrentFrame() +cv::Mat IPlayerState::getCurrentFrame() { return m_Mat; } diff --git a/Src/IStates/IPlayerState.h b/Src/IStates/IPlayerState.h index 42bead66..66be3b42 100644 --- a/Src/IStates/IPlayerState.h +++ b/Src/IStates/IPlayerState.h @@ -105,7 +105,7 @@ class IPlayerState : public IModel /** * Returns the current cv::Mat of the ImageStream. */ - std::shared_ptr getCurrentFrame(); + cv::Mat getCurrentFrame(); /** * Returns the current frame number of the ImageStream. @@ -125,9 +125,9 @@ class IPlayerState : public IModel stateParameters m_StateParameters; - std::shared_ptr m_Mat; - size_t m_FrameNumber; - std::fstream fs; + cv::Mat m_Mat; + size_t m_FrameNumber; + std::fstream fs; QString m_currentFileName; }; diff --git a/Src/Model/AreaDescriptor/AreaInfo.cpp b/Src/Model/AreaDescriptor/AreaInfo.cpp index 543b977d..61cc0466 100644 --- a/Src/Model/AreaDescriptor/AreaInfo.cpp +++ b/Src/Model/AreaDescriptor/AreaInfo.cpp @@ -72,7 +72,7 @@ void AreaInfo::loadAreas() if (pair[1] == QString(DEFAULT_RECT)) { if (_parms) { - std::shared_ptr m = _parms->m_CurrentFrame; + auto m = _parms->m_CurrentFrame; reset(m->size().width, m->size().height); } else { reset(100, 100); @@ -94,17 +94,17 @@ void AreaInfo::rcvPlayerParameters( _parms->m_CurrentFilename != parameters->m_CurrentFilename) { _rectInitialized = false; } - if (parameters->m_CurrentFrame == nullptr) { + if (!parameters->m_CurrentFrame) { return; } - _parms = parameters; - std::shared_ptr m = parameters->m_CurrentFrame; - if ((m->size().width != _vdimX || m->size().height != _vdimY) && + _parms = parameters; + auto m = *parameters->m_CurrentFrame; + if ((m.size().width != _vdimX || m.size().height != _vdimY) && _useEntireScreen) { // TODO: _useEntireScreen? if we do not update // stuff in the very beginning, tracking // rectification will break - reset(m->size().width, m->size().height); + reset(m.size().width, m.size().height); loadAreas(); updateRectification(); } diff --git a/Src/Model/ImageStream.cpp b/Src/Model/ImageStream.cpp index 2176c652..52fb04cb 100644 --- a/Src/Model/ImageStream.cpp +++ b/Src/Model/ImageStream.cpp @@ -31,7 +31,7 @@ namespace BioTracker ImageStream::ImageStream(QObject* parent, Config* cfg) : QObject(parent) - , m_current_frame(new cv::Mat(cv::Size(0, 0), CV_8UC3)) + , m_current_frame(cv::Mat(cv::Size(0, 0), CV_8UC3)) , m_current_frame_number(0) { _cfg = cfg; @@ -44,7 +44,7 @@ namespace BioTracker return m_current_frame_number; } - std::shared_ptr ImageStream::currentFrame() const + cv::Mat ImageStream::currentFrame() const { return m_current_frame; } @@ -83,7 +83,7 @@ namespace BioTracker bool ImageStream::currentFrameIsEmpty() const { - return this->currentFrame()->empty(); + return this->currentFrame().empty(); } bool ImageStream::nextFrame() @@ -113,14 +113,14 @@ namespace BioTracker } } - void ImageStream::set_current_frame(std::shared_ptr img) + void ImageStream::set_current_frame(cv::Mat img) { - m_current_frame.swap(img); + m_current_frame = img; } void ImageStream::clearImage() { - m_current_frame.reset(); + m_current_frame = cv::Mat(cv::Size(0, 0), CV_8UC3); m_current_frame_number = this->numFrames(); } @@ -212,13 +212,12 @@ namespace BioTracker // load first image if (this->numFrames() > 0) { this->setFrameNumber_impl(0); - std::string filename = m_picture_files[0].string(); - std::shared_ptr new_frame = - std::make_shared(cv::imread(filename)); - m_w = new_frame->size().width; - m_h = new_frame->size().height; - m_recording = false; - vCoder = std::make_shared(m_fps, _cfg); + auto filename = m_picture_files[0].string(); + auto new_frame = cv::imread(filename); + m_w = new_frame.size().width; + m_h = new_frame.size().height; + m_recording = false; + vCoder = std::make_shared(m_fps, _cfg); } } virtual GuiParam::MediaType type() const override @@ -254,10 +253,8 @@ namespace BioTracker m_currentFrame += static_cast(m_frame_stride); if (this->numFrames() > m_currentFrame) { - const std::string& filename = - m_picture_files[m_currentFrame].string(); - std::shared_ptr new_frame = - std::make_shared(cv::imread(filename)); + auto filename = m_picture_files[m_currentFrame].string(); + auto new_frame = cv::imread(filename); this->set_current_frame(new_frame); if (m_recording) { if (vCoder) @@ -270,17 +267,15 @@ namespace BioTracker virtual bool setFrameNumber_impl(size_t frame_number) override { - const std::string& filename = - m_picture_files[frame_number].string(); - std::shared_ptr new_frame = std::make_shared( - cv::imread(filename)); + auto filename = m_picture_files[frame_number].string(); + auto new_frame = cv::imread(filename); this->set_current_frame(new_frame); m_currentFrame = static_cast(frame_number); if (m_recording) { if (vCoder) vCoder->add(new_frame); } - return !new_frame->empty(); + return !new_frame.empty(); } std::vector m_picture_files; std::shared_ptr vCoder; @@ -402,11 +397,10 @@ namespace BioTracker cv::Mat new_frame; for (int i = 0; i < m_frame_stride; i++) m_capture >> new_frame; - std::shared_ptr mat(new cv::Mat(new_frame)); - this->set_current_frame(mat); + this->set_current_frame(new_frame); if (m_recording) { if (vCoder) - vCoder->add(mat); + vCoder->add(new_frame); } return !new_frame.empty(); } @@ -532,13 +526,12 @@ namespace BioTracker m_capture >> new_frame; } - std::shared_ptr mat(new cv::Mat(new_frame)); - this->set_current_frame(mat); + this->set_current_frame(new_frame); if (m_recording) { if (vCoder) - vCoder->add(mat); + vCoder->add(new_frame); } - return !mat->empty(); + return !new_frame.empty(); } virtual bool setFrameNumber_impl(size_t) override @@ -678,13 +671,13 @@ namespace BioTracker } auto view = toOpenCV(m_grabbed); - auto scaled = std::make_shared(); - cv::resize(view, *scaled, m_imageSize); + auto scaled = view.clone(); + cv::resize(scaled, scaled, m_imageSize); set_current_frame(scaled); if (m_recording && m_encoder) m_encoder->add(scaled); - return !scaled->empty(); + return !scaled.empty(); } bool setFrameNumber_impl(size_t) override diff --git a/Src/Model/ImageStream.h b/Src/Model/ImageStream.h index 70f0048d..313d4cd5 100644 --- a/Src/Model/ImageStream.h +++ b/Src/Model/ImageStream.h @@ -86,7 +86,7 @@ namespace BioTracker * - if the current frame position is invalid or an error occurred, * an empty image is returned. */ - std::shared_ptr currentFrame() const; + cv::Mat currentFrame() const; /** * sets the current frame number and updates the current frame. @@ -136,7 +136,7 @@ namespace BioTracker /** * sets the image returned by this->currentFrame(); */ - void set_current_frame(std::shared_ptr img); + void set_current_frame(cv::Mat img); /** * Sets the title of the current image stream. @@ -155,10 +155,10 @@ namespace BioTracker */ size_t m_frame_stride; - std::shared_ptr m_current_frame; - size_t m_current_frame_number; - std::string m_title; - Config* _cfg; + cv::Mat m_current_frame; + size_t m_current_frame_number; + std::string m_title; + Config* _cfg; private: /** diff --git a/Src/Model/MediaPlayer.cpp b/Src/Model/MediaPlayer.cpp index b05e8751..dc719dbe 100644 --- a/Src/Model/MediaPlayer.cpp +++ b/Src/Model/MediaPlayer.cpp @@ -222,7 +222,7 @@ QString MediaPlayer::getCurrentFileName() return m_CurrentFilename; } -std::shared_ptr MediaPlayer::getCurrentFrame() +cv::Mat MediaPlayer::getCurrentFrame() { return m_CurrentFrame; } @@ -319,16 +319,13 @@ void MediaPlayer::receivePlayerParameters( m_RecO = param->m_RecO; m_CurrentFilename = param->m_CurrentFilename; - m_CurrentFrame = param->m_CurrentFrame; m_CurrentFrameNumber = param->m_CurrentFrameNumber; m_fpsOfSourceFile = param->m_fpsSourceVideo; m_TotalNumbFrames = param->m_TotalNumbFrames; - m_CurrentFrame = param->m_CurrentFrame; - const bool isValidFrame = static_cast(m_CurrentFrame) && - !m_CurrentFrame->empty(); + if (param->m_CurrentFrame && !param->m_CurrentFrame->empty()) { + m_CurrentFrame = *param->m_CurrentFrame; - if (isValidFrame) { Q_EMIT renderCurrentImage(m_CurrentFrame, m_NameOfCvMat); if (m_TrackingIsActive) { @@ -367,16 +364,15 @@ void MediaPlayer::receivePlayerParameters( m_image.bits(), m_image.bytesPerLine()); - auto copy = std::make_shared(view.clone()); - cv::cvtColor(*copy, - *copy, - cv::ColorConversionCodes::COLOR_BGR2RGB); + auto copy = view.clone(); + cv::cvtColor(copy, copy, cv::ColorConversionCodes::COLOR_BGR2RGB); m_videoc->add(copy); } } else { - qDebug() + qWarning() << "MediaPlayer: Received player parameters with invalid image."; } + Q_EMIT notifyView(); } @@ -405,11 +401,6 @@ void MediaPlayer::receivePlayerOperationDone() start = std::chrono::system_clock::now(); } -void MediaPlayer::receiveChangeDisplayImage(QString str) -{ - int x = 0; -} - int MediaPlayer::toggleRecordImageStream() { Q_EMIT toggleRecordImageStreamCommand(); diff --git a/Src/Model/MediaPlayer.h b/Src/Model/MediaPlayer.h index c506ad70..f0e23614 100644 --- a/Src/Model/MediaPlayer.h +++ b/Src/Model/MediaPlayer.h @@ -98,12 +98,12 @@ class MediaPlayer : public IModel * class. This controller will give the data to the TextureObject * component. */ - void renderCurrentImage(std::shared_ptr mat, QString name); + void renderCurrentImage(cv::Mat mat, QString name); /** * This SIGNAL is only emmited if Tracking Is Active. The PluginLoader * component will receive the cv::Mat and the current frame number. */ - void trackCurrentImage(std::shared_ptr mat, uint number); + void trackCurrentImage(cv::Mat mat, uint number); /** * This SIGNAL is only emmited if Tracking Is inactive. The core * visualization controller will receive the framenumber and will try to @@ -139,13 +139,13 @@ class MediaPlayer : public IModel int toggleRecordGraphicsScenes(GraphicsView* gv); int toggleRecordImageStream(); - size_t getTotalNumberOfFrames(); - size_t getCurrentFrameNumber(); - double getFpsOfSourceFile(); - double getCurrentFPS(); - double getTargetFPS(); - QString getCurrentFileName(); - std::shared_ptr getCurrentFrame(); + size_t getTotalNumberOfFrames(); + size_t getCurrentFrameNumber(); + double getFpsOfSourceFile(); + double getCurrentFPS(); + double getTargetFPS(); + QString getCurrentFileName(); + cv::Mat getCurrentFrame(); QString takeScreenshot(GraphicsView* gv); @@ -176,8 +176,6 @@ public Q_SLOTS: */ void rcvPauseState(bool state); - void receiveChangeDisplayImage(QString str); - private: // TODO Refactor members to _ instead of m_ @@ -198,13 +196,13 @@ public Q_SLOTS: QMap m_States; - size_t m_TotalNumbFrames; - size_t m_CurrentFrameNumber; - double m_fpsOfSourceFile; - double m_currentFPS; - double m_targetFPS; - QString m_CurrentFilename; - std::shared_ptr m_CurrentFrame; + size_t m_TotalNumbFrames; + size_t m_CurrentFrameNumber; + double m_fpsOfSourceFile; + double m_currentFPS; + double m_targetFPS; + QString m_CurrentFilename; + cv::Mat m_CurrentFrame; bool m_Play; bool m_Forw; diff --git a/Src/Model/MediaPlayerStateMachine/PlayerParameters.h b/Src/Model/MediaPlayerStateMachine/PlayerParameters.h index ec4f3e5c..ef7f4b1f 100644 --- a/Src/Model/MediaPlayerStateMachine/PlayerParameters.h +++ b/Src/Model/MediaPlayerStateMachine/PlayerParameters.h @@ -8,6 +8,8 @@ #ifndef PLAYERPARAMETERS_H #define PLAYERPARAMETERS_H +#include + /** * The playerParameters struct holds all data types of the current MediaPlayer * state. @@ -29,7 +31,7 @@ struct playerParameters QString m_CurrentFilename; std::string m_CurrentTitle; size_t m_CurrentFrameNumber; - std::shared_ptr m_CurrentFrame; + std::optional m_CurrentFrame; double m_fpsSourceVideo; double m_fpsTarget; std::vector m_batchItems; diff --git a/Src/Model/TextureObject.cpp b/Src/Model/TextureObject.cpp index e12207ca..8435d3d3 100644 --- a/Src/Model/TextureObject.cpp +++ b/Src/Model/TextureObject.cpp @@ -10,16 +10,16 @@ TextureObject::TextureObject(QObject* parent, QString name) m_texture = QImage(1, 1, QImage::Format_RGB888); } -void TextureObject::set(std::shared_ptr img) +void TextureObject::set(cv::Mat img) { - if (img->empty()) { + if (img.empty()) { return; } - if (img->channels() == 3) { - img->convertTo(m_img, CV_8UC3); + if (img.channels() == 3) { + img.convertTo(m_img, CV_8UC3); cv::cvtColor(m_img, m_img, cv::ColorConversionCodes::COLOR_BGR2RGB); - } else if (img->channels() == 1) { + } else if (img.channels() == 1) { // convert grayscale to "color" cv::Mat img8U; @@ -27,12 +27,12 @@ void TextureObject::set(std::shared_ptr img) // (usually 64F) so we need to map a [HUGE range] to -> [0 .. 255] double min, max; // FIXME: This still sometimes crashes when accessing the img data. - // cv::Mat is reference counted, so all std::shared_ptr + // cv::Mat is reference counted, so all cv::Mat // instances should be replaced with cv::Mat. - cv::minMaxLoc(*img, &min, &max); + cv::minMaxLoc(img, &min, &max); if (min >= 0 && min < 255 && max >= 0 && max <= 255) { // do not refit if the range is actually inbetween [0 ... 255] - img->convertTo(img8U, CV_8U); + img.convertTo(img8U, CV_8U); } else if (max > min) { // otherwise: the range is outside of native [0 ... 255] so we // actually need to do some refitting @@ -41,11 +41,11 @@ void TextureObject::set(std::shared_ptr img) // max] range const double sizeRatio = 256.0 / abs(static_cast(max - min)); const double convertedMin = abs(static_cast(min * sizeRatio)); - img->convertTo(img8U, CV_8U, sizeRatio, convertedMin); + img.convertTo(img8U, CV_8U, sizeRatio, convertedMin); } cv::cvtColor(img8U, m_img, cv::ColorConversionCodes::COLOR_GRAY2RGB); } else { - img->copyTo(m_img); + img.copyTo(m_img); } m_texture = QImage(m_img.data, diff --git a/Src/Model/TextureObject.h b/Src/Model/TextureObject.h index 625bb2d8..f1d6e639 100644 --- a/Src/Model/TextureObject.h +++ b/Src/Model/TextureObject.h @@ -26,7 +26,7 @@ class TextureObject : public IModel public: explicit TextureObject(QObject* parent = 0, QString name = "NoName"); - void set(std::shared_ptr img); + void set(cv::Mat img); QString getName(); QImage const& get() const diff --git a/Src/View/MainWindow.cpp b/Src/View/MainWindow.cpp index 3cb1d402..834b3e0c 100644 --- a/Src/View/MainWindow.cpp +++ b/Src/View/MainWindow.cpp @@ -1,1190 +1,1223 @@ -#include "MainWindow.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "ui_MainWindow.h" - -#include "util/types.h" - -#include "Model/null_Model.h" -#include "View/CoreParameterView.h" -#include "View/GraphicsView.h" -#include "View/AnnotationsView.h" -#include "Controller/ControllerMainWindow.h" -#include "Controller/null_Controller.h" - -#include "VideoControllWidget.h" - -MainWindow::MainWindow(QWidget* parent, IController* controller, IModel* model) -: IViewMainWindow(parent, controller, model) -, ui(new Ui::MainWindow) -{ - _cfg = static_cast(controller)->getConfig(); - _previouslySelectedTracker = ""; - _currentParameterView = 0; - _currentCoreParameterView = 0; - _currentElementView = 0; - ui->setupUi(this); - - // add cursor position label - QLabel* _cursorPosition = new QLabel("0,0"); - _cursorPosition->setObjectName("_cursorPosition"); - statusBar()->insertPermanentWidget(0, _cursorPosition); - - // TODO - ui->actionToggle_compact_menu_toolbar_2->setEnabled(false); - - // setup toolbars - setupUpperToolBar(); - setupVideoToolBar(); - ui->toolBarTools->setEnabled(false); - - ui->toolBox->setStyleSheet( - "QToolBox::tab {" - " background-color: #e5e5e5;}"); - - // resize to full size - QWidget::showMaximized(); - - createIntroductionWizard(); - - // set window icon - QApplication::setWindowIcon( - QIcon(":/Logo/resources/logo/BT-3_non_transparent_rounded.ico")); -} - -MainWindow::~MainWindow() -{ - delete ui; -} - -//******************************************SETUP******************************************* - -void MainWindow::setupUpperToolBar() -{ - - _trackerActivator = new SwitchButton("not tracking", "tracking"); - _trackerActivator->setToolTip("Activate/Disable tracking"); - QObject::connect(_trackerActivator, - &SwitchButton::emitSetEnabled, - this, - &MainWindow::receiveSetTracking, - Qt::DirectConnection); - // QAction* activatorAction = - // ui->toolBarMenu->addWidget(_trackerActivator); - - /////////////////////media groupbox - _mediaBox = new QGroupBox("Load media"); - // style groupbox (initial red border -> no video loaded) - _mediaBox->setStyleSheet( - "QGroupBox" - " {border: 1px solid #e56262;}"); - // "QGroupBox::title {subcontrol-origin: margin;subcontrol-position: top - // center; padding: 0 3px;}"); - QFont font = QFont(); - font.setPointSize(8); - font.setBold(true); - _mediaBox->setFont(font); - - QHBoxLayout* mediaBoxLayout = new QHBoxLayout; - mediaBoxLayout->setContentsMargins(0, 0, 0, 0); - // mediaBoxLayout->setSpacing(0); - QToolButton* cameraButton = new QToolButton; - cameraButton->setIconSize(QSize(24, 24)); - cameraButton->setDefaultAction(ui->actionOpen_Camera); - cameraButton->setAutoRaise(true); - - QToolButton* videoButton = new QToolButton; - videoButton->setIconSize(QSize(24, 24)); - videoButton->setDefaultAction(ui->actionOpen_Video); - videoButton->setAutoRaise(true); - - QToolButton* imageButton = new QToolButton; - imageButton->setIconSize(QSize(24, 24)); - imageButton->setDefaultAction(ui->actionOpen_Picture); - imageButton->setAutoRaise(true); - - mediaBoxLayout->addWidget(videoButton); - mediaBoxLayout->addWidget(imageButton); - mediaBoxLayout->addWidget(cameraButton); - - _mediaBox->setLayout(mediaBoxLayout); - - ui->toolBarMenu->addWidget(_mediaBox); - - ////////trackerbox - _trackerBox = new QGroupBox("Load tracker"); - // style groupbox - _trackerBox->setStyleSheet( - "QGroupBox" - " {border: 1px solid #e56262;}"); - // "QGroupBox::title {subcontrol-origin: margin;subcontrol-position: top - // center; padding: 0 3px;}"); - - QFont font0 = QFont(); - font0.setPointSize(8); - font0.setBold(true); - _trackerBox->setFont(font0); - - QHBoxLayout* trackerBoxLayout = new QHBoxLayout; - trackerBoxLayout->setContentsMargins(0, 0, 0, 0); - - QToolButton* trackerButton = new QToolButton; - trackerButton->setIconSize(QSize(24, 24)); - trackerButton->setDefaultAction(ui->actionLoad_Tracker); - trackerButton->setAutoRaise(true); - - trackerBoxLayout->addWidget(trackerButton); - _trackerBox->setLayout(trackerBoxLayout); - - ui->toolBarMenu->addWidget(_trackerBox); - - ////////loadSaveBox - QGroupBox* loadSaveBox = new QGroupBox("Load/Save Data"); - // style loadSaveBox - // loadSaveBox->setStyleSheet("QGroupBox" - // " {border: 1px solid #e5e5e5;border-radius: 5px;margin-top: 1ex; /* - // leave space at the top for the title */}" "QGroupBox::title - // {subcontrol-origin: margin;subcontrol-position: top center; padding: 0 - // 3px;}"); - - QFont font2 = QFont(); - font2.setPointSize(8); - font2.setBold(true); - loadSaveBox->setFont(font2); - - QHBoxLayout* loadSaveBoxLayout = new QHBoxLayout; - loadSaveBoxLayout->setContentsMargins(5, 0, 5, 0); - - QToolButton* loadFileButton = new QToolButton; - loadFileButton->setIconSize(QSize(24, 24)); - loadFileButton->setDefaultAction(ui->actionLoad_trackingdata); - loadFileButton->setAutoRaise(true); - - QToolButton* saveFileButton = new QToolButton; - saveFileButton->setIconSize(QSize(24, 24)); - saveFileButton->setDefaultAction(ui->actionSave_trackingdata); - saveFileButton->setAutoRaise(true); - - loadSaveBoxLayout->addWidget(loadFileButton); - loadSaveBoxLayout->addWidget(saveFileButton); - loadSaveBox->setLayout(loadSaveBoxLayout); - - ui->toolBarMenu->addWidget(loadSaveBox); - - //////////////////choose tracker groupbox - QGroupBox* chooseTrackerBox = new QGroupBox("Choose tracker"); - // style groupbox - // chooseTrackerBox->setStyleSheet("QGroupBox" - // " {border: 1px solid #e5e5e5;border-radius: 5px;margin-top: 1ex; /* - // leave space at the top for the title */}" "QGroupBox::title - // {subcontrol-origin: margin;subcontrol-position: top center; padding: 0 - // 3px;}"); - - QFont font1 = QFont(); - font1.setPointSize(8); - font1.setBold(true); - chooseTrackerBox->setFont(font1); - // - QHBoxLayout* chooseTrackerBoxLayout = new QHBoxLayout; - chooseTrackerBoxLayout->addWidget(ui->comboBox_TrackerSelect); - chooseTrackerBoxLayout->addWidget(_trackerActivator); - - chooseTrackerBox->setLayout(chooseTrackerBoxLayout); - - ui->toolBarMenu->addWidget(chooseTrackerBox); -} - -void MainWindow::checkTrackerGroupBox() -{ - _trackerBox->setStyleSheet( - "QGroupBox" - " {border: 1px solid #82c985;}"); -} - -void MainWindow::checkMediaGroupBox() -{ - _mediaBox->setStyleSheet( - "QGroupBox" - " {border: 1px solid #82c985;}"); -} - -void MainWindow::setupVideoToolBar() -{ -} - -void MainWindow::addVideoControllWidget(IView* widget) -{ - QLayout* layout = new QGridLayout(); - // layout->addWidget(dynamic_cast(widget)); - - QWidget* controlW = dynamic_cast(widget); - if (controlW) { - layout->addWidget(controlW->findChild("sld_video")); - } - ui->videoControls->setLayout(layout); - - // ui->videoControls->adjustSize(); -} - -void MainWindow::addVideoView(IView* videoView) -{ - m_graphView = dynamic_cast(videoView); - m_graphView->setParent(ui->trackingArea); - - ui->videoViewLayout->addWidget(m_graphView); -} - -void MainWindow::addTrackerElementsView(IView* elemView) -{ - - QGraphicsObject* graphObj = dynamic_cast(elemView); - graphObj->setParent(ui->trackingArea); - - m_graphView->addGraphicsItem(graphObj); - QRectF viewSceneRect = m_graphView->sceneRect(); - - _currentElementView = graphObj; -} - -void MainWindow::addCoreElementsView(IView* coreView) -{ - QGraphicsObject* graphObj = dynamic_cast(coreView); - graphObj->setParent(ui->trackingArea); - - m_graphView->addGraphicsItem(graphObj); - _currentCoreView = graphObj; -} - -void MainWindow::addNotificationBrowser(IView* notificationBrowser) -{ - QWidget* notificationWidget = dynamic_cast(notificationBrowser); - if (notificationWidget) { - notificationWidget->updateGeometry(); - - ui->notificationTab->layout()->addWidget(notificationWidget); - - notificationWidget->setVisible(1); - } - - // createIntroductionWizard(); -} - -void MainWindow::addTrackerParameterView(IView* parameter) -{ - QWidget* pluginParameter = dynamic_cast(parameter); - - while (auto item = ui->trackerOptions->layout()->takeAt(0)) { - delete item->widget(); - } - - ui->trackerOptions->layout()->addWidget(pluginParameter); -} - -void MainWindow::addCoreParameterView(IView* coreParameterView) -{ - - QWidget* coreParameter = dynamic_cast(coreParameterView); - if (coreParameter) { - // add experiment widget to toolbar - QWidget* experimentWidget = coreParameter->findChild( - "experimentWidget"); - if (experimentWidget) { - ui->experimentItem->layout()->addWidget(experimentWidget); - } - - ui->widget_alg->updateGeometry(); - coreParameter->updateGeometry(); - coreParameter->setContentsMargins(QMargins(0, 0, 0, 0)); - coreParameter->setParent(ui->widget_alg); - - QHBoxLayout* hLayout = new QHBoxLayout; - hLayout->addWidget(coreParameter, 100, 0); - hLayout->setContentsMargins( - QMargins(0, 0, 0, 0)); // left, top, right, bottom - hLayout->setMargin(0); - - ui->widget_alg->setLayout(hLayout); - - coreParameter->setVisible(1); - _currentCoreParameterView = coreParameterView; - - // resize rightpanel - QList splitterSizes; - splitterSizes << 20000 << 10000; // 2:1 TODO make this fixed (right - // panel fixed start size) - ui->mainSplitter->setSizes(splitterSizes); - } -} - -void MainWindow::setTrackerList(QStringListModel* trackerList, QString current) -{ - ui->comboBox_TrackerSelect->setModel(trackerList); - ui->comboBox_TrackerSelect->setCurrentText(current); -} - -// TODO put this in a class -void MainWindow::createIntroductionWizard() -{ - m_introWiz = new QWizard; - - // BioTracker::Core::Settings *disableIntroWiz = - // GET_CORESETTINGS(CORE_CONFIGURATION); - bool disabled = _cfg->DisableWizard; - - // dont show again checkbox - QCheckBox* noShowCheck = new QCheckBox("Don't show this again"); - noShowCheck->setChecked(disabled); - QObject::connect(noShowCheck, - &QCheckBox::toggled, - this, - &MainWindow::toggleNoShowWiz); - - // introduction - QWizardPage* p1 = new QWizardPage; - { - p1->setTitle("BioTracker 3 - Introduction"); - - QPixmap logoImg(":/Logo/resources/logo/BT3-big.png"); - QPixmap scaledImg = logoImg.scaled(QSize(600, 400), - Qt::KeepAspectRatio, - Qt::SmoothTransformation); - - QLabel* imgLabel = new QLabel; - imgLabel->setPixmap(scaledImg); - imgLabel->setAttribute(Qt::WA_TranslucentBackground); - imgLabel->setSizePolicy(QSizePolicy::Expanding, - QSizePolicy::Expanding); - imgLabel->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); - - QFile file(":/Introduction/resources/introduction/intro.txt"); - QLabel* introLabel = new QLabel; - introLabel->setWordWrap(true); - - // read introduction text from file - QString line; - if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { - QTextStream stream(&file); - while (!stream.atEnd()) { - line.append(stream.readLine() + "\n"); - } - introLabel->setText(line); - } - file.close(); - - QVBoxLayout* layout = new QVBoxLayout; - layout->addWidget(imgLabel); - QScrollArea* textScroll = new QScrollArea; - textScroll->setFrameShape(QFrame::NoFrame); - textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - textScroll->setWidget(introLabel); - textScroll->setWidgetResizable(true); - layout->addWidget(textScroll); - layout->setAlignment(Qt::AlignHCenter); - p1->setLayout(layout); - } - - // overview - QWizardPage* p2 = new QWizardPage; - { - p2->setTitle("BioTracker 3 - Overview"); - QLabel* label = new QLabel( - "This is the BioTracker. Don't let yourself be overwhelmed as it " - "is actually pretty simple."); - label->setWordWrap(true); - - QPixmap overviewImg( - ":/Introduction/resources/introduction/images/BioTracker.PNG"); - QPixmap scaledImg = overviewImg.scaled(QSize(600, 400), - Qt::KeepAspectRatio, - Qt::SmoothTransformation); - - QLabel* imgLabel = new QLabel; - imgLabel->setPixmap(scaledImg); - imgLabel->setSizePolicy(QSizePolicy::Expanding, - QSizePolicy::Expanding); - // imgLabel->setScaledContents(true); - - QVBoxLayout* layout = new QVBoxLayout; - layout->addWidget(imgLabel); - QScrollArea* textScroll = new QScrollArea; - textScroll->setFrameShape(QFrame::NoFrame); - textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - textScroll->setWidget(label); - textScroll->setWidgetResizable(true); - layout->addWidget(textScroll); - layout->setAlignment(Qt::AlignHCenter); - p2->setLayout(layout); - } - - // toolbars - QWizardPage* p3 = new QWizardPage; - { - p3->setTitle("BioTracker 3 - Toolbars"); - - // image - QPixmap overviewImg( - ":/Introduction/resources/introduction/images/toolbars.png"); - QPixmap scaledImg = overviewImg.scaled(QSize(600, 400), - Qt::KeepAspectRatio, - Qt::SmoothTransformation); - QLabel* imgLabel = new QLabel; - - imgLabel->setPixmap(scaledImg); - - // read toolbar text from file - QFile file(":/Introduction/resources/introduction/toolbars.txt"); - QLabel* label = new QLabel(); - label->setWordWrap(true); - - QString line; - if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { - QTextStream stream(&file); - while (!stream.atEnd()) { - line.append(stream.readLine() + "\n"); - } - label->setText(line); - } - file.close(); - - QVBoxLayout* layout = new QVBoxLayout; - layout->addWidget(imgLabel); - QScrollArea* textScroll = new QScrollArea; - textScroll->setFrameShape(QFrame::NoFrame); - textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - textScroll->setWidget(label); - textScroll->setWidgetResizable(true); - layout->addWidget(textScroll); - layout->setAlignment(Qt::AlignHCenter); - p3->setLayout(layout); - } - - // right panel - overview - QWizardPage* p4 = new QWizardPage; - { - p4->setTitle("BioTracker 3 - Right panel overview"); - - // image - QPixmap overviewImg( - ":/Introduction/resources/introduction/images/right_panel.png"); - QPixmap scaledImg = overviewImg.scaled(QSize(600, 400), - Qt::KeepAspectRatio, - Qt::SmoothTransformation); - QLabel* imgLabel = new QLabel; - imgLabel->setPixmap(scaledImg); - - // read right panel text from file - QFile file(":/Introduction/resources/introduction/right_panel.txt"); - QLabel* label = new QLabel(); - label->setWordWrap(true); - - QString line; - if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { - QTextStream stream(&file); - while (!stream.atEnd()) { - line.append(stream.readLine() + "\n"); - } - label->setText(line); - } - file.close(); - - QVBoxLayout* layout = new QVBoxLayout; - layout->addWidget(imgLabel); - QScrollArea* textScroll = new QScrollArea; - textScroll->setFrameShape(QFrame::NoFrame); - textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - textScroll->setWidget(label); - textScroll->setWidgetResizable(true); - layout->addWidget(textScroll); - layout->setAlignment(Qt::AlignHCenter); - - p4->setLayout(layout); - } - - // how to track - QWizardPage* p5 = new QWizardPage; - { - p5->setTitle("BioTracker 3 - Tracking"); - - // image - QPixmap overviewImg( - ":/Introduction/resources/introduction/images/tracking.png"); - QPixmap scaledImg = overviewImg.scaled(QSize(600, 400), - Qt::KeepAspectRatio, - Qt::SmoothTransformation); - QLabel* imgLabel = new QLabel; - imgLabel->setPixmap(scaledImg); - - // read tracking text from file - QFile file(":/Introduction/resources/introduction/tracking.txt"); - QLabel* label = new QLabel(); - label->setWordWrap(true); - - QString line; - if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { - QTextStream stream(&file); - while (!stream.atEnd()) { - line.append(stream.readLine() + "\n"); - } - label->setText(line); - } - file.close(); - - QVBoxLayout* layout = new QVBoxLayout; - layout->addWidget(imgLabel); - QScrollArea* textScroll = new QScrollArea; - textScroll->setFrameShape(QFrame::NoFrame); - textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - textScroll->setWidget(label); - textScroll->setWidgetResizable(true); - layout->addWidget(textScroll); - layout->setAlignment(Qt::AlignHCenter); - - p5->setLayout(layout); - } - - // context menus - QWizardPage* p6 = new QWizardPage; - { - p6->setTitle("BioTracker 3 - Context menus"); - - // images - QPixmap contextEntityImg( - ":/Introduction/resources/introduction/images/context_entity.png"); - QPixmap scaledImg1 = contextEntityImg.scaled(QSize(300, 400), - Qt::KeepAspectRatio, - Qt::SmoothTransformation); - QLabel* imgEntityLabel = new QLabel; - imgEntityLabel->setPixmap(scaledImg1); - - QPixmap contextVideoImg( - ":/Introduction/resources/introduction/images/context_video.png"); - QPixmap scaledImg2 = contextVideoImg.scaled(QSize(300, 400), - Qt::KeepAspectRatio, - Qt::SmoothTransformation); - QLabel* imgVideoLabel = new QLabel; - imgVideoLabel->setPixmap(scaledImg2); - - // read tracking text from file - QFile file(":/Introduction/resources/introduction/context_menus.txt"); - QLabel* label = new QLabel(); - label->setWordWrap(true); - - QString line; - if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { - QTextStream stream(&file); - while (!stream.atEnd()) { - line.append(stream.readLine() + "\n"); - } - label->setText(line); - } - file.close(); - - QVBoxLayout* outerLayout = new QVBoxLayout; - QHBoxLayout* imgLayout = new QHBoxLayout; - imgLayout->addWidget(imgEntityLabel); - imgLayout->addWidget(imgVideoLabel); - QFrame* imgFrame = new QFrame; - imgFrame->setFrameStyle(QFrame::Panel | QFrame::Sunken); - imgFrame->setLayout(imgLayout); - - outerLayout->addWidget(imgFrame); - QScrollArea* textScroll = new QScrollArea; - textScroll->setFrameShape(QFrame::NoFrame); - textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - textScroll->setWidget(label); - textScroll->setWidgetResizable(true); - outerLayout->addWidget(textScroll); - outerLayout->addWidget(noShowCheck); - - outerLayout->setAlignment(Qt::AlignHCenter); - - p6->setLayout(outerLayout); - } - - m_introWiz->addPage(p1); - m_introWiz->addPage(p2); - m_introWiz->addPage(p3); - m_introWiz->addPage(p4); - m_introWiz->addPage(p5); - m_introWiz->addPage(p6); - // m_introWiz->addPage(p7); - - m_introWiz->setWindowTitle("Introduction"); - if (!disabled) { - QRect rec = QApplication::desktop()->availableGeometry(); - m_introWiz->resize(m_introWiz->width(), 500); - m_introWiz->show(); - // m_introWiz->showMaximized(); - } -} - -/////////////////////////////////////////// - -void MainWindow::setCorePermission( - std::pair permission) -{ - if (permission.first == ENUMS::COREPERMISSIONS::COMPONENTADD) { - ui->actionAdd_Track->setEnabled(permission.second); - return; - } - if (permission.first == ENUMS::COREPERMISSIONS::COMPONENTREMOVE) { - ui->actionDelete_selected_tracks->setEnabled(permission.second); - return; - } - if (permission.first == ENUMS::COREPERMISSIONS::COMPONENTSWAP) { - ui->actionSwap_ID_s->setEnabled(permission.second); - return; - } -} - -void MainWindow::on_comboBox_TrackerSelect_currentIndexChanged(QString s) -{ - QString ct = ui->comboBox_TrackerSelect->currentText(); - if (!ct.isEmpty() && _previouslySelectedTracker != ct) { - _previouslySelectedTracker = ct; - Q_EMIT selectPlugin(ct); - } -} - -void MainWindow::setCursorPositionLabel(QPoint pos) -{ - QString posString = QString("%1, %2").arg(QString::number(pos.x()), - QString::number(pos.y())); - - QLabel* currentChild = statusBar()->findChild("_cursorPosition"); - currentChild->setText(posString); -} - -void MainWindow::activeTrackingCheckBox() -{ - // ui->checkBox_TrackingActivated->setEnabled(true); - _trackerActivator->setEnabled(true); - checkTrackerGroupBox(); - ui->toolBarTools->setEnabled(true); -} - -void MainWindow::deactivateTrackingCheckBox() -{ - // ui->checkBox_TrackingActivated->setEnabled(false); - _trackerActivator->setEnabled(false); -} - -void MainWindow::saveDataToFile() -{ - static const QString fileFilter( - "tracking data files (*.csv *.dat *.json)"); - - boost::filesystem::path file; - - std::string locStr = _cfg->DefaultLocationManualSave.toStdString(); - QString locStrQ = QString::fromStdString(locStr); - - QString f = QFileDialog::getSaveFileName(this, - "Save trajectory data to file", - locStrQ, - fileFilter, - 0); - - if (f != "") { - qobject_cast(getController()) - ->saveTrajectoryFile(f.toStdString()); - } -} - -////////////////////////////////////////////////SLOTS///////////////////////////////////// - -void MainWindow::toggleNoShowWiz(bool toggle) -{ - _cfg->DisableWizard = toggle; // Todo implicit cast bool->int -} - -void MainWindow::receiveSelectedCameraDevice(CameraConfiguration conf) -{ - qobject_cast(getController()) - ->loadCameraDevice(conf); -} - -void MainWindow::on_rightPanelViewControllerButton_clicked() -{ - QList splitterSizes = QList(); - if (ui->widgetParameterAreaOuterCanvas->isVisible()) { - _lastRightPanelWidth = - ui->mainSplitter->sizes()[1]; // save last width to restore on show - _lastVideoWidgetWidth = ui->mainSplitter->sizes()[0]; - - ui->widgetParameterAreaOuterCanvas->hide(); - splitterSizes - << 20000 - << ui->rightPanelViewControllerWidget->minimumSizeHint().width(); - - ui->rightPanelViewControllerButton->setText("<"); - // set menu action unchecked - ui->actionRight_panel->setChecked(false); - } else { - ui->widgetParameterAreaOuterCanvas->show(); - splitterSizes << _lastVideoWidgetWidth << _lastRightPanelWidth; - ui->rightPanelViewControllerButton->setText(">"); - - // set menu action checked - ui->actionRight_panel->setChecked(true); - } - ui->mainSplitter->setSizes(splitterSizes); -} - -void MainWindow::on_bottomPanelViewControllerButton_clicked() -{ - ui->videoControls->setVisible( - ui->bottomPanelViewControllerButton->text() == "^"); - ui->bottomPanelViewControllerButton->setText( - ui->bottomPanelViewControllerButton->text() == "v" ? "^" : "v"); -} - -void MainWindow::activateTracking() -{ - _trackerActivator->setState(true); -} - -void MainWindow::deactivateTracking() -{ - _trackerActivator->setState(false); -} - -void MainWindow::receiveSetTracking(bool toggle) -{ - if (toggle) { - qobject_cast(getController())->activeTracking(); - } else { - qobject_cast(getController()) - ->deactiveTrackring(); - } -} - -void MainWindow::resetTrackerViews() -{ - if (_currentElementView && _currentCoreView) { - _currentElementView->setParent(0); - _currentCoreView->setParent(0); - m_graphView->removeGraphicsItem(_currentElementView); - m_graphView->removeGraphicsItem(_currentCoreView); - } - - _currentElementView = nullptr; - _currentCoreView = nullptr; -} - -//////////////////////////utility toolbar action -/// slots/////////////////////////// -void MainWindow::on_actionAdd_Track_triggered() -{ - qobject_cast(getController())->emitAddTrack(); -} -void MainWindow::on_actionDelete_selected_tracks_triggered() -{ - qobject_cast(getController()) - ->emitDeleteSelectedTracks(); -} -void MainWindow::on_actionSwap_ID_s_triggered() -{ - qobject_cast(getController())->emitSwapIds(); -} -void MainWindow::on_actionSelect_all_triggered() -{ - qobject_cast(getController())->emitSelectAll(); -} -void MainWindow::on_actionChange_the_border_color_triggered() -{ - qobject_cast(getController()) - ->emitChangeColorBorder(); -} -void MainWindow::on_actionChange_the_fill_color_triggered() -{ - qobject_cast(getController()) - ->emitChangeColorFill(); -} -void MainWindow::on_actionAdd_label_Annotation_triggered() -{ - qobject_cast(getController())->emitAddLabelAnno(); -} -void MainWindow::on_actionAdd_rectangular_annotation_triggered() -{ - qobject_cast(getController())->emitAddRectAnno(); -} -void MainWindow::on_actionAdd_arrow_annotation_triggered() -{ - qobject_cast(getController())->emitAddArrAnno(); -} -void MainWindow::on_actionAdd_elliptical_annotation_triggered() -{ - qobject_cast(getController())->emitAddEllAnno(); -} -void MainWindow::on_actionDelete_selected_Annotation_triggered() -{ - qobject_cast(getController())->emitDelSelAnno(); -} - -///////////////////////////////menu->file slots///////////////////////////// - -void MainWindow::on_actionOpen_Video_triggered() -{ - static const QString videoFilter( - "Video files (*.avi *.wmv *.mp4 *.mkv *.mov)"); - - QString filename = - QFileDialog::getOpenFileName(this, "Open video", "", videoFilter, 0); - - if (!filename.isEmpty()) { - dynamic_cast(getController()) - ->loadVideo({filename.toStdString().c_str()}); - } -} - -void MainWindow::on_actionOpen_Video_batch_triggered() -{ - static const QString videoFilter( - "Video files (*.avi *.wmv *.mp4 *.mkv *.mov)"); - - std::vector files; - - for (QString const& path : - QFileDialog::getOpenFileNames(this, - "Open image files", - "", - videoFilter, - 0)) { - files.push_back(boost::filesystem::path(path.toStdString())); - } - - if (!files.empty()) { - qobject_cast(getController())->loadVideo(files); - } -} - -void MainWindow::on_actionLoad_Tracker_triggered() -{ - static const QString pluginFilter( - "BioTracker Tracking Plugin files (*.bio_tracker.so *.bio_tracker.dll " - "*.bio_tracker.dylib)"); - - QString filename = QFileDialog::getOpenFileName( - this, - "Open BioTracker Tracking Plugin", - "", - pluginFilter, - 0); - - if (!filename.isEmpty()) { - qobject_cast(getController()) - ->loadTracker(filename); - } -} - -void MainWindow::on_actionOpen_Picture_triggered() -{ - static const QString imageFilter( - "image files (*.png *.jpg *.jpeg *.gif *.bmp *.jpe *.ppm *.tiff *.tif " - "*.sr *.ras *.pbm *.pgm *.jp2 *.dib)"); - - std::vector files; - for (QString const& path : - QFileDialog::getOpenFileNames(this, - "Open image files", - "", - imageFilter, - 0)) { - files.push_back(boost::filesystem::path(path.toStdString())); - } - - if (!files.empty()) { - qobject_cast(getController()) - ->loadPictures(files); - } -} - -void MainWindow::on_actionLoad_trackingdata_triggered() -{ - static const QString imageFilter( - "tracking data files (*.csv *.dat *.json)"); - - std::vector files; - for (QString const& path : - QFileDialog::getOpenFileNames(this, - "Open tracking file", - "", - imageFilter, - 0)) { - files.push_back(boost::filesystem::path(path.toStdString())); - } - - if (!files.empty()) { - qobject_cast(getController()) - ->loadTrajectoryFile(files[0].string()); - } -} - -void MainWindow::on_actionSave_trackingdata_triggered() -{ - saveDataToFile(); -} - -void MainWindow::on_actionOpen_Camera_triggered() -{ - m_CameraDevice = new CameraDevice(); - - m_CameraDevice->show(); - - QObject::connect(m_CameraDevice, - &CameraDevice::emitSelectedCameraDevice, - this, - &MainWindow::receiveSelectedCameraDevice); -} - -void MainWindow::on_actionQuit_triggered() -{ - qobject_cast(getController())->exit(); -} - -///////////////////////////////menu->edit slots///////////////////////////// - -void MainWindow::on_actionUndo_triggered() -{ - qobject_cast(getController())->emitUndoCommand(); -} - -void MainWindow::on_actionRedo_triggered() -{ - qobject_cast(getController())->emitRedoCommand(); -} - -void MainWindow::on_actionShowActionList_triggered() -{ - qobject_cast(getController()) - ->emitShowActionListCommand(); -} - -void MainWindow::on_actionSettings_triggered() -{ - m_SettingsWindow = new SettingsWindow(0, _cfg); - - m_SettingsWindow->show(); -} - -///////////////////////////////menu->view slots///////////////////////////// - -// toggle toolbars actions -void MainWindow::on_actionToggle_menu_toolbar_triggered() -{ - bool currentState = ui->toolBarMenu->isVisible(); - ui->toolBarMenu->setVisible(!currentState); - ui->actionToggle_menu_toolbar->setText( - !currentState ? "Hide menu toolbar" : "Show menu toolbar"); -} -void MainWindow::on_actionToggle_view_toolbar_triggered() -{ - bool currentState = ui->toolBarTools->isVisible(); - ui->toolBarTools->setVisible(!currentState); - ui->actionToggle_view_toolbar->setText( - !currentState ? "Hide view toolbar" : "Show view toolbar"); -} -void MainWindow::on_actionToggle_video_toolbar_triggered() -{ - bool currentState = ui->toolBarVideo->isVisible(); - ui->toolBarVideo->setVisible(!currentState); - ui->actionToggle_video_toolbar->setText( - !currentState ? "Hide view toolbar" : "Show view toolbar"); -} - -void MainWindow::on_actionToggle_compact_menu_toolbar_2_triggered() -{ - ui->toolBarMenu->setStyleSheet( - "QGroupBox" - " {border-style: none; margin-top: 0ex; font-size: 1px;}" - "QGroupBox::title {font-size: 1px; padding: 0 3px;}"); -} - -void MainWindow::on_toolBarMenu_visibilityChanged(bool visible) -{ - ui->actionToggle_menu_toolbar->setText(visible ? "Hide menu toolbar" - : "Show menu toolbar"); -} -void MainWindow::on_toolBarTools_visibilityChanged(bool visible) -{ - ui->actionToggle_view_toolbar->setText(visible ? "Hide view toolbar" - : "Show view toolbar"); -} -void MainWindow::on_toolBarVideo_visibilityChanged(bool visible) -{ - ui->actionToggle_video_toolbar->setText(visible ? "Hide video toolbar" - : "Show video toolbar"); -} - -void MainWindow::on_actionBottom_panel_triggered(bool checked) -{ - ui->bottomPanelViewControllerButton->click(); -} -void MainWindow::on_actionRight_panel_triggered(bool checked) -{ - ui->rightPanelViewControllerButton->click(); -} - -void MainWindow::on_actionToggle_fullscreen_triggered() -{ - if (isFullScreen()) { - showNormal(); - } else { - showFullScreen(); - } -} - -//////////////////////////////////menu->Go to -/// slots////////////////////////////////// - -void MainWindow::on_actionOpen_Plugins_directory_triggered() -{ - QDesktopServices::openUrl(QUrl::fromLocalFile(_cfg->DirPlugins)); -} -void MainWindow::on_actionOpen_Track_directory_triggered() -{ - QDesktopServices::openUrl(QUrl::fromLocalFile(_cfg->DirTracks)); -} -void MainWindow::on_actionOpen_Trial_directory_triggered() -{ - QDesktopServices::openUrl(QUrl::fromLocalFile(_cfg->DirTrials)); -} -void MainWindow::on_actionOpen_Screenshot_directory_triggered() -{ - QDesktopServices::openUrl(QUrl::fromLocalFile(_cfg->DirScreenshots)); -} -void MainWindow::on_actionOpen_Videos_directory_triggered() -{ - QDesktopServices::openUrl(QUrl::fromLocalFile(_cfg->DirVideos)); -} - -//////////////////////////////////menu->Help -/// slots////////////////////////////// - -void MainWindow::on_actionUser_guide_triggered() -{ - QDesktopServices::openUrl( - QUrl("https://github.com/BioroboticsLab/biotracker_core/wiki")); -} - -void MainWindow::on_actionAbout_triggered() -{ - std::string version = ""; - version = "BioTracker3

      "; - - version = "Source Version: "; - version += SOURCE_VERSION; - version += +"

      "; - - version += "External libraries used:

      "; - std::string qt = MyQT_VERSION; - version += "QT " + qt + "
      "; - - std::string cv = MyCV_VERSION; - version += "OpenCV " + cv + "
      "; - - std::string boost = MyBT_VERSION; - version += "Boost " + boost + "
      "; - - version += "

      Icons by icons8
      "; - - version += "

      Published under LGPL licence"; - - QMessageBox msgBox(this); - msgBox.setWindowTitle("About BioTracker"); - msgBox.setTextFormat( - Qt::RichText); // this is what makes the links clickable - msgBox.setText(tr(version.c_str())); - msgBox.exec(); - - // QMessageBox::about(this, tr("About BioTracker"), tr(version.c_str())); -} - -void MainWindow::on_actionShortcuts_triggered() -{ - - QTableWidget* scTable = new QTableWidget(); - - scTable->setRowCount(0); - scTable->setColumnCount(2); - - scTable->setHorizontalHeaderItem(0, new QTableWidgetItem("Shortcut")); - scTable->setHorizontalHeaderItem(1, new QTableWidgetItem("Description")); - scTable->verticalHeader()->hide(); - - QLinkedList> scList; - - // read from file in resources and add to linked list - QFile shortcutFile(":Shortcuts/resources/shortcuts.txt"); - - if (!shortcutFile.open(QIODevice::ReadOnly | QIODevice::Text)) - return; - - QString line; - while (!shortcutFile.atEnd()) { - QTextStream stream(&shortcutFile); - while (!stream.atEnd()) { - line = stream.readLine(); - QStringList shortCutAndDescription = line.split(':'); - if (shortCutAndDescription.size() == 2) { - scList.append( - QPair(shortCutAndDescription[0], - shortCutAndDescription[1])); - } - } - } - - QLinkedList>::const_iterator sc; - for (sc = scList.constBegin(); sc != scList.constEnd(); ++sc) { - scTable->insertRow(scTable->rowCount()); - - QTableWidgetItem* scKey = new QTableWidgetItem(sc->first); - QTableWidgetItem* scKeyInfo = new QTableWidgetItem(sc->second); - scKey->setFlags(Qt::NoItemFlags | Qt::ItemIsEnabled | - Qt::ItemIsSelectable); - scKeyInfo->setFlags(Qt::NoItemFlags | Qt::ItemIsEnabled | - Qt::ItemIsSelectable); - - scTable->setItem(scTable->rowCount() - 1, 0, scKey); - scTable->setItem(scTable->rowCount() - 1, 1, scKeyInfo); - } - - // scTable->horizontalHeader()->setStretchLastSection( true ); - scTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); - - QWidget* outerWidget = new QWidget(); - outerWidget->setWindowTitle("Shortcuts"); - outerWidget->resize(scTable->size()); - QVBoxLayout* vLayout = new QVBoxLayout(); - - vLayout->addWidget(scTable); - - outerWidget->setLayout(vLayout); - - outerWidget->show(); -} - -void MainWindow::on_actionShow_introduction_triggered() -{ - m_introWiz->show(); -} - -///////////// -void MainWindow::closeEvent(QCloseEvent* event) -{ - qobject_cast(getController())->exit(); -} \ No newline at end of file +#include "MainWindow.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ui_MainWindow.h" + +#include "util/types.h" + +#include "Model/null_Model.h" +#include "View/CoreParameterView.h" +#include "View/GraphicsView.h" +#include "View/AnnotationsView.h" +#include "Controller/ControllerMainWindow.h" +#include "Controller/null_Controller.h" +#include "Controller/ControllerTextureObject.h" + +#include "VideoControllWidget.h" + +MainWindow::MainWindow(QWidget* parent, IController* controller, IModel* model) +: IViewMainWindow(parent, controller, model) +, ui(new Ui::MainWindow) +{ + _cfg = static_cast(controller)->getConfig(); + _previouslySelectedTracker = ""; + _currentParameterView = 0; + _currentCoreParameterView = 0; + _currentElementView = 0; + ui->setupUi(this); + + // add cursor position label + QLabel* _cursorPosition = new QLabel("0,0"); + _cursorPosition->setObjectName("_cursorPosition"); + statusBar()->insertPermanentWidget(0, _cursorPosition); + + // TODO + ui->actionToggle_compact_menu_toolbar_2->setEnabled(false); + + // setup toolbars + setupUpperToolBar(); + setupVideoToolBar(); + ui->toolBarTools->setEnabled(false); + + ui->toolBox->setStyleSheet( + "QToolBox::tab {" + " background-color: #e5e5e5;}"); + + // resize to full size + QWidget::showMaximized(); + + createIntroductionWizard(); + + // set window icon + QApplication::setWindowIcon( + QIcon(":/Logo/resources/logo/BT-3_non_transparent_rounded.ico")); +} + +MainWindow::~MainWindow() +{ + delete ui; +} + +//******************************************SETUP******************************************* + +void MainWindow::setupUpperToolBar() +{ + + _trackerActivator = new SwitchButton("not tracking", "tracking"); + _trackerActivator->setToolTip("Activate/Disable tracking"); + QObject::connect(_trackerActivator, + &SwitchButton::emitSetEnabled, + this, + &MainWindow::receiveSetTracking, + Qt::DirectConnection); + // QAction* activatorAction = + // ui->toolBarMenu->addWidget(_trackerActivator); + + /////////////////////media groupbox + _mediaBox = new QGroupBox("Load media"); + // style groupbox (initial red border -> no video loaded) + _mediaBox->setStyleSheet( + "QGroupBox" + " {border: 1px solid #e56262;}"); + // "QGroupBox::title {subcontrol-origin: margin;subcontrol-position: top + // center; padding: 0 3px;}"); + QFont font = QFont(); + font.setPointSize(8); + font.setBold(true); + _mediaBox->setFont(font); + + QHBoxLayout* mediaBoxLayout = new QHBoxLayout; + mediaBoxLayout->setContentsMargins(0, 0, 0, 0); + // mediaBoxLayout->setSpacing(0); + QToolButton* cameraButton = new QToolButton; + cameraButton->setIconSize(QSize(24, 24)); + cameraButton->setDefaultAction(ui->actionOpen_Camera); + cameraButton->setAutoRaise(true); + + QToolButton* videoButton = new QToolButton; + videoButton->setIconSize(QSize(24, 24)); + videoButton->setDefaultAction(ui->actionOpen_Video); + videoButton->setAutoRaise(true); + + QToolButton* imageButton = new QToolButton; + imageButton->setIconSize(QSize(24, 24)); + imageButton->setDefaultAction(ui->actionOpen_Picture); + imageButton->setAutoRaise(true); + + mediaBoxLayout->addWidget(videoButton); + mediaBoxLayout->addWidget(imageButton); + mediaBoxLayout->addWidget(cameraButton); + + _mediaBox->setLayout(mediaBoxLayout); + + ui->toolBarMenu->addWidget(_mediaBox); + + ////////trackerbox + _trackerBox = new QGroupBox("Load tracker"); + // style groupbox + _trackerBox->setStyleSheet( + "QGroupBox" + " {border: 1px solid #e56262;}"); + // "QGroupBox::title {subcontrol-origin: margin;subcontrol-position: top + // center; padding: 0 3px;}"); + + QFont font0 = QFont(); + font0.setPointSize(8); + font0.setBold(true); + _trackerBox->setFont(font0); + + QHBoxLayout* trackerBoxLayout = new QHBoxLayout; + trackerBoxLayout->setContentsMargins(0, 0, 0, 0); + + QToolButton* trackerButton = new QToolButton; + trackerButton->setIconSize(QSize(24, 24)); + trackerButton->setDefaultAction(ui->actionLoad_Tracker); + trackerButton->setAutoRaise(true); + + trackerBoxLayout->addWidget(trackerButton); + _trackerBox->setLayout(trackerBoxLayout); + + ui->toolBarMenu->addWidget(_trackerBox); + + ////////loadSaveBox + QGroupBox* loadSaveBox = new QGroupBox("Load/Save Data"); + // style loadSaveBox + // loadSaveBox->setStyleSheet("QGroupBox" + // " {border: 1px solid #e5e5e5;border-radius: 5px;margin-top: 1ex; /* + // leave space at the top for the title */}" "QGroupBox::title + // {subcontrol-origin: margin;subcontrol-position: top center; padding: 0 + // 3px;}"); + + QFont font2 = QFont(); + font2.setPointSize(8); + font2.setBold(true); + loadSaveBox->setFont(font2); + + QHBoxLayout* loadSaveBoxLayout = new QHBoxLayout; + loadSaveBoxLayout->setContentsMargins(5, 0, 5, 0); + + QToolButton* loadFileButton = new QToolButton; + loadFileButton->setIconSize(QSize(24, 24)); + loadFileButton->setDefaultAction(ui->actionLoad_trackingdata); + loadFileButton->setAutoRaise(true); + + QToolButton* saveFileButton = new QToolButton; + saveFileButton->setIconSize(QSize(24, 24)); + saveFileButton->setDefaultAction(ui->actionSave_trackingdata); + saveFileButton->setAutoRaise(true); + + loadSaveBoxLayout->addWidget(loadFileButton); + loadSaveBoxLayout->addWidget(saveFileButton); + loadSaveBox->setLayout(loadSaveBoxLayout); + + ui->toolBarMenu->addWidget(loadSaveBox); + + //////////////////choose tracker groupbox + QGroupBox* chooseTrackerBox = new QGroupBox("Choose tracker"); + // style groupbox + // chooseTrackerBox->setStyleSheet("QGroupBox" + // " {border: 1px solid #e5e5e5;border-radius: 5px;margin-top: 1ex; /* + // leave space at the top for the title */}" "QGroupBox::title + // {subcontrol-origin: margin;subcontrol-position: top center; padding: 0 + // 3px;}"); + + QFont font1 = QFont(); + font1.setPointSize(8); + font1.setBold(true); + chooseTrackerBox->setFont(font1); + // + QHBoxLayout* chooseTrackerBoxLayout = new QHBoxLayout; + chooseTrackerBoxLayout->addWidget(ui->comboBox_TrackerSelect); + chooseTrackerBoxLayout->addWidget(_trackerActivator); + + chooseTrackerBox->setLayout(chooseTrackerBoxLayout); + + ui->toolBarMenu->addWidget(chooseTrackerBox); + + /// Display image + { + auto container = new QGroupBox("Select tracking view image"); + + auto layout = new QHBoxLayout(); + + auto selector = new QComboBox(); + + auto textureController = qobject_cast( + getController()->getBioTrackerContext()->requestController( + ENUMS::CONTROLLERTYPE::TEXTUREOBJECT)); + + selector->setModel(textureController->textureNamesModel()); + + connect(selector, + QOverload::of(&QComboBox::currentIndexChanged), + this, + [=](int index) { + auto imageName = selector->itemText(index); + qDebug() << imageName; + if (textureController->hasTexture(imageName)) { + textureController->changeTextureModel(imageName); + } + }); + + layout->addWidget(selector); + + container->setLayout(layout); + + ui->toolBarMenu->addWidget(container); + } +} + +void MainWindow::checkTrackerGroupBox() +{ + _trackerBox->setStyleSheet( + "QGroupBox" + " {border: 1px solid #82c985;}"); +} + +void MainWindow::checkMediaGroupBox() +{ + _mediaBox->setStyleSheet( + "QGroupBox" + " {border: 1px solid #82c985;}"); +} + +void MainWindow::setupVideoToolBar() +{ +} + +void MainWindow::addVideoControllWidget(IView* widget) +{ + QLayout* layout = new QGridLayout(); + // layout->addWidget(dynamic_cast(widget)); + + QWidget* controlW = dynamic_cast(widget); + if (controlW) { + layout->addWidget(controlW->findChild("sld_video")); + } + ui->videoControls->setLayout(layout); + + // ui->videoControls->adjustSize(); +} + +void MainWindow::addVideoView(IView* videoView) +{ + m_graphView = dynamic_cast(videoView); + m_graphView->setParent(ui->trackingArea); + + ui->videoViewLayout->addWidget(m_graphView); +} + +void MainWindow::addTrackerElementsView(IView* elemView) +{ + + QGraphicsObject* graphObj = dynamic_cast(elemView); + graphObj->setParent(ui->trackingArea); + + m_graphView->addGraphicsItem(graphObj); + QRectF viewSceneRect = m_graphView->sceneRect(); + + _currentElementView = graphObj; +} + +void MainWindow::addCoreElementsView(IView* coreView) +{ + QGraphicsObject* graphObj = dynamic_cast(coreView); + graphObj->setParent(ui->trackingArea); + + m_graphView->addGraphicsItem(graphObj); + _currentCoreView = graphObj; +} + +void MainWindow::addNotificationBrowser(IView* notificationBrowser) +{ + QWidget* notificationWidget = dynamic_cast(notificationBrowser); + if (notificationWidget) { + notificationWidget->updateGeometry(); + + ui->notificationTab->layout()->addWidget(notificationWidget); + + notificationWidget->setVisible(1); + } + + // createIntroductionWizard(); +} + +void MainWindow::addTrackerParameterView(IView* parameter) +{ + QWidget* pluginParameter = dynamic_cast(parameter); + + while (auto item = ui->trackerOptions->layout()->takeAt(0)) { + delete item->widget(); + } + + ui->trackerOptions->layout()->addWidget(pluginParameter); +} + +void MainWindow::addCoreParameterView(IView* coreParameterView) +{ + + QWidget* coreParameter = dynamic_cast(coreParameterView); + if (coreParameter) { + // add experiment widget to toolbar + QWidget* experimentWidget = coreParameter->findChild( + "experimentWidget"); + if (experimentWidget) { + ui->experimentItem->layout()->addWidget(experimentWidget); + } + + ui->widget_alg->updateGeometry(); + coreParameter->updateGeometry(); + coreParameter->setContentsMargins(QMargins(0, 0, 0, 0)); + coreParameter->setParent(ui->widget_alg); + + QHBoxLayout* hLayout = new QHBoxLayout; + hLayout->addWidget(coreParameter, 100, 0); + hLayout->setContentsMargins( + QMargins(0, 0, 0, 0)); // left, top, right, bottom + hLayout->setMargin(0); + + ui->widget_alg->setLayout(hLayout); + + coreParameter->setVisible(1); + _currentCoreParameterView = coreParameterView; + + // resize rightpanel + QList splitterSizes; + splitterSizes << 20000 << 10000; // 2:1 TODO make this fixed (right + // panel fixed start size) + ui->mainSplitter->setSizes(splitterSizes); + } +} + +void MainWindow::setTrackerList(QStringListModel* trackerList, QString current) +{ + ui->comboBox_TrackerSelect->setModel(trackerList); + ui->comboBox_TrackerSelect->setCurrentText(current); +} + +// TODO put this in a class +void MainWindow::createIntroductionWizard() +{ + m_introWiz = new QWizard; + + // BioTracker::Core::Settings *disableIntroWiz = + // GET_CORESETTINGS(CORE_CONFIGURATION); + bool disabled = _cfg->DisableWizard; + + // dont show again checkbox + QCheckBox* noShowCheck = new QCheckBox("Don't show this again"); + noShowCheck->setChecked(disabled); + QObject::connect(noShowCheck, + &QCheckBox::toggled, + this, + &MainWindow::toggleNoShowWiz); + + // introduction + QWizardPage* p1 = new QWizardPage; + { + p1->setTitle("BioTracker 3 - Introduction"); + + QPixmap logoImg(":/Logo/resources/logo/BT3-big.png"); + QPixmap scaledImg = logoImg.scaled(QSize(600, 400), + Qt::KeepAspectRatio, + Qt::SmoothTransformation); + + QLabel* imgLabel = new QLabel; + imgLabel->setPixmap(scaledImg); + imgLabel->setAttribute(Qt::WA_TranslucentBackground); + imgLabel->setSizePolicy(QSizePolicy::Expanding, + QSizePolicy::Expanding); + imgLabel->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); + + QFile file(":/Introduction/resources/introduction/intro.txt"); + QLabel* introLabel = new QLabel; + introLabel->setWordWrap(true); + + // read introduction text from file + QString line; + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QTextStream stream(&file); + while (!stream.atEnd()) { + line.append(stream.readLine() + "\n"); + } + introLabel->setText(line); + } + file.close(); + + QVBoxLayout* layout = new QVBoxLayout; + layout->addWidget(imgLabel); + QScrollArea* textScroll = new QScrollArea; + textScroll->setFrameShape(QFrame::NoFrame); + textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + textScroll->setWidget(introLabel); + textScroll->setWidgetResizable(true); + layout->addWidget(textScroll); + layout->setAlignment(Qt::AlignHCenter); + p1->setLayout(layout); + } + + // overview + QWizardPage* p2 = new QWizardPage; + { + p2->setTitle("BioTracker 3 - Overview"); + QLabel* label = new QLabel( + "This is the BioTracker. Don't let yourself be overwhelmed as it " + "is actually pretty simple."); + label->setWordWrap(true); + + QPixmap overviewImg( + ":/Introduction/resources/introduction/images/BioTracker.PNG"); + QPixmap scaledImg = overviewImg.scaled(QSize(600, 400), + Qt::KeepAspectRatio, + Qt::SmoothTransformation); + + QLabel* imgLabel = new QLabel; + imgLabel->setPixmap(scaledImg); + imgLabel->setSizePolicy(QSizePolicy::Expanding, + QSizePolicy::Expanding); + // imgLabel->setScaledContents(true); + + QVBoxLayout* layout = new QVBoxLayout; + layout->addWidget(imgLabel); + QScrollArea* textScroll = new QScrollArea; + textScroll->setFrameShape(QFrame::NoFrame); + textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + textScroll->setWidget(label); + textScroll->setWidgetResizable(true); + layout->addWidget(textScroll); + layout->setAlignment(Qt::AlignHCenter); + p2->setLayout(layout); + } + + // toolbars + QWizardPage* p3 = new QWizardPage; + { + p3->setTitle("BioTracker 3 - Toolbars"); + + // image + QPixmap overviewImg( + ":/Introduction/resources/introduction/images/toolbars.png"); + QPixmap scaledImg = overviewImg.scaled(QSize(600, 400), + Qt::KeepAspectRatio, + Qt::SmoothTransformation); + QLabel* imgLabel = new QLabel; + + imgLabel->setPixmap(scaledImg); + + // read toolbar text from file + QFile file(":/Introduction/resources/introduction/toolbars.txt"); + QLabel* label = new QLabel(); + label->setWordWrap(true); + + QString line; + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QTextStream stream(&file); + while (!stream.atEnd()) { + line.append(stream.readLine() + "\n"); + } + label->setText(line); + } + file.close(); + + QVBoxLayout* layout = new QVBoxLayout; + layout->addWidget(imgLabel); + QScrollArea* textScroll = new QScrollArea; + textScroll->setFrameShape(QFrame::NoFrame); + textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + textScroll->setWidget(label); + textScroll->setWidgetResizable(true); + layout->addWidget(textScroll); + layout->setAlignment(Qt::AlignHCenter); + p3->setLayout(layout); + } + + // right panel - overview + QWizardPage* p4 = new QWizardPage; + { + p4->setTitle("BioTracker 3 - Right panel overview"); + + // image + QPixmap overviewImg( + ":/Introduction/resources/introduction/images/right_panel.png"); + QPixmap scaledImg = overviewImg.scaled(QSize(600, 400), + Qt::KeepAspectRatio, + Qt::SmoothTransformation); + QLabel* imgLabel = new QLabel; + imgLabel->setPixmap(scaledImg); + + // read right panel text from file + QFile file(":/Introduction/resources/introduction/right_panel.txt"); + QLabel* label = new QLabel(); + label->setWordWrap(true); + + QString line; + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QTextStream stream(&file); + while (!stream.atEnd()) { + line.append(stream.readLine() + "\n"); + } + label->setText(line); + } + file.close(); + + QVBoxLayout* layout = new QVBoxLayout; + layout->addWidget(imgLabel); + QScrollArea* textScroll = new QScrollArea; + textScroll->setFrameShape(QFrame::NoFrame); + textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + textScroll->setWidget(label); + textScroll->setWidgetResizable(true); + layout->addWidget(textScroll); + layout->setAlignment(Qt::AlignHCenter); + + p4->setLayout(layout); + } + + // how to track + QWizardPage* p5 = new QWizardPage; + { + p5->setTitle("BioTracker 3 - Tracking"); + + // image + QPixmap overviewImg( + ":/Introduction/resources/introduction/images/tracking.png"); + QPixmap scaledImg = overviewImg.scaled(QSize(600, 400), + Qt::KeepAspectRatio, + Qt::SmoothTransformation); + QLabel* imgLabel = new QLabel; + imgLabel->setPixmap(scaledImg); + + // read tracking text from file + QFile file(":/Introduction/resources/introduction/tracking.txt"); + QLabel* label = new QLabel(); + label->setWordWrap(true); + + QString line; + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QTextStream stream(&file); + while (!stream.atEnd()) { + line.append(stream.readLine() + "\n"); + } + label->setText(line); + } + file.close(); + + QVBoxLayout* layout = new QVBoxLayout; + layout->addWidget(imgLabel); + QScrollArea* textScroll = new QScrollArea; + textScroll->setFrameShape(QFrame::NoFrame); + textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + textScroll->setWidget(label); + textScroll->setWidgetResizable(true); + layout->addWidget(textScroll); + layout->setAlignment(Qt::AlignHCenter); + + p5->setLayout(layout); + } + + // context menus + QWizardPage* p6 = new QWizardPage; + { + p6->setTitle("BioTracker 3 - Context menus"); + + // images + QPixmap contextEntityImg( + ":/Introduction/resources/introduction/images/context_entity.png"); + QPixmap scaledImg1 = contextEntityImg.scaled(QSize(300, 400), + Qt::KeepAspectRatio, + Qt::SmoothTransformation); + QLabel* imgEntityLabel = new QLabel; + imgEntityLabel->setPixmap(scaledImg1); + + QPixmap contextVideoImg( + ":/Introduction/resources/introduction/images/context_video.png"); + QPixmap scaledImg2 = contextVideoImg.scaled(QSize(300, 400), + Qt::KeepAspectRatio, + Qt::SmoothTransformation); + QLabel* imgVideoLabel = new QLabel; + imgVideoLabel->setPixmap(scaledImg2); + + // read tracking text from file + QFile file(":/Introduction/resources/introduction/context_menus.txt"); + QLabel* label = new QLabel(); + label->setWordWrap(true); + + QString line; + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QTextStream stream(&file); + while (!stream.atEnd()) { + line.append(stream.readLine() + "\n"); + } + label->setText(line); + } + file.close(); + + QVBoxLayout* outerLayout = new QVBoxLayout; + QHBoxLayout* imgLayout = new QHBoxLayout; + imgLayout->addWidget(imgEntityLabel); + imgLayout->addWidget(imgVideoLabel); + QFrame* imgFrame = new QFrame; + imgFrame->setFrameStyle(QFrame::Panel | QFrame::Sunken); + imgFrame->setLayout(imgLayout); + + outerLayout->addWidget(imgFrame); + QScrollArea* textScroll = new QScrollArea; + textScroll->setFrameShape(QFrame::NoFrame); + textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + textScroll->setWidget(label); + textScroll->setWidgetResizable(true); + outerLayout->addWidget(textScroll); + outerLayout->addWidget(noShowCheck); + + outerLayout->setAlignment(Qt::AlignHCenter); + + p6->setLayout(outerLayout); + } + + m_introWiz->addPage(p1); + m_introWiz->addPage(p2); + m_introWiz->addPage(p3); + m_introWiz->addPage(p4); + m_introWiz->addPage(p5); + m_introWiz->addPage(p6); + // m_introWiz->addPage(p7); + + m_introWiz->setWindowTitle("Introduction"); + if (!disabled) { + QRect rec = QApplication::desktop()->availableGeometry(); + m_introWiz->resize(m_introWiz->width(), 500); + m_introWiz->show(); + // m_introWiz->showMaximized(); + } +} + +/////////////////////////////////////////// + +void MainWindow::setCorePermission( + std::pair permission) +{ + if (permission.first == ENUMS::COREPERMISSIONS::COMPONENTADD) { + ui->actionAdd_Track->setEnabled(permission.second); + return; + } + if (permission.first == ENUMS::COREPERMISSIONS::COMPONENTREMOVE) { + ui->actionDelete_selected_tracks->setEnabled(permission.second); + return; + } + if (permission.first == ENUMS::COREPERMISSIONS::COMPONENTSWAP) { + ui->actionSwap_ID_s->setEnabled(permission.second); + return; + } +} + +void MainWindow::on_comboBox_TrackerSelect_currentIndexChanged(QString s) +{ + QString ct = ui->comboBox_TrackerSelect->currentText(); + if (!ct.isEmpty() && _previouslySelectedTracker != ct) { + _previouslySelectedTracker = ct; + Q_EMIT selectPlugin(ct); + } +} + +void MainWindow::setCursorPositionLabel(QPoint pos) +{ + QString posString = QString("%1, %2").arg(QString::number(pos.x()), + QString::number(pos.y())); + + QLabel* currentChild = statusBar()->findChild("_cursorPosition"); + currentChild->setText(posString); +} + +void MainWindow::activeTrackingCheckBox() +{ + // ui->checkBox_TrackingActivated->setEnabled(true); + _trackerActivator->setEnabled(true); + checkTrackerGroupBox(); + ui->toolBarTools->setEnabled(true); +} + +void MainWindow::deactivateTrackingCheckBox() +{ + // ui->checkBox_TrackingActivated->setEnabled(false); + _trackerActivator->setEnabled(false); +} + +void MainWindow::saveDataToFile() +{ + static const QString fileFilter( + "tracking data files (*.csv *.dat *.json)"); + + boost::filesystem::path file; + + std::string locStr = _cfg->DefaultLocationManualSave.toStdString(); + QString locStrQ = QString::fromStdString(locStr); + + QString f = QFileDialog::getSaveFileName(this, + "Save trajectory data to file", + locStrQ, + fileFilter, + 0); + + if (f != "") { + qobject_cast(getController()) + ->saveTrajectoryFile(f.toStdString()); + } +} + +////////////////////////////////////////////////SLOTS///////////////////////////////////// + +void MainWindow::toggleNoShowWiz(bool toggle) +{ + _cfg->DisableWizard = toggle; // Todo implicit cast bool->int +} + +void MainWindow::receiveSelectedCameraDevice(CameraConfiguration conf) +{ + qobject_cast(getController()) + ->loadCameraDevice(conf); +} + +void MainWindow::on_rightPanelViewControllerButton_clicked() +{ + QList splitterSizes = QList(); + if (ui->widgetParameterAreaOuterCanvas->isVisible()) { + _lastRightPanelWidth = + ui->mainSplitter->sizes()[1]; // save last width to restore on show + _lastVideoWidgetWidth = ui->mainSplitter->sizes()[0]; + + ui->widgetParameterAreaOuterCanvas->hide(); + splitterSizes + << 20000 + << ui->rightPanelViewControllerWidget->minimumSizeHint().width(); + + ui->rightPanelViewControllerButton->setText("<"); + // set menu action unchecked + ui->actionRight_panel->setChecked(false); + } else { + ui->widgetParameterAreaOuterCanvas->show(); + splitterSizes << _lastVideoWidgetWidth << _lastRightPanelWidth; + ui->rightPanelViewControllerButton->setText(">"); + + // set menu action checked + ui->actionRight_panel->setChecked(true); + } + ui->mainSplitter->setSizes(splitterSizes); +} + +void MainWindow::on_bottomPanelViewControllerButton_clicked() +{ + ui->videoControls->setVisible( + ui->bottomPanelViewControllerButton->text() == "^"); + ui->bottomPanelViewControllerButton->setText( + ui->bottomPanelViewControllerButton->text() == "v" ? "^" : "v"); +} + +void MainWindow::activateTracking() +{ + _trackerActivator->setState(true); +} + +void MainWindow::deactivateTracking() +{ + _trackerActivator->setState(false); +} + +void MainWindow::receiveSetTracking(bool toggle) +{ + if (toggle) { + qobject_cast(getController())->activeTracking(); + } else { + qobject_cast(getController()) + ->deactiveTrackring(); + } +} + +void MainWindow::resetTrackerViews() +{ + if (_currentElementView && _currentCoreView) { + _currentElementView->setParent(0); + _currentCoreView->setParent(0); + m_graphView->removeGraphicsItem(_currentElementView); + m_graphView->removeGraphicsItem(_currentCoreView); + } + + _currentElementView = nullptr; + _currentCoreView = nullptr; +} + +//////////////////////////utility toolbar action +/// slots/////////////////////////// +void MainWindow::on_actionAdd_Track_triggered() +{ + qobject_cast(getController())->emitAddTrack(); +} +void MainWindow::on_actionDelete_selected_tracks_triggered() +{ + qobject_cast(getController()) + ->emitDeleteSelectedTracks(); +} +void MainWindow::on_actionSwap_ID_s_triggered() +{ + qobject_cast(getController())->emitSwapIds(); +} +void MainWindow::on_actionSelect_all_triggered() +{ + qobject_cast(getController())->emitSelectAll(); +} +void MainWindow::on_actionChange_the_border_color_triggered() +{ + qobject_cast(getController()) + ->emitChangeColorBorder(); +} +void MainWindow::on_actionChange_the_fill_color_triggered() +{ + qobject_cast(getController()) + ->emitChangeColorFill(); +} +void MainWindow::on_actionAdd_label_Annotation_triggered() +{ + qobject_cast(getController())->emitAddLabelAnno(); +} +void MainWindow::on_actionAdd_rectangular_annotation_triggered() +{ + qobject_cast(getController())->emitAddRectAnno(); +} +void MainWindow::on_actionAdd_arrow_annotation_triggered() +{ + qobject_cast(getController())->emitAddArrAnno(); +} +void MainWindow::on_actionAdd_elliptical_annotation_triggered() +{ + qobject_cast(getController())->emitAddEllAnno(); +} +void MainWindow::on_actionDelete_selected_Annotation_triggered() +{ + qobject_cast(getController())->emitDelSelAnno(); +} + +///////////////////////////////menu->file slots///////////////////////////// + +void MainWindow::on_actionOpen_Video_triggered() +{ + static const QString videoFilter( + "Video files (*.avi *.wmv *.mp4 *.mkv *.mov)"); + + QString filename = + QFileDialog::getOpenFileName(this, "Open video", "", videoFilter, 0); + + if (!filename.isEmpty()) { + dynamic_cast(getController()) + ->loadVideo({filename.toStdString().c_str()}); + } +} + +void MainWindow::on_actionOpen_Video_batch_triggered() +{ + static const QString videoFilter( + "Video files (*.avi *.wmv *.mp4 *.mkv *.mov)"); + + std::vector files; + + for (QString const& path : + QFileDialog::getOpenFileNames(this, + "Open image files", + "", + videoFilter, + 0)) { + files.push_back(boost::filesystem::path(path.toStdString())); + } + + if (!files.empty()) { + qobject_cast(getController())->loadVideo(files); + } +} + +void MainWindow::on_actionLoad_Tracker_triggered() +{ + static const QString pluginFilter( + "BioTracker Tracking Plugin files (*.bio_tracker.so *.bio_tracker.dll " + "*.bio_tracker.dylib)"); + + QString filename = QFileDialog::getOpenFileName( + this, + "Open BioTracker Tracking Plugin", + "", + pluginFilter, + 0); + + if (!filename.isEmpty()) { + qobject_cast(getController()) + ->loadTracker(filename); + } +} + +void MainWindow::on_actionOpen_Picture_triggered() +{ + static const QString imageFilter( + "image files (*.png *.jpg *.jpeg *.gif *.bmp *.jpe *.ppm *.tiff *.tif " + "*.sr *.ras *.pbm *.pgm *.jp2 *.dib)"); + + std::vector files; + for (QString const& path : + QFileDialog::getOpenFileNames(this, + "Open image files", + "", + imageFilter, + 0)) { + files.push_back(boost::filesystem::path(path.toStdString())); + } + + if (!files.empty()) { + qobject_cast(getController()) + ->loadPictures(files); + } +} + +void MainWindow::on_actionLoad_trackingdata_triggered() +{ + static const QString imageFilter( + "tracking data files (*.csv *.dat *.json)"); + + std::vector files; + for (QString const& path : + QFileDialog::getOpenFileNames(this, + "Open tracking file", + "", + imageFilter, + 0)) { + files.push_back(boost::filesystem::path(path.toStdString())); + } + + if (!files.empty()) { + qobject_cast(getController()) + ->loadTrajectoryFile(files[0].string()); + } +} + +void MainWindow::on_actionSave_trackingdata_triggered() +{ + saveDataToFile(); +} + +void MainWindow::on_actionOpen_Camera_triggered() +{ + m_CameraDevice = new CameraDevice(); + + m_CameraDevice->show(); + + QObject::connect(m_CameraDevice, + &CameraDevice::emitSelectedCameraDevice, + this, + &MainWindow::receiveSelectedCameraDevice); +} + +void MainWindow::on_actionQuit_triggered() +{ + qobject_cast(getController())->exit(); +} + +///////////////////////////////menu->edit slots///////////////////////////// + +void MainWindow::on_actionUndo_triggered() +{ + qobject_cast(getController())->emitUndoCommand(); +} + +void MainWindow::on_actionRedo_triggered() +{ + qobject_cast(getController())->emitRedoCommand(); +} + +void MainWindow::on_actionShowActionList_triggered() +{ + qobject_cast(getController()) + ->emitShowActionListCommand(); +} + +void MainWindow::on_actionSettings_triggered() +{ + m_SettingsWindow = new SettingsWindow(0, _cfg); + + m_SettingsWindow->show(); +} + +///////////////////////////////menu->view slots///////////////////////////// + +// toggle toolbars actions +void MainWindow::on_actionToggle_menu_toolbar_triggered() +{ + bool currentState = ui->toolBarMenu->isVisible(); + ui->toolBarMenu->setVisible(!currentState); + ui->actionToggle_menu_toolbar->setText( + !currentState ? "Hide menu toolbar" : "Show menu toolbar"); +} +void MainWindow::on_actionToggle_view_toolbar_triggered() +{ + bool currentState = ui->toolBarTools->isVisible(); + ui->toolBarTools->setVisible(!currentState); + ui->actionToggle_view_toolbar->setText( + !currentState ? "Hide view toolbar" : "Show view toolbar"); +} +void MainWindow::on_actionToggle_video_toolbar_triggered() +{ + bool currentState = ui->toolBarVideo->isVisible(); + ui->toolBarVideo->setVisible(!currentState); + ui->actionToggle_video_toolbar->setText( + !currentState ? "Hide view toolbar" : "Show view toolbar"); +} + +void MainWindow::on_actionToggle_compact_menu_toolbar_2_triggered() +{ + ui->toolBarMenu->setStyleSheet( + "QGroupBox" + " {border-style: none; margin-top: 0ex; font-size: 1px;}" + "QGroupBox::title {font-size: 1px; padding: 0 3px;}"); +} + +void MainWindow::on_toolBarMenu_visibilityChanged(bool visible) +{ + ui->actionToggle_menu_toolbar->setText(visible ? "Hide menu toolbar" + : "Show menu toolbar"); +} +void MainWindow::on_toolBarTools_visibilityChanged(bool visible) +{ + ui->actionToggle_view_toolbar->setText(visible ? "Hide view toolbar" + : "Show view toolbar"); +} +void MainWindow::on_toolBarVideo_visibilityChanged(bool visible) +{ + ui->actionToggle_video_toolbar->setText(visible ? "Hide video toolbar" + : "Show video toolbar"); +} + +void MainWindow::on_actionBottom_panel_triggered(bool checked) +{ + ui->bottomPanelViewControllerButton->click(); +} +void MainWindow::on_actionRight_panel_triggered(bool checked) +{ + ui->rightPanelViewControllerButton->click(); +} + +void MainWindow::on_actionToggle_fullscreen_triggered() +{ + if (isFullScreen()) { + showNormal(); + } else { + showFullScreen(); + } +} + +//////////////////////////////////menu->Go to +/// slots////////////////////////////////// + +void MainWindow::on_actionOpen_Plugins_directory_triggered() +{ + QDesktopServices::openUrl(QUrl::fromLocalFile(_cfg->DirPlugins)); +} +void MainWindow::on_actionOpen_Track_directory_triggered() +{ + QDesktopServices::openUrl(QUrl::fromLocalFile(_cfg->DirTracks)); +} +void MainWindow::on_actionOpen_Trial_directory_triggered() +{ + QDesktopServices::openUrl(QUrl::fromLocalFile(_cfg->DirTrials)); +} +void MainWindow::on_actionOpen_Screenshot_directory_triggered() +{ + QDesktopServices::openUrl(QUrl::fromLocalFile(_cfg->DirScreenshots)); +} +void MainWindow::on_actionOpen_Videos_directory_triggered() +{ + QDesktopServices::openUrl(QUrl::fromLocalFile(_cfg->DirVideos)); +} + +//////////////////////////////////menu->Help +/// slots////////////////////////////// + +void MainWindow::on_actionUser_guide_triggered() +{ + QDesktopServices::openUrl( + QUrl("https://github.com/BioroboticsLab/biotracker_core/wiki")); +} + +void MainWindow::on_actionAbout_triggered() +{ + std::string version = ""; + version = "BioTracker3

      "; + + version = "Source Version: "; + version += SOURCE_VERSION; + version += +"

      "; + + version += "External libraries used:

      "; + std::string qt = MyQT_VERSION; + version += "QT " + qt + "
      "; + + std::string cv = MyCV_VERSION; + version += "OpenCV " + cv + "
      "; + + std::string boost = MyBT_VERSION; + version += "Boost " + boost + "
      "; + + version += "

      Icons by icons8
      "; + + version += "

      Published under LGPL licence"; + + QMessageBox msgBox(this); + msgBox.setWindowTitle("About BioTracker"); + msgBox.setTextFormat( + Qt::RichText); // this is what makes the links clickable + msgBox.setText(tr(version.c_str())); + msgBox.exec(); + + // QMessageBox::about(this, tr("About BioTracker"), tr(version.c_str())); +} + +void MainWindow::on_actionShortcuts_triggered() +{ + + QTableWidget* scTable = new QTableWidget(); + + scTable->setRowCount(0); + scTable->setColumnCount(2); + + scTable->setHorizontalHeaderItem(0, new QTableWidgetItem("Shortcut")); + scTable->setHorizontalHeaderItem(1, new QTableWidgetItem("Description")); + scTable->verticalHeader()->hide(); + + QLinkedList> scList; + + // read from file in resources and add to linked list + QFile shortcutFile(":Shortcuts/resources/shortcuts.txt"); + + if (!shortcutFile.open(QIODevice::ReadOnly | QIODevice::Text)) + return; + + QString line; + while (!shortcutFile.atEnd()) { + QTextStream stream(&shortcutFile); + while (!stream.atEnd()) { + line = stream.readLine(); + QStringList shortCutAndDescription = line.split(':'); + if (shortCutAndDescription.size() == 2) { + scList.append( + QPair(shortCutAndDescription[0], + shortCutAndDescription[1])); + } + } + } + + QLinkedList>::const_iterator sc; + for (sc = scList.constBegin(); sc != scList.constEnd(); ++sc) { + scTable->insertRow(scTable->rowCount()); + + QTableWidgetItem* scKey = new QTableWidgetItem(sc->first); + QTableWidgetItem* scKeyInfo = new QTableWidgetItem(sc->second); + scKey->setFlags(Qt::NoItemFlags | Qt::ItemIsEnabled | + Qt::ItemIsSelectable); + scKeyInfo->setFlags(Qt::NoItemFlags | Qt::ItemIsEnabled | + Qt::ItemIsSelectable); + + scTable->setItem(scTable->rowCount() - 1, 0, scKey); + scTable->setItem(scTable->rowCount() - 1, 1, scKeyInfo); + } + + // scTable->horizontalHeader()->setStretchLastSection( true ); + scTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); + + QWidget* outerWidget = new QWidget(); + outerWidget->setWindowTitle("Shortcuts"); + outerWidget->resize(scTable->size()); + QVBoxLayout* vLayout = new QVBoxLayout(); + + vLayout->addWidget(scTable); + + outerWidget->setLayout(vLayout); + + outerWidget->show(); +} + +void MainWindow::on_actionShow_introduction_triggered() +{ + m_introWiz->show(); +} + +///////////// +void MainWindow::closeEvent(QCloseEvent* event) +{ + qobject_cast(getController())->exit(); +} diff --git a/Src/View/MainWindow.h b/Src/View/MainWindow.h index b79435f6..587a6ca5 100644 --- a/Src/View/MainWindow.h +++ b/Src/View/MainWindow.h @@ -181,8 +181,8 @@ private Q_SLOTS: _currentElementView; /**< current visualisation view of tracker */ QGraphicsObject* _currentCoreView; /**< current visualisation view of core app */ - // QWidget* _currentTrackerP; /**< current tracker paramter - // view + // QWidget* _currentTrackerP; /**< current tracker + // paramter view // */ QString _previouslySelectedTracker; /**< previous tracker */ diff --git a/Src/main.cpp b/Src/main.cpp index 1f702acd..c3a95b2b 100644 --- a/Src/main.cpp +++ b/Src/main.cpp @@ -1,116 +1,117 @@ -#include -#include "BioTracker3App.h" -#include "GuiContext.h" -#include "opencv2/core/core.hpp" -#include -#include -#include -#include -#include -#include "Model/MediaPlayerStateMachine/PlayerParameters.h" -#include "util/types.h" -#include "util/camera/base.h" - -#include "util/CLIcommands.h" -#include "Interfaces/IModel/IModelTrackedComponent.h" -#include "util/Config.h" -#include - -#include - -#if HAS_PYLON - #include -#endif - -// This will hide the console. -// See -// https://stackoverflow.com/questions/2139637/hide-console-of-windows-application -#ifdef _WIN32 -//#pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup") -#endif - -// Get the default Qt message handler. -static const QtMessageHandler QT_DEFAULT_MESSAGE_HANDLER = - qInstallMessageHandler(0); - -void myMessageOutput(QtMsgType type, - const QMessageLogContext& context, - const QString& msg) -{ - if (type == QtMsgType::QtInfoMsg) - return; - - QString fmsg = qFormatLogMessage(type, context, msg); - QString outf = IConfig::dataLocation + "/log.txt"; - std::string debugs = outf.toStdString(); - QFile outFile(outf); - outFile.open(QIODevice::WriteOnly | QIODevice::Append); - QTextStream ts(&outFile); - ts << fmsg << endl; - - (*QT_DEFAULT_MESSAGE_HANDLER)(type, context, msg); -} - -int main(int argc, char* argv[]) -{ - QApplication app(argc, argv); - - app.setOrganizationName("FU Berlin"); - app.setApplicationName("BioTracker"); - IConfig::configLocation = QStandardPaths::writableLocation( - QStandardPaths::AppConfigLocation); - IConfig::dataLocation = QStandardPaths::writableLocation( - QStandardPaths::AppDataLocation); - Config* cfg = new Config(); - CLI::optionParser(argc, argv, cfg); - QString cfgLoc = cfg->CfgCustomLocation.isEmpty() ? Config::configLocation - : cfg->CfgCustomLocation; - cfg->load(cfgLoc, "config.ini"); - cfg->save(cfgLoc, "config.ini"); - -#if HAS_PYLON - const auto cache = boost::filesystem::path{ - QStandardPaths::writableLocation(QStandardPaths::CacheLocation) - .toStdString()}; - const auto genicamCache = cache / "genicam_xml_cache"; - - boost::filesystem::create_directories(genicamCache); - GenICam::SetGenICamCacheFolder(GenICam::gcstring{genicamCache.c_str()}); - - qputenv(GENICAM_CACHE_VERSION, - QByteArray::fromStdString(genicamCache.string())); -#endif - - qRegisterMetaType("cv::Mat"); - qRegisterMetaType>("std::shared_ptr"); - qRegisterMetaType("std::size_t"); - qRegisterMetaType("size_t"); - qRegisterMetaType>( - "std::vector"); - qRegisterMetaType("BiotrackerTypes::AreaType"); - qRegisterMetaType>("QVector"); - qRegisterMetaType>( - "std::shared_ptr"); - qRegisterMetaType("CameraConfiguration"); - qRegisterMetaTypeStreamOperators>( - "QList"); - - qInstallMessageHandler(myMessageOutput); - - QDir qd; - qd.mkpath(IConfig::configLocation); - qd.mkpath(IConfig::dataLocation); - qd.mkpath(cfg->DirPlugins); - qd.mkpath(cfg->DirVideos); - qd.mkpath(cfg->DirTracks); - qd.mkpath(cfg->DirTrials); - qd.mkpath(cfg->DirScreenshots); - qd.mkpath(cfg->DirTemp); - - BioTracker3App bioTracker3(&app); - GuiContext context(&bioTracker3, cfg); - bioTracker3.setBioTrackerContext(&context); - bioTracker3.runBioTracker(); - - app.exec(); -} +#include +#include "BioTracker3App.h" +#include "GuiContext.h" +#include "opencv2/core/core.hpp" +#include +#include +#include +#include +#include +#include "Model/MediaPlayerStateMachine/PlayerParameters.h" +#include "util/types.h" +#include "util/camera/base.h" + +#include "util/CLIcommands.h" +#include "Interfaces/IModel/IModelTrackedComponent.h" +#include "util/Config.h" +#include + +#include + +#if HAS_PYLON + #include +#endif + +// This will hide the console. +// See +// https://stackoverflow.com/questions/2139637/hide-console-of-windows-application +#ifdef _WIN32 +//#pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup") +#endif + +// Get the default Qt message handler. +static const QtMessageHandler QT_DEFAULT_MESSAGE_HANDLER = + qInstallMessageHandler(0); + +void myMessageOutput(QtMsgType type, + const QMessageLogContext& context, + const QString& msg) +{ + if (type == QtMsgType::QtInfoMsg) + return; + + QString fmsg = qFormatLogMessage(type, context, msg); + QString outf = IConfig::dataLocation + "/log.txt"; + std::string debugs = outf.toStdString(); + QFile outFile(outf); + outFile.open(QIODevice::WriteOnly | QIODevice::Append); + QTextStream ts(&outFile); + ts << fmsg << endl; + + (*QT_DEFAULT_MESSAGE_HANDLER)(type, context, msg); +} + +int main(int argc, char* argv[]) +{ + QApplication app(argc, argv); + + app.setOrganizationName("FU Berlin"); + app.setApplicationName("BioTracker"); + IConfig::configLocation = QStandardPaths::writableLocation( + QStandardPaths::AppConfigLocation); + IConfig::dataLocation = QStandardPaths::writableLocation( + QStandardPaths::AppDataLocation); + Config* cfg = new Config(); + CLI::optionParser(argc, argv, cfg); + QString cfgLoc = cfg->CfgCustomLocation.isEmpty() ? Config::configLocation + : cfg->CfgCustomLocation; + cfg->load(cfgLoc, "config.ini"); + cfg->save(cfgLoc, "config.ini"); + +#if HAS_PYLON + const auto cache = boost::filesystem::path{ + QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + .toStdString()}; + const auto genicamCache = cache / "genicam_xml_cache"; + + boost::filesystem::create_directories(genicamCache); + GenICam::SetGenICamCacheFolder(GenICam::gcstring{genicamCache.c_str()}); + + qputenv(GENICAM_CACHE_VERSION, + QByteArray::fromStdString(genicamCache.string())); +#endif + + qRegisterMetaType("cv::Mat"); + qRegisterMetaType("std::size_t"); + qRegisterMetaType("size_t"); + qRegisterMetaType>( + "std::vector"); + qRegisterMetaType("BiotrackerTypes::AreaType"); + qRegisterMetaType>("QVector"); + qRegisterMetaType>("QVector"); + qRegisterMetaType>("QMap"); + qRegisterMetaType>( + "std::shared_ptr"); + qRegisterMetaType("CameraConfiguration"); + qRegisterMetaTypeStreamOperators>( + "QList"); + + qInstallMessageHandler(myMessageOutput); + + QDir qd; + qd.mkpath(IConfig::configLocation); + qd.mkpath(IConfig::dataLocation); + qd.mkpath(cfg->DirPlugins); + qd.mkpath(cfg->DirVideos); + qd.mkpath(cfg->DirTracks); + qd.mkpath(cfg->DirTrials); + qd.mkpath(cfg->DirScreenshots); + qd.mkpath(cfg->DirTemp); + + BioTracker3App bioTracker3(&app); + GuiContext context(&bioTracker3, cfg); + bioTracker3.setBioTrackerContext(&context); + bioTracker3.runBioTracker(); + + app.exec(); +} diff --git a/Src/util/VideoCoder.cpp b/Src/util/VideoCoder.cpp index 5d717bc4..69f8c68d 100644 --- a/Src/util/VideoCoder.cpp +++ b/Src/util/VideoCoder.cpp @@ -235,7 +235,7 @@ int VideoCoder::toggle(int w, int h, double fps) return m_recording; } -void VideoCoder::add(std::shared_ptr m, int needsConversion) +void VideoCoder::add(cv::Mat m, int needsConversion) { worker->ll.push(std::make_shared(m, needsConversion), m_dropFrames); diff --git a/Src/util/VideoCoder.h b/Src/util/VideoCoder.h index 74422805..75700893 100644 --- a/Src/util/VideoCoder.h +++ b/Src/util/VideoCoder.h @@ -6,6 +6,7 @@ #include #include #include +#include #include "Utility/misc.h" #ifdef WITH_CUDA @@ -43,11 +44,11 @@ class YuvConverter class ImageBuffer { public: - std::shared_ptr _img; - int _needsConversion; + std::optional _img; + int _needsConversion; - ImageBuffer(std::shared_ptr pimg, int ncv) - : _img(pimg) + ImageBuffer(cv::Mat img, int ncv) + : _img(img) , _needsConversion(ncv) { } @@ -141,7 +142,7 @@ class VideoCoder : public QObject int toggle(int w, int h, double fps = -1); - void add(std::shared_ptr m, int needsConversion = 0); + void add(cv::Mat m, int needsConversion = 0); int start(); void stop(); From cdf94e450c1bc9f6fdbb2e80d1cb8978af442af2 Mon Sep 17 00:00:00 2001 From: Moritz Maxeiner Date: Fri, 19 Apr 2024 01:28:51 +0200 Subject: [PATCH 171/171] [ci] Add missings Windows DLLs. --- ci/configure.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ci/configure.py b/ci/configure.py index dc511ef9..3b0ed7e3 100755 --- a/ci/configure.py +++ b/ci/configure.py @@ -35,6 +35,13 @@ def define_env(name: str): "avutil-56", "swscale-5", "swresample-3", + "pcre2-16", + "zstd", + "harfbuzz", + "freetype", + "brotlidec", + "bz2", + "brotlicommon", ] opencv_components = [

    0&Pk?0D{yZb7M3*R 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ê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 diff --git a/BioTracker/CoreApp/BioTracker/resources/introduction/images/context_entity.png b/BioTracker/CoreApp/BioTracker/resources/introduction/images/context_entity.png index 98a28c322853d2d079f0be5374cca42a531455ff..891d7cdba78b342c80bd207d69c7a79f374b38f8 100644 GIT binary patch literal 100488 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

    qezl&Mot7rYc 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 - - - - - BinThreshold - - - - - - - Set the binarization threshold - - - - - - - - - - - Size Erode - - - - - - - Set the erosion size - - - - - - - - - - - Size Dilate - - - - - - - Set the dilation size - - - - - - - - - - - Background Ratio - - - - - - - Set the background ratio - - - 6 - - - 1.000000000000000 - - - 0.001000000000000 - - - 0.001000000000000 - - - - - - - - - - - Min Blob Size - - - - - - - Set the minimal blob size - - - - - - - - - - - Max Blob Size - - - - - - - Sets the maximum blob size - - - 10000 - - - - + + + #frame{color: #e5e5e5;} + + + QFrame::Box + + + QFrame::Plain + + + + 3 + + + 5 + + + 5 + + + 5 + + + 5 + + + + + Set the binarization threshold + + + + + + Biarization Threshold + + + + + + + Set the binarization threshold + + + + + + + + + + color: #e5e5e5; + + + QFrame::Plain + + + Qt::Horizontal + + + + + + + Set the erosion size + + + + + + Size Erode + + + + + + + Set the erosion size + + + + + + + + + + color: #e5e5e5; + + + QFrame::Plain + + + Qt::Horizontal + + + + + + + Set the dilation size + + + + + + Size Dilate + + + + + + + Set the dilation size + + + + + + + + + + color: #e5e5e5; + + + QFrame::Plain + + + Qt::Horizontal + + + + + + + Set the background ratio + + + + + + Background Ratio + + + + + + + Set the background ratio + + + 6 + + + 1.000000000000000 + + + 0.001000000000000 + + + 0.001000000000000 + + + + + + + + + + color: #e5e5e5; + + + QFrame::Plain + + + Qt::Horizontal + + + + + + + Set the minimal blob size + + + + + + Min Blob Size + + + + + + + Set the minimal blob size + + + + + + + + + + color: #e5e5e5; + + + QFrame::Plain + + + Qt::Horizontal + + + + + + + Sets the maximum blob size + + + + + + Max Blob Size + + + + + + + Sets the maximum blob size + + + 10000 + + + + + + + + + + Set the parameters for the tracking plugin + + + Set Values + + + + + - - - Set Values + + + Qt::Horizontal From d535ac0af326b9ed19a767d975acb093982d43fa Mon Sep 17 00:00:00 2001 From: jotpio Date: Fri, 13 Apr 2018 20:55:48 +0200 Subject: [PATCH 029/171] added set text on right-click to each annotation --- .../Controller/ControllerAnnotations.cpp | 25 +++++- .../CoreApp/BioTracker/Model/Annotations.cpp | 82 ++++++++++++++++--- .../CoreApp/BioTracker/Model/Annotations.h | 12 ++- .../BioTracker/View/AnnotationsView.cpp | 2 +- .../BioTracker/View/CoreParameterView.ui | 6 +- .../View/Utility/RotationHandle.cpp | 2 +- .../View/TrackerParameterView.ui | 2 +- 7 files changed, 107 insertions(+), 24 deletions(-) diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.cpp b/BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.cpp index 3bf096d8..d3487918 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.cpp +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.cpp @@ -122,7 +122,7 @@ void ControllerAnnotations::keyPressEvent(QKeyEvent *event) void ControllerAnnotations::mousePressEvent(QMouseEvent *event, const QPoint &pos) { - + // left-click: add annotation in pos or try start dragging annotation if (event->button() == Qt::LeftButton) { auto model = static_cast(getModel()); bool handled = true; @@ -142,10 +142,12 @@ void ControllerAnnotations::mousePressEvent(QMouseEvent *event, const QPoint &po model->startEllipse(pos, model->getCurrentFrame()); break; default: - if (model->tryStartDragging(pos)) + if (model->tryStartDragging(pos)) { updateView(); - else + } + else { handled = false; + } updateView(); break; } @@ -153,6 +155,23 @@ void ControllerAnnotations::mousePressEvent(QMouseEvent *event, const QPoint &po event->accept(); actionQueued = ActionQueued::None; } + + // right-click: set text for annotation in pos + else if (event->button() == Qt::RightButton) { + auto model = static_cast(getModel()); + bool handled = true; + + if (model->trySetText(pos)) { + updateView(); + } + else { + handled = false; + } + if (handled) { + event->accept(); + } + + } } diff --git a/BioTracker/CoreApp/BioTracker/Model/Annotations.cpp b/BioTracker/CoreApp/BioTracker/Model/Annotations.cpp index 90901d91..6cdcc890 100644 --- a/BioTracker/CoreApp/BioTracker/Model/Annotations.cpp +++ b/BioTracker/CoreApp/BioTracker/Model/Annotations.cpp @@ -3,6 +3,9 @@ #include #include +#include +#include + Annotations::~Annotations() { serialize(); @@ -26,7 +29,7 @@ void Annotations::serialize() const outfile << annotation.get() << std::endl; } } - + dirty = !outfile.good(); } @@ -104,7 +107,7 @@ std::ostream& operator<<(std::ostream& stream, const Annotations::Annotation *an return stream; } -void Annotations::Annotation::drawHandleLocation(QPainter *painter, QPoint pos) +void Annotations::Annotation::drawHandleLocation(QPainter *painter, QPoint pos, QString text) { QPen original{ painter->pen() }; QPen dotted{ original }; @@ -113,6 +116,31 @@ void Annotations::Annotation::drawHandleLocation(QPainter *painter, QPoint pos) painter->setPen(dotted); const int radius = 20; painter->drawEllipse(pos, radius, radius); + + //text slighy other color --> hue + 20 + //so text can be read when annotation is also contrasting with the background + QPen textPen{ original }; + QColor textColor{ dotted.color() }; + textColor.setHsv(textColor.hsvHue() + 20, textColor.hsvSaturation(), textColor.value()); + textPen.setColor(textColor); + painter->setPen(textPen); + + //font + QFont font= painter->font(); + font.setPointSize(15); + painter->setFont(font); + + //calculate text width to position variably + QFontMetrics fm(font); + int width = fm.width(text); + int height = fm.height(); + + //text position under origin handle + QPoint textPos = pos + QPoint(-width / 2, 20 + height); + + //draw text + painter->drawText(textPos, text); + painter->setPen(original); } @@ -125,22 +153,26 @@ bool Annotations::Annotation::isHandleAtPosition(const QPoint &handle, const QPo void Annotations::Annotation::deserializeFrom(std::queue &args) { - if (args.size() < 3) return; + if (args.size() < 4) return; startFrame = std::stoi(args.front()); args.pop(); + text = QString::fromStdString(args.front()); args.pop(); const int x = std::stoi(args.front()); args.pop(); const int y = std::stoi(args.front()); args.pop(); origin = QPoint(x, y); + } std::vector Annotations::Annotation::serializeToVector() const { - return { name(), std::to_string(startFrame), std::to_string(origin.x()), std::to_string(origin.y()) }; + return { name(), std::to_string(startFrame), text.toStdString(), std::to_string(origin.x()), std::to_string(origin.y()) }; } void Annotations::AnnotationLabel::deserializeFrom(std::queue &args) { Annotation::deserializeFrom(args); - if (args.size() < 0) return; + if (args.size() < 0) { + return; + } } std::vector Annotations::AnnotationLabel::serializeToVector() const @@ -158,9 +190,10 @@ void Annotations::AnnotationLabel::paint(QPainter * painter, const QStyleOptionG const int len = 20; painter->drawLine(this->origin + QPoint(-len, -len), this->origin + QPoint(+len, +len)); painter->drawLine(this->origin + QPoint(-len, len), this->origin + QPoint(+len, -len)); + painter->setPen(original); - Annotation::drawHandleLocation(painter, origin); + Annotation::drawHandleLocation(painter, origin, text); } void Annotations::AnnotationArrow::deserializeFrom(std::queue &args) @@ -201,8 +234,8 @@ void Annotations::AnnotationArrow::paint(QPainter * painter, const QStyleOptionG painter->drawPoint(this->arrowHead); painter->restore(); } - Annotation::drawHandleLocation(painter, origin); - Annotation::drawHandleLocation(painter, arrowHead); + Annotation::drawHandleLocation(painter, origin, text ); + Annotation::drawHandleLocation(painter, arrowHead, ""); } QPoint *Annotations::AnnotationArrow::getHandleForPosition(const QPoint &pos) @@ -250,8 +283,8 @@ void Annotations::AnnotationRect::paint(QPainter * painter, const QStyleOptionGr painter->drawPoint(this->bottomRight); painter->restore(); } - Annotation::drawHandleLocation(painter, origin); - Annotation::drawHandleLocation(painter, bottomRight); + Annotation::drawHandleLocation(painter, origin, text); + Annotation::drawHandleLocation(painter, bottomRight, ""); } QPoint * Annotations::AnnotationRect::getHandleForPosition(const QPoint & pos) @@ -299,8 +332,8 @@ void Annotations::AnnotationEllipse::paint(QPainter * painter, const QStyleOptio painter->drawPoint(this->bottomRight); painter->restore(); } - Annotation::drawHandleLocation(painter, origin); - Annotation::drawHandleLocation(painter, bottomRight); + Annotation::drawHandleLocation(painter, origin, text); + Annotation::drawHandleLocation(painter, bottomRight, ""); } QPoint * Annotations::AnnotationEllipse::getHandleForPosition(const QPoint & pos) @@ -352,8 +385,31 @@ bool Annotations::tryStartDragging(QPoint cursor) selection.reset(); for (auto &annotation : annotations) { - if (!(selection.handle = annotation->getHandleForPosition(cursor))) continue; + if (!(selection.handle = annotation->getHandleForPosition(cursor))) { + continue; + } + selection.annotation = annotation; + return true; + } + return false; +} + +bool Annotations::trySetText(QPoint cursor) { + selection.reset(); + for (auto &annotation : annotations) + { + if (!(selection.handle = annotation->getHandleForPosition(cursor))) { + continue; + } selection.annotation = annotation; + + bool ok; + QString annoText = QInputDialog::getText(Q_NULLPTR, tr("Set annotation text"), + tr("Annotation text:"), QLineEdit::Normal, annotation->getText(), &ok); + if (ok) { + annotation->setText(annoText); + dirty = true; + } return true; } return false; diff --git a/BioTracker/CoreApp/BioTracker/Model/Annotations.h b/BioTracker/CoreApp/BioTracker/Model/Annotations.h index 08a18351..56f3e76f 100644 --- a/BioTracker/CoreApp/BioTracker/Model/Annotations.h +++ b/BioTracker/CoreApp/BioTracker/Model/Annotations.h @@ -41,12 +41,18 @@ class Annotations : public IModel { // Position in pixels. QPoint origin{ 0, 0 }; size_t startFrame{ 0 }; + // Possible text for each annotation + QString text{ "" }; // Name that identifies this type of annotation and is used for serialization. virtual std::string name() const = 0; virtual void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) const = 0; // Saving requires writing properties to vector of strings. virtual std::vector serializeToVector() const; virtual void deserializeFrom(std::queue &args); + // Set text. Called when right clicking. + virtual void setText(QString newText) { text = newText; }; + // Get text.Called when right clicking. + virtual QString getText() { return text; }; // Called either during dragging or when the mouse is released. // Needs to update positional data. virtual bool onEndAnnotation(QPoint currentPosition) { origin = currentPosition; return true; }; @@ -59,7 +65,7 @@ class Annotations : public IModel { return nullptr; } // Static, so that the view can use it to draw special handles. - static void drawHandleLocation(QPainter *painter, QPoint pos); + static void drawHandleLocation(QPainter *painter, QPoint pos, QString text); protected: bool isHandleAtPosition(const QPoint &handle, const QPoint &pos); }; @@ -134,8 +140,10 @@ class Annotations : public IModel { void startLabel(QPoint origin, size_t currentFrame); void startRect(QPoint origin, size_t currentFrame); void startEllipse(QPoint origin, size_t currentFrame); - // Called by the controller on mouse-clicks. + // Called by the controller on left mouse-clicks. bool tryStartDragging(QPoint cursor); + // Called by the controller on left mouse-clicks. + bool trySetText(QPoint cursor); // Called by the controller during mouse-drags to update the current annotation. bool updateAnnotation(QPoint cursor); // Called on mouse-release. diff --git a/BioTracker/CoreApp/BioTracker/View/AnnotationsView.cpp b/BioTracker/CoreApp/BioTracker/View/AnnotationsView.cpp index 190dddf6..d1f26480 100644 --- a/BioTracker/CoreApp/BioTracker/View/AnnotationsView.cpp +++ b/BioTracker/CoreApp/BioTracker/View/AnnotationsView.cpp @@ -67,6 +67,6 @@ void AnnotationsView::paint(QPainter * painter, const QStyleOptionGraphicsItem * if (model->selection) { painter->setPen(QPen(Qt::red, 6, Qt::SolidLine, Qt::RoundCap)); - Annotations::Annotation::drawHandleLocation(painter, *model->selection.handle); + Annotations::Annotation::drawHandleLocation(painter, *model->selection.handle, ""); } } diff --git a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui index fe4a141e..3a6083c4 100644 --- a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui +++ b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui @@ -155,9 +155,9 @@ 0 - -258 + -263 333 - 936 + 938 @@ -321,7 +321,7 @@ 3 - 3 + 5 3 diff --git a/BioTracker/CoreApp/BioTracker/View/Utility/RotationHandle.cpp b/BioTracker/CoreApp/BioTracker/View/Utility/RotationHandle.cpp index acc886c5..044247af 100644 --- a/BioTracker/CoreApp/BioTracker/View/Utility/RotationHandle.cpp +++ b/BioTracker/CoreApp/BioTracker/View/Utility/RotationHandle.cpp @@ -11,7 +11,7 @@ RotationHandle::RotationHandle(QPoint origin, QAbstractGraphicsShapeItem* parent QAbstractGraphicsShapeItem(parent), _origin(origin) { setFlag(ItemIsMovable); - setPen(QPen(Qt::blue)); + setPen(QPen(Qt::black)); setBrush(QBrush(Qt::red)); //setFlag(QGraphicsItem::ItemIsSelectable); //setFlag(ItemIgnoresTransformations); diff --git a/BioTracker/Plugin/BackgroundSubtraction/View/TrackerParameterView.ui b/BioTracker/Plugin/BackgroundSubtraction/View/TrackerParameterView.ui index e31d828b..2dd63ffb 100644 --- a/BioTracker/Plugin/BackgroundSubtraction/View/TrackerParameterView.ui +++ b/BioTracker/Plugin/BackgroundSubtraction/View/TrackerParameterView.ui @@ -348,7 +348,7 @@ - Choose with image to display + Choose which image to display for the next frames. Tracking must be actived. Original From bca15aa36a35b242885afe80ec3c1f7c8e3220d5 Mon Sep 17 00:00:00 2001 From: jotpio Date: Sun, 15 Apr 2018 16:38:40 +0200 Subject: [PATCH 030/171] refactoring minor wording changes --- .../BioTracker/View/ComponentShape.cpp | 1 - .../BioTracker/View/CoreParameterView.cpp | 30 ++++++++++++++++--- .../BioTracker/View/CoreParameterView.ui | 2 +- .../CoreApp/BioTracker/View/MainWindow.cpp | 4 +-- .../BioTracker/View/TrackedComponentView.cpp | 2 +- .../BioTracker/View/VideoControllWidget.cpp | 8 +++++ .../BioTracker/View/VideoControllWidget.h | 3 ++ .../View/TrackerParameterView.ui | 2 +- 8 files changed, 42 insertions(+), 10 deletions(-) diff --git a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp index 685fba4e..448da755 100644 --- a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp +++ b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp @@ -1242,7 +1242,6 @@ void ComponentShape::receiveShapeRotation(double angle, bool rotateEntity) double toAngleNorm = constrainAngle(toAngle); double oldAngleNorm = constrainAngle(oldAngle); - qDebug() << toAngleNorm; Q_EMIT emitEntityRotation(m_trajectory, oldAngleNorm, toAngleNorm, m_currentFramenumber); } diff --git a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp index e30d8ede..8813a8f7 100644 --- a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp +++ b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.cpp @@ -62,13 +62,20 @@ void CoreParameterView::setPermission(std::pair pe //first check if permission is for view, if not pass permission to shapes -> view has all permissions, shapes only certain ones if (permission.first == ENUMS::COREPERMISSIONS::COMPONENTVIEW && permission.second == false) { - this->ui->visualizationScroll->setDisabled(true); + //disable everything but the area descriptor groupbox + ui->checkBoxEnableCoreView->setEnabled(false); + ui->groupBoxTracks->setEnabled(false); + ui->groupBoxTracing->setEnabled(false); + ui->groupBoxMiscellaneous->setEnabled(false); + ui->groupBoxAnno->setEnabled(false); + ui->groupBoxRectificationParm->setEnabled(true); + _expertSwitch->setEnabled(false); return; } //does not need to be propagated to shapes; only handled by view //TODO: move this to controller if (permission.first == ENUMS::COREPERMISSIONS::COMPONENTADD && permission.second == false) { - //this->ui->pushButtonAddTrack->setDisabled(true); + this->ui->pushButton_addTraj->setDisabled(true); return; } @@ -95,13 +102,28 @@ void CoreParameterView::on_checkBoxEnableCoreView_stateChanged(int v) CoreParameter* coreParams = dynamic_cast(getModel()); //disable if (ui->checkBoxEnableCoreView->checkState() == Qt::Unchecked) { - ui->widgetParameter->setEnabled(false); + //disable all groupboxes but the area descriptor one + ui->groupBoxTracks->setEnabled(false); + ui->groupBoxTracing->setEnabled(false); + ui->groupBoxMiscellaneous->setEnabled(false); + ui->groupBoxAnno->setEnabled(false); + ui->groupBoxRectificationParm->setEnabled(true); + _expertSwitch->setEnabled(false); + + emitViewSwitch(false); coreParams->m_viewSwitch = false; } //enable else if (ui->checkBoxEnableCoreView->checkState() == Qt::Checked){ - ui->widgetParameter->setEnabled(true); + //enable all groupboxes + ui->groupBoxTracks->setEnabled(true); + ui->groupBoxTracing->setEnabled(true); + ui->groupBoxMiscellaneous->setEnabled(true); + ui->groupBoxAnno->setEnabled(true); + ui->groupBoxRectificationParm->setEnabled(true); + _expertSwitch->setEnabled(true); + emitViewSwitch(true); coreParams->m_viewSwitch = true; } diff --git a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui index 3a6083c4..f262496c 100644 --- a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui +++ b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui @@ -1235,7 +1235,7 @@ 0 - + 3 diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp index bfd8cdf8..9e629976 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp @@ -69,7 +69,7 @@ MainWindow::MainWindow(QWidget* parent, IController* controller, IModel* model) createIntroductionWizard(); //set window icon - QApplication::setWindowIcon(QIcon(":/Logo/resources/logo/BT3-big_non_transparent_rounded.ico")); + QApplication::setWindowIcon(QIcon(":/Logo/resources/logo/BT-3_non_transparent_rounded.ico")); //view actions //QAction* dockWidgetHider = ui->dockWidgetAlgorithm->toggleViewAction(); @@ -1087,7 +1087,7 @@ void MainWindow::on_actionShortcuts_triggered() { scList.append(QPair(QString("CTRL + Y"), QString("Redo"))); scList.append(QPair(QString("CTRL + A"), QString("Select all"))); scList.append(QPair(QString("+"), QString("Add track"))); - scList.append(QPair(QString("DELETE"), QString("Delete all selected tracks"))); + scList.append(QPair(QString("DELETE"), QString("Delete all selected trajectories"))); scList.append(QPair(QString("Space"), QString("Play"))); scList.append(QPair(QString("Left Arrow"), QString("Previous Frame"))); scList.append(QPair(QString("Right Arrow"), QString("Next Frame"))); diff --git a/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp b/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp index 7bc2c492..534ab41a 100644 --- a/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp +++ b/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp @@ -483,7 +483,7 @@ void TrackedComponentView::contextMenuEvent(QGraphicsSceneContextMenuEvent * eve QAction *addComponentAction = menu.addAction("Add trajectory here", dynamic_cast(this), SLOT(addTrajectory())); QAction *swapIdsAction = menu.addAction("Swap ID's", dynamic_cast(this), SLOT(swapIds())); QAction *unmarkAllAction = menu.addAction("Unmark all...", dynamic_cast(this), SLOT(unmarkAll())); - QAction *removeSelectedAction = menu.addAction("Remove selected tracks", dynamic_cast(this), SLOT(removeTrajectories())); + QAction *removeSelectedAction = menu.addAction("Remove selected trajectories", dynamic_cast(this), SLOT(removeTrajectories())); // manage permissions diff --git a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp b/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp index 736a93c4..b7f80e0f 100644 --- a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp +++ b/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp @@ -83,6 +83,11 @@ void VideoControllWidget::getNotified() { if (dt > 500 || fps <= 0){ ui->lcd_currentFpsNum->display(fps); lastFpsSet = now; + + // for average fps calculation + _fpsSum += fps; + _fpsCounter += 1; + } ui->fps_label->setText(QString::number(mediaFps)); @@ -210,8 +215,11 @@ void VideoControllWidget::on_actionPlay_Pause_triggered(bool checked){ if (m_Paus) { controller->pause(); + qDebug() << "The average fps of this run was: " << _fpsSum / _fpsCounter; } else { controller->play(); + _fpsSum = 0; + _fpsCounter = 0; } } void VideoControllWidget::on_actionStop_triggered(bool checked){ diff --git a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.h b/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.h index e6f2379a..405e3e18 100644 --- a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.h +++ b/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.h @@ -94,6 +94,9 @@ class VideoControllWidget : public IViewWidget { QAction* action_rec; std::chrono::system_clock::time_point lastFpsSet; + + uint _fpsSum = 0; + int _fpsCounter = 0; }; #endif // BIOTRACKER3VIDEOCONTROLLWIDGET_H diff --git a/BioTracker/Plugin/BackgroundSubtraction/View/TrackerParameterView.ui b/BioTracker/Plugin/BackgroundSubtraction/View/TrackerParameterView.ui index 2dd63ffb..5fc284f2 100644 --- a/BioTracker/Plugin/BackgroundSubtraction/View/TrackerParameterView.ui +++ b/BioTracker/Plugin/BackgroundSubtraction/View/TrackerParameterView.ui @@ -103,7 +103,7 @@ - Biarization Threshold + Binarization Threshold From 9748018c411ef2e819dd4c677832efa108e16957 Mon Sep 17 00:00:00 2001 From: Benjamin Wild Date: Tue, 17 Apr 2018 14:18:16 +0200 Subject: [PATCH 031/171] Fix linux/gcc compile error --- BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.h | 1 + 1 file changed, 1 insertion(+) diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.h b/BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.h index 401c509d..28b8262e 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.h +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.h @@ -2,6 +2,7 @@ #include "Interfaces/IController/IController.h" #include "QString" +#include #include #include From 8388e6ad39a68b7fa897e36b6d7ee0e2d2dd8ca6 Mon Sep 17 00:00:00 2001 From: jotpio Date: Fri, 20 Apr 2018 06:31:02 +0200 Subject: [PATCH 032/171] refactoring & commenting --- .../Controller/ControllerAnnotations.h | 13 +- .../Controller/ControllerCommands.h | 82 +- .../Controller/ControllerGraphicScene.h | 2 +- .../Controller/ControllerMainWindow.h | 179 +-- .../Controller/ControllerNotifications.cpp | 4 +- .../Controller/ControllerNotifications.h | 29 +- .../Controller/ControllerPlugin.cpp | 143 +- .../BioTracker/Controller/ControllerPlugin.h | 66 +- .../ControllerTrackedComponentCore.cpp | 53 +- .../ControllerTrackedComponentCore.h | 127 +- .../CoreApp/BioTracker/Model/Annotations.h | 76 +- .../CoreApp/BioTracker/Model/CoreParameter.h | 38 +- .../Model/UndoCommands/TrackCommands.h | 186 +-- .../CoreApp/BioTracker/View/AnnotationsView.h | 7 +- .../BioTracker/View/ComponentShape.cpp | 1163 +++++++++-------- .../CoreApp/BioTracker/View/ComponentShape.h | 336 +++-- .../BioTracker/View/CoreParameterView.h | 182 +-- .../BioTracker/View/CoreParameterView.ui | 4 +- .../CoreApp/BioTracker/View/MainWindow.cpp | 1008 +++++++------- .../CoreApp/BioTracker/View/MainWindow.h | 201 +-- .../CoreApp/BioTracker/View/MainWindow.ui | 19 +- .../BioTracker/View/NotificationLogBrowser.h | 21 +- .../BioTracker/View/TrackedComponentView.cpp | 344 ++--- .../BioTracker/View/TrackedComponentView.h | 142 +- .../View/Utility/RotationHandle.cpp | 9 +- .../BioTracker/View/Utility/RotationHandle.h | 36 +- .../BioTracker/View/Utility/SwitchButton.cpp | 112 +- .../BioTracker/View/Utility/SwitchButton.h | 79 +- .../BioTracker/View/Utility/Tracer.cpp | 33 +- .../CoreApp/BioTracker/View/Utility/Tracer.h | 63 +- .../BioTracker/View/VideoControllWidget.cpp | 276 ++-- .../CoreApp/BioTracker/guiresources.qrc | 3 + .../introduction/images/BioTracker.PNG | Bin 1006945 -> 398996 bytes .../introduction/images/context_entity.png | Bin 41908 -> 100488 bytes .../introduction/images/right_panel.png | Bin 37775 -> 60434 bytes .../introduction/images/toolbars.png | Bin 42859 -> 64416 bytes .../introduction/images/tracking.png | Bin 829202 -> 345535 bytes .../resources/introduction/right_panel.txt | 2 +- .../resources/introduction/toolbars.txt | 11 +- .../resources/introduction/tracking.txt | 11 +- .../BioTracker/resources/shortcuts.txt | 19 + .../Interfaces/IBioTrackerPlugin.h | 23 +- .../Interfaces/IController/IController.h | 2 +- .../Interfaces/IModel/IModelDataExporter.h | 18 +- .../IModel/IModelTrackedComponent.h | 156 ++- 45 files changed, 2821 insertions(+), 2457 deletions(-) create mode 100644 BioTracker/CoreApp/BioTracker/resources/shortcuts.txt diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.h b/BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.h index 28b8262e..0e6d0905 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.h +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerAnnotations.h @@ -8,9 +8,14 @@ struct playerParameters; +/** +* The ControllerAnnotations inherits IController +* It is the management unit of the annotation component. +* It controls user input -> creates new annotations in model, forwards moves and deletes them +*/ class ControllerAnnotations : public IController { -Q_OBJECT + Q_OBJECT public: ControllerAnnotations(QObject* parent = 0, IBioTrackerContext* context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::ANNOTATIONS); virtual ~ControllerAnnotations(); @@ -20,8 +25,10 @@ Q_OBJECT public: void connectControllerToController() override; -public Q_SLOTS: - void reset(std::string filepath); + public Q_SLOTS: + + /// + void reset(std::string filepath); void mousePressEvent(QMouseEvent *event, const QPoint &pos); void mouseReleaseEvent(QMouseEvent*event, const QPoint &pos); void mouseMoveEvent(QMouseEvent*event, const QPoint &pos); diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerCommands.h b/BioTracker/CoreApp/BioTracker/Controller/ControllerCommands.h index 6aa4b175..65c0ea77 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerCommands.h +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerCommands.h @@ -8,64 +8,68 @@ #include "QUndoStack" #include "QUndoView" - +/** +* This class inherits from IController. +* http://doc.qt.io/qt-5/qundo.html +* The commands component controls the commands on an undo/redo stack (model) and the undo view +*/ class ControllerCommands : public IController { Q_OBJECT - public: - ControllerCommands(QObject* parent = 0, IBioTrackerContext* context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); - virtual ~ControllerCommands(); +public: + ControllerCommands(QObject* parent = 0, IBioTrackerContext* context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); + virtual ~ControllerCommands(); - signals: - // signal to ctrPlugin to remove trajectory - void emitRemoveTrajectory(IModelTrackedTrajectory* trajectory); +signals: + // signal to ctrPlugin to remove trajectory + void emitRemoveTrajectory(IModelTrackedTrajectory* trajectory); - void emitRemoveTrajectoryId(int id); + void emitRemoveTrajectoryId(int id); - // signal to ctrPlugin to remove track entity - void emitRemoveTrackEntity(IModelTrackedTrajectory* trajectory, uint frameNumber); + // signal to ctrPlugin to remove track entity + void emitRemoveTrackEntity(IModelTrackedTrajectory* trajectory, uint frameNumber); - // signal to ctrPlugin to add trajectory - void emitAddTrajectory(QPoint pos); + // signal to ctrPlugin to add trajectory + void emitAddTrajectory(QPoint pos); - void emitValidateTrajectory(int id); + void emitValidateTrajectory(int id); - void emitValidateEntity(IModelTrackedTrajectory* trajectory, uint frameNumber); + void emitValidateEntity(IModelTrackedTrajectory* trajectory, uint frameNumber); - void emitMoveElement(IModelTrackedTrajectory* trajectory, uint frameNumber, QPoint pos, int toMove); + void emitMoveElement(IModelTrackedTrajectory* trajectory, uint frameNumber, QPoint pos, int toMove); - void emitSwapIds(IModelTrackedTrajectory* trajectory0, IModelTrackedTrajectory* trajectory1); + void emitSwapIds(IModelTrackedTrajectory* trajectory0, IModelTrackedTrajectory* trajectory1); - void emitToggleFixTrack(IModelTrackedTrajectory* trajectory, bool toggle); + void emitToggleFixTrack(IModelTrackedTrajectory* trajectory, bool toggle); - void emitEntityRotation(IModelTrackedTrajectory* trajectory, double angleDeg, uint frameNumber); + void emitEntityRotation(IModelTrackedTrajectory* trajectory, double angleDeg, uint frameNumber); public slots: - void receiveAddTrackCommand(QPoint pos, int id); - void receiveRemoveTrackCommand(IModelTrackedTrajectory* traj); - void receiveRemoveTrackEntityCommand(IModelTrackedTrajectory* traj, uint frameNumber); - void receiveMoveElementCommand(IModelTrackedTrajectory* traj , QPoint oldPos, QPoint newPos, uint frameNumber, int toMove); - void receiveSwapIdCommand(IModelTrackedTrajectory* traj0, IModelTrackedTrajectory* traj1); - void receiveFixTrackCommand(IModelTrackedTrajectory* traj, bool toggle); - void receiveEntityRotation(IModelTrackedTrajectory* traj, double oldAngleDeg, double newAngleDeg, uint frameNumber); - - void receiveUndo(); - void receiveRedo(); - void receiveClear(); - void receiveShowActionList(); + void receiveAddTrackCommand(QPoint pos, int id); + void receiveRemoveTrackCommand(IModelTrackedTrajectory* traj); + void receiveRemoveTrackEntityCommand(IModelTrackedTrajectory* traj, uint frameNumber); + void receiveMoveElementCommand(IModelTrackedTrajectory* traj, QPoint oldPos, QPoint newPos, uint frameNumber, int toMove); + void receiveSwapIdCommand(IModelTrackedTrajectory* traj0, IModelTrackedTrajectory* traj1); + void receiveFixTrackCommand(IModelTrackedTrajectory* traj, bool toggle); + void receiveEntityRotation(IModelTrackedTrajectory* traj, double oldAngleDeg, double newAngleDeg, uint frameNumber); + + void receiveUndo(); + void receiveRedo(); + void receiveClear(); + void receiveShowActionList(); // IController interface - public: - void connectControllerToController() override; +public: + void connectControllerToController() override; - protected: - void createModel() override; - void createView() override; - void connectModelToController() override; +protected: + void createModel() override; + void createView() override; + void connectModelToController() override; //member - private: - QUndoStack* _undoStack; - QUndoView* _undoView; +private: + QUndoStack* _undoStack; + QUndoView* _undoView; }; #endif // CONTROLLERCOMMANDS_H \ No newline at end of file diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerGraphicScene.h b/BioTracker/CoreApp/BioTracker/Controller/ControllerGraphicScene.h index cbd16637..84972cd1 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerGraphicScene.h +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerGraphicScene.h @@ -15,7 +15,7 @@ /** * The ControllerGraphicScene class controlls the component for rendering TextureObjects and TrackedComponents on a GraphhicsView. * Each PixmapItem represents a cv::Mat. The cv::Mat comes from the TextureObjects-Component of BioTracker. - * The GraphicsItem represents the compositum structure of IViewTrackedComponent classes. These structure comes from the Plugin and handed over by the PluginController of the MainApplication. + * The GraphicsItem represents the compositum structure of IViewTrackedComponent classes. These structure comes from the ControllerTrackedComponentCore or the Plugin and handed over by the PluginController of the MainApplication. * */ class ControllerGraphicScene : public IController { diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerMainWindow.h b/BioTracker/CoreApp/BioTracker/Controller/ControllerMainWindow.h index d39939f1..88224ed5 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerMainWindow.h +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerMainWindow.h @@ -15,101 +15,110 @@ #include #include "util/types.h" -/** - * The ControllerMainWindow class controlls the IView class MainWindow. - * All user interactions done through the MainWindow class are delegated to the controllers of the component that concerns them. - * Other components can place their IView Widgets on the MainWindow. - */ + /** + * The ControllerMainWindow class controlls the IView class MainWindow. + * All user interactions done through the MainWindow class are delegated to the controllers of the component that concerns them. + * Other components can place their IView Widgets on the MainWindow. + */ class ControllerMainWindow : public IController { - Q_OBJECT - public: - ControllerMainWindow(QObject* parent = 0, IBioTrackerContext* context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); - - /** - * Receives the a string containing the video file path from the MainWindow class. The string is then given to the ControllerPlayer class of the MediaPlayer-Component. - */ - void loadVideo(QString str); - /** - * Receives the a string containing the Plugin file path from the MainWindow class. The string is then given to the BioTrackerContext class which will hand it over to the ControllerPlugin class. - */ - void loadTracker(QString str); - /** - * Receives the a string containing the pictures file path from the MainWindow class. The string is then given to the ControllerPlayer class of the MediaPlayer-Component. - */ - void loadPictures(std::vector files); - /** - * Receives the a string containing the camera device number from the MainWindow class. The string is then given to the ControllerPlayer class of the MediaPlayer-Component. - */ - void loadCameraDevice(CameraConfiguration conf); - /** - * Receives a QStringListModel with the names of all currently loades BioTracker Plugins from the ControllerPlugin class. - */ - void setTrackerList(QStringListModel* trackerList, QString current); - /** - * Embeds the Parameter Widget devined in the BioTracker Plugins into the MainWindow Widget. - */ - void setTrackerParamterWidget(IView* widget); + Q_OBJECT +public: + ControllerMainWindow(QObject* parent = 0, IBioTrackerContext* context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); + + /** + * Receives the a string containing the video file path from the MainWindow class. The string is then given to the ControllerPlayer class of the MediaPlayer-Component. + */ + void loadVideo(QString str); + /** + * Receives the a string containing the Plugin file path from the MainWindow class. The string is then given to the BioTrackerContext class which will hand it over to the ControllerPlugin class. + */ + void loadTracker(QString str); + /** + * Receives the a string containing the pictures file path from the MainWindow class. The string is then given to the ControllerPlayer class of the MediaPlayer-Component. + */ + void loadPictures(std::vector files); + /** + * Receives the a string containing the camera device number from the MainWindow class. The string is then given to the ControllerPlayer class of the MediaPlayer-Component. + */ + void loadCameraDevice(CameraConfiguration conf); + /** + * Receives a QStringListModel with the names of all currently loades BioTracker Plugins from the ControllerPlugin class. + */ + void setTrackerList(QStringListModel* trackerList, QString current); + /** + * Embeds the Parameter Widget devined in the BioTracker Plugins into the MainWindow Widget. + */ + void setTrackerParamterWidget(IView* widget); + /** + * Embeds the view for visualization of tracking data devined in the BioTracker Plugins into the MainWindow Widget. + */ void setTrackerElementsWidget(IView *widget); + /** + * Embeds the view for visualization of tracking data from the core app into the MainWindow Widget. + */ void setCoreElementsWidget(IView* widget); + /** + * Embeds the the notification view of the core app into the MainWindow Widget. + */ void setNotificationBrowserWidget(IView * widget); - void loadTrajectoryFile(std::string file); - void saveTrajectoryFile(std::string file); + void loadTrajectoryFile(std::string file); + void saveTrajectoryFile(std::string file); - void deactiveTrackingCheckBox(); - void activeTrackingCheckBox(); + void deactiveTrackingCheckBox(); + void activeTrackingCheckBox(); //Passes exit command to the GUI context void exit(); public: - signals: - void emitFinalizeExperiment(); - - void emitOnLoadPlugin(const std::string path); - void emitOnLoadMedia(const std::string path); - - void emitPluginLoaded(const std::string path); - void emitMediaLoaded(const std::string path); - void emitTrackLoaded(const std::string path); - - void emitUndoCommand(); - void emitRedoCommand(); - void emitClearUndoStack(); - void emitShowActionListCommand(); - - //view toolbar actions - void emitAddTrack(); - void emitDeleteSelectedTracks(); - void emitSwapIds(); - void emitSelectAll(); - void emitChangeColorBorder(); - void emitChangeColorFill(); - void emitAddLabelAnno(); - void emitAddRectAnno(); - void emitAddArrAnno(); - void emitAddEllAnno(); - void emitDelSelAnno(); - - public slots: - void setCorePermission(std::pair permission); - /** - * Receives the command for activating the Tracking in a BioTracker Plugin from the MainWindow class. This command is given to the ControllerPlayer class of the MediaPlayer-component. - */ - void activeTracking(); - /** - * Receives the command for deactivating the Tracking in a BioTracker Plugin from the MainWindow class. This command is given to the ControllerPlayer class of the MediaPlayer-component. - */ - void deactiveTrackring(); - - void receiveSaveTrajData(); - - // IController interface - protected: - void createModel() override; - void createView() override; - void connectModelToController() override; - void connectControllerToController() override; + signals : + void emitFinalizeExperiment(); + + void emitOnLoadPlugin(const std::string path); + void emitOnLoadMedia(const std::string path); + + void emitPluginLoaded(const std::string path); + void emitMediaLoaded(const std::string path); + void emitTrackLoaded(const std::string path); + + void emitUndoCommand(); + void emitRedoCommand(); + void emitClearUndoStack(); + void emitShowActionListCommand(); + + //view toolbar actions + void emitAddTrack(); + void emitDeleteSelectedTracks(); + void emitSwapIds(); + void emitSelectAll(); + void emitChangeColorBorder(); + void emitChangeColorFill(); + void emitAddLabelAnno(); + void emitAddRectAnno(); + void emitAddArrAnno(); + void emitAddEllAnno(); + void emitDelSelAnno(); + + public slots: + void setCorePermission(std::pair permission); + /** + * Receives the command for activating the Tracking in a BioTracker Plugin from the MainWindow class. This command is given to the ControllerPlayer class of the MediaPlayer-component. + */ + void activeTracking(); + /** + * Receives the command for deactivating the Tracking in a BioTracker Plugin from the MainWindow class. This command is given to the ControllerPlayer class of the MediaPlayer-component. + */ + void deactiveTrackring(); + + void receiveSaveTrajData(); + + // IController interface +protected: + void createModel() override; + void createView() override; + void connectModelToController() override; + void connectControllerToController() override; private slots: void rcvSelectPlugin(QString plugin); @@ -117,7 +126,7 @@ class ControllerMainWindow : public IController { private: // Internal cleanup callback when a new video or imagestream is loaded. - void onNewMediumLoaded(const std::string path=""); + void onNewMediumLoaded(const std::string path = ""); }; #endif // CONTROLLERMAINWINDOW_H diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerNotifications.cpp b/BioTracker/CoreApp/BioTracker/Controller/ControllerNotifications.cpp index 9e952428..cdb59a49 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerNotifications.cpp +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerNotifications.cpp @@ -11,11 +11,11 @@ ControllerNotifications::ControllerNotifications(QObject* parent, IBioTrackerCon } ControllerNotifications::~ControllerNotifications() { - qInstallMessageHandler(0); + qInstallMessageHandler(0); } void ControllerNotifications::cleanup() { - qInstallMessageHandler(0); + qInstallMessageHandler(0); } void ControllerNotifications::createModel() diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerNotifications.h b/BioTracker/CoreApp/BioTracker/Controller/ControllerNotifications.h index bdeac997..b5533d53 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerNotifications.h +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerNotifications.h @@ -5,18 +5,27 @@ #include "Interfaces/IController/IController.h" +/** +* This class inherits from IController. +* The notifications component includes the notifications view. +* This controller uses qInstallMessageHandler(messageHandler) to +* intercept all qDebug messages and display them in a text browser (the view). +* This text browser is displayed in the 'Notifications' tab in the GUI. +* QDebug reference: http://doc.qt.io/qt-5/qdebug.html +*/ class ControllerNotifications : public IController { Q_OBJECT - public: - ControllerNotifications(QObject* parent = 0, IBioTrackerContext* context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); - ~ControllerNotifications(); - void cleanup() override; - - protected: - void createModel() override; - void createView() override; - void connectModelToController() override; - void connectControllerToController() override; +public: + ControllerNotifications(QObject* parent = 0, IBioTrackerContext* context = 0, + ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); + ~ControllerNotifications(); + void cleanup() override; + +protected: + void createModel() override; + void createView() override; + void connectModelToController() override; + void connectControllerToController() override; }; diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerPlugin.cpp b/BioTracker/CoreApp/BioTracker/Controller/ControllerPlugin.cpp index 82a5acfe..b776af30 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerPlugin.cpp +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerPlugin.cpp @@ -42,27 +42,27 @@ void ControllerPlugin::addToPluginList(QString str) { } void ControllerPlugin::loadPluginFromFileName(QString str) { - PluginLoader* loader = qobject_cast(m_Model); + PluginLoader* loader = qobject_cast(m_Model); - if(loader->loadPluginFromFilename(str)) { + if (loader->loadPluginFromFilename(str)) { - createPlugin(); + createPlugin(); // Add Plugin name to Main Window IController* ctrA = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::MAINWINDOW); QPointer< ControllerMainWindow > ctrMainWindow = qobject_cast(ctrA); - ctrMainWindow->setTrackerList(qobject_cast(m_Model)->getPluginMetaData(), + ctrMainWindow->setTrackerList(qobject_cast(m_Model)->getPluginMetaData(), qobject_cast(m_Model)->getCurrentPluginName()); - //Add Tracker Parameter to Main Window + //Add Tracker Parameter to Main Window IView *parms = m_BioTrackerPlugin->getTrackerParameterWidget(); - ctrMainWindow->setTrackerParamterWidget(parms); + ctrMainWindow->setTrackerParamterWidget(parms); //Add Tracker tracked components (Elements) to Main Window IView *elems = m_BioTrackerPlugin->getTrackerElementsWidget(); - ctrMainWindow->setTrackerElementsWidget(elems); - + ctrMainWindow->setTrackerElementsWidget(elems); + IController* ctrB = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); QPointer< ControllerTrackedComponentCore > ctrTrackedComponentCore = qobject_cast(ctrB); @@ -77,17 +77,17 @@ void ControllerPlugin::loadPluginFromFileName(QString str) { ctrDataExp->setComponentFactory(m_BioTrackerPlugin->getComponentFactory()); m_BioTrackerPlugin->sendCorePermissions(); - + } } void ControllerPlugin::selectPlugin(QString str) { if (str.isEmpty()) - return; + return; PluginLoader* loader = qobject_cast(m_Model); if (loader->getCurrentPluginName() != str) - loadPluginFromFileName(loader->getPluginMap().find(str)->second); + loadPluginFromFileName(loader->getPluginMap().find(str)->second); } void ControllerPlugin::createModel() { @@ -115,11 +115,11 @@ void ControllerPlugin::loadPluginsFromPluginSubfolder() { BioTracker::Core::Settings *set = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); std::string *usePlugins = (std::string*)(set->readValue("usePlugins")); - if(usePlugins) { + if (usePlugins) { addToPluginList(usePlugins->c_str()); } -} +} void ControllerPlugin::connectControllerToController() { @@ -127,7 +127,7 @@ void ControllerPlugin::connectControllerToController() { IController* ctrA = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::MAINWINDOW); QPointer< ControllerMainWindow > ctrMainWindow = qobject_cast(ctrA); - ctrMainWindow->deactiveTrackingCheckBox(); + ctrMainWindow->deactiveTrackingCheckBox(); loadPluginsFromPluginSubfolder(); @@ -199,7 +199,7 @@ void ControllerPlugin::connectPlugin() { IController* ctrB = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::TEXTUREOBJECT); ControllerTextureObject* ctrTexture = qobject_cast(ctrB); - + IController* ctrAreaDesc = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::AREADESCRIPTOR); ControllerAreaDescriptor* ctAreaDesc = qobject_cast(ctrAreaDesc); @@ -221,7 +221,7 @@ void ControllerPlugin::connectPlugin() { QObject::connect(obj, SIGNAL(emitTrackingDone(uint)), ctDataEx, SLOT(receiveTrackingDone(uint))); QObject::connect(obj, SIGNAL(emitCvMat(std::shared_ptr, QString)), - ctrTexture, SLOT(receiveCvMat(std::shared_ptr, QString))); + ctrTexture, SLOT(receiveCvMat(std::shared_ptr, QString))); //TODO whyy do this two times?? QObject::connect(obj, SIGNAL(emitTrackingDone(uint)), model, SLOT(receiveTrackingOperationDone())); @@ -232,7 +232,7 @@ void ControllerPlugin::connectPlugin() { QObject::connect(ctAreaDesc, SIGNAL(updateAreaDescriptor(IModelAreaDescriptor*)), obj, SLOT(receiveAreaDescriptor(IModelAreaDescriptor*))); - QObject::connect(obj, SIGNAL(emitCorePermission(std::pair)), ctrCompView, + QObject::connect(obj, SIGNAL(emitCorePermission(std::pair)), ctrCompView, SLOT(setCorePermission(std::pair))); QObject::connect(obj, SIGNAL(emitCorePermission(std::pair)), ctrCoreParam, @@ -245,15 +245,15 @@ void ControllerPlugin::connectPlugin() { // data model actions - QObject::connect(this, SIGNAL(emitRemoveTrajectory(IModelTrackedTrajectory*)), obj, + QObject::connect(this, SIGNAL(emitRemoveTrajectory(IModelTrackedTrajectory*)), obj, SLOT(receiveRemoveTrajectory(IModelTrackedTrajectory*)), Qt::DirectConnection); QObject::connect(this, SIGNAL(emitRemoveTrackEntity(IModelTrackedTrajectory*, uint)), obj, SIGNAL(emitRemoveTrackEntity(IModelTrackedTrajectory*, uint)), Qt::DirectConnection); - QObject::connect(this, SIGNAL(emitAddTrajectory(QPoint)), obj, + QObject::connect(this, SIGNAL(emitAddTrajectory(QPoint)), obj, SLOT(receiveAddTrajectory(QPoint)), Qt::DirectConnection); - QObject::connect(this, SIGNAL(emitMoveElement(IModelTrackedTrajectory*, uint, QPoint)), obj, + QObject::connect(this, SIGNAL(emitMoveElement(IModelTrackedTrajectory*, uint, QPoint)), obj, SIGNAL(emitMoveElement(IModelTrackedTrajectory*, uint, QPoint)), Qt::DirectConnection); - QObject::connect(this, SIGNAL(emitSwapIds(IModelTrackedTrajectory*, IModelTrackedTrajectory*)), obj, + QObject::connect(this, SIGNAL(emitSwapIds(IModelTrackedTrajectory*, IModelTrackedTrajectory*)), obj, SLOT(receiveSwapIds(IModelTrackedTrajectory*, IModelTrackedTrajectory*)), Qt::DirectConnection); QObject::connect(this, SIGNAL(emitToggleFixTrack(IModelTrackedTrajectory*, bool)), obj, SIGNAL(emitToggleFixTrack(IModelTrackedTrajectory*, bool)), Qt::DirectConnection); @@ -275,6 +275,59 @@ void ControllerPlugin::disconnectPlugin() { } +//first send all the commands currently in the command queue then the next image can be sent +void ControllerPlugin::sendCurrentFrameToPlugin(std::shared_ptr mat, uint number) { + m_currentFrameNumber = number; + + //Prevent calling the plugin if none is loaded + if (m_BioTrackerPlugin) { + while (!m_editQueue.isEmpty()) { + queueElement edit = m_editQueue.dequeue(); + + switch (edit.type) + { + case EDIT::REMOVE_TRACK: + emitRemoveTrajectory(edit.trajectory0); + break; + case EDIT::REMOVE_TRACK_ID: + emitRemoveTrajectoryId(edit.id); + break; + case EDIT::REMOVE_ENTITY: + emitRemoveTrackEntity(edit.trajectory0, edit.frameNumber); + break; + case EDIT::ADD: + emitAddTrajectory(edit.pos); + break; + case EDIT::MOVE: + emitMoveElement(edit.trajectory0, edit.frameNumber, edit.pos); + break; + case EDIT::SWAP: + emitSwapIds(edit.trajectory0, edit.trajectory1); + break; + case EDIT::FIX: + emitToggleFixTrack(edit.trajectory0, edit.toggle); + break; + case EDIT::VALIDATE: + emitValidateTrajectory(edit.id); + break; + case EDIT::VALIDATE_ENTITY: + emitValidateEntity(edit.trajectory0, edit.frameNumber); + break; + case EDIT::ROTATE_ENTITY: + emitEntityRotation(edit.trajectory0, edit.angle, edit.frameNumber); + break; + } + } + m_BioTrackerPlugin->receiveCurrentFrameFromMainApp(mat, number); + } +} + + + +//############################SLOTS################################################## + +// receivers of commands + void ControllerPlugin::receiveRemoveTrajectory(IModelTrackedTrajectory * trajectory) { if (m_paused) { @@ -426,6 +479,8 @@ void ControllerPlugin::receiveEntityRotation(IModelTrackedTrajectory * trajector } } +//********************************************************************* + void ControllerPlugin::receivePauseState(bool state) { m_paused = state; @@ -437,52 +492,6 @@ void ControllerPlugin::receiveCurrentFrameNumberToPlugin(uint frameNumber) Q_EMIT signalCurrentFrameNumberToPlugin(frameNumber); } -void ControllerPlugin::sendCurrentFrameToPlugin(std::shared_ptr mat, uint number) { - m_currentFrameNumber = number; - - //Prevent calling the plugin if none is loaded - if (m_BioTrackerPlugin) { - while (!m_editQueue.isEmpty()) { - queueElement edit = m_editQueue.dequeue(); - - switch (edit.type) - { - case EDIT::REMOVE_TRACK: - emitRemoveTrajectory(edit.trajectory0); - break; - case EDIT::REMOVE_TRACK_ID: - emitRemoveTrajectoryId(edit.id); - break; - case EDIT::REMOVE_ENTITY: - emitRemoveTrackEntity(edit.trajectory0, edit.frameNumber); - break; - case EDIT::ADD: - emitAddTrajectory(edit.pos); - break; - case EDIT::MOVE: - emitMoveElement(edit.trajectory0, edit.frameNumber, edit.pos); - break; - case EDIT::SWAP: - emitSwapIds(edit.trajectory0, edit.trajectory1); - break; - case EDIT::FIX: - emitToggleFixTrack(edit.trajectory0, edit.toggle); - break; - case EDIT::VALIDATE: - emitValidateTrajectory(edit.id); - break; - case EDIT::VALIDATE_ENTITY: - emitValidateEntity(edit.trajectory0, edit.frameNumber); - break; - case EDIT::ROTATE_ENTITY: - emitEntityRotation(edit.trajectory0, edit.angle, edit.frameNumber); - break; - } - } - m_BioTrackerPlugin->receiveCurrentFrameFromMainApp(mat, number); - } -} - void ControllerPlugin::receiveTrackingDone() { } diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerPlugin.h b/BioTracker/CoreApp/BioTracker/Controller/ControllerPlugin.h index 8fee902c..ea0028e1 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerPlugin.h +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerPlugin.h @@ -2,6 +2,7 @@ ** ** This file is part of the BioTracker Framework ** by Andreas Jörg + ** edited by Jonas Piotrowski ** ****************************************************************************/ @@ -14,8 +15,10 @@ #include "QQueue" #include "QPoint" + /// ENUM for the command queue in the controllerplugin enum EDIT { REMOVE_TRACK, REMOVE_TRACK_ID, REMOVE_ENTITY, ADD, MOVE, SWAP, FIX, VALIDATE, VALIDATE_ENTITY, ROTATE_ENTITY }; +/// struct for the command queue in the controllerplugin struct queueElement { EDIT type; QPoint pos; @@ -31,26 +34,29 @@ struct queueElement { /** * This is the controller class of the Plugin Loader Component. This component is responsible for loading and managing BioTracker Plugins * The ControllerPlugin class is responsible for loading and connecting to BioTracker Plugins. + * It also manages tracking data modification commands. It queues up the commands and forwards them to the trakcing plugin if + * either the tracking is paused or the tracker is done with tracking the previous frame. The plgin then sends the commands first and afterward + * the next image to track. This avoids a race condition. */ class ControllerPlugin : public IController { Q_OBJECT - public: +public: ControllerPlugin(QObject* parent = 0, IBioTrackerContext* context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::NO_CTR); ~ControllerPlugin(); void addToPluginList(QString str); - /** - * (This function - * This function delivers a file path of a Plugin to the IModel class PluginLoader. If the Plugin could be loaded, - * the functions additionally requests the name of the Plugin and sets it as an entry into an IView widget in the MainWindow. - */ - void loadPluginFromFileName(QString str); + /** + * (This function + * This function delivers a file path of a Plugin to the IModel class PluginLoader. If the Plugin could be loaded, + * the functions additionally requests the name of the Plugin and sets it as an entry into an IView widget in the MainWindow. + */ + void loadPluginFromFileName(QString str); - /** - * This function hands the received cv::Mat pointer and the current frame number to the PluginLoader. - */ - void sendCurrentFrameToPlugin(std::shared_ptr mat, uint number); + /** + * This function hands the received cv::Mat pointer and the current frame number to the PluginLoader. + */ + void sendCurrentFrameToPlugin(std::shared_ptr mat, uint number); void selectPlugin(QString str); @@ -70,7 +76,7 @@ class ControllerPlugin : public IController { void signalCurrentFrameNumberToPlugin(uint frameNumber); // IController interface - protected: +protected: void createModel() override; void createView() override; void connectModelToController() override; @@ -81,7 +87,7 @@ class ControllerPlugin : public IController { void connectPlugin(); void disconnectPlugin(); - private Q_SLOTS: + private Q_SLOTS: /** * * If Tracking is active and the tracking process was finished, the Plugin is able to emit a Signal that triggers this SLOT. @@ -117,25 +123,43 @@ class ControllerPlugin : public IController { * Receive command to swap two ID's and put it in edit queue */ void receiveSwapIds(IModelTrackedTrajectory* trajectory0, IModelTrackedTrajectory* trajectory1); - + /** + * + * Receive command to revalidate a traj by id + */ void receiveValidateTrajectory(int id); - + /** + * + * Receive command to revalidate a entity + */ void receiveValidateEntity(IModelTrackedTrajectory* trajectory, uint frameNumber); - + /** + * + * Receive command to fix a traj, so the tracker should not change it's data + */ void receiveToggleFixTrack(IModelTrackedTrajectory* trajectory, bool toggle); - + /** + * + * Receive command to rotate an entity + */ void receiveEntityRotation(IModelTrackedTrajectory* trajectory, double angle, uint frameNumber); - + /** + * + * Receive current state of medium (pause or play) + */ void receivePauseState(bool state); - + /** + * + * Receive current frame from media play to send it to the plugin + */ void receiveCurrentFrameNumberToPlugin(uint frameNumber); - private: +private: void loadPluginsFromPluginSubfolder(); - IBioTrackerPlugin* m_BioTrackerPlugin; + IBioTrackerPlugin* m_BioTrackerPlugin; QQueue m_editQueue; diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerTrackedComponentCore.cpp b/BioTracker/CoreApp/BioTracker/Controller/ControllerTrackedComponentCore.cpp index 6fea38e3..2cadae7c 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerTrackedComponentCore.cpp +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerTrackedComponentCore.cpp @@ -24,8 +24,8 @@ ControllerTrackedComponentCore::ControllerTrackedComponentCore(QObject *parent, void ControllerTrackedComponentCore::createView() { //This occurs when there has been a previous plugin to visualize - if (m_View != nullptr) - delete m_View; + if (m_View != nullptr) + delete m_View; m_View = new TrackedComponentView(0, this, m_Model); } @@ -42,8 +42,8 @@ void ControllerTrackedComponentCore::connectControllerToController() //connect to view TrackedComponentView* view = static_cast(m_View); - QObject::connect(view, SIGNAL(emitAddTrajectory(QPoint, int)), this, SLOT(receiveAddTrajectory(QPoint, int))); - QObject::connect(view, SIGNAL(emitSwapIds(IModelTrackedTrajectory*, IModelTrackedTrajectory*)), this, SLOT(receiveSwapIds(IModelTrackedTrajectory*, IModelTrackedTrajectory*))); + QObject::connect(view, SIGNAL(emitAddTrajectory(QPoint, int)), this, SIGNAL(emitAddTrajectory(QPoint, int))); + QObject::connect(view, SIGNAL(emitSwapIds(IModelTrackedTrajectory*, IModelTrackedTrajectory*)), this, SIGNAL(emitSwapIds(IModelTrackedTrajectory*, IModelTrackedTrajectory*))); QObject::connect(this, SIGNAL(emitDimensionUpdate(int, int)), view, SLOT(rcvDimensionUpdate(int, int))); QObject::connect(this, SIGNAL(emitAddTrack()), view, SLOT(addTrajectory())); @@ -70,21 +70,20 @@ void ControllerTrackedComponentCore::connectControllerToController() QObject::connect(this, SIGNAL(emitToggleFixTrack(IModelTrackedTrajectory*, bool)), ctrCC, SLOT(receiveFixTrackCommand(IModelTrackedTrajectory*, bool))); QObject::connect(this, SIGNAL(emitEntityRotation(IModelTrackedTrajectory*, double, double, uint)), ctrCC, SLOT(receiveEntityRotation(IModelTrackedTrajectory*, double, double, uint))); - //connect to controllerPlayer - IController * ctrIP = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::PLAYER); - QPointer< ControllerPlayer > ctrP = qobject_cast(ctrIP); - QObject::connect(this, &ControllerTrackedComponentCore::emitGoToFrame, ctrP, &ControllerPlayer::setGoToFrame); + //connect to controllerPlayer + IController * ctrIP = m_BioTrackerContext->requestController(ENUMS::CONTROLLERTYPE::PLAYER); + QPointer< ControllerPlayer > ctrP = qobject_cast(ctrIP); + QObject::connect(this, &ControllerTrackedComponentCore::emitGoToFrame, ctrP, &ControllerPlayer::setGoToFrame); - // Tell the Visualization to reset upon loading a new plugin - QObject::connect(ctrMainWindow, &ControllerMainWindow::emitTrackLoaded, this, &ControllerTrackedComponentCore::receiveOnPluginLoaded); + // Tell the Visualization to reset upon loading a new plugin + QObject::connect(ctrMainWindow, &ControllerMainWindow::emitTrackLoaded, this, &ControllerTrackedComponentCore::receiveOnPluginLoaded); } void ControllerTrackedComponentCore::receiveOnPluginLoaded() { } - void ControllerTrackedComponentCore::setCorePermission(std::pair permission) { if (dynamic_cast(m_View)) { @@ -97,36 +96,6 @@ void ControllerTrackedComponentCore::setCorePermission(std::pair(m_View); @@ -161,7 +130,7 @@ void ControllerTrackedComponentCore::addModel(IModel* model) m_View->setNewModel(m_Model); TrackedComponentView* view = dynamic_cast(m_View); - + //signal initial track number to core params IModelTrackedTrajectory *iModel = dynamic_cast(getModel()); if (iModel) { diff --git a/BioTracker/CoreApp/BioTracker/Controller/ControllerTrackedComponentCore.h b/BioTracker/CoreApp/BioTracker/Controller/ControllerTrackedComponentCore.h index 12718489..3cb7b758 100644 --- a/BioTracker/CoreApp/BioTracker/Controller/ControllerTrackedComponentCore.h +++ b/BioTracker/CoreApp/BioTracker/Controller/ControllerTrackedComponentCore.h @@ -4,87 +4,104 @@ #include "Interfaces/IController/IController.h" #include "Interfaces/IModel/IModelTrackedTrajectory.h" + +/** +* The ControllerTrackedComponentCore class controls the component for visualizing TrackedComponents. +* It is basically a forwarder for permissions, user interaction signals (including tracking data manipulation). +*/ + class ControllerTrackedComponentCore : public IController { Q_OBJECT - public: - ControllerTrackedComponentCore(QObject *parent = 0, IBioTrackerContext *context = 0, ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); - - IView *getTrackingElementsWidgetCore(); - - void addModel(IModel* model); +public: + ControllerTrackedComponentCore(QObject *parent = 0, IBioTrackerContext *context = 0, + ENUMS::CONTROLLERTYPE ctr = ENUMS::CONTROLLERTYPE::TRACKEDCOMPONENTCORE); - IModel* getCoreParameter(); + /** + * Hook for the view to put in in the mainwindow's media panel each time a plugin is loaded + */ + IView *getTrackingElementsWidgetCore(); - signals: - // signal to ctrPlugin to remove trajectory - void emitRemoveTrajectory(IModelTrackedTrajectory* trajectory); + /** + * The model is actually the tracking data from the tracking plugin. This component only reads this data. + * Is called when a new tracking plugin is loaded. + */ + void addModel(IModel* model); - // signal to ctrPlugin to remove track entity - void emitRemoveTrackEntity(IModelTrackedTrajectory* trajectory, uint frameNumber); + /** + * Hook for the view to get the core parameters to set up new componentshapes with default settings + */ + IModel* getCoreParameter(); - // signal to ctrPlugin to add trajectory - void emitAddTrajectory(QPoint pos, int id); + /* + * SIGNALS + */ +signals: + /// signal to ctrcommands to remove trajectory + void emitRemoveTrajectory(IModelTrackedTrajectory* trajectory); - void emitMoveElement(IModelTrackedTrajectory* trajectory, QPoint oldPos, QPoint newPos, uint frameNumber, int toMove); + /// signal to ctrcommands to remove entity + void emitRemoveTrackEntity(IModelTrackedTrajectory* trajectory, uint frameNumber); - void emitSwapIds(IModelTrackedTrajectory* trajectory0, IModelTrackedTrajectory* trajectory1); + /// signal to ctrcommands to add trajectory + void emitAddTrajectory(QPoint pos, int id); - void emitToggleFixTrack(IModelTrackedTrajectory* trajectory, bool toggle); + /// signal to ctrcommands to move entity + void emitMoveElement(IModelTrackedTrajectory* trajectory, QPoint oldPos, QPoint newPos, uint frameNumber, int toMove); - void emitEntityRotation(IModelTrackedTrajectory*,double oldAngleDeg, double newAngleDeg, uint frameNumber); + /// signal to ctrcommands to swap track id's + void emitSwapIds(IModelTrackedTrajectory* trajectory0, IModelTrackedTrajectory* trajectory1); - void emitTrackNumber(int number); + /// signal to ctrcommands fix or unfix a traj + void emitToggleFixTrack(IModelTrackedTrajectory* trajectory, bool toggle); - void emitDimensionUpdate(int x, int y); + /// signal to ctrcommands rotate entity + void emitEntityRotation(IModelTrackedTrajectory*, double oldAngleDeg, double newAngleDeg, uint frameNumber); - //pass left-toolbar actions to view - void emitAddTrack(); - void emitDeleteSelectedTracks(); - void emitSwapIdsToView(); - void emitSelectAll(); - void emitChangeColorBorder(); - void emitChangeColorFill(); - void emitGoToFrame(int frame); + /// signal to ctrCoreParameter to show number of valid trrajectories - public Q_SLOTS: - - //A (different) plugin has been loaded. Here, the controller needs to inform the view - void receiveOnPluginLoaded(); + void emitTrackNumber(int number); - //this slot gets triggered when the core-view needs to update with the current frame - void receiveVisualizeTrackingModel(uint framenumber); + /// signal to view to update its dimensions + void emitDimensionUpdate(int x, int y); + //forward left-toolbar actions to view + void emitAddTrack(); + void emitDeleteSelectedTracks(); + void emitSwapIdsToView(); + void emitSelectAll(); + void emitChangeColorBorder(); + void emitChangeColorFill(); + void emitGoToFrame(int frame); - //gets triggered when plugin sends permissions - void setCorePermission(std::pair permission); - //gets triggered when trajectory is getting removed - void receiveRemoveTrajectory(IModelTrackedTrajectory* trajectory); - - //gets triggered when a track entity is getting removed - void receiveRemoveTrackEntity(IModelTrackedTrajectory* trajectory, uint frameNumber); + /* + * SLOTS + */ + public Q_SLOTS: - void receiveAddTrajectory(QPoint pos, int id); + /// A (different) plugin has been loaded. Here, the controller needs to inform the view + void receiveOnPluginLoaded(); - void receiveMoveElement(IModelTrackedTrajectory* trajectory, QPoint oldPos, QPoint newPos, uint frameNumber, int toMove); + /// this slot gets triggered when the core-view needs to update with the current frame + void receiveVisualizeTrackingModel(uint framenumber); - void receiveSwapIds(IModelTrackedTrajectory* trajectory0, IModelTrackedTrajectory* trajectory1); + /// gets triggered when plugin sends permissions and forwards it to the view + void setCorePermission(std::pair permission); - void receiveToggleFixTrack(IModelTrackedTrajectory* trajectory, bool toggle); + /// gets triggered when a the view needs an update + void receiveUpdateView(); - void receiveUpdateView(); - - // IController interface - protected: - void createModel() override; - void createView() override; - void connectModelToController() override; - void connectControllerToController() override; + // IController interface +protected: + void createModel() override; + void createView() override; + void connectModelToController() override; + void connectControllerToController() override; - IView* m_parameterView; - IModel* m_coreParameterModel; + //IView* m_parameterView; + //IModel* m_coreParameterModel; }; #endif // CONTROLLERTRACKEDCOMPONENTCORE_H diff --git a/BioTracker/CoreApp/BioTracker/Model/Annotations.h b/BioTracker/CoreApp/BioTracker/Model/Annotations.h index 56f3e76f..78b4046c 100644 --- a/BioTracker/CoreApp/BioTracker/Model/Annotations.h +++ b/BioTracker/CoreApp/BioTracker/Model/Annotations.h @@ -3,6 +3,7 @@ ** This file is part of the BioTracker Framework ** by Andreas Jörg and BioTracker in version 2. ** + ** ****************************************************************************/ @@ -20,12 +21,13 @@ #include #include -/* - Model to handle annotations, including serialization. - Annotations will be drawn on top of the video. Their position is defined in image coordinates. -*/ + /** + * Model to handle annotations, including serialization. + * Annotations will be drawn on top of the video. Their position is defined in image coordinates. + * Here the annotations are actually created, serialized and deserialized. + */ class Annotations : public IModel { - Q_OBJECT + Q_OBJECT public: Annotations(std::string filepath = "") : filepath(filepath) { deserialize(); } virtual ~Annotations(); @@ -38,23 +40,23 @@ class Annotations : public IModel { { Annotation(QPoint origin = { 0,0 }, size_t startFrame = 0) : origin(origin), startFrame(startFrame) {} virtual ~Annotation() = default; - // Position in pixels. + /// Position in pixels. QPoint origin{ 0, 0 }; size_t startFrame{ 0 }; - // Possible text for each annotation + /// Possible text for each annotation QString text{ "" }; - // Name that identifies this type of annotation and is used for serialization. + /// Name that identifies this type of annotation and is used for serialization. virtual std::string name() const = 0; virtual void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) const = 0; - // Saving requires writing properties to vector of strings. + /// Saving requires writing properties to vector of strings. virtual std::vector serializeToVector() const; virtual void deserializeFrom(std::queue &args); - // Set text. Called when right clicking. + /// Set text. Called when right clicking. virtual void setText(QString newText) { text = newText; }; - // Get text.Called when right clicking. + /// Get text.Called when right clicking. virtual QString getText() { return text; }; // Called either during dragging or when the mouse is released. - // Needs to update positional data. + //Needs to update positional data. virtual bool onEndAnnotation(QPoint currentPosition) { origin = currentPosition; return true; }; virtual QRectF boundingRect() const { return QRect(origin, origin).marginsAdded({ 20, 20, 20, 20 }); } // Used for mouse-click events. @@ -70,7 +72,7 @@ class Annotations : public IModel { bool isHandleAtPosition(const QPoint &handle, const QPoint &pos); }; - // A label marks a position. + /// A label marks a position. struct AnnotationLabel : public Annotation { using Annotation::Annotation; @@ -82,7 +84,7 @@ class Annotations : public IModel { virtual void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) const override; }; - // An arrow defines a vector between two positions. + /// An arrow defines a vector between two positions. struct AnnotationArrow : public Annotation { using Annotation::Annotation; @@ -99,7 +101,7 @@ class Annotations : public IModel { QPoint arrowHead; }; - // A rectangle defined by two points (top-left and bottom-right) + /// A rectangle defined by two points (top-left and bottom-right) struct AnnotationRect : public Annotation { using Annotation::Annotation; @@ -115,7 +117,7 @@ class Annotations : public IModel { QPoint bottomRight; }; - // An ellipse defined by two points (top-left and bottom-right) + /// An ellipse defined by two points (top-left and bottom-right) struct AnnotationEllipse : public Annotation { using Annotation::Annotation; @@ -135,38 +137,38 @@ class Annotations : public IModel { void serialize() const; void deserialize(); - // Called by the controller to begin a new annotation. + /// Called by the controller to begin a new annotation. void startArrow(QPoint origin, size_t currentFrame); void startLabel(QPoint origin, size_t currentFrame); void startRect(QPoint origin, size_t currentFrame); void startEllipse(QPoint origin, size_t currentFrame); - // Called by the controller on left mouse-clicks. + /// Called by the controller on left mouse-clicks. bool tryStartDragging(QPoint cursor); - // Called by the controller on left mouse-clicks. + /// Called by the controller on left mouse-clicks. bool trySetText(QPoint cursor); - // Called by the controller during mouse-drags to update the current annotation. + /// Called by the controller during mouse-drags to update the current annotation. bool updateAnnotation(QPoint cursor); - // Called on mouse-release. + /// Called on mouse-release. bool endAnnotation(QPoint cursor); - // Removes the currently selected (through tryStartDragging) annotation. + /// Removes the currently selected (through tryStartDragging) annotation. bool removeSelection(); - // The current frame is required for the view to highlight annotations. + /// The current frame is required for the view to highlight annotations. void setCurrentFrame(size_t currentFrame) { this->currentFrame = currentFrame; } size_t getCurrentFrame() const { return currentFrame; } private: - // The current frame is required by the view. - size_t currentFrame{ 0 }; - // filepath of the original source image. - std::string filepath; - // The resulting filename will add a suffix to the original source path. - std::string getFilename() const; - // Whether the annotations need to be serialized on exit. - mutable bool dirty{ false }; - - std::vector> annotations; - // Held temporarily during events - not yet 'created'. - std::shared_ptr currentAnnotation; - // Valid during drag & drop or after mouse selection. + size_t currentFrame{ 0 }; /**< The current frame is required by the view. */ + + std::string filepath; /**< filepath of the original source image. */ + + std::string getFilename() const; /**< The resulting filename will add a suffix to the original source path. */ + + mutable bool dirty{ false }; /**< Whether the annotations need to be serialized on exit. */ + + std::vector> annotations;/**< vector of all annotations */ + + std::shared_ptr currentAnnotation; /**< Held temporarily during events - not yet 'created'. */ + + /// Valid during drag & drop or after mouse selection. struct SelectionData { // Annotation from the annotations vector above. Defines validity of the whole struct. @@ -177,7 +179,7 @@ class Annotations : public IModel { Annotation *operator->() { return annotation.lock().get(); } void reset() { return annotation.reset(); } } selection; - + friend class AnnotationsView; }; diff --git a/BioTracker/CoreApp/BioTracker/Model/CoreParameter.h b/BioTracker/CoreApp/BioTracker/Model/CoreParameter.h index de22f5b9..ef0db4e1 100644 --- a/BioTracker/CoreApp/BioTracker/Model/CoreParameter.h +++ b/BioTracker/CoreApp/BioTracker/Model/CoreParameter.h @@ -5,29 +5,35 @@ #include "Interfaces/IModel/IModel.h" #include "qcolor.h" +/** +* This model includes the default visualization options the TrackedcomponentView +* uses to create its ComponentsShapes. +* Other shared paramters can also be added. +* It is a runtime shared storage. +*/ class CoreParameter : public IModel { Q_OBJECT public: CoreParameter(QObject *parent = 0); - void setAll( - bool viewSwitch, - QString tracingStyle, - int tracingHistory, - int tracingSteps, - QColor* colorBorder, - QColor* colorBrush) - { - m_viewSwitch = viewSwitch; - m_tracingStyle = tracingStyle; - m_tracingHistory = tracingHistory; - m_tracingSteps = tracingSteps; - m_colorBorder = colorBorder; - m_colorBrush = colorBrush; + //void setAll( + // bool viewSwitch, + // QString tracingStyle, + // int tracingHistory, + // int tracingSteps, + // QColor* colorBorder, + // QColor* colorBrush) + //{ + // m_viewSwitch = viewSwitch; + // m_tracingStyle = tracingStyle; + // m_tracingHistory = tracingHistory; + // m_tracingSteps = tracingSteps; + // m_colorBorder = colorBorder; + // m_colorBrush = colorBrush; - Q_EMIT notifyView(); - }; + // Q_EMIT notifyView(); + //}; void setTrackNumber(int number); diff --git a/BioTracker/CoreApp/BioTracker/Model/UndoCommands/TrackCommands.h b/BioTracker/CoreApp/BioTracker/Model/UndoCommands/TrackCommands.h index b5a5daad..7bce9de6 100644 --- a/BioTracker/CoreApp/BioTracker/Model/UndoCommands/TrackCommands.h +++ b/BioTracker/CoreApp/BioTracker/Model/UndoCommands/TrackCommands.h @@ -7,117 +7,147 @@ #include "Interfaces/IModel/IModelTrackedTrajectory.h" #include "QPoint" +// http://doc.qt.io/qt-5/qundo.html + +/** +* Add track command with data to do and undo: +* position, id, traj, added +*/ class AddTrackCommand : public QObject, public QUndoCommand { Q_OBJECT - public: - AddTrackCommand(int id, QPoint pos, - QUndoCommand *parent = 0); - void undo() override; - void redo() override; - signals: - void emitAddTrajectory(QPoint pos); - void emitValidateTrajectory(int id); - void emitRemoveTrajectoryId(int id); - - private: - IModelTrackedTrajectory* _traj; - int _id; - QPoint _pos; - bool _added; +public: + AddTrackCommand(int id, QPoint pos, + QUndoCommand *parent = 0); + void undo() override; + void redo() override; +signals: + void emitAddTrajectory(QPoint pos); + void emitValidateTrajectory(int id); + void emitRemoveTrajectoryId(int id); + +private: + IModelTrackedTrajectory* _traj; + int _id; + QPoint _pos; + bool _added; }; +/** +* Remove Track command with data to do and undo: +* traj +*/ class RemoveTrackCommand : public QObject, public QUndoCommand { Q_OBJECT - public: - RemoveTrackCommand(IModelTrackedTrajectory* traj, - QUndoCommand *parent = 0); - - void undo() override; - void redo() override; - signals: - void emitValidateTrajectory(int id); - void emitRemoveTrajectory(IModelTrackedTrajectory* traj); - - private: - IModelTrackedTrajectory* _traj; +public: + RemoveTrackCommand(IModelTrackedTrajectory* traj, + QUndoCommand *parent = 0); + + void undo() override; + void redo() override; +signals: + void emitValidateTrajectory(int id); + void emitRemoveTrajectory(IModelTrackedTrajectory* traj); + +private: + IModelTrackedTrajectory* _traj; }; +/** +* Remove Entity command with data to do and undo: +* traj, framenumber +*/ class RemoveElementCommand : public QObject, public QUndoCommand { Q_OBJECT - public: - RemoveElementCommand(IModelTrackedTrajectory* traj, uint frameNumber, - QUndoCommand *parent = 0); - - void undo() override; - void redo() override; - signals: - void emitValidateEntity(IModelTrackedTrajectory* traj, uint frameNumber); - void emitRemoveElement(IModelTrackedTrajectory* traj, uint frameNumber); - - private: - IModelTrackedTrajectory* _traj; - uint _frameNumber; +public: + RemoveElementCommand(IModelTrackedTrajectory* traj, uint frameNumber, + QUndoCommand *parent = 0); + + void undo() override; + void redo() override; +signals: + void emitValidateEntity(IModelTrackedTrajectory* traj, uint frameNumber); + void emitRemoveElement(IModelTrackedTrajectory* traj, uint frameNumber); + +private: + IModelTrackedTrajectory* _traj; + uint _frameNumber; }; +/** +* Move Entity command with data to do and undo: +* traj, oldPos, newPos, hwo many left to move (for a multimove), framenuber +*/ class MoveElementCommand : public QObject, public QUndoCommand { Q_OBJECT - public: - MoveElementCommand(IModelTrackedTrajectory* traj, uint frameNumber, QPoint oldPos, QPoint newPos, int toMove, - QUndoCommand *parent = 0); - - void undo() override; - void redo() override; - //bool mergeWith(const QUndoCommand *command) override; - signals: - void emitMoveElement(IModelTrackedTrajectory* traj, uint _frameNumber, QPoint pos, int toMove); - - private: - IModelTrackedTrajectory* _traj; - uint _frameNumber; - QPoint _oldPos; - QPoint _newPos; - int _toMove; +public: + MoveElementCommand(IModelTrackedTrajectory* traj, uint frameNumber, QPoint oldPos, QPoint newPos, int toMove, + QUndoCommand *parent = 0); + + void undo() override; + void redo() override; + //bool mergeWith(const QUndoCommand *command) override; +signals: + void emitMoveElement(IModelTrackedTrajectory* traj, uint _frameNumber, QPoint pos, int toMove); + +private: + IModelTrackedTrajectory* _traj; + uint _frameNumber; + QPoint _oldPos; + QPoint _newPos; + int _toMove; }; +/** +* Swap Track Id command with data to do and undo: +* traj 0 and traj 1 +*/ class SwapTrackIdCommand : public QObject, public QUndoCommand { Q_OBJECT - public: - SwapTrackIdCommand(IModelTrackedTrajectory* traj0, IModelTrackedTrajectory* traj1, - QUndoCommand *parent = 0); +public: + SwapTrackIdCommand(IModelTrackedTrajectory* traj0, IModelTrackedTrajectory* traj1, + QUndoCommand *parent = 0); - void undo() override; - void redo() override; + void undo() override; + void redo() override; - signals: - void emitSwapIds(IModelTrackedTrajectory* traj0, IModelTrackedTrajectory* traj1); +signals: + void emitSwapIds(IModelTrackedTrajectory* traj0, IModelTrackedTrajectory* traj1); - private: - IModelTrackedTrajectory* _traj0; - IModelTrackedTrajectory* _traj1; +private: + IModelTrackedTrajectory* _traj0; + IModelTrackedTrajectory* _traj1; }; +/** +* Fix Track command with data to do and undo: +* fix toggle and traj +*/ class FixTrackCommand : public QObject, public QUndoCommand { Q_OBJECT - public: - FixTrackCommand(IModelTrackedTrajectory* traj, bool isFixed, - QUndoCommand *parent = 0); - - void undo() override; - void redo() override; - signals: - void emitFixTrack(IModelTrackedTrajectory* traj, bool toggle); - - private: - IModelTrackedTrajectory* _traj; - bool _isFixed; +public: + FixTrackCommand(IModelTrackedTrajectory* traj, bool isFixed, + QUndoCommand *parent = 0); + + void undo() override; + void redo() override; +signals: + void emitFixTrack(IModelTrackedTrajectory* traj, bool toggle); + +private: + IModelTrackedTrajectory* _traj; + bool _isFixed; }; +/** +* Rotate Entity command with data to do and undo: +* traj, old angle, new angle, fraemenumber +*/ class RotateEntityCommand : public QObject, public QUndoCommand { Q_OBJECT diff --git a/BioTracker/CoreApp/BioTracker/View/AnnotationsView.h b/BioTracker/CoreApp/BioTracker/View/AnnotationsView.h index f217c8fe..f54a9af6 100644 --- a/BioTracker/CoreApp/BioTracker/View/AnnotationsView.h +++ b/BioTracker/CoreApp/BioTracker/View/AnnotationsView.h @@ -8,6 +8,11 @@ class GraphicsView; +/** +* This view inherits from IView and QGraphicsItem. +* It is responsible for drawing the annotations. +* It is shown on to of the media panel. +*/ class AnnotationsView : public IView, public QGraphicsItem { public: @@ -29,6 +34,6 @@ class AnnotationsView : public IView, public QGraphicsItem void connectModelView() override {}; //members - QColor _annoColor = QColor(Qt::yellow); + QColor _annoColor = QColor(Qt::yellow); /**< color of all annotations */ }; diff --git a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp index 448da755..959ca253 100644 --- a/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp +++ b/BioTracker/CoreApp/BioTracker/View/ComponentShape.cpp @@ -1,5 +1,8 @@ #include "ComponentShape.h" #include + +#include "View/Utility/Tracer.h" + #include "QBrush" #include "QPainter" #include "QMenu" @@ -26,11 +29,16 @@ #include #include #include -#include "View/Utility/Tracer.h" //#include -ComponentShape::ComponentShape(QGraphicsObject* parent, IModelTrackedTrajectory* trajectory, int id): +/* +* This is the cpp file of the ComponentShape class +* Collapse/Fold all methods to have a better overview. +*/ + +ComponentShape::ComponentShape(QGraphicsObject* parent, + IModelTrackedTrajectory* trajectory, int id) : QGraphicsObject(parent), m_trajectory(trajectory), m_id(id), m_parent(parent) { setData(0, m_id); @@ -42,24 +50,29 @@ ComponentShape::ComponentShape(QGraphicsObject* parent, IModelTrackedTrajectory* m_penStyle = Qt::SolidLine; m_penStylePrev = Qt::SolidLine; m_marked = false; + + //set default permissions m_pMovable = true; m_pRemovable = true; m_pSwappable = true; m_pRotatable = true; + m_fixed = false; m_currentFramenumber = 0; m_rotation = 0; - m_trajectoryWasActiveOnce = false; + //m_trajectoryWasActiveOnce = false; + //create tracing layer m_tracingLayer = new QGraphicsRectItem(); m_tracingLayer->setZValue(3); this->scene()->addItem(m_tracingLayer); + //create orientation line m_rotationLine = QLineF(); + //set flags setFlag(ItemIsMovable); setFlag(ItemIsSelectable); - setAcceptedMouseButtons(Qt::LeftButton); setVisible(true); @@ -69,6 +82,8 @@ ComponentShape::~ComponentShape() { delete m_tracingLayer; } +//*****************************QGraphicsItem interface*************************************** + QRectF ComponentShape::boundingRect() const { if (this->data(1) == "ellipse" || this->data(1) == "point" || this->data(1) == "rectangle") { @@ -91,14 +106,14 @@ QPainterPath ComponentShape::shape() const if (this->data(1) == "ellipse") { path.addEllipse(0, 0, m_w, m_h); } - else if( this->data(1) == "point") { - int dim = m_w <= m_h? m_w : m_h; + else if (this->data(1) == "point") { + int dim = m_w <= m_h ? m_w : m_h; // path.addEllipse(0, 0, dim , dim); - QRectF ellipse; + QRectF ellipse; //ellipse = QRectF(0, m_h - m_w , m_w, m_w); - qreal origin_x = m_rotationLine.p1().x() - dim /2; - qreal origin_y = m_rotationLine.p1().y() - dim /2; - ellipse = QRectF(origin_x, origin_y , dim, dim); + qreal origin_x = m_rotationLine.p1().x() - dim / 2; + qreal origin_y = m_rotationLine.p1().y() - dim / 2; + ellipse = QRectF(origin_x, origin_y, dim, dim); path.addEllipse(ellipse); @@ -117,12 +132,13 @@ QPainterPath ComponentShape::shape() const return path; } -void ComponentShape::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) +void ComponentShape::paint(QPainter * painter, + const QStyleOptionGraphicsItem * option, QWidget * widget) { Q_UNUSED(option); Q_UNUSED(widget); - + if (m_currentFramenumber < 0) return; //Antialiasing @@ -163,17 +179,17 @@ void ComponentShape::paint(QPainter * painter, const QStyleOptionGraphicsItem * //take the smaller of width and height //a point should always have the same height and width if (this->data(1) == "point") { - QRectF ellipse; - if(m_w <= m_h){ + QRectF ellipse; + if (m_w <= m_h) { //ellipse = QRectF(0, m_h - m_w , m_w, m_w); - qreal origin_x = m_rotationLine.p1().x() - m_w /2; - qreal origin_y = m_rotationLine.p1().y() - m_w /2; - ellipse = QRectF(origin_x, origin_y , m_w, m_w); + qreal origin_x = m_rotationLine.p1().x() - m_w / 2; + qreal origin_y = m_rotationLine.p1().y() - m_w / 2; + ellipse = QRectF(origin_x, origin_y, m_w, m_w); } - else{ - qreal origin_x = m_rotationLine.p1().x() - m_h /2; - qreal origin_y = m_rotationLine.p1().y() - m_h /2; - ellipse = QRectF(origin_x, origin_y , m_h, m_h); + else { + qreal origin_x = m_rotationLine.p1().x() - m_h / 2; + qreal origin_y = m_rotationLine.p1().y() - m_h / 2; + ellipse = QRectF(origin_x, origin_y, m_h, m_h); } painter->drawEllipse(ellipse); } @@ -184,25 +200,364 @@ void ComponentShape::paint(QPainter * painter, const QStyleOptionGraphicsItem * painter->drawPolygon(polygonF); } } - - // draw id in center - if (m_showId){ - painter->drawText(this->boundingRect(), Qt::AlignCenter, QString::number(m_id)); + + // draw id in center + if (m_showId) { + painter->drawText(this->boundingRect(), Qt::AlignCenter, QString::number(m_id)); + } +} + +bool ComponentShape::advance() +{ + return false; +} + +void ComponentShape::mousePressEvent(QGraphicsSceneMouseEvent * event) +{ + m_mousePressTime = QTime::currentTime(); + m_mousePressTime.start(); + m_mousePressPos = pos().toPoint(); + + if (event->button() == Qt::LeftButton) { + // handle left mouse button here + setCursor(Qt::ClosedHandCursor); + update(); + } + //pass on + QGraphicsItem::mousePressEvent(event); +} + +void ComponentShape::mouseReleaseEvent(QGraphicsSceneMouseEvent * event) +{ + if (event->button() == Qt::LeftButton) { + setCursor(Qt::ArrowCursor); + + QPoint currentPos = this->pos().toPoint(); + int manhattanLength = (currentPos - m_mousePressPos).manhattanLength(); + int moveTime = m_mousePressTime.elapsed(); + if (manhattanLength > 5 || moveTime > 200) { + m_dragged = true; + } + + + if (m_dragged) { + + //broadcast move so other selected elements get moved too + //maybe unconventional and slow but couldn't find another way; Dropevents in view and dropevents in shape didn't seem to work + broadcastMove(); + } + else { + this->setPos(m_mousePressPos); + this->update(); + } + m_dragged = false; + + update(); + } + //pass on + QGraphicsItem::mouseReleaseEvent(event); + +} + +void ComponentShape::mouseMoveEvent(QGraphicsSceneMouseEvent * event) { + //pass on + QGraphicsItem::mouseMoveEvent(event); +} + +QVariant ComponentShape::itemChange(GraphicsItemChange change, + const QVariant &value) +{ + if (change == ItemSelectedHasChanged && scene()) { + if (this->isSelected()) { + m_penColorLast = m_penColor; + m_penColor = Qt::red; + m_penStylePrev = m_penStyle; + if (m_fixed) { + m_penStyle = Qt::DashDotLine; + } + else { + m_penStyle = Qt::DashLine; + } + this->setZValue(2); + trace(); + update(); + } + else { + m_penColor = m_penColorLast; + m_penStyle = m_penStylePrev; + this->setZValue(0); + trace(); + update(); + + } + } + return QGraphicsItem::itemChange(change, value); +} + +void ComponentShape::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) +{ + QMenu menu; + + /* + create the info box + */ + QWidgetAction* infoBox = new QWidgetAction(this); + + QString info = QString("ID: "); + info.append(QString::number(m_id)); + QLabel* infoLabel = new QLabel(info); + infoLabel->setWordWrap(true); + infoLabel->setStyleSheet("QLabel {font-weight: bold; text-align: center}"); + infoLabel->setAlignment(Qt::AlignCenter); + infoBox->setDefaultWidget(infoLabel); + menu.addAction(infoBox); + + // + menu.addSeparator(); + + /* + create set object name - line edit + */ + QWidgetAction* objectNameAction = new QWidgetAction(this); + QLineEdit* objectEdit = new QLineEdit(); + + if (objectName() == "") { + objectEdit->setPlaceholderText("no object name set"); + } + else { + objectEdit->setText(objectName()); + } + objectEdit->setAlignment(Qt::AlignHCenter); + objectEdit->setFrame(false); + objectEdit->setToolTip("Change the trajectory's name. This will not be saved in the data output (yet)!"); + + QObject::connect(objectEdit, &QLineEdit::textEdited, this, &ComponentShape::setObjectNameContext); + + objectNameAction->setDefaultWidget(objectEdit); + menu.addAction(objectNameAction); + + /* + show info window for current frame + */ + menu.addSeparator(); + QAction *showInfoAction = menu.addAction("Show full info", dynamic_cast(this), SLOT(createInfoWindow())); + menu.addSeparator(); + + /* + coloring + */ + QAction *changeBrushColorAction = menu.addAction("Change fill color", dynamic_cast(this), SLOT(changeBrushColor())); + QAction *changePenColorAction = menu.addAction("Change border color", dynamic_cast(this), SLOT(changePenColor())); + + /* + transparency slider + */ + QMenu* transparencyMenu = new QMenu("Transparency"); + QWidgetAction* sliderBox = new QWidgetAction(this); + QSlider* transparencySlider = new QSlider(Qt::Horizontal); + + transparencySlider->setMinimum(0); + transparencySlider->setMaximum(255); + transparencySlider->setSingleStep(1); + transparencySlider->setTickPosition(QSlider::TicksBothSides); + transparencySlider->setTickInterval(64); + transparencySlider->setValue(m_transparency); + + QObject::connect(transparencySlider, &QSlider::sliderMoved, this, &ComponentShape::receiveTransparency); + + sliderBox->setDefaultWidget(transparencySlider); + transparencyMenu->addAction(sliderBox); + + menu.addMenu(transparencyMenu); + + // + menu.addSeparator(); + /* + dimension menu + */ + QMenu* dimensionMenu = new QMenu("Dimensions"); + + //Width + QWidgetAction* widthBox = new QWidgetAction(this); + QSpinBox* widthSpin = new QSpinBox; + widthSpin->setPrefix("Width: "); + widthSpin->setMinimum(1); + widthSpin->setMaximum(100000); + widthSpin->setValue(m_w); + QObject::connect(widthSpin, QOverload::of(&QSpinBox::valueChanged), this, &ComponentShape::receiveWidth); + widthBox->setDefaultWidget(widthSpin); + dimensionMenu->addAction(widthBox); + + //Height + QWidgetAction* heightBox = new QWidgetAction(this); + QSpinBox* heightSpin = new QSpinBox; + heightSpin->setPrefix("Height: "); + heightSpin->setMinimum(1); + heightSpin->setMaximum(100000); + heightSpin->setValue(m_h); + QObject::connect(heightSpin, QOverload::of(&QSpinBox::valueChanged), this, &ComponentShape::receiveHeight); + heightBox->setDefaultWidget(heightSpin); + dimensionMenu->addAction(heightBox); + + // + menu.addMenu(dimensionMenu); + + /* + toggle orientation line + */ + + QAction *showOrientationAction = menu.addAction("Show orientation line", dynamic_cast(this), SLOT(receiveToggleOrientationLine(bool))); + showOrientationAction->setCheckable(true); + showOrientationAction->setChecked(m_orientationLine); + + /* + toggle id + */ + + QAction *showIDAction = menu.addAction("Show ID", dynamic_cast(this), SLOT(receiveShowId(bool))); + showIDAction->setCheckable(true); + showIDAction->setChecked(m_showId); + + + /* + tracing menu + */ + QMenu* tracingMenu = new QMenu("Tracing"); + //tracing type + QWidgetAction* typeBox = new QWidgetAction(this); + QComboBox* typeCombo = new QComboBox; + QStringList types; + types << "No tracing" << "Shape" << "Path" << "Arrow Path"; + typeCombo->addItems(types); + typeCombo->setCurrentText(m_tracingStyle); + QObject::connect(typeCombo, QOverload::of(&QComboBox::currentIndexChanged), this, &ComponentShape::receiveTracingStyle); + typeBox->setDefaultWidget(typeCombo); + QMenu* tracingTypeMenu = new QMenu("Type"); + tracingTypeMenu->addAction(typeBox); + tracingMenu->addMenu(tracingTypeMenu); + + //tracingHistory + QWidgetAction* historyBox = new QWidgetAction(this); + QSpinBox* historySpinBox = new QSpinBox; + historySpinBox->setPrefix("History: "); + historySpinBox->setMinimum(1); + historySpinBox->setMaximum(100000); + historySpinBox->setValue(m_tracingLength); + QObject::connect(historySpinBox, QOverload::of(&QSpinBox::valueChanged), this, &ComponentShape::receiveTracingLength); + historyBox->setDefaultWidget(historySpinBox); + tracingMenu->addAction(historyBox); + + //tracingSteps + QWidgetAction* stepsBox = new QWidgetAction(this); + QSpinBox* stepsSpinBox = new QSpinBox; + stepsSpinBox->setPrefix("Steps: "); + stepsSpinBox->setMinimum(1); + stepsSpinBox->setMaximum(100000); + stepsSpinBox->setValue(m_tracingSteps); + QObject::connect(stepsSpinBox, QOverload::of(&QSpinBox::valueChanged), this, &ComponentShape::receiveTracingSteps); + stepsBox->setDefaultWidget(stepsSpinBox); + tracingMenu->addAction(stepsBox); + + //tracingDegradation + QWidgetAction* degrBox = new QWidgetAction(this); + QComboBox* degrCombo = new QComboBox; + QStringList degrTypes; + degrTypes << "None" << "Transparency" << "False color"; + degrCombo->addItems(degrTypes); + degrCombo->setCurrentText(m_tracingTimeDegradation); + QObject::connect(degrCombo, QOverload::of(&QComboBox::currentIndexChanged), this, &ComponentShape::receiveTracingTimeDegradation); + degrBox->setDefaultWidget(degrCombo); + QMenu* tracingTimeDegrMenu = new QMenu("Time degradation"); + tracingTimeDegrMenu->addAction(degrBox); + tracingMenu->addMenu(tracingTimeDegrMenu); + + //toggle orientation line + + QAction *showTrOrientationAction = tracingMenu->addAction("Show tracer orientation line", dynamic_cast(this), SLOT(receiveTracerOrientationLine(bool))); + showTrOrientationAction->setCheckable(true); + showTrOrientationAction->setChecked(m_tracingOrientationLine); + + //tracer number + QAction *showTrNumberAction = tracingMenu->addAction("Show framenumber on tracers", dynamic_cast(this), SLOT(receiveTracerFrameNumber(bool))); + showTrNumberAction->setCheckable(true); + showTrNumberAction->setChecked(m_tracerFrameNumber); + + //tracer proportions + QWidgetAction* propBox = new QWidgetAction(this); + QDoubleSpinBox* propSpinBox = new QDoubleSpinBox; + propSpinBox->setPrefix("Proportions: "); + propSpinBox->setDecimals(2); + propSpinBox->setSingleStep(0.001f); + propSpinBox->setMinimum(0.01f); + propSpinBox->setMaximum(99.99f); + propSpinBox->setValue(m_tracerProportions); + QObject::connect(propSpinBox, QOverload::of(&QDoubleSpinBox::valueChanged), this, &ComponentShape::receiveTracerProportions); + propBox->setDefaultWidget(propSpinBox); + tracingMenu->addAction(propBox); + + + menu.addMenu(tracingMenu); + + // + menu.addSeparator(); + + /* + removing + */ + QAction *removeTrackAction = menu.addAction("Remove track", dynamic_cast(this), SLOT(removeTrack())); + QAction *removeTrackEntityAction = menu.addAction("Remove track entity", dynamic_cast(this), SLOT(removeTrackEntity())); + if (!m_pRemovable) { + removeTrackAction->setEnabled(false); + removeTrackEntityAction->setEnabled(false); + } + + /* + fixing + */ + QString fixText = m_fixed ? "Unfix track" : "Fix Track"; + QAction *fixTrackAction = menu.addAction(fixText, dynamic_cast(this), SLOT(toggleFixTrack())); + + /* + marking + */ + QString markText = m_marked ? "Unmark" : "Mark"; + QAction *markAction = menu.addAction(markText, dynamic_cast(this), SLOT(markShape())); + QAction *unmarkAction = menu.addAction(markText, dynamic_cast(this), SLOT(unmarkShape())); + markAction->setVisible(!m_marked); + unmarkAction->setVisible(m_marked); + + // + menu.addSeparator(); + + /* + morphing + */ + QMenu* morphMenu = new QMenu("Morph into..."); + if (data(1) == "rectangle" || data(1) == "ellipse" || data(1) == "point" || data(1) == "polygon") { + QAction* morphPoint = morphMenu->addAction("Point", dynamic_cast(this), SLOT(morphIntoPoint())); + QAction* morphEllipse = morphMenu->addAction("Ellipse", dynamic_cast(this), SLOT(morphIntoEllipse())); + QAction* morphRect = morphMenu->addAction("Rectangle", dynamic_cast(this), SLOT(morphIntoRect())); + QAction* morphPoylgon = morphMenu->addAction("Polygon", dynamic_cast(this), SLOT(morphIntoPolygon())); + } + else { + morphMenu->setEnabled(false); } -} + menu.addMenu(morphMenu); -bool ComponentShape::advance() -{ - return false; + // + QAction *selectedAction = menu.exec(event->screenPos()); } -//enables possibility for plugin to change width, height, rotation, position, etc.. + +//************************************************************************* + +/// updates this with data from new current entity bool ComponentShape::updateAttributes(uint frameNumber) { m_currentFramenumber = frameNumber; // if trajectory does not exist anymore, delete the shape - if(!m_trajectory){ + if (!m_trajectory) { this->hide(); m_tracingLayer->hide(); this->deleteLater(); @@ -216,14 +571,14 @@ bool ComponentShape::updateAttributes(uint frameNumber) m_fixed = m_trajectory->getFixed(); if (!m_fixed) { - if(this->isSelected()){m_penStyle = Qt::DashLine;} - else{m_penStyle = Qt::SolidLine;} + if (this->isSelected()) { m_penStyle = Qt::DashLine; } + else { m_penStyle = Qt::SolidLine; } } else { - if(this->isSelected()){m_penStyle = Qt::DashDotLine;} - else{m_penStyle = Qt::DotLine;} + if (this->isSelected()) { m_penStyle = Qt::DashDotLine; } + else { m_penStyle = Qt::DotLine; } } - + //update dimensions prepareGeometryChange(); @@ -236,13 +591,13 @@ bool ComponentShape::updateAttributes(uint frameNumber) hasType = true; //update width and height or use defaults if (m_useDefaultDimensions) { - if (pointLike->hasW()) {m_w = pointLike->getW();} + if (pointLike->hasW()) { m_w = pointLike->getW(); } else { m_w = m_wDefault; } - if (pointLike->hasH()) {m_h = pointLike->getH();} + if (pointLike->hasH()) { m_h = pointLike->getH(); } else { m_h = m_hDefault; } } //update rotation - if(pointLike->hasDeg()){ + if (pointLike->hasDeg()) { this->setTransformOriginPoint(m_w / 2, m_h / 2); if (m_h > m_w || data(1) == "polygon") { m_rotation = -90 - pointLike->getDeg(); @@ -269,18 +624,18 @@ bool ComponentShape::updateAttributes(uint frameNumber) m_rotationHandleLayer->setRotation(0); m_rotationHandle->setPos(m_rotationLine.p2()); } - else{ + else { m_rotationLine = QLineF(); } //update Position - this->setPos(pointLike->getXpx() - m_w/2, pointLike->getYpx() - m_h/2); + this->setPos(pointLike->getXpx() - m_w / 2, pointLike->getYpx() - m_h / 2); m_oldPos = this->pos().toPoint(); - + /* - -for morphing into polygon: - -construct polygon from pos and width,height + -when morphing into polygon: + -construct polygon from pos and width,height -pentagon x / \ @@ -292,12 +647,12 @@ bool ComponentShape::updateAttributes(uint frameNumber) m_polygons = QList(); QPolygonF polygon; - QPointF startPoint = QPointF( m_w/2, 0); + QPointF startPoint = QPointF(m_w / 2, 0); polygon << startPoint; - polygon << QPointF( m_w, m_h / 2); - polygon << QPointF( 3 * m_w / 4, m_h); - polygon << QPointF( m_w / 4, m_h); - polygon << QPointF( 0, m_h / 2); + polygon << QPointF(m_w, m_h / 2); + polygon << QPointF(3 * m_w / 4, m_h); + polygon << QPointF(m_w / 4, m_h); + polygon << QPointF(0, m_h / 2); polygon << startPoint; if (polygon.isClosed()) { @@ -318,7 +673,7 @@ bool ComponentShape::updateAttributes(uint frameNumber) } // if polygon IModelTrackedPolygon* polygons = dynamic_cast(m_trajectory->getChild(frameNumber)); - if (polygons && (polygons->getValid() || m_currentFramenumber == 0)){ + if (polygons && (polygons->getValid() || m_currentFramenumber == 0)) { hasType = true; //update polygon if (polygons->hasPolygon()) { @@ -343,12 +698,12 @@ bool ComponentShape::updateAttributes(uint frameNumber) return true; } //has no type - if (!hasType){ + if (!hasType) { qDebug() << "The current entity has no known type"; } } - else{ + else { //trajectory is empty or null or invald or current entity is null this->hide(); m_tracingLayer->hide(); @@ -357,11 +712,13 @@ bool ComponentShape::updateAttributes(uint frameNumber) } } +/// attemps to draw tracers, if _tracingStyle is set tracers are drawn void ComponentShape::trace() { //TRACING - IModelTrackedPoint* currentChild = dynamic_cast(m_trajectory->getChild(m_currentFramenumber)); + IModelTrackedPoint* currentChild = dynamic_cast + (m_trajectory->getChild(m_currentFramenumber)); //return if current entity is not existant if (!currentChild) return; @@ -374,34 +731,32 @@ void ComponentShape::trace() m_tracingLayer->show(); // really unefficient to flush each time - //flush tracing shape history, open up the memory - // while (m_tracingLayer->childItems().size() > 0) { - // delete m_tracingLayer->childItems()[0]; - // } - - //check if number of tracing children in tracing layer is correct - //delete/add the difference + //flush tracing shape history, open up the memory --> thats slow QList tracers = m_tracingLayer->childItems(); foreach(QGraphicsItem * tracer, tracers) { delete tracer; } + //return if tracing disabled if (m_trajectory->size() == 0 || m_tracingLength <= 0 || m_tracingStyle == "No tracing") { return; } QPointF lastPointDifference = QPointF(0, 0) + QPointF(m_h / 2, m_w / 2); + //create each n'th (m_tracingSteps) tracer of tracing history (m_tracingLength) for (int i = 1; i <= m_tracingLength && i <= m_currentFramenumber; i += m_tracingSteps) { - - IModelTrackedPoint* historyChild = dynamic_cast(m_trajectory->getChild(m_currentFramenumber - i)); + + IModelTrackedPoint* historyChild = dynamic_cast + (m_trajectory->getChild(m_currentFramenumber - i)); if (historyChild && historyChild->getValid()) { //positioning QPointF historyPoint = QPointF(historyChild->getXpx(), historyChild->getYpx()); QPointF historyPointDifference = historyPoint - currentPoint; - QPointF adjustedHistoryPointDifference = historyPointDifference + QPointF(m_w / 2, m_h / 2); + QPointF adjustedHistoryPointDifference = historyPointDifference + + QPointF(m_w / 2, m_h / 2); //time degradation colors QPen timeDegradationPen = QPen(m_penColor, m_penWidth, m_penStyle); @@ -412,12 +767,14 @@ void ComponentShape::trace() if (m_tracingTimeDegradation == "Transparency") { float tr = (float)m_transparency; - float trForThis = tr != 0 ? tr - (tr / (float)m_tracingLength) * (i-1) : 0.0f; + float trForThis = tr != 0 ? tr - (tr / (float)m_tracingLength) * (i - 1) : 0.0f; - timeDegradationPenColor = QColor(m_penColor.red(), m_penColor.green(), m_penColor.blue(), trForThis); + timeDegradationPenColor = QColor(m_penColor.red(), + m_penColor.green(), m_penColor.blue(), trForThis); timeDegradationPen = QPen(timeDegradationPenColor, m_penWidth, Qt::SolidLine); - timeDegradationBrushColor = QColor(m_brushColor.red(), m_brushColor.green(), m_brushColor.blue(), trForThis); + timeDegradationBrushColor = QColor(m_brushColor.red(), + m_brushColor.green(), m_brushColor.blue(), trForThis); timeDegradationBrush = QBrush(timeDegradationBrushColor); } @@ -431,8 +788,10 @@ void ComponentShape::trace() timeDegradationBrush = QBrush(timeDegradationBrushColor); } - if (m_tracingStyle == "Shape") { + // check tracing type + //SHAPE + if (m_tracingStyle == "Shape") { //orientation line if (m_tracingOrientationLine) { @@ -442,23 +801,27 @@ void ComponentShape::trace() qreal length = (m_w + m_h) / 2 / m_tracerProportions * 3; orientationLine.setLength(15); - QGraphicsLineItem* orientationItem = new QGraphicsLineItem(orientationLine, m_tracingLayer); + QGraphicsLineItem* orientationItem = new QGraphicsLineItem(orientationLine, + m_tracingLayer); } - //createShapeTracer(this->data(1), historyChild, adjustedHistoryPointDifference, timeDegradationPen, timeDegradationBrush); float tracerDeg = historyChild->hasDeg() ? historyChild->getDeg() : 0.0; float tracerW = m_w * m_tracerProportions; float tracerH = m_h * m_tracerProportions; int tracerNumber = m_currentFramenumber - i; - Tracer* tracer = new Tracer(this->data(1), tracerNumber, tracerDeg, adjustedHistoryPointDifference, tracerW, tracerH, timeDegradationPen, timeDegradationBrush, m_tracingLayer); - QObject::connect(tracer, &Tracer::emitGoToFrame, this, &ComponentShape::emitGoToFrame); + Tracer* tracer = new Tracer(this->data(1), tracerNumber, tracerDeg, + adjustedHistoryPointDifference, tracerW, tracerH, + timeDegradationPen, timeDegradationBrush, m_tracingLayer); + + QObject::connect(tracer, &Tracer::emitGoToFrame, + this, &ComponentShape::emitGoToFrame); } //PATH else if (m_tracingStyle == "Path") { - if(lastPointDifference != adjustedHistoryPointDifference){ + if (lastPointDifference != adjustedHistoryPointDifference) { QLineF base = QLineF(lastPointDifference, adjustedHistoryPointDifference); QGraphicsLineItem* lineItem = new QGraphicsLineItem(base, m_tracingLayer); @@ -467,452 +830,181 @@ void ComponentShape::trace() lastPointDifference = adjustedHistoryPointDifference; } } + //ARROWPATH else if (m_tracingStyle == "Arrow path") { - if(lastPointDifference != adjustedHistoryPointDifference){ + if (lastPointDifference != adjustedHistoryPointDifference) { - QLineF base = QLineF(lastPointDifference, adjustedHistoryPointDifference); + QLineF base = QLineF(lastPointDifference, adjustedHistoryPointDifference); - int armLength = std::floor(base.length() / 9) + 2; + int armLength = std::floor(base.length() / 9) + 2; - QLineF arm0 = base.normalVector(); - arm0.setLength(armLength); - arm0.setAngle(base.angle() + 20); + QLineF arm0 = base.normalVector(); + arm0.setLength(armLength); + arm0.setAngle(base.angle() + 20); - QLineF arm1 = base.normalVector(); - arm1.setLength(armLength); - arm1.setAngle(base.angle() - 20); + QLineF arm1 = base.normalVector(); + arm1.setLength(armLength); + arm1.setAngle(base.angle() - 20); - QGraphicsLineItem* baseItem = new QGraphicsLineItem(base, m_tracingLayer); - baseItem->setPen(QPen(timeDegradationBrushColor, m_penWidth, m_penStyle)); - QGraphicsLineItem* arm0Item = new QGraphicsLineItem(arm0, m_tracingLayer); - arm0Item->setPen(timeDegradationPen); - QGraphicsLineItem* arm1Item = new QGraphicsLineItem(arm1, m_tracingLayer); - arm1Item->setPen(timeDegradationPen); + QGraphicsLineItem* baseItem = new QGraphicsLineItem(base, m_tracingLayer); + baseItem->setPen(QPen(timeDegradationBrushColor, m_penWidth, m_penStyle)); + QGraphicsLineItem* arm0Item = new QGraphicsLineItem(arm0, m_tracingLayer); + arm0Item->setPen(timeDegradationPen); + QGraphicsLineItem* arm1Item = new QGraphicsLineItem(arm1, m_tracingLayer); + arm1Item->setPen(timeDegradationPen); - lastPointDifference = adjustedHistoryPointDifference; + lastPointDifference = adjustedHistoryPointDifference; } } - //add framenumber to each tracer - if (m_tracerFrameNumber) { - uint tracerNumber = m_currentFramenumber - i; - QFont font = QFont(); - int fontPixelSize = (int)((m_w + m_h) / 2) * m_tracerProportions; - font.setPixelSize(fontPixelSize); - //font.setBold(true); - QGraphicsSimpleTextItem* tracerNumberText = new QGraphicsSimpleTextItem(QString::number(tracerNumber), m_tracingLayer); - tracerNumberText->setFont(font); - tracerNumberText->setBrush(QBrush(Qt::white)); //sloooow - QPen pen = QPen(Qt::black); - pen.setWidth(0); - tracerNumberText->setPen(pen); //sloooow - tracerNumberText->setPos(adjustedHistoryPointDifference + QPointF(-m_w * m_tracerProportions / 3.5f, -m_h * m_tracerProportions / 7)); - } - } - } -} - -IModelTrackedTrajectory * ComponentShape::getTrajectory() -{ - return m_trajectory; -} - -void ComponentShape::setPermission(std::pair permission) -{ - m_permissions.insert(permission); - - - switch (permission.first) - { - case ENUMS::COREPERMISSIONS::COMPONENTMOVE: - m_pMovable = permission.second; - this->setFlag(ItemIsMovable, permission.second); - break; - case ENUMS::COREPERMISSIONS::COMPONENTREMOVE: - m_pRemovable = permission.second; - break; - case ENUMS::COREPERMISSIONS::COMPONENTSWAP: - m_pSwappable = permission.second; - break; - case ENUMS::COREPERMISSIONS::COMPONENTROTATE: - m_pRotatable = permission.second; - - if (m_pRotatable) { - m_rotationHandleLayer->setVisible(m_orientationLine); - m_rotationHandle->setVisible(m_orientationLine); - } - else { - m_rotationHandleLayer->hide(); - m_rotationHandle->hide(); - } - break; - } -} - -int ComponentShape::getId() -{ - return m_id; -} - -bool ComponentShape::isSwappable() -{ - return m_permissions[ENUMS::COREPERMISSIONS::COMPONENTSWAP]; -} - -bool ComponentShape::isRemovable() -{ - return m_pRemovable; -} - -bool ComponentShape::isRotatable() -{ - return m_pRotatable; -} - -QPoint ComponentShape::getOldPos() -{ - return m_oldPos; -} - -void ComponentShape::mousePressEvent(QGraphicsSceneMouseEvent * event) -{ - m_mousePressTime = QTime::currentTime(); - m_mousePressTime.start(); - m_mousePressPos = pos().toPoint(); - - if (event->button() == Qt::LeftButton) { - // handle left mouse button here - setCursor(Qt::ClosedHandCursor); - update(); - } - //pass on - QGraphicsItem::mousePressEvent(event); -} - -void ComponentShape::mouseReleaseEvent(QGraphicsSceneMouseEvent * event) -{ - if (event->button() == Qt::LeftButton) { - setCursor(Qt::ArrowCursor); - - QPoint currentPos = this->pos().toPoint(); - int manhattanLength = (currentPos - m_mousePressPos).manhattanLength(); - int moveTime = m_mousePressTime.elapsed(); - if (manhattanLength > 5 || moveTime > 200) { - m_dragged = true; - } - - - if (m_dragged) { - - //broadcast move so other selected elements get moved too - // TODO? maybe unconventional and slow but couldn't find another way; Dropevents in view and dropevents in shape didn't seem to work - broadcastMove(); - } - else { - this->setPos(m_mousePressPos); - this->update(); - } - m_dragged = false; - - update(); - } - //pass on - QGraphicsItem::mouseReleaseEvent(event); - -} - -void ComponentShape::mouseMoveEvent(QGraphicsSceneMouseEvent * event) { - //pass on - QGraphicsItem::mouseMoveEvent(event); -} - -QVariant ComponentShape::itemChange(GraphicsItemChange change, const QVariant &value) -{ - if (change == ItemSelectedHasChanged && scene()) { - if (this->isSelected()) { - m_penColorLast = m_penColor; - m_penColor = Qt::red; - m_penStylePrev = m_penStyle; - if (m_fixed) { - m_penStyle = Qt::DashDotLine; - } - else { - m_penStyle = Qt::DashLine; - } - this->setZValue(2); - trace(); - update(); - } - else { - m_penColor = m_penColorLast; - m_penStyle = m_penStylePrev; - this->setZValue(0); - trace(); - update(); - - } - } - return QGraphicsItem::itemChange(change, value); -} - -void ComponentShape::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) -{ - QMenu menu; - - /* - create the info box - */ - QWidgetAction* infoBox = new QWidgetAction(this); - - QString info = QString("ID: "); - info.append(QString::number(m_id)); - QLabel* infoLabel = new QLabel(info); - infoLabel->setWordWrap(true); - infoLabel->setStyleSheet("QLabel {font-weight: bold; text-align: center}"); - infoLabel->setAlignment(Qt::AlignCenter); - infoBox->setDefaultWidget(infoLabel); - menu.addAction(infoBox); - - // - menu.addSeparator(); - - /* - create set object name - line edit - */ - QWidgetAction* objectNameAction = new QWidgetAction(this); - QLineEdit* objectEdit = new QLineEdit(); - - if(objectName() == ""){ - objectEdit->setPlaceholderText("no object name set"); - } - else{ - objectEdit->setText(objectName()); - } - objectEdit->setAlignment(Qt::AlignHCenter); - objectEdit->setFrame(false); - objectEdit->setToolTip("Change the trajectory's name. This will not be saved in the data output (yet)!"); - - QObject::connect(objectEdit, &QLineEdit::textEdited, this, &ComponentShape::setObjectNameContext); - - objectNameAction->setDefaultWidget(objectEdit); - menu.addAction(objectNameAction); - - /* - show info window for current frame - */ - menu.addSeparator(); - QAction *showInfoAction = menu.addAction("Show full info", dynamic_cast(this), SLOT(createInfoWindow())); - menu.addSeparator(); - - /* - coloring - */ - QAction *changeBrushColorAction = menu.addAction("Change fill color",dynamic_cast(this),SLOT(changeBrushColor())); - QAction *changePenColorAction = menu.addAction("Change border color", dynamic_cast(this), SLOT(changePenColor())); - - /* - transparency slider - */ - QMenu* transparencyMenu = new QMenu("Transparency"); - QWidgetAction* sliderBox = new QWidgetAction(this); - QSlider* transparencySlider = new QSlider(Qt::Horizontal); - - transparencySlider->setMinimum(0); - transparencySlider->setMaximum(255); - transparencySlider->setSingleStep(1); - transparencySlider->setTickPosition(QSlider::TicksBothSides); - transparencySlider->setTickInterval(64); - transparencySlider->setValue(m_transparency); - - QObject::connect(transparencySlider, &QSlider::sliderMoved, this, &ComponentShape::receiveTransparency); - - sliderBox->setDefaultWidget(transparencySlider); - transparencyMenu->addAction(sliderBox); - - menu.addMenu(transparencyMenu); - - // - menu.addSeparator(); - /* - dimension menu - */ - QMenu* dimensionMenu = new QMenu("Dimensions"); - - //Width - QWidgetAction* widthBox = new QWidgetAction(this); - QSpinBox* widthSpin = new QSpinBox; - widthSpin->setPrefix("Width: "); - widthSpin->setMinimum(1); - widthSpin->setMaximum(100000); - widthSpin->setValue(m_w); - QObject::connect(widthSpin, QOverload::of(&QSpinBox::valueChanged), this, &ComponentShape::receiveWidth); - widthBox->setDefaultWidget(widthSpin); - dimensionMenu->addAction(widthBox); - - //Height - QWidgetAction* heightBox = new QWidgetAction(this); - QSpinBox* heightSpin = new QSpinBox; - heightSpin->setPrefix("Height: "); - heightSpin->setMinimum(1); - heightSpin->setMaximum(100000); - heightSpin->setValue(m_h); - QObject::connect(heightSpin, QOverload::of(&QSpinBox::valueChanged), this, &ComponentShape::receiveHeight); - heightBox->setDefaultWidget(heightSpin); - dimensionMenu->addAction(heightBox); - - // - menu.addMenu(dimensionMenu); - - /* - toggle orientation line - */ + //add framenumber to each tracer + if (m_tracerFrameNumber) { + uint tracerNumber = m_currentFramenumber - i; + QFont font = QFont(); + int fontPixelSize = (int)((m_w + m_h) / 5) * m_tracerProportions; + font.setPixelSize(fontPixelSize); + //font.setBold(true); + QGraphicsSimpleTextItem* tracerNumberText = + new QGraphicsSimpleTextItem(QString::number(tracerNumber), m_tracingLayer); + tracerNumberText->setFont(font); + tracerNumberText->setBrush(QBrush(Qt::white)); //sloooow + QPen pen = QPen(Qt::black); + pen.setWidth(0); + tracerNumberText->setPen(pen); //sloooow + tracerNumberText->setPos(adjustedHistoryPointDifference + + QPointF(-m_w * m_tracerProportions / 2.0f, -m_h * m_tracerProportions / 5)); + } + } + } +} - QAction *showOrientationAction = menu.addAction("Show orientation line", dynamic_cast(this), SLOT(receiveToggleOrientationLine(bool))); - showOrientationAction->setCheckable(true); - showOrientationAction->setChecked(m_orientationLine); +IModelTrackedTrajectory * ComponentShape::getTrajectory() +{ + return m_trajectory; +} - /* - toggle id - */ +void ComponentShape::setPermission(std::pair permission) +{ + m_permissions.insert(permission); - QAction *showIDAction = menu.addAction("Show ID", dynamic_cast(this), SLOT(receiveShowId(bool))); - showIDAction->setCheckable(true); - showIDAction->setChecked(m_showId); + switch (permission.first) + { + case ENUMS::COREPERMISSIONS::COMPONENTMOVE: + m_pMovable = permission.second; + this->setFlag(ItemIsMovable, permission.second); + break; + case ENUMS::COREPERMISSIONS::COMPONENTREMOVE: + m_pRemovable = permission.second; + break; + case ENUMS::COREPERMISSIONS::COMPONENTSWAP: + m_pSwappable = permission.second; + break; + case ENUMS::COREPERMISSIONS::COMPONENTROTATE: + m_pRotatable = permission.second; + + if (m_pRotatable) { + m_rotationHandleLayer->setVisible(m_orientationLine); + m_rotationHandle->setVisible(m_orientationLine); + } + else { + m_rotationHandleLayer->hide(); + m_rotationHandle->hide(); + } + break; + } +} - /* - tracing menu - */ - QMenu* tracingMenu = new QMenu("Tracing"); - //tracing type - QWidgetAction* typeBox = new QWidgetAction(this); - QComboBox* typeCombo = new QComboBox; - QStringList types; - types << "No tracing" << "Shape" << "Path" << "Arrow Path"; - typeCombo->addItems(types); - typeCombo->setCurrentText(m_tracingStyle); - QObject::connect(typeCombo, QOverload::of(&QComboBox::currentIndexChanged), this, &ComponentShape::receiveTracingStyle); - typeBox->setDefaultWidget(typeCombo); - QMenu* tracingTypeMenu = new QMenu("Type"); - tracingTypeMenu->addAction(typeBox); - tracingMenu->addMenu(tracingTypeMenu); +int ComponentShape::getId() +{ + return m_id; +} - //tracingHistory - QWidgetAction* historyBox = new QWidgetAction(this); - QSpinBox* historySpinBox = new QSpinBox; - historySpinBox->setPrefix("History: "); - historySpinBox->setMinimum(1); - historySpinBox->setMaximum(100000); - historySpinBox->setValue(m_tracingLength); - QObject::connect(historySpinBox, QOverload::of(&QSpinBox::valueChanged), this, &ComponentShape::receiveTracingLength); - historyBox->setDefaultWidget(historySpinBox); - tracingMenu->addAction(historyBox); +bool ComponentShape::isSwappable() +{ + return m_permissions[ENUMS::COREPERMISSIONS::COMPONENTSWAP]; +} - //tracingSteps - QWidgetAction* stepsBox = new QWidgetAction(this); - QSpinBox* stepsSpinBox = new QSpinBox; - stepsSpinBox->setPrefix("Steps: "); - stepsSpinBox->setMinimum(1); - stepsSpinBox->setMaximum(100000); - stepsSpinBox->setValue(m_tracingSteps); - QObject::connect(stepsSpinBox, QOverload::of(&QSpinBox::valueChanged), this, &ComponentShape::receiveTracingSteps); - stepsBox->setDefaultWidget(stepsSpinBox); - tracingMenu->addAction(stepsBox); +bool ComponentShape::isRemovable() +{ + return m_pRemovable; +} - //tracingDegradation - QWidgetAction* degrBox = new QWidgetAction(this); - QComboBox* degrCombo = new QComboBox; - QStringList degrTypes; - degrTypes << "None" << "Transparency" << "False color"; - degrCombo->addItems(degrTypes); - degrCombo->setCurrentText(m_tracingTimeDegradation); - QObject::connect(degrCombo, QOverload::of(&QComboBox::currentIndexChanged), this, &ComponentShape::receiveTracingTimeDegradation); - degrBox->setDefaultWidget(degrCombo); - QMenu* tracingTimeDegrMenu = new QMenu("Time degradation"); - tracingTimeDegrMenu->addAction(degrBox); - tracingMenu->addMenu(tracingTimeDegrMenu); +bool ComponentShape::isRotatable() +{ + return m_pRotatable; +} - //toggle orientation line +QPoint ComponentShape::getOldPos() +{ + return m_oldPos; +} - QAction *showTrOrientationAction = tracingMenu->addAction("Show tracer orientation line", dynamic_cast(this), SLOT(receiveTracerOrientationLine(bool))); - showTrOrientationAction->setCheckable(true); - showTrOrientationAction->setChecked(m_tracingOrientationLine); +//set default members from core params +void ComponentShape::setMembers(CoreParameter* coreParams) +{ + //from coreParams + m_antialiasing = coreParams->m_antialiasingEntities; - //tracer number - QAction *showTrNumberAction = tracingMenu->addAction("Show framenumber on tracers", dynamic_cast(this), SLOT(receiveTracerFrameNumber(bool))); - showTrNumberAction->setCheckable(true); - showTrNumberAction->setChecked(m_tracerFrameNumber); - //tracer proportions - QWidgetAction* propBox = new QWidgetAction(this); - QDoubleSpinBox* propSpinBox = new QDoubleSpinBox; - propSpinBox->setPrefix("Proportions: "); - propSpinBox->setDecimals(2); - propSpinBox->setSingleStep(0.001f); - propSpinBox->setMinimum(0.01f); - propSpinBox->setMaximum(99.99f); - propSpinBox->setValue(m_tracerProportions); - QObject::connect(propSpinBox, QOverload::of(&QDoubleSpinBox::valueChanged), this, &ComponentShape::receiveTracerProportions); - propBox->setDefaultWidget(propSpinBox); - tracingMenu->addAction(propBox); + m_tracingStyle = coreParams->m_tracingStyle; + m_tracingTimeDegradation = coreParams->m_tracingTimeDegradation; + m_tracingLength = coreParams->m_tracingHistory; + m_tracingSteps = coreParams->m_tracingSteps; + m_tracerProportions = coreParams->m_tracerProportions; + m_tracingOrientationLine = coreParams->m_tracerOrientationLine; + m_tracerFrameNumber = coreParams->m_tracerFrameNumber; + m_orientationLine = coreParams->m_trackOrientationLine; + m_showId = coreParams->m_trackShowId; - menu.addMenu(tracingMenu); + m_brushColor = *(coreParams->m_colorBrush); + m_penColor = *(coreParams->m_colorBorder); - // - menu.addSeparator(); + m_dragged = false; + setFlag(QGraphicsItem::ItemIgnoresTransformations, coreParams->m_ignoreZoom); - /* - removing - */ - QAction *removeTrackAction = menu.addAction("Remove track", dynamic_cast(this), SLOT(removeTrack())); - QAction *removeTrackEntityAction = menu.addAction("Remove track entity", dynamic_cast(this), SLOT(removeTrackEntity())); - if (!m_pRemovable) { - removeTrackAction->setEnabled(false); - removeTrackEntityAction->setEnabled(false); + // set dimensions and default dimensions + if (coreParams->m_trackWidth > 0) { + m_w = coreParams->m_trackWidth; + m_wDefault = coreParams->m_trackWidth; + } + if (coreParams->m_trackHeight > 0) { + m_h = coreParams->m_trackHeight; + m_hDefault = coreParams->m_trackHeight; } - /* - fixing - */ - QString fixText = m_fixed?"Unfix track":"Fix Track"; - QAction *fixTrackAction = menu.addAction(fixText, dynamic_cast(this), SLOT(toggleFixTrack())); + //initialize helpers + m_rotationHandleLayer = new QGraphicsRectItem(this); + m_rotationHandleLayer->setPos(0, 0); + m_rotationHandleLayer->setFlag(QGraphicsItem::ItemHasNoContents); - /* - marking - */ - QString markText = m_marked?"Unmark":"Mark"; - QAction *markAction = menu.addAction(markText, dynamic_cast(this), SLOT(markShape())); - QAction *unmarkAction = menu.addAction(markText, dynamic_cast(this), SLOT(unmarkShape())); - markAction->setVisible(!m_marked); - unmarkAction->setVisible(m_marked); - - // - menu.addSeparator(); + m_rotationHandle = new RotationHandle(QPoint(m_w / 2, m_h / 2), m_rotationHandleLayer); + m_rotationHandle->setAntialiasing(m_antialiasing); + QObject::connect(m_rotationHandle, &RotationHandle::emitShapeRotation, this, &ComponentShape::receiveShapeRotation); - /* - morphing - */ - QMenu* morphMenu = new QMenu("Morph into..."); - if(data(1)=="rectangle" || data(1) == "ellipse" || data(1) == "point" || data(1) == "polygon"){ - QAction* morphPoint = morphMenu->addAction("Point", dynamic_cast(this), SLOT(morphIntoPoint())); - QAction* morphEllipse = morphMenu->addAction("Ellipse", dynamic_cast(this), SLOT(morphIntoEllipse())); - QAction* morphRect = morphMenu->addAction("Rectangle", dynamic_cast(this), SLOT(morphIntoRect())); - QAction* morphPoylgon = morphMenu->addAction("Polygon", dynamic_cast(this), SLOT(morphIntoPolygon())); - } - else{ - morphMenu->setEnabled(false); + if (m_pRotatable) { + m_rotationHandleLayer->setVisible(m_orientationLine); + m_rotationHandle->setVisible(m_orientationLine); } - menu.addMenu(morphMenu); - // - QAction *selectedAction = menu.exec(event->screenPos()); + update(); +} + +double ComponentShape::constrainAngle(double x) { + x = fmod(x, 360); + if (x < 0) + x += 360; + return x; } -//SLOTS + +//################################SLOTS############################# + +//**************************context menu actions******************** void ComponentShape::changeBrushColor() { @@ -992,7 +1084,7 @@ bool ComponentShape::removeTrackEntity() } void ComponentShape::markShape(int penwidth) -{ +{ if (!m_marked) { m_penWidth = 3; } @@ -1007,7 +1099,7 @@ void ComponentShape::markShape(int penwidth) void ComponentShape::unmarkShape() { m_marked = false; - m_penWidth = 0; + m_penWidth = 2; trace(); update(); @@ -1016,7 +1108,7 @@ void ComponentShape::unmarkShape() void ComponentShape::toggleFixTrack() { //if traj is currently fixed-> emit flase, else emit true - bool fixToggle = m_fixed?false:true; + bool fixToggle = m_fixed ? false : true; Q_EMIT emitToggleFixTrack(m_trajectory, fixToggle); update(); trace(); @@ -1026,7 +1118,7 @@ void ComponentShape::toggleFixTrack() void ComponentShape::createInfoWindow() { QTableWidget* infoTable = new QTableWidget(); - + infoTable->setRowCount(0); infoTable->setColumnCount(2); @@ -1035,16 +1127,16 @@ void ComponentShape::createInfoWindow() infoTable->verticalHeader()->hide(); QLinkedList> infoList; - infoList.append(QPair("ID", QString::number(m_id))); - infoList.append(QPair("Framenumber", QString::number(m_currentFramenumber))); - infoList.append(QPair("Seen for frames", QString::number(m_trajectory->validCount()))); - infoList.append(QPair("Width", QString::number(m_w))); - infoList.append(QPair("Height", QString::number(m_h))); - infoList.append(QPair("Orientation (in Degrees)", QString::number(m_rotation))); - infoList.append(QPair("Fixed", QString::number(m_fixed))); + infoList.append(QPair("ID", QString::number(m_id))); + infoList.append(QPair("Framenumber", QString::number(m_currentFramenumber))); + infoList.append(QPair("Seen for frames", QString::number(m_trajectory->validCount()))); + infoList.append(QPair("Width", QString::number(m_w))); + infoList.append(QPair("Height", QString::number(m_h))); + infoList.append(QPair("Orientation (in Degrees)", QString::number(m_rotation))); + infoList.append(QPair("Fixed", QString::number(m_fixed))); QLinkedList>::const_iterator info; - for(info = infoList.constBegin(); info != infoList.constEnd(); ++info){ + for (info = infoList.constBegin(); info != infoList.constEnd(); ++info) { infoTable->insertRow(infoTable->rowCount()); @@ -1060,7 +1152,7 @@ void ComponentShape::createInfoWindow() //infoTable->horizontalHeader()->setStretchLastSection( true ); infoTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); - + QWidget* infoWidget = new QWidget(); const QString title = QString("Information for track %1 on frame %2").arg(QString::number(m_id), QString::number(m_currentFramenumber)); infoWidget->setWindowTitle(title); @@ -1073,28 +1165,26 @@ void ComponentShape::createInfoWindow() infoWidget->show(); - + } -void ComponentShape::setObjectNameContext(QString name){ +// this is only visual, the object name is not set in the exported file +void ComponentShape::setObjectNameContext(QString name) { setObjectName(name); m_trajectory->setObjectName(name); - //_objNameBuffer = name; } -//void ComponentShape::setObjectName - -void ComponentShape::morphIntoRect(){ +void ComponentShape::morphIntoRect() { setData(1, "rectangle"); updateAttributes(m_currentFramenumber); trace(); } -void ComponentShape::morphIntoEllipse(){ +void ComponentShape::morphIntoEllipse() { setData(1, "ellipse"); updateAttributes(m_currentFramenumber); trace(); } -void ComponentShape::morphIntoPoint(){ +void ComponentShape::morphIntoPoint() { setData(1, "point"); updateAttributes(m_currentFramenumber); trace(); @@ -1107,6 +1197,9 @@ void ComponentShape::morphIntoPolygon() trace(); } +//************************************************************************ + +//*************************** SLOTS to set members***************************** void ComponentShape::receiveTracingLength(int tracingLength) { m_tracingLength = tracingLength; @@ -1174,7 +1267,7 @@ void ComponentShape::receiveDimensions(int width, int height) update(); } -void ComponentShape::receiveHeight(int height){ +void ComponentShape::receiveHeight(int height) { m_useDefaultDimensions = false; m_h = height; updateAttributes(m_currentFramenumber); @@ -1182,7 +1275,7 @@ void ComponentShape::receiveHeight(int height){ update(); } -void ComponentShape::receiveWidth(int width){ +void ComponentShape::receiveWidth(int width) { m_useDefaultDimensions = false; m_w = width; updateAttributes(m_currentFramenumber); @@ -1237,7 +1330,7 @@ void ComponentShape::receiveShapeRotation(double angle, bool rotateEntity) this->pos(); - double toAngle = -angle - m_rotation ; + double toAngle = -angle - m_rotation; double oldAngle = -m_rotation; double toAngleNorm = constrainAngle(toAngle); @@ -1248,6 +1341,7 @@ void ComponentShape::receiveShapeRotation(double angle, bool rotateEntity) update(); } +//currently disabled void ComponentShape::receiveIgnoreZoom(bool toggle) { setFlag(QGraphicsItem::ItemIgnoresTransformations, toggle); @@ -1255,7 +1349,7 @@ void ComponentShape::receiveIgnoreZoom(bool toggle) update(); } -void ComponentShape::receiveTransparency(int alpha){ +void ComponentShape::receiveTransparency(int alpha) { m_transparency = alpha; m_brushColor.setAlpha(alpha); m_penColor.setAlpha(alpha); @@ -1272,60 +1366,3 @@ void ComponentShape::receiveTransparency(int alpha){ update(); } -//set members from core params -void ComponentShape::setMembers(CoreParameter* coreParams) -{ - //from coreParams - m_antialiasing = coreParams->m_antialiasingEntities; - - - m_tracingStyle = coreParams->m_tracingStyle; - m_tracingTimeDegradation = coreParams->m_tracingTimeDegradation; - m_tracingLength = coreParams->m_tracingHistory; - m_tracingSteps = coreParams->m_tracingSteps; - m_tracerProportions = coreParams->m_tracerProportions; - m_tracingOrientationLine = coreParams->m_tracerOrientationLine; - m_tracerFrameNumber = coreParams->m_tracerFrameNumber; - - m_orientationLine = coreParams->m_trackOrientationLine; - m_showId = coreParams->m_trackShowId; - - m_brushColor = *(coreParams->m_colorBrush); - m_penColor = *(coreParams->m_colorBorder); - - m_dragged = false; - setFlag(QGraphicsItem::ItemIgnoresTransformations, coreParams->m_ignoreZoom); - - // set dimensions and default dimensions - if (coreParams->m_trackWidth > 0) { - m_w = coreParams->m_trackWidth; - m_wDefault = coreParams->m_trackWidth; - } - if (coreParams->m_trackHeight > 0) { - m_h = coreParams->m_trackHeight; - m_hDefault = coreParams->m_trackHeight; - } - - //initialize helpers - m_rotationHandleLayer = new QGraphicsRectItem(this); - m_rotationHandleLayer->setPos(0,0); - m_rotationHandleLayer->setFlag(QGraphicsItem::ItemHasNoContents); - - m_rotationHandle = new RotationHandle(QPoint(m_w / 2, m_h / 2), m_rotationHandleLayer); - m_rotationHandle->setAntialiasing(m_antialiasing); - QObject::connect(m_rotationHandle, &RotationHandle::emitShapeRotation, this, &ComponentShape::receiveShapeRotation); - - if (m_pRotatable) { - m_rotationHandleLayer->setVisible(m_orientationLine); - m_rotationHandle->setVisible(m_orientationLine); - } - - update(); -} - -double ComponentShape::constrainAngle(double x){ - x = fmod(x,360); - if (x < 0) - x += 360; - return x; -} diff --git a/BioTracker/CoreApp/BioTracker/View/ComponentShape.h b/BioTracker/CoreApp/BioTracker/View/ComponentShape.h index 35aa385b..12490040 100644 --- a/BioTracker/CoreApp/BioTracker/View/ComponentShape.h +++ b/BioTracker/CoreApp/BioTracker/View/ComponentShape.h @@ -11,148 +11,212 @@ #include "QTime" #include "View/Utility/RotationHandle.h" + +/** +* This class inherits QGraphicsObject. +* It is a child of the TrackedComponentView and is generated by it for +* each trajectory in the tracking data. It visualizes the corresponding entity of the +* trajectory in the current frame of the medium. If there is no tracking data for that frame, +* this shape is hidden. It deletes itself when the trajectory is a nullpointer. +* It contains user interaction functionality to move, remove and rotate the +* corresponding entity or trajectory. +* The form/type is set when created (from entity: ellipse, point, rectangle, polygon) +* It can be changed by the user via the context menu +*/ class ComponentShape : public QGraphicsObject { Q_OBJECT - public: - //Constructor - ComponentShape(QGraphicsObject* parent = 0, IModelTrackedTrajectory* trajectory = 0, int id = -1); - ~ComponentShape(); - - QRectF boundingRect() const override; - void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; - QPainterPath shape() const override; - bool advance(); - - bool updateAttributes(uint framenumber); - IModelTrackedTrajectory* getTrajectory(); - void setPermission(std::pair permission); - int getId(); - bool isSwappable(); - bool isRemovable(); - bool isRotatable(); - QPoint getOldPos(); - void trace(); - void setMembers(CoreParameter* coreParams); - - //public member - int m_currentFramenumber; - //to fix a bug when moving; TODO better - int m_w; - int m_h; - - QGraphicsRectItem* m_tracingLayer; - - - signals: - void emitRemoveTrajectory(IModelTrackedTrajectory* trajectory); - void emitRemoveTrackEntity(IModelTrackedTrajectory* trajectory, uint frameNumber); - void emitMoveElement(IModelTrackedTrajectory* trajectory, QPoint oldPos, QPoint newPos, uint frameNumber, int sizeOfStackToMove); - void emitToggleFixTrack(IModelTrackedTrajectory* trajectory, bool toggle); - void emitEntityRotation(IModelTrackedTrajectory* trajectory, double oldAngleDeg, double newAngleDeg, uint frameNumber); - void emitGoToFrame(int frame); - void broadcastMove(); +public: + //Constructor + ComponentShape(QGraphicsObject* parent = 0, IModelTrackedTrajectory* trajectory = 0, int id = -1); + ~ComponentShape(); + + //QGraphicsItem interface + QRectF boundingRect() const override; + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; + QPainterPath shape() const override; + bool advance(); + //////////////////////////////// + + + /** + * called by view when tracking data was modified + * updates this with data from new current entity + * --> rotation, position, etc.... + */ + bool updateAttributes(uint framenumber); + + /// returns the corresponding traj + IModelTrackedTrajectory* getTrajectory(); + + /// set permission to enable/disable certain user interactions + void setPermission(std::pair permission); + + /// returns ID of corresponding trajectory + int getId(); + + /// returns swappable permission + bool isSwappable(); + /// returns removeable permission + bool isRemovable(); + /// returns rotatable permission + bool isRotatable(); + + /// helper function + QPoint getOldPos(); + + /// attemps to draw tracers, if _tracingStyle is set tracers are drawn + void trace(); + + /// called in constructor to setup the members with default vlaues from coreparameter component + void setMembers(CoreParameter* coreParams); + + //public members + int m_currentFramenumber; /**< current visualized framenumber --> entity */ + //to fix a bug when moving; TODO better + int m_w; /**< width of this; if polygon width of bounding rect of polygon */ + int m_h; /**< height of this; if polygon height of bounding rect of polygon */ + + QGraphicsRectItem* m_tracingLayer; /**< the layer with all tracers; is counter-rotated if component shape is rotated */ + + +signals: + + /* + * These are the signals sent to the command component. + * They are all modifiying the trakcing data. + * They contain all the data to reverse them (in the commands component). + */ + void emitRemoveTrajectory(IModelTrackedTrajectory* trajectory); + void emitRemoveTrackEntity(IModelTrackedTrajectory* trajectory, uint frameNumber); + void emitMoveElement(IModelTrackedTrajectory* trajectory, QPoint oldPos, QPoint newPos, uint frameNumber, int sizeOfStackToMove); + void emitToggleFixTrack(IModelTrackedTrajectory* trajectory, bool toggle); + void emitEntityRotation(IModelTrackedTrajectory* trajectory, double oldAngleDeg, double newAngleDeg, uint frameNumber); + ///////////////////////////////////////////// + + void emitGoToFrame(int frame); + /// each user movement gets broadcasted to other shapes + void broadcastMove(); public Q_SLOTS: - //context menu actions - void changeBrushColor(); - void changePenColor(); - void changeBrushColor(QColor color); - void changePenColor(QColor color); - bool removeTrack(); - bool removeTrackEntity(); - void markShape(int penwidth = 0); - void unmarkShape(); - void toggleFixTrack(); - void createInfoWindow(); - void setObjectNameContext(QString name); - void morphIntoRect(); - void morphIntoEllipse(); - void morphIntoPoint(); - void morphIntoPolygon(); - - - - //Tracing - void receiveTracingLength(int tracingLength); - void receiveTracingStyle(QString style); - void receiveTracingSteps(int steps); - void receiveTracingTimeDegradation(QString timeDegradation); - void receiveTracerProportions(float proportion); - void receiveTracerOrientationLine(bool toggle); - void receiveTracerFrameNumber(bool toggle); - //Visual - void receiveAntialiasing(bool toggle); - void receiveTransparency(int alpha); - //Dimensions - void receiveDimensions(int width, int height); - void receiveHeight(int height); - void receiveWidth(int width); - void setDimensionsToDefault(); - void receiveToggleOrientationLine(bool toggle); - void receiveShowId(bool toggle); - void receiveShapeRotation(double angle, bool rotateEntity); - //Ignore zoom - void receiveIgnoreZoom(bool toggle); - - - protected: - QVariant itemChange(GraphicsItemChange change, const QVariant &value) override; - - void mousePressEvent(QGraphicsSceneMouseEvent *event) override; - void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override; - void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; - void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override; - - double constrainAngle(double x); - - private: - - //Member - QGraphicsObject *m_parent; - //permissions - std::map m_permissions; - bool m_pMovable; - bool m_pRemovable; - bool m_pSwappable; - bool m_pRotatable; - // - bool m_fixed; - bool m_antialiasing; - IModelTrackedTrajectory* m_trajectory; - QList m_polygons; - int m_id; - int m_z; - int m_wDefault = 20; - int m_hDefault = 20; - bool m_useDefaultDimensions; - float m_rotation; - QColor m_penColor; - QColor m_penColorLast; - QColor m_brushColor; - int m_transparency; - bool m_marked; - int m_penWidth; - Qt::PenStyle m_penStyle; - Qt::PenStyle m_penStylePrev; - bool m_dragged; - QTime m_mousePressTime; - QPoint m_mousePressPos; - QString m_tracingStyle; - int m_tracingLength; - int m_tracingSteps; - QString m_tracingTimeDegradation; - float m_tracerProportions; - bool m_tracingOrientationLine; - bool m_tracerFrameNumber; - QLineF m_rotationLine; - RotationHandle* m_rotationHandle; - QGraphicsRectItem* m_rotationHandleLayer; - bool m_orientationLine; - bool m_showId; - bool m_trajectoryWasActiveOnce; - QPoint m_oldPos; + //context menu actions + //(actions only give trigger signals and therefore can only connect to parameterless slots) + void changeBrushColor(); + void changePenColor(); + void changeBrushColor(QColor color); + void changePenColor(QColor color); + bool removeTrack(); + bool removeTrackEntity(); + void markShape(int penwidth = 0); + void unmarkShape(); + void toggleFixTrack(); + void createInfoWindow(); + void setObjectNameContext(QString name); + void morphIntoRect(); + void morphIntoEllipse(); + void morphIntoPoint(); + void morphIntoPolygon(); + ////////////////////////////////////////////// + + + //Tracing + void receiveTracingLength(int tracingLength); + void receiveTracingStyle(QString style); + void receiveTracingSteps(int steps); + void receiveTracingTimeDegradation(QString timeDegradation); + void receiveTracerProportions(float proportion); + void receiveTracerOrientationLine(bool toggle); + void receiveTracerFrameNumber(bool toggle); + //Visual + void receiveAntialiasing(bool toggle); + void receiveTransparency(int alpha); + //Dimensions + void receiveDimensions(int width, int height); + void receiveHeight(int height); + void receiveWidth(int width); + void setDimensionsToDefault(); + void receiveToggleOrientationLine(bool toggle); + void receiveShowId(bool toggle); + void receiveShapeRotation(double angle, bool rotateEntity); + //Ignore zoom (disabled) + void receiveIgnoreZoom(bool toggle); + + +protected: + //QGraphicsItem interface + QVariant itemChange(GraphicsItemChange change, const QVariant &value) override; + void mousePressEvent(QGraphicsSceneMouseEvent *event) override; + void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override; + void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; + void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override; + //////////////////////////////// + + //constrains angles under 0 or over 360 degrees to [0, 360] + double constrainAngle(double x); + +private: + + /* + * MEMBERS + */ + + QGraphicsObject *m_parent; + + //permissions + std::map m_permissions; /**< list of permissions */ + bool m_pMovable; /**< permission to move the component shape */ + bool m_pRemovable; /**< permission to remove the component shape */ + bool m_pSwappable; /**< permission to move the component shape */ + bool m_pRotatable; /**< permission to move the component shape */ + + //dimensions + + //int m_z; + int m_wDefault = 20; /**< default width, will be set by entity */ + int m_hDefault = 20; /**< default height, will be set by entity */ + bool m_useDefaultDimensions; /**< true, if dimensions were changed by user, they will stay */ + + // appearance + QColor m_penColor; /**< border color */ + QColor m_penColorLast; /**< last border color */ + QColor m_brushColor; /**< fill color */ + int m_transparency; /**< transparency of this */ + bool m_marked; /**< if marked, border is thick */ + int m_penWidth; /**< border_thickness */ + Qt::PenStyle m_penStyle; /**< style of border */ + Qt::PenStyle m_penStylePrev; /**< last stlye of border */ + bool m_antialiasing; /**< if true, antialiasing in enabled */ + + // tracing + QString m_tracingStyle; /**< tracing style (none, path, arrow, shape) */ + int m_tracingLength; /**< sets how many tracers are drawn (history) */ + int m_tracingSteps; /**< sets each x'th tracer is drawn */ + QString m_tracingTimeDegradation; /**< sets tracer color style (default, transparency, false color) */ + float m_tracerProportions; /**< set the tracers proportion relative to component shape */ + bool m_tracingOrientationLine; /**< toggles if orientation line is shwon for tracers */ + bool m_tracerFrameNumber; /**< toggles if tracer's framenumber is shown (very slow) */ + + // rotation + float m_rotation; /**< the current rotation of the compontent shape and entity */ + QLineF m_rotationLine; /**< the orientation line */ + RotationHandle* m_rotationHandle; /**< the handle with wich the user can change the rotation */ + QGraphicsRectItem* m_rotationHandleLayer;/**< help layer for rotation handle */ + bool m_orientationLine; /**< toggles if _rotationLine is shown */ + + // misc + int m_id; /**< the traj's ID */ + bool m_showId; /**< toggles if id is shown in center */ + IModelTrackedTrajectory* m_trajectory; /**< the corresponding traj */ + QList m_polygons; /**< list of polygons to draw (if entity inherited from polygon) */ + bool m_fixed; /**< if fixed, border is dotted and tracker cannot change traj data */ + //bool m_trajectoryWasActiveOnce; /**< unused */ + QPoint m_oldPos; /**< position before moving by hand */ + + // dragging + bool m_dragged; /**< true if currently dragged */ + QTime m_mousePressTime; /**< helper for dragging */ + QPoint m_mousePressPos; /**< helper for dragging */ }; diff --git a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.h b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.h index 646612e0..b34d7473 100644 --- a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.h +++ b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.h @@ -11,6 +11,12 @@ namespace Ui { class CoreParameterView; } +/** +* This class contains the 'Experiment' tab and the 'Visualisation options' tab in the GUI +* It basically displays the current set parameters +* The +*/ + class CoreParameterView : public IViewWidget { Q_OBJECT @@ -22,16 +28,16 @@ class CoreParameterView : public IViewWidget QWidget* getTrackerHook(); void setPermission(std::pair permission); - // Triggers re-sending essential signals - void triggerUpdate(); + // Triggers re-sending essential signals + void triggerUpdate(); - void areaDescriptorTypeChanged(QString type); + void areaDescriptorTypeChanged(QString type); private slots: -/* - VIEW TAB -*/ + /* + VIEW TAB + */ //Enable view void on_checkBoxEnableCoreView_stateChanged(int v); //Tracing @@ -55,7 +61,7 @@ class CoreParameterView : public IViewWidget void on_pushButtonColorChangeBorderSelected_clicked(); void on_pushButtonColorChangeBrush_clicked(); void on_pushButtonColorchangeBrushSelected_clicked(); - + //Track dimensions void on_checkBoxTrackOrientationLine_stateChanged(int v); void on_checkBoxShowId_stateChanged(int v); @@ -76,7 +82,7 @@ class CoreParameterView : public IViewWidget void on_pushButtonAnnoColor_clicked(); //Finalize experiment - //void on_pushButtonFinalizeExperiment_clicked(); + //void on_pushButtonFinalizeExperiment_clicked(); //Misc //void on_checkBoxExpertOptions_stateChanged(int v); @@ -84,102 +90,106 @@ class CoreParameterView : public IViewWidget void on_checkBoxAntialiasingEntities_toggled(bool toggle); void on_checkBoxAntialiasingFull_toggled(bool toggle); -/* -EXPERIMENT TAB -*/ - - //label_ExpTrialNo - //label_ExpSrcCnt - //label_ExpObjCnt - //pushButton_startExp - //pushButton_finalizeExp - void on_pushButton_startExp_clicked(); - void on_pushButton_finalizeExp_clicked(); - void on_label_ExpSrcCnt_clicked(); + /* + EXPERIMENT TAB + */ + + //label_ExpTrialNo + //label_ExpSrcCnt + //label_ExpObjCnt + //pushButton_startExp + //pushButton_finalizeExp + void on_pushButton_startExp_clicked(); + void on_pushButton_finalizeExp_clicked(); + void on_label_ExpSrcCnt_clicked(); void on_trialHelpButton_clicked(); void on_pushButton_saveData_clicked(); void on_pushButton_resetData_clicked(); void on_pushButton_addTraj_clicked(); -public slots: - void rcvPlayerParameters(playerParameters* parameters); + public slots: + void rcvPlayerParameters(playerParameters* parameters); public: signals : - /* - EXPERIMENT TAB - */ - void emitEnableTracking(); - void emitDisableTracking(); - void emitActivateTrackingSwitch(); - void emitDeactivateTrackingSwitch(); - void emitStartPlayback(); - void emitStopPlayback(); - void emitPausePlayback(); - void emitTrialStarted(bool started); - void emitSaveDataToFile(); - - - //Enable view - void emitViewSwitch(bool lever); - //Select all tracks - //void emitSelectAll(); - //Add tracks - void emitAddTrack(); - //Ignore zoom - void emitIgnoreZoom(bool toggle); - //Track color - void emitColorChangeBorderAll(); - void emitColorChangeBorderSelected(); - void emitColorChangeBrushAll(); - void emitColorChangeBrushSelected(); - //Track dimensions - void emitTrackOrientationLine(bool toggle); - void emitTrackShowId(bool toggle); - void emitTrackDimensionsAll(int width, int height); - void emitTrackDimensionsSelected(int width, int height); - void emitTrackDimensionsSetDefault(); - //Tracing - void emitTracingHistoryLength(int history); - void emitTracingStyle(QString style); - void emitTracingSteps(int steps); - void emitTracingTimeDegradation(QString degradation); - void emitTracerFrameNumber(bool toggle); - //Tracing dimensions - void emitTracerProportions(float proportion); - void emitTracerOrientationLine(bool toggle); - - //Area descriptor - void emitRectDimensions(double w, double h); - void emitDisplayTrackingArea(bool b); - void emitDisplayRectification(bool b); - void emitTrackingAreaAsEllipse(bool b); - - //Annotations - void emitSetAnnoColor(QColor color); - - //Finalize Experiment - void emitFinalizeExperiment(); - - //Misc - void emitToggleAntialiasingEntities(bool toggle); - void emitToggleAntialiasingFull(bool toggle); + /* + EXPERIMENT TAB + */ + void emitEnableTracking(); + void emitDisableTracking(); + void emitActivateTrackingSwitch(); + void emitDeactivateTrackingSwitch(); + void emitStartPlayback(); + void emitStopPlayback(); + void emitPausePlayback(); + void emitTrialStarted(bool started); + void emitSaveDataToFile(); + + + //Enable view + void emitViewSwitch(bool lever); + //Select all tracks + //void emitSelectAll(); + //Add tracks + void emitAddTrack(); + //Ignore zoom + void emitIgnoreZoom(bool toggle); + //Track color + void emitColorChangeBorderAll(); + void emitColorChangeBorderSelected(); + void emitColorChangeBrushAll(); + void emitColorChangeBrushSelected(); + //Track dimensions + void emitTrackOrientationLine(bool toggle); + void emitTrackShowId(bool toggle); + void emitTrackDimensionsAll(int width, int height); + void emitTrackDimensionsSelected(int width, int height); + void emitTrackDimensionsSetDefault(); + //Tracing + void emitTracingHistoryLength(int history); + void emitTracingStyle(QString style); + void emitTracingSteps(int steps); + void emitTracingTimeDegradation(QString degradation); + void emitTracerFrameNumber(bool toggle); + //Tracing dimensions + void emitTracerProportions(float proportion); + void emitTracerOrientationLine(bool toggle); + + //Area descriptor + void emitRectDimensions(double w, double h); + void emitDisplayTrackingArea(bool b); + void emitDisplayRectification(bool b); + void emitTrackingAreaAsEllipse(bool b); + + //Annotations + void emitSetAnnoColor(QColor color); + + //Finalize Experiment + void emitFinalizeExperiment(); + + //Misc + void emitToggleAntialiasingEntities(bool toggle); + void emitToggleAntialiasingFull(bool toggle); private: - Ui::CoreParameterView *ui; + Ui::CoreParameterView *ui; /**< processed ui file */ - bool m_viewSwitch; - SwitchButton* _expertSwitch; - bool _trialActive = false; - bool _trialStarted = false; - QString _currentFile = "No Media"; + bool m_viewSwitch; /**< switch to enable/disable visualization options tab */ + SwitchButton* _expertSwitch; /**< switch to expand visualization options tab */ + bool _trialActive = false; /**< currently trial active? */ + bool _trialStarted = false; /**< was trial started? */ + QString _currentFile = "No Media"; /**< show media name in experiment tab */ // IViewWidget interface public slots: void getNotified(); + + /// fills the ui elements with the current default parameters void fillUI(); + + /// styles the "visualisation options" tab void setStyle(); void resetTrial(); diff --git a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui index f262496c..70f6c8e1 100644 --- a/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui +++ b/BioTracker/CoreApp/BioTracker/View/CoreParameterView.ui @@ -155,7 +155,7 @@ 0 - -263 + 0 333 938 @@ -201,7 +201,7 @@ - Enable core visualization + Enable core visualization of tracking data true diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp index 9e629976..d2c17391 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.cpp @@ -2,54 +2,47 @@ #include "ui_MainWindow.h" #include "util/types.h" +#include "util/singleton.h" +#include "settings/Settings.h" #include "Controller/ControllerMainWindow.h" #include "View/CoreParameterView.h" #include "VideoControllWidget.h" -#include "qfiledialog.h" -#include "QLayout" - #include "View/GraphicsView.h" #include "View/AnnotationsView.h" #include "Model/null_Model.h" #include "Controller/null_Controller.h" + +#include "qfiledialog.h" +#include "QLayout" #include "QGraphicsObject" #include #include #include #include - - #include "qtextedit.h" #include - #include "qdesktopwidget.h" - #include "QToolButton" #include "QWizard" #include "QWizardPage" - #include "QDesktopServices" -#include "util/singleton.h" -#include "settings/Settings.h" - - MainWindow::MainWindow(QWidget* parent, IController* controller, IModel* model) : - IViewMainWindow(parent, controller, model), - ui(new Ui::MainWindow) { - _previouslySelectedTracker = ""; + IViewMainWindow(parent, controller, model), + ui(new Ui::MainWindow) { + _previouslySelectedTracker = ""; _currentParameterView = 0; _currentCoreParameterView = 0; _currentElementView = 0; - ui->setupUi(this); + ui->setupUi(this); //add cursor position label QLabel* _cursorPosition = new QLabel("0,0"); _cursorPosition->setObjectName("_cursorPosition"); - statusBar()->insertPermanentWidget(0,_cursorPosition); + statusBar()->insertPermanentWidget(0, _cursorPosition); //TODO ui->actionToggle_compact_menu_toolbar_2->setEnabled(false); @@ -60,7 +53,7 @@ MainWindow::MainWindow(QWidget* parent, IController* controller, IModel* model) ui->toolBarTools->setEnabled(false); ui->toolBox->setStyleSheet("QToolBox::tab {" - " background-color: #e5e5e5;}" + " background-color: #e5e5e5;}" ); //resize to full size @@ -71,41 +64,26 @@ MainWindow::MainWindow(QWidget* parent, IController* controller, IModel* model) //set window icon QApplication::setWindowIcon(QIcon(":/Logo/resources/logo/BT-3_non_transparent_rounded.ico")); - //view actions - //QAction* dockWidgetHider = ui->dockWidgetAlgorithm->toggleViewAction(); - //dockWidgetHider->setText(ui->dockWidgetAlgorithm->isVisible()?"Hide right panel":"Show right panel"); - //ui->menuView->addAction(dockWidgetHider); } MainWindow::~MainWindow() { - delete ui; + delete ui; } +//******************************************SETUP******************************************* + void MainWindow::setupUpperToolBar() { _trackerActivator = new SwitchButton("not tracking", "tracking"); _trackerActivator->setToolTip("Activate/Disable tracking"); - QObject::connect(_trackerActivator , &SwitchButton::emitSetEnabled, this, &MainWindow::receiveSetTracking, Qt::DirectConnection); + QObject::connect(_trackerActivator, &SwitchButton::emitSetEnabled, this, &MainWindow::receiveSetTracking, Qt::DirectConnection); //QAction* activatorAction = ui->toolBarMenu->addWidget(_trackerActivator); - // ui->toolBarMenu->setStyleSheet("QGroupBox" - // " {border: 1px solid #e5e5e5;border-radius: 5px; spacing: 1px; padding: 3px; margin-top: 1ex; /* leave space at the top for the title */}" - // "QGroupBox::title {subcontrol-origin: margin;subcontrol-position: top center; padding: 0 3px;}" - // "QToolButton {padding: 5px; margin: 0px}" - // ); - - //infomativeCanvas - QWidget* informativeCanvas = new QWidget; - QHBoxLayout* informativeCanvasLayout = new QHBoxLayout; - informativeCanvasLayout->setContentsMargins(0,0,0,0); - informativeCanvasLayout->setSpacing(0); - - /////////////////////media groupbox _mediaBox = new QGroupBox("Load media"); //style groupbox (initial red border -> no video loaded) - _mediaBox->setStyleSheet("QGroupBox" - " {border: 1px solid #e56262;}"); + _mediaBox->setStyleSheet("QGroupBox" + " {border: 1px solid #e56262;}"); // "QGroupBox::title {subcontrol-origin: margin;subcontrol-position: top center; padding: 0 3px;}"); QFont font = QFont(); font.setPointSize(8); @@ -113,20 +91,20 @@ void MainWindow::setupUpperToolBar() { _mediaBox->setFont(font); QHBoxLayout* mediaBoxLayout = new QHBoxLayout; - mediaBoxLayout->setContentsMargins(0,0,0,0); + mediaBoxLayout->setContentsMargins(0, 0, 0, 0); //mediaBoxLayout->setSpacing(0); QToolButton* cameraButton = new QToolButton; - cameraButton->setIconSize(QSize(24,24)); + cameraButton->setIconSize(QSize(24, 24)); cameraButton->setDefaultAction(ui->actionOpen_Camera); cameraButton->setAutoRaise(true); QToolButton* videoButton = new QToolButton; - videoButton->setIconSize(QSize(24,24)); + videoButton->setIconSize(QSize(24, 24)); videoButton->setDefaultAction(ui->actionOpen_Video); videoButton->setAutoRaise(true); QToolButton* imageButton = new QToolButton; - imageButton->setIconSize(QSize(24,24)); + imageButton->setIconSize(QSize(24, 24)); imageButton->setDefaultAction(ui->actionOpen_Picture); imageButton->setAutoRaise(true); @@ -136,15 +114,14 @@ void MainWindow::setupUpperToolBar() { _mediaBox->setLayout(mediaBoxLayout); - informativeCanvasLayout->addWidget(_mediaBox); - //ui->toolBarMenu->addWidget(mediaBox); + ui->toolBarMenu->addWidget(_mediaBox); ////////trackerbox _trackerBox = new QGroupBox("Load tracker"); //style groupbox _trackerBox->setStyleSheet("QGroupBox" - " {border: 1px solid #e56262;}"); + " {border: 1px solid #e56262;}"); // "QGroupBox::title {subcontrol-origin: margin;subcontrol-position: top center; padding: 0 3px;}"); QFont font0 = QFont(); @@ -153,18 +130,17 @@ void MainWindow::setupUpperToolBar() { _trackerBox->setFont(font0); QHBoxLayout* trackerBoxLayout = new QHBoxLayout; - trackerBoxLayout->setContentsMargins(0,0,0,0); + trackerBoxLayout->setContentsMargins(0, 0, 0, 0); QToolButton* trackerButton = new QToolButton; - trackerButton->setIconSize(QSize(24,24)); + trackerButton->setIconSize(QSize(24, 24)); trackerButton->setDefaultAction(ui->actionLoad_Tracker); trackerButton->setAutoRaise(true); trackerBoxLayout->addWidget(trackerButton); _trackerBox->setLayout(trackerBoxLayout); - informativeCanvasLayout->addWidget(_trackerBox); - //ui->toolBarMenu->addWidget(trackerBox); + ui->toolBarMenu->addWidget(_trackerBox); ////////loadSaveBox @@ -180,15 +156,15 @@ void MainWindow::setupUpperToolBar() { loadSaveBox->setFont(font2); QHBoxLayout* loadSaveBoxLayout = new QHBoxLayout; - loadSaveBoxLayout->setContentsMargins(5,0,5,0); + loadSaveBoxLayout->setContentsMargins(5, 0, 5, 0); QToolButton* loadFileButton = new QToolButton; - loadFileButton->setIconSize(QSize(24,24)); + loadFileButton->setIconSize(QSize(24, 24)); loadFileButton->setDefaultAction(ui->actionLoad_trackingdata); loadFileButton->setAutoRaise(true); - + QToolButton* saveFileButton = new QToolButton; - saveFileButton->setIconSize(QSize(24,24)); + saveFileButton->setIconSize(QSize(24, 24)); saveFileButton->setDefaultAction(ui->actionSave_trackingdata); saveFileButton->setAutoRaise(true); @@ -196,8 +172,7 @@ void MainWindow::setupUpperToolBar() { loadSaveBoxLayout->addWidget(saveFileButton); loadSaveBox->setLayout(loadSaveBoxLayout); - informativeCanvasLayout->addWidget(loadSaveBox); - //ui->toolBarMenu->addWidget(loadSaveBox); + ui->toolBarMenu->addWidget(loadSaveBox); //////////////////choose tracker groupbox QGroupBox* chooseTrackerBox = new QGroupBox("Choose tracker"); @@ -217,335 +192,29 @@ void MainWindow::setupUpperToolBar() { chooseTrackerBox->setLayout(chooseTrackerBoxLayout); - informativeCanvasLayout->addWidget(chooseTrackerBox); - //ui->toolBarMenu->addWidget(chooseTrackerBox); + ui->toolBarMenu->addWidget(chooseTrackerBox); - //add finalize experment button - //QPushButton* finalizeExperimentButton = new QPushButton("Finalize Trial"); - //finalizeExperimentButton->setStyleSheet("padding: 10px;"); - //ControllerMainWindow* ctr = static_cast(getController()); - //QObject::connect(finalizeExperimentButton, &QPushButton::clicked, ctr, &ControllerMainWindow::emitFinalizeExperiment, Qt::DirectConnection); - //informativeCanvasLayout->addWidget(finalizeExperimentButton); - - //add canvas widget to toolbar - informativeCanvas->setLayout(informativeCanvasLayout); - //informativeCanvas->hide(); - informativeCanvas->setEnabled(true); - QAction* action = ui->toolBarMenu->addWidget(informativeCanvas); - //action->setVisible(false); - } -void MainWindow::checkTrackerGroupBox(){ +void MainWindow::checkTrackerGroupBox() { _trackerBox->setStyleSheet("QGroupBox" - " {border: 1px solid #82c985;}"); -} -void MainWindow::checkMediaGroupBox(){ - _mediaBox->setStyleSheet("QGroupBox" - " {border: 1px solid #82c985;}"); + " {border: 1px solid #82c985;}"); } -void MainWindow::setupVideoToolBar(){ - +void MainWindow::checkMediaGroupBox() { + _mediaBox->setStyleSheet("QGroupBox" + " {border: 1px solid #82c985;}"); } -//TODO put this in a class -void MainWindow::createIntroductionWizard(){ - m_introWiz = new QWizard; - - //BioTracker::Core::Settings *disableIntroWiz = GET_CORESETTINGS(CORE_CONFIGURATION); - BioTracker::Core::Settings *set = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); - bool disabled = set->getValueOrDefault("BiotrackerCore/Disable_Wizard", false); - - //dont show again checkbox - QCheckBox* noShowCheck = new QCheckBox("Don't show this again"); - noShowCheck->setChecked(disabled); - QObject::connect(noShowCheck, &QCheckBox::toggled, this, &MainWindow::toggleNoShowWiz); - - - //introduction - QWizardPage* p1 = new QWizardPage; - { - p1->setTitle("BioTracker 3 - Introduction"); - - QPixmap logoImg(":/Logo/resources/logo/BT3-big.png"); - QPixmap scaledImg = logoImg.scaled(QSize(600,400),Qt::KeepAspectRatio, Qt::SmoothTransformation); - - QLabel* imgLabel = new QLabel; - imgLabel->setPixmap(scaledImg); - imgLabel->setAttribute(Qt::WA_TranslucentBackground); - imgLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - imgLabel->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); - - QFile file(":/Introduction/resources/introduction/intro.txt"); - QLabel *introLabel= new QLabel; - introLabel->setWordWrap(true); - - //read introduction text from file - QString line; - if (file.open(QIODevice::ReadOnly | QIODevice::Text)){ - QTextStream stream(&file); - while (!stream.atEnd()){ - line.append(stream.readLine()+"\n"); - } - introLabel->setText(line); - } - file.close(); - - QVBoxLayout *layout = new QVBoxLayout; - layout->addWidget(imgLabel); - QScrollArea* textScroll = new QScrollArea; - textScroll->setFrameShape(QFrame::NoFrame); - textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - textScroll->setWidget(introLabel); - textScroll->setWidgetResizable(true); - layout->addWidget(textScroll); - layout->setAlignment(Qt::AlignHCenter); - p1->setLayout(layout); - - } - - //overview - QWizardPage* p2 = new QWizardPage; - { - p2->setTitle("BioTracker 3 - Overview"); - QLabel *label = new QLabel("This is the BioTracker. Don't let yourself be overwhelmed as it is actually pretty simple."); - label->setWordWrap(true); - - QPixmap overviewImg(":/Introduction/resources/introduction/images/BioTracker.PNG"); - QPixmap scaledImg = overviewImg.scaled(QSize(600,400),Qt::KeepAspectRatio, Qt::SmoothTransformation); - - QLabel* imgLabel = new QLabel; - imgLabel->setPixmap(scaledImg); - imgLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - //imgLabel->setScaledContents(true); - - QVBoxLayout *layout = new QVBoxLayout; - layout->addWidget(imgLabel); - QScrollArea* textScroll = new QScrollArea; - textScroll->setFrameShape(QFrame::NoFrame); - textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - textScroll->setWidget(label); - textScroll->setWidgetResizable(true); - layout->addWidget(textScroll); - layout->setAlignment(Qt::AlignHCenter); - p2->setLayout(layout); - } - - //toolbars - QWizardPage* p3 = new QWizardPage; - { - p3->setTitle("BioTracker 3 - Toolbars"); - - //image - QPixmap overviewImg(":/Introduction/resources/introduction/images/toolbars.png"); - QPixmap scaledImg = overviewImg.scaled(QSize(600,400),Qt::KeepAspectRatio, Qt::SmoothTransformation); - QLabel* imgLabel = new QLabel; - - imgLabel->setPixmap(scaledImg); - - //read toolbar text from file - QFile file(":/Introduction/resources/introduction/toolbars.txt"); - QLabel *label = new QLabel(); - label->setWordWrap(true); - - QString line; - if (file.open(QIODevice::ReadOnly | QIODevice::Text)){ - QTextStream stream(&file); - while (!stream.atEnd()){ - line.append(stream.readLine()+"\n"); - } - label->setText(line); - } - file.close(); - - - QVBoxLayout *layout = new QVBoxLayout; - layout->addWidget(imgLabel); - QScrollArea* textScroll = new QScrollArea; - textScroll->setFrameShape(QFrame::NoFrame); - textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - textScroll->setWidget(label); - textScroll->setWidgetResizable(true); - layout->addWidget(textScroll); - layout->setAlignment(Qt::AlignHCenter); - p3->setLayout(layout); - } - +void MainWindow::setupVideoToolBar() { - //right panel - overview - QWizardPage* p4 = new QWizardPage; - { - p4->setTitle("BioTracker 3 - Right panel overview"); - - //image - QPixmap overviewImg(":/Introduction/resources/introduction/images/right_panel.png"); - QPixmap scaledImg = overviewImg.scaled(QSize(600,400),Qt::KeepAspectRatio, Qt::SmoothTransformation); - QLabel* imgLabel = new QLabel; - imgLabel->setPixmap(scaledImg); - - //read right panel text from file - QFile file(":/Introduction/resources/introduction/right_panel.txt"); - QLabel *label = new QLabel(); - label->setWordWrap(true); - - QString line; - if (file.open(QIODevice::ReadOnly | QIODevice::Text)){ - QTextStream stream(&file); - while (!stream.atEnd()){ - line.append(stream.readLine()+"\n"); - } - label->setText(line); - } - file.close(); - - - QVBoxLayout *layout = new QVBoxLayout; - layout->addWidget(imgLabel); - QScrollArea* textScroll = new QScrollArea; - textScroll->setFrameShape(QFrame::NoFrame); - textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - textScroll->setWidget(label); - textScroll->setWidgetResizable(true); - layout->addWidget(textScroll); - layout->setAlignment(Qt::AlignHCenter); - - p4->setLayout(layout); - } - - - //how to track - QWizardPage* p5 = new QWizardPage; - { - p5->setTitle("BioTracker 3 - Tracking"); - - //image - QPixmap overviewImg(":/Introduction/resources/introduction/images/tracking.png"); - QPixmap scaledImg = overviewImg.scaled(QSize(600,400),Qt::KeepAspectRatio, Qt::SmoothTransformation); - QLabel* imgLabel = new QLabel; - imgLabel->setPixmap(scaledImg); - - //read tracking text from file - QFile file(":/Introduction/resources/introduction/tracking.txt"); - QLabel *label = new QLabel(); - label->setWordWrap(true); - - QString line; - if (file.open(QIODevice::ReadOnly | QIODevice::Text)){ - QTextStream stream(&file); - while (!stream.atEnd()){ - line.append(stream.readLine()+"\n"); - } - label->setText(line); - } - file.close(); - - - QVBoxLayout *layout = new QVBoxLayout; - layout->addWidget(imgLabel); - QScrollArea* textScroll = new QScrollArea; - textScroll->setFrameShape(QFrame::NoFrame); - textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - textScroll->setWidget(label); - textScroll->setWidgetResizable(true); - layout->addWidget(textScroll); - layout->setAlignment(Qt::AlignHCenter); - - p5->setLayout(layout); - } - - //context menus - QWizardPage* p6 = new QWizardPage; - { - p6->setTitle("BioTracker 3 - Context menus"); - - //images - QPixmap contextEntityImg(":/Introduction/resources/introduction/images/context_entity.png"); - QPixmap scaledImg1 = contextEntityImg.scaled(QSize(300,400),Qt::KeepAspectRatio, Qt::SmoothTransformation); - QLabel* imgEntityLabel = new QLabel; - imgEntityLabel->setPixmap(scaledImg1); - - QPixmap contextVideoImg(":/Introduction/resources/introduction/images/context_video.png"); - QPixmap scaledImg2 = contextVideoImg.scaled(QSize(300,400),Qt::KeepAspectRatio, Qt::SmoothTransformation); - QLabel* imgVideoLabel = new QLabel; - imgVideoLabel->setPixmap(scaledImg2); - - //read tracking text from file - QFile file(":/Introduction/resources/introduction/context_menus.txt"); - QLabel *label = new QLabel(); - label->setWordWrap(true); - - QString line; - if (file.open(QIODevice::ReadOnly | QIODevice::Text)){ - QTextStream stream(&file); - while (!stream.atEnd()){ - line.append(stream.readLine()+"\n"); - } - label->setText(line); - } - file.close(); - - - QVBoxLayout *outerLayout = new QVBoxLayout; - QHBoxLayout *imgLayout = new QHBoxLayout; - imgLayout->addWidget(imgEntityLabel); - imgLayout->addWidget(imgVideoLabel); - QFrame* imgFrame = new QFrame; - imgFrame->setFrameStyle(QFrame::Panel | QFrame::Sunken); - imgFrame->setLayout(imgLayout); - - outerLayout->addWidget(imgFrame); - QScrollArea* textScroll = new QScrollArea; - textScroll->setFrameShape(QFrame::NoFrame); - textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - textScroll->setWidget(label); - textScroll->setWidgetResizable(true); - outerLayout->addWidget(textScroll); - outerLayout->addWidget(noShowCheck); - - outerLayout->setAlignment(Qt::AlignHCenter); - - p6->setLayout(outerLayout); - } - - - m_introWiz->addPage(p1); - m_introWiz->addPage(p2); - m_introWiz->addPage(p3); - m_introWiz->addPage(p4); - m_introWiz->addPage(p5); - m_introWiz->addPage(p6); - //m_introWiz->addPage(p7); - - - m_introWiz->setWindowTitle("Introduction"); - if(!disabled){ - QRect rec = QApplication::desktop()->availableGeometry(); - //m_introWiz->resize(m_introWiz->width(), rec.height()); - m_introWiz->show(); - //m_introWiz->showMaximized(); - } } -void MainWindow::setCorePermission(std::pair permission){ - if (permission.first == ENUMS::COREPERMISSIONS::COMPONENTADD) { - ui->actionAdd_Track->setEnabled(permission.second); - return; - } - if (permission.first == ENUMS::COREPERMISSIONS::COMPONENTREMOVE) { - ui->actionDelete_selected_tracks->setEnabled(permission.second); - return; - } - if (permission.first == ENUMS::COREPERMISSIONS::COMPONENTSWAP){ - ui->actionSwap_ID_s->setEnabled(permission.second); - return; - } -} void MainWindow::addVideoControllWidget(IView* widget) { - QLayout* layout = new QGridLayout(); - //layout->addWidget(dynamic_cast(widget)); + QLayout* layout = new QGridLayout(); + //layout->addWidget(dynamic_cast(widget)); QWidget* controlW = dynamic_cast(widget); if (controlW) { @@ -561,17 +230,12 @@ void MainWindow::addVideoView(IView* videoView) { m_graphView = dynamic_cast(videoView); m_graphView->setParent(ui->trackingArea); - ui->videoViewLayout->addWidget(m_graphView); + ui->videoViewLayout->addWidget(m_graphView); } void MainWindow::addTrackerElementsView(IView *elemView) { - // if (_currentElementView && _currentCoreView) { - // _currentElementView->setParent(0); - // _currentCoreView->setParent(0); - // m_graphView->removeGraphicsItem(_currentElementView); - // m_graphView->removeGraphicsItem(_currentCoreView); - // } + QGraphicsObject *graphObj = dynamic_cast(elemView); graphObj->setParent(ui->trackingArea); @@ -595,7 +259,7 @@ void MainWindow::addNotificationBrowser(IView * notificationBrowser) QWidget* notificationWidget = dynamic_cast(notificationBrowser); if (notificationWidget) { notificationWidget->updateGeometry(); - + ui->notificationTab->layout()->addWidget(notificationWidget); notificationWidget->setVisible(1); @@ -604,28 +268,17 @@ void MainWindow::addNotificationBrowser(IView * notificationBrowser) //createIntroductionWizard(); } -void MainWindow::addTrackerParameterView(IView *parameter) +void MainWindow::addTrackerParameterView(IView *parameter) { QWidget* pluginParameter = dynamic_cast(parameter); - //ui->trackerOptions->layout()->removeItem(ui->trackerOptions->layout()->takeAt(0)); - // for (auto widget: ui->trackerOptions->findChildren("",Qt::FindDirectChildrenOnly)){ - // delete widget; - //} - while(auto item = ui->trackerOptions->layout()->takeAt(0)){ + + while (auto item = ui->trackerOptions->layout()->takeAt(0)) { delete item->widget(); } - // if(_currentTrackerP){ - // _currentTrackerP->deleteLater(); - // } - // _currentTrackerP = pluginParameter; + ui->trackerOptions->layout()->addWidget(pluginParameter); - // if(pluginParameter){ - ui->trackerOptions->layout()->addWidget(pluginParameter); - // } - - //ui->toolBox->addItem(pluginParameter, "bla"); } void MainWindow::addCoreParameterView(IView * coreParameterView) @@ -635,7 +288,7 @@ void MainWindow::addCoreParameterView(IView * coreParameterView) if (coreParameter) { //add experiment widget to toolbar QWidget* experimentWidget = coreParameter->findChild("experimentWidget"); - if(experimentWidget){ + if (experimentWidget) { ui->experimentItem->layout()->addWidget(experimentWidget); } @@ -647,7 +300,7 @@ void MainWindow::addCoreParameterView(IView * coreParameterView) QHBoxLayout* hLayout = new QHBoxLayout; hLayout->addWidget(coreParameter, 100, 0); - hLayout->setContentsMargins(QMargins(0,0,0,0)); //left, top, right, bottom + hLayout->setContentsMargins(QMargins(0, 0, 0, 0)); //left, top, right, bottom hLayout->setMargin(0); ui->widget_alg->setLayout(hLayout); @@ -656,7 +309,7 @@ void MainWindow::addCoreParameterView(IView * coreParameterView) _currentCoreParameterView = coreParameterView; - + //resize rightpanel QList splitterSizes; splitterSizes << 20000 << 10000; //2:1 TODO make this fixed (right panel fixed start size) @@ -665,58 +318,347 @@ void MainWindow::addCoreParameterView(IView * coreParameterView) } } -// void MainWindow::addExperimentView(QWidget* experimentWidget){ +void MainWindow::setTrackerList(QStringListModel* trackerList, QString current) { + ui->comboBox_TrackerSelect->setModel(trackerList); + ui->comboBox_TrackerSelect->setCurrentText(current); +} -// } +//TODO put this in a class +void MainWindow::createIntroductionWizard() { + m_introWiz = new QWizard; -void MainWindow::on_comboBox_TrackerSelect_currentIndexChanged(QString s) { - QString ct = ui->comboBox_TrackerSelect->currentText(); - if (!ct.isEmpty() && _previouslySelectedTracker != ct) { - _previouslySelectedTracker = ct; - Q_EMIT selectPlugin(ct); - } + //BioTracker::Core::Settings *disableIntroWiz = GET_CORESETTINGS(CORE_CONFIGURATION); + BioTracker::Core::Settings *set = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); + bool disabled = set->getValueOrDefault("BiotrackerCore/Disable_Wizard", false); + + //dont show again checkbox + QCheckBox* noShowCheck = new QCheckBox("Don't show this again"); + noShowCheck->setChecked(disabled); + QObject::connect(noShowCheck, &QCheckBox::toggled, this, &MainWindow::toggleNoShowWiz); + + + //introduction + QWizardPage* p1 = new QWizardPage; + { + p1->setTitle("BioTracker 3 - Introduction"); + + QPixmap logoImg(":/Logo/resources/logo/BT3-big.png"); + QPixmap scaledImg = logoImg.scaled(QSize(600, 400), Qt::KeepAspectRatio, Qt::SmoothTransformation); + + QLabel* imgLabel = new QLabel; + imgLabel->setPixmap(scaledImg); + imgLabel->setAttribute(Qt::WA_TranslucentBackground); + imgLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + imgLabel->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); + + QFile file(":/Introduction/resources/introduction/intro.txt"); + QLabel *introLabel = new QLabel; + introLabel->setWordWrap(true); + + //read introduction text from file + QString line; + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QTextStream stream(&file); + while (!stream.atEnd()) { + line.append(stream.readLine() + "\n"); + } + introLabel->setText(line); + } + file.close(); + + QVBoxLayout *layout = new QVBoxLayout; + layout->addWidget(imgLabel); + QScrollArea* textScroll = new QScrollArea; + textScroll->setFrameShape(QFrame::NoFrame); + textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + textScroll->setWidget(introLabel); + textScroll->setWidgetResizable(true); + layout->addWidget(textScroll); + layout->setAlignment(Qt::AlignHCenter); + p1->setLayout(layout); + + } + + //overview + QWizardPage* p2 = new QWizardPage; + { + p2->setTitle("BioTracker 3 - Overview"); + QLabel *label = new QLabel("This is the BioTracker. Don't let yourself be overwhelmed as it is actually pretty simple."); + label->setWordWrap(true); + + QPixmap overviewImg(":/Introduction/resources/introduction/images/BioTracker.PNG"); + QPixmap scaledImg = overviewImg.scaled(QSize(600, 400), Qt::KeepAspectRatio, Qt::SmoothTransformation); + + QLabel* imgLabel = new QLabel; + imgLabel->setPixmap(scaledImg); + imgLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + //imgLabel->setScaledContents(true); + + QVBoxLayout *layout = new QVBoxLayout; + layout->addWidget(imgLabel); + QScrollArea* textScroll = new QScrollArea; + textScroll->setFrameShape(QFrame::NoFrame); + textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + textScroll->setWidget(label); + textScroll->setWidgetResizable(true); + layout->addWidget(textScroll); + layout->setAlignment(Qt::AlignHCenter); + p2->setLayout(layout); + } + + //toolbars + QWizardPage* p3 = new QWizardPage; + { + p3->setTitle("BioTracker 3 - Toolbars"); + + //image + QPixmap overviewImg(":/Introduction/resources/introduction/images/toolbars.png"); + QPixmap scaledImg = overviewImg.scaled(QSize(600, 400), Qt::KeepAspectRatio, Qt::SmoothTransformation); + QLabel* imgLabel = new QLabel; + + imgLabel->setPixmap(scaledImg); + + //read toolbar text from file + QFile file(":/Introduction/resources/introduction/toolbars.txt"); + QLabel *label = new QLabel(); + label->setWordWrap(true); + + QString line; + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QTextStream stream(&file); + while (!stream.atEnd()) { + line.append(stream.readLine() + "\n"); + } + label->setText(line); + } + file.close(); + + + QVBoxLayout *layout = new QVBoxLayout; + layout->addWidget(imgLabel); + QScrollArea* textScroll = new QScrollArea; + textScroll->setFrameShape(QFrame::NoFrame); + textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + textScroll->setWidget(label); + textScroll->setWidgetResizable(true); + layout->addWidget(textScroll); + layout->setAlignment(Qt::AlignHCenter); + p3->setLayout(layout); + } + + + //right panel - overview + QWizardPage* p4 = new QWizardPage; + { + p4->setTitle("BioTracker 3 - Right panel overview"); + + //image + QPixmap overviewImg(":/Introduction/resources/introduction/images/right_panel.png"); + QPixmap scaledImg = overviewImg.scaled(QSize(600, 400), Qt::KeepAspectRatio, Qt::SmoothTransformation); + QLabel* imgLabel = new QLabel; + imgLabel->setPixmap(scaledImg); + + //read right panel text from file + QFile file(":/Introduction/resources/introduction/right_panel.txt"); + QLabel *label = new QLabel(); + label->setWordWrap(true); + + QString line; + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QTextStream stream(&file); + while (!stream.atEnd()) { + line.append(stream.readLine() + "\n"); + } + label->setText(line); + } + file.close(); + + + QVBoxLayout *layout = new QVBoxLayout; + layout->addWidget(imgLabel); + QScrollArea* textScroll = new QScrollArea; + textScroll->setFrameShape(QFrame::NoFrame); + textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + textScroll->setWidget(label); + textScroll->setWidgetResizable(true); + layout->addWidget(textScroll); + layout->setAlignment(Qt::AlignHCenter); + + p4->setLayout(layout); + } + + + //how to track + QWizardPage* p5 = new QWizardPage; + { + p5->setTitle("BioTracker 3 - Tracking"); + + //image + QPixmap overviewImg(":/Introduction/resources/introduction/images/tracking.png"); + QPixmap scaledImg = overviewImg.scaled(QSize(600, 400), Qt::KeepAspectRatio, Qt::SmoothTransformation); + QLabel* imgLabel = new QLabel; + imgLabel->setPixmap(scaledImg); + + //read tracking text from file + QFile file(":/Introduction/resources/introduction/tracking.txt"); + QLabel *label = new QLabel(); + label->setWordWrap(true); + + QString line; + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QTextStream stream(&file); + while (!stream.atEnd()) { + line.append(stream.readLine() + "\n"); + } + label->setText(line); + } + file.close(); + + + QVBoxLayout *layout = new QVBoxLayout; + layout->addWidget(imgLabel); + QScrollArea* textScroll = new QScrollArea; + textScroll->setFrameShape(QFrame::NoFrame); + textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + textScroll->setWidget(label); + textScroll->setWidgetResizable(true); + layout->addWidget(textScroll); + layout->setAlignment(Qt::AlignHCenter); + + p5->setLayout(layout); + } + + //context menus + QWizardPage* p6 = new QWizardPage; + { + p6->setTitle("BioTracker 3 - Context menus"); + + //images + QPixmap contextEntityImg(":/Introduction/resources/introduction/images/context_entity.png"); + QPixmap scaledImg1 = contextEntityImg.scaled(QSize(300, 400), Qt::KeepAspectRatio, Qt::SmoothTransformation); + QLabel* imgEntityLabel = new QLabel; + imgEntityLabel->setPixmap(scaledImg1); + + QPixmap contextVideoImg(":/Introduction/resources/introduction/images/context_video.png"); + QPixmap scaledImg2 = contextVideoImg.scaled(QSize(300, 400), Qt::KeepAspectRatio, Qt::SmoothTransformation); + QLabel* imgVideoLabel = new QLabel; + imgVideoLabel->setPixmap(scaledImg2); + + //read tracking text from file + QFile file(":/Introduction/resources/introduction/context_menus.txt"); + QLabel *label = new QLabel(); + label->setWordWrap(true); + + QString line; + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QTextStream stream(&file); + while (!stream.atEnd()) { + line.append(stream.readLine() + "\n"); + } + label->setText(line); + } + file.close(); + + + QVBoxLayout *outerLayout = new QVBoxLayout; + QHBoxLayout *imgLayout = new QHBoxLayout; + imgLayout->addWidget(imgEntityLabel); + imgLayout->addWidget(imgVideoLabel); + QFrame* imgFrame = new QFrame; + imgFrame->setFrameStyle(QFrame::Panel | QFrame::Sunken); + imgFrame->setLayout(imgLayout); + + outerLayout->addWidget(imgFrame); + QScrollArea* textScroll = new QScrollArea; + textScroll->setFrameShape(QFrame::NoFrame); + textScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + textScroll->setWidget(label); + textScroll->setWidgetResizable(true); + outerLayout->addWidget(textScroll); + outerLayout->addWidget(noShowCheck); + + outerLayout->setAlignment(Qt::AlignHCenter); + + p6->setLayout(outerLayout); + } + + + m_introWiz->addPage(p1); + m_introWiz->addPage(p2); + m_introWiz->addPage(p3); + m_introWiz->addPage(p4); + m_introWiz->addPage(p5); + m_introWiz->addPage(p6); + //m_introWiz->addPage(p7); + + + m_introWiz->setWindowTitle("Introduction"); + if (!disabled) { + QRect rec = QApplication::desktop()->availableGeometry(); + m_introWiz->resize(m_introWiz->width(), 500); + m_introWiz->show(); + //m_introWiz->showMaximized(); + } } -void MainWindow::setTrackerList(QStringListModel* trackerList, QString current) { - ui->comboBox_TrackerSelect->setModel(trackerList); - ui->comboBox_TrackerSelect->setCurrentText(current); +/////////////////////////////////////////// + +void MainWindow::setCorePermission(std::pair permission) { + if (permission.first == ENUMS::COREPERMISSIONS::COMPONENTADD) { + ui->actionAdd_Track->setEnabled(permission.second); + return; + } + if (permission.first == ENUMS::COREPERMISSIONS::COMPONENTREMOVE) { + ui->actionDelete_selected_tracks->setEnabled(permission.second); + return; + } + if (permission.first == ENUMS::COREPERMISSIONS::COMPONENTSWAP) { + ui->actionSwap_ID_s->setEnabled(permission.second); + return; + } +} + +void MainWindow::on_comboBox_TrackerSelect_currentIndexChanged(QString s) { + QString ct = ui->comboBox_TrackerSelect->currentText(); + if (!ct.isEmpty() && _previouslySelectedTracker != ct) { + _previouslySelectedTracker = ct; + Q_EMIT selectPlugin(ct); + } } void MainWindow::setCursorPositionLabel(QPoint pos) { QString posString = QString("%1, %2").arg(QString::number(pos.x()), QString::number(pos.y())); - //if(_cursorPosition){ - // _cursorPosition->setText(posString); - //} + QLabel* currentChild = statusBar()->findChild("_cursorPosition"); currentChild->setText(posString); - + } void MainWindow::activeTrackingCheckBox() { - //ui->checkBox_TrackingActivated->setEnabled(true); + //ui->checkBox_TrackingActivated->setEnabled(true); _trackerActivator->setEnabled(true); checkTrackerGroupBox(); ui->toolBarTools->setEnabled(true); } void MainWindow::deactivateTrackingCheckBox() { - //ui->checkBox_TrackingActivated->setEnabled(false); + //ui->checkBox_TrackingActivated->setEnabled(false); _trackerActivator->setEnabled(false); } -void MainWindow::saveDataToFile(){ +void MainWindow::saveDataToFile() { static const QString fileFilter( - "tracking data files (*.csv *.dat *.json)"); + "tracking data files (*.csv *.dat *.json)"); - boost::filesystem::path file; + boost::filesystem::path file; BioTracker::Core::Settings *set = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); std::string locStr = set->getValueOrDefault(CFG_DEFAULT_LOC_MAN_SAVE, ""); QString locStrQ = QString::fromStdString(locStr); - QString f = QFileDialog::getSaveFileName(this, "Save trajectory data to file", locStrQ, fileFilter, 0); + QString f = QFileDialog::getSaveFileName(this, "Save trajectory data to file", locStrQ, fileFilter, 0); if (f != "") { qobject_cast (getController())->saveTrajectoryFile(f.toStdString()); @@ -725,67 +667,66 @@ void MainWindow::saveDataToFile(){ ////////////////////////////////////////////////SLOTS///////////////////////////////////// -void MainWindow::toggleNoShowWiz(bool toggle){ - //qDebug() << toggle; - //BioTracker::Core::Settings *disableIntroWiz = GET_CORESETTINGS(CORE_CONFIGURATION); +void MainWindow::toggleNoShowWiz(bool toggle) { + BioTracker::Core::Settings *disableIntroWiz = BioTracker::Util::TypedSingleton::getInstance(CORE_CONFIGURATION); disableIntroWiz->setParam("BiotrackerCore/Disable_Wizard", toggle); } void MainWindow::receiveSelectedCameraDevice(CameraConfiguration conf) { - qobject_cast (getController())->loadCameraDevice(conf); + qobject_cast (getController())->loadCameraDevice(conf); } -void MainWindow::on_rightPanelViewControllerButton_clicked(){ - QList splitterSizes = QList (); - if(ui->widgetParameterAreaOuterCanvas->isVisible()){ +void MainWindow::on_rightPanelViewControllerButton_clicked() { + QList splitterSizes = QList(); + if (ui->widgetParameterAreaOuterCanvas->isVisible()) { _lastRightPanelWidth = ui->mainSplitter->sizes()[1]; //save last width to restore on show _lastVideoWidgetWidth = ui->mainSplitter->sizes()[0]; ui->widgetParameterAreaOuterCanvas->hide(); splitterSizes << 20000 << ui->rightPanelViewControllerWidget->minimumSizeHint().width(); - ui->rightPanelViewControllerButton->setText("<"); + ui->rightPanelViewControllerButton->setText("<"); //set menu action unchecked ui->actionRight_panel->setChecked(false); } - else{ + else { ui->widgetParameterAreaOuterCanvas->show(); splitterSizes << _lastVideoWidgetWidth << _lastRightPanelWidth; ui->rightPanelViewControllerButton->setText(">"); //set menu action checked - ui->actionRight_panel->setChecked(true); + ui->actionRight_panel->setChecked(true); } ui->mainSplitter->setSizes(splitterSizes); } -void MainWindow::on_bottomPanelViewControllerButton_clicked(){ +void MainWindow::on_bottomPanelViewControllerButton_clicked() { ui->videoControls->setVisible(ui->bottomPanelViewControllerButton->text() == "^"); - ui->bottomPanelViewControllerButton->setText(ui->bottomPanelViewControllerButton->text() == "v"?"^":"v"); + ui->bottomPanelViewControllerButton->setText(ui->bottomPanelViewControllerButton->text() == "v" ? "^" : "v"); } void MainWindow::activateTracking() { - _trackerActivator->setState(true); + _trackerActivator->setState(true); } void MainWindow::deactivateTracking() { - _trackerActivator->setState(false); + _trackerActivator->setState(false); } -void MainWindow::receiveSetTracking(bool toggle){ - if(toggle){ +void MainWindow::receiveSetTracking(bool toggle) { + if (toggle) { qobject_cast (getController())->activeTracking(); } - else{ + else { qobject_cast (getController())->deactiveTrackring(); } } -void MainWindow::resetTrackerViews(){ - if(_currentElementView && _currentCoreView){ - _currentElementView->setParent(0); +void MainWindow::resetTrackerViews() { + if (_currentElementView && _currentCoreView) { + _currentElementView->setParent(0); _currentCoreView->setParent(0); m_graphView->removeGraphicsItem(_currentElementView); m_graphView->removeGraphicsItem(_currentCoreView); @@ -795,57 +736,48 @@ void MainWindow::resetTrackerViews(){ _currentCoreView = nullptr; } -//////////////////////////utility toolbar actions/////////////////////////// -void MainWindow::on_actionAdd_Track_triggered(){ +//////////////////////////utility toolbar action slots/////////////////////////// +void MainWindow::on_actionAdd_Track_triggered() { qobject_cast (getController())->emitAddTrack(); } -void MainWindow::on_actionDelete_selected_tracks_triggered(){ +void MainWindow::on_actionDelete_selected_tracks_triggered() { qobject_cast (getController())->emitDeleteSelectedTracks(); } -void MainWindow::on_actionSwap_ID_s_triggered(){ +void MainWindow::on_actionSwap_ID_s_triggered() { qobject_cast (getController())->emitSwapIds(); } -void MainWindow::on_actionSelect_all_triggered(){ - qobject_cast (getController())->emitSelectAll(); +void MainWindow::on_actionSelect_all_triggered() { + qobject_cast (getController())->emitSelectAll(); } -void MainWindow::on_actionChange_the_border_color_triggered(){ +void MainWindow::on_actionChange_the_border_color_triggered() { qobject_cast (getController())->emitChangeColorBorder(); } -void MainWindow::on_actionChange_the_fill_color_triggered(){ +void MainWindow::on_actionChange_the_fill_color_triggered() { qobject_cast (getController())->emitChangeColorFill(); } -void MainWindow::on_actionAdd_label_Annotation_triggered(){ +void MainWindow::on_actionAdd_label_Annotation_triggered() { qobject_cast (getController())->emitAddLabelAnno(); } -void MainWindow::on_actionAdd_rectangular_annotation_triggered(){ +void MainWindow::on_actionAdd_rectangular_annotation_triggered() { qobject_cast (getController())->emitAddRectAnno(); } -void MainWindow::on_actionAdd_arrow_annotation_triggered(){ +void MainWindow::on_actionAdd_arrow_annotation_triggered() { qobject_cast (getController())->emitAddArrAnno(); } -void MainWindow::on_actionAdd_elliptical_annotation_triggered(){ +void MainWindow::on_actionAdd_elliptical_annotation_triggered() { qobject_cast (getController())->emitAddEllAnno(); } -void MainWindow::on_actionDelete_selected_Annotation_triggered(){ +void MainWindow::on_actionDelete_selected_Annotation_triggered() { qobject_cast (getController())->emitDelSelAnno(); } -///////////////////////////////menu->file///////////////////////////// +///////////////////////////////menu->file slots///////////////////////////// void MainWindow::on_actionOpen_Video_triggered() { static const QString videoFilter("Video files (*.avi *.wmv *.mp4 *.mkv *.mov)"); - // QFileDialog dialog(this); - // dialog.setNameFilter(videoFilter); - // QStringList fileNames; - // if (dialog.exec()) - // fileNames = dialog.selectedFiles(); - - // QString filename; - // if(fileNames.size() > 0) - // filename = fileNames[0]; QString filename = QFileDialog::getOpenFileName(this, "Open video", "", videoFilter, 0); @@ -911,7 +843,7 @@ void MainWindow::on_actionQuit_triggered() { qobject_cast (getController())->exit(); } -///////////////////////////////menu->edit///////////////////////////// +///////////////////////////////menu->edit slots///////////////////////////// void MainWindow::on_actionUndo_triggered() { @@ -934,18 +866,18 @@ void MainWindow::on_actionSettings_triggered() { m_SettingsWindow->show(); } -///////////////////////////////menu->view///////////////////////////// +///////////////////////////////menu->view slots///////////////////////////// //toggle toolbars actions -void MainWindow::on_actionToggle_menu_toolbar_triggered(){ +void MainWindow::on_actionToggle_menu_toolbar_triggered() { bool currentState = ui->toolBarMenu->isVisible(); ui->toolBarMenu->setVisible(!currentState); - ui->actionToggle_menu_toolbar->setText(!currentState?"Hide menu toolbar": "Show menu toolbar"); + ui->actionToggle_menu_toolbar->setText(!currentState ? "Hide menu toolbar" : "Show menu toolbar"); } -void MainWindow::on_actionToggle_view_toolbar_triggered(){ +void MainWindow::on_actionToggle_view_toolbar_triggered() { bool currentState = ui->toolBarTools->isVisible(); ui->toolBarTools->setVisible(!currentState); - ui->actionToggle_view_toolbar->setText(!currentState?"Hide view toolbar": "Show view toolbar"); + ui->actionToggle_view_toolbar->setText(!currentState ? "Hide view toolbar" : "Show view toolbar"); } void MainWindow::on_actionToggle_video_toolbar_triggered() { bool currentState = ui->toolBarVideo->isVisible(); @@ -953,49 +885,41 @@ void MainWindow::on_actionToggle_video_toolbar_triggered() { ui->actionToggle_video_toolbar->setText(!currentState ? "Hide view toolbar" : "Show view toolbar"); } -void MainWindow::on_actionToggle_compact_menu_toolbar_2_triggered(){ - // //hide/show compact actions - // for(int i = 3; i < ui->toolBarMenu->actions().size(); i++){ - // ui->toolBarMenu->actions().at(i)->setVisible(!ui->toolBarMenu->actions().at(i)->isVisible()); - // } - // //hide/show informative groupboxes - // ui->toolBarMenu->actions().at(2)->setVisible(!ui->toolBarMenu->actions().at(2)->isVisible()); - // ui->toolBarMenu->actions().at(2)->actions().at(1)->setVisible(false); - // ui->toolBarMenu->actions().at(2)->setEnabled(true); +void MainWindow::on_actionToggle_compact_menu_toolbar_2_triggered() { ui->toolBarMenu->setStyleSheet("QGroupBox" - " {border-style: none; margin-top: 0ex; font-size: 1px;}" - "QGroupBox::title {font-size: 1px; padding: 0 3px;}"); + " {border-style: none; margin-top: 0ex; font-size: 1px;}" + "QGroupBox::title {font-size: 1px; padding: 0 3px;}"); } -void MainWindow::on_toolBarMenu_visibilityChanged(bool visible){ - ui->actionToggle_menu_toolbar->setText(visible?"Hide menu toolbar": "Show menu toolbar"); +void MainWindow::on_toolBarMenu_visibilityChanged(bool visible) { + ui->actionToggle_menu_toolbar->setText(visible ? "Hide menu toolbar" : "Show menu toolbar"); } -void MainWindow::on_toolBarTools_visibilityChanged(bool visible){ - ui->actionToggle_view_toolbar->setText(visible?"Hide view toolbar": "Show view toolbar"); +void MainWindow::on_toolBarTools_visibilityChanged(bool visible) { + ui->actionToggle_view_toolbar->setText(visible ? "Hide view toolbar" : "Show view toolbar"); } void MainWindow::on_toolBarVideo_visibilityChanged(bool visible) { ui->actionToggle_video_toolbar->setText(visible ? "Hide video toolbar" : "Show video toolbar"); } -void MainWindow::on_actionBottom_panel_triggered(bool checked){ +void MainWindow::on_actionBottom_panel_triggered(bool checked) { ui->bottomPanelViewControllerButton->click(); } -void MainWindow::on_actionRight_panel_triggered(bool checked){ +void MainWindow::on_actionRight_panel_triggered(bool checked) { ui->rightPanelViewControllerButton->click(); } -void MainWindow::on_actionToggle_fullscreen_triggered(){ - if(isFullScreen()){ +void MainWindow::on_actionToggle_fullscreen_triggered() { + if (isFullScreen()) { showNormal(); } - else{ + else { showFullScreen(); } } -//////////////////////////////////menu->Go to////////////////////////////////// +//////////////////////////////////menu->Go to slots////////////////////////////////// void MainWindow::on_actionOpen_Plugins_directory_triggered() { QDesktopServices::openUrl(QUrl::fromLocalFile(CFG_DIR_PLUGINS)); @@ -1014,63 +938,47 @@ void MainWindow::on_actionOpen_Videos_directory_triggered() { } -//////////////////////////////////menu->Help////////////////////////////// +//////////////////////////////////menu->Help slots////////////////////////////// -void MainWindow::on_actionUser_guide_triggered(){ +void MainWindow::on_actionUser_guide_triggered() { QDesktopServices::openUrl(QUrl("https://github.com/BioroboticsLab/biotracker_core/wiki")); } void MainWindow::on_actionAbout_triggered() { - std::string version = ""; - version = "BioTracker3

    "; + std::string version = ""; + version = "BioTracker3

    "; - version = "Version: "; - version += GIT_HASH; - version += +"

    "; + version = "Version: "; + version += GIT_HASH; + version += +"

    "; - version += "External libraries used:

    "; - std::string qt = MyQT_VERSION; - version += "QT " + qt + "
    "; + version += "External libraries used:

    "; + std::string qt = MyQT_VERSION; + version += "QT " + qt + "
    "; - std::string cv = MyCV_VERSION; - version += "OpenCV " + cv + "
    "; + std::string cv = MyCV_VERSION; + version += "OpenCV " + cv + "
    "; - std::string boost = MyBT_VERSION; - version += "Boost " + boost + "
    "; + std::string boost = MyBT_VERSION; + version += "Boost " + boost + "
    "; version += "

    Icons by
    icons8
    "; - version += "

    Published under LGPL licence"; + version += "

    Published under LGPL licence"; QMessageBox msgBox(this); - msgBox.setWindowTitle("About BioTracker"); - msgBox.setTextFormat(Qt::RichText); //this is what makes the links clickable - msgBox.setText(tr(version.c_str())); - msgBox.exec(); + msgBox.setWindowTitle("About BioTracker"); + msgBox.setTextFormat(Qt::RichText); //this is what makes the links clickable + msgBox.setText(tr(version.c_str())); + msgBox.exec(); - //QMessageBox::about(this, tr("About BioTracker"), tr(version.c_str())); + //QMessageBox::about(this, tr("About BioTracker"), tr(version.c_str())); } void MainWindow::on_actionShortcuts_triggered() { - - // QLinkedList>::const_iterator info; - // for(info = infoList.constBegin(); info != infoList.constEnd(); ++info){ - // infoTable->insertRow(infoTable->rowCount()); - - - // QTableWidgetItem* infoKey = new QTableWidgetItem(info->first); - // QTableWidgetItem* infoKeyInfo = new QTableWidgetItem(info->second); - // infoKey->setFlags(Qt::NoItemFlags | Qt::ItemIsEnabled | Qt::ItemIsSelectable); - // infoKeyInfo->setFlags(Qt::NoItemFlags | Qt::ItemIsEnabled | Qt::ItemIsSelectable); - - // infoTable->setItem(infoTable->rowCount() - 1, 0, infoKey); - // infoTable->setItem(infoTable->rowCount() - 1, 1, infoKeyInfo); - - // } - QTableWidget* scTable = new QTableWidget(); - + scTable->setRowCount(0); scTable->setColumnCount(2); @@ -1081,25 +989,27 @@ void MainWindow::on_actionShortcuts_triggered() { QLinkedList> scList; - //TODO import this from file - scList.append(QPair(QString("F11"), QString("Toggle fullscreen"))); - scList.append(QPair(QString("CTRL + Z"), QString("Undo"))); - scList.append(QPair(QString("CTRL + Y"), QString("Redo"))); - scList.append(QPair(QString("CTRL + A"), QString("Select all"))); - scList.append(QPair(QString("+"), QString("Add track"))); - scList.append(QPair(QString("DELETE"), QString("Delete all selected trajectories"))); - scList.append(QPair(QString("Space"), QString("Play"))); - scList.append(QPair(QString("Left Arrow"), QString("Previous Frame"))); - scList.append(QPair(QString("Right Arrow"), QString("Next Frame"))); - scList.append(QPair(QString("CTRL + Space"), QString("Stop"))); - scList.append(QPair(QString("ALT + L"), QString("Add label annotation"))); - scList.append(QPair(QString("ALT + A"), QString("Add arrow annotation"))); - scList.append(QPair(QString("ALT + E"), QString("Add ellipse annotation"))); - scList.append(QPair(QString("ALT + R"), QString("Add rect annotation"))); - scList.append(QPair(QString("ALT + DELETE"), QString("Delete selected annotation"))); + //read from file in resources and add to linked list + QFile shortcutFile(":Shortcuts/resources/shortcuts.txt"); + + if (!shortcutFile.open(QIODevice::ReadOnly | QIODevice::Text)) + return; + + QString line; + while (!shortcutFile.atEnd()) { + QTextStream stream(&shortcutFile); + while (!stream.atEnd()) { + line = stream.readLine(); + QStringList shortCutAndDescription = line.split(':'); + if (shortCutAndDescription.size() == 2) { + scList.append(QPair(shortCutAndDescription[0], shortCutAndDescription[1])); + } + } + + } QLinkedList>::const_iterator sc; - for(sc = scList.constBegin(); sc != scList.constEnd(); ++sc){ + for (sc = scList.constBegin(); sc != scList.constEnd(); ++sc) { scTable->insertRow(scTable->rowCount()); @@ -1113,7 +1023,7 @@ void MainWindow::on_actionShortcuts_triggered() { } - //scTable->horizontalHeader()->setStretchLastSection( true ); + //scTable->horizontalHeader()->setStretchLastSection( true ); scTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); QWidget* outerWidget = new QWidget(); @@ -1127,19 +1037,13 @@ void MainWindow::on_actionShortcuts_triggered() { outerWidget->show(); - - } -void MainWindow::on_actionShow_introduction_triggered(){ +void MainWindow::on_actionShow_introduction_triggered() { m_introWiz->show(); } ///////////// void MainWindow::closeEvent(QCloseEvent *event) { - qobject_cast (getController())->exit(); -} - - - - + qobject_cast (getController())->exit(); +} \ No newline at end of file diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.h b/BioTracker/CoreApp/BioTracker/View/MainWindow.h index 750eaa0b..8283f1a1 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.h +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.h @@ -19,74 +19,81 @@ #include "Utility/SwitchButton.h" namespace Ui { -class MainWindow; + class MainWindow; } class IController; + + +/** +* This class inherits IViewMainWindow. +* It is the canvas (GUI) for most of the view of other components. +* It also provides its own fuctionality, like an introduction dialog +*/ class MainWindow : public IViewMainWindow { - Q_OBJECT + Q_OBJECT - public: - explicit MainWindow(QWidget* parent = 0, IController* controller = 0, IModel* model = 0); - ~MainWindow(); +public: + explicit MainWindow(QWidget* parent = 0, IController* controller = 0, IModel* model = 0); + ~MainWindow(); - void addVideoControllWidget(IView* widget); - void addVideoView(IView* videoView); - void addTrackerParameterView(IView* parameter); + void addVideoControllWidget(IView* widget); + void addVideoView(IView* videoView); + void addTrackerParameterView(IView* parameter); void addCoreParameterView(IView* coreParameterView); - //void addExperimentView(QWidget* experimentWidget); + //void addExperimentView(QWidget* experimentWidget); void addTrackerElementsView(IView *elemView); void addCoreElementsView(IView* coreView); void addNotificationBrowser(IView* notificationBrowser); - void setTrackerList(QStringListModel* trackerList, QString current); + void setTrackerList(QStringListModel* trackerList, QString current); void setCursorPositionLabel(QPoint pos); - void setCorePermission(std::pair permission); + void setCorePermission(std::pair permission); - void activeTrackingCheckBox(); - void deactivateTrackingCheckBox(); + void activeTrackingCheckBox(); + void deactivateTrackingCheckBox(); - void closeEvent(QCloseEvent *event); + void closeEvent(QCloseEvent *event); - void setupUpperToolBar(); - void setupVideoToolBar(); + void setupUpperToolBar(); + void setupVideoToolBar(); - //intro wizard - void createIntroductionWizard(); + //intro wizard + void createIntroductionWizard(); - void saveDataToFile(); - - void checkTrackerGroupBox(); - void checkMediaGroupBox(); - void activateTracking(); + void saveDataToFile(); - void deactivateTracking(); + void checkTrackerGroupBox(); + void checkMediaGroupBox(); + void activateTracking(); - void resetTrackerViews(); + void deactivateTracking(); + + void resetTrackerViews(); Q_SIGNALS: void selectPlugin(QString ct); - private Q_SLOTS: + private Q_SLOTS: + + void toggleNoShowWiz(bool toggle); - void toggleNoShowWiz(bool toggle); - -//menu->File - void on_actionOpen_Video_triggered(); + //menu->File + void on_actionOpen_Video_triggered(); - void on_actionLoad_Tracker_triggered(); + void on_actionLoad_Tracker_triggered(); - void on_actionOpen_Picture_triggered(); + void on_actionOpen_Picture_triggered(); - void on_actionLoad_trackingdata_triggered(); + void on_actionLoad_trackingdata_triggered(); - void on_actionSave_trackingdata_triggered(); + void on_actionSave_trackingdata_triggered(); - void on_actionQuit_triggered(); + void on_actionQuit_triggered(); - void on_actionOpen_Camera_triggered(); + void on_actionOpen_Camera_triggered(); -//menu->Edit + //menu->Edit void on_actionUndo_triggered(); @@ -94,17 +101,17 @@ class MainWindow : public IViewMainWindow { void on_actionShowActionList_triggered(); - void on_actionSettings_triggered(); + void on_actionSettings_triggered(); -//menu->View - //menu->View->Toolbars - void on_actionToggle_menu_toolbar_triggered(); - void on_actionToggle_view_toolbar_triggered(); - void on_actionToggle_compact_menu_toolbar_2_triggered(); + //menu->View + //menu->View->Toolbars + void on_actionToggle_menu_toolbar_triggered(); + void on_actionToggle_view_toolbar_triggered(); + void on_actionToggle_compact_menu_toolbar_2_triggered(); void on_actionToggle_video_toolbar_triggered(); - void on_actionToggle_fullscreen_triggered(); + void on_actionToggle_fullscreen_triggered(); -//menu->Go to + //menu->Go to void on_actionOpen_Plugins_directory_triggered(); void on_actionOpen_Track_directory_triggered(); void on_actionOpen_Trial_directory_triggered(); @@ -112,69 +119,69 @@ class MainWindow : public IViewMainWindow { void on_actionOpen_Videos_directory_triggered(); -//view toolbar actions - void on_actionAdd_Track_triggered(); - void on_actionDelete_selected_tracks_triggered(); - void on_actionSwap_ID_s_triggered(); - void on_actionSelect_all_triggered(); - void on_actionChange_the_border_color_triggered(); - void on_actionChange_the_fill_color_triggered(); - void on_actionAdd_label_Annotation_triggered(); - void on_actionAdd_rectangular_annotation_triggered(); - void on_actionAdd_arrow_annotation_triggered(); - void on_actionAdd_elliptical_annotation_triggered(); - void on_actionDelete_selected_Annotation_triggered(); + //view toolbar actions + void on_actionAdd_Track_triggered(); + void on_actionDelete_selected_tracks_triggered(); + void on_actionSwap_ID_s_triggered(); + void on_actionSelect_all_triggered(); + void on_actionChange_the_border_color_triggered(); + void on_actionChange_the_fill_color_triggered(); + void on_actionAdd_label_Annotation_triggered(); + void on_actionAdd_rectangular_annotation_triggered(); + void on_actionAdd_arrow_annotation_triggered(); + void on_actionAdd_elliptical_annotation_triggered(); + void on_actionDelete_selected_Annotation_triggered(); -//menu->Help + //menu->Help - void on_actionAbout_triggered(); + void on_actionAbout_triggered(); - void on_actionShortcuts_triggered(); + void on_actionShortcuts_triggered(); - void on_actionUser_guide_triggered(); + void on_actionUser_guide_triggered(); - void on_actionShow_introduction_triggered(); -//GUI + void on_actionShow_introduction_triggered(); + //GUI - void receiveSelectedCameraDevice(CameraConfiguration conf); + void receiveSelectedCameraDevice(CameraConfiguration conf); - void on_comboBox_TrackerSelect_currentIndexChanged(QString s); + void on_comboBox_TrackerSelect_currentIndexChanged(QString s); - void receiveSetTracking(bool toggle); + void receiveSetTracking(bool toggle); -//hider - void on_rightPanelViewControllerButton_clicked(); - void on_bottomPanelViewControllerButton_clicked(); - void on_actionBottom_panel_triggered(bool checked = false); - void on_actionRight_panel_triggered(bool checked = false); -//ui signals - void on_toolBarMenu_visibilityChanged(bool visible); - void on_toolBarTools_visibilityChanged(bool visible); + //hider + void on_rightPanelViewControllerButton_clicked(); + void on_bottomPanelViewControllerButton_clicked(); + void on_actionBottom_panel_triggered(bool checked = false); + void on_actionRight_panel_triggered(bool checked = false); + //ui signals + void on_toolBarMenu_visibilityChanged(bool visible); + void on_toolBarTools_visibilityChanged(bool visible); void on_toolBarVideo_visibilityChanged(bool visible); - private: - Ui::MainWindow* ui; - GraphicsView *m_graphView; - QLabel *_cursorPosition; - int _lastRightPanelWidth; - int _lastVideoWidgetWidth; - QLabel* cursorPositionLabel; - - QPointer< CameraDevice > m_CameraDevice; - QPointer< SettingsWindow > m_SettingsWindow; - - IView *_currentParameterView; - IView *_currentCoreParameterView; - QGraphicsObject *_currentElementView; - QGraphicsObject *_currentCoreView; - QString _previouslySelectedTracker; - SwitchButton* _trackerActivator; - - QGroupBox* _mediaBox; - QGroupBox* _trackerBox; - - QWidget* _currentTrackerP; - QWizard* m_introWiz; +private: + Ui::MainWindow* ui; /**< ui file */ + GraphicsView *m_graphView; /**< media panel */ + QLabel *_cursorPosition; /**< cursor Position in media panel */ + int _lastRightPanelWidth; /**< lastRightPanelWidth for layouting */ + int _lastVideoWidgetWidth; /**< lastVideoWidgetWidth for layouting */ + QLabel* cursorPositionLabel; /**< cursonpositionlabel in status bar */ + + QPointer< CameraDevice > m_CameraDevice; /**< pointer on camera device */ + QPointer< SettingsWindow > m_SettingsWindow; /**< settings window */ + + IView *_currentParameterView; /**< current tracker paramter view */ + IView *_currentCoreParameterView; /**< current core parameter view */ + QGraphicsObject *_currentElementView; /**< current visualisation view of tracker */ + QGraphicsObject *_currentCoreView; /**< current visualisation view of core app */ + //QWidget* _currentTrackerP; /**< current tracker paramter view */ + QString _previouslySelectedTracker; /**< previous tracker */ + + SwitchButton* _trackerActivator; /**< tracking switch */ + QGroupBox* _mediaBox; /**< tracker groupbox in menu toolbar */ + QGroupBox* _trackerBox; /**< media groupbox in menu toolbar */ + + QWizard* m_introWiz; /**< introduction wizard-dialog */ }; #endif // BIOTRACKER3MAINWINDOW_H diff --git a/BioTracker/CoreApp/BioTracker/View/MainWindow.ui b/BioTracker/CoreApp/BioTracker/View/MainWindow.ui index ecaefee7..18665ead 100644 --- a/BioTracker/CoreApp/BioTracker/View/MainWindow.ui +++ b/BioTracker/CoreApp/BioTracker/View/MainWindow.ui @@ -446,8 +446,8 @@ 0 0 - 743 - 304 + 98 + 28 @@ -469,8 +469,8 @@ 0 0 - 743 - 304 + 98 + 50 @@ -515,8 +515,8 @@ 0 0 - 743 - 304 + 98 + 28 @@ -619,7 +619,8 @@ p, li { white-space: pre-wrap; } <li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Load a tracker (usually trackers are preloaded from the 'Plugins' directory) </li> <li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Choose the desired tracker options </li> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:8pt; font-style:italic;">(This often takes some time to figure out)</span></p> -<li style=" font-family:'Ubuntu'; font-size:8pt; font-style:italic;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:9pt; font-style:normal;">You can manage the tracking and trials in the 'Experiment' tab</span></li> +<li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can also set up a rectification in the 'Visualization options' tab</li> +<li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">You can manage the tracking and trials in the 'Experiment' tab</li> <li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Insert the objects to track if the tracker does not generate them automatically</li> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:1; text-indent:0px;"><span style=" font-family:'Ubuntu'; font-size:8pt; font-style:italic;">(If you want to track two objects, add two tracks by right clicking the video or using the button on the left toolbar)</span></p> <li style=" font-family:'Ubuntu'; font-size:9pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Start tracking by having the tracking activated and playing the video!</li></ol> @@ -640,8 +641,8 @@ p, li { white-space: pre-wrap; } 0 0 - 743 - 304 + 98 + 28 diff --git a/BioTracker/CoreApp/BioTracker/View/NotificationLogBrowser.h b/BioTracker/CoreApp/BioTracker/View/NotificationLogBrowser.h index 7254774d..eaa6c1b3 100644 --- a/BioTracker/CoreApp/BioTracker/View/NotificationLogBrowser.h +++ b/BioTracker/CoreApp/BioTracker/View/NotificationLogBrowser.h @@ -5,23 +5,28 @@ #include "Interfaces/IView/IViewWidget.h" #include +/** +* This is the view of the notifications component. +* It displays all intercepted qdebug messages (color-coded). +* http://doc.qt.io/qt-5/qdebug.html +*/ class NotificationLogBrowser : public IViewWidget { Q_OBJECT - public: - explicit NotificationLogBrowser(QWidget *parent = 0, IController *controller = 0, IModel *model = 0); - ~NotificationLogBrowser(); +public: + explicit NotificationLogBrowser(QWidget *parent = 0, IController *controller = 0, IModel *model = 0); + ~NotificationLogBrowser(); - void outputMessage(QtMsgType type, const QString &msg); + void outputMessage(QtMsgType type, const QString &msg); // IViewWidget interface public slots: - void getNotified(); + void getNotified(); - private: - QTextBrowser *browser; - QFont m_font; +private: + QTextBrowser *browser; + QFont m_font; }; diff --git a/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp b/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp index 534ab41a..40603a35 100644 --- a/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp +++ b/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.cpp @@ -25,7 +25,7 @@ TrackedComponentView::TrackedComponentView(QGraphicsItem *parent, IController *c { m_boundingRect = QRectF(0, 0, 4080, 4080); - m_currentFrameNumber = 0; + m_currentFrameNumber = 0; setAcceptHoverEvents(true); setAcceptDrops(true); _watchingDrag = 0; @@ -43,7 +43,6 @@ void TrackedComponentView::rcvDimensionUpdate(int x, int y) { update(); } - QRectF TrackedComponentView::boundingRect() const { return m_boundingRect; @@ -90,7 +89,65 @@ QVariant TrackedComponentView::itemChange(GraphicsItemChange change, const QVari return QGraphicsItem::itemChange(change, value); } -// set permissions, which were send by the plugin +void TrackedComponentView::mousePressEvent(QGraphicsSceneMouseEvent *event) { + // right clicking the view unselects all selected items so do this to avoid this behaviour + if (event->button() != Qt::LeftButton) { + event->accept(); + return; + } + QGraphicsItem::mousePressEvent(event); +} + +/// opens a context menu when right clicked +void TrackedComponentView::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) +{ + + lastClickedPos = event->pos().toPoint(); + + QMenu menu; + + + // create the info box + QWidgetAction* infoBox = new QWidgetAction(this); + QString info = QString("Position (x,y) : "); + info.append(QString("(" + QString::number(lastClickedPos.x()) + ", " + QString::number(lastClickedPos.y()) + ")")); + QLabel* infoLabel = new QLabel(info); + infoLabel->setWordWrap(true); + infoLabel->setStyleSheet("QLabel {font-weight: bold; text-align: center}"); + infoLabel->setAlignment(Qt::AlignCenter); + infoBox->setDefaultWidget(infoLabel); + menu.addAction(infoBox); + menu.addSeparator(); + QAction *addComponentAction = menu.addAction("Add trajectory here", dynamic_cast(this), SLOT(addTrajectory())); + QAction *swapIdsAction = menu.addAction("Swap ID's", dynamic_cast(this), SLOT(swapIds())); + QAction *unmarkAllAction = menu.addAction("Unmark all...", dynamic_cast(this), SLOT(unmarkAll())); + QAction *removeSelectedAction = menu.addAction("Remove selected trajectories", dynamic_cast(this), SLOT(removeTrajectories())); + + + // manage permissions + addComponentAction->setEnabled(m_permissions[ENUMS::COREPERMISSIONS::COMPONENTADD]); + swapIdsAction->setEnabled(m_permissions[ENUMS::COREPERMISSIONS::COMPONENTSWAP]); + removeSelectedAction->setEnabled(m_permissions[ENUMS::COREPERMISSIONS::COMPONENTREMOVE]); + + // manage swapping + swapIdsAction->setEnabled(false); + QList allSelectedItems = this->scene()->selectedItems(); + // check if two shapes are selected + if (allSelectedItems.size() == 2 && dynamic_cast(allSelectedItems[0]) && dynamic_cast(allSelectedItems[1])) { + ComponentShape* selectedItem0 = dynamic_cast(allSelectedItems[0]); + ComponentShape* selectedItem1 = dynamic_cast(allSelectedItems[1]); + // check if both shapes are swappable (check permission for each shape) and general permission + if (selectedItem0->isSwappable() && selectedItem1->isSwappable() && m_permissions[ENUMS::COREPERMISSIONS::COMPONENTSWAP]) { + swapIdsAction->setEnabled(true); + } + } + + // execute menu + QAction *selectedAction = menu.exec(event->screenPos()); + lastClickedPos = QPoint(0, 0); +} + +/// set permissions for this and all component shapes, which were send by the plugin void TrackedComponentView::setPermission(std::pair permission) { m_permissions[permission.first] = permission.second; @@ -103,7 +160,6 @@ void TrackedComponentView::setPermission(std::pair return; } //does not need to be propagated to shapes; only handled by view - //TODO: move this to controller if (permission.first == ENUMS::COREPERMISSIONS::COMPONENTADD) { return; } @@ -117,8 +173,7 @@ void TrackedComponentView::setPermission(std::pair } } - -// at plugin load, draw each element of initial main trajectory +/// at plugin load, draw each element of initial main trajectory void TrackedComponentView::createChildShapesAtStart() { //flush all old children (e.g. from previous trackers) @@ -128,8 +183,8 @@ void TrackedComponentView::createChildShapesAtStart() { } // check if scene is set - assert(this->scene()); - + assert(this->scene()); + // create a shape for each model-component upon plugin-init IModelTrackedTrajectory *all = dynamic_cast(getModel()); if (all) { @@ -160,72 +215,124 @@ void TrackedComponentView::createChildShapesAtStart() { } } - + } +/// connect a newly created component shape to all slots it needs and set permissions +void TrackedComponentView::connectShape(ComponentShape* shape) { + CoreParameter* coreParams = dynamic_cast + (dynamic_cast(getController())->getCoreParameter()); + + //set type + IModelTrackedTrajectory* trajectory = shape->getTrajectory(); + IModelTrackedPoint* point = dynamic_cast(trajectory->getChild(m_currentFrameNumber)); + if (point) { shape->setData(1, "point"); } + IModelTrackedEllipse* ellipse = dynamic_cast(trajectory->getChild(m_currentFrameNumber)); + if (ellipse) { shape->setData(1, "ellipse"); } + IModelTrackedRectangle* rectangle = dynamic_cast(trajectory->getChild(m_currentFrameNumber)); + if (rectangle) { shape->setData(1, "rectangle"); } + IModelTrackedPolygon* polygon = dynamic_cast(trajectory->getChild(m_currentFrameNumber)); + if (polygon) { shape->setData(1, "polygon"); } + + + //connect slots/signals + QObject::connect(shape, SIGNAL(emitRemoveTrajectory(IModelTrackedTrajectory*)), + dynamic_cast(this->getController()), + SIGNAL(emitRemoveTrajectory(IModelTrackedTrajectory*)), Qt::DirectConnection); + QObject::connect(shape, SIGNAL(emitRemoveTrackEntity(IModelTrackedTrajectory*, uint)), + dynamic_cast(this->getController()), + SIGNAL(emitRemoveTrackEntity(IModelTrackedTrajectory*, uint)), Qt::DirectConnection); + QObject::connect(shape, SIGNAL(emitMoveElement(IModelTrackedTrajectory*, QPoint, QPoint, uint, int)), + dynamic_cast(this->getController()), + SIGNAL(emitMoveElement(IModelTrackedTrajectory*, QPoint, QPoint, uint, int)), Qt::DirectConnection); + QObject::connect(shape, SIGNAL(emitToggleFixTrack(IModelTrackedTrajectory*, bool)), + dynamic_cast(this->getController()), + SIGNAL(emitToggleFixTrack(IModelTrackedTrajectory*, bool)), Qt::DirectConnection); + QObject::connect(shape, SIGNAL(emitEntityRotation(IModelTrackedTrajectory*, double, double, uint)), + dynamic_cast(this->getController()), + SIGNAL(emitEntityRotation(IModelTrackedTrajectory*, double, double, uint)), Qt::DirectConnection); + QObject::connect(shape, &ComponentShape::emitGoToFrame, + dynamic_cast(this->getController()), + &ControllerTrackedComponentCore::emitGoToFrame, Qt::DirectConnection); + + QObject::connect(shape, SIGNAL(broadcastMove()), this, SLOT(receiveBroadcastMove()), Qt::DirectConnection); + + //set the shapes members + shape->m_currentFramenumber = m_currentFrameNumber; + shape->setMembers(coreParams); + + //set permissions + shape->setPermission(std::pair + (ENUMS::COREPERMISSIONS::COMPONENTMOVE, m_permissions[ENUMS::COREPERMISSIONS::COMPONENTMOVE])); + shape->setPermission(std::pair + (ENUMS::COREPERMISSIONS::COMPONENTREMOVE, m_permissions[ENUMS::COREPERMISSIONS::COMPONENTREMOVE])); + shape->setPermission(std::pair + (ENUMS::COREPERMISSIONS::COMPONENTSWAP, m_permissions[ENUMS::COREPERMISSIONS::COMPONENTSWAP])); + shape->setPermission(std::pair + (ENUMS::COREPERMISSIONS::COMPONENTROTATE, m_permissions[ENUMS::COREPERMISSIONS::COMPONENTROTATE])); + + //update the shape + shape->updateAttributes(m_currentFrameNumber); +} + +/*********************************************************************//** +*******************************SLOTS************************************* +*************************************************************************/ + +/** +* updates componentshapes, deletes all if tracking data empty and creates new if new trajectories were added +* componentshapes are children of this view (see qt's parent-child-system) +*/ void TrackedComponentView::updateShapes(uint framenumber) { m_currentFrameNumber = framenumber; IModelTrackedTrajectory *all = dynamic_cast(getModel()); - if (!all || all->size() == 0){ + if (!all || all->size() == 0) { //if root is nullptr, delete all children - foreach (auto child, this->childItems()){ + foreach(auto child, this->childItems()) { delete child; } return; } - + //update each shape; shape hides itself if trajectory is empty or not existant or currentchild - foreach(auto child, this->childItems()){ + foreach(auto child, this->childItems()) { ComponentShape* shape = dynamic_cast(child); - if(shape){ + if (shape) { shape->updateAttributes(m_currentFrameNumber); } } + // check for new trajectories; for each create a new shape + if (this->childItems().size() < all->size()) { - //if #shapes smaller than #validtracks add new shapes - //int validTracks = all->validCount(); - - // if (this->childItems().size() < validTracks) { - // int childrenCount = this->childItems().size(); - // // iterate over trajectories form back to increase performance - // for (int i = all->size()-1; i >= 0 && this->childItems().size() < validTracks; i--) { - // IModelTrackedTrajectory* trajectory = dynamic_cast(all->getChild(i)); - // //trajectory must not be null, must be valid, and must not be already visualized - // if (trajectory && trajectory->getValid() && !checkTrajectory(trajectory)) { - // ComponentShape* newShape = new ComponentShape(this, trajectory, trajectory->getId()); - // connectShape(newShape); - // } - // else { - // //qDebug() << "error: no trajectory valid -> no shape created"; - // } - // } - // } - - if (this->childItems().size() < all->size()){ //iterate over trajectories from back to increase performance - for (int i = all->size()-1; i >= 0 && this->childItems().size() < all->size(); i--) { + for (int i = all->size() - 1; i >= 0 && this->childItems().size() < all->size(); i--) { IModelTrackedTrajectory* trajectory = dynamic_cast(all->getChild(i)); + //check if trajectory already has shape object - if(trajectory && !checkTrajectory(trajectory)){ + if (trajectory && !checkTrajectory(trajectory)) { ComponentShape* newShape = new ComponentShape(this, trajectory, trajectory->getId()); - connectShape(newShape); + connectShape(newShape); } - else{ + else { //already there or nullptr } + //all trajectories already have shapes - if(all->size() == this->childItems().size()){ + if (all->size() == this->childItems().size()) { continue; } } } } -// gets triggered when one or more shape is moved; emits move signal to tracker for all selected shapes -// TODO this way cause i don't see a better way to get drop-event for not clicked shapes (they dont get mouseevents if multiple shapes are selected) +/** +* gets triggered when one or more shape is moved; emits move signal to tracker for all selected shapes +* if not broadcasted, only the position of actually moved componentshape is saved in tracking data +* the rest would be reset after update +*/ void TrackedComponentView::receiveBroadcastMove() { QList allSelectedItems = this->scene()->selectedItems(); @@ -250,18 +357,20 @@ void TrackedComponentView::receiveBroadcastMove() if (shape) { if (shape->isSelected()) { IModelTrackedTrajectory* shapeTrajectory = shape->getTrajectory(); - shape->emitMoveElement(shapeTrajectory,shape->getOldPos() + QPoint(shape->m_w / 2, shape->m_h / 2), shape->pos().toPoint() + QPoint(shape->m_w / 2, shape->m_h / 2), m_currentFrameNumber, numberSelectedEntitiesToMove); + //calculate the current pos and emit it to the commands component + shape->emitMoveElement(shapeTrajectory, shape->getOldPos() + QPoint(shape->m_w / 2, shape->m_h / 2), + shape->pos().toPoint() + + QPoint(shape->m_w / 2, shape->m_h / 2), m_currentFrameNumber, numberSelectedEntitiesToMove); numberSelectedEntitiesToMove--; } } } } -//TODO make area descriptor invisible too void TrackedComponentView::receiveViewSwitch(bool lever) { this->setVisible(lever); - + QList childrenItems = this->childItems(); QGraphicsItem* childItem; foreach(childItem, childrenItems) { @@ -380,33 +489,33 @@ void TrackedComponentView::receiveTracingTimeDegradation(QString degradation) } } -//TODO use signals not direct calls void TrackedComponentView::receiveColorChangeBrushAll() { QList childrenItems = this->childItems(); QGraphicsItem* childItem; - const QColorDialog::ColorDialogOptions options = QFlag(QColorDialog::ShowAlphaChannel || QColorDialog::DontUseNativeDialog); - QColor color = QColorDialog::getColor(Qt::white, nullptr, QString("Choose fill color"), options); -// QColorDialog* cDialog = new QColorDialog(Qt::white); -// cDialog->show(); -// cDialog->activateWindow(); -// cDialog->raise(); -// cDialog->setFocus(); - - foreach(childItem, childrenItems) { + const QColorDialog::ColorDialogOptions options = QFlag(QColorDialog::ShowAlphaChannel + || QColorDialog::DontUseNativeDialog); + QColor color = QColorDialog::getColor(Qt::white, nullptr, QString("Choose fill color"), options); + // QColorDialog* cDialog = new QColorDialog(Qt::white); + // cDialog->show(); + // cDialog->activateWindow(); + // cDialog->raise(); + // cDialog->setFocus(); + + foreach(childItem, childrenItems) { ComponentShape* childShape = dynamic_cast(childItem); if (childShape) { - childShape->changeBrushColor(color); + childShape->changeBrushColor(color); } } } -//TODO use signals not direct calls void TrackedComponentView::receiveColorChangeBorderAll() -{ +{ QList childrenItems = this->childItems(); QGraphicsItem* childItem; - QColor color = QColorDialog::getColor(Qt::white, nullptr, QString("Choose border color"), QColorDialog::ShowAlphaChannel);; + QColor color = QColorDialog::getColor(Qt::white, nullptr, + QString("Choose border color"), QColorDialog::ShowAlphaChannel); foreach(childItem, childrenItems) { ComponentShape* childShape = dynamic_cast(childItem); if (childShape) { @@ -419,7 +528,8 @@ void TrackedComponentView::receiveColorChangeBorderSelected() { QList childrenItems = this->childItems(); QGraphicsItem* childItem; - QColor color = QColorDialog::getColor(Qt::white, nullptr, QString("Choose border color"), QColorDialog::ShowAlphaChannel);; + QColor color = QColorDialog::getColor(Qt::white, nullptr, + QString("Choose border color"), QColorDialog::ShowAlphaChannel); foreach(childItem, childrenItems) { ComponentShape* childShape = dynamic_cast(childItem); if (childShape && childShape->isSelected()) { @@ -432,7 +542,8 @@ void TrackedComponentView::receiveColorChangeBrushSelected() { QList childrenItems = this->childItems(); QGraphicsItem* childItem; - QColor color = QColorDialog::getColor(Qt::white, nullptr, QString("Choose fill color"), QColorDialog::ShowAlphaChannel);; + QColor color = QColorDialog::getColor(Qt::white, nullptr, + QString("Choose fill color"), QColorDialog::ShowAlphaChannel);; foreach(childItem, childrenItems) { ComponentShape* childShape = dynamic_cast(childItem); if (childShape && childShape->isSelected()) { @@ -452,69 +563,14 @@ void TrackedComponentView::receiveSelectAll() } } -void TrackedComponentView::mousePressEvent(QGraphicsSceneMouseEvent *event) { - // right clicking the view unselects all selected items so do this to avoid this behaviour - if (event->button() != Qt::LeftButton) { - event->accept(); - return; - } - QGraphicsItem::mousePressEvent(event); -} - -void TrackedComponentView::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) -{ - - lastClickedPos = event->pos().toPoint(); - - QMenu menu; - - - // create the info box - QWidgetAction* infoBox = new QWidgetAction(this); - QString info = QString("Position (x,y) : "); - info.append(QString("(" + QString::number(lastClickedPos.x()) + ", " + QString::number(lastClickedPos.y()) + ")")); - QLabel* infoLabel = new QLabel(info); - infoLabel->setWordWrap(true); - infoLabel->setStyleSheet("QLabel {font-weight: bold; text-align: center}"); - infoLabel->setAlignment(Qt::AlignCenter); - infoBox->setDefaultWidget(infoLabel); - menu.addAction(infoBox); - menu.addSeparator(); - QAction *addComponentAction = menu.addAction("Add trajectory here", dynamic_cast(this), SLOT(addTrajectory())); - QAction *swapIdsAction = menu.addAction("Swap ID's", dynamic_cast(this), SLOT(swapIds())); - QAction *unmarkAllAction = menu.addAction("Unmark all...", dynamic_cast(this), SLOT(unmarkAll())); - QAction *removeSelectedAction = menu.addAction("Remove selected trajectories", dynamic_cast(this), SLOT(removeTrajectories())); - - - // manage permissions - addComponentAction->setEnabled(m_permissions[ENUMS::COREPERMISSIONS::COMPONENTADD]); - swapIdsAction->setEnabled(m_permissions[ENUMS::COREPERMISSIONS::COMPONENTSWAP]); - removeSelectedAction->setEnabled(m_permissions[ENUMS::COREPERMISSIONS::COMPONENTREMOVE]); - - // manage swapping - swapIdsAction->setEnabled(false); - QList allSelectedItems = this->scene()->selectedItems(); - // check if two shapes are selected - if (allSelectedItems.size() == 2 && dynamic_cast(allSelectedItems[0]) && dynamic_cast(allSelectedItems[1])) { - ComponentShape* selectedItem0 = dynamic_cast(allSelectedItems[0]); - ComponentShape* selectedItem1 = dynamic_cast(allSelectedItems[1]); - // check if both shapes are swappable (check permission for each shape) and general permission - if (selectedItem0->isSwappable() && selectedItem1->isSwappable() && m_permissions[ENUMS::COREPERMISSIONS::COMPONENTSWAP]) { - swapIdsAction->setEnabled(true); - } - } - - // execute menu - QAction *selectedAction = menu.exec(event->screenPos()); - lastClickedPos = QPoint(0, 0); -} +///////////////////////context menu action slots/////////////// void TrackedComponentView::addTrajectory() { IModelTrackedTrajectory *all = dynamic_cast(getModel()); int id = -1; if (all) { - id = all->size()+1; + id = all->size() + 1; } if (id <= 0) { @@ -536,18 +592,18 @@ void TrackedComponentView::addTrajectory() void TrackedComponentView::swapIds() { QList allSelectedItems = this->scene()->selectedItems(); - if(allSelectedItems.size() != 2){ + if (allSelectedItems.size() != 2) { qWarning() << "There need to be exactly two tracks selected to swap ID's!"; return; } ComponentShape* shape0 = dynamic_cast(allSelectedItems[0]); ComponentShape* shape1 = dynamic_cast(allSelectedItems[1]); - if(shape0 && shape1 && shape0->isSwappable() && shape1->isSwappable()){ + if (shape0 && shape1 && shape0->isSwappable() && shape1->isSwappable()) { IModelTrackedTrajectory* trajectory0 = dynamic_cast(shape0->getTrajectory()); IModelTrackedTrajectory* trajectory1 = dynamic_cast(shape1->getTrajectory()); emitSwapIds(trajectory0, trajectory1); } - else{ + else { qWarning() << "Selected objects are not swappable"; } } @@ -556,7 +612,7 @@ void TrackedComponentView::removeTrajectories() { QList allSelectedItems = this->scene()->selectedItems(); QGraphicsItem* item; - foreach (item, allSelectedItems) { + foreach(item, allSelectedItems) { ComponentShape* shape = dynamic_cast(item); if (shape) { shape->removeTrack(); @@ -575,55 +631,15 @@ void TrackedComponentView::unmarkAll() { } } -void TrackedComponentView::connectShape(ComponentShape* shape) { - CoreParameter* coreParams = dynamic_cast(dynamic_cast(getController())->getCoreParameter()); - - //set type - //TODO bad code clean up - IModelTrackedTrajectory* trajectory = shape->getTrajectory(); - - IModelTrackedPoint* point = dynamic_cast(trajectory->getChild(m_currentFrameNumber)); - if (point) { shape->setData(1, "point"); } - IModelTrackedEllipse* ellipse = dynamic_cast(trajectory->getChild(m_currentFrameNumber)); - if (ellipse) { shape->setData(1, "ellipse"); } - IModelTrackedRectangle* rectangle = dynamic_cast(trajectory->getChild(m_currentFrameNumber)); - if (rectangle) { shape->setData(1, "rectangle"); } - IModelTrackedPolygon* polygon = dynamic_cast(trajectory->getChild(m_currentFrameNumber)); - if (polygon) { shape->setData(1, "polygon"); } - - - //connect slots/signals - QObject::connect(shape, SIGNAL(emitRemoveTrajectory(IModelTrackedTrajectory*)), dynamic_cast(this->getController()), SLOT(receiveRemoveTrajectory(IModelTrackedTrajectory*)), Qt::DirectConnection); - QObject::connect(shape, SIGNAL(emitRemoveTrackEntity(IModelTrackedTrajectory*, uint)), dynamic_cast(this->getController()), SLOT(receiveRemoveTrackEntity(IModelTrackedTrajectory*, uint)), Qt::DirectConnection); - QObject::connect(shape, SIGNAL(emitMoveElement(IModelTrackedTrajectory*,QPoint, QPoint, uint, int)), dynamic_cast(this->getController()), SLOT(receiveMoveElement(IModelTrackedTrajectory*, QPoint, QPoint, uint, int)), Qt::DirectConnection); - QObject::connect(shape, SIGNAL(emitToggleFixTrack(IModelTrackedTrajectory*, bool)), dynamic_cast(this->getController()), SLOT(receiveToggleFixTrack(IModelTrackedTrajectory*,bool)), Qt::DirectConnection); - QObject::connect(shape, SIGNAL(emitEntityRotation(IModelTrackedTrajectory*, double, double, uint)), dynamic_cast(this->getController()), SIGNAL(emitEntityRotation(IModelTrackedTrajectory*, double, double, uint)), Qt::DirectConnection); - QObject::connect(shape, &ComponentShape::emitGoToFrame, dynamic_cast(this->getController()), &ControllerTrackedComponentCore::emitGoToFrame, Qt::DirectConnection); - - - QObject::connect(shape, SIGNAL(broadcastMove()), this, SLOT(receiveBroadcastMove()), Qt::DirectConnection); - - //set the shapes members - shape->m_currentFramenumber = m_currentFrameNumber; - shape->setMembers(coreParams); - - //set permissions - shape->setPermission(std::pair(ENUMS::COREPERMISSIONS::COMPONENTMOVE, m_permissions[ENUMS::COREPERMISSIONS::COMPONENTMOVE])); - shape->setPermission(std::pair(ENUMS::COREPERMISSIONS::COMPONENTREMOVE, m_permissions[ENUMS::COREPERMISSIONS::COMPONENTREMOVE])); - shape->setPermission(std::pair(ENUMS::COREPERMISSIONS::COMPONENTSWAP, m_permissions[ENUMS::COREPERMISSIONS::COMPONENTSWAP])); - shape->setPermission(std::pair(ENUMS::COREPERMISSIONS::COMPONENTROTATE, m_permissions[ENUMS::COREPERMISSIONS::COMPONENTROTATE])); - - //update the shape - shape->updateAttributes(m_currentFrameNumber); -} +/////////////////////////////////////////////////////// -bool TrackedComponentView::checkTrajectory(IModelTrackedTrajectory* trajectory){ +bool TrackedComponentView::checkTrajectory(IModelTrackedTrajectory* trajectory) { bool isVisualized = false; for (int i = 0; i < this->childItems().size(); i++) { ComponentShape* shape = dynamic_cast(this->childItems()[i]); if (shape) { - if(shape->getTrajectory() == trajectory){ + if (shape->getTrajectory() == trajectory) { isVisualized = true; break; } diff --git a/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.h b/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.h index 71e3d545..9790bdd9 100644 --- a/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.h +++ b/BioTracker/CoreApp/BioTracker/View/TrackedComponentView.h @@ -11,7 +11,10 @@ #include "View/ComponentShape.h" /** -* This class inherits from the IViewTrackedComponent class and is therefor part of the Composite Pattern. +* This class inherits from the IViewTrackedComponent class and is therefore part of the Composite Pattern. +* This view is visualized in the media panel of the main window on top of the loaded medium. +* It creates a component shape for each trajectory. The component shape is the visualized current entity of the trajectory. +* Each time the tracking plugins singals tracking done to the core app, all component shapes are updated (updateshapes(framnumber)) */ class TrackedComponentView : public IViewTrackedComponent { @@ -23,74 +26,152 @@ class TrackedComponentView : public IViewTrackedComponent public: QRectF boundingRect() const override; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; - + + ///creates initial componentshapes void createChildShapesAtStart(); + + /// connect a newly created component shape to all slots it needs and set permissions void connectShape(ComponentShape* shape); + + // check if trajectory already has corresponding component shape bool checkTrajectory(IModelTrackedTrajectory* trajectory); - + // IView interface void setPermission(std::pair permission); + /** + * SIGNALS + */ signals: void emitUpdateCornersChanged(int id, int relX, int relY); + + /// signal to commands component to add a new trajectory void emitAddTrajectory(QPoint pos, int id); + + /// signal to commands component to swap ID's of two trajectories void emitSwapIds(IModelTrackedTrajectory* trajectory0, IModelTrackedTrajectory* trajectory1); + /** + * SLOTS + */ + public slots: // IViewTrackedComponent interface -public slots: void getNotified() override; + + /// updates dimensions on load of new medium void rcvDimensionUpdate(int x, int y); - // contextmenu actions + + ////////////// contextmenu actions (must be parameterless because Qt actions require it) + + /// add a new trajectory --> view updates componentshapes and generates a new component shape for that trajectory void addTrajectory(); + + /// swap id's of excatcly two selected trajectories --> also componetshapes void swapIds(); + + /// remove all selected trajectories --> also removes componentshapes void removeTrajectories(); + + /// unmark all component shapes (border from fat to slim) void unmarkAll(); - // update shapes when receiving tracking done + + ////////////////////////////////////////////////////////////////////////////// + + /// update shapes when receiving tracking done void updateShapes(uint framenumber); - //Move Tracks + + /// broadcast the movment to all selected componentshapes so they are moved too void receiveBroadcastMove(); + + /// receive toggle to hide or show the view and all its component shapes void receiveViewSwitch(bool lever); - //Select all tracks + + /// select all tracks void receiveSelectAll(); - //Track dimensions + + /* + * set dimensions of componentshapes + */ + + /// set dimensions for all component shapes void receiveTrackDimensionsAll(int width, int height); + + /// set dimensions for selected component shapes void receiveTrackDimensionsSelected(int width, int height); - void receiveTrackOrientationLine(bool toggle); - void receiveTrackShowId(bool toggle); + + /// set dimensions for to default for all componentshapes void receiveTrackDimensionsSetDefault(); - //Track ignore zoom - void receiveIgnoreZoom(bool toggle); - //Track color + + /* + * Change Color of componentshapes + */ + + /// open color dialog and set border color for all componentshapes void receiveColorChangeBorderAll(); + + /// open color dialog and set border color for selected componentshapes void receiveColorChangeBorderSelected(); + + /// open color dialog and set fill color for all componentshapes void receiveColorChangeBrushAll(); + + /// open color dialog and set fill color for all componentshapes void receiveColorChangeBrushSelected(); - //Tracing + + /* + * Tracing of componentshapes + */ + + /// set tracing history length for all componentshapes void receiveTracingHistoryLength(int history); + + /// set tracing style for all componentshapes void receiveTracingStyle(QString style); + + /// set tracing steps for all componentshapes void receiveTracingSteps(int steps); + + /// set tracing time degradation style for all componentshapes void receiveTracingTimeDegradation(QString degradation); + + /// toggle show framenumber of tracers for all componentshapes void receiveTracerFrameNumber(bool toggle); - //Tracing dimensions + + /// set tracing proportions for all componentshapes void receiveTracerProportions(float proportion); + + /// set tracer orientation line for all componentshapes void receiveTracerOrientationLine(bool toggle); - //Visual + /* + * Misc + */ + + /// toggle antialiasing for all componentshapes void receiveToggleAntialiasingEntities(bool toggle); + /// set ignore zoom for all componentshapes (unused) + void receiveIgnoreZoom(bool toggle); + + /// toggle orientation line for all component shapes + void receiveTrackOrientationLine(bool toggle); + + /// toggle show id for all component shapes + void receiveTrackShowId(bool toggle); public: + /// updates tracking data model when new trakcing plugin is loaded void setNewModel(IModel *model) override { setModel(model); }; private: - QRectF m_boundingRect; + QRectF m_boundingRect; /**< bounding rect of the view */ - std::map> _rectification; - QGraphicsItem *_watchingDrag = nullptr; - int _dragX = 0; - int _dragY = 0; - std::map m_permissions; - QPoint lastClickedPos; + std::map> _rectification; /**< id of the component */ + QGraphicsItem *_watchingDrag = nullptr; /**< unused drag bool */ + int _dragX = 0; /**< unused drag x-coordinate */ + int _dragY = 0; /**< unused drag y-coordinate */ + std::map m_permissions; /**< list of permissions to set for new component shapes */ + QPoint lastClickedPos; /**< last clicked position in the view */ // QGraphicsItem interface protected: @@ -98,22 +179,11 @@ public slots: bool eventFilter(QObject * target, QEvent * event) override; void hoverEnterEvent(QGraphicsSceneHoverEvent *event) override; void hoverLeaveEvent(QGraphicsSceneHoverEvent *event) override; - //void mouseMoveEvent(QGraphicsSceneMouseEvent * event) override; - - /*void dragEnterEvent(QGraphicsSceneDragDropEvent *event) override; - void dropEvent(QGraphicsSceneDragDropEvent *event) override;*/ - QVariant itemChange(GraphicsItemChange change, const QVariant &value) override; - void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override; void mousePressEvent(QGraphicsSceneMouseEvent *event); - //member - bool permissionAdd; - bool permissionSwap; - - int m_currentFrameNumber = 0; - //QGraphicsTextItem* _cursorPosText; + int m_currentFrameNumber = 0; /**< current visualized framenumber of the medium */ }; #endif // TRACKEDCOMPONENTVIEW_H diff --git a/BioTracker/CoreApp/BioTracker/View/Utility/RotationHandle.cpp b/BioTracker/CoreApp/BioTracker/View/Utility/RotationHandle.cpp index 044247af..b487bb13 100644 --- a/BioTracker/CoreApp/BioTracker/View/Utility/RotationHandle.cpp +++ b/BioTracker/CoreApp/BioTracker/View/Utility/RotationHandle.cpp @@ -6,7 +6,6 @@ #include "QGraphicsScene" #include "qdebug.h" - RotationHandle::RotationHandle(QPoint origin, QAbstractGraphicsShapeItem* parent) : QAbstractGraphicsShapeItem(parent), _origin(origin) { @@ -28,7 +27,7 @@ QRectF RotationHandle::boundingRect() const void RotationHandle::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget) { - if(m_antialiasing){ + if (m_antialiasing) { painter->setRenderHint(QPainter::Antialiasing); } painter->setPen(this->pen()); @@ -44,10 +43,10 @@ void RotationHandle::mousePressEvent(QGraphicsSceneMouseEvent * event) if (event->button() == Qt::LeftButton) { // handle left mouse button here - //unselect all selected items so they wont get moved + //unselect all selected items so this can be moved QList allSelectedItems = scene()->selectedItems(); QGraphicsItem* item; - foreach (item, allSelectedItems) { + foreach(item, allSelectedItems) { item->setSelected(false); } @@ -83,7 +82,7 @@ void RotationHandle::mouseMoveEvent(QGraphicsSceneMouseEvent * event) double angleDeg = qRadiansToDegrees(angleRad); Q_EMIT emitShapeRotation(angleDeg); - + update(); //pass on diff --git a/BioTracker/CoreApp/BioTracker/View/Utility/RotationHandle.h b/BioTracker/CoreApp/BioTracker/View/Utility/RotationHandle.h index 20174687..688f5fa1 100644 --- a/BioTracker/CoreApp/BioTracker/View/Utility/RotationHandle.h +++ b/BioTracker/CoreApp/BioTracker/View/Utility/RotationHandle.h @@ -5,29 +5,35 @@ #include "QGraphicsObject" - +/** +* This class inherits QAbstractGraphicsShapeItem. +* It is a child of an componentshape and is used to rotate it. +* (the rotation then gets forwarded to the command compontent, +* which then forwards it to the tracking plugin +* It is attached to the end of the orientation line of the component shape +*/ class RotationHandle : public QObject, public QAbstractGraphicsShapeItem { Q_OBJECT - public: - RotationHandle(QPoint origin, QAbstractGraphicsShapeItem* parent = 0); - ~RotationHandle(); +public: + RotationHandle(QPoint origin, QAbstractGraphicsShapeItem* parent = 0); + ~RotationHandle(); - QRectF boundingRect() const override; - void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; + QRectF boundingRect() const override; + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; - void mousePressEvent(QGraphicsSceneMouseEvent * event) override; - void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override; - void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; + void mousePressEvent(QGraphicsSceneMouseEvent * event) override; + void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override; + void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; - void setAntialiasing(bool toggle); + void setAntialiasing(bool toggle); - signals: - void emitShapeRotation(double angle, bool rotateEntity = false); +signals: + void emitShapeRotation(double angle, bool rotateEntity = false); - private: - QPoint _origin; - bool m_antialiasing; +private: + QPoint _origin; /**< the position in the coordinate frame of the shape object */ + bool m_antialiasing; /**< if true, antialiasing is enabled */ }; #endif // ROTATIONHANDLE_H \ No newline at end of file diff --git a/BioTracker/CoreApp/BioTracker/View/Utility/SwitchButton.cpp b/BioTracker/CoreApp/BioTracker/View/Utility/SwitchButton.cpp index 4f46b385..c45a833a 100644 --- a/BioTracker/CoreApp/BioTracker/View/Utility/SwitchButton.cpp +++ b/BioTracker/CoreApp/BioTracker/View/Utility/SwitchButton.cpp @@ -2,8 +2,8 @@ #include "QPainter" #include "QMouseEvent" -void SwitchButton::setHeight(int h){ - _height = h - 2 * _margin; +void SwitchButton::setHeight(int h) { + _height = h - 2 * _margin; } SwitchButton::SwitchButton(QString s0, QString s1, QWidget *parent) : QAbstractButton(parent), @@ -16,45 +16,46 @@ _anim(new QPropertyAnimation(this, "offset", this)), _s0(s0), _s1(s1) { - setOffset(_height / 2); - _y = _height / 2; - setBrush(QColor("#009688")); + setOffset(_height / 2); + _y = _height / 2; + setBrush(QColor("#009688")); }; void SwitchButton::paintEvent(QPaintEvent *e) { - QPainter p(this); - p.setPen(Qt::NoPen); - if (isEnabled()) { + QPainter p(this); + p.setPen(Qt::NoPen); + if (isEnabled()) { - //background rect - //p.setBrush(_switch ? brush() : Qt::black); - p.setBrush(_switch ? Qt::green : Qt::red); - //p.setOpacity(_switch ? 0.5 : 0.38); - p.setOpacity(0.5); - p.setRenderHint(QPainter::Antialiasing, true); - p.drawRoundedRect(QRect(_margin, _margin, width() - 2 * _margin, height() - 2 * _margin), 8.0, 8.0); + //background rect + //p.setBrush(_switch ? brush() : Qt::black); + p.setBrush(_switch ? Qt::green : Qt::red); + //p.setOpacity(_switch ? 0.5 : 0.38); + p.setOpacity(0.5); + p.setRenderHint(QPainter::Antialiasing, true); + p.drawRoundedRect(QRect(_margin, _margin, width() - 2 * _margin, height() - 2 * _margin), 8.0, 8.0); - //handle - p.setBrush(_thumb); - p.setOpacity(1.0); - p.drawEllipse(QRectF(offset() - (_height / 2), _y - (_height / 2), height(), height())); + //handle + p.setBrush(_thumb); + p.setOpacity(1.0); + p.drawEllipse(QRectF(offset() - (_height / 2), _y - (_height / 2), height(), height())); - //text - p.setPen(Qt::black); - QFont font = p.font(); - font.setPixelSize(height() - 3 * _margin); - p.setFont(font); - QRectF textRect = QRectF(_margin, _margin, width() - 2 * _margin, height() - 2 * _margin); - p.drawText(textRect, Qt::AlignHCenter | Qt::AlignVCenter, _switch ? _s1: _s0); - } else { - p.setRenderHint(QPainter::Antialiasing, true); - p.setBrush(Qt::black); - p.setOpacity(0.12); - p.drawRoundedRect(QRect(_margin, _margin, width() - 2 * _margin, height() - 2 * _margin), 8.0, 8.0); - p.setOpacity(1.0); - p.setBrush(QColor("#BDBDBD")); - p.drawEllipse(QRectF(offset() - (_height / 2), _y - (_height / 2), height(), height())); + //text + p.setPen(Qt::black); + QFont font = p.font(); + font.setPixelSize(height() - 3 * _margin); + p.setFont(font); + QRectF textRect = QRectF(_margin, _margin, width() - 2 * _margin, height() - 2 * _margin); + p.drawText(textRect, Qt::AlignHCenter | Qt::AlignVCenter, _switch ? _s1 : _s0); + } + else { + p.setRenderHint(QPainter::Antialiasing, true); + p.setBrush(Qt::black); + p.setOpacity(0.12); + p.drawRoundedRect(QRect(_margin, _margin, width() - 2 * _margin, height() - 2 * _margin), 8.0, 8.0); + p.setOpacity(1.0); + p.setBrush(QColor("#BDBDBD")); + p.drawEllipse(QRectF(offset() - (_height / 2), _y - (_height / 2), height(), height())); //text p.setPen(Qt::black); @@ -63,38 +64,39 @@ void SwitchButton::paintEvent(QPaintEvent *e) { p.setFont(font); QRectF textRect = QRectF(_margin, _margin, width() - 2 * _margin, height() - 2 * _margin); p.drawText(textRect, Qt::AlignHCenter | Qt::AlignVCenter, _switch ? _s1 : _s0); - } + } } void SwitchButton::mouseReleaseEvent(QMouseEvent *e) { - if (e->button() & Qt::LeftButton) { - _switch = _switch ? false : true; - animateSwitch(); + if (e->button() & Qt::LeftButton) { + _switch = _switch ? false : true; + animateSwitch(); - emitSetEnabled(_switch); - } - QAbstractButton::mouseReleaseEvent(e); + emitSetEnabled(_switch); + } + QAbstractButton::mouseReleaseEvent(e); } void SwitchButton::enterEvent(QEvent *e) { setCursor(Qt::PointingHandCursor); - QAbstractButton::enterEvent(e); + QAbstractButton::enterEvent(e); } -void SwitchButton::animateSwitch(){ - if (_switch) { - _anim->setStartValue(_height / 2); - _anim->setEndValue(width() - _height); - _anim->setDuration(240); - _anim->start(); - } else { - _anim->setStartValue(offset()); - _anim->setEndValue(_height / 2); - _anim->setDuration(240); - _anim->start(); - } +void SwitchButton::animateSwitch() { + if (_switch) { + _anim->setStartValue(_height / 2); + _anim->setEndValue(width() - _height); + _anim->setDuration(240); + _anim->start(); + } + else { + _anim->setStartValue(offset()); + _anim->setEndValue(_height / 2); + _anim->setDuration(240); + _anim->start(); + } } QSize SwitchButton::sizeHint() const { - return QSize(8 * (_height + _margin), _height + 2 * _margin); + return QSize(8 * (_height + _margin), _height + 2 * _margin); } \ No newline at end of file diff --git a/BioTracker/CoreApp/BioTracker/View/Utility/SwitchButton.h b/BioTracker/CoreApp/BioTracker/View/Utility/SwitchButton.h index a54be168..d71010db 100644 --- a/BioTracker/CoreApp/BioTracker/View/Utility/SwitchButton.h +++ b/BioTracker/CoreApp/BioTracker/View/Utility/SwitchButton.h @@ -6,44 +6,49 @@ #include "QAbstractButton" #include "QPropertyAnimation" +/** +* This class inherits QAbstractButton. +* It is an utility class to create android-like animated switches +* inspiration: https://stackoverflow.com/questions/14780517/toggle-switch-in-qt +*/ class SwitchButton : public QAbstractButton { - Q_OBJECT - Q_PROPERTY(int offset READ offset WRITE setOffset) - Q_PROPERTY(QBrush brush READ brush WRITE setBrush) - Q_PROPERTY(bool _switch READ state WRITE setState) - - public: - SwitchButton(QString s0, QString s1, QWidget* parent = 0); - //~SwitchButton(); - - QSize sizeHint() const override; - - void setHeight(int h); - int offset() const { return _x; } - void setOffset(int o) {_x = o; update();} - QBrush brush() const { return _brush;} - void setBrush(const QBrush &brsh) { _brush = brsh;} - bool state() const { return _switch;} - void setState(bool toggle) { _switch = toggle; animateSwitch(); update();} - - void animateSwitch(); - - signals: - void emitSetEnabled(bool toggle); - - protected: - void paintEvent(QPaintEvent* event) override; - void mouseReleaseEvent(QMouseEvent*) override; - void enterEvent(QEvent *e) override; - - - bool _switch; - qreal _opacity; - int _x, _y, _height, _margin; - QBrush _thumb, _track, _brush; - QPropertyAnimation *_anim = nullptr; - QString _s0; - QString _s1; + Q_OBJECT + Q_PROPERTY(int offset READ offset WRITE setOffset) + Q_PROPERTY(QBrush brush READ brush WRITE setBrush) + Q_PROPERTY(bool _switch READ state WRITE setState) + +public: + SwitchButton(QString s0, QString s1, QWidget* parent = 0); + //~SwitchButton(); + + QSize sizeHint() const override; + + void setHeight(int h); + int offset() const { return _x; } + void setOffset(int o) { _x = o; update(); } + QBrush brush() const { return _brush; } + void setBrush(const QBrush &brsh) { _brush = brsh; } + bool state() const { return _switch; } + void setState(bool toggle) { _switch = toggle; animateSwitch(); update(); } + + void animateSwitch(); + +signals: + void emitSetEnabled(bool toggle); + +protected: + void paintEvent(QPaintEvent* event) override; + void mouseReleaseEvent(QMouseEvent*) override; + void enterEvent(QEvent *e) override; + + + bool _switch; /**< state fo the switch */ + qreal _opacity; /**< opacity */ + int _x, _y, _height, _margin; /**< position and dimensions */ + QBrush _thumb, _track, _brush; + QPropertyAnimation *_anim = nullptr;/**< animation */ + QString _s0; /**< text in state 0 */ + QString _s1; /**< text in state 1 */ }; diff --git a/BioTracker/CoreApp/BioTracker/View/Utility/Tracer.cpp b/BioTracker/CoreApp/BioTracker/View/Utility/Tracer.cpp index ab88b82e..160bd3d0 100644 --- a/BioTracker/CoreApp/BioTracker/View/Utility/Tracer.cpp +++ b/BioTracker/CoreApp/BioTracker/View/Utility/Tracer.cpp @@ -7,11 +7,11 @@ #include "QGraphicsSceneContextMenuEvent" Tracer::Tracer(QVariant type, int frame, float orientation, QPointF pos, float w, float h, QPen pen, QBrush brush, QAbstractGraphicsShapeItem* parent) -:QAbstractGraphicsShapeItem(parent), _type(type.toString()), _frame(frame), _w(w), _h(h) + :QAbstractGraphicsShapeItem(parent), _type(type.toString()), _frame(frame), _w(w), _h(h) { - setPos(pos); - setPen(pen); - setBrush(brush); + setPos(pos); + setPen(pen); + setBrush(brush); setRotation(_h > _w ? -90 - orientation : -orientation); } @@ -21,16 +21,16 @@ Tracer::~Tracer() QRectF Tracer::boundingRect() const { - return QRect(-_w / 2, -_h / 2, _w, _h); + return QRect(-_w / 2, -_h / 2, _w, _h); } - + void Tracer::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { - painter->setPen(pen()); - painter->setBrush(brush()); + painter->setPen(pen()); + painter->setBrush(brush()); - if (_type == "point") { - int dim = _w <= _h? _w : _h; + if (_type == "point") { + int dim = _w <= _h ? _w : _h; painter->drawEllipse(QRect(-dim / 2, -dim / 2, dim, dim)); } else if (_type == "ellipse") { @@ -41,16 +41,21 @@ void Tracer::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QW painter->drawRect(QRect(-_w / 2, -_h / 2, _w, _h)); } + //default for polygon shape are point tracers for simplicity + else if (_type == "polygon") { + int dim = _w <= _h ? _w : _h; + painter->drawEllipse(QRect(-dim / 2, -dim / 2, dim, dim)); + } } void Tracer::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) { - QMenu menu; - menu.addAction("Go to frame ", dynamic_cast(this), SLOT(goToFrame())); - menu.exec(event->screenPos()); + QMenu menu; + menu.addAction("Go to frame ", dynamic_cast(this), SLOT(goToFrame())); + menu.exec(event->screenPos()); } void Tracer::goToFrame() { - Q_EMIT emitGoToFrame(_frame); + Q_EMIT emitGoToFrame(_frame); } diff --git a/BioTracker/CoreApp/BioTracker/View/Utility/Tracer.h b/BioTracker/CoreApp/BioTracker/View/Utility/Tracer.h index 76d0c6c4..fc35425a 100644 --- a/BioTracker/CoreApp/BioTracker/View/Utility/Tracer.h +++ b/BioTracker/CoreApp/BioTracker/View/Utility/Tracer.h @@ -5,34 +5,43 @@ #include "QAbstractGraphicsShapeItem" +/** +* This class inherits QAbstractGraphicsShapeItem. +* It is created by and an child of a componenntshape. +* It is a helper class used to visualize shape type tracers. +* It has a context menu to set medium to the tracer's frame +* Apart from the polygon it is visualized as the componentshapes +* current type. +*/ class Tracer : public QObject, public QAbstractGraphicsShapeItem { - Q_OBJECT - - public: - Tracer(QVariant type, int frame, float orientation, QPointF pos, float w, float h, QPen pen, QBrush brush, QAbstractGraphicsShapeItem* parent); - ~Tracer(); - signals: - void emitGoToFrame(int frame); - -public slots: - void goToFrame(); - - protected: - QRectF boundingRect() const override; - void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; - void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override; - - //void mousePressEvent(QGraphicsSceneMouseEvent * event) override; - //void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override; - //void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; - - //member - QString _type; - int _frame; - float _orientation; - QPointF pos; - float _w; - float _h; + Q_OBJECT + +public: + Tracer(QVariant type, int frame, float orientation, QPointF pos, + float w, float h, QPen pen, QBrush brush, QAbstractGraphicsShapeItem* parent); + ~Tracer(); +signals: + void emitGoToFrame(int frame); + + public slots: + + //signals the media player rewind to the tracer's frame + void goToFrame(); + +protected: + // Interface of QAbstractGraphicsShapeItem + QRectF boundingRect() const override; + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; + void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override; + + + //member + QString _type; /**< type visualized */ + int _frame; /**< corresponding frame */ + float _orientation; /**< orientation of tracer --> of corresponding entity */ + QPointF pos; /**< position in coordinateframe of parent shape object */ + float _w; /**< width */ + float _h; /**< height */ }; diff --git a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp b/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp index b7f80e0f..5271324e 100644 --- a/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp +++ b/BioTracker/CoreApp/BioTracker/View/VideoControllWidget.cpp @@ -9,50 +9,51 @@ #include VideoControllWidget::VideoControllWidget(QWidget* parent, IController* controller, IModel* model) : - IViewWidget(parent, controller, model), - ui(new Ui::VideoControllWidget) { - ui->setupUi(this); + IViewWidget(parent, controller, model), + ui(new Ui::VideoControllWidget) { + ui->setupUi(this); m_RecO = false; m_RecI = false; m_Paus = false; - m_iconPause.addFile(QStringLiteral("qrc:/Images/resources/pause-sign.png"), - QSize(), QIcon::Normal, QIcon::Off); - m_iconPlay.addFile(QStringLiteral("qrc:/Images/resources/arrow-forward1.png"), - QSize(), QIcon::Normal, QIcon::Off); + m_iconPause.addFile(QStringLiteral("qrc:/Images/resources/pause-sign.png"), + QSize(), QIcon::Normal, QIcon::Off); + m_iconPlay.addFile(QStringLiteral("qrc:/Images/resources/arrow-forward1.png"), + QSize(), QIcon::Normal, QIcon::Off); - ui->sld_video->setMinimum(0); + ui->sld_video->setMinimum(0); this->setSelectedView("Original"); - updateGeometry(); + updateGeometry(); } VideoControllWidget::~VideoControllWidget() { - delete ui; + delete ui; } void VideoControllWidget::setSelectedView(QString str) { - ControllerPlayer* controller = dynamic_cast(getController()); - controller->changeImageView(str); + ControllerPlayer* controller = dynamic_cast(getController()); + controller->changeImageView(str); } void VideoControllWidget::setVideoViewComboboxModel(QStringListModel* comboboxModel) { } void VideoControllWidget::getNotified() { - MediaPlayer* mediaPlayer = dynamic_cast(getModel()); + MediaPlayer* mediaPlayer = dynamic_cast(getModel()); - ui->actionNext_frame->setEnabled(mediaPlayer->getForwardState()); - ui->actionPrev_frame->setEnabled(mediaPlayer->getBackwardState()); - ui->actionPlay_Pause->setEnabled(mediaPlayer->getPlayState()); - ui->actionStop->setEnabled(mediaPlayer->getStopState()); + ui->actionNext_frame->setEnabled(mediaPlayer->getForwardState()); + ui->actionPrev_frame->setEnabled(mediaPlayer->getBackwardState()); + ui->actionPlay_Pause->setEnabled(mediaPlayer->getPlayState()); + ui->actionStop->setEnabled(mediaPlayer->getStopState()); - m_Paus = mediaPlayer->getPauseState(); + m_Paus = mediaPlayer->getPauseState(); - if (m_Paus) { - ui->actionPlay_Pause->setIcon(QIcon(":/Images/resources/pause-sign.png")); - } else { - ui->actionPlay_Pause->setIcon(QIcon(":/Images/resources/arrow-forward1.png")); - } + if (m_Paus) { + ui->actionPlay_Pause->setIcon(QIcon(":/Images/resources/pause-sign.png")); + } + else { + ui->actionPlay_Pause->setIcon(QIcon(":/Images/resources/arrow-forward1.png")); + } m_RecI = mediaPlayer->getRecIState(); if (m_RecI) { @@ -62,47 +63,47 @@ void VideoControllWidget::getNotified() { ui->actionRecord_cam->setIcon(QIcon(":/Images/resources/recordCam.png")); } - int currentFrameNr = mediaPlayer->getCurrentFrameNumber(); - int totalNumberOfFrames = mediaPlayer->getTotalNumberOfFrames(); - int mediaFps = mediaPlayer->getFpsOfSourceFile(); - //ui->frame_num_edit->setText(QString::number(currentFrameNr)); - ui->frame_num_spin->setMaximum(totalNumberOfFrames); - ui->frame_num_spin->setValue(currentFrameNr); - ui->sld_video->setValue(currentFrameNr); + int currentFrameNr = mediaPlayer->getCurrentFrameNumber(); + int totalNumberOfFrames = mediaPlayer->getTotalNumberOfFrames(); + int mediaFps = mediaPlayer->getFpsOfSourceFile(); + //ui->frame_num_edit->setText(QString::number(currentFrameNr)); + ui->frame_num_spin->setMaximum(totalNumberOfFrames); + ui->frame_num_spin->setValue(currentFrameNr); + ui->sld_video->setValue(currentFrameNr); + + QString currentVideoTime = QDateTime::fromMSecsSinceEpoch(((float)currentFrameNr / (float)mediaFps) * 1000).toUTC().toString("hh:mm:ss:zzz"); - QString currentVideoTime = QDateTime::fromMSecsSinceEpoch(((float)currentFrameNr / (float) mediaFps) * 1000).toUTC().toString("hh:mm:ss:zzz"); + ui->time_edit->setText(currentVideoTime); - ui->time_edit->setText(currentVideoTime); - - //Write current fps label every 1/2 second - std::chrono::system_clock::time_point now = std::chrono::system_clock::now(); - long long dt = std::chrono::duration_cast(now - lastFpsSet).count(); - int fps = mediaPlayer->getCurrentFPS(); - if (dt > 500 || fps <= 0){ - ui->lcd_currentFpsNum->display(fps); - lastFpsSet = now; + //Write current fps label every 1/2 second + std::chrono::system_clock::time_point now = std::chrono::system_clock::now(); + long long dt = std::chrono::duration_cast(now - lastFpsSet).count(); + int fps = mediaPlayer->getCurrentFPS(); + if (dt > 500 || fps <= 0) { + ui->lcd_currentFpsNum->display(fps); + lastFpsSet = now; // for average fps calculation _fpsSum += fps; _fpsCounter += 1; - } + } - ui->fps_label->setText(QString::number(mediaFps)); + ui->fps_label->setText(QString::number(mediaFps)); double cfps = mediaPlayer->getCurrentFPS(); - if(totalNumberOfFrames >= 1) { - ui->sld_video->setEnabled(true); - ui->sld_video->setMaximum(totalNumberOfFrames-1); - + if (totalNumberOfFrames >= 1) { + ui->sld_video->setEnabled(true); + ui->sld_video->setMaximum(totalNumberOfFrames - 1); + int intervalPower = floor(log10(totalNumberOfFrames)); - int tickInterval = pow(10, intervalPower > 0? floor(log10(totalNumberOfFrames))-1: 0); + int tickInterval = pow(10, intervalPower > 0 ? floor(log10(totalNumberOfFrames)) - 1 : 0); ui->sld_video->setTickInterval(tickInterval); - } + } } @@ -188,87 +189,88 @@ void VideoControllWidget::on_sld_video_actionTriggered(int action) * If the video slider is moved, this function sets the value to the current frame number lable */ void VideoControllWidget::on_sld_video_sliderMoved(int position) { - //ui->frame_num_edit->setText(QString::number(position)); - ui->frame_num_spin->setValue(position); - MediaPlayer* mediaPlayer = dynamic_cast(getModel()); - int mediaFps = mediaPlayer->getFpsOfSourceFile(); - QString currentVideoTime = QDateTime::fromMSecsSinceEpoch(((float)position / (float) mediaFps) * 1000).toUTC().toString("hh:mm:ss:zzz"); - ui->time_edit->setText(currentVideoTime); + //ui->frame_num_edit->setText(QString::number(position)); + ui->frame_num_spin->setValue(position); + MediaPlayer* mediaPlayer = dynamic_cast(getModel()); + int mediaFps = mediaPlayer->getFpsOfSourceFile(); + QString currentVideoTime = QDateTime::fromMSecsSinceEpoch(((float)position / (float)mediaFps) * 1000).toUTC().toString("hh:mm:ss:zzz"); + ui->time_edit->setText(currentVideoTime); } void VideoControllWidget::on_doubleSpinBoxTargetFps_editingFinished() { - double val = ui->doubleSpinBoxTargetFps->value(); - ControllerPlayer* controller = dynamic_cast(getController()); - controller->setTargetFps(val); + double val = ui->doubleSpinBoxTargetFps->value(); + ControllerPlayer* controller = dynamic_cast(getController()); + controller->setTargetFps(val); } -void VideoControllWidget::on_frame_num_spin_editingFinished(){ - int val = ui->frame_num_spin->value(); - ControllerPlayer* controller = dynamic_cast(getController()); - controller->setGoToFrame(val); +void VideoControllWidget::on_frame_num_spin_editingFinished() { + int val = ui->frame_num_spin->value(); + ControllerPlayer* controller = dynamic_cast(getController()); + controller->setGoToFrame(val); } //actions -void VideoControllWidget::on_actionPlay_Pause_triggered(bool checked){ - ControllerPlayer* controller = dynamic_cast(getController()); - - if (m_Paus) { - controller->pause(); - qDebug() << "The average fps of this run was: " << _fpsSum / _fpsCounter; - } else { - controller->play(); +void VideoControllWidget::on_actionPlay_Pause_triggered(bool checked) { + ControllerPlayer* controller = dynamic_cast(getController()); + + if (m_Paus) { + controller->pause(); + //qDebug() << "The average fps of this run was: " << _fpsSum / _fpsCounter; + } + else { + controller->play(); _fpsSum = 0; _fpsCounter = 0; - } + } } -void VideoControllWidget::on_actionStop_triggered(bool checked){ - ControllerPlayer* controller = dynamic_cast(getController()); - controller->stop(); +void VideoControllWidget::on_actionStop_triggered(bool checked) { + ControllerPlayer* controller = dynamic_cast(getController()); + controller->stop(); } -void VideoControllWidget::on_actionNext_frame_triggered(bool checked){ - ControllerPlayer* controller = dynamic_cast(getController()); - controller->nextFrame(); +void VideoControllWidget::on_actionNext_frame_triggered(bool checked) { + ControllerPlayer* controller = dynamic_cast(getController()); + controller->nextFrame(); } -void VideoControllWidget::on_actionPrev_frame_triggered(bool checked){ - ControllerPlayer* controller = dynamic_cast(getController()); - controller->prevFrame(); +void VideoControllWidget::on_actionPrev_frame_triggered(bool checked) { + ControllerPlayer* controller = dynamic_cast(getController()); + controller->prevFrame(); } -void VideoControllWidget::on_actionScreenshot_triggered(bool checked){ - ControllerPlayer* controller = dynamic_cast(getController()); - QString filePathStr = controller->takeScreenshot(); - QFileInfo fi(filePathStr); - QString filePathAbs = fi.absoluteFilePath(); - QString msgText = "The Screenshot has been saved to:\n " + filePathAbs; - - //QMessageBox::information(nullptr, "Screenshot taken!", msgText); - - QMessageBox msgBox; - msgBox.setText("You took a screenshot!"); - msgBox.setInformativeText(msgText); - msgBox.setStandardButtons(QMessageBox::Ok); - msgBox.setDefaultButton(QMessageBox::Ok); - QPushButton *goToFileDirButton = msgBox.addButton(tr("Show in folder"), QMessageBox::ActionRole); - QPushButton *openFileButton = msgBox.addButton(tr("Open screenshot"), QMessageBox::ActionRole); - - msgBox.setIcon(QMessageBox::Information); - msgBox.exec(); - - if (msgBox.clickedButton() == goToFileDirButton) { - QUrl fileDirUrl = QUrl::fromLocalFile(fi.absolutePath()); - QDesktopServices::openUrl(fileDirUrl); - } - else if (msgBox.clickedButton() == openFileButton){ - QUrl fileUrl = QUrl::fromLocalFile(filePathAbs); - QDesktopServices::openUrl(fileUrl); - } +void VideoControllWidget::on_actionScreenshot_triggered(bool checked) { + ControllerPlayer* controller = dynamic_cast(getController()); + QString filePathStr = controller->takeScreenshot(); + QFileInfo fi(filePathStr); + QString filePathAbs = fi.absoluteFilePath(); + QString msgText = "The Screenshot has been saved to:\n " + filePathAbs; + + //QMessageBox::information(nullptr, "Screenshot taken!", msgText); + + QMessageBox msgBox; + msgBox.setText("You took a screenshot!"); + msgBox.setInformativeText(msgText); + msgBox.setStandardButtons(QMessageBox::Ok); + msgBox.setDefaultButton(QMessageBox::Ok); + QPushButton *goToFileDirButton = msgBox.addButton(tr("Show in folder"), QMessageBox::ActionRole); + QPushButton *openFileButton = msgBox.addButton(tr("Open screenshot"), QMessageBox::ActionRole); + + msgBox.setIcon(QMessageBox::Information); + msgBox.exec(); + + if (msgBox.clickedButton() == goToFileDirButton) { + QUrl fileDirUrl = QUrl::fromLocalFile(fi.absolutePath()); + QDesktopServices::openUrl(fileDirUrl); + } + else if (msgBox.clickedButton() == openFileButton) { + QUrl fileUrl = QUrl::fromLocalFile(filePathAbs); + QDesktopServices::openUrl(fileUrl); + } } -void VideoControllWidget::on_actionRecord_cam_triggered(bool checked){ - ControllerPlayer* controller = dynamic_cast(getController()); +void VideoControllWidget::on_actionRecord_cam_triggered(bool checked) { + ControllerPlayer* controller = dynamic_cast(getController()); int success = controller->recordInput(); } -void VideoControllWidget::on_actionRecord_all_triggered(bool checked){ +void VideoControllWidget::on_actionRecord_all_triggered(bool checked) { ControllerPlayer* controller = dynamic_cast(getController()); int success = controller->recordOutput(); @@ -288,35 +290,35 @@ void VideoControllWidget::on_actionRecord_all_triggered(bool checked){ MainWindow* VideoControllWidget::getMainWindow() { - foreach(QWidget *widget, qApp->topLevelWidgets()) - if (MainWindow *mainWindow = dynamic_cast(widget)) - return mainWindow; - return NULL; + foreach(QWidget *widget, qApp->topLevelWidgets()) + if (MainWindow *mainWindow = dynamic_cast(widget)) + return mainWindow; + return NULL; } -void VideoControllWidget::setupVideoToolbar(){ - MainWindow* mw = getMainWindow(); - - if(mw){ - QToolBar* videoToolBar = mw->findChild("toolBarVideo"); - if(videoToolBar){ - - videoToolBar->addAction(ui->actionPrev_frame); - videoToolBar->addSeparator(); - videoToolBar->addAction(ui->actionPlay_Pause); - videoToolBar->addSeparator(); - videoToolBar->addAction(ui->actionStop); - videoToolBar->addSeparator(); - videoToolBar->addAction(ui->actionNext_frame); - videoToolBar->addSeparator(); - videoToolBar->addAction(ui->actionScreenshot); - videoToolBar->addSeparator(); - videoToolBar->addAction(ui->actionRecord_cam); - videoToolBar->addSeparator(); - videoToolBar->addAction(ui->actionRecord_all); - videoToolBar->addSeparator(); +void VideoControllWidget::setupVideoToolbar() { + MainWindow* mw = getMainWindow(); + + if (mw) { + QToolBar* videoToolBar = mw->findChild("toolBarVideo"); + if (videoToolBar) { + + videoToolBar->addAction(ui->actionPrev_frame); + videoToolBar->addSeparator(); + videoToolBar->addAction(ui->actionPlay_Pause); + videoToolBar->addSeparator(); + videoToolBar->addAction(ui->actionStop); + videoToolBar->addSeparator(); + videoToolBar->addAction(ui->actionNext_frame); + videoToolBar->addSeparator(); + videoToolBar->addAction(ui->actionScreenshot); + videoToolBar->addSeparator(); + videoToolBar->addAction(ui->actionRecord_cam); + videoToolBar->addSeparator(); + videoToolBar->addAction(ui->actionRecord_all); + videoToolBar->addSeparator(); videoToolBar->addWidget(ui->scrollAreaVideoInfo); - } - } + } + } } diff --git a/BioTracker/CoreApp/BioTracker/guiresources.qrc b/BioTracker/CoreApp/BioTracker/guiresources.qrc index 20571405..d0bed6c6 100644 --- a/BioTracker/CoreApp/BioTracker/guiresources.qrc +++ b/BioTracker/CoreApp/BioTracker/guiresources.qrc @@ -62,4 +62,7 @@ resources/logo/BT-3_non_transparent_rounded.ico resources/logo/BT-3_non_transparent_rounded.png + + resources/shortcuts.txt + diff --git a/BioTracker/CoreApp/BioTracker/resources/introduction/images/BioTracker.PNG b/BioTracker/CoreApp/BioTracker/resources/introduction/images/BioTracker.PNG index 62e6f7e5470e7c385840ece26ac2c54513d28f64..614c2c5b3ee5f45ed0130c93858255425476c7ef 100644 GIT binary patch literal 398996 zcmdSAXH-+&+BO=RfQ708QbLJhM?iWBO(7~pqoN>$rt~hMCkRMyB34R3nlwZ29i&5O z(gQ;1fzWG6a)Qs^``!E5@1HZyINuoG4@g^Ut~u{@m+QW+xkB}HG|!y8a1sCjoPlU* zJOTjdApijFAkzuzH+$W7%hVSd*GHOafFC`4OVkhama5vS06;Styrt>>-) z087*HA5E*{cMAZ3k`B>Oee7YpLh>xm7=1n*DbvEH@$du)oDaemaDJL6tM!Q%jd2C>0bJytjAYB z{PnV9q5l@dBVo}NBcvX5`d@E!=VM|(|Nh0FUs3`C|CeJgfPj|l*I59^8vbqKDag#w&zM+z-Nx zH}S}Sy;*6C^vg(Q*`uj`!a))7H@oGJ(;+q^8@`&0Wc~IdntgE2j<;DU*qE zuE@PBs7=bMfS1(`Ee;h829dqE{_eolpbLM$K~1adyH`O%4;o?;0ieJ$>amiRWXrvc zXk<09SeKYh&?UDA6UTlKt1(qM-pf#3x4Nkw>yW!;{9@Qa{nH{QlizN4;H zy8D6ZSju=EL^24p<~3YZ$tl|7mZ=L{A`_90FLRohWV;%o^<WUIX@Qv7Xmt0an@PP{Y~sG&4CPI6P!McSIMedn zu8QGsst@~Qth?r`E8TYqUhv4oYDIggLkTmS&IW^^qkJ+alZJk zo?Ag@aXtY;B^0B**LxnZX+Z~`x$^C1Q*vz*wkY)Y-_in>?*wJ%#F+gXxjY8d@8dn5 zXx{%N4Ndg?A53}w7iH)FuTwRpiD!f^lVMeL^^~39V3zBe2<>3De ziD~#L-at@QgPhSCclen779WGK5I`rRq5H;Z&ieUKZ^D(Tf_F}mNodn+n6+0ulK<(4 z6E}r~+MlYwWo4H(L8h*oW;S_Og}d7`mRIm#hVwrxxJxd4`Oo_1@G1XH4CrI@SXa$t zfzfZ1GmNqk?!!OBIk$x2%6Gu4Cf>@0wJn*6R*X2mGM@UuGuE7be;WYx~@ z_yem_ON`vr9)$=QpB6Ju$JQN3JfGx$L`u`@SvUdIK0#UE``Q<9BamT>`;Fh*ErUVi zHB;_*=*7NW`CXANVyO2$LmkBjV`FOH&7*Z=BNn7#U|)2H)!Go&QPQ-})u1)0XUE9i zQh$=?{om~7Iby0M0q-gkx&E0EhrOyL+{+CJHdP`DoxWnvDEnwE&j9nZaq#PK()i>X z5Y+nuF={ox?!QXfa=vR!T88@!Ik;qA+!f(CkC�nSOz-c}y&kzN3Fd7#CG6B&~WW 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

0&Pk?0D{yZb7M3*R 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êedDKh#q1iZ(zAH}WrX%k^ZgFSIqtYo=nYtQ9WaNc7di9sf9< zXcgKk+C1$;-+V0m&x*bVp_aR!w7kLGRxG*TtpriumS`LE;rh-$%428b{6dDVJJw6m z&D=?l_VK{N-*$1CI-i*>NC;h(Yc`rW>{=UbRup;hlbsU{05e>$72Kk3>P zG0bihH!yZV{oT3BblH0noi_znx^x@z_CF*6c74E)>sX~WIAja~R;UeAOEk6&Z3cbe zCc=bW@bFVkC$Z*$no76Vr?1+s{3(0qyy_-4a94`pSv5R$zD_N@vM@Fod0`uH4|46J z+O1Lzn-k#*jG6;53l%S^$R(i=nx=GtU#BQF276aE%AOGIJl1C7-Oox4yn47zoh28rmHxc=JRpDKC$vuuG zK}^CwX|w|Y*&R~ZutTc#F^`ZMzxC2e#V-C?+K!lQQ)8L^VjR#%K$_((Q!&%4{&BQ3 z?F}lUTCaUaWX^x?bdUd-K{h|Oe1JpXV_oXD#nhMRjk@}1jH4Hnj)Rr~^FI8^tuHtX z{04r>{lvPgw&>#id=4)Mugkc_HACK*%#d~=zOJz#?e&i{P@|j*>%F>oe7m&+K*^Kb z)!&&fhPYhWVtE#u%J$qdc$j{bP55f?soty2MCkWzX50l8#tUHG9$+ThQ;|xr8JF!h z=T%X4SP7oP=Q=ywv_BANQB=h$oxme8U?fIeK|8UuRc;o5n~ zQ@-HE3H+>`E3Tx)Vr&)~Kp3S(r2!(VS*_y$8eL)sPsZ+F3`n&lyqX;W7JPSs%&ClC z`=}YQ%48>c^}%`{ubozU-S{nc;l?WCj@bRs2!JhE6IhL`7E) zdN1egq*}b1K_|)O`Uxn~)qe+Ttqo?y;vKzSUuCI$m+vCpw^i;dBMKz*WU0d&o%8_Z zpYdim`{?ZR+W*MAZXd3au&kFs9@{1rZ0W4HjclgGhfiCYuSZQ|SYnf`2l|MZX<9mL0u}{X7OoR0Lw`qGo)l0FV3L zNtzpRKVwd72X+npYBC%B-u|kIaGdyaGLCN&+F4<{M0Q%zn4V2u4vN@zifE7ig4KU$ zLQ>H!#8@9FI(n^x^#wTOtepE+v5IO8*_rtX$V| zDK8{i@&78HE_p6Uao`WnY!xD1MYXyeqUQ!i zbX@e#F~j*12=F{6P^TOIeDz`hEPVI-+RgD^hcxBTp}n1A7~qkJp+94hu&au7AtUXA13E;^!m(Q5WM7VVvcYR85q#oXUAcF^=;}>Sg=bFvy`wjDs0hI7 zk^1SjBI|{^^a1wSutr++?3v*XZJJ_>sHU9|ZA~W4S|g56Tc_2}woW$KZNp~H(3atk zcoZSUK$pq$UkPs&?O3uw4fEJ1KRw=_UOa>^jJ01dFvo0gMLz{%caUQ+bofLdy9{Y( zpuX+>>EYrgKibkL`6R}D>6A`aQh>^Rl0ktDLLUW92o`y*(_QR8riq)%cXppqZtDCE zhPUWvQ!reocX}b(>PFn6_<4MBUBOg zrFz6MERr~+d}dgCbHO8S+Khs3EZnyJCN9hpSP9XPlQun=KWcNTcN+-9-Xl8UWkdw> z>a6Q`OZ5g`>%>wlmH{}o3-DTKc|zym6+~G znIt#I>%$?2zPsI z)in_CXyFR-R($6H6QZy?=vI!TMgVJhwN4XA(TCIwvv+ons{|1KC4?_R34EA4Gqb(i zPLlWT`a`xH%Rfx!3GovD2rY0V^u@(i@2Ok`ECQp7BAQ=CbRpZQBI;j`$7QM0%cm8= zE)8Bi2$A5fg2e~dE8nbkZqVs6P12+&bT~{WVXy95rQpn zcjtIjRb1BPFIv-r14t&dOI?8b2q-j3VY7#Mpidt$F{^?dNb*3JY|&d^yY z;V=22B?(n%@wx*<0G6r9Kw4hMOO`X3gCvdBr0Je4=wb-+71jvS#0IUP86IueBb@;+)_Vi|WdXOf z+E&y%A%jH%#HGL;(ls!bQ*&z==O`o#`?@sig317 z0SQeo{>o)2C#9esv5Vgi42e;|JixYFwy-B=VhB1N%aJmjIO1A`7#g!4-**%S!1xFE zFZ;>QUD7z&Rj1V+NYrc0elyI)?mh&M!1FAJg%VvijSm*vK^UQqU3hI@a%jhV- z_d!Y7M|K-{(sjYYx#A|-!4c)RZd?9WWtlQKH(9bJ|8K%arm9{}hL8&~q(+oY4Ca+U zkm;!C*(S(sBT8X_HO-58e?6#w$;tu=-6hi7IOCb31s}`gw>-gBYNMRzw0#fH!B=l8 z%w3XYOvUPkd}Ef~_eKBse0#`NRaZ;JC>d>h@-WpDIj~=t{%`Rz{2G;q1DrW2WNM8F z&Wm%i2e{0a=k;bl0z?12WkSi zD?O@}dcelwe)Bpf;^)4!&%VQ=zp%)k zU;^0R)l3Mo#Zto0jM?-0InP|Cd{1sq1PR&kB zBz(l4t5~aZ@nY^MQW%uRc<|szjdRQ2B)UD8cDrRPVi8i*_xHb#%1-%Cll1vVYoE!a z@gCP}Beh6`&EoU9QODMehjq)lLW!xHpf59k3i15YhituzBtWZ?)WLc1W>ot!UGj6Q zkhU?^c(#-MN(inE5_{9;93KdodAKIE8E>YE4F zg@HwqDr9(lvo>-ujxauYK!LM5|29wFZpd!hTp90Milcm6+aa|n9*QI0P0zbcL0aRw z{|waSE?<{t-p&3XP%Bg=ONq-FcEA|6{V_-iFIiJU&>5S_;TKO{=GVmuX;~Ma`9qFT zNK`B^dHYJdNKX0U^O&aeLUs2UqUt@UY$BoNnBG+4)qoEb#!K!BxMM`UJC60R>_dQ(MU&bkv`u9>Piw3`k!vqWSUL8DSy_%Y<0(#$)CfLL$ zOpQ{Z>Mj- z)OgDuNqWP!&&|Q8)kh#PIxV-4hT+3%ms&sO&&lSZu0m4>9;x5RqKJFDink~4Jv0XF zZ=_nandC-`7iUI(`86&_S<11hee>x-#L`J9hWTsl(qS4YD>|!#DZ6XUIRh761OtB7ZUxy*~bI!BepQWM)sj4arw(2sjYET!dEAbB7@3zU`*Zo)m1I?xCVQB0H&TZ4WUN#PK+$EKps|3g}vbNFf%kC?^ z7ry5%+Y$0gMQuB0yxM{sPckBl*rIn91aYEaTU`}QF`Iwje%;196>g0|n=`>pG(w~L z`YDMPF@CZ@iJVt@U%#xiy-R~?HwMOPI zcQ%}xcy%3M8jdwUnbd^jiQduK{`Po4zroyDd^)XXv(SGj{5^$}+Kvv*3Khh$XESw5 zZ1R#qvd}8I^A$m5j}xSETm`yV@*k)a^Wg>E>peGmj6DG>muH0~If9~>8Q6O(*b?;e zekYv(Kl+0+koqcDASO&E)ou2s2ze_Bw2IP`)m<#A1Q;aMa0g|He?mXg%tGvXSFUg< z-{+9JmbH|LMuqMmTZML4E{w!F=RY(>L@*|@AkrC)Hhvzyu7DaKB9;a)3b3&1#Yvsf zrCx$M^3KUi_SQXhhY6#Q@uv{07eW`Ek^@o3NAqPi)#(N9le(evb`{cF397tKoO#Z_ zlhKKS3#G7igD?+FVV9!AcNj;8-uByltQN#_)Dbc@5+LM|d(gSuK1KCE@k6$ z??-PBvH#ustMS9!k&Y0?-5G)$jOV8k#g##Fwqd2ixxwwKkBO?<4~GIehK0a|t7ZI~ z#&!Xzw@C?=5B^5rJbp~oNG|XLWDPd~(#h%J|ApLc zVfYK~`e&nz5)TIegwBWbn5Hmc=XeJ?Yb*Z<%R!vXtw#HZEi68O2oDi;w#pETBsST2 zj5zO!=|Q&IT4<`O)o$bY<)8zl9AmQA=+y&QBmqLKl2g37^cU%(qQ5_V<%)t`imJui zfvJ?I1DCC3isZ~Hnk%aZ{65meJyfi`8U#sQTXR0tWdX_zAQ4mwEF89WDrr}w#j*20 zcnQy)TTgs!(>E2GO9+XmXSA7d!q#T+Xx7}$^_JD5e&esF7H-J*cMJZ1i5qRlbkle$ zb!h)avJgMV=L;$%CWt_Y&Tu*Mn(ND8?T!#MgBf+FaGkUxTSR^nhD@)~7YKj67+0LF3TGa|Iu z@rdq}JemNHqKnGX#WN%rtWq2OZ4c)rvs$AY1=nX?~$@>vhNZFoJ6=G9JiJQB4L zHO?!EsL?Aem^z*@LPS3X7B`Y}Sq{@G=uP68-iw;Jx6959uN}s;9krXyFv@?XYJ+KeBjd@y|rY`G}G zpme7dq60Rf_()fy%b3z`R-&{6KxV-ynJbR>;cdhGa8D0N)RJXJ%Qlqk)L8J>MbBM1 ze8)s*Jpm%IG7*^iua>tpN;ql2XdYGCV_=ahcl14GEyYDR!1wg_M}@(qH~5A42XnWP zlJs=oh8NK-k2uf$t1VZ#2>A~BTktb5V6iN{Wj#iN$6}!*y{U!yTldwX6jePxfxJ@P zJXj^f^1aur)4sqhhLbSJ`zq32X{)xdpgE+5d0%0xUy(EKS+G*4mV1mx^^MulO7IOc ztAhIY^II}w$O76=9nP=*8K{2n?Ow*;Q$K0FDI~L2pdh zMmkIBhXb4+50(9;L>cjN7s`TJrsf5BVp#T&g_2M`rJ)Zs+Zm&c zZ;P@Z;-77salhbB+B^_Fdi%Y_mtg2^Z2kXm^&Z}A_i-P0B8X9=RP9x(R=H}{ZtH5P zS(Fw=Kz@cgd(JkNdZ^PH1E;g`?% zGv4pl`{F#Z49G4ji?6&!!IvAb8l^-i1U(|eV!Q~a2&XS2)3+EDru25vW>a61{bMdY@}T7^a|y=!-81 z&CqZ)VKD3M<12LhVknl4J+GTBXfg`M)$6a@&C-p!GqdWa?^h0`rXOtXCi z_7Zjc2m1@#5%Jr-8_RVXlV?rGj(?cYttQkpYkUSEiMiLJ8^eRJ@y-_7XR zsq^$fDt(ri0V@~;G?qas^R{SpApIqG?_!whxip|D+$zwTg{Uib8(9U^$^Ej@hF)hX z!5EGX&tQB9ddm0p?)!DmiB;v&x>wuGg+-+N`MAes-A`^2u7vnfH(UYFh*l4+V1A7h z`E;4<50dP)@U))N<7#tx1n74ioQx>F^(M4LX0l4?E5DcoZ(k zY7&6T3`o9m_owc+hW`IAvQ61gI4B=(K_4T74S@)Ogplo9UF(yKE9Ln@SXm^2dSQb}E&Vy8 z@m*vw_AkV7&b@gSs9d~}^lQ#4R7{7t#V?bb-|StC5Se%x`kqTzCvFw5qcTX`bAgyo z1yR-^)=3HX$;y&D6Drff+QT+*AO~(jJ{>Iywu*Fl)f0Jmu-!4*Gf&^4P`joG;@u}v zRKWE}>ZTw6X9qfrp^nBKKc>?8izlApJQDg`esRJA7E*8OTSAc|$OYu zloS8Cs@^sT&^ZER<8dCAl~ZZ3Rvw*~G@RFg0;Rr@HO+M5nFK-Pgt5@;FvVJQXa|f@ zS{udCO=LYfog9K@qYHoiZ71O_1U-sQN{-l$S9M>6n%p^sl`-?MIiN3g_c(N#j0%tf zlIXI#=kI_0Cj8WX9zol@JxdW;veSuniqAmXgnbVwGNACBa3F|KQF21(mS6{K$G+e# zLle*iQ&$JDdDQ5yS11>>w~?d79X%_k8^>L?=_enMmmx;HHx^-cZ>5Q~ux0|AdZmeQ zx3j`LoFzh)sK*ixn+&x#MiH~!b)?K)PSNxn)uDy>rZTSI`$d&5%}$G+iDYo@mzYtR zqFQ8aeCXznyI>#MBaw%GeG(<1OqJIzON4E*NTm1_|M1Qvjr~Y|j$iLP*Hlox_XT7{ zxaOW8tTnQK=FB;}e)t>9>8xOEOGCk~$j*pgWGLs$iJQCAmEsLomNPzW4u+Jwcx<;G zx1GknHg<7y_Se$%$5?K|x2>e%KSFL=8K{}QPg5p(sqD1%?2G)huzO+gjHBUs?ebf4 zRyOhpA@j09?l<}Uf%kHhEK@z)xu0k30Jc@WpCir-0r0ayz7X4;29L?iPgQa&@LQ#Z zIx7wG?UT7T9`BMl4SVEyt+)4RW(_%9runEf);% zUMp%_yah({F$B6HLQi7=2tq7WSR|+<%dNL>8n|UK<_+??%A|);u31D9GT@C*PFB?0{)%hEZ=ePWVTCkch=kNgF4Lg>Sx&VZ)U?XUBg+jlNF5f6C_utF( zcFEowfcC;9N0#IuTvkCJJh0MKW`jryked*M{sWoky$}qAnOGqSx z?n(yDF4U+v(A9EhrOw`kOs|(}p>5%RW({`-#JLBN2%8IAZsHQURApqIk*7qVYB6LK zZnVl~1J?E&w#}?RP9C4G<_LZl9_8HfX%BMzY#iSn@0;zOc=Q%e^T=75(rat&Z*Sx$ ztWK{^?TR#WDO?l``i;UlbX*B2{utqJKl-Xci>4~~PBW`0`ilDp!Ul^X(P)US=6 ztljN^p}J>*KG$w~q{9+;RNgw>**K2u1;i1A*W_kA^$A zB$KF>|48-uFD=IyeS;?|`o%2AJUEH_U;pF(@H5a8Pw1~Tz&}2{KvdPJObxju;s35Z zx(pCAkhzZ-*pLRFVdc3*K=XarfjZ#MoIGSL==#FUJCOb3`nu*zM0X!QWbWSp|w$E!}!n%(2P z@giOx#ijov9q$i}bKTnluGR*ALA0-}fLU^XF|Oxm@#N5|quwy8K8~#H$@SUY>|o;O zgGPHM0=9%sSp}%K9-cDKV+k^!XmHYK_sEZy|EIZ~MbsL_~4iH>rc6 z`BT6NwXxlEf{mMnAOE@85kcyi=T*t{DL8hmUmNMJxaNCEom&}1nxA|)sBbpCK%cpp z4MO%Y9jiC|(+f5$r#wS#viTJ8?gVZzt!F>}4RMGpsu(4+Z23L1IiMVgAN0&-)~DpZ z%-(+1Y5g1&7#)Vx#RhoCT)pMabx9~rg6r8&WCaI+KCp=D)GiM@c@u>J-w6I#qHogd zw8iQmAT)Y=w3p2eAGu&k9v25mTOzOrnjc!S-pEOl*RK=VAf7W!&SfcCLu=-ThvpNn zzu3!`CV!e`tOIGF6~;KGdANQEebiVeKU@5O&SNE@jXDM+84{N*>Nw%xt9#GJ-)d$# zZE+hulAGUyEUjcN#JU|>@~-O2;)3<8YEpP16ZYs|ZXXzxMBKtb-YcfsYaL|Jl+sks zvUNkXut{zL(*Aa=zd+#B#G=aS;$T(5NqJiQJ3;o~<*DT(4Cwo&ZhpJGl|9$!vq45T zo}EiQXS+B07uvOim5Lg4lL_Cvl`tgs(R&%LVOsQOUHY0~r@ul!El?vh`@-=P`+9gm zlcMB*6WXMDe5D{2Ny?8d{~Fh)F^3Y>NTcI-qH0o)uFCD+d= z-&~jMPWDw&5*6n4Tbx7#%nD9Y>x>4_H;YNmTB;u|Z-=4ZU;fe@Q}~mBxD2cdS2K=k4(sLekXq714L|DG8jCx8Y3AO+O=bR1)-tJn+4erVtmYf?k_7N z&n=W%6y>_$A=-Mc+*<^r5-%65 zlRP-n^*PmIX^@>@HSfFOI;$x5ci^jCRBny8>gXRa^rZUxefJvD@r7zN5oe)mf9Qt~-6DWPxoelbv z(YDB@G?LC|%2(#f5n#wK7Z!H+n9Pqj^M&=>tt*z|3n9;PiGr8YDBFF#X!t)lRepRT z??`LRmNNi!cP{Rz_|=ns9Qkf4{_e@?)mVEm6qmGQFkw)wHW^C zh_=ra5l7punKz{Gbj-)m`^CduJ5MWRZBWFUv3jC}O?}N)x|(o4Ly(g}N92X40oz*B z(@?f-##!e4r%4!#^A-zeb3D-7QEFVd9(T1J(Hd344Ue~}|Lr*Ew|kD44M_$^E7*Ay z2|mp$%&T9bo_N)hhs93k;$Yb*vQ#!iHbV9?(v;Q=DSRYOPX5e%J0;r>&%g^cPjm1` zSLr=LOtc;xNqvVZLFa_)@z zIcB|Ar|j}@FiN^4(_`iYpaxv(p>9T=*Uyx9H_zJry*87!F#V=wDY(6YsWjh5R=HRl zr;a*FK*d|SebiYpa3?Yn+jA@f$s4VE5-Uo*xtyD+4j$19U3w)+mExuaU)Ikve_}9! zPKQ0@dX)9%SMe#G0yD^1KkJa%{l3JaFc}%|X6zh=s~{;naC1NieTLRCSI7IFokBRF zz4qSU6nH7H^Y+t})tOo;jBt!SeD}_}txH=IK?kRP!H|Ay@t11G(O8_=<$id8Fc#+sqKy8fNXr2hh{-3^Y_AHxIhT#y@l-1LCtP9$IEihp9#MG5^ z1kyL_gx*+vI~Y=>*Y)L1g8nwwy$6@>y$hYyo4r&yJ?crJT92xg8aA>eEWD_^a|vYA zH7WK{9YpB)-!22Fs5I2a#tRWCwJUpi|Im*bT_-?4mu$!h~R@7I$D5r-?-zr>6M==-afx zRzX6wZcxx_8Hb|PXuQelH$Y7)SgE_v0vA0<{*@1&>m60ifn`=s!LyZGjO?`w;u$m{MSjgyi# zg9y|@l0h^zVctPJ29szEMsX%Dc`!tc*t@Q-+P4kAJ+lzlNRsy%y!S(dZaeAq``MA=a?<)C%$E%e~;#)QBG*q*k-8gRdpS-cW3C-v^$+#x|wo+H(KyQohbTAgCH3 z_(pBt`5~?_lmb*voZb4)JLb58etBQ6A5L5cVyGMf1my}pxT=DMT16I}{28(m?$nG? zK2j2lxE77Me3hG1yU><=WZ>HQJNWcVehK)+3@MW;lgF~Yx0$8#^8`gkyxppbq5scV2zX-h(m*w#XOc(mbLNm=cKU^+2@tK&W(1#x%# zR6eg)fJ0@{Az3MRHbayj`_h+%T4B9xtZ9>*-v{k|!R5sGa$MCvfo{&3ris_j%56ZZ z#5)hY7NwTgV*h0*1rNMP9=d!0{v{U?=n~WQuVW7SY4RS#6mk(N#F>01R8$`jqXi~@ zI2KT%{ES3Cufr#?LvGJWwIkO|5`IoWpYm)mxD395^(qK=pqWafJ$v~Uh83k#FVV+) zChmx-Q|8ZdD;AxAs^f21eUWCc8;;k8z@PiMPMA&OstwYN+g8dgPo~o^eE^Rqao9`_ z6^sV799Y{s7wq+l(rzw3kk`7`dX$31}Ao}#Vo$6 z54wbBy?ZNhjMCov$hbY-#WS;l^B#qeW+29tP9XhAF5eycV}^kkI~d8syQaXIH4zO* zW%UH_x!Z7=BN8n@WZ&tWiUs{FEug`0eb&BTu~lnd-O!_&|zzs;ukgFB9W?}~f>T^|sCM)3P$Le&}#9Lm&D+ir8fw#H|Hb5<(n z`{vj5jnqMxac4s(kWVnFQ88Y=a5oP(Px4E%kgk@i%m+C|1=4`HbMP;=FT!v0<#toS z2FsD@<~fHKAHaxv_dh)r9SbXtu5&2#z$fY7Z~PAW{P|JWl4xK!D1`n_U5Y09mvLxrt{jXU)F1pW0$!|MHeU7dJv10eCx- z`{iGn{=y&bGIRX?i8+oho4i4}T?D!vX5%%e zc8E2e>7ixOZVA)Ft0n81T(Ye1UyFIB+$1KLFClp6{M*zATs9q%6V@}#Tmf|P@;6?b2xsPwoLr|fEbvX3vYIY4a~f+77EO!=8z zs^kX_b7J85*r_5t=(fOU*v*A6VzmsZ)3rO$TNc6G8(QK;n-ZM@# z!*7NK1QzsJo1>}j!@P!i>ZbV-ZRkeGHUbb_V0Z&frijdiPmv|^Z4UdBFaSG#&FrtJ z$oJ)}9sfHy9J7!+Gj4_7o;Q5g?$83(%(3xrb4Iz0MW-)uA<9wxK{fSUOGbnqI;B3M z=WwHEyZqR7LicI5m;c&rw%XZOl0yg4PKei2bGF$qxv0~HPFwCB^6q>qP1VsUB>1PQ zW?$u^7O^|B|4&#ugB>Yg8MHk1L0-lAU;6*G%`g|b>|b|gums;&H!*sQ;awP@B4c#Po*0VT`{w!|fL9!$r*TstSlkxoYIsN7tP&S?=Nm z<_{a44Hw=^TpY!8O@&hAO6=g_7^c#v<-65<7*nCrg)Rr)Pp!iFZ1EGD!H;wqae88v zeT}3CDH=vBseRZ8qot}GaAnBl*aU1QOo2{DOZ#9u-_v?_KI6EI=^PxhZtMR!drkfMqbgQ1Mq{j@nGeLSvbbdJw zT|)I-~uZ7TlcgUEQ=^&)W4 z8>4Elk8pDI7U<$tlix`Oxki9opY6}Ri)U(HcPpy zxi!sR5){}vii>r?K!bZ!1|fwtqDfGZ_I@M>)me{#te@r=o?p98kFQ$tpdDOGz<`F= z9gB-NYpmL!{>&}=n_TK*szO1tdk^(rQwn}5%2$*2dPic;H@#icD&}wT`f0jn|K5k=Ete=d=@ZKV3YwI--^^{+dNZ)sS~h3Lg;at2Sp$SkS^qAc@I8#2rq2aI5+gq}= z()e~JPa2RyiO48wXLI^IP5VZv8O>52RbaPv+%|A2GhVb^xNF|EyK~0F9QkS1vDa7H zO*xF&O|%n~w83(J5H-ARbw!i0kj?$*xdRteu8q@L23Mi}U@!?%(P;s;3up+O75b6$ zq|Ng5Ir(Q^gWq7=>K%Y{LmF>W#@1`A=Eiy{eFI)=b}2s{R_$!d~|B31)LkZQ@^kI}v7ui{9t@u)CReboKk0mdNWu3ti^) zKZm(TP-()VJrB4}Y7S&SwCz66k8`b!+-TnT;50|HI_<9B@toqiyV=#mkN z5vG|_bt7LrsP5$6?Suc&Kpj0NHLmKa^wsxi8+6=r&x8P z=Cg*fvBr)ry7OqR_2~Dqjc8xX_s~0t3uDYm&0O*?Su@zWzWv)du`3~imiLL;eT&i| zW6bt4*b7~DKiRn+?A~HBPuh4E8W~w8te)56HE;n0PCsDxWVL=|1`1ZmKP$Jmab0}E z){qD?)3brxmvWH^VUW6e@OQhQLq)86j$t)Elt&YVxZgemdZ zS>K!;Ek;UmHYa6@yS6-Gt-73CQlUK`U%_~n>EFm~A@NLavG>v~pE8vte4kz7L7O%0 z;+Lt^f}wF}eW9MJao)#R-Yjo#6Pi|u+Yxd=Hh_wsX7qc5<$ zrwO~?7^NZR_ir+oCDHD2_9RxyS#5#65d^W+U*9y`G$b?#;KW(C%y3g9uY?KAhG5j+ zzU=K>bCc z@{)d?{!z~doqf6YvFYI6?LUb9>+8s$`^p~C$oo;v?|T|tqYR+({BHT3WlT9>`eD=$F4Kx-Jjp{kVlK94Wo{UyBw(c&ukXK0>xklk98T_Ki<8<BQ!^cv zA+o+0^3AR`oF^YM6i$JK7=qMm5KX^MZ&FYF@gs^?3_8+iPl z>&|C?y@o6k`62L9K^%QQCv+fEFj;>6eisNX4o^=&)~ z>w?VWZve4m8s>LK*RIByxXHIg$j{@J z(OPvG=Z@rm02%OWjjES)snGL?`@1)XoCcv}+hir)zBEqztQwUpi55&7*UMenl}?Gc z7?h9Q0b5H719>Fm%1U7v?QzN$f7t1hoy>N$ysye!hvk+Y!j@M*@j70e4l8=q5wY!S zXqJ0PeVXxnq+8!t^(nOQ4;CY4B=d-Ah^WsjcLVVaV#)~H72&PlYLLJv9VWVakK=9_ zM;=>w`EXP7wF&sq9sB#Zi54!Lyztz}Bg0)Xi<%fo?v{^3N=9=g0DEjDpbAZoIaRFfQK*Sv4 zs;~4E<2j~zPIMq=(&fis6i&{XEzc#I>4zONcVX1c@}7cQT)v}!_4P!5@S~^2lINZr znMjD-KA#Mcy$>~^S*Cce#q=;FLjI7IL3e!4U>q1|U{r`Jr<*Fn3t_WJqW4cdx$)vP zS;D3}ESZLgny=9lF%ti(x-benZ|Zc6aj&Yils?*?+Funzq#HV5n`D zQW*^&gmf%5T!|dN9w)u^QtMn@u&kTA(faL|td?~<8Hp(C89o<=cc(oFY?G8_9Oj8d zAljGs`ImvIP)D<}Ib2m;3`MM&YWbySoUiJFihk+1pN#my=fQa#)7>kxF5t#ykb%DG zyZ7Fm>Eo^{AD1c<7Twrnh7k)QdK@tq3*)3`*(La(niFbMk_{<4*TT@;L9;ga33lxi zF@}5|Ji<2pQutGEgxqJ=>L7NM ztTFG0RK-JXW&*)w0bCm+jBH|^R+;=DehIDcG=3l8NRCiXKPMow1ga)G%PrnTq=#|` zyK#AhisDQ#2Ep?#Sp`3B$PHJ}6Tj;ve=}R+%SUI&&L08sH6{!ZeF*a&F0?wbI8$p2 z8-^$UNmnAEB~=Gpwzxf~V08pcMX+pJf5531Bq?CiM2Dqsn7u+~t`l%o4#BC8D;%NVwhW6-MdYDQmg9Vq)~fj1A-`*LJM(LiK=9`I z#9R0v`30nWarq&*;tR+YfMG&32+}TD`!+Kwm^&@4%rHXsd~?1rq;l7&+3s|h79Vr8 zgr9ecwR5dWa_$Nu@AXgA3^Z&p=(x~_(>9l#TEmMc(<)___0;0^4C`WpmOb04>hO8f zwN3#043;7FpW;4{*KFx|4 zw4wy-&QsK4+zDm7IPSEc8P#b?k>ure%lv&YdXq1DexZi%X{no6C?MA33lQj;W?cQm zd%W3YLHfOAYTJ2Bs`KvhFi}U-J0?0=%V&0>0!MHPq#FK_%|3Y}2beK^RmSUK#g(oH z(U)jx&l)xUnM2Eh^@W2T<9G$^UTCwd4^P2c`poRaN&v8#F);p!{4i;=)M}_3s8B6Y zi}R6IIrM8=hgg(qg)=Et)P^&>v9apO01j<%Q^(E6!lPp!458~)Ma};HCWRltP2fm- zBPP&*JC~{Rz2LC#sBMHwJ3a}8e3F!jR>f!Ko`?Hh*V)O^*PY>AZyq$N`WkkRT3dnOz-@O+5v$7mc2Q*~gej?x*Y#f=^!iZ<+4A!*i_SmuVr8Nd z58Vob5VJ-D!l-x~qfx@nvMDR0m#eieaTtbqzkuEH6|6VA5WDk`qGuj0?ap~^wVNFh zZVJNV9iaXliN-p*_;Rku9L#8!e~*g%kvsL&ZIoGR1Ieh$Rt^MfMQ?8>S3TUybW8?$CEn-*^yM`t1725Nn0xl`z%s$faQf{weL3LME*FvhWyRjxL4>aXyGTw84mSqXlDkX9#{)#IU^w2AdmNUwFQzY+~?Tnut={fbT(_q)y(ra zdCpg_fLk;3JK=LF016D@gL$u3((;x6hLw>L3;T<1+RsMi_=>*l+TfP{6Acnb%{%R; zQRvFRk(7B?m0HQ9#@!a;tuBxz!T5?K9K?stRhQg3uPP^kX6h7md-wShk>N>vLW4Mr z@#9N%Rr2QR$r}T0xe7fC!Y?7O7|f*fEa%jkyDXrLec|mCK?HEF8SG;Ycw|VJO&SKm z#!n=;2eD~{Av6|pY!|rHr*N3$?eE;E=3A#0F5yFd3CWZO20GNIr%Zc>4Aeumnq`N-lIFp3(E!6Am z5J|wgU&#S}#rCn`xU8QUaAYQqaQyl12zTWz&ggK?i%VTO{H*}=!p2QamGTqYGv9Uc z)0V>&jG2maQu!dP&ZPMKENDN2_gD*-4|&I+mZaS^YZ~n$bo71vb->KI4wHoEQIcah z=}-kQKdHDTX_WbnaH0K-39;4T_dWF1ml63*@t%-r$T|Og_jyB%H!+baO`62GN(K$O z^M8b#CQE|;)}Jh?gp-^*x}uLbT(TgR&r3Y?biXGJd@1fe@uC)YpMKp=ROy+e|9Pzv z-FEUn?&+^nXaXr5D1t*TB65y9R651u|0pf;j~LcK5Hm|Bv?-17_@r5gBt`z{#cJ`C zx$JZW=Z`9+_HNn-I-)z~czl~$9Mg8Ry{r|guoZiUt1>kw z3(E1R3JbF$9wiy*_WA{YO8kGN9veME+tCqr;X@F|ND2m$LyVA4y!N(aS6id1v0vVL za9R7PU{AnB-%|J-vOwlC}&1An;TAppP6GB#hgH_g|CAhV`!lwcJw4kk=L55)!| zY`UFdph;;c504Upu*!b*F)0BHesA?FrN1f$fQ?5wj@Zjm;EsQIxyj`-`&kZ;5ci1+ z{3>QZltq-&DYl2K^{_DII%L3sIZvVWi=Ml_=gnd=dg2+diZVX#lXsgC7`-b#`;&sO z<>^w~WDc59R4y&-Ot9EA)Kg5{Amr}t^<57`_~4cvCHhfkNVebpdLE}J--i~tJ0xs; zP!4~6qF~fCiYi-SR!R2Y8`k zQ(to#9KmAy`bdF3c023-9Q)tw8xP+< zDWX0k)I{D)82>k}#8*1;`mVv2%!Ul)-(@D9p_Rx$F$(6)H-FNY0`F&20RJ@xD`xHk zxDZZXn;tLY=l!g#4t)z2c#D|BpH>6t#Sx4st}UvN$CIIw<@1ka8>iXiwarJU76gE$ zzdWT9F&98(2fD&53{Ritm#p0;jRSnHfmoHy`dx^jaMUl6V57~(Y|Wv+&oP)6u!9?b zWP_LqB+Slj&m}DyOybnVDg?3U@v^f~WpZ5K3jM;EIXTaXva}CY>*Aen-kiO41;lE8 ztB5b-mfR9#iW$V*&D7_4B@D;UTIl!(&$j$+W@2mVC_W+02z#gOJG%xC$uKXkKWL1l_5Oxjq|k2BwlW46UE}hMgiT8`(cgL z&QM3@)M|dwHcLlxg9BWX6*V7KUw!CZ*GM*`4|SQ&{GO9HL}#Uth1K4Lf?B?E6t0#< z;mG4%TEc}-f#k5pR{1}0wr5cWd&%5eLN(JKn=6e{XuH|T{C*x}+u(rQ5-rOBc77sa zj9;5A_GDNkw(SVtbEu_1y2|~qqhWm*&WAx=(rsirqaNm_m}YwfL}VS=U&me%8BC(( zQqe$|np+cqaNf@RxJ-AsjI3B9ivDi_OgyeV&}K4?x8m$1!;7e|m=eiGA^nNpK7FZ-PzId4G0>h^;imtrszW5ucCtrc##EqGoyq z%ukn{0>-lsChvn$Fm%N(4@PuH77(1g`J0RsVI|_XT#u;D3azk^1uw?{(>0O66=trz!<|3SsuY$^Ub+%3lgV$~0 zu`Z(Nrp}Ojh=%uJcqq$zU0*>tLf!KL-ZT!s_5*}c0Atw)Zsl-hhPLw+$vW{~gJ-$r z4>8S|PkfjA84+wBZ_UVczh=q#n36jYQ&+WuRx?BFKkf%tZx>|B?Ke0-qe zxb~ov7o`@SF0V_?_3>s(B7*B14Cg@Wu6-VT-pDk_nWA9Jt_hho`&f_7+Y8z&$dwbH zo6%s5KSW#YgZni?Qn&-`(7dUJ#Pq4=yXSuy%^V&dBUQ#H;I zD_7!Ta4|ddH&YI?`O{bNs5*$;^Jvv7f4plfA6iLRp?j5mz{oOvuipcb`?@j{Hk&rW zSD5j>Bs_rHPpr2lvkDj2AK!x5r}aVj;;j?anJ(RO{Zr|O4z7bHbBYwfO(5D(q~!uE z1L;%3`h*Qwb*6vF%@0IhKD=g~Ww~WQxToV%b8}7-2km0Sg?z9C1<<}KQYQ9C@3diD z7lVNw(_|`o*oFpv>s<{GI`=J^U%_e&VOyeR6ed9&;;_sHn?Y_oCxdHD*-bd?iVnO4 z<1BxT{;@_^mG6R4@tKN0%}*U}UpkbQ+sI576qPso2As0vjrBEOGqSDfgh4(}u$DO1 z_f~)u32s^Hk>imU)x`1^2mQcmUA8FzWtUKt2FXu)DG~Wm3}QFs@c)7oROFz z_2^nlgE?mVRBvxLd|@@$nf)6@4c2lLWUb+H#xZ&Rue1nEhx_u@2kWeF33i`XJ*!TP zzMc&jlQ)NF99)nO6pQ(6g`Ha2NK{2Qh-ciC`&gNLl+kS&ja5OM&1+IeCd!VEwfZgG z+MfDNc|k=mE!R~G}Kqt6hF2*(3z9cCj_+Ht-S_|4}dulwa;Y^AZg3pcld z0Vqsmr{ypyDWb9yx-u_CQl;0~l0XYrFYP-XK*O^ot9TJa+W$_!P5({5yPEg$6z&=oW_;G zJZ7a6mAKt{p>xb-3<>b`+vWEvxQJ)1xjO%|-vt~VEL#Z`I##QUKqzrXM{(mxcTpW_q(xFovv(n=^MyM_WX4kBC}R*3F;lIAmY(l>6#)Lg zVOcX0#bfYK?B*Hi$;5bc;I={Ms2b(L{S7Q^pP8E%ZMV1-%$Ap5_{J1!Pul90KVq={ zzC0s;hVcygOcP@>6%m$@J|NXswo!BiJ?NZ}fs=;GEub68pb9YgrlkCXwBQ4C#%j#_ zfT(BS48=}H%b7XN$C1$mX<2;jIh>ckKuX)rEP)o&bAZ_%c^-9XBpK>U<1KsWv`&J-9hgdAwfb*W@xCPJR=%5N9?C$HI{8L4(m#-t4_P5sC;4cPUz@z%xyWRK zP5p!&iIHpHrU{EojIyk^JT+WM+8!_GEy48yX~mMoccqx+D7gN3qCD|r<@Kn*$lA}q$Q*)jqTZ=I zyPH>=J_}K;8=B%dL`?FH&a;%F=tfmNP$Z44wR2vf`|HbPb3Mrzr#QFnt9W9Ye{|3D zP#}g=#~`~585)Pt#tbL7MHI$F&nxph99(_CndU;^xUDFfCz56*@dV^6A-|pnHx|~m zca$hoMcW;7i=h=pZ%YP6fePzfXTiBMu6BYr^>Z0&qKTK^%N^Facl;%9l}PcZ z*luMgZ9qFFwhShnxsPKoyrF0Uo9_3~V!gHw7%lXxb=b3AZBd-g4yCddNG2)h^k?Tb zssT2FNS<^xWV1j0pCBPC$Mk8JI*dI|=*JAb?#gAKb4CjA=kEs0BB#FGalOW~Bh6T5 z^r5MNp@}aRK)>q;>r8Vzd|JV;SwDJb-Oli%Iw%|EdmYQBJSh~>ChUq}9L~{r?JLU3D z3y!><>cbyZQJ+3rkm@7_2{e>m#+|#UPkdKB@{hLue`B%xp)cMWVtKXB4>bayjD3XC zY@am9_QhI*CK@%~F+sjVk&Xt#QBDl1H^?uHKNMby!#8pBe&DQK5%iVl^%N`hs zp6c{vR5%R1A_8M7X>-W&b3(@X?Q1eQn96b*$y}Uq`-HK#a>(Rz`^N<(E4>#v%}`q0 zvtPO85Qy`dffF35B)Tq_P_2&9hIkLni<)RxpNH0CO(sL znRl;s8GaI5cB8O4}cm^H(@GODz8 z04e3H5Rc~fRJqwp@3^?nZoiY4cbd*>$t>2XF|iW+dkyqX_drwMA>6f6Q<3pDzIjWy z=?+(|r0=5mWnXX6G(;^}8!_jsC}&7{uXxCTbP@a<{xOg&Ut_*ket2?AcRcK~*k``= z6P zVSTorQv;rjBn=6h7Pyao+e#Tc$s$Eh!gY_wy_Dvmz+vQENws+6bM$nt)bv%$wPJe5 z@Fgn$XC{pet(rbW-LXNE-%wr$zvv=OsD9d+owcB&OQB<-kz&9@tssR^5*f`KUyB9f zf2~QlXSSfWLGH_ISNKLLKf)JlNB~(|zNGET_k)q&W#C86a|GJhLN!QEbQw$p&>f~x zFE9Vkc+9P@fLkY0gt&#@+-S9qPHZ8@-s#?{6ji({vxHgloVD>aZM7@Tl^?bFxKoLE z)2JScSYlIw$l~RNedL`b<$nmWR1F2cPby10^=?iW~ z3c5f1HFh55`nt7ek0L9K24T>>c19uS1uWQ@A>YHutNDmn#hmXZzb?rRl+Gwi5g0V#~W9KOA+(4{!U?V>ws~ zHzq9dRXr~tZZB2wK1d7QQ7DZy%5BGG!4Ujs9c0n!MyWqS^pWMutU^Al7ucGsMA3c} zO_^P7`~#sGmB~O+D9N7wpg8zp8qBCj)%sF6BKukDI7EO;`wo&$u2>}2>zMWtO58jB zQNWJSLIB1VbpvEsV&}5NXwKpPQ^4!D+GA;&dqVh{m^uAh_UlUzHXXc}ayPVZ{EA{c zlk#)mkdhjV?X}hlZ>`UvJ8XJK#jdHt$IfjsDmL@qXDs>I+=BPkE8n+fx)fQ<{ELVC zjw7+*c9Gtc15w}PqU(a|@nJDluK>c5W_$2x<4MmM^$e!nk=Jl``X(a#G>k2Ke<&sxfb?+!8qbUQKhkDmnw0h zgWuBbpdW|X^H>ujF@{u4veJOqTemlK_3u-3)8*R=Kaub1>H#}*q1DuoYx(_8&#IQL ziM^e@+hq$bKwB~-Gcb0o#OanB9_2H?cv|mb?vS3&KiS#j)z(vfg4@{2H(%6;M^O(B z_eHtVfzY1}1LvxN7MZ`G$%NMq;b{w>$6c~^%R0ltCGLQffdCusTivu1xr&LHwe9a3%{c3oo=pT@^F15A6Jcqn)3=Mpq4dV{=kF1X&t( z9vy6xdj5t}M;Bvyjt=NtelZKP@IBmB@rp@$4Qt8)1FknBxP4`~2aTHhg|M~0a{|k^ zY&XzgtTX*{v;4FuU!dCo&YN$I-;q5U-;-d9rhq|{(8EC?KRAc#WJKnr==}V#v$%<_ zkBe1LW|p&>sE;kADKhX!Zf)_s2+Ke8*ANx`#S;_j1vQ8VLzbWDE_wSE?uH|++V=BQTeCbPFe4pjnO@cB{P*4=P zqPD$3EkH&^^;~FXZq(5pMW65XFREQh+V$_B@L!GE5}*nuvW$a>CP1O!)Z0sT(6MeA ztxqponAW3^Z#(I|AQkFQP7$$?%z?p|X+#3uJA&nUgE ze}We{9=mBRr6`l9FohLE#iI_K` znm3^!VXoW0;9}Oa7G8m4vg#`Rv7^L0N&*{vo^~M z*86W2*aa98`Jm^n4l(Cal2?qQJnh}CfI`q~3XNO@w7FOF$sr@Lc!zhv)e|Kfpi0^*TAv&-?v3j@&cn&eF5r zm96exdg+Xa}k#!Zkq(r{O~!>peL8B9d6NJuliJtlrVSrqK;jXkw!$~^ws|e z!}5=er#wbhmDSca2Bm5%Usz2Adp$=p`>a^P_ZQV28m2weSi39D#dl6R=d!794|HEx909A z-TqR#eW(9_T8FsmKn~mAUXQd|6u}Xo9FaSA_sKvSkhg7i!a#5j^n@7Pya!2q^g>o< zYunMF;M(w=5UcDC?&p%HZ6AjDmq1y2!6a5K$L6K^e!XlSBjBn%Lns+zL{0?v_&qQc zl`SN2VhLQ8($Olc2-&us^pK7E6UA+qVUxtx?s})|f2!^m%)Em{?A111@i4kjdkIA> zK%7uD4T7czPJeKE$DTiJf)E=#Th#h{0&LZ7v9qEYPuD{JW6{?B$E7VgZr^O&400|c z?i5N|mpVvR>EUhG)h2AM7-DMLr*pOf_D36w>eLALBDVpy;c*LXDrjePWA#wWx#+q4 z<4f1|RvbE*!HQZz00%sYU2{G7OW@(pMe8ZeqSS_6l&pKBH7D0(I?&3nc#*21HxDKe z3-uil4%0j8fRS*^6Io=Gh||{c|5F5ZBx9i6{Oaq~3s;#6p5@@$H0JlDwqkfB|4a6V zC9dB@qsH*&liv;uHSqn?!N685h-IlvK~ry4LwK5~M$wKz+i197WW2-m>_fd1mA^Q3 zW6jku@BL5uWI*ojPyIR1w@yn6Yqk=TF)A6CNqS;VX(5_MsQjE9QB30&(bs$*zr(n! zI%im;Rt$EIVf&YE;U3ACH0*OPE$09YPcsqil^@=LFcYqxb7T1TF53~jQ2mS26K#>_ z6m9l|Jqgm}%GGhT)mrf>kK@hkzWijh{Il~awKwy`M5ddd3d8t^?@Y~(oj0#f;YIAY zmlFOkJ!QAc3;B>hcKJ>6NE7WQJ zoNJ1`cAI!3oDUj>z%*wF#D`iQWU}rJJgc-sEl`) zNoe3@Kk4t;^AT)c`;Zu@OZ{^{1UK_jYD$B9p}L2c@F{MLlcO(=p9I`TCximx8s2*o z^p5TzkmvW{SD>OdyO&s0Vnv;|EbL!P^;-4oOp9AC^`gc?Dy7~h?);2h{dwIF+>?>X zitVu7#ZP#|qK5WBqt{BCexki(p|Dv3qyEkaokGV^F7%Nu`yAlRJYO+z1L6iDQ7D}{ zGoVH32>3O)H)_oHC2AB*f=&-&PF@V(ngg5tW)@JR2B=xrra+gihB zW4p|Yzs(w&R$=t9u|q;B&QBZ|M^xWw*4HpATqWd^Ns+_Z92^D-@AtUcqJYbW@+!z= z{XMYTs!FeG`)Bw*WYA*q_oV5;6clt}EoyRfFV=DT&*2@Qi!H zfFN=B7P)tq!y=1iTbkFwO|Po?8@>!*pMGxqtKNlQP)+#zo*ddIV6fskAmQJ8{e&0E z@Rl*%P-{fVh2=+zw>D{~Z?2UXqa)xv6hBf4q3mhY#Bw=^F_O=-7hRFkk0m0$l$CvQ zI(YzBN!fX~?aBUn%y=QqA0+1w)9t|=7mM{8*B9>=;a=5jU@3HIy3Es_27UJmu!%jt z4WWEcgOlZ;vxStm(RBvU2Vk>x79(7`S9YFt#hi`4u$asV_oB6$C8P^;g3qB!JZJi9 zQ;3y!qfJ`6mM=QBb(|=0BT&M>{5%eqCN1l)G{!Fpko<&M$-iV%3LBtJBF;!TH(JMS z8`5EJglh%e=X(W1>P~FwTySFmCf4|QS14C@|HOTMuHzah-;~_{|JM&E)q}izR`=e( zNO5z~c(e%TU(ikD2b&kRT5<>ow6uk)g_e~w9PBiDV<*1#W7U~Hci6G-b`02nU^1-i zXnc+x(McQ6D-X=x9Havc&~fctqRhsSFyG&>y4^b)GqaUVQe2xt&jHh)6#V_A`T{xV2j3p8gATCmMRckOI2_3UnNCAk)4l1BBS zV+n9OIRJ=?DyC)8eu``r3z~}lAYJ^CbOdKBSDp- zPIcBzElr>Paegz*{GhOjY zov3}g?xi8;wfEH73Yxvf#9(h*r?Y=q$)PKQTb#gM%a*#`mg~MJ-(>AjGufFn>R$N8=SpjG%Qap`qwM^fG*kkFI2KhFuEmP z-PrNHj(u!C*{N#B=m~p%Pg_sp^21X>Bww#;(M#m&&po__?CFfN#kvcqu4!=KYVl<( z`I((FW%=FT+X=;%)dy<%)sNF`K^7tsZu|_~4A2V&k(|?AzYXi|MYDZnYNGmv!`=!R zT>g32_*oswcEUfAsa#QS&m;HrhRn8R_qo$wa8SQ-poo#y{%?>nxQ(Bb8Pptlmr~13 zRhd_tBvsq2_He`Zt%f!wbS%jdzW0`dEdE@Pi#>R9t5B^tdh5cxq9h9)7dxWc_!RjQ zoI6X;^ioh{>87abnvVaPeehq9{?XGucwk$>fUqjwpx0&Xvpdrd&f)M9iiB{aD%qn> zkdfiDFNJZL{?PX}6MK>8o$8VN3Fw_r_&V@%9qVQT87zG7{j=%~1kc%b zG*AV6{W2Fe7}xV?zrVi&P%KlMfu-Xrky>Y^T2rzeT8ED`Zg35Y1#yGp78WLzTL{(= z;tHqs+lVQ5d|vG1L&@&C6EkY(f2%kz)2d9pea*RE)-cF%-Gi9!2F}!9`Tf5qii{{h zP%O?s<~QuRx$L!z5oj$W{vTg{fXt?0*tad6A0LsZ0C#2r8>gLDxEi;iS9&H!P8YNx zVVI@6B?fHNz`Xz~dY#@B;7R%{IWx+w!xEX6FWERp+%oph8dEp5N}Q){%hLz7AC%OJ z?z;}OB+bnQctaZKvM+&2tf5MLk-%6D2fq)bYUxt%XWb=xg8Sq>$Uluwgd6@=H05xp z0K6|ln#oDf>F;TG{%l6KM+c|dNr#=Ho#j;JZ-dv|#!s@3os2nrS470b=7Zmg{CmJi z5lTBySHyNS7TGQMRSk%-Pri`tch&m)ZDk^xrz+&Q#_sAC16$JT=Qs98$!2y6liA=* zoH1@0HF?rm0T)kFa+91h@H?N(PaWm9V{4}^P1eIm6iEI~7@&M6w7kyWM$qeh2wL&S z^umA;DVOKZSZZ*hew%+;lXy1c#}rlH50g2JGSmg67i8-$L@ZVe_$=(KJ?~BliI}C3 zbuLa2GV%g3glvquh^$&U=L7~lvb^H5F6L_Y8!XBc9Y=K|;>bT1BVK^+*AhN>!jipH z2%h9|rak^&E*ysUjYYp8)F2x}e@D)L zs#xhm&0Mh$ANtTui``}s=gP7zh;_}8FCc~1^f`86lZJ2}vd4ih4wdbfzqo3>wg2w8 zx?(N4{yeoMv-^fx#T;LT)Z;dbl%@OFTa9H8)wJwh9&iZC@ykBgPp{lJsUEoa?&|4a zgdglRI0;w?Y{CF5&ec}Cycz>J6?#5nE4V0SmD(XV161XW-D5jU-_WY!WN%qPddTE~ z!bIO-*v9)ha%(hIbDvIy3-;0PqS%C{Ye&8n=qXuD!|q|+inb3$0&1gcC@7+|Ev*=K zZ5DibZ|L9>g%NsBrX7AeleE4kHmzVk`>6(Ub1N4pizvO$p9)6GToV38_pszV@EZj| zWfJlz64CXjS@%Rgv=1_8e%~$+XudszX9$sVe1StwI&3k=X(5gx}EK{jsomIx=LI zp-LNKaCur{`mShL82EFYt{AEXp2hZO;H^@V5{3|opCUH|S7!EFd^^wsDC9RUEZsG} zHhbF#xmtGJ2>ll%!QQ#LtSdN7_$<{MQwRtj!J%V<$MBjG_ii}PsI1n3u;+y_Mi9L& z0MgS;pTVSd@v`}f=7?FVKg?x!%WWhgh24Pkp*N--BO>{s8zg;SXR}Q8Fsg@7eKOxU zsQyci5)KuB!X^O)>){At#E3?2wX)@CzAR})V~gjEChODqx3h7D+Ca^sW?$b4^`Eks z!pv|<>8DEf!wpKUQrmN?H86I5fzvsrj@$BKzsBq&mt_`L{96w_Ck^Y8{$EoND9XgG z*am<(@);i(ytXa;aKnwsal4@I&#n6Vbtbai0^(&np+So?+l%mym;R8@@VXi-UPwfu zYJ?+mC$|2f*6D$Ay)7rS7eil$Fs#SFGB~70R1%>iypatFtIG8%>59--Fww>&R&1pf zW>df9SDl&}`;N!nMoaa4E90>phP*tYHJSCWfE@|z1Kg9BSn8OnbQ?=dh!&czIhucl zA`5>{l*2-t7<$22SDWgFW71~e2ym7yHLh;tx-tNm>QEw8}JV+YX zI4ne(&a0sdphuQcb86DWHNYu5Sl0$?PPNYNQO8EJCkF+$Q?5OlDV)rlNaq(8Ie(u1 zdKk}rX0`FN^A=a@P)+Ea$Mbov^0CFR58wyHisO2eGC(66c*@!ZL#-e4lLhg5wywfP zhk^8@G;@&nCWczN*z7Tr5Kk3QBoZmrDC?g^Jq#rzFpuGp% z_y^NmW(XgDUy>&%k?MqPZV@;)kF5HR#NsAA}$%eQG4+6}#fS;C6n zAgA?Hz*$@2^OGlKZ1CBY6U&=Z5ju575i3lf0k%)Xx|Y}oq3syGvr-nV1ClJOZe?-L zruI$;xFGICHtux&P=czzLGtJGAIXy~NLTjO4KbKuG=HCX>cBFzxAZ00H)~j4BEG~E z8jaA#CWLD*O0gRJH+3^rq78u2*jEMi1GXASu*oG>I@USQ37f3Kfz6dTVFvyW!wzh* z5M3S5EfwpVd0SyO6n(Nw>h75HN(%i+@cf$WNzBU*yMiGt)wOm*&cz}om{2LFC}Y}I}7{omIFZ?F|B*y%JwXe;6S*B`zg*%Vl%O`q*c zT3^g{(hK%rFzJIAGz+>Dh6(Jhw zm)bQt=P;qiYR$fcyzjp`bC>B~dIs26 zr9Wy9X|_3a@rJP)3!(2aPbr20alY)m0!7LPY=5EDvV`qVm3}+Vq_bS1;QjG z-%LB(7i1ss{UTWyRJ};#5hCHUu}+(vL5JOMLtUq;`#a~c?;&YOiRZdyT&~7|m(==V zj{mgHvNr9iwg1zKSl?P??97YyD1 zGn8MUc$}K+P#3BQ+-@nBLkDzg%G_h}M<&51hG%~n92N!~g=rXe)Xus$e783#ca9XO(`cE;UT$Fc9f1L04hRf@f zti_!N%!;25M%Oi7=jqR!JPe#~;iQ2xL86$Sd?V+#T2Aq{2YQxXb83%0^Rbk3YB=w7 z^?8Cqq{L+GQyJxpmhCrg{2rLCR&#UoG&mX|O-U7f6pXf+x*@<4CnTQi`FQO2MZZP; z{mh2%Amz!gz`2KQC=D3?03Tw8s*;>n@KtalmPzodKJ-0xDd{T`%)Cr!S&WV$!U(N_ zvuK)5Y-c;-oBeLlt??mW>I&W37^izb{ai2VH6mas@vuva^|gM&#U4B9d$+u$Yf}%+F2Uee;5#(p`mL`BJ+}d_~R~u~^Wl)R%==LUe8I za!PCltl_TP>DiMC|B54FNZo;&J8 z4#XuYgF|HuHOiNt9ZGQte|EItSh~bg1bqsMm!4w30Jv_zH=%cCv59|LODqvy5Yzdq zQ#-b43jWDEn)EuCJ3`EJzseA>AU>BeG8MMW!q+q6Y_fPKzamS)kkfT6HcGcrENE+V0$C^IQNtZH7e+z zWve*#tL_Fixxv=sU%h!kzq+DW#ej7nTjV2x1X#ZxHTG|GgQJwU>J+j!fE#yu zVdoCs=;a|Tf5NhIbK`|o&7;)*6%U*!Zt|2C53D>)olZ1Psq)#X(|$d%ruOIWnmY!* z06+`1>O51=EuAgzO;*z<_dGTN0-&D!B$tngFgjE z_+Dec+3nOHu8=!>SC1F_+Mk^7{k!usedsZS)5x(z9>1@<*{Dl4i57{z7=4MDi9pFT zRb~?MS!eG0ol#oj-YLU~j#4(+6Y)`RQx%)!ZGfg?%&T-zZXj^SWUQ|*G@d_Fw$wOW zo0hQjb7Z;9*AII~lEG>Y8=b$Se7XZ!d+(65X{cd1V<+&wqFEQSr*nD5E1@P{OLTQn z>QD{4LNDFdsyX~xaC&nrZl@TXG7`0OW_xhzxm+QwzIlADDf^Wt*CmGY;0JN`?__@< z?WdGUn@Nb1j{c{q4@XVyP0hG-nLsy<%cS4xzdQd}m*cMG=_LvATt@m#<`JRB>qDi7 z2-&D}g2s2AsZ6pPc2z&S@vL-c(!bzL$Rl4!+jJBz3czo6MSi0@}+PAxAwI*81Tz)LgeQ3WnQIX`^9fA0unZZ1bJ{sDS_$E@3z zeKxt~h9O3IyG#b~m)EWZW79-OV3UNT8D!387qCw=Q0zJN1e^xWO0)gm+x>!eO~!uI z`ghI~cN{ftHv=w5;fY7FUa(d1HB<^1pMJKWpQw66TZh!O`qOvq1AH&vD>d7J`AEL4 zptPxZPeM-NiAZ~!*ozAZJoa6werp9Ui7#d55!C7=4;fjZ+GPh@9!r5`kDWJT4;No_ zqit=dQ+>i%3GFd2!TB1>K4N%i?>j%HdXdppj~kmdiB;! z_^Ve$Tq%v>OS*>$Qv3F@IZz50+vr`Qd7POiwlb#aQPSUc&$GU-&?Et5$i%@4qSr~s z8*lBs95qlSW*`)rdVS;Dhzj%kF=_>;iqqc|low~f30K%O58PuvHNG-jZpL?!4Zf7& zjoO`f4N*s9MseT3*9H=ATd5aUj={8s<2Cc~yGGAIE1>=lQn%Znxd*!jnS=bfmCHju zVLLldZcJtgPJuY5c`V@EF!6AoCEt8T@MlFC4pWAx9ivztJK&)SdAu8HBBwCE_a;qT zMHgG)sMYVedoT7LA(h5>h4rZbU#H}(uA0%pXT)~};wNx)dg5YYA?O}vMND(Ir7c=% z|ND{kxO$B6CUSd3U2=c)(fD;z1)BY7po>pKpcXW}+iBr1qveqMAp1FGwlBK|gjy-2 z=AKub0-RTJ z)qx&9$19d6zW80QspxnuaF$(eS>wsOpfbQSr+!9)k=CNC7rVQDzbd7FzA_1x!v(C` zgryHHRc>wqt`J}$Z}+7*RpsicUrC!!;k4n!i`A*y0#IUs5UF~Y&*43G_?3U8H&PX_ zmZ}XEhwrDX`a@CJcw%4{w-S}WU(Vs16IgVRn{;IE^vRf6*MKi7ccPd z++D-89EUha=BT{z58kCO*91W4*fqS7qIR$Gu|UkG_fdJtHxz}KM1W%{!E{d5WV)?r zM7x5}&GnNk)ZlRA3HMpl-sH@qbLL`H4ORsGZRkUJB@Fo=`(Hk&l+lTN;m0;vX%f`_ zcJqSG(|zI74WXU8Py?r8k5-R+t_q0q=T%<6{esa#q>2^)@2BmXxZd8q`2Wl(>%+F@ zlhos^50&DD4?1p*81Q9b+NwNgrMtSR(5Y$PMbmnGLFFUQOVTi_E>gly^jB&s*ZnvM0wQ%> zGrsbiS`83INZ$N%FLaM_;j1e9ItY+FQ_EnSypGSe?)%n#TEn$YQ;S)`dPTUmh;hYs z2?361clt{O-hzc3x>_--*InlONHKa3DM`!y4()udYoC0lxvy$1hhN6rT6V&Ly1Wly zk6DLcX06Yh1=n6#?Vil3w+XAHk$k6Utz@*q#j7&Q52jQ7SlOmLiG)=`0+>|rj$ECd_JSQ& zUK$%6C+8i*XcEJ-6knn}=wbl>4bux!`j6 zj|8X3K*|eOhiV9Fj|ududcUC*c!@7Q_sa-qB5DWeJz$pwm$=$rh{ge<`ON`(Cch4Qj1J{(tFOC&RKRa*;wnz^n(Hb&JE)?|aG$Ni*1NI(ab}7P_q5!3m3+_sthrnpd%h zq69R(HT}J0oQpg~tWFAI`^-cxY+B7jJYB+OBoqHh3i(duXxLF)GnLTJ}cc+^UB%?H5khsv2I$#>yGy} zH9+a?hdV<@n2P2Ma_S;A zs;ZOOW95RW=6S1(()I4kD;ogOP-@*9Y63CDapM5mq89C^@W$zS7mGfFxdaj$_9U&D>+Bzs16u^LP!KsA1p?<@NRd%SO2d5MDoBZ*mRk} z+0S_zAy?R9GRxe_{gVp~#Ppd_7p9*Js0xX&4G<88fFq|dh)f2Ct40cT=jp(_efJRe z=6CP2s$}BPvTu!_nIdkNwx-G~gW2p_a!7%7aMG=L@K=rdxo=D&@|_7Jalm)@_xO-@eIgRY|={xT2naFH#wS1JeI!VIzqeRB^m-81%Du!0aSq5_iVv=9m{q z##8_jgh>sbtYaq1I>AEbM{@9wYByBVy)=N@>HlD;`@`KgawRE!|K47jvNRSIN@}D5 z<($ICKg$~-E0?MLc%a=molUQU&ueA2+?F47wKG-i^{m*L!gw8EhpR*I{gs8? zrP@$~CgUeMNg7$*W_U#vrsS1EIS!TagYxv`qp)@ibaU5%KQT(+4A9H7!i{Pw-qc}t z#R#+4(2Ey`Ip#0q8_8|4?4`}+Q>xFG)C-AqIdr<8-7F>~l{HqHy02diHAdYh$gN}q zX)YF=_##C0lVb$_aFTD#{;Rh{>$}V9`{I{C>6EQT#;ZuXrqre@(_)Y%yqZfL$6tE9I#f64kxa)@5eed}# zFnGD7cuY5d(&c@EB)_Kn_8=Vk57ZEP9?ClW@>T^KF2Osh{o2yAa6l7A)x+8eGVqeK zS+QxhG2WcEoeYAdeB*rrYm7X#5|x$3-SbRFnGgD2>et&hI%iFktt06DqIdHRFk>NI zw+q;}_nh9Og|}w51|kvTgyIhK#oh>v>$>o=VZm>!_-QdWzCX(dhTVH7pr4`2D`olN zkqZeVxZ7AN^dL|AxnBhZ&=ZH?Zdd}gS&V-c#B-s(=jL#seDVCTVpNtsB?syWi+U9& zrNU~&W!q^alE*P;Re4-!Z`Qhdo}7V4KM{ETXxC^z=JL9A{?rfW57cgiswi3B=q1vA zG^b1)gSoLCBj8{DVw|ELULW%h%#GezXr?1o4f+rW6}AUVQAD-r90$TiWvr{q=I@6( zsjpd=S84@(&nZdg??0vMp^w_}?qVj2FW;K~vC9c8Ze0~bvMLDvQ5K1T7@E7Hk3M*3}Xp$7go1t9X4QDr}1%TuO^!wLEP?PiA0ve0yzzM_Ol1{AmK8 zGpMYAQYkVY4|5`ibB?wH(9>lasGviiR3O?X*Hgw3f{bO*?Z2hRr4gDNJV@OBwir;a z7Ib3*5V=9ydA94R?vCTwcXgpq5yF=$)$NH-M==+N-++Dy{6atv25EES(=I)x*B(JL%*RwPC)yZht|! zXYfd>-fPG^?R!Y3X4Pu<(YvD5_(uoxz)p-|IddH>c}J!Gp|@|6(j9s;C(WD29&CZt zsMi!i-ZrXyJ>~-Q{BAarh>@s!R&%;_Y>;fE75IN+Iv|h`i zI`Mr$fJE(Y@@@yjk<}tic-`WCwb-lH=q`y8djr5H{YvcP;AD*Kd<$CkM8`Ix!$AuF zJU_1v0m}XTK<7diWh55ulV%>~q<&iQ2cJ_scu~%yr6MvP+mp$otf8vh9H0%3m=?5) z|I@8Dm4@+uH{{;;#*SE$_H`Dt8t~3Q;GIKKfpO*d7+wI+3xq)7{TpLS9p-FySB$oo zxKE+d0R{D3O%-H~FP?IW92^{bGglttJ)P-*J)5Wsh-T~fq?xA62WalhO4Q4g$}r5E zhO#V&x^PnH5w>^?{bE72(NHxWoHF;w-8q03w+fg;%y;_R_t1WLH68Zns0Oz-&*vWd z6gp9;K&D=2(rQyfi0i<95y0a!7f`DpJ;g1y1k&iD+HRX7wqj;JjA3PmRdKVeY}5v0 zTwr-m_d+bAXqMqLN%K>gqEMtHssW0&;ROQE2WjWZSVXuAo_u*rjJ-y8AF3>P7(!gJ zI2wep-k~?mGgRz}iC}FncByUL**2mVxOrE3%lxEa$aRG2<~(}ZKFu*)!tSLEr#KQH z7l3hk_;?Nev0(mnA6jgF=BC;@t6i9e`_{M0F;~~wO>NMC52El#V8JqM@O2;j6{{P| zYfciL>Z=8jlaiyqQ;Pd_{c}9xakzx{$n#!vNGDQtoq1oN?&@}_z`(hcae@6&#Dl59 zLd`?{*g|U82QU$FYaYH<9IIsPGv-&n{w$eN%&t%W5tghAZ-51|e&aF>x?lgc+SGyG zD=ofcO-jrf@P~d3+taDu@ag6PtzXr|B+1CLwXb{Cgu1`USU0e0FL*`%o^KBt={(l2Y1zEI>)cOOjSy_7M7oQ2-V2ACTXSOHF6TdL z+@S@yt!`A{P91NfiCKt>CbZ=re}OZYlLT(yt;0tMF#IZqD(GpQjs4CvD_-^6SqxrG z(5%C`ZhA4r09*$HZ2Af{BJhmeTZ>jdwdw5}11SN@&ntIJFI=1PVoH{T{(>b#vg-6* z2G9Qd4n9yTHxt&5*{!drG+SI}|60+1$9i$Y{2U}_a@Ni#SZn3iyE&UTm*4#XG8y2V z?DcKaY)Zh5X(7z)N!_E658bN@R7GIZn5edZm6Rby+xXJeNV3Ph@>=_l2ai0* z%T&b#9DY7{0k9f{Zbe}P>*X){uS`#quF>v5#40S4dtv>t<3+O&HRWgmFaCABqRwU4 znfMAgkJpnVfyrNMFzJ>&uZor7u%#?K;TPRvTWmKuJJfXP0XSToP~E$GW^%-u>~3iXMcHs8SY9*q1r}1EiEVh_Q{d* z)SelR+03;LE>VBKLv^Rih#8LnEaB{wPV+;uJo9@7lTZiIk?aU=0Xj9mroKg2tufp# zAdiZ0om%$5u<aBvm9Z$xWYp{=(>Xg#k z2qX1n2|L~fO46@)TubQxiNw@ux;Yl#S!;dP7A>RFJRlY#Mb+7_GbxHmd0S}OSa}-n za`vy(Fmo|_aM6P#kjNkGOU7_N1Apn86PvV0u}#xy#dapcS?F@BvSR7~f;2EvAbkN5 zyK(7J?o`?>V`VR-ns@79dU*il!AdKNk|R5@*i>9q5lx)Up^g_j4>@!#`mbm(Hs7zt z%bcS+m{+&p4*K36?A=tqWh}ZKa~T((71);Bu#@m)8FSeiq86LU_4X4&gmr-B=`Idj zLclg(2##n#lkc`41wN3qledQoLZPvrP&2CBu)XA?5aj)1LN{?w*3R2I%=hs2Y&S$8`1ui5A9|ov+PtJOc%5g;ccPP2HQ%!=bZU||S zCrcHF$A${9LudJuuuC2(`NQVl2UwM|zG=3KTF(7xOTrg>JSosnYjcGnkN3_E?_$@f)KbXIPVjQyr6~4__8m%Lx-W)+jsd?Lz8x*#PHXP z6w0hbk1wzV!L+(nS&gin;#i`Od){uB@0!K>~ZN=L{`cm{GCG`x9^bc8)B7+(^M5L*Hn36Y4wiL+d9nFjSHU?~OTlFZ3%ft0p} zNWf6^If}cOv#@UjZA09_sBeQV@7Mf-eS&C)DceJoG65GH_+hUxLeBAxvBc`<5u>3x zQM&K2C^il!Buzg*$EJ4!g#I#{kpt!3{>-AlX)-k-U<$)S4V&-p|_%Xr-ey zh+iGku5o4{wr`>1^GgC|qbDP!^MgtmZ6_DEQnOy;5z<8k`TO}^t}Ead+FV67AGOmLpO0~0D-*Q3zjEIkmD+(|siKo2o$a)u z?>$211V;Z2y|^fJg`W9F0SJwJIpe|F!Zr?c)bGP>nBcGo?fjDA9#HYnti$;Cm`X7! zRoiDn`Nv*KHh_jL8wTjot+cA4H3WJPx_@(?kli2G{^rw!Yn^^!O2fc9|7~))I|DR- ze{*tBfYmBCI_Rk7=xsiaO<}qJ=#gd6u68Z(6EspZFmxOt+%O(~$(y7q?3@ta#cC;X z&5g1%`T7zFcbAyja(Nj?YhewDE7pf_} zTcO!sfD8fLJ=KPQyD6*6JY&c0fw&XjBpV#-pKrnmk9_Y@@OVn$WOPNU?O4ShWtDH9 z_Ji(qLC-KUb!3#ySDg^$3!5rTPh%a%Wx?5_mkdFYzJ4{_)y@l93e!KjmpVv6b?PVI zlDZzzxo*F`SS})Jlk;I$jh=hvx@QG<577U9E8rgqdhHb~zyKWr1%liVF5QO69Bm$a z_VFz33v6(vy!sWocg^nv9}=8NbV*#NHLp5c+dSRtOx?o?7A|t>xdkpZD*_y_TQ~F_+lhFZ z7ZFq~W2cE*+};q25Z-TWo)!~fzy>QKlMp8Y#!y8%kpOWs(DR;`{&uNQnds)a~9yI97Y;Hc0HOptqyO;oHnuD zXH!uO$3O5Gw8SfkOUmGH*juR=>{{t9MDR-wH7nzzAWG2d*0Y4bv|E)AmMN0ZWTx7% ze4!5W9?R3w7;ej>wcbP_9X$Y?wqD8yfD)6;F_f#aPnNars;z@QJg2wRNtz`P(G{Ah z0susGftH}JC2w|4Yi_x{^F;7^F8~V3W#e#}?r+MX0lOa(IEQx`$3okJQ8I_k*i4=&w)`3)l(x_C&FlwO6;{5S);z&HJMT-M8WT?8AZ)>SNna8ngtDz zdwuceB6Epl;1Xx^RPY^dDHK`4F42WHgLp(hd;9*u`@MLS4)%HH*&axWS$7~d7~u*9 ze)%%d!|4A5_`1QonbPOxTMavS+PVD%s#u|=}6SQ0G4qvIS> zUYSj^ZbjuUF-E-7xCq3Zx&TtS)g}O;w>X+E@*FR2BuR9Lk}P$k&!MokTzD^ajV^8P zVw5m)o;TxBe^X(Mmo$r!y(}?-&!KsQ*^1M6Ix#Y%`&U?Hwi2Xyz%cP8BLK{aL{Q2< zQ9sF%#fL+mU@_>_Czo9celsa@ipj-_5?9^p9uT^bX2v~=SG2IrBQKNXC5G2AL1;>$ zPmEY88_hK!6a@vy89@ByCs7@&xeWtY-ID`Mn zasG->%B{5CM{3>!!*9#*cOZ&{A?I>o+5X*H^>~e>0n7cuz0$i_{~g-iv*YpM!u1WS z+M&rWlO?icnNtFPT$2y$&`w8~RP7tB{U(-nq84f%H-JD;3uY5k(NL)rDQTN{edo&j zMW(7(q{G6=NsR`;U_5nHdAdGvwjFd9w6qvU;VDV=0A=sU51w{2m$OYxX0a!ibf^Za zJX_Kl{arE1%!spvkdE~KT(CHd_6Kd5Bu4s3Jzt@v31kARD&PKlhEL@;C<9!%XaKRJ z20Gu8bGM1PoS`saGG;`qa?a#g5`e5nvUecnPzJMGE{YjTr$!@j@$%yE8s4IFp&UuL@o(sp5_#-mnQ@1Vu_sl9){e8I?E;FmTV zpR@~N#K%>FwIP2BhX1_;0?Ok8CgZaj=<_WDS|{AklGN>p9&xH$Bd`$JGb{h#MV`%| zUh0LNzhB_4)>Hm&u+K0RSj|d5;%u)MwE!p68%{NPk?QTCK`uF9gUcL)zx<*D7gVQX zG`zaN4@Fu%xH#x_2@{HR`cQ*?4Q82>e%a{(UU{J>H{RvbCugzfc&zWG(lxKEeMRkJ zvz=5S($=naqImenD|A9-mxU}CLL~)Mbi?PR9GENX#BoOEqb;#qh9@xw)nyVgE^ywD z=rR3=sZOcixkSL4doI&^y*$%S2o&jbB)N`p)G%nMEG9)&z*W~B%h=D}i;h``Oy z9KlfpGq5e?c;h*>nWwXjn*?@%O5#%IsGmb*!%53bqmaqheJ!|67W{>XpGdVSJ?KK) z6NMtK6mwpMSHm@RSCM~hE_;;_j%J$QXD87l1rp4 zUUpg@83{q9u#?XzggNBQ`UVsbzeteu3-XfDCy$l!3U+@!$Y+Mg3bgm}synRs*;;sM(#0p8RZDKHVPa)vd+mygHG8!Shx(^#=ARV2hqsLitnK=J=sxqY zUJ(Q*+vUoy9{5pZSrI9FVA9I_B;ze0RSYlXISbwmjo!?REE=57_w#IU1IU}?7xU!?FyfX?v zvSOF@R#t3pcc~3MqrekCI#sUn&4xs$K9NUxT-p!~0xfq%%SFMF^f99KkJp|_VNPy| zO<4*U$xW^KIcb8?WbxKnh4wUzUG7W#FkWbjL7!0}zhU^%x-;$!jwEQ~FAxB;I6K;X zOJR~U?O-SVVG*dVOJ~NoSUh5SI)At3mA*Uh5WkA0ZCGd#BrkSw@&^aZUm%^T5%HsC zu@$j80$>crA&ivlrt$2Fh8eNta(hl?;M<+*ON-`@db}3RkM{h_KUHMUmUFZB0u7<6 z48o$vdX^R5kwW+JV{pn$fvLT5kNb+4_1S$}h`C0;uz2j$@FdLe%(MxEKw;`E;3E>k z&tcq&Ayxv@_B~%bdU}3()CfiU^?{n+zH(XZWuHDDNe3r1b0s^<8kyDq^Cz*LU0;J7 z*)C3^FDe`UHJmv(=Hq|8KgG$*wwTagTi#Y#KB*Kqecm&(Q%pmkd?AZ|X`%H&e2w9) z_292~ar+B>$bQi83j+Nlpl>Ra>6%jCN6boF_V*E5*90116OE^ZC#$TtN0q!qxLaUy zf_bv+Dq(P^$#2xoz1_pfDcs)lWB-($qW$|ahqn+06U^190HJTYIOUoR!FJ3oaSfpC zPBpI&-1+r?U)dJGE8Fo{0}NQ=9Ei_W>(`H_F%%UT9Bah1ncApeR7Bx4su|jTDIs!B zfnGm--*?mAoSDV3u#16JI||VWiU%_cp6^i@5RIPzv%|BepYh`DclS!Y`g_dENsVON?*)%~=}x1r(@P)luD;_pf?mYl zg^7;9r z^>XUqt0t}dLDaBa*0G$!ez^P@Uu4EYT(ZIv! zNAN$ZhFaq%b1BEQ?UjY=t|l6Wdu<7cspvWscz`qCauFsMk=t#saJ_<5k7hN;Ci{+2blGkbAY|1A;<7S(Ggauti`~yuu+egjw+7s5Qq|v&T^*R?e)Fo|EY#UDwqV-Q7i_QN zi8j@G-|lgI+AHrS;}P4uwOsF4}p7E_h++di%RKAtVTpfcu? zBNQXK?$6iFWN=zD=z+(`E-#1m(a!4?!F*ZN8p(=`asB}xlh-_f(K6a!e4kv|-Sb)4 z$UeD04z8sXecJ3K_lYaX+b&!Z>2>eRJ~qX&=B6II4+^U=S-nc1=|dVsq7#rks43?w zYt`AiSBVG7i)Gp#8!4oJ-mh$f2sw+Xhh1yI@D=>P5$^rVE$UuO~d3 z7Y7Y)M$ulp7C2{`3Q^jX&(;VSC}aZoF%}8FJFTM}aQT}(*ARgeBHC-9Sm2xtp`CX1XTyF!?`_#e9a_UbAO+}T|B z`HQ#!UyW?9V=GPD^;(T(p{hBQ6KYTEdLKx@BPm9AHMx(7)6y9Rio%s zRB5RhL>_Rz$S_3N*v@IVZvN=hp0k^8VGS=)fN%bd8JO#ARv-%|kI<^< z<&;|&wbWalWaCtDJRfpDwFcZeZ@r@Ug;XG*&0+2re?wnndO)8TmbmFwR z2$CPpRGK-d9?0dj4q??TIO$h%T<)jW7aGfF2ESsEqqFh^PsHD-Yp$B42X!EW8^+Vc z&&Vn+o)aa$t|D&C-{THvg2HGgABkCv^j%n%_^(urSqYhtXxfVjiF5WF9AV}+zw_c< zw~_Ub7C+-xov{vzkzbYTMyV^n|k3!QzTsgg4g_trhe= z_GFktlfXFj^0>%^7uymTiDYy2iHz7jRBz^4ouuFJvDUK(KHJ1+-^xMra6~Zur5sM*XQ-ATRLE0d@6$+JsA3!L13cD7EwsQW622Ju zW5b44VA>L@JsjxGvzd>`ircw5t;&O5mEF0ybK1B?UltECPe=+W4ZPj=MxN^`r^!== z>7gy)hpkq{6QEjNGrc@*{_7WOQIk)MNH}x@u0fI13p{@6vawAR>EmEg<#}r%xo2+$9Y{l<@8H-0NEoE-1L%T&24ZR7i+Q{v zM{9Ah-TC0nfbL>xM`2sca?f36f~ItRoUzdO2-GN9gggwkNN)$pJX%tD3Y|W6Ip^R_ zJa;f*;`YRfFUkj`y1{9!CU!*`<0G+{|AyV^{i^I@iw?H7&ZcYB z7X#&L{>>_Y!xr5g!w)8VLI}?u;eHl-2hD!+>>0o`j|s1Y3H@V%vO7UCaK6%Fm1E-! z1DQWhBt1kH+%gT8-K^4(eZL|yQSNXlMAx8sIFDtwPe-Qe_o{{s5_GH~R(0CE{l*b9 zm2o=)a;Kni`#z%uxdT_qXuhOu4iuxnsd&k0aOe7ujcl#S4?))^&2_|lhg@w* z?ijaxoQb`XnWGJKyUGNY&wyNp6LR1(qH;)EFGN6Zakn%&8h?!Ea$pz30-+hlaa~{xV3d2 zNgbI=GMq}jISDow`A3cWv3kU5TuiI1St#EFyMQfZh9G)pI~mVjJnk~Xr#8Wip!a8k zgs0hiegYIWLo26HOi{&h{VaRdWuvug+*gw&lj?Ug%j-y{%aOKNJF3I}1`DEWODE2( zE!V!_hgoM8%)Lq`cGN(_#Tl@y6zfuLXRCfAUbxUJ1;?u@%1n@tN*DTXp7f))7zCmK z2KuVAdsmT2*k^$|Z02l9m*xJN3t>FgY4JRiSkKE8i_c&45Dysf);5N)G>obbu~K;Wj=NhIokCz1mo^T!h`x z?lTr^tqIlGZdd_n3~>XZ{LU#9$(x(Uu!X?V1zZr6*?6&Z!N;isx2JHyoM!t zlRKrHsB+(f+D$xBYqmiZ+F8m=YTvsb{qPSyzo}5gPz#Xz5_pq$`~O)Iwwgpo4U#F5 zOW&H-ie5bT=1?Ys9ta8-LOwj3>8y1-oNam+N<6(F2h|b;2wIL4*zy6GNOI~TIBjI6 zT|ikI8~ClKzbywZsu83ZIR_KJ{KF zxukm1caQ}VBUNzKk2&8dULPVQH|Q9CxVJ)c44+(U{|6{rk0u=tzpaS>14@cp|D=5f zrO6jgsq_Y_0PX(2`ImT9l1G$3208ES&9XPguM9)xO9TzL5!_ejT=xFH-#}wJ7D&h% zx7umMQC}$-kbt;FtAHpaW~umVhg7pH0>iNy`H^p3c|ll$+G-lI)5iK%z)4qRm_kQdC4 zy?@#UH5i{QN%9oO+k#z4PNax9?RW5A5WLbXyj+}>ekr0>wv8HGX4iG2r5;3C&T&3#xrkdwkWGaxa;d3j|+^0DpO2$*z($*Dwl~8*$$E?&aRq9B+F+K4azQs#vjo|VkX&wclpoDYDA zcHS_$w|Q@;Fx+24U5v2TCTyan1aT~o$y{xn`(}{LeTv-{CC90K%9ersBp}VEV>;E- z#mSH*=7J#-U$Koa}Qf9AAPN*fVnl9I%6KT!;DmI$~> z-P zC1Z#J>Hkr2y2@*G)=zFco8vp=N0M=ROlAgATHhW_Z5!lI zi3;SoueOtPeU5og=rOr=IaJ?|RjvK`N!}!jcIZi$HbaF3WTPl%` zoj7tScC~w0|FmcQ)YCGVe=#&S{G*m@*`=EC7FH1-?P0Ww8>KBx&aO*r@7dn!(2KRa z<6S)lLiljqPX{VG%3#wVWq`{j>Dn^&)2+FQK9)3zH-k$R`8(SQVnd0h) zo8oe3v0-)bP&18a#Y#TjtsYa`6=X^%8=VJD3u%HG59FYC6JO@9DY67m1vkd7O@U)$gLP@S}1cFYf*3&P`6G6X)^ys zvOKGy@!_sBinGaiuE-h^)hHMny=( zcDJLF%0YBR#83Hz9m8pdopK*hsp&Z7!c@t|pR5PJNTvW&yLFQ8Fpn`q4b-<1q{G2S8J*$V>9SgLO5q;UJjSKReqZ3rUGKf40GA5ox;Q981) zoa8iw^4~*Ij9@5xgSpTjH!p6E;q3^-3;l*LP+;rGbDY1hdShK)QZC3a*ST&0*8n3W z<*RP*{SfEb>&e%OgN6^pJzJ}p@@pW9O#dkwvj28spZeqr?WXfn;oQMTN_I%xAlzm5ajNDf^_Kh&OB=I^35WBZ|8-cR)*DH|oOYNqvZPPOAjr{b^tu zRu?aC&KG$ktk`9kaZGAPf6jeF( z@lwP9&n#QCyTkjSzxoBW*Yu(d@zQ(H!j8=A2S%t)RZ<1_XYoAL!-`G866pq)5& z{vz?}?&;T*WiQ_Al$U{Lt#L}wYZThAE~{(EuR6ECFQ>I)%qY=nnmo(^b8wq`V22W} z0A!6RP6#L`W-y*TQC-i=D^ns|Z6x636U&)X?py6cIG4tEjSeUPc5T2jK8eD>ymNL=C zia})&;ud3^1&Nu)dtd?{s5_eo8xJAcg$+pVQ5DM_H)jpb{C!XJj0^#sOiawLCi@6n zrhC}#)&W;M$;{Rp$ZTUjYUFeRBEZ)1esikUZnT!CALr6Tw*}QKr>7t>YxcCme_wWj zBbZ~7s4v0^w8GOQ=q_ZRM5?aU`)ZX8r657gK5XyEz4djb(D zNdsLBat7npRc?kzl(bx0X0J$2YRv>J`}KP>kx~Hm^tjxUf-jf7+c6kYTbY zTgKp2um?7s*ejYy?)muIUwnn5n38^p;BsVB)oIo5*}{el|LD?TyS`e z;~s0PrM%A44>JexnCpRwYwY-wY5I6OybC6aw?7a2fzL5_0@DmNVbw+{1EJ=&3&~(5 zy>O7zmTMHDrY?IM^DB^y)E*qY7YaCYP0XJ5(f(ZFzb`EDC%uzm+}g&a!YTz-)E)w7 z<)wdVKVkGqFZafR(zcnep~1xV`T0jS%kEK>VkKz#MvU1WWh!eg8=0+pg+&aYubM|! zEQ>97+KEGb6J713sv}JwG1V!E?Dl1~-ka$R%GP(!XLaN86v_T$DnycEg2MR5EK(n| z4PU|*D&h*Z#%+Tjj}ncr>F#D3;ZtF8P(7&8;uCv=fnlgV%8Kj2^7Y0U7u`&%5h|#L zy#tneE0q%re3zI!r0;fDTd0Bb zkHxiZZ{{pbmZ?ghj$d_&YRz+}zUg%L;)LEzOgSvk#k<2xx1m)dvcnSA@bp;$HEiTk zN2y=e*^b*2nxrOV#?xla_)ioZvQ9$<+d+aq!b{n!Mi4(OzF;2ITZr$n+(EwQ^d8^o zFAl<6Je#$jrIqW9Bnd5_n_%P14xu55$=oA^ ziex!dD>~q8zR^G+x1Mn;Hifhle%el*nHOtkFm^Y&aX=YvdQ^6E4Af|Ov+P&W^#nvx zc<^Im#88UjvJN)t)>~TfE_|pe8C@hU*9$l0mG|%ZCF6Wp(2JaVW8=wGTk*GQNC6vi z{H>`yWRBUSroeSc{&mfcf6Dh(wGjQ|8=nUEm5El=+KJ?90wd7Evyh9{B)V!Y1{`_q zSA$1?R9nYBY`FC}SCcJEjH&Kt@qLgVR?F>Zm(i5eI0yJoN}%sOZXZhkrbw2O_nVy| zQ^e~UD~CWB(OBDj@}mxF(voPLJ-~Fh>B*=b-sbFF`Ff{~7F{buK=K%A^txJm}DU64KmYTlbnV6p)lLMzb&FD%9xYaH~5WkrJ55>Bx{_+$=(|J$tgdCmT@A@?Hb3pb%W zHZHJw%$5lr_^7eX=)iZ7z9iRsirw`)hz09UpTlZ*j5;-RoZ1zUIDQQh#qw({bPlM) zoPLfM>(|8*8hw5W(h7wA=t6`#MigPS1=Sw^$!vOa_1`+f24vkc5^gyvQAOoG!}^D$ zF}<0Y6JFEq&bs<5MjE=rfy|_q9PO5uPUzzKNXN4_ubR%H5sT|y)fN8Aq7`co>gY$z z=$sYwULv{4==3N2d0Tvbs{EP`tEINt#_Y@V&SH_LF1^toxi84bnh5Z^Si$@((n5uz z<^P@n4O`BQ72@3|Gk9X?Uzpnm&4LJ4EA-Ymlbe-F-i7f41MMJB|K)mD_ku;^or;Ar z+Q)^Vo3}K1G{uQ`DW#rX661*HY%vWukrcPQ8Dfxccl$$Sk7X(ApfSAzyCa!nE|T-6 zO4|kX6K}h@?%Ok1&tI11eV4E5uv}Yi6LVA=If&KWco;kJbxhyp*%=C{rnYQ*klh_; z#iT(o3N66(}T%Nz&u`h|w|(YDNb>7N5S5cbYMh zswd*ETVzMovjx|!4?`_DoLDVl$)a;VIi4(i&Pp5&Hhja-Wzy3C5!oyQ9r_-dY( z;4nuPhYG9E@JXIK7RvreaBAF(f%oEi@k#6&&{rhsfollXlt{wY4f8ZL-=P+kP<;c3 zdb3%lDEl>m*Thb#)P{c)h7NOB+{%_5WdY;RP{UBBwPjk~a{EqEc5Y9O2DYTI^B51= zT=iWdRM%ePym}uteFKOs`Z9HfFY#`1Z*0*YaiJYp1juH7<{8eWE1v-i(uSl_NTVBT z3^;p$?fG!aknbt^WORWYKSG~zro+&<`Sp4|b18+Qrnz;&$&Tzo!$@#1qzR zT`S98fe=dw0`D*_KFWUh6aEQXxZiYX>yLbU(9yF=t`CUxIEW|*UNlW@d>C3Y#;a4; zFG=RgT{kT%9m%b|y!Bd6E^@|&Q+~Z;&d@{V=)lt|1Q)^CVD!&){A5RT5NLHwY<$eh zacE|lYjUVgG0chY>qNbk@*5xF;k8>*-aw5-14ooR-0eItmG)Nm zxwpFjm#maoR+gtODW55=`X)0R{pN~8eEWWsxRN5*>kDFOGAg~9v$Ds~Odvu%h2Gkj zsA$^_*on>wZ`z+;%bP4YqD_TY@9zLx!Ii`HOvjPOm3`VADy=83;WWLZ*iRtugf8;2 zrs$`NH%iTGb7VlmaZ)t46b;mnDx<^A+*)3xRRGK3v-#` zQ$HjYi(L=pxTTR1Y+2GGh%^Mfgv;kFk=(#Dei?ykv``{ewKK8sI7S~_ z1|~v-`E<~!9hOT4C{&MK;+{hMfW3lH&h7)h5;XB_yLaPc@^vEO9dVk^ji2offW+~R zt#HWpL@&KtJ=JMn$n>M9YmH^2w>$UOKP!9R4QVwOa&P0qngKdfr<){2^-~a|;zxf* z#P)n#tj0gHg$Y1nWGXjrl)!)Ht1oy<%aRma;3oR%Nvi?WQ73bH7nfUXKB1hgP9PHh z8F+@~zs~9j#}C5I7nce&h0Iz^!P1bdP1*JXQlk9y8%TcAg~^g>cZt(-r2pXW;G(LW z%^GgbSc+6Lv=j0T(tjS#Gj01R&%~z1a4LKrxDQlNcHYynBa5BfrlqWb3DSW8E-57d zcxT*7uKT<@5HR;<*JpbQc33n{`Y4rZ!u)hO!P>ceb?Dd`R&zc_?~7+uF5!v+7F_#) zWgK*;r@pZdR^gB2X7Lm)Uv6O!RugA5b|c>js-!dSw5iPh;xg-0jUPC)yZtISzZ_Ro zx~Wbvr0R`7DgT354x@8a3|ap`6f|!47%krds{>ApZ z$tQq##m_t&Zmm=n?VX;g3`z<41IsiIhto-)5J+k9)oy5w##EP@y8j+Va+CwGhRUeS zyKrW(Wrc1_A?SCFiP{b&bdL-DigK^cqlV)JRv;bNtaVY^Sb+oeYxm}0h~}T`dLhTd z*(%l8tP9Ggld_*L+_I%w=sqNEZV%Vngj9qr4z;4M^CP;*t5aFCw6Fg=RUUNoKf##)>L;N)J;Nil6nf{sE#^DqZ1}|Y;rJ~BNs$DiSfNC* za!D9e&1vDA=5*g4&GYvc#TuJ25H*!HbX@BKFP z$I}ub@)NfW#d0N{egpRok~LeWu1%3eP`RhWYu&P!6XYz9G`Rk5vFR*dx8M@0b6fq? zos;Ua7e7smxT%RD^aN%oW5wLc#rOtK(E}2p)_^scEfKZmfSz zl#_M&Iwt55^}fPrsc@pUVtwSJ9uJ5$1)AUM-&d;oUDZYIz+@`u5!znl0kI%liD@Gv zf`0Y!=HwdaXG#03;<|y2%dCo>)tj4K#vxZ6({}SIyGqSN+bM@CN1wx$^nST2{|#a$ zwDtHtWePR7**>RVp-iccuinBTg&U-CQ&v+JGBx}>zwERn(}d&(?(HFvoXG}bn0!QW zT}hwE1#e7|*UdZShuB0$N+|Ciuikz4KzmMJ3o+hWm;dBagNV$+7!`bzZ{AXrfmelz zL58z8tIlE|5IDl%7c>9Hy3&QMyZ+uoEf*8Ew-1E4p0mFEW-Cy(9=xs~*Xn=-2|Fpv z8=QH~sYop(cbnTG>d=y)VyhAqo?jl-$ONZ_swR~)T@SXc#^aFrK&!!mMsIn&VPw&< z))IR(Z{#a6zBgOYbnB-;=%T^;%mXP6_|1Sahq^i1!$O#@wyFPk4w(tV&8AyzRGke$ zXGg!JTEyjlGq^cDy!J3>kGb49Q=bo}d}91;?7itC$TJ`MeNPfKz?O-TT@0ZbWKPS4 zl?IeEWHK9ZY>)d?lXYagQk5w`?GimvroKGW1|vb5 zu_!EIeSw*^<(le9f}ZE-b3qs>3-6-j7x|Otz_TP^0+v()>M|+h~!K?bqcZW=;xM znCPRHF@*Fe(!;gQOPztqH^PAmpdHuulG|{12T@iMTUHbJt*g5P4QQSG>TEHZ2;VXs4YXJo zYbq}PrcU}1C_S$K#&rb#vMa3oG}=W*BIT?yl3|#=Ts;=|r;z8)gIB52VP56qM^N`q z?DMm&!^#OhDfE{ey<(Ur_rZiY-KMF9HtgWk!6zPJ-t{N<#a25eGaS1tQM|*q7E0r_ z-2ZRA92W#k=cL7{qb=XiT&G-pC#Ug>7wq4K{+>>_s|zj>F*!J#S(}{zN+gQ+j}Nt) zb6NOv+0G}0tUy;{em?$kYj(C?e5H-~ceb_Dy{^;x>-w=v!H{v`&lXd)hRhX}_l1Vj z=IR4YJR+pyzdTi%v~Sa*yxoUf>YG$0k%NUuh>o`DWF5m$?qI`<}iflr1XX-48#FKNbvofFjn%N6iJ1xzpa@!dFlKm;xAidgR zY0I^m{=|VjvM-$Mzg6yIiX~zcl#-#}MA_fIff{waQ{%_iOQQscvjgJvMzk|V$olee zxJ4T+uaEY?FXLkuYYl5pIp*55(I~#YYY)BT`8C86RlyCa*CVZtV4L84)M!Xz1oa_9?-(3zjCrwj8L=V^+Ra?XGRB zOy#_pJw91b?NJX{ElbY%u>0_KICI9sXR3h11Zqe1j=>Q z6TAxB$m6`tpb5lrrlBCa+O?L2ootGGd9G4I0nCp|T1o~J>K1a!ry{ZOv#c53dy@1p zjyv4PSnp{AehMMvfGMsQd4i6yluPU~D7crNG!a(dGp$r2fp0jtT#BKPYlL}1f7cN3r1_>v=(1P&{6BZA+#0Y2bO$1l ztxHSMps4~wrbLVtgG#QQn&CDq_NvNce7TwA=@3d(=xmIudB=zzINWrh7sMf!^2@6M z2n)oNFIBT7u$JQvtMQLo0f5Mx;8DJq(Q{K}deZfA7X-0zLw;zFg*H+HYDQQrsNK8Q zC1aom3?W+XBzKAF&}*|liqD$x%V(#m^#*Euy2XePMySZ?cPWM916c{E<)JM|)+s0Y zHxs_L)-c*+l()e?$P6OC6+O_|!*Q$$G9}tQn4${xWZ&h9QF1r{V6!2@exbo7p&_F#y%Kdd(rVO^)|LJF6>$#MI$*Z zm3fVK=ghTEE6-(dKYE+Y8p+IqmcTdbPIq|ui}Jrt%>V%c4v>K4hI(xdR9ewQ9~<&e z@5Y;#x$r*)sqA=8vZnH6rqeOE?IJWU*j%g-`cPx18tpd;qSIfwMU_eDgW|(0HxKs= zWI+PYZNbs5X-y{qT{LNoe4+eqg6!r&&mi+0+YP9WPmby^aOnKP8$IJn@2EhRjrm}h z|9<^q&zRGx@IAvQ42J8;Qt3~P!@QsnLQYT~3?<>h)T#2S>w1}~s}u+oI`-#fMSVPl z$GSZfS8nEfyp_z8=4qkMU*z%A>oBQ1<&bE0;0H6I z{Nt{C@};-Bzc*z1Daftm*8cL2Mg1ok5sL`W_ULA~l`V6aT^Ne*HE4MtQgjVuu|IPw z2+rY9i2TXDD*?gXM6cHc;<0>n6$_y*RA)%6?c~1NP82;s!%H z2iQYZwMic`KzEYCW8V1|hRdF^ZqUyk?T ztI!!npoTl_B4fX{P0sb#LOB1uGs}$O@COSmv}c}qv^<*M!XfB{q*wv>;zeSgP5hxt zXVN-z0EfTiQj>bf$TUGx;y!&UD8<2*vPWYRdgo9iUpf*9Rw_wVKV+% zmQz9;mB(EbBHVV5bJ?@c?Mo$WelCR?^K@buAhVfEa=_PNGu(|-B;Ovpn3FKannZ_! zKghtmZTrH;Sno?6Y)=f}i_yyKwsZC1CqJB@{KI{HxtfbQQp)^l33rd`e6RW*cLQ4p zjK71+mT8EAPv<1~{vP*oQE*atT-t4ptbEPx3M>re^;-;}_ELWpy(^RJ0*-qX$T3q6 zS^a8LiOAwzOquY;jT0tJc1SVJD)Ixtv1WJ*;o&6*4qoV1kY~?e zD|tGu2o7X6*IO}^$Z%HM^KiZ^zmWiEWq-)O#c=knusr8imAE9^d$YBBvz0oD_D_S%+rdck$;J&Mj;mpDj$rr3SO&|nr<4*<4qGj{npx0k4 z&~BkB{sN#9?#~D)gP3LzA&hK0DG7-yy;mxA1aV4R_=Wn zw{53ein%`@kgabP?ENagw4KVE>WV8%$C^%8|0V>@oeuHlfa?9I@-#m7!6xu6*ICyS z*alD!sSW-Ke%plauepv5y(_RBSKC%Rdv9X&4UmIUbC&d$Ddk3D-0BLTg@9ZOfYEn( zq>h^SZr!i_c38eqJEFz&d8Das1-fqf-|9w6&SbI>RNmxyP&1301$k;4%(AERIHecz zbjXveGyFfY0t5T0O0L%nssvn^N0}Bg6Tr59Y2RZHn%c0u-MzQrvY>%FSt4FxiX-3` zb$J$gnH?-e9+J%~Zn2K#WPefZ^PPhk|inSUM?aOTg zvl^TkZ#N{kS-`y*GZME-GPxN*@EZVWl{J`|vF2C_&j-_KTWIdboO0&p?bE0>pTd^8 z;?w%mCcc!4O*Vo+q+*r0s*kUQ?Iu#yyhX!8+3#fK%*(-z&0nJHY|qSu{7UTid_XT6 z^^>RW?7@kk|K zW;vPv-tJ^?=Gmr)!x75BJrH%5DCF zpdFYdXeqA#oXFtei-%XNkT)DpE3;f>L?H)pCR#7BteB@ToliaW`UjW8Nzb@e?Tf!X z9q#`8c4BQaJ5|#~y-Fni0tmZ0@@lG8eWzFJR4^t_2;P+k%^f9RpsppY}2&==culKW~NycnZu1GaO@ z2+wf!Wdc2Ad3WvuC0llp2o#JdnZ%w}b=!+2N!5}_W6poHpq#?SV&7st->_37y_lbH zngrv6>^g8i$hs3uU`b+2Q5&)B(ie2RWIsmgV|y~b~>LA7CB7j`h?N1fxU@NEa+E%4* zn_dnYe0k&6Jj!TYWKQkF*WNJVR(LR!2c^k=qHTz>nh2_8nnMiQxzm`2qG>jiewkSz z;bs5=+rN3C{T-7li8#KMY|qf~3Z0Y!)E@wvF1xF2Iq}AuZYyKEwAmQPhjqfRk*d{e z?o~jv!y%dWF0{3cGMg)mVELmcUxKboPIy()wC2T%g2Y1J40S8qPv$tost>(W@PplG zc1#eTuPN6GB3wz3>ZHz{6ZWGX$X+r=)z5{9M}*Jpkkq_V+kiRwljBgkdIdP zLjOiWwH+s*#fa2MXO?4n#t$8eL6Q>1tE56_Ck{NzC9J85X~rxf>#31io3^3;1cL@| zREyyLaM@5~Aiywv>g$*dIjqlx95QCrzF$+D+{t!_`6Jk?C{uGG4Z7FinR`+&rVDDVo9J|MItG1Pd!ZlUJS)O7MsHOES{FKqMYW3 z-udn8V11|SsIAYE5ZuoEo#66Ub-+#2xG9t6N zwHOPfzGpnwaI~!8Mw{?bKDS1nvlKE&v~!xflI3wjqbK5BW^)s^$FN{I+UL#$a5or= zl}O0-8Zb+}Ve}g@IxWa{iD#qsFzj_ZGt`H+Z>%!#SJdFB0Yv8kfS#Rp*)HvJD1EFx|Qg1y&! zS`SrETtV%0#7?l+_A{4$e>nlAW7=N23p{;ya+f`nsXG-pyB2G^?9KFf0k2%M!S{#a zt}H_rJIZ0>4<%gv6ItU}dCC1g71Uulf2R%q*u6vmq^{W%(tJ)5Kjv3+`aT^I-R@c_ zoZ~!Mc>3XKvuXFGV;Yp9?eM@fCBUX5&xO+`AaeU!j^F7uL}KP0lBZ||Kvo2xQ0kFe z2EMxbQ@EOoh^hgt9KLCJq{ODaA3=<)MPmt9kOPsC)LW~s2bFNHt{vkgCfvGWe>Ufx zz>>=4t%9mXH1YY~eYL``gT&eJ71PUglqRGoNY5aB^dVRfUl%FgFYRZbY0X+A&6ift z!`TOEiWBox@OBk@4vsfl0I_ISkAlv~wW(l?#jyq^4}|}o*)0;aj zonNt*6_w}WT}sL6dG##V%t6RqgFFtq96wTZrPOD^=J4mPhgRo$V3yK7n+~C7Jp<&U zXEnHnJ*CwJEiuYoj80ofxZqmKwg~&nx9smBdB~9vG?$qYQgaILf+sYPQ5aXvqrgML zalnq?@`B&3k$Q4r|Bju8{7?TbVMki~zW{?~=7po8<$Grzb0ytx3f)5|QFxzW)zBB< z_uBdR&u|p7eP+WE-HVN}`t*%!+@gTsY5f6S+IJX%D(Pn1YlWsmQU}<^-Jy#3BtD3J zQo~1<1kTwm_-0eDG3v=n)gQgJ0d%a6O15Ra!Va|LOc z1SWJ!B)9^DG)LOHl7I*0%+PXUNgz(p_9t+!-WlI&73DO!DPHOy1p(r{@nx$ zTlCPDtO2tBHO1E;$EWo_pL759?0Dn?LR~uf_`i$(wbHuGeVf5vI)i&yVh0l4oiC?j zMDS{pMZPuH+RT;ZySZ`!JY^FigZjaEy`Y-IM-yz|`REr}V?yG2{jYK2sw$y1_UMJw zZ46#%X5uu63kT7rn&gzftaOQgWgZpFoe}5CZH#wUn7$eD!ngZ9`X^ADc~CjT6NoMZyg$Zu z>DXXgKTYSm5$5qyN1pk^&f*J(lgkPOrb0LK|X9y@L4Zuv~iHPEw<8^ns?c z{t@2-^YPTy9o5sO9fY{>poM>Zt|~dubAKAUTmxUcQx&U}Zl#V&(6`L+G6@f7iO<$s z1`)CAY^(}UX)F0|G`{fPQ2Of2y$gDF4$z;yDVloGAMLe*27SH1we{~j^sHX2KPR?V zx2FE|!aUTvVDC_0t92`fr2kg|q+VIvR#NZt`1EABM^-6ki{CE3}wAFDNQnYsSP5U$WK>+f=}&6)QmazbZI9rqF3 zw$Od%{J~E#k&~c8^aAg_3)4wE?wAYU0y(V>^H)Cssv*P>dykYP=%KY*GZM0)VdT|Nb9mB72hrwfx$Zp>;->r~gNL|E$6!=C?w{nf;hRP2WRMS|{%>l|Yw}*m4oBLWNwcFopbSbbkrDfObkpt~mRo_O*N`4rt-wPh%FzUUa zQ!=c3$Vfe2C{R3cU%(TQaWkT~nDN0Yai5!F7F_?v5oI=pJR#j*^6&q-Neja{13I{p zcBr4C`Ippc)%VP019HUR94u^EYHW@K7{J|%W~R~$Kb$U!!!{xWAy1HXK$(VJ1rm!h z;C$P(cl?e3`#HGTUj^Ucof-Z|(--%#1p{Lj7VBO**8eTZ490oRv6`dunlXdJvqRkO za8r0c-8&<|eM$xV32xp=RkFei2lccRsfjEO?K^)>+MJ_B$xjb9f2ub-hVQPeM2&~+zk}}4Mm}5=E5z2u zE&eXB`RW~=A;3wTes&rLWvQ09kpo|N6|%Bf{ScWQsw4HC!zqsPnWT@hm^?G+>-1b5y)|_J%l!kg|FQs z;XeD+(slRSe}t_Eo0g@OC00QW-?xsp+#&LHRsF-t25o@Fyr#jtLTNV261tdzV7tJj z9CXT#I7rd^F7q9k@>BC2^I}e`B-3nukaDxfRdFxOw}rw^1UpM4IXe_MB|VdWYb8Mv zuuiSPl;(qN7*&XYErkPvcJ@fH@ASf>QuMT)msG0rHmP&FuS}l&_1XOy(B+0>bX+(y zUj07m5mTt4_{7bI@I{a!6n0ip{NH_amp;2mZKk5BuDH~6(qr{)>>y~kr`qJ82fOjE zQC>^v_UEsOx}JMkd~2ipY#C}s<3GBQ38zJLlj~^V;(gv|p7%;?i+Q0-cl9o;<)IwL z^^l9iPf08iy6+NlI{Hus-~^${|Nsi zqQcud|LhbOIBy+lq$gG^$8vYW{(b0=#A{m9NvFsmc3zMa-A~2kM_vU!R1-<>!q}IE z$zr>AX5dEn3k}ZUU96&!Z!p%>(?pPk2(y2~at)F7J~YnCn&p;@$N^_k(XvHa+w0O& zqaAP0_WepdvF3F%SMO+1eT226v}X4BS%D(We8J; z(H-9bYv2{d2o*!VFB4oZf(xClux33q&?FB$2YJFvYA|NJ?7K@%A}XvXcoqC7$P75D z%)Vjfcg$|a(&#q!w-QXXV)Jq?+2s7@BGB!U)f_1LWan>hD8NS+oPu}-I45yn!pIHa zRZ_JgCiln!EF{h5^bN!cUBpfLzWwjemD*el|KEI+&nbmvp)=X_*_1USA_Grd-d4`6 zl9TJCmv{2J`A&3p^KY`;uD)!iaewwe)UQddIeE7Dk97{j@CC~uNBrl$IjPK=THMDs zQ2<=Y-PJQzVE4*#MS&AuS-mx&FvrN8$9W$6zHR%U z^P1NfUhOuE5-{6tSj^V@v!2zFg4sK7_UxWI)i>0KvYn(Oq^Ewz4z*d*KG`?!6ClcL zrZxdw3IFO2@nJ`HW%q#^OCkofK9MOVEtI0p_qvj2#Sya=b#q8jR%w`;PucDZYDF^R zkkhP+*?pEB9+H!N&dblabgydbjjkXLzp5lT+j1A%LDK8b!S#wyrWkQE5~%6 z*9VU-f7X0(YqjHXZ1L#OT*bpx*!1fk|9f6!p)mG{6d^gScPkxu1@ZsbG<)7bIAYbO z7}qsubg}L0LqVjmv(>_7%g5fxi@As@HG9IMD%flD?x~Xs zK(Ofg@K%UQ&8Ly@42#GDzcZ1{@|8%&%|Dc@8jWDZ!bF^8m!wdB-_G|BSwC^<)8}P< z#On393X4wDK^1al3B)E$`Js<#GF~P{)Hc&SXD5qMMV`iP9Co!EAK5rZ)$cF5Bgxo} zA5UAIV^|}rYpgxsGVq8LJ>-NJ?mj%xVEpau=l5p@^p6&>nPR>gH(;$7yiQqd zDvS{x7nh02KxY;6q@`M0Snw4q;QQOa>;fXg^1>!M{Ur)qsl zwFjqOeaW?pxPEnzkllHpnEJQfqbBii7;ZXj{8+2|RrS~S>OV-&nBa8J%AlB&$L@pw0bF5j`Kg*5&5z1Z=#B837NGP) z3ufbvXCj^_(RX&P(EOOrySG*ZX(tMq*-}&^HsGiVdQ%i+YznH;2$# z@Rs#2uG?r?r{dDaD)htSJ2SyKGX7aNu^|`zOg1SIGcNI-a|gO!KTOrFbA0A@lmI)e9Kk!eSvo_&(X`g`nkZ@FnRNucZzKgAIAel0_h*3 zyk-;ZG3y%d;}07Ir_jdD8+j`exyS*_(*sHtd6(X;HPri_S=5dj+%f+)BN=7w5V2gI z)i!Q%XMAO3H+$_)!1mW#Q?-)gaG8`VvoV0=LJIbsYvKZifCuNx4Fu1QTB{Et7yJh7 zAZGOirjy1~5`L~fccVi~5teqKe{PO>31~u6&U#9pl#`J(lW`athK`I<7b6WV%9t}E8zsBMtl(V}HEWAzvd(WcBI1gOZnSqWS$Zm zv}vV5|C6>*7q4I>)fa{nOB%#q;KjogB%-(-io!Rvs$x@~YtQ~ZpiIjqItYLZ=e;wU z4nWqSg{EQ)v7DLx)~t>GW71H$5w!Y83yyyv#T&VfJ>cSYwe}nQFLmWihv@azi2yo` z1})mUQ9`%sH+;Lgvvs|;K4<=Rw{Q`w4xcxe7Le-xu~V_R23RWH(H|++)7GP@jw7k%!`0b+*nc%D zhZ=)G^Mx74C(TAe{fuMJ2G%oe#=c`P&R7v5H%Q=7F(60*(1Kb6!QCLYVNwkojnqq< z0sX0G#wuo2mmlYdpwL?GL3Is*IkHLFen)BK^GR_wVAq1+QRUHeO9#G@Zhl_ntK5EO z<)otUSCl)dM0JonBlTsac!*s+-jVCE>Vtg6k3D>iS#2O7_8*#1Wj)0yaT*N@WG<3RLbx{v31Trs5=(kXrn z^5FWpx@TvD(qdlAJH2Cq{<&c4kXN`nUw(tdyMCM_kq6^_+7nzbu`}eR5ujjt_l#a^ z#GB4q1=Jak+P#|tT1u1WHhNbgF80n>ZPB%MPG8xrbfezR`CVR~AjWWTr|-RJ_iLqS zr>H8E11nF^==Gl~z3p2oPmi^2M#2$$?iXj%H*Kd#7l!FlSUoAj+4ToaW&7mwFwL)^%BdO zdSPdgtys(2G%Ban!8=-(!er8eUPW_hS5S(nVLfBJ{pE){;BPAN6+YOd)kU zXrm8*c;~eM#%t(xn~(ZHqXdOsgqp>U0yo;*zk`sg%5zuw(Wk;s*>j@b07mu*m-{~F zb=-#U(&crZ_iVLOS}%jtor?GT96GqM8r%$R*JqdR#W?%#+|Rq(zwNeib9d@5JyL>y zs1lK)NxM0TrpjqDveEn}|A8b}XO!m9hCJFR>{@I|oFhHEI&RZEQcI1h$_DMAUZK#% z(|GTx`D0Ei*C$8ATxF!y?0286Jh2b8K=}TPpC$WMOhLvWux~{h%6&UgXK-Fqk@M1? zF7o4?DGvbh=0!GxMePep37ZM%_0+D?i2TtBrVd+7_?rkPues7~q6)+!*^42}c0JNC z8he?>lb2ul*-U(03Z53|i0r0r&vs!6ah*m4HHkvS3u zF{m|0+A}JCR)iGLr&?OZmfgPSa7}%NvwsQ^(8Lx@+P#x!%idJyQDsq&4mu`SwJ|%S zu%nR}1}XIDuhfw&kN(lmqXl3j{SxyxW|kFqLD53bG;NxI5rCYBu$ zpIWgevk_lR>T5W}4UTMC$|bh%czigV*}WNF!?b%5ph0Zr426o$omC33B($N@5A90yWEd~qPNR#AJus| zn(-~YwF=4d*`+-NZWH$t({EzQ_KZ*H7cTam7lSWqi5=!tR{MkGHD>3}^U8rAQo8!m z35?L)CD@vTCmr(pxqF25#ABY{3VuKDPaWWsB^ez=CU`y~k_Gn{%+8L9z!-CZ%^CQd z4Nc?2iw>OyL*b&2ff)V>J9ty`}Wpb_$IZ}!db5wgNT@+u($aoEX9A@ z;|&gUY!&{>7eE26{BFJTkaa$hhsZtL95SgAOlSY?X8#Otl<$5Xdu(;s9UEsTo#JZY z?6_Fpb!W05ic3043i)N9AyUihpXrnZ9EGJaKh4f8+LS^1`oE_LGB0y^T>^zkNP7 z#&$J0yV*R`O)B^edt9u17#)O;T^!EDZbxmZajx2AN~hf^i~ ztA0)b^4|PuL(2JA{xgG4^FasqB}k07K?~WG-J1>>v#BOk(dy#lekHfn_qhc%dDrq2 zFq1jWBZ&Qd@B6Kzuih*WC{9&%#)`+5*S=`bGcPUf%i%)U@Yg7T5%UvB&j3+>Gmu$! zSMeoAe!i<@o*?QJN?*}qI60)}h)a2BEET<*h(9VE5PVA9h~!oquRb}W=74RE59Pd{|ZGW3Ggj*{a!h=o+YB^tR}+Sma;UnHX)sZ zYpXr%oM1Jl;>dC9GkRY8;kjQpagW}e=Y90(-G+h;?N|wW*{g@osTEATGrNqt_TdD; zU(qoVII=N^`+(QsRJEBe>82xUmh%+GE{?QX85= z?#UKPzF&*4dgq3Bf?hR@c{+Ce&TK#&KfY4;FVxA!*NGzyeui&&Z@E{z^$^!Blrosf zZUV^wy$}9H{JL?0=Z{aC?>f)pA$Ga+tC3ADm<&kqvCEGVHb##rL!~9+GSG(~t&mDj z@0(t8gP646Ds4Aak_2+-6U9=0{?3pA_?{%fr%9A#=@uDz#BMfG$H)tF?>JR9*%3)& zO5Pt#6M)94bfVBsC2-T&!LG*D`gA%_`kmTUPM}fU`B}CSkH$ zWS`rV?W@df*OCxZtn{PBnC5+vqj_hasqLdya?JkhVc1FtGw+Cclt)Ig@JDOpm>tt2 z=hm1_)5BV_GiwAn!Rk8Na9%l#JDQVPLG1m0{a>2)k>Y=xR{rgn&@Q?_D)_V~PAZ>s ze4VR8DkI(N%w`npnU1r@3#GR4nMb>4hG!3&JOcs*CmfR$Ct<@jCDp1(+u#sJBlwzkyIBs1L4%j0mv52}P*kh!q0 zZP8JzP=`h{r36&)RkCGr73hR3f)it3GJBkutXoI1$?kwjF)ZJ^;lMd+19ZX$r$;ML zHQ1jl8b)8(!aMssdg^Hk;6qkgrkbVQisTC}NBVf0Mt4^Rz2mii`?Rh!o5}RM_%^Iz z-ggrFVIiBE+GjgoZP@=LNG>>OEArQYrpKz+4y0^MbK!HK1NY#@oqBojo5$eUiRYbcfu+8`#In zhTm_w7nvF!+HcYcMQi7kT$Po&9nA>@=Uw$B?F?~zVC9A3gXUh?6ggsAQhq zzJs-Av|HtcdA1or&A`B4eoBy|!7B$wMP~$Yr9kkXbH6A|skoJsO2E1acH&ohlPSs2z-v9uPf4$Rxj?Iq(M^6qvE&M?W zp`Ti}s3h%FP{Qx_yKiVV;O8 zjpla-Ie3A$g2|R0bH)rj^R}sUN${SFCr(}lAsv{zhpCOu@cX;_F`A!tRVmI6-u0r+ zio0+}vm!V@I0ns(BDeW^;&YjSH?0D;r;cUckw&*&k8IswcQ-{ag5z8k$5syg{w3#A zE~M4vMgNY!wqp}emIxZ=NZtM-k?$7G`jRQdAYNKuJ(RI$_^(PjceF?Dc9O|)iW@Ozaei~*^`H>uE3q#O_A44s{5YVCb|XrR znGUS$?o36a=wUMrEqSarG#Jb9zxeS7I#l=+6av1jC+n&k@kO|(6TgbPia%o5(|!9DS@@Guc?^o_`B8iSmq3SXBCC#mX(tL&BTY{ z4Tz9r?pqzKBURmXmEiAc5r37CptE(}KL^kaP~YaAre-_e>r8_$_I^SIjU~}doyTER zylJ;+E1`C=WsAIAOAV4U*}I$%YK`*S!U$ccG=jEw0|LI-%)xK5Rv;lWA($;TS3Isf zUy-fJLVDTGzs&~LSzI+a@PJue95N-7n?!SlTTe~Z{ce2pFgxdDYTaQHx$|>;!mWY`_R)u?!LQ`=?XTGZY$qwhm-yB4hEqUX8u{&ao5p%`Zh6BX!uz@u< zX-gM@reRc2wG4T!Y<32xD9u%8_epR(ZCi~G#C?hlI>C3|D5}Z}twT(#lUVycvZ~-F z`ql4aD%CUc=4k!OX?*Ra7*GlS#Y7X|kE*}8jEY_^gclXh{18!GE6QwT_8q&~6*L@r zwB-Dx5P415bXMi*=_xMZ#a;0x_Uy*Yb7Q)oYkxTNAH5^eO2@oRmV#b;m(VR|mOLjV z%cnv{$BZUunZX|lw)HoIJQE;U_a6#6nY-BX)t zbB$^q*_}e)2%d=AqT%=LcHN&0sAYQBw{vO`F}NHxn~~&gw|PqBXL0n{>=Gd3u{wg4 z6pLSTYTTgvrvHJRXFaFBIv= z=E~okA9@OvbKD}0?Sj~ncCxn1bHe|9rTLczKwC-&RE#+_vB6Z6u~xHL0Ujd_C99qB z#ZO$>GjL$048x(5k2ek6n>!aEI?*8I7}dTi(C;uqZhh!Ym9dmm3tcNqx5Ts_0kM*m zbn`SacU8`Z=9q#{o{__&neefcP&pSgA=;dBl#|tHFUc3WwmD+Gv|%QsB_*z0(xFR_ zXm?s@u-j0+nfymLf)jZ$?->|=Sw0{)6i#*^v`XcZUnG+zi zHVi0V4y2O*|8V4gUZd1SGo{h@bT<-DSynUiIyj^RyhLXdFz&GA2nP?o{5;|E*DLbh z2m!6CpA(;v>%(ubi@qCDrlYSN+2_EKZ4-xHmmGlm>_MMTvvEJ|N*p8Wmxs^lIb^tJ z1IpaG@LWl@V)J~8`QKyeZelSrb5j0RUN}3A@mK@DP-=Xm@Ruo`@~klecy{R+oIR60 zN_K=3So^RZK|&^V34If1x|2Fd&NYWZn6|G?B168 z9~z@M_pzh?(No@Mh}I+wS)B3!)9#scRjC5KaOH>hP!>(1HP%}b6P-)_F>_F0&)wo% zedWaq@Uyu>-Qx$_& z26<_mmO?OnhT&=K3td`v^2EQczs}D#rObjBdO}x45s(@oI*|9~(r(_~iYt`t-NdjQSLy&yv)C3iRXjXn0oV8V<${nn zN5Q!43N2j=eEYYiZ$e)zYR}=vxfQc+&QC?)x6lc3eDrdh{*n}sSF`Vi^@DYM+<_$W zvV`;^*C&hU3K6pliJ}xWJ+V2qXtt;gGo7Qe{$2Q~8G@1(@}Uv!s7{-xLDM&!JqhE7 zo&vmQcU1;-+Oh)h$Vb5#KJP8aw}H!zq*} zCWKII4nQVpE7ax|;qs`#VSh0z8!_2j=4%}|Bj?iUexxswMf!VokM{KHZ_TaqI)OBA zN3HNA-h{CB3Y_z41{7GI)BQ*NXUYMC?MjHU-((hjdmTgb?m&#~9cR~~Y~_;L4)k)@ zrw~2zO1uYqm3mqwBL0?Krx=)%?2p-BK?>2Z^9=RF%%ciGPgUgX8M#tbw++pQCJn|c z{$?X`u&kpL!>1{(_43=s0 z`0_?Co8DrnQt)&cp^CLet+LK$5eXc_hFIT1(@9}=qWL8EA9@{6#)BTh%HNqcq*lOm zse7G9w>mVQc`X#Pu$X?~aH;LC^XYucsEQ848RUTA_idv=ki#6Hs2YTv(T~!(uwV;t zTj9s=OLE$bfDK&{aw8?^C~8+eyQx_6k6#74PP$vSvFX1=SyW z;EjBRbjyXa-z*q^_S7?9p&|rVckot<-@wI<;hU8$OOYuuZ3FY;Z^CLssXi?^;|_aM3>ZYNhg6vu4X^2Z8+5jkOYe2cesi z%4S~h-?RAtXSVY1Xbgw>AAB^6%N;XW3D0?y@5Fn%%{YyE-D^rmX>j7R^9zAc1EN=( ziSLM1@{n3riuZ357B*Dc$xlF(%;hB#tlF)bL z{Mqmg>#z?^cSFA9i0u;J5Ms%5!rIFa2Ooe`szQ2HuQPrBCw%``gO$`{=+;31Y=GSH z&^2uT^GI}V%HQ@Le?~{WGxlI&bqvY69f#iFlhPUgpG0N)4HnD!$TKqgQHq}($1$Jv z&>8^FbBt{RWPrMYGwy&!1=U_qn#t+zinG83Sae)RznHmrF`-ZMVp1X-oVBMb#i%tQ zAGd9?3#fQ8w%zEz-A&l(>uX7y3G@@M&x`(pKMZMG_C)XTDh+=Q6d0dSt{2vq7f3ee zE(CX|9L*M^(D$aMme@19y)*2C%B!BEN&bBj`?_jJ5Bbi|#84Ul*6lSvU!p2$>3sfA zR}pKDl%}kM=|6@qAYiC7^!`I*+2iNWtKU})O*U{MCXw`(nbX+-V20-%?kthRsKs0( zzM&I#%UoLE<1Kxgr;rwQt&v^g&fDw;-h5-YZ>f|S8xwceQ*m)fgEkMEc(=00tE@yh zD;dMmF{9!;pbZPe#yYAdHbY%j2P<%aQ0xu_)4SaqUbcaBxw4N5*77)HMwgVgDTlt6 zjPwj*YAycQTez+mV{DqECz&Pv0Po8>F_~NG9GeZiFAAz?L6K#CJ9wQS6>2MWGGo5k z?mj7y@@~b)HS=1S!|YnfYE723tDg4fgsDB#%s`H!wf&YxrU31#JGj(cDX*XrGk$i&$$Z{*iR zZOk>LP5C*?Q*8X554ww!J<%D}$5LVwc~r~&=U(n{`kZ7BfLQu0Q(JvFOcA@mkt=S! z6!6!7yg`HG1MDtdjhuQ^jiNk%yFF=3l;GcyN$Cq8g}w_1bdPdj6Lq*yX}X;yYm@g1 zz;+XE=n~_(i}p>6J%;wN5#Xn}{!7ip4ND!&X_d$-APMxYVi#X_@rS>Qoq9pFA z*)JL-YgKhK;di^9?`H$-e(c~OU1ydao_j2R2$ph{0WpLvDWHSeVu#1;XMDzOXq!3o zN*ipS+KF%jO7j`FiWjx@xiGmB&SP4L{W1~Vk-d^l#U?hBUH=}Pab@2 zI?^|{b6_!32-gQ&I%S;zZpVxQz^Tv}-0gww&`T~6S%eBTQ{)IqVbOO|x-PYm0xkUP z|3YyWNewj6{Z+cdIQLNnFp(V%LUpGLAIbPNJc%_1+rmToZc5v5dN`ae0RiVzIP?P-t9^Zuaz@v)@V&;F(qpa$*b>|Ct-25DHNCNI%_)u&i z_&v^|^Ts6FCUV~AST@7}Z1njn%%smfmWMkUqkauOS zit^VjKQPsM^|?1GYB&QrA*!4?yHYEsvw=c9%-&3`0c0^m?N>94P7$T=7QJNcw`*Ah z9rLMvAct!WH?IvjGIM9<5%9)?cbFN`vgc`gh^0dvWQfFmrJ-Zj?1QSQ3VK=9(@UhV ztN8-4@Ywk3mx!+>KK1S6l?Nj|18dG-io2olkRmN#=&dEuj%xz5<(;FmQw$x+$mM?& z!zb;MW98{h&;wCa%dX^yg}O_QB|cBBkPVQ3#0IV4s1T&Am3lyL6Y9G9WBsuPWgyhK zvUSz5-DHarmD#w&r&?6&W9`WQpAD)+T!A@~I|N$XjVtE4>ntJ1p0WXF`yu+~@=P}9 z-1@Q0l_(p#IlH)eo}{;i{93M8qJd;kHhYa^4m7tA)9IN{srypCtsf9kMo{$F1a*8- zE6vGvJ!zU1L@4j;D>f4Y*+<$#N~f-&O|UFzv+G!Opv7EKfPd>2{_^vzS@3WO*_S%% z@PK!?2>b)8-RBO%xAhhwQZUvJy5G94oTd}IajlPk*!Mhxd8v=>a;ax}U!^%#itV z!)=;8+qXY#zx^X4LF~9=Y;E&`?_|Wn^6KtU;;g@8)ItBUd41vcyG-}&h?|HiwEawbz9$0)d}O#+`5~aQdjE+AbO*;;ov|BxlG&XLg3lIYIA_2SQZwx%>wqot_jMrOH?|o`Fg!?DrgUb9*K~+Y$zYoV} z{StEMEPs|*KvbP#=BUt^Be{k4G4)kWP*RPQ$7Fupyx$B1po}?I7Lx1vn1Z-Wx{7qJ zhU=WCi_XSXp7CIDTz+5n*!0|sENzV$ER^6lq}WtgD4V=;HKLGj>#4Hkx|Dp1%Fm!1;U;_a_@zPVrhX9(Y;fh8caF<$BV;mue;_;gSu$LKa906`~l-z8JSXe1QGNasxz)P_lVRLZjF~@H|cJnvuqQm5?Dz|g< z9Qf?D2`{#?_}4VeP8M1?wbx}Subj^teop*`E83a!Syut}ikvtLQ>lcPz8ej9F{jbX zKfPj%hipO))T>sEq}WXudmmg^6mEjubVhkHJ6nUvEgfa|mek`DUh>Q-b_aHUSYRK0 z5V`w!rqGl~du&Buj*#Rk{yK^A16`3C?5uUn8Kq$klojuBC~^T))?Ofq2f0e0`#7%c zrXIi*r6y;Gn)c}QO?dl-BUOAo43wA@YbJ@U?)Z$pM=ZUxPxSjTB$`g>u%j>QNGsWU zi+%oZB<`)``hHx*-IVZ<)~b0r*>w-4eOhrq{<0Eq&D-6~R@5Hc6ZNWj#IIo)S`2%p z#jk1>oJ41qUn$}nN@hBYF#{>l4S&%~MSg>6B#eb=G_g1(+trO)%~Q2=O_=?Ci<2mq zx@uhr>m%05L9}EHWR~Nlgq^-QY=B4I0bP+Szv1cHG5X4WvP{hV({OC6BAn;qqD-d9 z^=tS_eB`c>ZUc;AgYpt=DCQ8@hG~S7y0gGAS3q>;9k>iet!0O5smB_bi zZ?jH!L;wzEG*Bs_!m`%vbxi$**5DdTR4pwR9zr8x9*ol_dU~ z?D1phM0CpQp^;JbP3t#bRd81rzzjcGO>LVVGzlX~!|xCGT4L#qi_SjDLvTe^;>lZS z!k}BR&vuu(=>4TC?QT-1WXuF_)ys7J^0?GcIr{kmN=+$o{_T>jM>%4^%Ug$Soc)!S z(>*y3wx*g{f0|P4$4O@?Hqbbwxe9Zqod2S_-%LX%Z-%6#@%lsPQunK227tzKfQ} z+7w|$4LJkwM!Sz~cacotrwe3`_($PH$pGQzGcUsOG>Ky_HOz9}HBw}~%hHw=RZ|JP zaPMN9J+_V*5Jbrgtng6!_|q0-xd1+vs6kYA>K49u-h`s(D2Z<~dLlJVAm_HkzWgi% zui?4lbp*QYeWpwz=q^MHdI{W1oYae$Q;y9m)ajxm;TG5n+|EhjnTFjDa?zy3%8x^> z$xz*);=@c8Pi&>ar7C7<0E$!mdo$2wbfu04_G6`!BEYfL5_0Eq zx8qgq9q+$D#TAH32d_Vtu!o+DeUIuH#~+;jx#HuQR0I?3tB?4oBDyw$Gr$=f;u>Nr zWA8rQu8UdsD5^6YTJ1Guq9|TVrp`|gyDZt>H&qpKbH?y@S3#$)jjlaD{RP)R3&Lf> z&**q2SHxoFWeHrTdS8@@~~8_H6GjR7!-v{_T&d8c^NJqa)4WN=XKLj1!ksvHE%UV?ZGk z6-?^2pPj?V?4E>bY9q2%X$@roG1*E0lFP-;bVkXHK+1{`gPqra4jV zG0=Nu$)}$p+?TyG19D#PwGD@T+1VGdUuO0#EtK)`7grMg=rVJze4l+P!`KN3f*QNn z5Ko{4apNDoYTdKFW5DNWNj5I0&6Z?tv}0$Zta3M(G1@T=&*H2FVoK-hlgisrD(|#z zu%2I{ZcgFkJ<>O5UAPaW{@Gy6U}SIP-w+Q{wbqgk8Af8seDn#&O$GAK||)kQnwT=D}Q-S;CsD0%Y6g4x-VxxBlZ^d>`u-c512^$^Xi+9HZ$FW_Hq$ZdR1ETJIM`BUGvQP&f*ZK3M8eH~1XAAamH^+PUvyWd(PZfC zD-kQqCp7$4`@xR?Q3Y}mDAF9ovHsRy83-ZPAoKw9UoIXKPmcsJ2eV~T1J`D1aEjlt z52+Gdn2Q;Vu+_UB0N*jNUz|051;e;&X8K19{{IxNw-bi!p0ywM8@U1L{UF6NRkfej z=vz(zhCeWnQF7vCJNw8H5cn+(Owm3Kw!KB%i}d#k06+HT`;K;x$U?YqIt-czw0s_H z^X+I{^mi%^76c%@lh5(Ft~8KezL(QQA+s`Hn*3`5CGgl>Y04|%60U5?L8qnajf*^R zw$|@gVliWvOuVbRv)DA*=4z~*^%`p9@WMji5@BH^=HL)mEVF9z{Jp@N6EGm(csOAi z+HtT6xb1;#j>!JE8mTC06C`A7TCPeX6>I^%?>_J3?&~K3@TZ;-94oe1SV+lYWn6+a7&GOFxoq{rE7#s>|-1{SpE+a zXU{5NIgH3(25ZjDbh)#qv|xBIj?57HWRB07IBtY9x|1b>y!xk1(zsRqQFhos368$! zgy6iTh#zg*uzb(Ma1J@PWn2cT4N=*Ujb3S)D9(1r@NhOxz zA3G*d!Dn*pVts{Qn6z~GHGctQcoQ#9RIl_yTg+Ps!WDUD%9T1dA$v?8cX8pt{s09W z&2A*mZON7`gUu<38Y_f@{ko^lUe0BD#);FjHmb14175$m2FzsFGord?g+=ZtF86Ho ze)?p1)ehKuv-Z;EchZu5vepjU{_55;J%4^OEN(bgUVrff~fC0Uwhsu9&k`g4K%znY-Ev?Hu zvM?DSEe4N}E8pSN2NK&K@A2|GC!?M0qWK_;uS{dZtAD!GEV2E=I}O$R2Fu*M$~N&z zYW?(F_k+#R&_V0eh}2D*`!Y~zyJ>HAXF~5N?R9SGE5C!SKRA*7MxepXtauL^#@%A% zXfqP^OZ-w1yBXbxdK+mgDRR^c=#9B#<+;-9OX?RICSK&k>t^Xdeu2t}SCm2Lc|5oV z(12T3Y+)m8yex00bwwd7T-uwvuoB@WPL$#=kpdcr%w-R4Y_;&|0mk{?=sO&RV2}U6 z6Q}&v?iM-m1~J{{d_RBR_+bO*W+d|39p(Rum^1pp_B~SAad}SC6vqi8WS6!>9VM_kc@Br>Q#) z6GcMV>clD3KZ7<^qa)e^n!~x&AOmgUPpGEM#`YI$mUg-lLmj*RKl&=nX~BTKzm%!g z-Bq}kt!OfOrl`&4I{IJOQaI4P*{@R?cA95O;Iv#%@ma0?^UTJxb8|JPabJ=mn>|r7zgCl@w+m``vI*wuu*+FhG{cH!rR=K6cP(8dfitZUZo6|8bk-g0 z`Y>?6uT=l^&(8QGBDw)k*qFA@RPD3va{YGt#Nv4RBFQG#`@7CCIaBPN_xk@r&$8*- zGvd~|z9e(5p#hq!Q)#|D_$h{lhVyT+N4dN*K{9$J;|-F>9H3`Xe5c}-e8QWFz42K} z2}Fy4;l77(GYQ$*D;~hj<$c`gNoekGwoHqeKT;l3N_l0sv)N{}HT)Y6%pjOf&II;c zK>VdI`rLbH9PpO0XK1auhgoxE?)@bAUB8Q*YgmHucfL6BxTgcZ>%Fl#H(9^>TEjJ( z+28t~L$8~X)^`S(Cq%&ru9#0-tFJNchm)uht6--Kd#eJe1fS<%nqjOKr6*9EQf3eC*7wWsL7on0W zJL6`iIk<}rdT_JB>ZrNWE-Q`F8>oxelk9IQ@)LM{C77QDs^58F@!L|j3|YfH*Oo}O zPk!+EoXfu$lyc=*MxSl5jzP!pyPKz7%v+(RK^Ghc>Ka8A1tC8guvBGC z>eibedEb5;6n(t+%A(eZ;x<>zGPU*wAxL2GSFL4`*@m|)T@+JK=}7fm-{?JFI2_+F zco}pm)_0%uYw%6*y>1R53KJVVzw|6F{D!m=O35sM52hhgwSp5Bf_Ql&PU-oWGxJSS zH|1*;LY^#d{1w~{{X0ami79jJSfIhGJNg^d-E;Xm0MayOk9KoD$0;Q7Ii$-XH!_oo`<;;9tdz+Y>mwqOVmr@U`Xi^p6Q8H!AKvJ=2R6o8K=GnV;m6=Ij&DJO z;iLL6OMS_2-Xy6!fB2Sz;#}&erakS&m8h(iJbMZ3-Tl)XoCBCQp3v`0RNTkdu+4=u zy}6>5KU?A!q%F(%u|kbs9Y5!`mlb8h03j(#);TI<_d&%cr^v%1-siFkIIa(`Tyx7@ zN4x?hGk4z z#nqwW1I)ElgmF7=>?S5i=zFHBnUR)bOS*A=MEB zztcaOS=o0Nf3jQNN(N5WFV$>2>Uy$ zIgxy!fQEfSrzI>bjAb#=uK7_lH=8MkAa2h6Y>D6CQnM*c!az_Xi{{-EKy?*msT>kq zp>sP8YMcYzS}&O0Zzr!EC3gJWf<-|J0Sea;E@a7p+>XWGAPQ>A5Vzx6cg1pniXXA8 z`5AGDy-Wr)qBiIBN&7@)p132e>-g}gHpO4l0J_0+$)O^I`M=N-5%l3FjzmwFaW0c~ zK`wZ`@lhhOQf#7c;i_`tm}lhk(fgdwroWJQ;v2lKh?{n{3392f_-@$iKkM)qgg5p|d z%fFzcEL6f~;H$wGEC@5IU6hdK_JH<}rr)d|n`d8u1Y94|xmEF`(>$PiK~NQFc#$-L zw&piK|0|_CqMt|3ip@bbaG!{mQBS82*aSskr{jV`I)raX*Ie1u5(=BqF&%zCR)6(H zvh4NZhFFwmlFDlQ6DwqB?&FerR0RQc{@<+R$^!opT`t_4=8 z!O~;>p-c!=;D)RQ;q;L$$0y9+QQrz0-UX1Q<+~K?fBn;UMSpEU^fe+SocUggBDJDJ6<2Rku5K-t5(J>Mf^u7pMqmsG26BI#D@8xEMo=5Lo|iBNf-5I$ z)La65@M}rX{++fhjtaGr zb30z=LRCz{EGaxQ}G__w-d;co(O9 z$m`rTpIUc;CZp4ym~t%9v-4)|eyIaf=-a~8P#jvlI5z+%>lpFPK_d5O%cG%?HgpWd z&#M1+|Hw~xfNJ*+>soHbk$hJ4w;3;8CKqgsWIP|t_;mj=K0X}B0~r6aOS)|+61nwnmV~|r7g9w6L`{d_N@{bdkp71sNU4Xiy!oOx^PXN>-tuw? zIfOmqy~SqyyiwkzyH!xGul_{70utbu>TG%C?ABEG*J@D&$H7?K-4yaP-?Vsm*4~&D zW}cbTTpXS|S+kbxcHf@-b&T%G_6oa_`g@mA?I@e{BP3NHS8c@{6K07yRQe$kyPur_KW zC<9V-a-U05;b zX-<{@KbKpmUaNVx)gSln$W2|Z?-4)j%D8_i-o^I-sbZ^Rl_f^_ZE4cciWYiN!q>hQG2TicS3c5Ip8 zq+CbO*-GhPd{V{t2kBNkb**ys4@#Dt(&rSd+$(X;UKkIrd!QtIv)}Y<+7A%Gp$!bw zsq+X+l*D|7{QI&0c(SFLtFJu5sjS3x!hgx~?kXFV@z@RM4`xLK-Waue7@94}Z=;N%CqmfU$|iyf#&-1d z?9bq=RitU8Nfolt$Vqk68g+$-GBfiqUWWD(6MPIKE~bKU8H7JTM1t@Y0)c^>0BZp zZgt2BjSNoz+|rT-3*QVeQMDpQ;R?4=S*u3bHG^dr#_=XseVGPo#na#E_Kd{|udxP@ z=bTD*BKK87RE^Y@K5-azWnHtyx2@DH9&(zqV95rKox4nD74>X4G!BD%2_nZXQ2{-L zSw|p^uhPeHm~?5!QM+wYj*~-``XDz!<9Nt}PNl1YR7J7!oQIZ(B%hMzcOQ#HSK_p; zk3>E9=ZWT@I3vHUG>b1uiFf2vG7JVKqN~cU?vQagH7oMBPtR^pPOb00yegKEh>c}R z`?Nd1wu4uDHZSGh`r+2f;lIaLJ8~)pWe;&=DW=Ec+oBcsHEJJ~Ls>{`U#T4W#0EmO z5^WvkHk`CwC*%g$tVWlBNh6QUTj6f@^WZ?Y`BU#V*%jTW8ktq$c6?4t$;eglCLhm47Rd*Q-PH_Ekw!Y! zhF+g5i1|O5A2o?vPhLdHXMf9r$34KA22iI)d89xpPl+#MBk-Q3ItdyUZOaA0B z^l9U%Bvu&o^#&PMW~XeEm1Sn-W-9zo>&mv>LkQ)W%}-C~=2V(|+ey*?Lz5nq+9tQ2 zj$0|A3v<_lvg1-$l_&fb5J?W<4Ds*XR&~=Fu3^xP5FM;wJXbxCwbn1yLDpk#)@WNe zHcp$a;Unx<)}~xVht{L)Omj2wQnmm^TacD(d#>HLawpSc;tFRKYOaN>R&25QnAhDe z#cWkSXtQ%MIrF~3%=^1F*YV?>JOAG_3c#41LyoWuZji6^6CZ}vMf|p{Ae|@E3C;vu zsEVWp2DF~|5vOe_DeG*lOIg#X)j>`fdt&vUh!%^bY%0v_+!iyGf#(*v%b^hH3SV}2 zc%QBRP*LUfj9PL;nEUyj`sKb-JaJxEZ3qKhZ7knDKP_#lGnj>oYW$1JN5z9);eKB= zvw~v*s5rMQPyYTS32EgP*BCGzLKSJfkaq_X|& zyWMU6{?{Y45m;DIfjB%{m4ll1Dj&YqZB~Ja5pg&g4@H2gNHLEkz$tj2k=uLVk7~ge z+hj#NWt$`{brN8GhI)8oDCX{4N7t4o-RvXdu?QDWqDE4> zK+-;_H2H@h%XZ23Von$9CR!wRq9S;k<%4B~L+|_;i$65aO_hZlNnWFD5-U}@7t$QA z@an_mksXtF3Uj&`mD;!uVhAls1A$S4u|v*U%1Hh2uNVT0AM`@`m(QvI)$Q9^MsirM zu7i#UG0;eQbo*T3%5u4Xr-Kw?!!br7jf&3jp_Pje1oK~H* zIUG%%IN6k9TN_7~M@(Sb;f;W^YwIx2T6GuqI~;9j%DRq<`dIY+GKtcK@l+x1#YJ&Y z!|E4MF2*p2W;caQpE?kq1YIyW1Y*&7;*KM~mLAA?4W_mYy z;%T?CPJttbgKv+f6~Ee7;b1%W>AkK2-^%{%xCU^B|MH!ji@GKueFd z%8#N}lKLil1D?+cHH8Z>S23v^Vv1^Jw|~XYdtTM31Rs-kv*GQfEtg1P|4S#Cm*vv# z2!^8s+UlyuI5fz@$~wKaakn|bMZ z#|aOLB*CA-Yrnb_yvf1YmQ)43i2w=zA$SwJdNG@3=azQplDfkBjWR-m-CdJ?xUsvC zQanXkH|deDPFefxse42Y=&wmUgx7cL(kQiL^U1lM_(l3JYjRxFOX@Mgi{_ITPp#Rk zI8$cB#wUnd-A=e{BOKR72X>IG*yKs3Z$#ncwRLhUIQ_lrKi)68*+hd~FE)eqxfApe zQjRa=g41)Vq~?Ynh2NIGtIs9GA)%v;c({YrUF=t|KL8ys?h7TQgmt^l7Ps=sX|RQ& z@=CaoY!aneVIax)Cm&kt^kKA5UMFDJxJ=QLz|W!hMpXbUQPvCgqJeX+X|_lOXUv6e zj_>>|Zw@uzhyn}+yTL{1a7C^X&+Q%S=J8`7LHc>$x_nBcg8BsNIuc;-LEJQ-k&k)G zA;AP3#Kw1)-tV5&=zfI$cX7INYMm+0W0Lc5fctuZe5_D$f-M7&0NfC{uM2XE>HcNH ze;eE!ZDsc&o^_R*VzxtfV4#R4x7eklD9bm5FSbh(%c^wp{^E=1-zw#yRc+$miOXEu z|EB=SB+s9lB-VQA#68_Xn?>&h3{DaH47N2^jk8pLjxk2%j#6ut3FkQEA+$|6!^m zIL(zSey9;#acE1WyzTBot@UuYI=lySE?3s#erkIlZFQ(JVT{L)mO$UiUfyr~8OOOF zI`L{aVCi6IXY5ck*SP7t0Vvx?`_ITJbUoJ@n%AH54f_FOh|DsnjR%+j0(z_V9%cuKT0ZGi?L()#B1}18-E>a=e8T zRY_v#=>%d@^Ox#Nsi^={=7#(}s<4G_C7NOKE_+f7vNiwBCp>iKh|u+?X=l?Zyi1a< ziV(_fg*D$QX8xh&269xrc(zsG;r0wZ(>H;|!nLRvnYf}7lUg{+v~j*!O=aO3%m8+C z#8i*-oYE*RLC@_m!b1)wa6YiC7hA$im8%Fu76lFqsczYZ&a-me^;ac@t=OQ4YpBjPc-uh^3d^;hpL zSrOd&jRd=0ThW=iU=szJ+I#cKRbyAB*C;jWkfTOiGElZD=r(=xqui}%V%MH0HE7|B z0`H0DJlu4X_824*5F?88aQ7rNij&Gg{oow03P^U0?*H!rX%MVTZ|mRn_{$)1GFz1T z<^yphNKMd))8<7`>VWoFpBdXC$3%EP$jD%{_gg-JR3BUre7*kBaynLUBPcB{HgPGK zi2s>#6qNPaR2dMe8;m$#@m|S1#hBICBf{UW68l;D$A%9lH^ngZ($%XLgv;sC!}e?= ztUqZ%MQa;P_U?95|9Jq-+ja8&hULycWSop=^l04^ot#Bf3HN(R1}$IFVqRlaNz9Q- zch8EY<#hBigTZgU5xqgeJWcjSRi>705Dh)Ij$7H5^tn`bLhFNnU6;4z z@QP3M-wFVfW32yfGaI_oh=5CKTq_Pl#QehQH=5P{e|_oAi$kAc;`25Wwg2k%?Pm6s zkMD-h6`);v4jH9a5F6$kVI&-2fU&gb&E`e<;Xr~@{F~*FG0TTnw^W6M!%2%gvXcK- z&JNyow+x1FtQX~MIIJWy7}}nYB+Y?lWo;@+YoC(SxrEf+ot%1=6Uj=Md!+9e5r!HW zR11qdy;iyLnR6>9l^{#105K(z&_8^FE&wOvM(?BoY*Jd|Wrg#~tG)MESvuXg0$`%w zr_y%5)fH^;)ghYn2P4PT7;_FVPJNaap};t3KB&0jO{|Gm-6H)?>h1YZO(`5)gPTAa z;moe`k3yr0sn3ODi%JYauq;88K4cI(HHGQn0wa6-9=>^&6@oc;rzSB8cqVS~&uh|& zZo-3YeuJE(s=-m9!r+uUp9S?P-r=3}7jYD4Bv)*O2Y1U`%8E*99lQ6-dwg}UYvtM| z*IG8GW}8_y-y=GA#)y~3Z9X1hi^tm7lC})B37Q{MxfNX*=j#tl*!DE31$${U=*#7H zJFr70xJgf>QO|=lC=d7%P6#vec||}J3;uVkutEBGk~W`-Obo`r@)!RZje#U4q^MFs zm*7T7X}F&GD1{ zeFXxq*U0&Y_iL}-vwbiNceFkYxA9yl97x3F)TwlPZA36g#GslIPHGI*G4oOkXT9(ZGw50yZvbQPl+ooD0t} zAx_X$^^ok5NXo8Fxz(whk3CWLASa>z7e76Xn`GFSpwbVesSnmv3E$jjIUP5}BHY%^ z{AxM9Eqevk93RRg6shdj-6r)wnIg$QPfAp^l|hYoy=q4`E}l}Pago}>Zn?#s65J+o zoU>nlJDw_OQ0`vrSw071S~+1q$1hQNsN!G?Mp~nxyRqE^i0b$(7;>ktriNkN+1KsVpvIauFtvk2~zHtHIrB&GX73&=51H!qA zz(sR&w2E>;st#hCT+2sO*NG_SlF&Hh=v0r|!jaw>ujBu@cH5#xBH$<0j%w(_V1-fT z>Ds$h1;MPimS<`U(t`rASQ;;BEF%dRjv7RMUT%CIS6>oD7+ch{#fd9lZ0#(^-{i+H zd297R3;miSj&`yXN1CkEUZWdBjyo-nJQj}dWw~~uFKol}NHY{MOi+1JUA6EdJ*Y8& zUCh7AqXa%Cg$r~@iWtaq9P$YguzCr>jP+P@sUTftj3gv_1*js_YuZX%cVL+uU0DT& zltp+lmptwu?4H-32)3GV^O5ST_r|Na#RDJoI+nV#<>Mh>@{m4=jZTZ0sLJ-nXK?{7 z0XIp1S{HO@Flh35C~4#b^Ofez?ZTom=4vN#7vqbK2C2@aiP1u+J!{+%CVQMr!3 z(5zq&7+ec0)R3O4M4CdiatoNAY7r1Yrz*;mssDVoA8IDHqoTWOS4ldS{HMmI{jij} z+aqMry;Qt|%c`FnoK8KA36^@_;tgej>dofY$(3D$s{I*A3pHGKM}*lWCRRj}o`4k< z?wSd>8z6NTwBWG;eI>F!c`34FLIb9e-k)N3>}=HV-;N#zZ#!DYt&k>=z9S1uI9W{Q zI=7uvyP%JmL>IBTFz*`Ei4BQcH9ZvTuGgFB*Qw8L#H9vDl+gA_T-=$a%v&zmHD6;1 zaun1`KY9akF36nDSY(5Et<}9wNfuspMj#4+cv5(nx zZasqNLk@$V1FG(u6A!zjgFAKx4;l?4Y1gn734ZS00S*P1R+YCR``@8E9#ad6knpfmd3Z^nW2q@o8tZ_n zlg)EdQ%#X;-+#un%^l3=8R>1X68I4+O@S;ydGi65P|WEq>CufebgOSI zk8LfrZSfzO2%0Ypn=baj+nY_s(@ZWfDxnHD`)EhaKO_(^7uMj&763 z9*q%f-GZnJt6N`>AjQ3Vg8vJC)nGPZs2m@q>YAR|m${U$z_ljl?HIJ?MU>8lkstZn^!RV%|GVt2IQu$}XQ|XlNWETZsl3uZuNzF1-LF#ck6QOkl3Y*3 zSVw}&C6@g9o)GC^yh&)uo=tTgSWr_)uHhTwQx;pFx>IS=du3tS6UaVn?^{%=$f)s7 zBuz%e+}Dl5`|O$wMM=pik{zH4nAK*7aB3I=svB%alTX4m9a^(9IH%}a^|ORdKABeQ zV3lKV1XYYf8rvt;1Ej;(h5L%s64Y=~iJue7o5u1$M#qtD`q6e^J0wuwEOOA42+@NE zQc45okUx2+Y-mUkcl)8<>2_XseBl2(g;)W=em4$<#<(GR<9{r%&xXXqSdy@zp1Mf%$n6W`X$Eq_q`912Q!{f!c;5#@o7 z+5icn%CELYJ`wnzwdjLKv8KWJ{7k{QEkf~JaVK+CfgO=KemF><{`0wqC|`?ij%ox@ zkV^o#lS9)>?s??wW4Dw|)INWqhCi?^+F#>CCUh6JpkA94J%SHe9S3JZiin>@cOs4` z`A5wOmb9GtvuGAvU=vUW9V17KcSDBsWNT7kS zrG1ItlH{C>E~~7fG9gMQvuODbRGNv6eX=*P{^zPdaPSEmjG5LLb7Z#mSpT5^W22lJ zs`zEx+pQ9AFE#_pjJfhCdpysIhO%v&O?{8w{NU)~cq^UW zj9hO%V$(4Cy#_FZRIzaw;%?7|Sb7=mp{E~o5kr{4OV*;sUR6GKiTX%h%s2YKCMZ4$rxd{~2~Ozc>jK?b|8x7;f}(S^jT-_UeJISIL382p(P6h?len35xU zRF&F7R>=O6hJ`^OLS7XFU(n6ijT_@VC>AV~Tt7YX#??-{dmiS+VynR6(9XA2tsR&n zn@ge5Xq6QxUC}J+%OZIu5?y|!wqr0Co7nO$yM`z>i+pWxwfFT5yWu9nSt6*RVo)ig3Xg{Qf;*x{59c7+7My0Fyzf&x8L&)foG~#8i z>Kch8IG;!G16%w^P$vE4dN~nQB<)qZ(HhXSgpOi!$#Bl7{#i(@ny168VkhAamOr1b zx<%#kdFZOAw~uPB#V<_8gnzBZH(0ttyPpoWx{lWAj|<>zcyYdMql4!kZ4Bl~Zlpmcw4Ul5v2n@in3 zCe9{MS=YuHb<)u%2QRcvEe}yK-JGU2grtJkA9c?IGhwQoM)TgwO-$9idJ8TGhEKD) z5nFqhq=+AKR>x4DpKX~0v3if})BA?V#8iPvi&JvUsyLu`Yj5}6?on>8WwhVuCtkfM zRyqwl^_=mD9|Z8&7^kv!_nVr>+!6)QwCwujO|x7NB4x(wBF192bwP9Dc_{a>X}C96 zaUh^mah_Fc^WC*oHx56Qms}V%4aY^;-aa1KRK+V$U}*MT5U;5olh^=wkZaL94p7gV#mxQtBu+oKsA#+3cG_5}tt&Ksy^_ zDwGZ2f(P51&E+0^AuQ}aimuOaZx7VVaX}R#MIDvYCRyW+K$G%8{=}+&S=t-xw$S;L z&-J0rszY7PN$?Tu1X*+)9rR^vda8)0Sv)1(TqU;^B3{ha0~H77G@zizr$FXN(Fafb zFHh=vsn_Qkk4?M5Et$-NJE{?Wk*B?bYE$8doxoT%@nB?b2PgiHcn%o*M(;+@4Lq8; zSO3*X^aLcdWc!Z`X7#BEBlW*bg&cd@`^KanVo@=$At@dv=@kW6>n_H@QKW<8H@H!N zMs{~y@x|KC>}+VA5JdlB*JyNoNytYi#Z^Gq=h}_==CH;Qs09G=AGE1=Q{2gX*97}} zeg|0GUrtgk%Tfb&=h}t|E7?GJh<3hI7NhKg2AO%oM>}R4Ddc0x-9Ro~qotYN3FtE_ zgIVdu=l9loC`-O-C3~yShgVAbLkyAQzyIi3U|kkbsbKgbN{f%il+^r7b$Cl{W5+W{ z5wd9XD|}*;H35A;^#DPtwN12!<4SVzy8cQ zF;$9NK~;i(z?4>;+G2e)R_AnQXeP0wTeodz6|4*I0 zV31p~JMz1ro;h1qSjB*mFIm7Z>i|^*B>P%ndm5bfx7`LNxvOy#8m(;+?3K^ve}S79#<56 zbw!@_It^Tavb1+bJM?5S@@^X+^;(^J%^F5>iI`ghW#JHk>!)e%J^ z@xOg(IGoV{u3W=qU~B{vmcV7zF&XdvHAEq>r|A1NH}(a*^nhGGtGcm*gAhU|=pEe1 zHI_IYK2L1zS}D-O|I>||0OUX1xSM5X8la`s_cN*fE*G+e{C8ai>3#4pe9)wV+Q(g< zOpTyWK+dA&CT}X{_*35>ssUS&G4z)e2ZTEY zeNpPrECe!B=r>n}j$o9Xv?6=SFm?OT>E8W4K zdt}pku0|S1D;|o6M`bNa)A_ZSdYURgMEl?Ppb8M$R~9V51APRs`uXgT`t$1vECMd8 z85wpM(r$5c(g`lu{%A?KKTVu=sKZnKjx$3XEG83wpY`h5BSK@)#jbU6QA^K4OFa)b z$*JgActjVB(%e}Xts~d1ackqopx;!-n?nSI z+>h90a)|`#@H<=^x;E|t`Pj$dj77ECm?WrA0lAQX`1!})!0&ypq_A=ZCKl`9;)53= z=wt>O7HJv>J_oCddW@88KJ{dZb41pBpL*z%)TG`P1aG+Y_D7M_M%(9zfhD%VM!)_h z*>LBJ>w!RNyeGV$KnK45yHc}v5lbzg77`L*(4jh*7rtJu5_qvK#*>*AP${O~;umkLM)2e~vS zslKaqF%6awIC=hI``u60OvN!fs(&|Sd!H<#9DZvvUXnaH{8og;6@LXLE0&lvHrh`5 zMr`yssdm(!vKvtVM1DzFfx0kVvALS}QT9M^k!mUXT z1L2tE%5}HjaYS6_v8b#j>s10eLL{}#DQh5cf8UttMB%#(X)fg`smFCM$pWmMio(DD zKXNG>?JbD6bO1S51@c+2Z4#1??vLqKO%YdU&+9l_jNf{{0*yQ=!_sR zUF9+IllT?k0dzHClk2eKqj2D=R;Ozgb+mqccgYY3JF`U3v>#@DFy$&JhboVDKH|s4 z;uS5h9~^q9o9anSRSzx!o_NhDXe;fIw82=_1+vjo9%Qumkr+-=6nShGdE8$7|JeX< z?2Z7MbuKK3Dk&sURi(vPt(Z_bPR&0=Avu2UIkYHPN`(bdNa;Q}7;trhy-imhrT?ba zvhRR}nol<(ZX&2%zI3A;0D)hWPkAh&Lz|YcFwNfS#)rniZd)d|7T-0EO_*SBYdDu( zKRw-*Qzm^j-x_&J>4ldYuN#W%Mj#E^-;ZIHjBBR7nxLv{IYaRu=?l_P>RfrOZSHfv zJ>SWvZ75GDG4>KVV;wk0tplZauO=afT>$xeGrw=VKTnToauR!<>z7~(;#CXyY~0q9 zB?0~f<)c|B4ckKUO8MIs<`Bh~@@+{pY?}CO4@^D2i6Phvf8eZAzSvkm9vBI3>p|o@ zY32E6&K~#5IDTFg>eUdx7q|D3U2avw8H*)*dB|Q2RP{aWGcO<^JT42)wOUXO6yQL|=MM{03+ZwQoc^sp{Ktz*IJO+98V=J zj|el2FrPtnc(E{-kOuTaa21Y5+40GA5~~E8yAf`>3z6+nv~J~YaXs_U2tLO0C#Qg< zfnCCLN%3=hx~mg0Cchkd`y7#1&@7LWuCynJaXc67txaTBGGfy#`|GLRc?aDbBG@9K zDHkl2{C-b+Dk0*4cY{%$Tgu<2kfFYzTR#J*own?N&b&;6v44!TFC>ZrEb8+MJ`jV> zZDoHIOfpMs$;$J?!*YsJ6^GPs0 zdl5}}$i`fwU-|0bM4@l@fKCxjc7`6estV_H>d}e*{8`R*?pMS{nVYm$jSX->I|&c4 zEJh03Q)OLWrqCLUHLc;2Ek|rN90pvn$>N9_qb|R^bKHqqMECP2r->V*CC_@nplfG6jDgPtplF4$Hl@Ht)z60DmYWaHHU!X_T^22`m(N zl4?196dfAK4e=KM9}EljG&RnF$-zb_V^moqjS#gP6L;57{84vO zxQ)V`a9+Cfkq!{v?7vUn?uKx3;lFKVcZbm+xLqZ3bcJpHeyFvii51_vwF`YVp~tlu zuSBW71T>D%h{@~Mb-nJi5~NQmbCl|EWNp6tI_I&M2Y-bgB_^#FseTxL-$o(7eW))I zc{18w(B%qrD-f7t=)H<_{;bWn&NylQ8M!wTpyUECtJNt)QnNhXg*7#D0jl(uTMBXF zFRCNuaZg*GRN#qHqLYGm%NGf}dO`P2c|C*Us=qiY?+gp;UgrPQY0DhpgQ?@VcJk&*TsP!F>ty-5Gk4VXpD3=s*$H%b z$p!7;-@e*y8FQNXAUh)WvUdLSyTg_FE7QTH0y0F`&uaZt$G~#8e=RAYSkY<2sgd1( ztr4r&cOocvCewRePi7)NGDLbY*2cVh$+tu8Zg$PS??WrlKJ)8fAtfwT@?aYDjSbVzC~l384ED!b3^zl3ltD12vZ^;ZH%|lRn-*{0FCC zvRgbleW7!P6*<8U@bi#9OP@m1=Hh$wdqpfuULu%1evv%ozLrngq@A0R+{PbxKutVI z!dAM(323TjlAl4{FzhL-k4lF-cKEl0 zfJc`l&MuA;2Woq31xGB3^Y1(8bG~&ni}dH4NqBN#TlkL~UcuXDlRUu-oFknF?(L_C zYhrbtf2>N7ze`)n@d06Q@#K7ue)V%D0`Y%R_ zx_4E1?&aQ1DRti+MeSO{+_5F%8+P)`kG)^`w85r^RLhxfxTa4}_0Oroc_@%~7JwYk zDgTl6qhYZ2tG|k#MS=^0bW|Uz6Q$}jn8b2N-xmP89euk)ojq88aBPuGB9>$*04<|H zqVWEmi|*olC8b4rDlG@AT~)gmf_SOd8m4_|bv}IDD-x>@r{Tf34Bf-U2Egn?3T&%& z&LtX00;uH+S}BuWf5w(z@_?1M4j3hD09fQtrG=xP<*q;>DIGIs-7Zn<5dQ4OjC+1p zGw;tm19G7rsc^`P^4iDFiE2_ml0tJ~?Pnt5QYShRDP9abGQ)e~+h>L=paSi`7>nO4 zg5?D^P5beh-?Az1E|;ARJT#gAee3(SWdE(((`QnYgTckB_x$S?oubvspRsjM=;v@j z&}fC>?a1w|uJJ1?!oyKs(V2TwpSZm;F0qCPh96^fKBcY`uJ5w%uE8lNTikdQ-e_I( zd1#+n%Qa+=L~|FvsNzOCC%o^@Qx(0{y@|ld2F!g$&|S&AEU3}p7V4Gp?(b_%@BJ~n$RTO}Ray?(N%5Zm zhpyKCQ~|5J9M24e(gEwetG}vSpk<-ZW21t^6Kjks?sGr~UBJB=!zUqlKctaA1t`UC zLHNs#(EO9>FU!eCiE2u6!M|1h8omcK$4i!(`Qaxm=T9>8uJM7jl%k_=pNsV})F<&f zI;s6w+1@d8_&v#kp8p-BDPOqHR|#Jjrp*&g@z=P_=jU7!pXi$r-?qDTg;WZFtbTcG z6*pg?nSyX?A)r^EE_RDz?}2!Kpc=>|WTT}ajGDOq;LJPcB<~l%4YZes{asc+C2UbnIFV_MgH{kLe!g^}B$S)<@sY z`L=|ScwvaBjOMi6Ea6BohxG;N+ym$@>s#zDRIgu$-m#N+hJ0oJ;S%WCA3qK=V%bMz z(R^+K>p*pR2UL#z!#h0Ra!xG3B0b)}YOA@qdbQi+=|1S`KH{^)O!?oZsdZ7z8dTUG z(S;0bATqc=`u343Lre{n>^1AeR8hx4z;Gaq8^G?92$8t*WnLNulS9sgmfFMseeSBv zN{U3u2j~1Z8oB?d6}IVeZw!7}U9-D(xF2)PB)k9nBdiY>uj1g9U;oV3<9D6%GW$(_ zx=-OXW#-9Cr|*Tgag5_KMpk@bxk4cFClD{xa-Rl#&G0R?HUHL3>i*Roc%pwW3AU7L zwMS~p9!sL>9%kZ*;AAL0Kxjs!`<{ZSrVp_%s(agNGC{M1$r%Tv72y55dv zwq)&WiZZx7TU?4SiU%N^ij)`Kk!SBma>5QXXSwiMnN5&-RKYOZ<`o(zf3-OGl-dbw zX>}BCq6RQ+UJ+fxf;Kd4xIHN4S3LDp$7ut;o@3q0-xFl|*|I7eMO`g=%|z_jy{Iy5 zRV~H)CB-=v6hIrOkdj@}bC<6)x<(mAPv^@zPj5fcz+_zXgf9sFN!lOS#?EEsNUE*YZ^3N60_AP1Q%uKmCMMh<1)XxL+8GvRxmBlfF%{%)l->QTp)> zO8^a)e!&5H|27zSrz`cIcwKA#=ZXBka%wj(iQVE653W+}F6c&?uT~;6s(v#cADV<-R+N^oUR0)v4;YGJKbH|kdMs#>^_JQ_=j;^sLa#iC^fMBFVn}A?) zz^?(VOjua${iP@0m`cl0VEEC-$BZG4(yDq-=%}}+x%ocyMJKt&p}6;fni0cSuot;B zsWvaNgwkB#95=<>99>W|e-I;bU#*K*laf|LYpA~-g)=oT9q|2BN2KJq<^^73>wsu&jeqZZTi;j@W+_t42hm zChXmDT1_1dapMk`1$p;*`;dOB@{I7zn#Y~`tZCViQ=QaX4DWypp0G!m8mYpmZ^~d3gV$Z|BdK@=%%h@B!+WbQK{pcKBl&4;NwC!N<9iu8e zXUc3O3)8e+dfJ*-y{9sAjuN^w4zI@9Y+etaX+rsC>sGR5jmG)Sb+htooR#`Vs;F}& zd-Tt^Grl6Qu*mK85Xy-r@j8nYaWzMajDOn^BP}&i6LWnJxY;330=SJ^JEPNUf9v0b z<|IbsTS+A!f!fRGi4wC0OU*A)+k!PS;S4T#@WC;M0v2z zykL^UJ+1Z&cXe?S_2DT*RSsKLqf*xADE4)YK7j_VxFDz`L80{o0^=PPAeBmPBz&&{ z7LxjOO`S3`TM@f+w(WNLMISr!U_GugDp6)IyB!;OV!rZtICnK?`QQ(OZ{s_%im(FO z7!R?`gV)8~0TUrh*uUd^$?bl679z$?&hcX{Kt$@UFT&T;*K56K`+AwSeJa8A)L~(- zxH1UtS)MFLgpVRiq;($}S)GP+Q2o#N^vE^)$zjry67L0h(hiSXH|ds}#17RUAQm3L zs@TyxlWv~#e{Z?qqSW}Db>{cX|3&c%PDktv?aTf&!WY#V#P1esc84~HpvYF~EF-9g zUr9pcNlbBU?71~}Rb-w!J-J{Qy)8tl_fVfl#yOD;AnFv${~I+ z-Fs`#Z~MQW10t4{J@;CTu)A>?UdfsRkw1#QvTG3k9B+;k$$1<#W}RNLhknB^?V)VF zEa0S!wZ?NcZ6Q_AhkO8o$Ayv;YLX83#jcO#y)R-HjMJ5Kh4?lLNKC|YySs!e^`)x@ zCL{d?%&$#I^=__52Jx3$dCeo;^`3gCp0h5oMs{Q5!#V=G-%;Xp_ixe)Z^JTO!{s~N z;JR##MXwSlPr^@h!$t8k81TtO_bj?WXm1@X$e7 zo9w&MD!kPtT0BMfZh-W|AbTe6Ve5kRS_*kpW~d+rVC**QO=_2i=$0Jrm80Qmz}&% zzufAZJfT7;svi>J0BP~*#t)J-m=S!r`gWre5Y+u!J##=Q?S8SvWxxio6U_|Q3v~_a z-{Z0m$GZ^D6U319CrJqF#6Wz1oph3>O3k+F%7@@JmF>NUHf9z*N91{@wz;$m>WXff zSh~Nv)<&Nt2x&gI7`5b2978@nO;DA4PB96yol$wup!RK>t!>~rRKuvtn~boxB%s$r zVl4KRTS;D_Rz;2np?X%Upxn;Cw?yky9mu|RW3kAs*|OZtcbSHSl@C*cnyRwxW*kE_ zwatfo;p5c4AF6jMy_%=9Q?h)Yp$s8?NORD-7c^?D2G1c~erk;0>BS;`U*MWe)mCO% ze*o0H@yBJg7nPTX9(TKQa_5>+{^C#o*pFJ)PxFh?VUM?eN zqsW8L;|qL?!i70VVL^aSOPh(YJj|8rMb@P&wxr>Az#hNfZFwfaA?XQJ!muPiI8j^a zGi8z(KR#oDA1sMTc(OD)RoE9=hdE!~nQe0-c=oFPN0o7sUgSJ@BGc&iBEQn@fWJp$ zS^aQyJlyAMt8*Qne#^!bG}c2OCVfUuZ2z*nh z4#kXX$PmbM`hOxaaVey_k^93}s`H~yzk2*XRK4|Alz-IyJ;M-Ef}nIMB_JW);0FY0 zB&9(lhM~I|LeTE{O z$4M*Sr5E28oc*y#c{b-KLmW<@&Y5e3NH@B4dk5@?N4ohzFje?SMP7Fj8k1Sz8awVr!npfTIiVjsB9zA`N$vgRB++^8O^& zN?i1Imm8sN6@2p+l1sHXDuv8?1FIr>x1IyH3;6Cs;!Cx3f_&XT@FD7)!bMB=5}3J2 zKdBnL3s0}$KLXg_<&w8NmH-PA88GLG2k=^TiYb60ZkInnUpGOq{tn5W=Lzn08;lX4 z<#<7xk3~CK&LCvg^DMF~{4C0m^};bygBg3A8IQ}1OQU~&&nu9r!EL!nLB1upgxmG* zlJIRILPQ&=3lI|$JrGr_ed?4Zrki<9Qf+iiNy#LDRFq_Au9%$bIqnALqt z+V<%#c_v2MjyLMe^2@=pa7t)~hX=)rC1#PTuTzw%qZizJacIme2w2*oN)^gu&8A2i z4WF`#?ThGADy+SF_iz#a#(7(4R#rn%BvByGl~^rn7H=0%{W?H@f@4waa7uL+_?@96 zP0nY)2lRtpI9wt8KPW}ewV~t^yIPQm_$75fIJ`$c&VBF_?9Eap{Zch7!IQA~p~z`synlE!jxM?9`SHO#xz`Mr;4^`kx@YaF zd{u(3F&Xk|fmghD0bGQ-;*asg<{9nAx%*x!Qwgl4j+2NECbwLwDO_^2czS1TSv<{k z^zd96YU_6pL1|7OJ;i7+CZ&d#ICq}5`7M|?5_h}g&!vVa8tl&8dEKG3)=2XRzk3pC z=jssW2-k?PTR#`7e(E(g;$zJbv;L3du_xcX9UV9ct#y`Ww4M{H%pyOk%%{@;Esn2w zP?lTx)ci;T{=3bVK)dkiTqpSjY4nXSkW1qCD`7=Wm*K5gSoV|?>k>r{MtUG%CLG!k zt5Lx0&Kn1POXZ@!PL)F8nTgY_6DUsjBaWnTq4}Tb5Y5aK=X{8 zP4D7nTW@8^ss6N-i+}(zid1qSD9d89Uq6}1hG_3opJbvv=1Ekp)jHX1hD~Nb2Dc7t zEuId@^AGJ=-zUUXGYBuzsfz6^NDu1<>hNWkh|xhXUNZg*g2V| z)4{pmm|kk!&-ubGLEPyB8uJu1ZrGfv3^^HHim-ig!-ocAsyNM?74cN&GG|cz z#FyyD{!HkT)fXUZ!aTf~okg(xY$v|*FFm1?m6>{^S%%cCq$%vS63qDHx1BstO>-j_Dd8IbGyfKvYJ^;-@|_}3KMW`OVca2HYj zUn&$y`~MngggKT9AvR4OMV5K0w=xoJICdEvUP?p?HGggE0i0}|B%On7&xMk? zcqDPMCIkK$KHJ2N;wT~V__C;O+o7yYM54w50YGv+zzwv+6N>hmwG*B8yVH~GA^B~H zDH5^JJ~4cP2t9m#iU>2h&6gI{9vd*WifIA4t7RZ>VqOb16e;`x{r5|4u?8qbX%XwY z3n;kEqjIO$(tpO{zDb(OI<~r&!5TVgU30rZ{IW-Rq2S&8(N`XXqXb?-zoJ$@hiXsAXv# zLDGVsiFDKYm@RRsmP#@0sP)Z%m0y$YY^^ODD8cn10vVx{T($sBn`Cra66J9Aq>g$Tj6h7lX=b=*IrO8kU5H;vP(N#h*E4iH{6cRY-jc}b?D_& zuDwIX>9SMvOdE#gK!ARLN`dQ6xEA?@`4F4lH2K99*-(^1b*eb|S1JXtx3t}cYC%cs zo9Xku9pVM|GLA*!5AW4QLLV(KXaKwqZy1 zKML=zED$2$`nGI`k!Looe7+H}`S9QOONY;#>r89-n%g*fTYpgKO9OqaEvDmk=8lZA z^Va^lq3n7QkWdcS61Odw^ufNbfQ-my0eOR}EGWH-ifQyLkH-cXpnkz)t2ETe)T41( z+YR@d-|-8EB&G8V!cF~?TK8M9$ya@0`8q1M4Bw5eEaa_0l00fKFz8u3RNEfyh|!_9 zm?;$``^V%iH(U5?f8fit_RK4zJq(pV@>L2{w}VBp@iOrA8@Ep;0qX1ebAOUgU+Nt+ zEc$E-Rmly;!dsU;>Rn)O7LFT_Gmkl$i)Lf|F)0fqZAK>2`<`Cpb-hZK;TdY&nb={C#wbxnjO zs*{g!r!HV|l4I_}_P6l2MGeLZhJi6er7A0^>rD;ZD6B|m@j6YAKYplfmEd;>^#v`* z$)8r(ZKZVf1ZB&3Z4UD9RkR`smrUj9H8j-xt0*sk8v5x_CD#r+bHUHe-dRWelImAS zPvTi^baENpjoLhHi!`%lIGB&W_RD1^nJ3gShCOWFI~3YT673ed|7O?wH6(xcG*+D6 z1?@)sQY~IZ2>wfF5!HRxj+gUAaDemq+Me`foR@aD$+vz04zCsbDdx;kkv)k}1b}Ht zl>+ecj~oKI0gvg(g$UFYT0BCoE?b+it*~Z{pftbsVuy7lA(U3J&*-a_uRcGb)z4hMlQ~iQaBX+!t43;lTP{_Ib~;wuIMe z33|l-TkrT8kWlcTWFf$Y1tE3o=?p;nnwoCIXEi{zTcZ=8?_X4V{<{#9w7~6o)#;T+ zZQ_e3TRq==)F;FB1t~l|&%-ypTSXQ1|6~9C{rAUznpz*Ayaxn1WCb5Se!;h19Z&qp zm80l5_-ugofcPKqBTL!q2QqXd!75&cH$eSD1(X&@w=soNvex4My;g9inNtOP(v)<` zMJ6z|?O0ovCH(FCr-fAqzdJ`X5dp?UIdM{3K&-ZqcHkeG2*+!+{84WthKA{-$5d3ScpR3^I)iXB}ZD#s&jqz<7N z_eZ+a=8qg|pa^2G;(0k>(NAtUFj3->SMCK=TPgQsDg&y23dy=wf44sbB#)Yb27z=x z`ozB#5;%d(;~LAZqH@h{vNR-;#nXJ-5gRR?R*|*|*TVOapE-Mh&#Jj+GkWNBKxl^J zS#!7afq;|{vu?UoR)q%I?h171kjbMrCqLmSLxiE77O zN|5820d+j?y>0k7O;+XZRTv(oZ^h*B^dthkA~WR<{i-0skPAi+f8$=2VV2}f85aXQ~;OA!k1v=-O$2C z*Vc;e1OyL1ukP%FmgO4|7B-rAJ>jO=ezlsii3q!%iA3(S`yW_e4LBf1Pmx%K`>hP@ z{q}xX^G7GStRFoaSukCyGey0#6V`SBcCwL=NC+lGQ%Tc=j{MX7SvHT>y*JfWRNF0A zN@A|n9sGog+LGGBn(nXHKxHjY-(FLnl?ySRD`5gxRo-`@EpGDZEX)pt=s<^H3Ygk` zrb6?h@FSes{!0J98C3l&LfVA7hPr%hhBf?qTHxJ#(qZ-Oi4Ox)>K~Xi!`iq#mSYyC zk=#ytCToV{&I=Ti&d*KlaP~7?uJeFn7Q}x^eab!ET`P*SXUc#L%?fs@98e2T%oYE1 z#dJ%zQdS3{Jf9T}$7~_wXXQP}CHkj;++Mgm@YSPG&4aGi&UyFRj`LQ%iSVDZ(V}?k z&O=0MK)otH`$f9)4tAM(&AQE|j9-I_lI{Z5qFnyH6rHvX0^yeZP#vlV1nZt|fKwJW zvs(in@W5m>X?{HM5FBD3@r@o92tVm|u1iRudo8YbKqxsj4qkvhI~#C;pMCAIFt@>| zPD}4HORRlCNUCLX^j9xjrU3X|)okgbvV=6;>4D97zp+T-%J?3gEIq8vkARHC z1ionOef6wHed^OS_Fc=na9Zog?dXe<)t$ipz3_yj2HcpyaRC_kMc51GVMyx_UvU<5x#S zNy{vm>K78ve~7Q?DCV|RR0sHSm3MLyXN%%!{&Bf)Z0U>YFOA_Nu5p_ds_3T^JYKzX z_P>AqTw^vT8|J9UupSl*T6CP1=;IAdiz%-3qmGlK{PF;Khrzu`o#~CoGofoo{d#sO z^$F@pOGc+WBF|b=gTM|d!4_cwyBgPRO$$~tm38uYh+bLqea5Ot{C_{Ltltg+uo3&l z?W5Np!y?)Oivs;1+h0GAY~;sJJsZ-zwG}_{Qs}qM_e&VPO_V>4cMF1u#3!hnnjkp0 z3UXIpf08lW_uk)U5!}B_QM|v_&)ci#1^GXC7#_1+(6ZH`o$S!1eS_iJ>49VkdKE}1 zK9_hVD{?I1^|e!jsVG=KJ!$A4kzJxnZy!H8%?#?eRd0e45wR(NbW`pQq1HB)p45+n zu1?gcUQ=P#&TvzK_)Lh_Rs-o5zIGOAD zaq|C3AaA!RsQjfLv#DI_odGOdc&*Oa5*doOqRVxm)ZB8U z6)wNa12u7tAtAQ0@^OD0b5)cQi7S9s04{L(pfE`D_;s*uTFCy;{6C>t#lKK}`<_OvvH9SRO-F)2L=)YcIYA8XHS=Ue`b0G5MNr(=HwJE98$8q?@Up;Lnb%!!`FS{aL|r|%2h-aF&1 zA{6DNMIP4xDq%!9G_P({Xh&(RYJ|v3&j{uqJ!L zoFdI$ig*>r?-g6$_-RhTizY=^rojYEst|+VyH2rtRKn{Baa*^Nt0Ntz*q3`7312H$ zKs0EEfZ{p6InD58pbDhS#xIAnaWH?b!g^ z;~Pyn``P@Zj1847{+z%=jdzzoS->Jyjy+?exO$LdK1v_0KP`R!VOnJGCAD$Rz#fLg zJelwu{bDJ@{)h{$zcZVblqFP=6>gwm%|P7w!Rn*_Qdah{4t?aMkRu;EBw3OjOH7KqddP*Egv)Cx)hu-XYOQAM z8+N-lErc0f{>j0Y{7>I3Q(h`(i`tnMWo=LDTb>mlgu`=3oCwr!ZIGIutT1Z+wgMq9 zm^Xz%)-tYX6pz;&TBz*eEMPaEerhS$V3F*1RXBCfHP$)6Z=emoWY#pIdgsHKZ?B0D z!0@|GkKi*+q}5$`fi;B)x)#ere6iWWyAYodtj_ReaMQPuw{m_-%F*v2)`jEe{FW`)Xm`G+Zu z05JJt_ru(?+APJ@sSlJq(>F8J*f#9lNdQ!6aj2;KTRLk&p+}>Py2)XpiZ!1@L2%(3 z!-cwl=~7W`khYqrW+N8IBz|Qu?9C&!pDHzYsxY(3%c>ucYJB;omx;0$F#~7=C03L6 z!ErLFJIMT@Q0YVKO^G|C!gIen5RA&Fzn-ukJJ1-84Q3+|<=jD+T($;;KIXhCuAo04 z%<0WmHj}JMjXd@&3*CXZ|Nkbwa-4||%m&We99wZP5*nk&2@h(EJk}&lWV%LzwM~QF z2*tt3EIT3@kiir<4ewjUtH00@&gT~Y8BSp0n96$=vS25ZmP4TjyZq!D$4~Yhy$Qb) z<}`72*g@`(WXBv~Kz`J4WRYo_9nBhBNtAHW4o#>@6^H`*zHW<;+OcU=lvB#~v1F^i zdsu9O@~QD@F0(0h1`ex7t|w@|Q+^qC|A)5R-nj|%~9-T`^~Le(fxkd9dfh% zZbd;9B{C&SKc*0#PgCjOgu(GvF6?4MXFuUiE|rVLHJUDCMD}=nCo+;w=755iBI#cd zePWvzCtXokL4_OttL5K8V&57k6$N15fq7ho0ABq!tXz}x%9?7TyeN-p^7Fm7AP)pFOL z)uNJk=80+XhBQl3yl@Ze5AXSs^82X{H=CZ;nY`(mrP4#av&;-Wre{t7BIySFwqqq z29wJ{%r%R)j2^~OdLd6$F_BeD? z9&}gkA4^$sEQ)wg32bs|Lvn`fIVSd8PFZ%v7Ab*lvR-%|`L}`JXzUkVr}-3l&Sc#R zGR`!vDzZMAT`4o!SNw4hz^+R4z9a41LVSvOz{j+Rno_Vcowg-J@n7>D*)1C6bY|#u zsm~_QKQJ5GYuqnPx=9^79hPP`Yx-=<3X4W*5#_|n=A1cJ+Fk0qg^DtSOMwe!cSbxl zLsE6j4>L6qGp>GmnMKCRT?)>~o^{4?Xj_5E(u`-bZYE#7f#n?S?4IOBS1phFL})?F zI|MibxN-|_?UF^4S@he=rAUJNeRO05ce7_WUB)+k+YL><7=?+Uy%v+BGGMOIoAhco zv$_Tf7xdq77{yMd6u`#qoynR5QSbM|tYcYrjRR5Wlsl0n&iMSN4ELD>lL14}r)bw2 ztK}EFi!*zE^De-ZW!4LP(oFTo1MQeZ8x)6J8;mk-RG~m-v61G@Uos3qzRVh%KlsG3yWO!G< z1G%&hrpIEqrvs$Mskv^IFi}@SKD}v>(7q#|#x2vf-ijan55f*FHYiMNI+xrmA1w`P z!rAA$E;xJm?Cj%%2ckmTyEfND|MAacqx?W`!0_Z1v5kKU0`_m(Qah(!T;UDltAlO{ z{h9KpIYfuZf(w2T>yl9X1161ZF%5e$H} zpvjQ4+KVFzz-hu9tAt-oI)0@BMgqPLsq38tAquAqkg^MBLh^r~lXG=PlLu_@pWH$eh%lBq!d>s!IyTsw#i=pkS24 z0f15>e++tp!%Sg06>IeKWTu$5#R(M7O^9hG!$^nD7ynbrU7d%a_5OE(sJOe z+<9AtN<>9r*KrE(a$^I%?!LEGjzzdFf&skPPvJ!+$2d5BuGbYJ>^OV#{w69c^KM(= z-Yb^2HKV6zu7+TUp-0T^z)|V+sP3^3k2tIQ0Wco+4?o<|RqQF}7Eac3o z@zK(+QPOTmPP(~NNN|(S;m%10X zfw1;NXUT;s-+hQRpDr&VPJC?LWRY@$T$`_TZPHp|9yIA$=LTK5$kgYTbvmSb(DBu5 zf$xcL4es-?S~FZou&n@Wck(u~{-lTC=@RJGif@@e+{Bfjew&j*y=xR%nXm&xn>+-Z z;6xp@R%t;dth$lzL^aWY&t>ili%CU>h<#%rrj8?_vp>`{3V5^?ll^-#%rNXbn<)+4 zZT>qv8oeo=8g5`6d7N?Yh&^0iL+F2kCQC#76E`XsVLVoZ+E^BFY(tzlJ=$CbO* zAqTdOEwT#tZqoG7_f7V%Tz;OrvENx!seGaL;6}f9#rHY{!f93+^72o38Gy3)-H+ zR```^ufbasxrV&gz*83I$7KFTK&FFedbW*efjD!b{-SmBvLnu$Fq(4* zh?=gR@fx%x))rA&#fBKzeiwU9>oRB|2hMmX*;K!~E;CCEExC)ysAEU=W9>b1+pv3i z;HwdzF4e2hlBc<$hn5bsTubRT=^YkyYtQC*i>`g4N;gna|?;7bYU#&ALZ6x@32Ac*b_Vd}@|9n6O>eH_bFIM`eksSAd# z@GXr03b$8zIWWYlm|GS5bpO%kzPj3Z363kj4@Y9Y6mhXJ1XZZgYbgG6(qH$q95U!a zg*Uwj=K%@=by)qY2QTXvE>vo52VQOXa~zD)7lpUIwFhXnH~9JCW?xkKDgZ})5ye$l z&|H+XB(2J!_Y&j8-kfH88e5D$ojINOKaW;uY7x(_-hpU`3sX8dY?O3}qrTHu8A>h- zD!F>mPvP`)X4nh#2D8_%nq!VV@~(Rxog|_JF2*SDdMWj>Br;4g3{Ov&a!reEa-cV- zU}WKmbq&-EMfh(B)G6G`W1O`6`0l%n{fwLZXNRwA5m6|r9nz}s-%Kia`z{yjP}J-&R6AR$_LUf2xv!9U zw}c%+E`%ISot!J&qkyG?JNK;Z*K;TLcgQf<+Fyl@QDU_q3mdS9S>e;&IVJpBK?PU^G&vx1F#f#UltwdCs477h)dY24@iO2 z&3-GN3N-ur&aItUA{N#zy}l^>h7s65N_i^`o=w)i8NE+DbeK(RTsRAzIAsF70aNdVR8Aw8fubIyFSLRRwD9r)%q~Rs zP7-%>p=l~ek*EZ#LG7=RoRYLqlIYD?La*uSWg_3T3&5g_WA83(kh%PGyF*QoZ{&Br zL=ee9RcaP9-OJ;)4-V_n4q>F-E;StF`*k&{gp|089NBURo|6l@oYx_Z{4ax|volsg z5Fn`7AI#IfJ-aJ3D8J_C2o(SI#N|mbaVYtL>Fs*~(+LlX19OWBFNEa8D9x=$8(8kx zJ{nK=R5h%$e--D48EoxmwOMIw_L|mT(Z3J6UuRBi^1C0JhWC{pPb)P)+RdK}tk*it zZZm~RrC@!mnXjvJ3m8`mgz2w;ZM#30F@ocn* zfcak8z_YK{Dzf19(D&<>^yjn(lJe3xi4no})Gsg9o%G$@PTk|fkSTcNzcrB!V~5QD znRvhSDScLEv9J^?RAKv(ya*&4&KP#ZEq5j_c)B{}$>@-+0y@2#iY>cIosykrg8zVS zlIiF3fqpf{w>p=I=GQs}-NnG1sVGmE+kosL?{NI8W4?Fv)=tgxj!w;YTR*UW zE{k^1Ji4&mE5IKL}XAng;&$V$3JBsScRB`QA-ZcBYV{tYlp0Je{IHL#fYVF zg@b|1j!ODmx(tq`mLU(FS{r_0!ftkA36UHONc3jd<#oH8JBj>N_h#B{lTSq-PJzKCBW4q1rgn#;Hgp5 z5PhrVs0Gt1$TCqD3h!ckk^w;WX1t_pK<02Qn@naE;~^)8#wG=bZ$1zy$HZi*F<{%L zS0K5x*MW}TV7d=o4ACdkQzSCow2`nY~b8c^9Z1 zpo`N7nO#Q8kcz`j6YPU}x%DT;($Hde>oWhNWR(rEX0MtC?JFSCr2ofsFbg|oumK>_ zZFB{6N7E^e$^qg(%H3oFe|$jqnC2PyPvog7vFwU;+c>D06O{t3IA%`yb%9E(3B5!G zsZYZ`0KW4~sC#)6mTI0m^>z-NT{veXthQNo@La=%mQ+LFPb3@hrWNF0hAijnl^BPW1&*JJ*hg=q7xQ-jq<<=@I9fX zA$K({(&|C<8(O7UiHa31;AWke{k)`&_cDX(;4h0iiDL|@t6i`fx6q5T)gkA<;u(K@ zP!9_Ewe~>n80nL=+n;t;vOXI3q6Q#pb-jrSKctxAw<9(Eu)^8pKk^;%fpPL77x^a2 z^!gNbSe!wOb%fhPL%KpWq*SgnhnUgtjBwT~%!_+7V^k}67a!nj`lNnFH;1J82E+ys zvxOlfJA-8R)wtYw6BIE|UX)80X=V5ruBTcA-r$LYbQ(#wVF2WzMvJ1Jud9a+(=&3{ zF1SO$5e19-c|4S>Fs?cO?wxFbT&A$<(`HXX(QwH{omumZIXV%W7ziHk>KyI0 z{iAsq!7#F3nf-&7=BY*kYv5<4K2J1u9PdZKBRZ0J72C(f{dJd)Q7VpcA1#4dpu~@5 z`E%$h=xZwefyj~58wH%4Td|?w-pgbo-j+BID>1ahT{A=(kZ>{hJv@x|p)q{SsxhGj za?M;t=`&F0u}c|;y?`K4W}p#XH>Fnkj!l_Uz@{FzkDTGYlM4;;yP<}@hN;uDnKF+L z<^;*YV`=nD0y!7GTolQkMIk5r=YW01EO-$}jtIQ95Vqtw84~A|r^a z4CEU|cFq3I$$@S_=h&p`v22_;A5adce|box{i>@l6PprQyjJ;j{eFweW!kYK-sKps zri9bm89kiZERWrf`mR~E+OK!8gas6?^N!TAoKPn;k2P$cn$q_`{|;P(dMOf;-(n2e z)xb0V(;9Xfh^+ZvK10W{yKj-YqWFR%0B1Te(JRHOoDgaG$A;82)Cn*HAYUHIBF%t6 zEH}e*zPJHX>tSgE-kR4eOaxls%w!FsGacizeT3_XWqHi-Pd~_Ei(May9$|raRZjh; zNF|H3@LX~A-PU~WWl{+yOp@s_EW)YrjeJ8O!qfu?QM1Nes^m8 zvF@vBpLpv(g}WgvlOWI*r_!K(8dlx(06M zLm<46RmO(m<|&}ho*sb0EUds;C`Y}z51HUfcS45_F+ojzhRgF@aKpw0aQ2t%V7-U- z5hYRzzEup8KFp3O;*@QDViOZ0$C(r~;Q^fC;_A*TdV0t56{gKMzRoRK{>bNDJ1VVV?0d?#P4|vS{Xw+E z!Fk=-A=CukT;MfG)B`g1CaR z;4RFlRG_=G#XjqSFlAq}E)ykvv9sTV!Zw_z=xIXNknUO&i zfZHa*Tz85c&_sp^lTEaCIg?D90wy}BErF63E0Tv$f)lI*Z%QjcB;h{qb23%!y5oP^ z^nb`f`7UkNSWpbnZ>p6cnhj~sBJ*OeRxQaXIa7&H*)LP?tbM}_+Hw3`Ry;9zV|V?m z5Xor!)nO7tqCJn;x@Bk@ZIK2N5+~~BNA#>PzhaN{{J%Z&(?Pk8p`4N16ovJ0Iame; zpN`1!r2A&F{Pil&{sn0t>pwDsLN#0glqO2U&FULiTHa|ZU%fAZCq|=yI~1cG3aqKP zjA5S@Cj0a7zo#8HW~?ftV$fu@i|iG_G_G_Q3W%ImzIWs{Exd0JyBorW-69t>5ev=o zw?`{x*h-dJcxdRgCoAskI%kHZWu4n(ZwQV;GyGBYDSr~pK4iWT(LAoUzP>)J$oCeW z8Y0zBWBh;3kdG;My?AI%p#ddQWx@w#;qStPoOFJR4Fmpu|2)ZRDZB);;h;;}y|8|b z(hmRXm`(*NS~b$PvdBd4F|MF|$)*94hN#M1CQ)D)!u_b@r9|`fXnZW5Jc*`EfIACBEctm?`Tl zBJ}zaiLI0m5DGawRJ~0m8Wsk>Y^3-^rpt8y18&Jrqbc-xUy{aVjAF$41B{Y*A7OlS z%vjGr1snbFAIXpK$_=J#_fewkuJLC9wOpIQO!)UA*L?HgKx1lg+xXnSf@@5A)H)7r zM$OPq73}1v>YCn)%1hG0S_Z(OnGC0J38kSi)m$e`=(&@YUY}^A-N%x`TdlP75ikoJo@khG* zD3HYWdo3DU<062WeXp$t=GKVR!Buk&qS%yZX>Oc-{yv0-u`A}M%gEz@^w^qLbYVYE z=eGQ;%P@%Ht0l~)q^XwjPI$z+w?qX%!(;otId9+ucU3)Mr z?przp%L!2)%4%}@&V03O{NLWTN`L>}t8FFF7AH*>^!ao|6wUtG zyfAdN1Ns~7iq^AI7Rg~EACVf{PfNIT;TNM^DnR!Ij45UjzpMKq8paWG3uA~1vlSF3 z#cKJd-%T>K_@ul^etrYby)@w+4Nk3g{P#v-0uHz5dGOi7r8X z{pG3arJ|QPsWb4rf@oF4fY2DkM@ekqJ3JP-CyysxJL4D-U>=ml-KEb$d3%5J-i7Y(UNt z_X7LZA5$08Er+owV;W)5%+i~G&`{vIRnWqQ2n2@Q9c(EyJN=*w>o}>wO#XoEf}8@o zgyq_UXwfkY2}tN5@L~SkID<>qdw3tbagC6-cEOqGeM?QWpX%=t&)A?vgN_CoLEn9b zJB;lHS1y!kpLCyX|7Wxx<)Qrai*RJ0U*5T?_1in|{vhqp9<0x7W*)YL-Dilk*x`<> z;X&2w8a;#~pZ)LETOuRtlu1vWY*Bl_^XNf6BI-7gsWMdPI6UpH8G;=heRU_0QzM zh~t`gRqoS3cv6QuQDpZ|BC+^dEZJwTg^j88DaRZYfUzCTc#UFUelB4i6Q!qPR^4@u zHfDFjBMwI^$qtX<23QGjAs%?I2>2EF$G`4t`7w9x6SXRnI~bgfS1C?w8e;gGxj zzX%bYe21}yjrh6(x04vD)Sy4LFUvI*7YPeax*Kh?BMBX6yKeZ*x^*Nz;J*OTyZCTh z+kyJjWx{wbuyeC7!`iaFU{>ooer(vB6gipPbg8$oB3U{rahinmP6-?G*x2Uj$)u)^@P_;U3( z$`(rbb>L+V%+Rf`BfQ-$V~8o!G7uNdQYz)4^n0j>vc%*$T-{4xVcdCCzkBj^Pp3C%@!{mC2x^mqQsg0Rj|Cj1t zj$_@j;H zDaUrE4NA&e17;O-ZmoYIM5HgJvpFpAE5e#Vz5e8(Q z8Qmt|m4<4Ofw!lsb+%DB|M-Vb3VZ5f{J4^?#y)XEtLwW*o|g*&ku*0~8SBqH2Il<#rl-x{=~2s*@>9Q! z{bVV`R7|i+CZ{I&4^MmJ=br)(X;Dou>T4LPyTJQJQvt-&0k3z^+Xdsm*X*(JTNlj% z*6O25fkzhAvO(BP4mCTqjQE)v!x1L^cEWtJBGm6vRH#(~RG6eI2lJT*<(X3qZ3-c8 zVV}PTrx6?wYV&hcSN(kt%?=%UZ^&dy%GJcRpalAc$r{RAwl{wxLEU6t(`O}T$_w|_ zx;PD2%L}f_0}p(!KL4+6nP}Di7wfei$_-SqwF3P{n0CD#TK;)J$?C2$NYH(3(&|?^ z)d4Rani4kEq5LU@MJ6mjxq#XKSg>I4*I^Wqko2O1^%mf}&q6wnCS3mpWZW2c0EO`P zZ<~yg?v`$sl!`R}$tU*xU6A|}J%${tDc|V)Q9iRVIOq#&kuqA^d8+GbWu=;*!6QKZ zhI87S)nxXgE=@^zzz(2HvYhjWRjC%B5;ant8zT?m1?@9@N#|*)TbU1~>9r%w;nE68 zlBLRMU|Do?tox$#p6EDm+gHvjrb@%)zly>3>CxrZZ?D!E-?|NX+g2qwysNGGbCt+~ z^wGMo*s7!74Om;1?D|jI+KFa$**!x%=x8zH0O-&=(*56avs!NKv$>iCdYPqe&4mv) zP7s$KIhQ^K7rGIF>^XDntfrY-ti@zx6ly}AZjsrMZud;6g@~*$>q`=PG=xe8n+*~w+>-}T}@C|r@!TqYWXri?I%)G?mz3EMlj`pI_4 z@a^iIGMUyaZbmYiIN3XB{_K{kcEUDw1F>lH4t_hkBFnjSFSCM&ogJYj^#Dctd5x72 zS(-I??PW@=RL9qIcIr{$e>Q|KDporWL%UCcir}Z@O4}Aob1CPHenr9u+#A}Xw;nC< z+hduIW}U#D+bHJd^8qrgR*56|J%wF+Vz#*#eGMHxjl5x-f_=ReITcwQFZwv+YPuoX zdgt{okuGUkk`uErZ99+PJ7js^&8)^(HNEOeU-2V+h3!XgF{fJkU`6dF2y~wp=1<7xX=yN zeqx?YZO2ptx$Zv|Mlh<1N;PA1UQmuOc{?AAKg8pw_7jm5Lr^2{-xUXNCQekL_N2mQ zvlC!CO%4SFc`1P2vJK~-mBOi;>^f7t6tdILbaGxgX}RBD?QX6YmSM~L#1vZhUSP|} zwZ`K9MKol$+dmAtzls}|)M^Fkj>TqOmE{Wq3h;6Mtc*ni|Ha1~xJE_&^>VLq0b^Wn z5j)DhooE@`uuz6LNxF`_aICoQk=qYgG9i=)- zE9UKPkaPQubvV;NsfxYZHVMB5U*zj{8r}AZf%C!Y&7(#aj*&^|htm~#alzmZp$38t zLkcZpup+D3R=E(*?JMtn^;V&w31uYL$cQktA2i7Xi|Sno#va$AIVxU_p)D2*e(%=G zEqLIGEtUPDPE_xFq8h@EQV*eL6(!KU#)ah^)1((fS*xF+OC&Y;4VORf{>k0tx=q;l zQ-hKvT@0N+xJ^PiX8<;JA-hK+4xX9&xv-fmmQBhPQd7r zP=emhZ)1sJ(IHP26i4t!3c5d-;v#7MqC9&sKmWXsdop8%=b}}Gr=vBfnXdUvOH`{s zGqRd(JLavH@ESJ7g0$MS>KqTXdiJ@d>@|D)I7xYrlc0bD8yMqM%`otGqT|m1$3pGN z8hCkU!T)}kD3h1*{xIP-?IHEcr|DtVKTs#2hM8`G(RU~STV5N1%FLLJrMr5zg$cv5 zQKRr93EiF{iVf0zrQrg4bdoxf_>+iE zzoQ|R96?D34tjEO>yZvv|lXP(ChO9#-%4L{ilxs?gYN;C}C&OGu zE4yLuvnknvwAISK9zR@t&s_9jJj!aYB(7a@wg7}jXl=&k8)PIC{4T^V|H?zLwbkyS zBIEP&+y~8P22rS>h#hr4Ho@H<^ZyzEM(CI-P+oR@J`p^H^F`c=R}a$RwvsWP}Eo8xqnPHHgw_tt@rjnHF?G&be6?J7`%z5ILlp)9t_GJxIT( zi%eh`!4IF)L197?Wnr(Xz7qJZdpfVe5U5mzkmvk(ok<0i%;{AAQ$hiR&^eW9v+T5> zX#z)%IoBsdx(ao)_&@Hl|Fo{o|3}qZzcu~-ao-y$ zQUXes0g7}Zt%yj2fRuzHF}fQzLX;0Fof}f4b99FwIT$@sYLcUyaqs%!x{vSmA8b3` zJKnGJd_A9!N0fpO?gphbxRRmz!NN^8F|xHYB|>gRhb%x$J}+dD=nd800?OU;dOm2s zNH|G2?Qm`JZBKo}L@LWY7XGH_UwVo<-$r2UdvMBUdHWR8{djGzw5rep>*Qsh44jV=+94xq!qg zTH>Xo%}qLy6qhBa6LgdR+!3LctaQD@fvjbh5vMw7s@7Wbyj&24NjM|2-NWY9_2x;k zM4T2$wRp0lF}t(QE^^lV8|e#!B;reQnQfJ10o@rLQ4Y7tjphHt{{_NTyp1lXd`S{Q z?8iUk$EZaVf-c#LRCP2fa%1jA1K;N4#Bqish0}AtYIX`_eVOAe0kT3=I(a5mWiCStsVmI0_bo~z-;+7%aYL+Lt0ZbN^%B2JLyUFOa6WuMteQ9O zzbnU)$87ybE0Ecvn<(vw`X0N*`Z7Rh973#(&8{TV)BLKa3uu_gsM7>NX;+dI1|)(K zz_L!_her*2y}z({0%!;KeIG*;c>6QF`wklHey-JVK{^W*E!7^3HUqzFAttJGwc2(G zatZh-ra93MsPpZXYYg_dTHoBmDJH9OxY~!>eXw5z#?!|4g+3wzQkjZgp3Fs5rR!?^n*vaWvA%QR*7+*>c<>H zM5?G5iQf?7J@flC!G_wDe;D4sq<~~dlb#i5icZ%RS3@QCsY6E;b>{8zMsnM}%y6I+ zJTp^W8GI0nW6y}+8k$6IkQf0oZXf3|Wi+1!{(%_*;WUua*PsH1m`=b{r`{pK0Sb0g zS9eBSe#~m;Gc#T1{f$n#uu81GqwqFGxI^RDtyC);&pzwmH2Z=JpHcH zPCSci#!#6t5_{+_jnOa*&G(dkt6)cMbL`+uEFPS^TGhIOe)(4|H zS{v~$^t(%Blm#X1`>(9tNI9?4c&P{4KvVs+Y`dIZFF`D+W{{|q!}cgXSkn?Y>gV?w z-;R?Or(k(cO+jGeLe6XMJ1v@)U21lL~iafT4h-s{vVb%l7E z2lISKv?)A}GjP<$WkkB{ar=l&M!Ev?RBgZ76r~jL_=Sgh;3>fz{+GTa&Y+4Jd%0G| ze?KME%iFE-Tq^7rbgoL)>&1s<<=&E7EMf-o+5LPW>6|69sgQ(5hLg5>${c5i^!Yc55ohMh zO?Ex1HHmnMpwiu=Lp~Gv#9GmwR?Zc%glj|N{CTfR=>k}cdJxTcUmo^kW{j1RVu~A& z8=wbJXjs2XSrI!HKM#K9fs80PUJzZG%+h9V_s6bj4%@jCz;`jN7Fr?or+jG*tt~br zMNk>%1?Y|f8U7yuCA_M~fCJ}Mev!O2U>{2gbiW?mj-IeKBTy!k?HXOM0OkNohY@;~ zJja7%YP5q!9?Ad7cqhh)Z6pQ=fKex+y`l~&3fFlqTHv#O@TAq->y0^EX!)>Z@ljYi zeywOv{KIjERP*`@U1zSqgk0(e=3YMK?M$-3-K_TsXh9drknR7oR3y!EURGcO-;H_N zT`!sFz)F?%H2bKtOO&U#A_@??s-tiAlwJ6B`1)S!Wx!r_hzb$#Ir3Nd%?F5y5weC1 z4b{y)X-8-ih#E5IC~i?m6G-t@Y;eTracJj8lD$Oru_lH9+w67$fO2sIKLUcIkM9Zt z?S8)G;2exTNbQiN(@MV(R$+3eKEsg))$`iz?wtE*$WqO$-pmfTm#S_omCSTKo%nY9 zy^y8fq1(5SJ3+k5_727t>g*;h_>QbFgth>Jj9`{?dp#y zlg9e*TAi(dz~sZTsh3v#qwndR7i#~A{i z3~_rf=d3!$d^SJV=HPcN6bGc+PMz)JHhpTHDav1S^pBWys_0p#xI=Q$AKDc0*^|%S z$#jlZarf5n=UY@7w0t)tePNbRiBKig+f90(;^t`B+FjkEF2(Znl@K~ZlSd`Fx&UUX z^3euj&^OxS#R1OxssU06iVq%>2pK~wXPz)7e!Qf~DCK;mr=Y41MN8|%S2?J2JN=%1 zSn2seV!!j3bbd78iDYnIAj`SxYJ59`8j2(&4wM;gI#E(zS^ z$6gwS(I-r=fmb{`rQ`U=Nsk!h6i{$lf0f)^7?fh|lJntEI#{kFm6oxeqm%3aV9lJv z9N>}pzO>Fc=CRd4km-Ikd{1;K2A151UBy|~UoQmjTOjvHlnqD{j>Pm!+#MPW=7$gN z^Brld3ua;9KB2a5ORtyYLM+h6vm~FOu-au2?4%s_l@lS~J($#5n`k=$+lYKFe;t!6 zk?cgbOqEr@_bvWyys+Yf2})Z&9Nhh0rqDBe={N9;pWyLR)K;^8Tk=m|@So=yd7Uhr zDb-_pLYcQv^H1vJZ^>oX1fnH&t1x{ZaRv)af8Jh?r2iUy;Fa>?-#W9R8MKax@!?2& zHF47szk+Fgt!DG**)q0mWFNK5r|kWuR*A(%_X@5RvD~{Ui%kEx1m{$>77Wqmz0{pW z6M~$Qyz^?G05RQbHZwPWb^^p`Letru@)!}xO*(hN=16{IO4i*T^)weB*FJ}}YI^igQf8x8W|7r$=@fX=O`UR(>*2a{ zd+ON={oU|g+7=kky#JO;tv7Fn8FrgU#X+9m_MdMYKDz1D8`JZ@JeE-*8mm~Mcrxd7 z+>kB5$EvGf#mi|B+?U*J`aC2SKM(p4>+q0E5pebcpT#YhKC?KV5$Kj|%&PMOP9j)T zW%uGG9z%JaSq(N$*={L}ognYl<9PW`7cP{FF)dROD@FX5Z8n?+u)xpDS!Pm$+`S94 zvPn#l^`K3+Tie%jcv|jGqFqtN|DBpokLrN%@AZ4oQ4T5L?28pGaP%WQdH3$^=|RHJh8&GVHcwz6lOTtfKKFC>kA zd4MIU8GN~YGM7!tKYIO(^4|t1!Sa_QP}^a!dyxQl0}aYfald>qb!lP*$N^N=eyp7A zhGYuf;uBg;8=v%oSL^#6rRvCOOPGt(6gGmMLhk#Ogs|>pc|n<8$!HgM&%2b9UXKc1r->8|4F`%Q3927eKxQC+pDE-$WWdIf8Mys% zrMCBW?{X#B3w$ou9(M+hSy+ z>8^syOUj%Rle)IXT}qvy;HGZ%@9$oM53d`4h&)B}gFy4sHRokzM;NC4?Dz9o#V)|( zUrsl!bF-I2^B0e|86IrQ8+COi?5m$g-$bnW92 zN)#S5K?GS)jVwbx*c_Q<95KXswkGgJs1i;#wJ)@h%HGx5Q9}l93vk7GuH67}viZLb zA(g?<+FRKy*c~O2jly4PttlCy{-C{J`GEXQO|ES=#(`(30T~^C#qcx2*L3fEoq@Cf zTL{nJnfP4jcyVRBp~}n^C#Qx#$~*2|euDM^u#>>oAtw9@`X} z?!>fQ`tTQrX7yg%V*`@72*vK1_lYwFWX+53Dz6smbwtq@dnb_H8(w zyp`nbODC(}7c<~1TR-X-Dp#;Hu(GLJ+Le>yL>w0Xs#tFSa2xm)eU7UK-H~E7Ndp1Y ztmQtgslU*&;O$1+Jh$zCv34bdML02`;Fw1nGvn8qYMZS$c*cc&yaq1)-*kMKL~(o-McNA^)Z) z$(!dDSpPD4&bg#CS>@E$WrBmbvYWI~ZQ@3lvmVn>3xM+b>{D0p)P3osW?45v*^^jtGJs>7=^3eNGg}J7kF;5%p_}1ip53dYF%`Ppppc7QTJ27UjS#6R9dEEBCES0NVZ-t=B z5`86IzfR4_%sEJ;_H@Qx*S#mS^d`K(?|ub}Vr2SmnwI#D{Wz7YQPNTg!(U|OB2>OT z*ryr1*Fyp~UrF~hxe0k{+-Vv(N4v}nd%nG4;f;14Wr|sERyff2%2j^J+Tgf|Ofk2y zoVJP4+o-c^3%FdcZ`qo~k*_YM$#;18 zT>Zw^)ezR~veAXb{MYSO)E~w-|9c0j-z3dyE(}rAU?k84C1yzRF^ui5C=<44NTvNC zS^(M7G2&_WqElbj_6vB$2O32dn_TNwrLwX=L7(%%4e1`xm1vaobu7@cE1C8@8|>{5 zAFOMq(6>fT^USEzz@PU#Lass;zZ^{!Te z4zwFb2LV7CJfXb+R&s_H?V^D=kHR)c1r`YE~+TX#n7M?Ey9lG^Ssl0 zR|gLN43L>5uTOVDJPKPOt`KhHlyAN4J{#l*_C@Vu@#7z_5-cE;9!=j^*9k`MS*qFn zqWxTR%leg$yGnD;k%{_-j+=m!*c_;#;XIf(OqpUcQ2V_ItneLD@L!(O>XMTla-jf{ zBmBK^-*?pBMymbN#SW5#L}@3}Ue+sIEc!UQdNw*E`PE4p)me4xWJr zAOu`~ohl(Lmxo+$t}!fsl}jGqG4r}}CmpFPEx)b*CLo>z@=`0EFWsKl(_P~R2cJrn z3ZciZb&Vmjc+>b&!9q!3N>C%wwj0ZtTHZchl+1PKRMULtqV=}YBr@A-wPwX{mcZG7pZ@fIOJXm|k7~*D9MQjTJ4Za8*Mtf{ z=T6IZF+NjkSFiTB^=^Z1EK`kNO*LREtsZr3=f(oXLSlBd&O7ji1-fu_EtF!+8bT>S@Hr)Ejd z&z1&6Tw;THI}-$KF(Gt`kR?P<2I*kC5ziA@0Et4I1f8^GV!3`8X|TLVG6Sc_=GIoT zie0^Z<)q=FS^u+5Q8J~I$KYI8a%84YL3N2m^fEi)u|z<^;g{V7&-U$43|2j`qVzl8 z?}E#i^3SH$S~3};6r2vNlODypLE!yLpRcDhoEd)VDCDfw{fQhzpJ|Te@|s6>ol?g{ z>C(2tr}cKbS^v#{o<|2z5Hi-Mkl&?MO78gLTrF6r?O-?#?qd!HU0Kf0PvG{jr=*Ll z$E!c6&e}|uwre%z;%?I)xn=~|lP!JlP6*bCMFi~&Lgrah^5tS8qqzzXlW+x2TT=I& z``9Le>SWbZBg${qCoV^v9+Jswa-@fm_-2%%p)O^ox-=Uk+q~+K{6I57%-AJLt}~5V zl4fmsHWk`riNsb=@Ecaq;dhW-6F^QjwiSn~aVc>hPi*wHviT9Rtw(?zz(V|AQWW^D zDI@jpcKjkA24%_kW-Sh_yf&OC{gXPUHxaKmdHMg1YcN zoe?wt^pb={6gTA^7aUtN9K%3;lZ0;aNCKbZBmG|;grBcLV_fLJ#JE55V5%Ci?mzq(r>4& zv-PedTAK3rTc}l)&(*wP?FeSvh zX?lkLyW1+yU>rSo$of(H6r@{NswDdR%V;R_%eNL~vY+1_=$a6(#f&xclV{$@=P0%K zEQw0hQxZRSCnF0`wZPM4$(0q(?&R<*6a3ZXMUh& zWfoC6AU(*M<3K_vzK~K+R`HP|`H%S*g4Zt^>WRE_tN%66>#^B__foy@@ttbKnFZvR z%XwUmOPx~KG^AB^+CiihtPHn?xBM%rB@ty+O$-FXgj>xEb&BKWgYQ>Uk9NX8wyQQ8gRB~v?u2LkKcaO^% zl85=61L9N(WAu7uwv}B@d`i>liQVSCL60223xWW=D2yohKByr3+U4~>$0f~Ebmo)) z7gCLhoxUZk(VyKAosx;KqRV;M3UtdInPCnR&DVGK`!jzmZoMNk727EaDCY-E^o$Bs zV7SIfy9wc6$uv*N6l^+GZq}f#8o8`j46|P>?2|&aeqEi zu?A>yj?m_koZ-7WdRUgv2sS{r>ma}~TaH3&E;OjUE2A+-&pY@e<&GHxw{PW`@3{LV zKSLk#{pc~!2mPZ(UgHAr?sgv8&RiODoBb|^e67cb?CZJii$Xu$-j?~61&_Mrzt(a2 zH|e}~Dr>#IEEo>MyOiDK>bic!HPYz*TSN1W-E+@m0|f~p*!5%@SD$*{O^qDj!cKu4 z?2C;BVMqBVOe^IT+D>-k;2d`=rW14uH=`#fR?D#9tCO{fV{JK!wxi*Ri4+DHY$@Qh z0CepjsExPi%prElB@2~g8tP|Du*QGo_06qEZn#(U{gQ*`NH=*G++DWRJ&Ziw>`C?Y zLw-G5>rLC7IoB~`ak*Le-haODpgDoNFe!hUpWdG00~KtNJXMNw@Tj4^6pzLpN{SU- z$Aud=G9ibA*@c})tbPk43x2+W@cdJN;3E%i@xq^50kPXb9h>##Uj8HWJ{&(pu)&N_ zl9UWd`2LY?bI0&Tc}xD5v}JPi*}~ZS8G*jg!!9|b1Ts>V7k82gHaZ%KDBKsuM`=*> zz{0^EgnSkK(Fp07Cz;lW(y;(QGg3U>_LsQM^cxKaZhVbpNpNXzI(_${_y5Z?%P3gc z;4n6ZsvZ>oRtIobn=Kl{#;MFeU#Ih*&L6xU&$9AA_T_)z z0PG>s#!kKwbS9IOU)LvZOo$?NsL_t9<1V9zk0M(G{%)TfmvU(N2rg&HH*Z%R{32FW z8XuZm6|(&OW+wEoFY;x;?}m%ogL=EV#u)Ax<>P{kA0e6Dl)vh}c2V5dzZ?{BB%EG* z{xPF)cYSm#<6(9Y!|mS;zU2SY1(e8ZTH948H(HteB5(S<>2f8OSVoEy z{r*t7)78#3b>Xu7MZPA6E-3hX>Ew4?Tp{>om0?055T~q7akV^=L6KFVj8TpnZ9da3 zQGG3@uF39h&hvsiP=tSwCFSF*dq$~yFGId_a=Ttd#qDc%wBEUCH*0*c`%MrfCSvun z!Si+FbdBQ+=}sPgom^yoSKPl2KE~6h1L4}A=&AsW`>W4BxhNeOjAY1OekiWZ)1dnO z^b#(Ys0H$#eYI>yCBl+BYPv%x*JYh62YF4me+VoTR&{ckFrE;NlBe_joB#O@gWDqd zDMkyyz50D>fAqf*7!9Su=+r7+2;CYxp~foIOP~;?8ue>^>P#evXm$G%|4q|GN7o-y z-SNFMt0k;*vo&c=|5}nMT~Xn{N3^}2$|Y+cY5mXj*vP!Q8$v$Q=NosNF~;pgXS)S? zNGV(j?fccb&|txROOb}f+9id_^?P?L2QO@hTK@Z+3EC*{fB6?Z52%7 z#l{vyyT=};`xxv$T}votyG93n*ps6VRZ8Lk=$byz8E)&WDF4(ixR>VR+ehkKC^w-c z*FH1}&jXYCu4_l{$Ua@CeyRQ)<{I*nl5;10(OQsBrwZbn=4R7aOZaes<%NMi6YusP zqFaF8*@7NIJAKG@gf_>Qip1mv`HLiXaY#19Zr{_t9S`@s9I>PHIgw(PvLf|ZmaxIH zUCM}3SsLq8M}38=oSm7=sS9Tvlk?-^r~HJ4A2SW+-y*`KXsZ6sLI*pJezJ2GEJB!X zTV85!{0i*+kmG4t>pciF8nom4SG%Bc_1xVRTmZ_yo{$ToOjBcs&c6(@ z#MF}%kIPDorfp{keP3FhI~CWOv|#+}A!tXfNj&n0@twS z9#m@9+`MjnZGGBsWIw+U#$$TbEj4NJ{2ZCnv3sc$Iv*J{rRBA_X1SpN)n$@Ff1E8i zNOf5jJr-4NT3BAgaiA-^5%fDW=K#vtmq=m7^Ip%AY0ADu#*Xfio<7oC0*OmAS!>%z zBL*2In>js1y2n3xP#y?Bb2&)fTE%eC_vv!KYO^m0jV`@QDO%2%BlD|`HT}V#PX!=T z*4L+`^CdBjP1;j<1gtO4Auk#h&EmAz(*!9lzY^09(c@;!tW(+sOgGol6S&UtI2idD zEgK#4`AivKzuiIHCGk#hcr`6OP)wF-^mqNg*EPH;|L3}FmPq<>l~ zYTHy?*!JB}!~nAUqkp%k)pO%@laoHE1NTL|1NrBbhkWXdRC;@Uac9gwKDuLW##Sdr zVT-M=ZnyUrw;Il|4P;rk?KM(Lp)S4Ejpcc5HG)?ffFH^Nz&!}B>wQM9g{HdYZ3W4K*HiJ)Ds_VVSbWQ z27&vhX3sYf;>1csj5?EwU{?~p4=Pb9vGvrg|8alXZvrIccWJW&&AB&$S}UYETx}%U z2J+6~9sWhsKr zuACa89P=pgBOkxItIs3&Te%N-M4amHIGZYYBG$Zt!R$p*U&!cv$(f&awUfL~$+m46 z=`CMT*5rDO|4lD)u52jIWI*z^d$+wJm^d*TyKVLDnQc2t<1wXXsl_eL^NxFzGwV$c zF9#DD^NK5*@yD|A`Npfx#z9|^`c7?>3b#IVuqgW!ILoA1#)tmkk4uaCC@R!S)VmN- zcnndbzf^o1C#aK)MN+Ovj$#(-`~?n4N!=}KZCm-Tqrd8+ydqPAdc1W8Y+Au6DSx~%tWNET)Iwtv|L}L0Z zsqF|?3 zVn(p}zNadqv{~{hZisfnc-pvq*cscjc+IA3?Vj!06qn%5X>%3MQhQyx{dh4cvxs3_ z5`zEi>$9mkQeK`e&tk8;+E#p{E5J>{8y*L@=Y>ifjxGQ}*13k;Men$2ubh7&PA=Nl zOF^~PGp3cArWV1${%ge?ns=MaHb~B+-Y`4HWYWZtbq(py)<-^KmM~^ ze~Ge+L$sc)pTlQhS6wHgwQ<^5x$_gm?WJuY8&Xa*=m2#*fm1tQk#W&bY3LATn`^4; zI~xt|i1EqvF>1@h_$4G;OU-phWjCO2b$+a1TIxb}SE1EH`}X1f(K>kz%)6 zDvsl9#7dLJ-UZjg*2u9ULPdU<~TWIAKDXK0#!nzG%^ zt#o6$Y3MXi&h(tcZd?1xV{zu~9cj+CPmnVOQIS9o|K9&pdYn49(#^yN&<27Rx8jkr zW{ISxCzx8TkV(f0jxmIJ?kVkK`r%7=Uqz67(&X4=$CWq`kD#9<0uniK`dbF-g8kZy zf7>Ap145kD^)(+xUQlZC-atykx5^^RTZ7WJYcm_*77I=DmWP;`in=X_>+zz;yQn%> ziucux!=W&v&Ud{3GMs9~ALnI%{W%iHlcmh(+XemBCPpYhaBr57_RnGzM#9oAS#Cwl z#JF4R(>#$@`U*n&c6Bs+i$mcu|1Zyo9v(VyE7*Y>IcY)4V;NdiKVSW`*L)!InRJ;C zMKH_^_=r|C=j730)ErfO?+i??xDBHQ;BNZL ziEtqEFHlJtck=khJ^$gc+P_~_dq!yi;u%@oUEIECCOfNb!zX52>V#GF?8DDiD|3pg zjf1$`>!)2hzsVE6;HwW@>FN*TyC7uF8hFMQ1qJ~;kFbHIP~#ORa|HDP=_J7~tKqM! z|D;a=L-||HuR(JKQ!{-*{DD(ltA;Z9e2Aiub~^?W-=jEhBX#~8lYqhn0$z9OCfLGL zLJ~?R-E#{ByIG6iV%!2Hu1K) z{ZzIlEdP(i_mO2%Ya>e{<$S4NOddpc55u&5SxhxJcKb^cBVjDBm&eAW*MwT)$*cJz zx$$f@G#M0tT$a@f>2)LOx#5Ej4L=+5-u4_4khf!$B4bZ*M5fZG{h|JJzl@^Svn=fB zy$s4v-y$^W(un>VO9($Yq8cC_yw@PJW0Ph`mI-Z{M71x&wLlv~s`o0M}Q{?X@3!Bcy2;(OwlXNdw7;q3I z>yonYT*G>%eJI##k+XJ?r!t(FfRJ#}Ww^b66GL?m_#RRyh6O=UXhZH`OPYhC*rUYy z)~j@5E3xzYwV#a&c-p3OvU);Z@?IDq1vt4(e3pLZkopjW6Dbmf(`=l!u92jGWIDt7 zx-{}DG0hI-Ha$o7bbDhfh>Exw-)H^adnVuL3U^HZPCo6_H~rJ_*)lmy^}}6oAClR< z*o9MfoBjQ;8PgiOs%%bDAqT%+cje*`$Ae_;4nq0|3HP3xxe;hJiLaM=Gi8JzW=O_p zBxuJNjTm1%YJ9}WpY7O0;+b;Bu8w7|t}>}#ONscPSMv1kUTg!-R`gXID!f>ZY-Lf63xGl0yDm{VO`ZCJl9V?aQ3 z<2lHkJs51dnA+DXbv=FkW6QjtOCTDf+*|MGwgle$20~_5YM5I1;w7NiL@ciVuKy&j z<7&CEA9n?I@w@tYhdD`9!MXcyjdx_4lPR0Fn zB}MO%$GjuIgk=<~>c_Rv>eqc0(7XEScNH7yS0oD=iPVy&B$b>rS_U|gV`D#GiS?VdirFHr*HiLDy zoZ+ZdnM110|3<^%3k|sqxg)JB^YKZAN!qTrd@;4GlZ8`@%ROnA-^iJhE`0zbf_Cp& z#v8cz-oL8V_j%%4ze^+eoTlVq2<}sQjO8jGb?ka|(iamEMd@Q7VheQ8CHFU4Pvl$S z7vq0X`ww9`y4uWuYFTz@`NpkV_^SW`wEN>;ov9p*vL00T-RG<efBozNy`As*n3gB;q|kDk<1{i=L6pp-JNY647}x8(3v!JjWJF~Jqlmm zJkz%RnR@gmwXnDcn>{~i8Y|#*k8^N%#)?p_X(NM8%n2ghWAH#2T~d+EBulAiz;KEH zXl17Tc^4*PTXw0aET$EpYw(#bCBGQT?ay6Q%rY*(`IfN6*rDzh55&KaJ1s{q=24D; zaZ-$&3AA2BT3h_kq@}p8Ri3_Yl}}OMw_k|Sc3UfajWm=fSfHoCk=`dH7hl4AN48?C z;pT%q4>FkPyE0%lk0LH4Zv5?sm?zNUr)ZI5aDBa$zjI%WmpopVT&r^=C|-eMVHucv zbjJEXA}3aE_0<$Ock)(hU)7|P6ivhyWTz^-I``L{4dCury~*AB&8oisY_(x~2vOwO zA^A1)mnoFguf3NeXFLT6S0rhOcz-JU)8c!%!|L3cpV*)XN>>3nD4Pn{I#xNWXDZhN zNt_hBd%(wgv&$^AY(GZ^HbxG$g`jR0PRg!|`Z)DWS*X$6PE+_jbWy3dI(Xxiy6p4h zc@Nj`Z+cTTL;r%#98S=ht;vAf1~1+99i2y!q)5*^-WML6J& zOjEzME-TyC@gvR(#S4s<y# zR}|quO&$9^GRCh2JPUTU^^+Im4`S>TyrxM&iL-QlFsVcJCe?1w#S&ad|8TI49ju8D zD62^Mj}DS*D+RXx)LdO@`ES47E5R6c~bK`C;oVlJPAY+T{R+v8*Z!`3>YRe|f0;%{L#*MXOWU zQD;c)cUf=*eI1TkOkCpq?!rXu_7eraB68P3B0xx|qLR}u&4`p|_>;^krI7-{N+l{z zfF~}`Dv9i&IH`QQgQ=X%cKcFokn|OYfKnwc*zDSmIBHf@?X9uGSlHN<*T{m)aBOcM~veZQSCWgxv8TaGE*puZ6aY{9)Tx zSSl>tyX`0ugmge^k}d@{ZLFjin#4K=IY=KZrI;J~k_f;a`SlS7sK4(Uos?Hs>?@xy zLB9~vV=2%Ujkq|rI-0?u=VyiM5emZeT?#qc^R~mpIAC~4*wZ-R1IeqR{jOIWHdk>$ zy@#YDFEBquIV)-?UXVGWE@Y=YMmIR_Hh*pA_tw5&+U~kS1s86m}=}?0?4Z^3JVqL8q&; z7J}86gt|Fff6whhYD>+JuI&>fT_(=miW~{!=xKcuDu--aWQSN)bQmQnkJ>#f6XR+W*QV z=Bkdj5J=&-%%k~=VsuUTy$30(n}w~NzM1YVe?~sTr{8qQAo1XJx&)xNm;~OL{F`Nk zIKixv;Z$XGChHfEj81+G=q%X%_UeAt)qDLM9%0ZQ1q^)`eJ856h;WENEblbU>8j13 zgZn1OockIW(d29-?UGHpd{s6P#UL{RnaCdsdS8!<21kgF3mXr0ET+#Amkg@EA`oLS zm*69oe?3;c$9~T%rAP^jm)jA?i@esexnU_BJ^0X!g3qZXu~B#rD>YF18lGyf5FL#l zAUH_`j;)t*oOBS?c?7*BStj@*b>$%iJElE0k4D0wLZGWyXfWXjkZk!y{%!KNtQ!Iu zes_=^+44&Df(CB3g}*fDH0Gp<348={LP5Wd`sqv4&-BF}&e`Nw5PlMcrYj9OK?to0 zDIt1M@?#G>tx)$tP8oh7!;S$Pa~qX4KbHN5AB?t9F_Qc@I3WiNZ(L?sPYzh-tu1^? zvlIkhxFNILj$;OZ?Ch!bWH0mCcL~4jvmEkLRau6R2mpA1-t>-Zm#?GTX49Lf9FK-+ zBs;nA0r_}=pD?KfKEMXc?4t*T!R-L#qNrNSRnbGb-9M{toyx(4Sx0*NcJhbM&A5@p zubjh@X%%%A<$Ti6CU6@XG+c^=WG_hnbt8`YB-g z?fGCiI}pB5<4W&CtTa?Hx{w%ga6{1j;(`=)q}h$ICeP5EzR!6WXHhw3w-v23M@o zoe*pKm%xP3a$>aGA?&2sAzu4x6;b#py=|kt&w-OOAhVVc-g_Z#9^(*{B*Dq_l!;-V z*lMWGw&~F3rtvJ$p~wJ)VH%*&A#UvB_)_=2(m{wq193pgDNC34nvrwUkI|JRoM>0fDQn)O?l7545 znbe28A7(Xt&|odAlQ8{)e>7aTf6@bz=cXC{I7DeRw7|`0L{8|XYy3QIV1Xt+hBEkD zUjnOJB{nvhIx-@hvXaEtReTOwt-ThV4v+_b$go;yHo|(?#=>5ic$E7;PX*1~<5zY6 zBIs)T0Uz!0)95^LOvR+uPk!9qklvd(J;C&UUhAy&SFGTIpd?1QHJ3?q-i1xxl0)lB zuAqBz)cEXUKtt5bckPXtuT$+R8xsNm+uJTFUykil3%mJIpx+l~zA z<-UdfO-F`#;7KK1GWce1%T@vB95#_Hh!P93QJiQnPmgsB2>LVKP^e_O42^a6+20yX zk)=Cs)xmUD0Z>_Pc=_v+N#V3;KSa)h1_LGVVsQ#;)Equ+*bh4c7Npy%fFAE}7V295Im4xu z`u0c@x$&P!S-_*6vw^x9#^If9bd`=rl z@H$=mT1ilFLx;oRzcRMj*LwZI8#}o6YDF4F1=6%aq^hDcnI+Oln7xtg{}-{J{;Wjy z|2mr@zfx=iP-o$BeSwVsO@rD?wAaK;&$=2(-0J|bHisF9>N(BUfJ1X$L0`7^war(BvKBY_n0CgjgCX8vX|jFeJ4h_mGHmI{YbFcb&Yj74DY}{NF_`TxXos)fVvwQkAafpjwo{6QSHBvJ~PjB#GOzN zYF85g3oyG2SrE3%&X+>HVBnfE?R!%r{J= zZD_!vhhmy6>8Hetp{MbbITZPfmW5EWM<1o$(ETu)Z2s5>4DV;k1(e`Zp|d4Md*+|h z-kQdhM=Q0^JtT7^`YsaDOIC%tgYMuQ)m|Mh5WpwRt`DDsT4Z-pkc!?;U2$fM1pNdh z1P`LA-3W%86?)4Z{{AM{pMs(s10p@2w*4Rxz<3hWH--@PIdQU_pUv28f3n$*7a=_| z&bhwdRIlT*Ca{Mulx`hmC$LdySPjfR3E6mSYSWs}F(tV6`WBJiyoE$4_i^Zsesa*p z7Pj^$RQk7I>%t@ksED!DtBZfxMdhdRMw;Y)v_{sy(#Pu5I9?ZcKec0cF-UP^O{%cL z!9Q4!+~a3WEOMD?L79ds9Xv;;ZXp%Btu5Y8DtDZ=_&!#jEoBE;tifS(UP#xO`cC?I zuGphLi2$=#q9Q5`>o+q`Tlz_zm{+D`o`7GdKJT2I`?)~S(-|-O)XY}K8*SLe;`=ch zVY-|t&MsFfmuF@hh-pF&*NPubhMB=mZn5SSSAz4bMS9Ryg-C_Aq^Zlap_&>&U{OuW zCP&OD@W(r;Q-b3kaa6#{1w}ZZWODh;5A!%9&y(51Bm~7to%&p%H+dLb@nCI|al{#j^g2xIgUgS9MB9?#VcDF>i`o;7b8rXt+DvGP z`U=g6I`5;AaXP%kwoQB?56m=O&N}Nj_9wqyYB1m9zvO7ets*uG;DwSfaG?L+LzO~X z@I}Mj?U-1{{p(dLuxQ)K#j=)*?CtHAt#%ODe{BGJDskHYKKh5)``ynAvn@1pxye5Y z3PxXVk{iS_6oz5j#n{kieeruP=NAf%`1k9#M(h;X1HE&6#6Jg2INB+kqmlMqT#;8R zCQg`pJ6q36tA!Ty_JSn}cw3EOUZ;!5jz*B&s52jl;Zz!9JPEmCtp7i%{`#TG_kaJ# zHwH{ZKt&NoDhfzQhY}kPRHT)bMnIT!=hzShm6omzX+%I^bPYt1j*+9A(cO&Cp5I@- zulJvDoj;uS^E&Rwaomo=4M^M(p_ZBF8dr6k6nx3@2`f)4PdzN)vjsJeV>uaJ=m0rS z*HSn;lf6RhCPl+DBFwGuN*u_3ETPY=CAbK(6Bcx&|E%`e;Y?^I=bEYc`D zE*(`yIZKyaLAQEB?*6u-wyUpY;vs#~7b<;KfvU)-)JX2#d#zH%0zGkf5T36NR}Hsql(+qx8XO*YV! zv5I}U8bO^zLfj2O=`d*m-2mxd6Th0kER|YVL=##GtA|Rjtw&URcC@PijZFBa|t@l5v)r}Fd6a)+n zZ8(=W9WCdi8(%}2v z0?r}01EPa75dN}!LYR6mlbqT5vG9K4uED~036D7EC99y3*QJw!Cls{VjyJ+=FH~o$ zB|~&HbFpH%Ia4WV@feTn7_paivDf~PBeS#zfG=1T98t9ktA6~#K2HBCn|_N1i5C39 zx2p_-dTu;32!IrfXL1(la6Ml6^wCg#E^DBGzEYdQY~fdDj+bw51e?X<8{X2(r8u))x04s_3 ze&Qs@GI&ig(6w|$|M)S_yfMT34fA%~3qj_85^Ewmi|M4UyKw{i0XzNVeghtI2W5Mb(Gm7od~ohH&!7CvB>W? zBkK;n>@G(sAkS_s^<%c8utf@QrsHbv6I&!+CJ(%#(uaSzwepbT(!!fogB{{r*>5kf zAe+HxqUlHYdD)5ft~@S3#vUIwA5S~Jx##&h(Dg6vmq&XtdQQN+GchhhmN;3F)B@+l z`|J-$+6P6|Q<3{VgCpoa(=mkFiH2ngEMUJ|5p_O|`ullhfkJqbI8ArsGIf8#uP<4SdKm18RXu=_l2qzKZLv&Te+HM(m>K@xIFHc{4P5;oo=+Bz>Yx*>C`fwlse{!eY z(B}OGv%yBtnVL(=uCpNLxQ$7qs|;*?>>JwtXp$B<0}A~3d0r3G1Jg|w^8%_`=|Ai2 z<+vh;rDKJ+qRL^3?v7qoXbgkU>3ritNmAn~a?ZM;tGA}naG`dDD((S)vCI|=+)m*1 zLm?f@Z>irB6Z?wz*mLlP9?uHqW1hm;^IvaZL;H>CZ-_~uATmN=LEWTGau=qJs6cHX|mqA{i?ebpuSec?iOVJKGJMb$aURZd?WB9oPTDo=<&ckqn+IH8SresnI{+ywh?D0V=vYD>uMz} ziWOp@G0-=mi?n7>{ZOXNs3#QG5Z1x|BZ5&ajPJaeeOrHeLZ9%X?KxNe3A!Dt3{RlQ zLBS<7P4_`ct)h{OC5Xiw`tESsS!*R@$3OIgl!CW6yZh>Rf9v^vIRnUL|4^@}sE-&& z+0JF#ItT>&d66Dnoco%)QbbdD)^FD@P5jKBuK8q zV1kcTs8^vKyBqE+aTi_-N~1O0k1n1BQ%V8?+1HrI5GdcpO14cnKeDNsx9Q*No* zA^(Ys)qpAG$m;;N<6-#)+6!ak(b>VYeTl|)!(JzL>GM4!GsIp8`PD2h-*DKil`D-7 z_~5rcZaZ-mjJb56&|`4$^?!!->{8mdo!62uk37yxPKQ{HwykCbLPy5>5E#+cD3wWZ z-$<5rz-2T0L@sEeO0#a-*ZpjE6QkkZIcd5qpoQ@EJMGw37na|BHGvo>@y=Y;5ev32 zJdwAqYB&S^{f@vhYxc|K(6f<)Nvjzr7gZ9uoXPiW;wsQ@&-v=|;Gl~1&Tp#@`Luz& z`b;)M?!^!{ZIL3IKBq)t@F?2R<*eDhkL-f+E%;pd*kuj$2CH$-k#B3V#r}S#-R5U` z>9km|>bs2_8P60h;#_@K5h?Y>p^MX9GSjHc_)$4CaWqIxg{yJ*yxwbk3}Q=*{m`-2dpl+!GnPoFQwqJaB%aaz$StcOaA zv*1EYHsNFH)Z2R#!n5&@*^f16;gk>Q1mmT3d{KCEt%?Wqe1}A~UIdQAftdughVD{m zt#5gkdu>}`2@#ann7eIs8lX2bdNNFl(@WfdSyg$R{Exy|Q#8W)=BYWx*Ioeyg<2@&KoB965GAYF*0^N4AJP`21CYFVSBC1PqOQ}|zB{}qJr0EF`#t03 z4rdy@M2mPCt$2NSt0!)C&T+dNg=M-XTUiPH0>S;1+tX#BwG0~|>%Qi+?m<= zyQKVm25hubpvdbgI-`3nZ0@xCgJ~u0+34XtZ|H~UYaxDf$4x&4gft=X(rah)Yk!^p zi~b5q;)g~@C**$yz#ThMaHYn4CoK)`8dtkveXJQ2$VQKC%#^w+g=Ub(EOyRWWr92# zGUL9o)_omC)mi=bK63%Ha1qRQ9LgjuE)&lnb4`w44QpvC-mJod;@^7z_CKA?xDJad zQ!W0`qnt|7AFNl{zKJz>YMLlGJsPeI;nIDpJ@!a@Y~RrAu?LJKct*%7jj{d7`81M zHrmV#uOxXl4Zp)mW)C%}+iV>Dw6_XsDueiM06)6wT!ln<7CDhOMElz2@SF%B7WL{- zrAgvdzSq{S;pi-6C$n$Ka^P1$(7WOY$%QV&?D+b#BNMPhX&A9}<#K&JVKHwxmdRI0 zROdQOu8PB;q4AaIe9 zxH&u9qM3+7b4ZH5;iVkbIyAqkatL!i<6pI&t+2L1`o|2=Jd};jyrJg85ABcR3-eXQ zS#eocHmt9>HgT>VXw=?F*5lQx&1&Pq6-5|DTy?4N-1~WO8b9mn>tq%e z*P~K-g(aXaxs(N#g!+y9i4!>G19@+Iy3@J?kwdqS(2ORvzdzia z#Xg;WRnx^g+RdR!UIgcmA$ME4ZLw{Qe+_0Gt+9XUd{NE0S3EnTeVHc|ad%D&w3Ba^O|HE$o<>+%6sS}ug1OZ15#n1 zhW|{UE1_v=iMZnrO{L%V$&(}_z4zOrE4kVn34c$vT+J5#Hi*E^(GbSFfz%h>OGzq* z?*d$nBQ4N{TsQKaOFTFMNJKHDQr=q>e ztC47ww}C1a*SR9$%_U^wHP^D~*K!1H*Gy?6zbhS0mY zTW&+yn_jaXzg#~AmNZsul~RABOmSk`Dnhx9$z?1r6sf!BPW>NAhg?@n$VAS)7D{nU zm+{%SZ`etn>x9z@LlR=K)eeb8iOw2}f(iRkzDoGA;5Y%pXKLo7*&&8EDbldYAdTk! zE=kL;xdrP|_U|C8#D&+1^g|SWUWq)gPAuZePviIa*8_Mhfgs#y@0IJ3z!gXHojT#R zQ_D&9-3$m$bzj#ns4|Fx=^q{KPp8u3|7y%ggjY$>t1M^=X(M&UM5s5JNrHzW13pVs zePUvm?z+ZpDDk>ngA*sgvbwn}*&+J2^X&`F%w@It#lW+>Qdeys9R)0;g{ke-snaMv z!yXplktY}BQZ#_1&mk9ra&g9uOpkaBfblJqANTsKdnG$4|5+>Iu&Mpz97xpMaCv{PV z!tt(4*UVy7l?b|kW|X)vMc*RLRwUBp7&u>HqA=rYV_f?}C}|M3bkNU+C3hocJmund zm=szyu>GkY00@0LoAj5|ugzkV0D8v~i$IQK&d9UAg+m~PgC(LJ5h0leIJyPqF_mZP zt`YVww<+&5%~_qQfct;@un<0Bw;Y~cWn7m1D;={3XfJ&bN>*+EsKqi=j(5A#O$)gm z|9&?2d`zBgwzb}O@5E!FwM}Y!$n@lva{yN;Dnl*$`ZOKO%^~rh_sks$`n1ze_kGOs ziZpQba{IOEKQ&D993gy(J{*x^4h{>vu2!Ax6tAbxG)yZBcDM#*O5AXIj`>lwPJ@N( zC@sg_&9Out)jTfW&5o)tZ40i{uY6)~ zdMt0?I&3-KbQYFedkrJ<(6_C)!9>k`JpA$Z&5JW*bIO+7lICBqK5AJZRzSsOgCi36 ziiCTKQIu(SH@_K(i#-2K=|rI{@gGprCAQA>Ps#nQN%YyX1?C+C>BBx|i`p3qs~py^ zZI7EY%PAi^e0l3j?Bie~1|e^#`0^@}VP5WDPv7NBU0s`>Qba&7=1`eG;ob29JO zTUMwuFY@&a^mE>)NeHjau>Xnd1KkCOqH=LrKp$!eBZ|490ZHg>lx5d1XmHSNi_d_^ zl&|h8v)K8oGKNEl40O=bK}|*sO9uaqorNjRv3HTp6373TE&;mzaYGu9Fdz#@Dq+rWq*=?-;8( zJjdkna-4<{$2m!d2Paje%Y)XL%fAP$-XyR8<%Q(s4=)}$J&*mduLrF zh1V|@B&-ZmeU5z1YB1F-f4T#mVjzVv;p3K=NSdXhWPeB>_z5MQOyFlFxb#fy^Zp<4=imVC7qn5;U-Y#gxNfCn zMI0VSk+Tv|)L_PcifRq1B>p9CeO8lyLn#MI7@_UUEbUQJqEH732~i65Ced-;>&I5S zg699V)_4feOUZ+Mn7<9D`o-f2xZ6spZ32$m(@OfZF1PYqEx*&5O?dVf{uU4MCQgEo zztJ*5AiE+xsho6r6@n{xM!b7(Y>I{XhFPto-lmNW(cOPHwHQLpobTFqn)_&D;2Nke zVCXCA>v$s?Y3T1Z1anbZAL@c$rCnEoji68?+VzwUAB#ZfvfzLXrt9hy)Pw(32(`Tf zopjH0!@h@qO<|CkN^&yguw{L$hO$wQ<%;Dq4%KJ;aVnS%mWFP~aGFu7g!-fX}Z7>N6R*>$%VgNeaopuq~gAi`X=rPJ@7L{ zZY!00D60q+lM_sXST|xur)==r6QxE#x9os?zeuef6-m*_(CO|w+)+MXD!d|;0*BE? zKJnw5uYC(cOK+iyyM!%3Xg7ZcQZ3~PAtVB50fjeUC_elWg<8&dDj+eXMp>L+E12Zc~Cu*m>vL`=_dSxsAaXe0_f^_nQxe@WycL2sh9?k8* zXK)O~b0xuNJyaC`DK>_h~L@1OMm?EvqG#{a6G?N1`mxO-3`^`g96cnlG3iG zF2ng+pws8wUk?acvLEtL?@0t5*=4j2lhu0~xn$6?11<*}>_;KH#xBDjzB8SNTkaQQ z-4>!ie**o%{F?kn{k>5CI&Zua2(A2@isf`VcjY|5T$2p3`!Ognb-Jg9?=>(-dtGfD zl4fs@pZCh*(N!}}<&yg5zLtc&3vv8WBGPCsAc>d*pP4ApP#9VyP3l=TzxnM^b4Uu7 zHh1O{h}g7gJnsynQ?IJOxHxEY*U}J%9*!MMGBk-_9w^VGqLByZ_;TpU*1@3FObR-1 z5qgxkg*iJiSJy(WLp4ei4(&dlY6cJTa*R`|G^vv$o31+>E70k1ex=X=4%u>?GBhBr za+I%%`<_khOp;+_hIq2I1SmJ?&f%<8nKm1#_kJF5y_SJAHM_hDv5X*a+{V>?XqTDO`d_# zNpK;em{@v$kZYro2?PQ{6Z zlWjmS$HUUB#A)M{(OR!>!7C=*)az+37a|sQ=(2x@1jLsOYq#21GL zCRNZLD@bFX*TYP0v^jFc+`NmncwCv@2NfPW>sAZg%l#k6{vZBori`~iJ z@2GhxuVs4vDmfJAS_#Ywf>?ZDdt4>)7Z_Pa$GZCVTQ!h+(B08N4D`4P;s5kea2tD2yii&NF$JeF_#O1vNrUK-O1Tq zWgR-H#CuEow?vFGWKVqijEooD1@HhSn^ZoFiv4n1IA|jw2gyW z;jG|NxYYYGKAjoD=aWP16Mi?MQOLlC!@$7zi)OM|gncM4xY7~+CB^Fz7w^fPj1-TA zCdK9O^mmx751#GLbH%G zzYewnexf!9D(+&vKU_f7Os>p z4rAPTioMAG)A&glkl+ETJv%kuS0N3mnEr+8yDOwLtJ^&4%&Q;V3zRbFTE2;UoK$;f zKdf84)que!4&$Ni?X(unO*N^5AQ90Jfi{&xVIf=O4M3KxIkG`gJ>9eRxTh)?;oKm< zIkl&+)W=|k^dy{*^cm^IBiaQ}L{_2D%4ZA}Escj~*p;5qv#{ey#o^2CFZ%=!i!N57 zi^_&QJTd)Vpjg8t-j*C*^>y=`E8W&AA)O2mS@BDPr9x=|6Da48(5kr_vsh+EGoC$RrNbZe@#ru zd8ZGXFa5P=ZTX@(PQ|BTj5xJyjWTxhztQ@8uOy<#eo(Ki<&BNyvF>_WafYb2pY~e< zj+-ng)Zv5{92#o7vGWk5TO{i9$R;u2ln1Ng#7bsGntl~X2V@5><6KAEaEB) zM0bCOLx0w*H7Lvb|G(p=$tR!Z_r7xG6E?YV^C8>8XH@FVc)D_?c5#^oJ>duBkz-dX zLLm*jo07;iUz3t=GHDtp*^I4dtQs|7M&0f9K-={)_vrg(+)nG(4{%M!<+;$18}Lsv zsCr%#d9HHwA77RGBUol`0V=qP4uG$t4~&H96-~_doX>B(>;PneqS5ZXLt8+XzhMQD zd(oV9I?9wHI>>nlEFy%CE4Jv2=^R%smEGJ$e{^cseQ?fhyp#3~LRcUj6oBB1$Cr__i;Iv)DGQOu$MZSpo z+kI&)ovXD?mGCiXK~5};-O+l`suT{qZkBxG&{K#WZalv1bYD87W?#bslC9y=&~d zt>spcflOeFmr4VWs&1HmELlD=mYF9}^5a5qucEJK{H_+43gTS2{*W#lyfQy>vy`Wn zY3?+O>sb6Z-=&?+QNocMw_3H;8+tUwDDJ;KVBI9BbJ_QSH{~Y0dIW4?$=-c=T3*4tn+B>yX&R<(*7iYne|NZ?cs~6QYk?oa}LG> z_gBFkyGQ+my?j8K-D4~m-%}pSdPJ2*oxqNmF=+MHB~JJ`=UHoJZ7y7=>3sOE5 zug-PWrWc`>7(DJQN{^TC*OTLkLGQ4*w`G;mOfw6!v|9*^{7O?#NjmE;?`LL5@|bQx z<=wQ5J$#*R^nWzGcatJOU{!%IN4 ztHIIMAEVjh@pQCoUSYSSKK##Zc-TEV4FEr(9#!O;X*x+;fGN9%U+`kOEGP+bw2ECd zCzDP!eJoKr=Ev_pK44jCyVo%W)_14=>CzTk-_~$#&)_M);BNODXI~q(PFdI+)*Ru6 zdnTZyn3Gt!u<>T?(RoiRZ#&A%SEs?g&ZB5efOhu8wG*{ z@tfLSXwq+2+U~p3JV*A7+MY1lw}0sc*Og|ru=2v8AN-yVMEos-X#)oMPdSl)t!6_ zG%}Au?Vr3VJn?C$gXyAV_HQBzkcVMWKZ(+aLsF`9NRftvKidwlKH-?e#w%|+9YsA(XE%DH_zWqEVf?GO zs%$T^ucW16_hLb)R|T=PyM5H2>&AvtBb!kP+DlOZJIjT5wD5W@P%=rGg-^>#8ubjHm zDs1;*qVaZ4Pmlkjn|h>H$y?@u^R^9KXb}~q8a&S=1+*r(u#>$yrDWrr4_~3PVvjiB zZQ#}l_xl{F}z3@e6j zS9k0DzXJlSO5*~FUOPMMaHmt>x8zI7%P82_P^6!YgAWWE>4V$7&K!)JuvfDlp2(VQ zupr!Vb~+)REgY2=}s_C${PD%izt7tCpfKa44z5%OK`x z6!i_ELg34ggp?x?rXs%5RfFwoMm-N2Mm)sd>ulh0Nc`z^uedVViZLN0E}hRjTavLC z1J|eu`LE(8m6#n`(xgBowJZhqI5i6_#$;mLTFCJG-2kn1jT25ga4_6_RvGnDso2PY zI&H9(LWQ~&I<*tWV$soU2&(8E`Z%wx5dzXoZiB8$&HhE@201MRNUdNU18|DI5i8R# zi!erQ7?C}D5kq)cEWqrr6a@~31n3)WC}nxhd z@RfTOepj7;LtGJTZ56;mjkNgTF<_b7hN8XY$3J(?Q(*iqr(DhpHrU-_fueC zcidtBQ57#|{WY1*QX^NG;3Xf_hT+b;ZHYomymEuGtZtKT4R*UB$8JR(yB`JgA zzsV~{x5QZ3C|l-kUzKccTor+F+J}e-`2dZ&i_c3-r&uKh`&z&)B0_$jX|p*t4Ll`C zUDKC3Brf?PzuZOx-a{I>9MQr}?77``)|A32H_exAXcp7Effsw-@GnMvbvWU}4tMGK z(;t1wTTlCLA7_Z(%vg%b6RamQ8lhPsZGML~Qxh3)f_s(DA^Np_@H7g?*#dhT!y`)) zU;mYr97B(BAi~*zEzG!2HurDc5vZU!E2PCe6^_iDY;zO-2Nd2ZoYun?tYkoA7F8yl zeRIiP&fz9`r?rMhLXHc*!xPPgGv}njvfI%*n03}&nrIdG@a*C(Wt>F6uG|sqcCN_7 zers_UO@M7wQ+-(l=3n`J($-W_e8}aZ+>Cdy0<(bBL9F5> zQ7js7Z0Ne1^FCRO)_7MFwO->&+`aE<5dfj#%1_Rht?`2IcSgGqpvSg5i zk$blPGv`M=Glx42ObM@L3U z)6Mz?tkmH<7%Dw$0ep1Y#@o_4+C3BOP91h}{}rdTSaLfx^w z$#d;_*yd?aZi@>jJ>>mV0rBc64@qz<=b@|8N>ATPFZ9CFEepCl!-{Fps|TukQM>_4 zyc46p(=S1#0ea0!h+o8vEJ1(q&^~3G`UoZD@-Vl=T!cA@W#1^)_#XFnu`656S3SjV z;^Kud!RgTY5kPYGj$w}!#1i&~$kU+S=%hQIZob(4$SCI_mlRGf0Ni!8wxE?~E>{gj zxE=R;Y`0Y?Ab&NL`8zCdI>st4(XVzskhtQgq8=yG(Fsfl*1)Av2P@J}MXeP_mX*uJ zRC=cN(whW?-Y!4~^^8#}>`AP-@hze5y%;{HxA`v??!d@3!WJ)Q!`;M#*eu$aMPlp$ z0S>6Uw}nKxGJm`rXAK;BF#hr0g$1>~NDWP*NQ`Of&I~&*CZo7O##(_t_s9JGCeK(Chq7siJUdBU>oj-$JS}l*m zJ6dKQD0r@A0XrWCf#!q#m<&;>D9vKV$}WT5AQ>C*J@-bJs`mOF&n7-h<-L-sH^;lz zxj0Zpm-?Gjl$F%h6_#9rcKlK9VDF0D#}PVnY3|QDGcM}#Ff;XH2)}cqsIRcXt)`z* zzxTR*6VH^Vf~sw8rv7pUzjbNh*2`X9cy%J5e@0Vi z>faUcwKUGwj49}Czbm-oii?GIP~1oHHp&ZJA)EtSy4Yn=mANgFXCQC%wS;%((iS?h`R z7ejS0e?5q=RDNRV&7^x{cU~|1awFjbX_Q=N`QbmE2blpq$(e^FeEX8^jRTBKd}W!a z3Ri*5tc`^US{z6${_9=>${mofd2*lsb>@t_7C56iim|==LGdY7+A;$x5A&GQzP?xV z-|9n$&i#Vz&D#qBfFyDPl_R6`fGraBRRQ4n4w>U?r*+KjZ3&VNg1Kl+)P$nSaGG=B zf9zs;7;F~%0)KY?OGmEZiZ?EFz@BU3CS8k9)JK0@xNpOeH+}o+oV~An&>wgmVr-Ua>o0e{uRSG zf4Ppn4aqk~Bg%U0l8d>P6aR%lFGddbqB!8OBk;u~WwIIRZ0vYq`>?%}w91WFiy|9V z=fDzLSMU9PO#bWAy2w~MwB@iLKk9V<{{@H1cm23Q-Oe!(nj zO{Kn4o=kI&%CM4Ez$Zy)CKsOu@3!UG2X4^mu88s@-p>k-Nmu4Z3HOVG>=OI+{n`w% zNlSki3=ez1(L7K!FdAgHO{4d=5Bc)6-q-66hZ{Rp2%oaGzkGf&b_%496W`J0SX*TO zso8}!Z8xt+2PZx+)Jdxk4$@f%dAZ^SX_cvAHiVv~G@Ydwj$6GcFyFYDXV2L|pU0Cs zV-G)z-E#f)wR^ZBv1ca!vGG1goi(5Hmw#iM*79`B|5;7z&&Gv3cEsDa_i2r4nIvg$ zD#%H^Y3QaO2_xYKDueSRG-)xw zAp>(kZ@*S|ZEl0=x00QbZuE^(cGm<>CY*MzyJ(nv5LKG+0Hx`h)p=t9c`c}%#cnja zK%HZ`Mcd~;p#ILnzE@Ng?_Fro6xn3O@?hYz(JM^Bi%MZX&Z0Aen(E+Ob)$fRRglKj zHuA_8pN_YMBn5hqw7b&rppAjHuEd381}BqE$5v=lpv~FEQG^tb+9CGlesD&J>=9tkD~*Ql{(O)kD}*BU@ej>lIA)9rY2x*-=MB~c+# z<5tPzF+AP)fi`WKb5lKGNHU}A;lBsalsXH5A&ZJE5QEi7CcI&F8%5&^sJ?p*qOm^s z;ucU54MVgcDgwC~`u>}J%ae4RrVR})LdppD-2Qqze1PgkOd8!6ENqH$*7st_xm(=HotFcmK-+X87qhb|(2zGBa)h z#q7ClvK>`%ZWj9HA7n3i!%wDJ+Pxgo>7D)a?)Ag(Ir7VIrbIapsP>H6Qo!gw{)`x6 zzbV%kD)ne{;?34Tl@d4GjYTG|_0u$453Ej*C#n^(-cY^E#?dbiS)IN9o5nBDCkHKU z&^Ouu&4BMc?3`nex{Om;^4k9>{s7*ANyhJVE6l(_7?$!*wbot1XlfdDJawx~j8xM> zdO35D^v)25hO9qFc)uf={5v<3HU6h7p& zWZyd}fTPQrAL_BiaD@jd+iuO5sQ}{)XL$|Spd@B*@>eg?gqy|Q*-c7J;d)!KCjPyA9S^4<#vUC8@=BVGO&=GvVec zB(a}wYQ_mHjW^3z*}IrCp4rAKoE-ir#iorg7vTlVC3mD`fCU$(&>AamP}H<}*UaGA zO^P2GY7%12gFsE-&<6a>>Cd1bzN(!(Q6Z^wv6_lQ zN~zO^K)hYL82gah2VuI1ba@rt!OCBl+yXIyFtOmwS#okED@GZA=Q))}UE}`Z-%lr> zZP9R_XBI=H?Gl=!s2G+nw;?&+fFgHL+7wx9FUbn>TbcjM#ORBBqcO&5+B6P{rsh{> zU)4Ky7JSq+1cJCN`OsxVqSK$S6$9IT=-_LDdHu7zSsR1nagV;#c+Ks3EDR14FY6d` zqd4RsgdAQwzY*B#SSitOsljXRKc)U0K$di$S-Mji*_77cV^xb>dKrv&5bUdWJKFGA zAyg1a5v=&l3j1`eqZbW)`*ih0kN&1W z?4uSZH^?<595^FX@IF7@x@Y#TwVs&`14?W_vV)2d7QT_}JGX=K6(~yZ-RoyOVSywM z9Y3$RC{KJS4oMHv&ydsTC%XwO;VB>U(3S{!sDNF{ay!uOnuVxhc+UHzuMZ-4-(_kE zL`j{$K$H?181|p)25-8721a@TUEpV&ecx9?0n%2!7yT_aVC)v{?zCwX)#xe6jy~&3 z=ym*lK{!xokV}FY_`tE6GI#5x$Jrd};*pJtjCvS&)BW2{CmeV*2k zl)?aoun*HMo6v z_82k7puyT>x^q~{hp4HN28B)J`sQ8Kz9aN^L1VJbC=bZ&gL%fl55bIue#&8eLO3dm zAjNa-&MMPb@`?qGP)9Yg``iARnh<^0eSwU(a}=uS9F3d9iO=X-gy2-QPi*9)fNbZK zSE~OXRqq|nW*hhaCqj%0N|&JAZBbi^z0y|gReO)xo7!STskZk`soHzT-kT5|N^CJI zW@|O}iq!t)dH(r5-{ZLc%|AJ=^SaLKbH3lNR~o1I$y6t$Z3dA0FLghRy+p>m)ZMOY zwCT1fs~XL6uqsmW0}hGmn%6tDdb(t zCIIn)Zk+ta_GpaS%#LEG5YCP|o}v*`9BZ^zqX4pq(hpIlXiHLsodU{N8*eT5w@N9= zzh!iQ_-HRyQ@OGs6>gVq_T}!-9D0Z;JjA!<+3cl?EzBJYcy6(3pRY%>^9s0_j&3YU zk;h|QhZFXC$LhZM$+$D%^xnncl4luRP4}@t5A1SUxvWl&JZ`;ycW3{WT70Ky&sEU%2|1&>x7QT5wRe4ZJS`O&9(p7d>3OCz zYvp%+qVzX~Aa}iQg7UtM?oqm2ue~@twurnovFN@eUH>}X>N&2&Su9=Y>^a_0?mj1H z%GRZc5`~UUV?L1OYOZ%Qh%P<^OEcIGu9mUP0BD zSQ3!&wgl!8a5h7{4j!k95FCQ>47a7{DDCJ13@yi!rwMflS9wC7F`tDE!gkHtd-GzQ z;Ux!Mr+@=-k#{|;gXST2@|w>Bw+BKSj=amg1&0myna7HWr|msrFr9e9Th=v>N~~-x zYaB%hwwQf(DWK{-$Y;hR|An2h_47)9b|!)>lLTPu@9fV$MpT@iB!&>{(NDe-OcceJ zVVVc(O&FI9aB0I4$dFo|$}neB{v@e0@VB9^a4!=`Df%vF*43Zw3U&YRIPE|`Y&aRU z$#+e!Lk>Pw>muT&Z41H65L0&m%M+laofp6ywA#|s+5Jt)hvjjJI+mWMBu5!(fbrip zIn#+Yu#1UraRp80WIaE+aE~CP)K)8GZI^e&N4>J3_tXy}|RAYk(uZIC)JiXK*+KBnBjF8b2f$G1stciwx}3F++H_x+?+cLgWuX` zqIrS0-irYMo~=xF#snvfNmA*EaFm}^$x2oUd{X7|{5qNgECR*dJjJSZZ(sBpaWQut zd;F{G5>sm=hwIQdXT%uq#aP*2zueijZqv2RLXLRIh9IBo6 zq3@rUz4;1!ixu*A1beyWf%(D0v}q;RQ9FxN-wr*@zhEJj{H^C4Kfz zH7bPg+?QJCgLjtVCZaUFpE+A43oj1aHtI=|cg}sXm)nHMFPHp)oOLzvm5-cPXdHK# zZ#*4dWSff8&({KFhVzU|9MtUTBQOPvsM$K9Nb|&%YPGmafW+E8&!D%D6Rpl=k zI-LEpS2Yk`+G{=goe^_e3J!D1C$w=A<0b>J!;dg)%zIsq(5_7m76C`q62iXqjFJl=V@1!kusMPx(n&Kr|#FAr=rPH^B@YqhUj8%4U3*c~qZHox`!#|%b3J~1(%K_~J{Y#iv%YGMlt-Vj^(dlW zt|2b7dSpC92`QVpI$xGv+85W;sUr5~6i;qLC@BeDq{H|r$%VajXT2qjYbe0qlKMT5 zCF#Gn7LV*7;NQaeAkQ_AU2}HB8YiaiI;-UwJtK%?I!M(|lDqHvK!-O{EAl#!dE*}$ z_6?P;9%Yv6e4^H7oD9=66@v*4){^<=fzWV2K{LiSEd=ntCl7(8%XZ50yBCdG)|tks ztgU`QHfqa{q<$sU!rBKI zTmqoj8vY?)O4g@j*RU;254KJ~+xC3|lPz&ND?z((?KtP3z!(SGYtvW@&aVx5_;ys< zriGiPUs|1RI3rnbhUx;TgOx}`& zR@9uzZGS+d&L7!3GkfI=#7hhw0}Z`Q1dFV{u|gXrDEywz2X%H~v|u_0CvBwF_HPdO z4`()4?vd5JbMvpv>FBBe51TYW8kk3cm}Ee?8JNzYD{`f8%tQ1=D}5c%oU7)~cTob)!rEy%MtGF-Il&Ki3bp-IdDo4}-_f%p=+Zcv3}sR|lF%dx zMUTSAkOKi%G0rxqMbm3rNXH4pht>DJ>CB$CJ27(ozPk*RX5HUF!HXG* z6(?Z5Q?_)r{VW=Yv;<6DOhzo^0Vd zKo`a>KD=Oe`fg)7T6ob5az$qSj{92VlCgKsyi>v#=dHCk-sf_3cd)^YMO4$ET{c5={D$1BeGu z#}6#pYS6^iEvseTwDb9~dFCq+%yBEiu-l$-I&^PZ!XTLz5;gX$-xIW@f z!r3dB4oEv?K)h6_-Sr(nuvD>VFFJe9=1Rw1pV-;8+1ZGHB|`RBazgxXqz_t&oYj zX`wCdV(IR_=V(1b$lW?>SjJCK&e>D}>obs3^|+y{18QiKN82tf zNml*8Hl4iDMy6{0^<1e77k1ItO#=65-SALga#-{3kHLqd*aTOzCy;S~jA(NIe>A8Z zkYGt?7xf|6^Ty`xHNOnM$kz#K_=iMa?QiPot68$|mu9>nE*TA|c;=qDjfK~9@=bGU zwp>6*^SNsBQgyP8uY(v5?sm8J)U=u?H8m|X*ZtlJN31^VJ{MYARhYQ%Bf&Fl$m6PJ zwg%arTt73M(>#6)ADa{kSXXiPr&apStN!1Kz`=ZfB`~=8pL@a#Qg#LmPCsfJUWl8Z z2S!@om6mfKTP&4D9G zJ9c5t!)R`@QSG&|rKWfT{fw>WVhteQaY8mAvS>%+jH`;@8~=D`)mosZqY7hP@{jhI zzngTZJ(YU+M!3nb!KnLg$nKBQw4Q~)otiw?mEl@6%=2=j)!ZeY{J%6uiZW!q{xiwe zbF~!?n9_8-CiYymqV_H}Yju{cQfxB1PlK+#27|5^MRY~3v9&t2*ZA51Q`C9SS=M#i z8gc22c;~dOb~EP+Jtv3w(Z-9vxlbl9L3vq&psiHJ?RVd~369&MDMdZ%O!tbefO?mF z7{$@0LzzjhAx8_vkQ~Kt3J1qRS2Zj;OGgTRwM5oSpXTuA@#=@UJH9sI&aBYM~z7Nx`n15R1 zvQD4$n)qV$>^F>IW%bSpc~gj`F*WVnzS(?-CauP8&f;6w`td@1Po-Po7cM@a(%CJ! z7ul*7Wc`n696n3J6b6cH19pu&$XjX>R; zGRE9D%8Enz?8DEN1(yE}yhqblE5V>CIM5Thrs19tReAx047$vMw1pm`JVQwnDbvR= zTXe|o;qmh3Fu1%%gi~(D_UO3VzB+);N3p}Nr{J-zx(=s|VvelkRW(Ow_oYj&m@8RS z0DTNBK@z@hwW1ikmb_U6(V@Sep|rP-7x6g+e7gXIeBv|Ve%Bokcsk*~w;oR(BhBG* zDqBnc<8_Azx~*~w{bZp|Xu1c0(zAXu`>5L&QD?8KuSYG)&db5*DGYkW91PX2-!`I= zbzcJL2kzu?V}nFw9%DKG76kAn%(u#Ii0E)GcHlfck^Lfd!+Dk7k^!LL~{7FS+kRQ=pmps)Z9h3{J}Wnw^=*|R7W0y0ep$T^mrCu(Ny z(Jp!&dqzDY@wnGGoHcy~d`(du_#vXr=p~L7 z4zbi^^9rF{e-16Gk@XC$AN6~cRR~>h5X}Y$S6m)cYmaJ=B1F@`tm|F68P7ad`MlQe zk{87{_!-W}#6Tt;IwupA14T`1PZpmMY;fj4+kxX`&pPjXdsMF|81Xd@?mnQ+J_ zyZ>GFB{RNMS>r(1OkY;*f0KhtGvt#HP8K=#Abf;R!-BJ--B_uLo(68oChz}Hg( zq(QXnn8_MgKb$2t?p$H_`NFlv^Hb3HL@ZXs>ZI+-Q%N2rUkiS1N66$W=6nHjq=O4n zxA-7E;crT(x-1h{H;m0;_;MiTzQZdDfx!r#s>8C%P~3*saFl8X=2xpYOf8qcpT()kj)XtZAvI#3@*4QnP*M>T;QYwS>zt$UN! z%n=8)rv5)RviRXxBl-E9P+nRawa&+L*zPd4>OywZ4YzhlwnEWll@Qg7b^^Sk(glY} zx#0e&+g@Bu_ma-Lwjg55#mBjpHM+%|a-`L@j;9%cm51QKH?JM$m&RKky2_Dw>XP}a zQx_X+FV@ebf-}EzU%Hfo|A%*Mn0;H+$ZLHrVCS^z4A)ON3uxuerpM5&zS1>!wIDnh zKpH;uw4JmrmvQ-*?Xz;UgjaRO86{0TWu{6c%yH!oJWF&u7xGB^GIe6P39p7&dj}C8 zm3nDH98bNtI?6k{hDnF7lgHhcIWq}i55Etifv$6ct%?^FHET=ZHH$wc#z!VfB({;| ztv$qQf<#@@D$(XVK6URRIueFH9rpgneN@{`u1w^3>w1TuTL{%&_er6Gx-a$5eK&NA zjIBI%;d54(arMTCCQdnNj-!Q|pq?lH$oMs_-)P!kl-pALwqvG;o1!WEUm#vCycWIfsc(Bv8S>bxrvmY{%gv-N`7dE_L&n^Z4_U-CNK-m93<N zZ}6@1r_iQW<_PaS0rVXn0yK*tnQO-k@91d2J|A`{Dcn+kFtqxw!gVH6t(7Os5LMuS zUg13p7KcdOc5~)Ad4969XWj06%E#`4o&SIL@6h7>$1YGG4FIl$%|Lo=(mH0gXn&&0 zmo5TO3c~zr!+Di+JHq7qoQ}PxY8Fgay9M+jDlwKO>m7`SJf4@uJWf~Nf@K!*42-i= z@rm58Vzexw!rpJnGggPK$_{I|1L9j{k`_%%g04;|v#kz^1#Enajr-md7d4DZ_o)D<6Illq3N(dtrBi46vgrkESG(@% zQ{R@!rg{8`v8JY(Q;PaFD;Lus5olmu3fL^#3M!quTceYfke6}avRxrO_{a`qIC#Rb zNSXa6jf=1TE?@N+c?4s@lDtGxx+re`-}jcCw@rtnf@$ZJ=BZNqb=k0WVdOgYcz-j8 zFdl!7E1FALs`3mynjqHGFEL*Vq@mpC9LEFTgdr;9UT;zN25@u z$Rz&wKb6uz3WeTho{r_s+(QgRLipXv1xU=qNYip*4lR5M?Nd&AymmL3PKRYInP%qH z_>8sb-^kkCAD03%XFg@*?G+$c&GuIH)4}S~N>$Jze`^?#YVgFb z?N(!&&y)ikO@B=Bdd-{b@{#mZZK1jbOFd)R<8kVz6LLl-@Z>!A6J+c0^|X(W(sF={ z-maUFT43T(lHX`txDu`O42~&EQ$ypG1Il z(P`r4lP#ND3LA=i?<5yaHe1;OSv;S0iUI~Np`;Kng^}c`%jiK()quCi3V0yJcXb6i z&#si^#(Xi&=64={!Uf@;>ii-zNuEN!B$MDZt~OHL7)YFsPJG>%xED@L1386p2=yOxT0WB4cESZ(nE8d6UWjxam#>z|3 z=~;xKEYBk4BU$}lTDyJ;a+Ygphh>9w|3;~ClgC7nUr=#h)Io`qBPv#>=w=ExeBY(c z{cnd;9NtI@3u7iN4)g!I@mieP3Q6y}?0FCG>U3*G(5^&0SwLLP8}yyzef@Zdw%8R( z%USv<%+=s=H{iDDpok=M-J`hQ ze`H0p+SBUsheN9{_doT7f%N@`EwMO^YtuQib$c7AMDsm=Tu?HnTnkG9a94HoP}EqKL`WP=xA`t7sIAIP;N<&8K1~ zjymp%d|pHus{pIW<3B4;V$eowCN4e zWdN@|lKIlsC2=Ik7L~V^&nB(%l?gVezR#eHZ>2J2$L9ePcfHRZh+jgh3~d6#KSnNo z4v{?S@<$lS3Fpm43`!4V33Fl4o=jiT=u^zJ8Rn_=F!TaAN2CGLM)|d zTIDl8UHU_BYx%iX0M_`4=||N-PHkPx6!HmDf{e7dx4Jee9Zcskp<-1jojQnvQaLm} z>iOl70)k0o)Q8EOJJZ<@R6CB(=x}E3+Du*9)|ZT&L!mcW#AZ^fH8nF~F5maKJtWep z#fdZ9QR)v3IVVk`LN60l%DV@0!!<#U-->oB7^-Q_L&ok%G$uY&oTnJk@77O(I)Blyi{_WC*lQI@=N0Ix*3;`WV>9qnn>|d78m&wA1N<9d}N+G?3CwS4wI_)&>N+{=~yC9+fx&Q zYcfFHZ+_~!ZGAjf&N4?EfSusnLE+}m_EBW%Rg%v{a%`KNb*snq+=BHNV7`UT>GWfF zT0OeWami-gm7ieS)e@^_$1}hD3V)W^$C}H6206Gst82Fzueo-iRk=l(T;N`TXXTk# zNx9b-*SW5|w(&{h>n2d^Jc2a#Gpb+rw6)wqJ-T314%pClAL$x{pw!d8Hv@cHL#|Zc zW&BfbL;<|p&bxy#Yaq;tXnRKUGAD$zD8)L4q3vym}OBd>ta3j$?2*qG{7vyYNbJPWjz>(eRl^!j? z^fXoR)5f0j1|gtJA^)H$U2apcCdKw-7BWHiGiJagjRG^cmvYs+tDuD$My{^jyod7I ztQaA86a{--x_9v6o*Z==$Fo-h1wA7N9?|&=%}?s&QqA`~^It?Wae=-8#t!aWz z4dWwq?(aNdRyv^ZA@7qYlAxMV4cIcz4(&URR!>K3+?$s)&LfV+;nqu!&i2cCK&kWB z9SM!nUFE&id3qPkj#G_Gta$&A-WNL|V>1fwizydJL-(jpYiLJ>_M*DdK0$o!dTk&@7~=l&2C*w?=%=p?&%+E}hpk657xBakt!uj^ zPhaB`D5GEBot*94clYdFmFXn=C+#{9dh!7H9!P+fbgZE$BzOV4=P=~M~UFg|u z)`NIok(0KZF({QH&^Z4#oblVOJJQ3(pr(XgE&Cmju-zligy~A3C*P@5L2Bx$1ZRSx z6!K1$2?K#1snlfoIqy8h*9o-6jIl&GMyOU$R)T zD6nL~^}TqS>Yc^Z+OqmVO#{^O3V(G((^lW9fWkvdm`wYA`1U-lr z2HlI`;RL&EAN&^ymSwH_E`*?SDz7?II`^~jh&O;k={mkehFKto{y^J4|Z56Qp)EyVi zMuO%}&?z9Au)bGr(d4(muCB?bO-7B8IcD<*qoN0m+vrO%old10rb)#T&UwU7pUDD! zh{?w1lbz3@K|AZFNs&7$&!>ukndVqWvn#sXX^b9CbnZ07l zW|>rP(uAZ#T4*|f)eX{J>Wa@F-nOhh)@Ao{2|ceFH}qr`kV zCS0ncIwEMy-=LN~&)fif{k5FnLML0VLgzXWhG70~f0dp*302beA5VVa`&H7NK_`A2 z8JnObC&1ldTrSMetoNmF$+%u2Pj*aSuy=I*e_)d7N0Iw4y8-enP!=q5g14ajY0Zaq zMz!dFpzog>BvalIih2pcG<=2|t$}1{k*XFqZ~enlMo9(%QMENxla z0d&|By;wfuLwoq1FM0w#H_(l;yC$e-4rE9UG}Bu0Y~lG>&`&aIU>gJSty=Uf!cJct z8q(cMgSY@CmZ>A|57#C?ej|Hg(Ik%W%XnYt`F!eTm6vPdWape$jmaa=u)hnTq#CY@ zrl#*5Jg$4{R*sV`kY8}D7^(XT+q4(o5#a}zjIB($lNfrO(+bVJUv|__ei|~yGn3XW=2DbvgCnZhH}=YfvuiRP=N) z_?Wb9(Uk;-uk$=9LUmphUTY#fw6kMoSwi&6xQ&W3{~k$?omTJ_V!&NGy!qTDmR1J? zq~x@FL<^QAu$r>gVHd2Mx%djG=1Fc0GrpUd8KPME{C&1+T0&FUrLd1tm#@zx;~U&@ zWAdjmgtEd>Sfjg5xV(}bNEU$e5dX9>necFT`%AFN&4V@ZmP1xVK_d$RVN6bFuu;eP zGCFvuk(`LptY=Is31HdXg>4l}KbzQuEcc{?_x{8|xUTO5IjoRx-wD9GI^Pw*F9jD+ zqAH%*Z@{zB6s5F%ze9(&iL5!JOagwHr+5i^UgQh?tn#q&SGnwTCy#k{yA%I4b2c*^ z7HI2Fs{tJU3DUP}6#uTCZVg3OcR!K1b9*G{dG06PD1tuV%l3x4oaE?MurakfWZt4z zcXahZ!gOgB;sEBuFW=wy=&bH|VnmDJYQIzvA@YZGJJlww5|5s1T&z}}!%0HuOJ4lQ zQ{nL853992FevYyi|OS4RsGbIBKAoMF!SUDQbyer8xttH37FQk9Pmtegvygl63lB!$cH@9PvnEq*#8rqpzv2TVYYb zE?WV~H-M&AiGLd(P^8C{juiq(_=JC}J;mPSU9{*{YM}!N^y)+NQ|C4^DIMOB8AzBv zcNIzPEzuTISOWbtCP>XSKekY!~AV+)ehLO7LRO<)RA)YGz*EN}Ql$kLk|WTRgn)ROe0vMir&d z`$K7L4y=#J>*BFY*Z2F$7(O-CCUJPWimW&U--BF$SXsCFS&vF+UDY=3b~5*>W@#s74>gwV-( zadNCg&V0!)^hC6Njjq~A$n!jp|IZyw$r;8S4WJy< z3XettT^$Pn-;!2;BnP6}-BsN^C=zGQS0+F1K)!#RjuFCWbzD%_LF+Uu&w-ks)s6&$7 zmI~dnJX`EToL`$RWhmh5c~WFGMVO{*RuYR*Y2(xgs?)~p=upJqqBz6< zG^a|e)8wYzd$C6~`-A5?E7JQHn04PTU4c%SK9%nHgz)*5fAH0I{?$D7M*dJ2A5}Z+q}vnYJ zwn$lydFd1tWuTWrIm8S%R5B;Nb&C$HbRJ3X{n?8sHEFF{Bv*J~#Ibios{ntWOwvc6 zkfk++f#aH6s-`5wX$`Y#@X3_8*$VBeA>i?L@J=&W4dRa#iU1a4$)TPEN_lSKYZq+_ zzX`C>srXy(GDF|y=Ph8DKeDLrBG9}Dddk=&B#y=u3+Xq1rZ8hxs(bzfkdkqDGr#Vi z*R!BoAg1;olyXH@P&skYDWVVPS*5i%vUDqO{X|Mt7N-5yD%VYzlfvO-f)L86r0pSs zDGs5_KZz&|=mAdfl7wwEl%i9-9+5t~?9I=B!&0nMi!@F02(XH42k-Ie>FPa}_m79h zB&!vTMjy}G3#5nIaMT1%eF_blm9(AdtR=Moskb2C02E#aRO0ML`dN(2#S^G${zg>pd!0hpl)AD}siAT26S zf8{;QM!N6escT+pmZbDM;dud#&p@&c(gm=&alN@=uI}8<=*qCAFZ>QQQP}K|CkWiE z{?Ei>;Mvt7NH=F{%vq9MTA#4vF4NuFx0UlwW=VQBa>)C~9k*oOP_~$)|GRY``K8yn zRn*+5Xezh)RRJ{lbCkV|kz={FRgsLJD8)w^o&I@aid+Vuh~snS(XnS^z<98DR0>cS z^NTt6UuV79Xw~TA5T@j)QlKt4_riW-hF5SjKY1+nUod|gEpxh7Qm%`!%r`4tKZK?` zHWhY{7$tmglZcwTL$$rhGHhIz8e-SuI0(9`(1jB|^Z4-7+g;=RMs-CZPG@7w$1&XQ zyd3j>rPLDR>r;JP1#74I<>8t_vpp|B$I0AV&Y`F1t@`FSO5ZVC8HAA+n&-7sa96>l zyI1Ny*ka$%%k7ldJO-x@pWl{yQgqo7{@2mg6_H2S_-X0z>%}5MUie;Kb0EK(hB$HP zlYu9-&W;UTmn_XDIqx5;WVqi%5=VzsOXvX&5+~tK?Ds@Z^oRQn(Ne|`bGSZ8B>JD| z2MD%yYtDT$N&hD57*^$VZ+Y8Ue8#&I3F+or!$7bMjQ?Eu)c$_;xOJ)G(nF9mNY*j2 zRfys^5>zhu@=z*N3)4zehDw(RxiPQpMefy_M=$(L8Esa7|DgrgHgLNx1O2ewd6vl_ zqFBOwqc;LftSN%LC?1a{eTOSXljzsQ|ClTSdf_5)jMyaZJT@}_i;vcQXnQ%MW>Sz1@RNO&^=5kuGNEM&moDpZtz{}PV_m|dRgsyZoz7}WRO2YKR zHJ>4-Uwi(RwG}_<&K(SDIr_Bg!jdFOA)+dSbVOFv2<(b2Ig*b}9NF-P7$bliHobxR zOM^Izl&i%1ZTXS|oga`YiF#Ns{SbXNXl0cPSkMX`AESK-sy z(@}gV9uoY@WEzQ^L~Z@`O8pg$@;2fO={(ca{(E;h*~*egzf37+RmpgddL+tT(h@Mo0?6Z{#JIIxxThJF#;Gt&q68vUy7Ve-ZVY#?ngMt_cRTwo~s$i?xw)} zmRyR&p6V?p_wn6>zSn^3*O9UQQ0Xa?hxvR4k&H3AY$#5UM2yuEDVIA!cC~wr)tNeu zxOS0#`0=1dhts*Dw(ijSjlr*+6MaL%_6yYKwr`5Ewyck@(!>RCz#)1M(T_SWFwHdk_`!=x zVXRoH#|+wFgkMhWj@}(ptZsH2$WaUFPpb)10={HU@0gS=`2-y{bo$+w*XPQxp?)tEpUYnlM6YDv^tG17=dyh6cZ2JzO~{m{X{@F7YqapzI}3fJ}Kk5iv?u21pcYX z*~z=Dkxuz49qV+i9)34Ftq%8BIx<@_hQHB7huDzH=g)6 zM4wc@+lmnBs;g1x*(_MPc_|%$Xc$q5t!?4$Tg7Yk0Ntmk<&8J0=6$QJM)oQX=5x`I z7x7OqeMnqWwYSanJ>VWz$(A{B)%#*EW2iBsevt7>i}jaUAKQdQ@6S`RcH^Xqm!b8q z2u@#Tj%{{bjYDnXRZ_CVTKsi`_X|Eun>YrxGLJO$YO-kjmdiSzAz3-2w(gDQ`1uba zLjO)#z3*&M0Nr~A*7InU0xm#Gr{md|%{;USVFdI!++)W%3;psthk5A_If#-7-1tEb zCnYK}AU1PrIl0uIe2(E#r1i=1tVzc^yGMR@{l=q!H%jksWJ}5`1UE$ydaKt%B~-WN z!O9Y~@voJQvx$E@cfbGN{Wx7VI9Iq?$ATq5B-or&&vwrz`~u5Rc-B_ue65W+9!rIe zdA3}H!`1SiM0103rZA4NRRE(VQSp5SOVU9x{Ogx=GKKzj%1c}yZ#6YiI{t&E{uGMGW? z`;!yoaD+gxIqARkx~G<@EPU_65aoIcKaMXwMi@;qZArGBTA&4bAIOz@6IELV6RX}0 zZzj$^8NISDnM#W=k>n?Y8>sBxe&WH-Z(4kL)$bpouBAX`%?4xsrGA! zEjFuGmuQu_&upENNqw?RlPzmDo}o?%;>xB?+R1LN@LnaU>B{1g?H<+3(cSWf9sDE( zo+9mHWctX*?)v0}7ZqqMN4AtKu$3CiZd;A;e{P6xpeJlC81?KJ+29+7s#|i(1Lw_W zZhXoUqq=v4x~gU(;`JC>}8zrLWv`9sjt;X}@j+VFm`g6m%LtnN-&r@7Uawn=B=53%P^Ooz^ z#IyomdY2XzPa^FyL(I(Gs9>*8aCGd)e2D2$9{>f@PNVQ|k@SB%aMij^HhnY#%X37^ zgIN1%;7;3i9(Hl#Of>A7M~-i@$JZ_U%u=)7^XmM@)lfajiz!OTvi;Lp$^Ewv9%D1V zs+t5w^dxN5)igg}9NiT3w(~?V=?#x41Q?6}U~vEPse8fDNQ|I)DHjxxZ|;2?kncK! z71v8fAS*)4#9jD2zC@?NjD-lOdbdb@iZJFx|LvEXTtz@FkhXf0-fTux1rX&RIJIPb z5)hAzEp-%5TNim-N?@zj zD>rrFvrFM&k)!Ogi-HJ|;X~89O9o8mDb5~21}_PZdZNr+2Y-Z5n_T3(0L;Ukeq_}e zrn?QE&VuzWvze^tF+=bFo@KQ4(M*Ve2S%w1tzryB?Bdv}XpXuM7C!_thDe>p{tf(Y zm3_N7`yZYst?w7w3VXaIoS0+F(Qp63E0EqO{3;r#2>bT;@ruytcsBDHJ`7UyYaag_J?$A>(uK^w} z*gz{E4};WFs*l+0eRgKCx4HlS7Og-Ys}Ef&erZw>Rf*Pa-ShU5O^x6rFnV0|oi0IWL#$`ldI1XD6`{^NOU~CENx_j zR%F#vgUnKZTaz|zSq57B?a{lrWwJBl6YtZ_EB>AY)YJd8374OmW|Cg#&3fK=^GVVc zs+QHuDB59-suu!Q8|(rrFogeXS`4pe|L1wS!N6`6Wf1u<2%OQRD})>E)l1z3<)^OU z9#JU^eOEGY1(Xj)0fW3|uVI-Lsp}i7p<~Cr&2qTCu)pY7RFfJlWWqWka;=XpGieWf zjaGa_$KKqeged6Xi7Lx?JyGI-mVmM+U}WmP{MucgP;!3&i~=LTCRZvfpcW(!8MXrw z74GG$#=$kBRrhZRQkgbN@%cdG4KSZfh4&(?4(@h?15X^1I1S7?*r&Y7{jfT*ezATY zh@P{pn;x4dkU1af8MQWX{(eB25nrh|aq>eh6E*PgKnwfrLuar8YX)vWIXXQ20Vwt3 z0D$Wm#eIOG=w~o1u9#YHO;{(b@^HW}{Q?xfX3zXOOn_{HxA;0}bvx+11uQ?4z>!lk zx!l1kAf66HV$_*<_n!d7691^1=`=kUhkoKkJfF*qd6A`i?*!h5eBiYFu%A*Gs18Zd zNPf6xMxmV#ouKqHch%l%G$?Opkg$?zNVC(fplpwefLY2je+15G2f? zZW%~4GQp^EsAfNrp`Y{$K0f&glC-_`m!j_Hf)WqSO8(<>lYe#pQk7Ncx~q(wmY~<# z<-5v(TVagQ++oM2Y^C!|rw@uiUiH*-(0^uI9%q^OKXS6N34GpgFSn=V5?^jQ&QE5flJg~$N#)SgV z13+DGf7$$}) z$~U&2N?cTI`7^DcV>UB@4)DgN$>A*lR%yet*f5VN-v^dVkS8!ohvGG?)U$0okY^kF zU-}dX--NSCVvVh1WhVxAP6b-KI_SCFtOQsLqfTLaxD;LL7Cir4|jbdXSOo?Nv7x<>L=!VTP-*q zOKNg4iH+D?{0sjVASlt-Z~DMi?5gGNLAO~1MV!2U0>4ixQifva z-sMTF6rZR5Zw&9?etSTdpNX5Te<`&nOal>F@byQjxTEU-6eLs>;)VnZzR5jdrBd$Idsaj~$e9edVi)Ok{mm;MOxFfYY+w^)H9T1& z(iLf8vy>)w2mgMm>$z58GbKhCI&K!lI6Y0Zrv2=5R?A6?9;yO=<0>1VGPNTJ5TX$6 zY=X{v{Cbb@$>59e3lJTssg3mysQ<)9B44siQf3moS!vbLozgPUOT_V>8HPhExA&|n z5p;r_N)v@~48m=GSHJzQCrTD82Xn1{&$sK52=J-;FQVG-wX#z&_qvQ!sr42VZNl5J zhn?y64>17!IkK zM>~@Eu~deWz>!>A%x?SA?dHx+CAcAB;4TAgEkS75quhzf4)?6EJ-dIwkW)q^0R2h ztz$bKFy;YEVrS|pGM<9*V1%DlgYvbW_Oz9Nw?lFe;7dtr$(G>h=)~U`?euObxh)O~ z%F&4Vc`4t*-gZkc=N~?W(GTu{&=MIMx9nIYB;V}i^iP~W92ekI5r+?V$?TT&j6Ai- zamwqs-fTtXh+G?|xHc(8t_>)bVqg5sqeO*2xE@@x=D6RoQsQmY2Bb1bAnt?Qpqj{k z`&jBh8Bv9{E6idobK8s#6g5#vIo9fMJ~<@a&p=jyu&~r5 z73>{cu)3-5T+c+x54uca)+7-->QFy4^IAJhuq!dtTP#PqJ5mFm( zln#|{keoyi(1APjn%e8!3cZ!zuWrq}A?Ih|w zKD2A!dCJuicG+=>HE))gI|~o8b^-`=29_j}uQ+~z)FcK2vJ)K>w!_7poQnNqi!2G`MJ-VFetgva z$}iW$gOi_F3Z~PS{czGsB*MLsy3HJ~J0g!>Wi}i_<)8}Nj}4=UOd`R7+i8l2o=|Cp z(;P=!@xA-Z6X678%V~*aBD>}L6ReC<(3XpA)lr?NZ*iqgtg1;2yjK54tJfPv3}nM3 z-8DKtSzI`NFDfF4&(8e+vggCY$3UPqu~JTJG>Ot<&c5QqD7FtmsO5R);n$XgGxphX zM^-@t4$ghuG4ihze@V)~Ec3rW(Ij*fkun&umD>3sf>x@xwk!=S7kk{>4@MEpN6q)Y~7;S!` z3h3ZcC5V=zBAf5+uT5hqNXdZkRpxm+WJpzhQy<_v{hf}}tZ5hMlw;o-G_MccX}Uhp52f=#nAIp+c+-q`cLUnH zqH{Tb;vo}e^v`DI+z)oznBCb+#CJ=9J5;yeH02#X)D8{XJU%wH=IvNE4g}jGC_bTo zYi*t_;9?c=>GCyxl`9REm3W&OH|AR0zh5Ln?j)O8o6>SxIw6RgRov0+aUr#`(o6b> z(HUby34Hc5x!%QERm#SNM+87|Qbqw^SPYN51km;%;tEbT0bjh&iNj)ewNWXyCYP%r zt{xzC`vD%v&=!6FkC&>fH%GP!{AakHNBo|;0!xAm3r@0y=SRJk*op#g;*b$v#@lQb z_c-MsaXb|)%+LvQD}J2oa-xHd7*^CH%oOch+r<=QND{=Mh^;X&FOKx;Z=70yZ#+@vp_BTJMa6Q z=kPLHEvQW8V7h0l=*6|j$F6^`+I2a|C&M7IN&89tVlW!)6M-={qYlxOO z^bOF2F6i|k4TlyAT!$P5X%j|#4cO}XR?w;CZ`0l9>ZivsE!jHoR{L5#T{tD^a!`d# zxl?K-{{U!+xKfGzopz-NDd?KRV!G<0{Cqx75(v)1pj;Z^AtGf3$7`*j#~{zfw=Q=H z-?C?3=o8*)+3|BsDetFI6j2hA9*5oIyq%=-hk>6=H~u6R{3aI4Y0PFJch@p?luh5I z$*;*?)YzpkObxkAhY_zuUsVcJ$4~-Xjg5DE|FR_&w;m}!jC_}W#U%F&uJQee*hrOH4}_t){#->~hg+mxiUO*uPu1F8N+jHFT`rILj$HM77Q9^~ z|L72og}k@^Mp;nRFx2%5fmea)1)6lxT9PDMKm6rQ5$DikmMdn>wSLQs&NLAih7_7e z^x*u$e23X(0LaTm<6Sn)jO#rp@O_auEu8frPEB;7S2@L;R%2Bxw?~+j;ki;P5K~3I zi7;FPWtHE+v2bM3QM&(XB7V}bQU4IBJe-&ns~Z+1JUD*eq<}WXG^vRcT_W%$f%fI} z3y~F%Tfz%*+datPU#xoD2A&4CfqRpz%>k$cE5?o+G+5_mrs?ASFvry(hj!3eXpqd+ z_3q8Jpn{L<Hn2RCnIkd4-$dsxKR4}7>cwZ8J8Mkj;P1|5jEf+0B+9qP%$xa zcd_{wrab^X_q~>1OWUqrWvMlN$+(4y@RKhX63%E5VV!eEJ7lJHzWw3daa8``t=_ck zA$33XVJr{88`&RB+{~Ua5nnx}+?h6sf@x2l-3>vjcWf@w8<7esoam=+(apF?!uiOgllOc+0B5)VHGZOX@@7IA0|q6xT>mHgh{w-NM< z%E8ql&#QFS)mUT4qG@)3K@H)xrqepKi`er>ZaSTrOANdSKJC6)(AZ>vRg!XuHT?0Z z$kFYBz7d1yU@%(k2bY@lT)pojl-^4+ZiZ3LnIrFD=vA%`G+? z9F9YsyDYuMYRcsc4+V*X7jl4kfgiA_VIk=AlYe0P4k@5Nx{$b9DN9Zmkj?4z-5oj) zi5}NwbuMm3Vw}=R>;{jVuvLzZtq$Q>e!8qUG~_~Q{88DqVIa{~gGm!o6Gel0O#6 z`52xvg%z-&-Kr08*R7qT_uRZ4Q`hJPxJ71Gc+-o8+=*opw%$&tB6SqLw_BC4z#-v1 zPJ>FY%imY0^r8@_cg08!$PUR7`jA9!S`P0%L>r#Uo?jKOnvn;=D!Yrl5VsaTwUF@z ze8{50yhM!vO~&I>n`Y-Dj9-hSPJr}sa^7OCk-zHo;)ofaDZMi!%;wPi&Z#+5=zW2` zT9J%*t;654Tw8*3vuTS9WTwZjW=q6rBH>I8e%`6wx(PfJc6@0SBa)fK$UVg~Hdp0t zh%d4PxmIP=G~+tNjHgCczruR#HgxRq%1UWs(mQ7?Q`Xl_FcmG&E&{~QM>#gR-< zPTO{&Y1=1{Rt1YrUxgQl6Xiy`U(LMwG0;Gd=ymdj*$o6Hn^#o^|MRrC( zQM`DLI*DzR5lovnye*#|ifqKh2B$j3PbYf>3Ek8=qHYMn2}uM&4!D>Uy5bXB0Q%nJ z5vL(1Kk$M?)5z6;R@{1Ns?fRo++hAF?B4nhK&pvr6KM_r-tu^fPV=m`;o?9@s0n5e zIAnLCBq=%DgFoi92MGT1zMVpnSHkkTZ$+|E?0Vvy7gp_yyOuqzlioFaS||)_yd`rx zgd_`y-kJvKd|n#cwiu^YE7U4JCI*IGk$e?FZ(^R&n>C#vZcq0}I(4Pl6Bc=)2wRG0 zwdkTAthr6xLd@?rxnDRbM+#&fwakO7XaogRLBgf<=xCECfP2y1c1=WnU62h>r<8wI zaTIZ=Q8-mRG+d3;3#8T-VuN#Qdxph4JQt4`x#T*Gj3L`&)jSIA6o%)BsM9~DCJhUL zFYb(q%3fCqHkDIr8`{(+QYM%^o6=7wRq;#;z(CwhgLa09)AFS94pea1x;ExeRi2*nGW%r4ytKS3DuF3;o%hA9yU}= zh#w=5dG!tOGFE8*XzMrE@EY`{R*K@o8}>W=Th{#Ojnj#%o=MBh^c(_^s3$r9d0;}V zYWg#4HO-M`phn^4(lJn{H~Gg}=(_>q%=D)r=lCGOd40AKz3H2)pqn|U!Kb??@Z;J4 z*YW=z*H0xwCSIWx^mve5jy&V&p)Xxp9asm|;8bSPNXa>vm!*Jb)*^XbdfSLY)90M~ z$}%@_@olRfOkkcu|1~)eh#SPGr0Rb6i-98F8hHvyw&u2;=EhgC>{Gtf&1ieUYY_rv zp$IVcgrvcJZ@EA?#Ve>a|HvS4AV!S~8IvD?bp*gMYNJy_{+ZLy5+0=a<~|Qt7zv%b zaF(u90A;h0w0R}a3pd~5za2-Hgr*&HCBlQ!^PBRq0yVeG8{aSKI2YV*Ww;(|D^$qa z=bK2k@i9fua~f+jUR+-Y$!Y6lj8L4%Z3LaUr^LBYK#ku}K#TRqxkHtJfBvRhYF;<% zXN+{7_m~-#coAU2PQ-`9^h`^p%gLjfdcc}-LQJI0Jp+tnFDNop=?}7|s?D4a#(Z&A zm|x?qw{7827xe|jTL1S1G)I8gl`aPYf(Y0R?D#sy^P5!doPD-#RLmsti1u{#{j7fw zVK(?Q_tb5A;{(JxHrT;gbA`$JjaaHe#p8%3aZ%Lx8rP`VsB|>WjZW6#UzT>x@yc(yPY{>G@Ics zFd^K9rF$@)cQ8Zq44Xr5;3~GA@KsgY5M$6q@5Cak$BT`JOd3Uc14YzfX31uPy-D2d zZu!qATwZM3SglO+*_*WtV)PEy%g4R9y4{DqSZ(~8hF8~6f`;x|i}Sj7L1AKhKS?z{ zIszl&G=@(=lpyg$K&JgF_s&)v+KeWBcz>#xcaMw1=d=o!)kU&gr}%!ohoPXKiNDcX z5v_f{w3*dsKC$inaM-Oenx>P6MdfQvUPui5+PuJd74Nkkc*3@}aUq zS)kl3G)|V!vTK>W>=co=iG8uB`}B*rcyqH)Ap`^fIh%_DUm)+CVzW;?)4NGCYJhny z+zn1!Wc(VzWqj=Z9r=poTYTKEc-`NQUjr{EfjK~pxyPOg0YmTDqWv@8tXW;Xy*0nh zPQAyro_YYv+(@hfJX0DyqjznQj1<=MkK%b@M`BK`Dx~H7Dh`RZ7R1WhA!-95&nw=; zOVq8Mrr$S6#I2CWe9WTw^Fw)}4P>kuIO-+NL!6`tGmqLvP z`=+a+hilvCl z&@q`TcQg1;wRY%9OheC=oKX69EZ^DgC%>is4Zawvf1|@_ziIhpePxZL%nTlY2J-oT zoe$?37}$s~#Hj`C6OoyzJ%$$+GvnY4zo~Q z@1m>9Jb>plGm^FCos&LYvZcUJC>ugYv;G|euK&+sBf zcCewO(6N;9%Lq1k$x@#7YMh5;Q{LJIl+3-rk|-+s%b*<<#pG7De@XJuxKOu6i-xpbq zWsyq3z+mWa6dId-0EhxC-Iiik9MjxWdb!5{@z!pI48&06;ZF700{E5m?(|6dWAT6j zgA!$Q0hR3(Y7^b3OItdyaeAah%84z$rKhL<&nt2AE>J-{Q>^cYuNLuu*6sU;nW>0iy*^z@3J!=A%9V zKSQyOG;s}DrsxxytL27MW;>ERh)%O+QaUzIL5qk*nKC6J_bc>+oPJuugOEpy`OH+Q zO(Vq5ZXh-Ol=a&QubKu{&H5EPOwdVVY2*Nrlz*=2iuKy=!FS>_xJ|Pl4>=5&65|p; znOJ_<8>S{Pup;u5OdXF>w;qZX6i6q=Igy)~a+tN!3{Ga9^#R zDqhyC5RH>&ntHgu)|3Gw>7JZPjZ|VM&z#n(@C&1w!x!VFI@NvQJZD5!mu_```kUIo zIzr1&<`|N6UhR9LNspE=TgM0;czV(@CJt^<5uKJdo=v{DrEat`hl7Au50NuzIwz|1 zeV_huD<>y?d8VAj#}!-ZzLC3oNZ91mk6UtOqVr%twQzl-Y(Q?N;RW;so9`boQHVa*StbSYb`ZIAwJ5-p!0T=wdM zT$aQIIWxqKbHz6QHkZZ40TbhN$=`yDKIS0K2JgcghOSK(X=pTbpS~(tlH7k=W^(%3 zXXh0t{%KrmM14+az;t}Z6V7OVB!2~Pc@qSX$f3>VHE(e$4T*6JKPX-_klWNneTOdr z)-bd%@>hUYjYf%ENuNad2)wfgw=u(fey^?0voEvyKuIJ~D9$c`ol4!D{vXK!i<#0v znp*VNCEwR1wh)a(mJUsHsJVsjANo97LFTipdOgHK6pr1{)xZZ?%d4$H;00TmN2L`^u?=TgzGthDD zoaN2(Pb{g7R*We_)9j>%?@o;l#Kf_k;RY~`b2RUc>PrIGYx)lr zhM&atJR%t8wt+hj;&jzNY`mmj+Mthi}U(w!nE$&V-y(!J;ZhK}Ew1T8#d|k;A z!t)Fma&?e4?RbNuTb`*4%^T*z!5-q_(B4nb!P>=b1ZQnw#3Odu01QM@K-N-{|0Py$ zNArVh-2Qld$&i})JcK!SP~KwFS-zBNo*02h`NqLR5eVD(9Noc^V)@i85G`QJikHn} zS)mv>8ti2ea(WX8N{C9M9G&LZJWfQl7E^1Qo=cn1(T%?6zgvjA!1;h>m}P zDWNe-QVnh|{y9tq4rT*WZ9Pjuy|^q-&!#oWh=Er8q>?|VHk1#dY-1unqN-uCX5#NA zm4bJWG*mZtn{eHq&Joa*h=*Fs>QpuvbBtzPE%Y{)nwaWhj86DRb-JE(xw{j(D*CGi zdbAM}Y+dxidhln545VRT0jDlkD2Jw=T3q9F?b~_l^RC!YFdls895jVXNB2qgYz-fX zT3DrinR~Tk%}=}r8X3BO5ik1?ie3X{G#Cx!Qx1QoUo+&}V@Xki2Kh}&h&=*716%y0 zii}BzV{>lqCRJpVo(z)@$6*n)Z%=kug2tWa`Dpj!;m6|Hb!gP}PQ-^D+MjWdoQ@JG z2#tB+CX-OG^ONG|QTuEGpFc$;Dhrj1h*7NbFP)ldh}Ctbj`>$=13$Jnl_w72DPdVT zr+<~S2)3941vz}R(7b8%9aC0rgawDAV{Vhb;n^`~6R+4j%NO|5+UB4kda2;^70)QI zsL(xb-w!HCtgYm}`JB-NP-TU~i9BQEue!_%_`U_@TGE&PbY2(Ur-;|5R6tOX>D0Ta zx>dm^`0nM>N^@yi?RIZq-Rzs+9a&y!F}Bp&(|;fR)w9Hg%CsMS7w2>`E?EMqvQ<5^$zgu zE@_yXjgwZ%xc^b?pa>S$^U37DF`hE5fbBG5)3S$MjY+JtM?qZyi018?e}q++W%ba<2cTq?*?NzOD2G#IR)46-#BGPeKI?5P_T9e^$M~K z{73SE`E{QwX$nP*4PB%_8SesJJd=7rMua+60TxYB4;JH5h^i5i1Kd*SJ2}gFJFPzN zG;1%A>=?(*Dt8(pbg$3<@v$XNk7FT=dOeB5pHo1u7ReL1fo2tmkP#5QF)$lbaG#4i z4Ntw;8MoXGE~y&fPA07b&l0L0AMyZP5Aa8tF*)(Cgiar0S)?QDa~6TQoO~_=SZy(h z7m}gR+BhKEj95>=P)9Y$_~S74B`$k@ovx-_GkC9hq?Yz)L7j=EF4oe)Il^!fr7br2 zFe*^Z!CNITN#*bfTr3Be*-kTW@2x=`+qXxwzp*}Cjkj{0@9EXmfb$h&|Kk*E>A&E; z(oP~65OC4u2c@Us{!`tXiLp0yB6M(aNO>s^%^mqW{U;rw<-?L%7*maCvm>|17sXgH z56U8~nsuG()~ezktWs{|6gR25#Bh`?tbu(Fh+z{WQ>O?UdrJ-@(arMif=I=Q^y+)$II{yR zrOMvsgheZ;NIO!<+pj$+9=*FZaWss@=SLSqlstWUxI)1Hqx1RSvshJHRnUrh8sYmz z9P&@W&@+b4^Lt!U|8twXdwwUQDb_)~!QER1KP9FA)i+;4A5tQkOI9pfw z%k{sa4Zh7Webc?9jcgD3Y97*k%!N^_=)e=fS77;uE&VGXkCKAJbtAKk-5x-VS)S2u zVvS*9`MukApVujFTk(n=LiW5gwM0p6(#@iAFwm&aoO$P7?!tOLB_c0I%v$iU=jU(M z4rF&m2R64-tKWPb_!6vs?Zcu^mO=RQc0L9eBmVIO3x_xyYi=i3v7UI;DZo0Zt;be} z257X-k;M7Fmd7;5_O@k>qe+zQyVn^$OP958n!YQju>@^j<(#MnURL&Vymv`GL3^|1 zO=&I^a%_GFq6zTUe>0;^&Ic=;JOd-|5IewFLP;QNg_1wDmeMdnauCE0;?W(&R!TBU zyTKXNTbF*Iike-t>Eg#*y0`#FlLtl5YJ@~D-tDE8rRhTdQ%PH?0-%9D5W}b} znt1BW65_>aHV(+Zy~Sxc^x92$pm@_i1snjzJ)yX@%*_4vUoBDgQrrSO#v#DgUxjqA zT=dHtGUuxA=;RZ~#qA>oLUbj+a`Ad{hF;t$OFV-ye#y4n;?3Vybp9x{B_wTgCM_de zfpW-!m**k00zvwf9ynD*%+qb3cW43;iA!=!ax&tP7%G<9PgSed^~i$L1rxss%-lvN z`q;D27;e|E9K+{`JdRMQCaLY9wH5fT8D!iNf4NL){H?GACyb^2;_yz>|6q7bYrF+Q zWmR)`|Mi2@&P}ANJ);ZY8_mm5Kp)>#lwsG(EZ6LKqm_USBMBq3gn64 zyAV3XXmjI=4qo^~GW;*)$!REc-SRv}ovGP@SNfRC`nKn!O1|#KNT30`e@<2XlZ>S6 z0bDr`o(q*_GTU3cuuk$%xEcP(NO8-9ez()BcAqlCUgNu*@sQXTvz&Xv)qqUwe=Y1- zI)Cf}GPK+Nnv0dVouTi6-}&n%MK5CW$I_FqNE*H>8~N=+pxlgx^36ktUB#us{+G?{ z)PujG^N<($+n#6H(dD^)>d_Q}U+GWp1K>V$`#9&~(c2k5HC>|f42*PA<2W@&` zg><&auSqo`gW-K5wT=)1y+v<55Vhulap?Xr)BM7ke_L^nL5yb-&A=E&ngT8-$<4?s zLkh_`F>5z}DYNs|xJsL8AZ3Xmsf*Dy0a3t_Lp!9p!WC}RgKV4K&67&vVy+b0N|neu za~5Z$&EnVLtAYbB;gkR_pudOXn`&@;EIZWRX~4*y^~(9^0`LzUV=(&`@rw%h=`vvl zUDk7a&@{Z*IPuZich6vB*u(Me9D5ps?_w{jdiAz2pesf~$_ zg%=(c-E!LnTGJEs5eRcP6ZnzOj8H0ujN0@X!68U>b0*xHBmc}qTqH`@8ec|x>rD~q zr`*(>(x8E;-oR`cZxX$8md(5PFQP8v2TQr7$g-V^y{)^hT-zRz^gsz07qTeR#aaL0 zI2k*Ei_hSsAx1Xa{a+p$KNf&JP6^-=lAIw&^e^h{a?S2DnG>KM(C8v-r*!|SHqBFP z#Wo;qg)k^jCX;nfu%||GlBfffEa6)f&VXa{UH*-U{CFZ)>%IS9uW!4c+9CfT@1edw zLAA4O`jKbJm-7<1EmtITX?ANDv>r(ExI-0UAUUAf&%r3bU{qUxLvH~hDe?>$X<8l>wAv#&U8_FcF!yFuHG z>kRH2fE@5oxe#Mn-J0hW5}L$5Xm&2QMqPc->vkf03PG?q;Zvm?V~1eIN?f z4|#AA{w*Jo5dG#MC!&*MRDxO?ID9(hN*sgC6rfsUw4){>hTk2sUfX$kfg*u~@S_Ye zh~!?`+nZK7+T4rrT`5i%MnA&qZX&CyO3v4P$ud~)`hjkm+xF05NB;>v0aj4cGaT9h z-n-uTm;va&j9bz+(-WZ)*% z+BVTRqjW6OA`!1;iU|$}W~K4>P?k(8 zKo5L+85{&!8;0gIswxwS!owe~Y%gfPQ1Vj`P}lPe%J3Y-ykB!pM$O#I<@RqT(M2Va z29Tt{IOm-yNI^LvGx*CzcNW~w6C!{~osfMc=m-N#bh{C6q@N_AP~Uq1+9dqNNXNEa zNP!M8;cGk*DB@K+_=bmq-h+)op9W%}i04kJ`VHLzU?m?4LG3k?a9WH$+s;rEn+drq z!S4s6-DAi3e&GaKfZ97+%=>A~X0vvwj%roo6SgVKQ=9Hh>Q`S++-~Yr2M>t!No(>R z;<@5K&><2^vPgFOfNOe2!h=r47y-?_1c7Zx?_wa&Ll@y91)%qi@<} zS;O6jc{lDZ%3jyEGP)MT$Xq=!YLJ3eJq?lj=e+gL$`qbuPAP$O zY7>4LI>L2Gv%=O-j+7me5G@lXoiww3h^ z)yrk8n{J{!L;biD4UDEfSC4FZdi5T9{24wB4M>`ER8rhrnYwe(ak>jVMjW9#iC}M% z9ANg7+VhKc(t-)k?X0MXFj~6e&XoUX)1-`3ng#x~WKXJ}p&|!~Hs(SgjSRi}?b~Dr zq-T*_lGa~XgkO>5GGq5Z5wF2L+#=Pi?HJPBpTPQ0Y(YPWDL)Jl&FO}PTcfp-zkqcY`~RLNm19DjI_U49 z3Z@B|9%hC?cMDg_$mZncL{!pd&Lrs1(;vW}ejAP^I?>lEm{X^<-+yNnIKlbcLH}De z_alZHnMlb}Xrg)dWNhX_2;B|(s1Yg{^+AgM8yLUKc-LGowoaFH-3NNi1!MSY_wfRw ziqaG70lqY;D&^RWA2e5+qy9^(sPqrWu6jcS(N;v25@h6zCpq0hVtdBS^VXCY2Ozi! z-`q1#&6@0v5_yHPIgIxhJDF{V#4M*53-v$Wh|w&IZ;4G4zTQBbMKPNdra@oMuNZymiEV|xkqZ=byzqh~hriVmp(n|x{xpih?i?2q) zmQ58)_0t?L}yrjIDxzftRs>a*3{u_pr5s_lA%x2ljbf*50&*$@8puB)t zsGqSZy}qr&$)w;yzwp3BuVIx-67A#Rqbb<%ZwsV?O^yOhH?ubaT?*3T>J;@>3!IK> zI?SqK|^z^62cXCB~3K0AuFr%c5l|~FDJ%ziyTZYVqXnN|W{rY9qPn!S( zzT@b7R0RPf$MQ{Saz1$aK$MDZU9eu7!D)CdpL?R$p8$KXJO#@?e%IiXr`j!0eAUg{ zwT>7S(66VxHN_o4wTI-h7Qyw&Rs=)m^m0m;y$id#K~l0f!xu%D#2WkJk9siD<@Bje z@c8XyKhhM9rib~CL_dmJt+ZY8p=;Ubo)5roP6A5G=EYwM6D3KagCpN$S86`!#!ted zcl_37;NKg}<`@AC%cQAJVYm6x+)Wyr@UiimeomoLG>0d0!@2R6iT`IGyBqj#LbnpP zAq=P@ER7Maw{Vl1>G0x@2AWQjaKqFJRRMVK2VasQbyNbXTZffmgEHQtfX$Gs!v>H6 z=p_*^#EidE*tFcx!|N87>(|Ca{7p4GEv`*3L+?(keW1`8Ri3mJ6qS3T^CaHdEvzR= zb8p;mI-&4HP|w&tUT4U>vNxqfZ1q9+lkXmM#sv)|FT*-|STJGx{KZ-sPlm`NM;ZSy z##%HI%NSY%-pB#(?N^>Z3`{m;=e-0HLjhHQf|rpdKLB?vmPz&c16XfVa~) zKK*E7^s53^-`ryq>Fj=c|F!Q+yzWP8QO-k*+4mlX3Zmcw9HG-9@2SrGRA_ z`My1^X41@YAAj{pxvv6ThKZNMK-->Te$_imS01a)6Mfz0Ej6ijmfa8|vp$8uSIzkU z#oQF`A+LRxZ|c49`DJ#>f#wGfDCnh$YP8F?e-Y(tc*ol*AG3hDTUt?9I+JjPp<73H zA1cD6{x$h*j6fjT9q)XS5>FrswXOLl$1epJRE9lMWSVFmC1PZoIYG1lPsE-9DAG6b zKXIpr)_nk3Gv8S#jkR;OA39J^VMw2IWl%tS@vt zbj%yV^);fBRx~3{L34a+d*Ep6L6eLE5w=(4V?jR9;y8Iu*Sc^DAxN1`FSk`CZ8x)#&EpI zF<}01yBv4KCKhJgMVre!{SW$jFB%o26yMCu6jVKa^Nr;hla@fmbtUP^d_GDu16{S~ zhD=bR9lQp+gWnCgR7|UZ6?^VleE{*Dx;iDF%&l{Qqc_n%>!cXDm6cBh%teD+o;c}? zf()5+CSQ?o^I+kGtiam|tC&kz3w9LSWBwg&Wmb^BvVDG@;pW5f*!P{);}fjmytpaa z_kQ-KFQ>1{!R4}vhc;cP8I+?KE(@AI4^;yVl0{0GEZ)~1CpH@OT@e;5#yL&S$d<=* zR{#CC7eP8pwo0Zln2lLx&nC(J^tB2vCOidR+Dd;adXskeWHP?=lE_{A*fxot$I&GB7(@%%ng313ZJ3*ZxXEmr)V zRg2z<`5`67?3>T93QqVA?wIb9=f@sJHz^NjORYq;9>{N`IoL346=YAgiIfAxkou{x z#Ig`oV+t=mcODP?W5pUIEk^OpByuzV+lcd%G%k|4q&M<^$FWky(>ze#%bsU(+6B!J z-&P(;y|s(`rNw>v#cU`p{Q4k#m0crGEo{Ms*U;m zYVTpg7~h@e#Qj-7!)eX*@rLv8taO1QPZc@5_;>lP?^W1|W8G@nN~M;~`CWv_i&zM2 zq7t4itzC!2Iq@fU?4I?4)d{RI0VM_ufn{82fvA8vAs>lb$Ms$YM<(8RfxTRy%_Pf7 z&w@E+hkovI>Vf-a8Mfcqc2e%o(HZJ75i(*QKB#}dp*~E@V4eGWoVR~>N z`uDIHu~RvW905|1>w~nLi3{lLO07aym}T(Do6t{u*f`nm4`leLF6hS8^%%#g?F(IC z<2B^dz$jbadM{)}@vz)nAlz?zJg8!dAN$Je?)HwQ7j!s6P;`#xRA``DGDyhE7h@7g zy|SGDqf2imt0;>~9UAFXQ#`K97L)E!;{TW}lQpi+@vD4=qze37ygFd;C_hlj;a1|i zV#u?#8aCCM+pP*KUjS9yE>4?(6MJ6}2TQKc1ki$5-vbs=3pE=A@^p>&A52?rP5;O- zoUb85w}x3YR%Ko119#FdlCJjEPhRk}*QmGZeooog72^+$2}9^q$6xe?kMDVfq%hfX z%ous5FzZFpODghQ{;+M)<3V6<=^-C6&jpVx`G0&5Rs=p8eS@C zB)b#qa2V~+y$6Br?VN4tMkmNVtk%Fk$)?9HcdLFqr#64h{NZ=7I9HgrF?S$m@tHc` zKnypPwJgMGbOF`|G!JEZkple(z7OUE-$8wT%Gep@cX3FHJ7*l0sqDy)kT!Xf4Njut zcuV|q9jp&pF%^Z{DAt4D&L*?ZAcFkdHy6APyNcufSH8wCk#p#B%-lE;mKXShOQ7|q z3rF+q!T8mj-uQH;A+U61gUCDmtoH!@ zUDC-WO~J1UCG-Wyc|0<4I>PZfC@B#vO_VfSfoP9;Q61-5niHXO#v-kK3j5+82G{7q zQ(2%snTSf;17bsZkGq8@bug%ng&D1Nr}8j?{5z_C3;b#8L}9yLkZJ*3AhkFB$KQJc zaVnwN-#v4!e*&o}+URN4KyzPY7pH%K#+l#sI8c@6^H-50UZ7fy1`Qh>dtRljZ&J^^ zc`Y_w{odGKL&l-?WiY;6)mbU4oMZR*Uo>8G zGoESNf-cA>sr0XR*KZoL(Co{*HpspO>8ghVU|?X+7pZSnxW@xx^RCmSz;BaE3In2? z!wMu@agotAx+s4bFAxZ~qglTi!(5EIor>T5RcEyJ*vc}E9-I_CU#G={lgk%-v6zOJ z3qm`+=SmBLa3TPiD|bK_FeG$N_7>^IqKM)tCiKHoxaAbJ%Q{e}qp^O;lJsMAc0a4w zPlq)E9Ri>GR)B-)I%})vW%y4+(oa-*Kg^uH`fynu5$ARv;JLGl15_66u^e*lxIMSK z@m5`}Vc97j^p<{Gr~vBM-8$H=5dVr)CS%-uNy{NQYi*m(RCKPGQzx|;L;qp&(O)u^ zTh$@Fv8n(8PKNb~>lK=|B9lwV<^nVvY_;a#YB{mlY#;!i5+56UM0>d*M@rCk57)uFermacj|A9QY& zc3VSgxnD?v;S$%c13lJ*jviPAZgZ4e+_aWz->ht1>j`~0qeW|5ePJOkuEuQPba;{0 z%aNnGt6ts1_!B*V{hH{NuI8?8ervQx(21Mk=#{SM+)$9R;`c?&6}ll>QCl(EKSjiz zLO+X4Eky%L^HNsPLe3*o_an4|1yUT5tA16YfY8SF0X0+8g35R}#Yz4Hhn&!*GsBGg z$O!JV162GZkz>uh#2bnU#*qMK8E;|sJuWtnm7f8RF3GctBd%#8y(d7v@XYpJWDB4L z_6Q~%{s+;p7xyAPZ?-!^8NHjs_AZ^t^P`P+zLt{!k$UJ^! z{TlHBYjvFQ}l z4~o{ve}M1P?>imw_TEb=_Bt&3*h54>#Z5Hp<5B9?h8aBm^RKLj>kt-8k-qgq&Se{3 zrzU^NG%l>uT@K3U^6d$rO!2IhNlpx};GhiI`?zy~{(XhxoxBeir-LQlsMDygkLC2_ zy{!c`H+T^zPP;2?W83=CC*WU)zs!{jrnjZKZl!^fRN`D>{&=L5bQ;!)j@X-^lAfXgSsop)LHUN>qL6NNP}x+ zQ3o!Y`xLU>uFGouGWAP&p;^g_@DCYv&5H`rsivvdA*Gte8?r7@kl|HgDq}giKCXM~ z^W8x62+SjOJ^w?q)i$q&kwEQ6b=vw)iDaK;KCA0z=dTRyHBJ6p!(LWa$^e7mHxr4d z&n^p4qT#a~tUO3I4_OnmVHkx*M9E8~_tSG%nbD=31nT z$DBhGX{&w6`vpb*$zYzM+V6@ie5U+Cg#qQlMp)|@ggeiI4NyNjHS4;Xv32ZmhKl1FYx}jBBo{k6wjh@uWIXh9o7G=GXLcQdMxShg{Z8%Y*c48{`0Qm*-Drgcm_&(<-x)AxZJ=9Fu0A z1yNZSG&-R@-Qle1I_%6B#D)tt|M%uAC2WG!e2khI`}99#)+QgmLN$D6)@o(K;J9Gl zeliv)Hgj%R*|vHxXW$#hI;ZE$#!B8nf^LvB>UB%Ns4ER8AlI)7tI_G#ExM;t){eAc zPeW=y%NP!uJUt!gBuKkeJ)&^hNCDz<8MNXGPvQ=#Y<(8}D6}QW84sUK%~DW*uVGk%umgLZA}zfB3IWS>qT2U&0Zai^!RYy zamDxYn9EYDix%5)AzzKB>6W2P2PH#!o9S1$qb5a@5UA~W`*BEsL(b|~U4K4A(*Fh1 zkZUkXVoh!%`1iE)P)9HTt&`RixS{XX?qbD6oJyo!4WAQ?L4sOz6VH*V1Km;YeFh-b zbfhE*q@E89d?yoi`xfw-Rv`8+6E1h2vbX40j$l1etXvPQ&Jf7Bx5qFa^WhT<)JEkR z6s00}|H!~KS6l+5)hroI8+>=M_3aINH=d)&Vz)sJ@d}f?fKzj2~Yel5v zrJ(*rxIfE7c;;s*vT_!3L2%PQ?nK*7RTW+EXVq#Bq9*3TnlOJII(!Nxq~2#nX9z%< zb1`bfcX)XsXS53;Cb&|DIPDKkrN@UZD!)tKsXfmC3Wg19I*Ld`R{DhfQ)I<9{-r5j zNi(@a%AVY*ljNX@RiYTU9}S3yZOAScooojF3S%Qko@5dcJ+q*fGvBi{sXjb@xuNv3 zlVI(1WE9n`TfI9SKRH7W;z3L|0JS>aW$sH)H&lkfPV6(EYmW2-1~^4d#gZlutb}h$ zn+tl^;g0EwWz}HRiskA<%~oJ5lgMpKL6uENS?t8^R?l1=Le83|T-mTb<3(eMn{q~K z$td#o>A~n}p)PsC$E@>1otSPPmiPz`tHk*5K_vU@IetwdsXfHOYyL27*m0B1JvS(0 zB9jx!$NVFX;ubmfO$1;ee$NQpDeE>%kx0^ zIaXF|CJlHDpTHbHfy-9nKXI%Vr*vF0ddypNzTD;CEqrGy?JK^oZZVo4f7~10GUkwf zP#x3oEB_>+nc0T?2jHOtXrurw3)gh9ew55J`2X?r)=^ErZ~XtpV2DzJZ|P8w5RvW} zCL$@_A=2G3Hijr*5K1>ljF6CS1}NPFMvN{;jNYVw`~1G&^F3$hb+-MnKX&%I@7>pR zJs%GQE;j&(&V6%J*W1CFXXB>j_^YyGRmHvEesTRf{zZyZ^$CJ_K`ZWu^{5W8Sz_!b z!p$2-K{tq5m6-h5-^ni-ftg9%?v5`=3>e4CjhX{Ta`8+!+*+s|gKXW?ZxP+|k0?|5=*Z`r~w-0dpcJ3$$OG2YdYFidQ{cE-=IFO%} z!R24|8Oc#PPH^%pBD%0lgf&P`K?6_g2PWxtGdcwo9x7(o`22|ghS6)=Qc5S|k^xz( zI*_$(XWGaIVxS9r2zPlgeph&zHla|v@ooh9kMH?vDjcxafqZY;NQYGhQ5tLNUh|uw zeAYKJwyZk6UAW~iEPq|6PrCtcOgKk01974tZJtANs*e=htKA9i*x6969;wO~@$uwQ z8?5A@^*a6Yb(J5$e#Zwf4v)UCZ-yb{#FY8bp!cA0V2ei$Rq)x9Oc3l9!tuAC%RW%M z+Nx8cv0#`6pl%NJph!D($uae+qQqrs=8PvbE$Cy?jXJY`f<}QNVH$WWnKs*3Lr!aZ z#HP3_3Ms4NltWSxxG6@*@d5ztt=mE5N z(Jk&&&c<1l_W@vCFe(ZRa0Br%?DGXSe$x9O=>*EiEz7;~_u0<4o;%Utif8fmV>|ns z{B81Llxu8GqCDK3WA=yCiX8L}S)b&T+oP1XEJfLx3>D6^#*5ft4YPZhH|za+Y69kl zBjRX;nbu9xX1j=TY3ZHs6F(?n`g-0?|o=jIRpZZf3o%CuJobeB)GAkjdpWMZy5PICb>M#qmguIHgzSA?p{t`(hPM zes*PHf}iS~v?eJvN$9(lt_A}W!B_9FSwSD<5RE2xgrnrhmg|99*E?0Di)~-Lj;Gfp zvp}?!%2qZ7U(7xvr}mUNU!wuJE(h4SiM^^khUYx`vOVmAlNq2(u=$2TCVH&b-OE-x z9iY|%<~@)-Sq2~uJGgg%&wxl5er;(<3d6^ovWgZZbcgHDPQ1uk`{C>R04qR@EK|q_ zT6QFQUP;^HLhVF)(4xUC7I>cl- zdcjDd31(C0(?g$m>!08-u)&sC z68+4?LiPdrsMWj_8dP2D1k_);v+sYMzkI5r4PeM2=L0@lii^NCc1?P`cFZ7nU$#OW zUKw3NRcWT`U7bc7Cdep63n(8WuQz9MidAY}0BRhlCMJ?*BU7RTC;<;!7wl~#@(y*B zJ@4jIs5koXgq4__@m7E*{UB4+8Uu?9KUE*bMj#E6Cn5zs{QW2*pZv+aRFdp;N+yh7 z@RPns70D%EDmAu*VGIq}#hc=%q$kJgXqIO2^g;S~ zw)lc5s+hh4H7-&4&X@;Z@ElZq&lX}zU4E|?+K&l00_f)Et-2eRG>7G@UuIqRCkZBi=m05FLfN0_>gWwCSn za1e@ZXQRw6lH4YD&4S3&$O>)M-@mq%M#q52%3a0^Gm4>0HuY|5v+|$u2*PyP}4l?O86swuFYhsdNRqkxNS8-_r4}Z~VScnVSB%%=M~A!^}^?AZWUkO}7Fb zIoS*_2HhvIoHRP!{<&q@Y$8(BhqTGQmUj-F7^!w@8()oc^SDpuX7%|+j~nq-;wQo` z-JFpqJp!QSf*$#ClY=hhCF6LjH32$2^6PuKZLM%r{T)2Q62PSp_o{~9he~LsKw)Wh zG~tfSQo@|>Zy(54D(thB%!=J+tHee5pX^=<#YZC7c*?}b^_d>>zOT91*6F4FOtozj zglv9qH(@Tv{LAi{ta`(=&Yp+NCJL%+T;AdJvkE>9N}LP4M|`k!Cy<=yiDsPcMUA?o zD%4}F>RfrVc~`mI#eR6Sb}%B(j1%*h`o{WZRx?;V8k9eomgA>ny@Dv^_2=6i!J|)F z!D>dR`u-8lC|1vhty+4sX8tmgcH`5oI!z``NjpX@Ly6tZwkFClI^v^}rLAPDVY+EZ zq%&vIHcId4zoR?!-*r_`#SaK52kwXasV(cNEeuI)x09edBtdv(_jJ#QA1k>mMR0Xu za?pD*X^LB<`=eHaOLn)*ew$Uc6;9~)t=`~F+O&f34;ORB>%DID8_RHfG=_9y4eY0u zE%0-O-wwRFU-vz-(J^`^&ol0{>@-!5EVR=-tMZrr^~hs3^%K&1jZ{&kCpC;DR_n=A zLs>P}uAkLNXWx7mKg9^}NxVkp6H_ifZFBXyB>7uCoxYd3hfMN#raW+%99*oNvKIcW z-A$SOG>TmM6h)8WzTN0Y2zhpwp-h*|zpOm=D@_9>yTXD~cnmi$+B<;HlM2CLnwPWA zVE?%Gc_Sztn{<^Uu=`uZV0ksGQVf)x&#$PKx=K3=Y#}%pSOQMo);?Jh+(lEXR2~1Z z7Q%qBD7K{yp3o!gdW7$6N*yUo>SV>|gu+BVl#6q8RAx1Q?lWnlLmTG(Svh)q@qFQ0 z@)EswwQxL7*M><$hUE~%9&igHoVn1EGF;NG4+tvj-ByAA&_a2GYf{0SP!&4+bLQD( z7E;JD_~7i_r?yrd4o-@iaYfBkng!|~Rle;&XPP83UXVg6w=Gy^i#Dx^3FSnrIP}qO zXpDUZrj}$jbut;oP16~Mt|FDtku)JmZe`b&^1*dSo71u-wtimB4Or za1zz+&;gpQ9h&Xf2HZ;*jd9a$2}{u8)WzSRTWEpu)T1F9;iYoLVF zz5?T%>L0ZSDD7Y!e@oAig0m{?Ngn(p1la+1-i{k2@^< zJodt4VU;j`cL)YVN@c6M>>!-X9WGji0qN^P#_46cUzI~U1I68?5t#wSb3l8t5MrOMV!Kodl+qnb$VXHYL$_XmoeX`TxP zQWR!jiV>@J`1)+;th7otlX9)*p>K#mRR~#h5K8*+<^CghG=A z^gz#9;}fl(^}HDwMxLc@BVPC~r=Vj0E%A(=$?i|YfYScJNb?d>ek*vTs;@%So_rw) zSMEm=PE|7cusMYQj_=}O=v@!8mS=UC>St^ss81Y{UmC#qb!`TI=DkTWi>Y<3t;Jhq zG}5)aBIB&}4;n{yW+#Agw2>=XEACWPUgiKAbce+60P#idMZ|G+ZkTiN=|8X|n>GFP zEzt)9qBQpg*6#k3LD<%M)%MuNdCVa~8*?CVIhftjAK(W#MQY0q!5LZ5-fX*bN=K*fm!32W9un)}`|2nei%1n! zc<4*dGpGFn?Xkauhanp`6W|XAL#iHSCt)5z;ufAtOKM$@_gigs#Ixpn*w8uaL6qaXa<3%52?3F0Kj&WUt zaLk!-t$hzSbEdZz$sTHUAtOWVq{iT7D_Il5o?6peznmMWjZHrUzWC-i2zU94>1iWbL%nRcqgiZJtRlc6F0Sr~Dan6zR~=)zDt0*5s$IBv`IlH2yLatB5E%f;dYs*; zoC)!=Yw`_tBb8>LO+lv%|BJCK)F(s~#UFCb!)0NCdzXDqr;;x-ld_f6_ZC}ZE(zz^ z8rN&kc7;oV>SAWw`2n$zj>O-XZ}fu(d+uHN5($}g?Zl;J-`$mU+(oejx-lM!luG|) zWwE^-uNtGtUsAzdK{&2YpV~QPM9#TaJSYsqP6yx|wKXo(2t>9JaC-G**m*8p6J)GJ z(y0$e)aw0;ZSjOR1)RLDt!;hPv!H1U$zvtwC?O~*qRO@h_?^DX_g%YQ*A_mx`C&oq zUsFg>lO<#Rtt6yTin_x{O-8Zu$Zr2kHAi_ZqQX3DIJ5W)MmYA}(5I24GvZSCn^XDB z01jLBqG0MH-D^L3-Enywv+{k?58NYnXLAKDtrHciOyPbnd{s(`eHh@{ExahUL&4yLm>UhS&D}J%6%-L z_}O^|i`%h^X1tI+yadoLNM~bY$oST?9{uQzAzAlmh7CB2ERSzEGhjZu0Q@QBoO5WU z$;LBP@XLk9tLg`U-ryR(?|cH_6Fy%23zzhXwdmgM8fKAOK4ofbwC$xwp4S#fi(V^`e|-NCvsaoVv2Gg!zpfuQFja z<52=uH-3qM5et03fZv9hEoKr%UklgYv(;sz&*e~UQ~{!(3E2=pVF*wKVaS~+eH{K6 ze{f4+ysh&e3w_*r(=u$GF6|{_VDT=SC!gzK)Lr8oMg=0`!Br|&hCbzm5*gWq1ZL-5 zO~)vL2S+(8J3ipO2+!M{<#MD(=wr%5YfYXnPEaO~+}3OBFUCG^taX!Qn*4MlS^mpF z8BnY7R!?@4StqfTwC0P()5RBUm(Y~V*Cx8`-d<+n{$q}bV;lH+@?w{bMy^m9tx}8k zn5{fF{0UFj{SYH^3YW9ecH`Z;HOcXTDX^iYkKFwc@Cz?SEIs2yp_1Hfa5k}YU z^}$(vF%P+l-cdn2p;m$JWa(g)x52|9?7j;5#XW_^*@dcAO-#-x;Mv?_QG>^%kI8pWuUm>_kT9loiq{q*9fC_WtC=N7 zk5m{{{*cG0=v(_4op{(8wk6D*=uY$mj1YOD69mko~2xHfz9!7J%J%!*2#b82#;b z2*gMF*HfE^uJnW!wwd~NkN};I9R9Krsf68ZoqM>mkvX3=SkqiLRR;{Z$bT^OCfl!p z#Z5=&@yR&f)+4O$kvL(hH{;$9$qA*|lrZFu)7;~D+5fCqYLh*AvTsW}@mCPi_j(RZ z{qjg>Z= zbaOXyf42@vPE<>f8tDpD?ymlRb;B9IXt_Am#Fv>RW;0|!aOWcSz!+lk>DXeq7L1Mr zZKH$R_sWS1*T;K|lrd6{lRdWl7qL_ShGnm!4v=1!sm(5fPu5@!8)nZN6I2^@joh>N zF}FvGpxqXhS^WJs>TW4O*Did|Mo)2r%dC{yEmQr>1lb|%?<4=^wFB1l>L#lzcEMn|Hd4D zHjbfH`XVlZ*7b61=a@{hVmrE*Ww^KW@|Rcd&&QkxHkCHSo+b`@T@Q#{MzI21tDyQq%7+B;?*3o?SH*piKRO`7>ZXf&c=c0O3Eq8;e(*_7WcM7Z;6+znXUx=m?9imJ$H@8kHoFAU-6I zFV~Dxr}uE0ed6~JFNY-HA>bw-m5P)XQzX?(vO+J?^wzkZ0`WNOCvBy;7`ZfA(W@oL zE9EmEoawnINLF}kgP(46LibJ~opAJv!q^Hr+1(fWl3dH1?H8`3G3nM1QY!oiJ~2cC z{Gi`=PrfoBZ-`Q6Ph)TK$}>1{b&+}}pYfp1;{@S|9?~>sA zr!9*%#I#vzzSYm8soKAJyjh;3Oj^uSLC@{CJGbB2-{Pc+jzt$xHTAIf5be%FL&MYw zwZ=&RHlKGk``cJy631?ZXCzd(>yD@!IDF*a$$4Y83Pv0?7ZBs#P}R5reQOLu<(%axzHV^x zS(h3$e+_3K$ELAA`~qb#PCpb|x2-DC5ag*(!H0_Um3sHb7v=e;jN80czy)w>t4v4v z$6A%wx-2I5KWlSJp5mOZtsWP>J-2|1X_|?#rLL5?!H@rT0kE}ca5A$2`L6dQEXD;B z{gj_2Ark&Mp=TfXq-p>pawi^-8_N~&dg>bA?RAsGpcX)d}&TcZ!F`2 zQBeCDZ;*>dXX3s1i=D1+$&Td6LjbeJ0Vq@a6Mx<#zBZ}idFh;;hZxpAU0fm>Bl`w%_d46PMz4OTi)c;GJlKwx$%tCqr|FNgH&|rzh=w!0KSF1 z=#<%4W_1ML8MR~>DNHzpm$-9F#{tZ`-c}X<(90-Bx^yQ@q7-V3+3MD0*LiUARg(N? zO;pYAJm99;0xD-#K!*nr#e&#Kv&cG&Cw$ZD>h1TLL3(qD{w^0rmuC{qMdIkqT?4Hc z9D9||Y7W0X_$_(6zD&O_6zv;`5P{O!0#h`Wv~=7cmw_SisI9D@Q@mBh)QoS)Th%Ghh(Z5^%Ex=1M6YseKVIGA|WATl%;n^gdot#)i@8YDF^t;c|A} zAXINgrQZFh#P&?+z>;{OJViO+Tj70uv{SM0=cpCaeyDZA{?)w&86Qj`yV;!zAamv-C)0Zph0T=o2(V@h>t9h%x%E;?8tE&N=_7=y1q)yenP|H)vzsBPz zarGIl$jCC5S-ds|Yfhwm97;IwWqWx=-~L^hck7oMnX+&zq<~i9hD9t})Y*q~@pj1n z_K%r(NL%Q2@m?N8Q&~a%gf7F;@n#NLIPgQ+6B91=oCsqrnvC(3y#G{52v)m|iRW>5 z6e(`cRBLoulT#PCInU5o_tQ>$2XN4kjFC25)DSk--J15*)ulVU(S{Edrf-QiZfKF( zI@~VV$B<{}oxa!S)UpPuX19#-nge$p72NAjparUh=^gUQ8hD_lt+a9`RHwgRFlE8q zgAW=vkrj%>&SR{Em3zHN$kmasNXTj9l%m_wz=)QJ;q>M}))Ttvo)#~hbC+IWM`xE= z09%G~!xbq2>K(dk;DUyetEiwI(Vx>u+1OorYk<0rVo zk1jMM%|`p&=<)E-Il6X$^fFc5v&sK9LTNI**k{rZ8I$1}7@U>lZo$TV;+^}QI_U-! ztgljNcfCdBPv(G_jbD-sjb-~hEi-XQkZ>qePpTi`^9cQu~O zR5o`}P$+lvN4Z4<)(yJaUkfhe#)Z!Xm^BlYFP#?^0+4eqlkQ9++87b5%!OuX`!a4f z-GHzyV+c6eS{I_x?3hEb>DsHlDs5nx zgbsPlB<6QXt?@QzDm|Hhd7=*r{cV^|$PD`-o}Wte!T1*z=H7&Q|B2yw_rys5ubEt9 z<=B~c5hu@SKsDcsoMmcgvR`!4Q@(0YCyizgN*lg|cS9K+>fg0Njq|@y@HY#t9|EN3 z!=ltk1+z>I-4cA5({t#4vWSA0_6Kx~Q~m8MllX?T2K&xOkE8#ppjGODvs2qV=39>M zD~7km+^UCoeWR4=UnQ$urd(k1>%zi51!_js17GlA&G-=gQrwPjxn%ai4P%rHUZ!=zxs#{+g+?t5*rodSyjJPkLO!WcklVA(oXR@QoTQl?S0M6>4v z@dJ^wrzP3(`%8_#168v>nH<@hrri?Q%bAy<{_U($gTzz-7ov(F*KkWG<(^-vu!JlP zJ=_#VW<_Rw)~2s~sC8Z=u=#U_Pov(pv5YhYN`*DB_^1|WZO|0MePS;&flR0U|3NC>QpS5sfCN1r@FEh9I1_^4Xtf(R^Z!qRmxnn&_T8&^j5=1nIv} zNaXTt`cRyMRGjy?%*mbF$jzOu{45v#KqsChiuG>|S;3Zk7r#w{m{*tqNr=+Tvy`CN zaA4NoT+!D0-aun-03mlu9{A7$w6Zl4gxs!QctZMrCpvVL3GLHvZsLE=^@_`)RoelP zOysCPFwYl>b$Gv)x-LRT)M)}~l@s}cwsKm@#>hy z+30p@0?qOipk?;AUz@PtvwDkpCLBSj!WTAIipUFVj6-g7bZnnnJ)ss|>x5(^b= zTXfPMrxYZeq)(?eu;3k(kI>4-pbJBRD5RJRQbzA8^f zylJ;B%sl6JoIy`@e&(TuV0M5R8mn%rd+}0qVp(97j$Q#P=A-uoyntGx4+bGNc{$$> z{Z6g2!U;j#5v9?9={BHSZgSUZEPBJZ|0Ab(9L7swu#XO=rVx4YuoWm|KxF7J z94?}G{*+Gi(VJh9j@jOja1ur|0OKyLNTIoB-iVnk{Kl3{&C99D1-ZC7zM9uQI}3-B zCij*8?S4LTY=WIw7Wnxz!4IZpu# znhVx;Fnu(+oYaw6AjhK5g8jwjdSdOdz=?4B0^p9P@_nCL4jitQGL|<275F6HWhSwq z8JXQ1%}*M<{hHuzWgiIwWwYQ;5>5G^5XW^(`;^queIpkg|MkOK+*V?3qTodjSI9V@ zo4MC+<66EpNH+X2ND}t>UwWBU4Z-Uq6(!5Z&971O{qnYl7@{l;+2N%1T59ZuzJheu zFpw2PIoY`>0#RcHFT*;Wl+a@W#_yZzMo`E5ZLEKjUol0w3D3xh1f}a#3O%c{UK)lI zru*9P;)%Rpt9(;lw2FV@?yvZ&WK#6$D^+~o=avK!`yD<>ja}6r9BF+nvtn*PTh$^{ zkM5;n$w^{eUO%l%@tONOG@1d1sq9mg$k_%ytG-Y<8wskTtL<#nYC)}q=pD(UL>|V6 zjD;GOsi}h;c+b3O@h8z1mnr3|ch9S|Qoj~M`J87(tR+#H=OG&7l-!L5 zNJSH!@NP~?=#D{+PU?aKaSfjM(r)vd6RMzuQ zv9{`hIpJN^sjjdxZIx9wkm+ZndnYgrWrMIGZp&qVa7sOglD``xo-Bf&BwqE}Dl&#W z*@0O&6>y|(C5YBQIs{;#6z3vir|+47+JI*Txmj4nfy?lB@bcEh4{8ewJZHmWFnIp- zvp3l#4uy-*XAG9<4=gcx{qg5H?3Y?4=ak$)RqOFjtVU$&J^oy{fCT7n>VQ%~E)x-Z zJ#mkyuZ(Y%_c4l~tq$a8*!x-lEeGmamoINqZ#95QQFov@39>a?P4gu~4X3nJJnpmF zLApsHLVdr^>Q1|H$Tp$=iji}?@uxA!((9k!@40Ocg zDeW0rV;kDVw5a++tCIu?U$hNl1>GQBwE|vs_FARC6o>bYSlfs%#F4a1>Aw^C>m3=J znDCmj-E&}NnFOGPN@uc9ycn--Zd zh)7^mXU}{?WCI@y@plC}>tiU&K8M#N`lI#~bM4xA>K7%esCR6SZE;^5oY~D+?Uon; z6cD}guVo+A&w%9`2lrP@zWE*a7C=k74}BJ%2d&i)nl-U>v5iQ4YNUQa^_C*#KL80+uOdH^Z5awQ~lG^M1 zFww-(iAgw;E+ObQcvDJNz$TQSZiSCMN3WrivRn3dj!HYgj?OF!CQs2<=-}NB-__1C z9Dec~9k6(Qb=<1jE&(H6l9~j>4u~7+Akh|Zo`>r?Uv#6HaM|?GG#Vkv+rnR)TeUl; zp0$F1whmr*=i#Ke%{FRDr5+z-xt7tx*mMkD6H|e8itBIjS+yzfYwg%RWlVO~F#%QQ zZMx707lLaX=5`NLU0OYEH~LnA^&T+ASZ!^8;eV{nPsmP-*;Nv=C|7)So-I1vtP|b< zG|W8KmLRy+Qtne>$3v6?>dHqfGKRC{AenM7cX>n>g8Z3EB3)`slNdWO5Z@}zAFbnH!RnegPzK`t{!bDT$a8~U9}y)s#Io>7+>D+e8bF1s}z+8 zAUEJ@tcTz>SKpt`$0#N!g>&5(1(6sT4mN+}sw&Rh5`|8@Gzq&pS6&qXVbKPmKiJ2= zm3s>?D#R;<2BouyD@qqs8P)5gNLHi&qCQf0t7 z2mXgv)#yFaq<(&=q|t6)h(FWXDyH+=Q&u7pX^lt#0f^$js%lSI)^xba^G4uz8(I|o zQe}xlEszCPJuaY@b*L_vpqKJtb=aJ+*A_d8pO@CopZt;KSC;+v=*%|@2+RJfKKKlt zleEu7%264eoV&p9rk*|MBUcth%tNbICy43SueUP&&w4MO70o`MqsNT1um7wWs91Mw zja6@9JiK7EnGoJ9f;;HLgBHKRlLIRZn_~kO>1`OaGm~)s^Ba=g)uIapTe%!5t^KS2 zaB$>CnpOGYDInnI(8URkTRum-)+P-Nj?|lW5{)U#pJ?)%l_2$>kP& zNpXS)ZZp(fkb4%$GzZrx3$fl*ICff`1F>< z%?TTTcZ>G85u>5SqzUv_K(hh+chSM5n?3sQ!T|bEzt0xX7l)QOe@vZ^JQc>x!)9 zy!-MOC39gY!?N0$+r>j!WcJ5?^|@QbcOiRUhLKsCO9@Io;G0a`g)XH< zDte>we>X1&4MT9Rj22eDbnW=A>n)39mL03R>aEX0x%XH{69lt-NwrTUr$&2kbWA^G z<@bb1>}DizoNEJKv2j1Ac+$2kD7dy8TRkP{b(h?+|FZjZAQq^{C$pjZPc2-@v~&rl zEiU_D>$u|jq#gc{{<6Ba{gmnY?HN(QU-7@B|NpOl=#Q!(pX{tX?jkNbZ8ZP71W1d< zyrUhAkP6E^c)lG!16pAzdH;clHugzpE!wD1h`%G}jGI%zicuu~En~q+pElqrp9<6| zC8^P4J1o~rhw-)PO)z)OovLFyN8yR*zN$1!1KD$7!cu~Brtv33Qi6}=TIR!^^eAYI zvoKDuz7ifMLr&*iT3Zi%e(R;dS{VuU-c2;9%uL-(&lk-1xa0KCiWdK z4XdKNnz^+1AphL07F$oRe6NmcaXWoN=-KsV^pFc3Yt;KZBasDnC&%EUaNKYi9Woum zrRieCrGY8OdhFkLXxSJ7Yw~Pc0eyAZtHm}QT>0WUcX7Xev4#xkFyyp&YFQ>1GD^iM z`uqUvNU8idp+aPpJemE(D!?guuj0wQXq_umX)vflmB6Z)T?AZP$7#?sXmKi_?>}}M zElu|D<4k^RUg5nUcw}#Z=53X*D3@mQ&b#c;p+6q~BP49SU7$YMW+dc3`4Lc1@2*%B zyl9oGJzKDO);-%gd^DRl=k_r2(6>QokmL&rzMjgQdS83IC>|QRC6e7b0n%igN2?Ck zIx&G3|3)hOalEY?E`1|)la1n%u&GM-$wsAtIHJV4kdv-n-=e9 z;l!yd!!aAsLM&4V5a2@|9_XwC)k{;`{i zl6cap(xP#t`QtSG75}656!7dj^Y8*nLzGJ3fyM#~xZ9O^9hNrDuBbDzbdctXSvxh> z%!-|OcS9o{GJ5loGmqz+8M0dmVoRE`KiV5NAS#lwqWF%Y5k%wdE46S7=5x^8Az9R` zrpWC}?m_XatMv1&EKaOcCwR+F_a-Yv6PUG$K>J`J_q;y503_v ztyNc2l?=NGqbIc|`s!km|3tmniRg$V=Pu_M{oT>HP0oogNvr)r4n* z0EgrA=dHW{SvCLN?xE${+f-4W&C8Cxj8q7i z)`=}QQwpC=n~$xUVA-$!NUg_NoEPw6TLU|Dem0Q`rdp`Beou8><^JqhNt=PNUAB=( z4c}zymd7ODiYGs|X=KO^v+MU`wsgly&(9#hsmAKll?L|K-W&hrnywkN-=3BMYLv$j7+^Mq}^&Zu5odZ+043~t2c zn7#I=M*dkQ+jqz6?_;Vbm^Y8%R28ksZnS5C8;V4DU=>I#>q(*iT|P{Zj3@EY;TOkk zm0a3Iq6-#ef4EC@XwBk3fmsV8h>0+s?DC=dT=K_xw7)qE0KpZvxD`lC_z=M$nB zAsFB(MN&x23-qMsfd$e2Yz9n*b_lm>;Z2RFKRJrR!Dm)3YCQ{T{|P#B)()Shh>emx>Wdu{JZ#`4$DG z7I^a$+#&aTx|F?o`Y~sbA4l$l^+)RjwrLRzF#`8I)cbNrTbZ=woa8xXedfWV$Fcuc zSoEF5>6Kb))&W^slj>M?N%or9D&IdUVx|=2qOBn-E50Wa>);=J#MHHB@VyzLYwqoL z#f-a2ti8JxVSChIjfN*L!`%b@5o1pp~^ELealT30=MyEf8xUO1}0Y!+7^CrS2Z zknsIJWH`EFBFDDu0sktb;i%)dqifMUXm3GP7=^n^+Yf(B>wUJsfBo)kzjaTWBbc?EgFKN-!eZ9&JAaaZPb)N&MapUo1rd$p8U0=4Frbz7@kaCts~K)cVrnR9W$*O>t-K1$q!1XX1r8Kr`XfcTl}ldsuqOJGkq3y>XR z=8_L@P!DtAq)GX9-klH$O@*@JggIWXsZVqm((_!r(#yiT<=oI2^~}d=8NpRus+v7K zG+UfUIeRmY3vioZ-fOB)u}Nm?`vX#;b_`Z66U%DQSqZ22ckro_Hz4?NlZfc{x&W@@ zbw$cfOQldd?8sI-z6`q8MqKEU>NOf>UjrvN?U@rh+><9Nwmi@DHIKL3GK@LqdXq($r%^ zXd*P}_?MNe(XM|RA0qK3QqKNWaGFN=O9o&roJ^)C*!BGB#7q+%+O!OzRg|KyMZs!uAgz|?M5aET_vPaf4==G zo~CteP6bT;(|0Rj3g(b)j>>SVB78 z6nk?jEn+&uo5Gq8-RLdwKvbAD_hNjf1-lL9Uyf6-Y*@kb<`Piga}^bvC*vwY+$@qw z?$$~=0D zqyc|kdyaj)@(t0c<**pGZ0JOpCiZ0X!+-U2dHqA}K&O*W;pcQeL1=N14x6)4JMi_) zsp^`#A+caqXs^pXyri8-=h=VE=y*ZRM&u!CSm+tzY8PEclqQLdxJa>6WM-5o_8(GX z-qHukcmmc1|091Pq?Jf@@$NhPaY>6?wx-t_u&I*Gwvm9{*o>@tWfkO85s&oP0BnO+ z`gsU7&-yd#xOcWn+z|(pw>AfSnb+c4jv^Kdq%C}`3M4>Hh%S|9n88Qkl)TV^a1Jvz zd>D*oJ7!8r*%(%_69!cm9ss_GB>yXBK^JE-V(gLtmZt@Bq=psKeka$w% zO@U17qa1YKGm;+|#iOL6m$q%k8Wb(u^ix`I!FBFIjP#QB%hcHNasBd%NQHm=S;0{* z6zMJp2>E@@Ie`EaSNy($bhy5ase%u<&}lQ`Lt=7OFVhF#`4gc~cdyMP@4~O@j#N*{ zJXHAOwpu7F6H;NDJ%;w6I0k0S#w{;1F+~u#bR; zuWsmme=s`O2pA@}erdk>6Tm-3l+alvS^rk=vi_iXrLMS{Wi!&g*&t=CaCz2dnEIAd z?N7jsQi&V+EV2W>mw5iH$}R5*CN3akLilA+eogR-^P9;ZlXh? zHA7*EB$U-iUeY)AlpLKr8E>12Ak#?h)MRlKjdT3+;!70Y_a{nF4>8etRYWnJ2vBQ; zt9g2jv-v0nR6uoI^0;W?Wt*Z6QHW!FV zplKvnAn>&*d6C&QLD!GVOlB*enH_gr5|O0noTKAeU(aHu^3~sZ zBqbfEqzdeMEK)dj;oPwadOr40Ss}iKxU{O3-g5nS6_-cXt}x%K=U3$WM4u2*Xh(*8 zwo3BNQ`URbA_`$C6SL8|6b2xhN}4;sVfH1zYkN|y3?D@G&$k);{&^Y^Fqcj|&vH@a z4hF1$5kfF?-_UTbugUf71eMpsQ$9COFE=j^JD6m>V^vBZ=`u~tK)Vru_1`ec!6#Bg zYgF4|X;}VYL-O;~H4sV+6fpBA(W6drlGdvyoQFijp9POxeZmtM=K9!Gi)zq?Y=#!kGWaa@P>pk>CA5zh~ z3K+w5f)Ybf2f?%>)Hl@gRZ$TU)zwo*If6cjexcGfMb!1^Uy!5<_0lm(@+Ly%8B93t zi>TQg&Ty84AA4>tj!yh8-J7~qQ~%=TCnyWBE0p{H*E64?AuLzZm#*kxJU0;7pTFTXWrwX$EAGEotC?gbtK~? zVV|sO^iFTv(PSjJC%fTQx5`8|Hfeku)4fZ#Kj$rcJ9fKYhIj)rFsoFD_%W2v<*a~> zz13ym8u!~opR<88SdZR)QdDuKw%g%luh)w#aZ_*jlJ^K$jQxO~+Ue|z%-7f^(!Jwg z?aMlcPtE6jUx((-z4OwxKx+2>`{Yx%EEpe%p-2f{d|_xk)A~tzwc{S}vkF_$jTG8f zayjcAO12RFI1y28RuseXUD@8tMu#k1_|tRlF_WyzaS3#_RY>6_=~;5&rg_ESy^+u$ z+VejmbzDaS)rv;&5y<(@u`5z)#m}^}-y^1H{z(C^)7Oxm+`{LU<$pf4=s2|-A9nu0 z3L2H0-NiNgGdpAIclt#*2*ai0!MPV|NPdkORgQ=Ahu4Qp?UG7IK3fWh%a~Jvo<|lj zCE?GE6~4OY5*ljtvl=ba@E^qmTxf$}2Q!;UrbZ)XKP?4Mb@swQh!PjM`v3TBj(sO+ zY!Zfp=mTLU9Ec9i?B23Ufp6S`D6JtQFMMar?5~sLTGxJg$NIL|$*tDE@=4qbX-(+4 zxa;qwppEh3fl>4#c$N3YS(%9x z!|V4I9z>%AxzG4R5BVYbSC{SA#84c{>9^B)=&@?3#P|J(QGT%3zDXV0EJ&pfl&tTiOMR-}7$Hbh||cvI!Wz?oPT zY?EQ(j}d(6GNZX2dV@RW zzR&+!Fb}#GoHP+m%r!1@QF=$$Ca%=CQ^36^QoAi zf90fg6}hbivd9_O=GJST+}U!yGl>-GG{({TOr@GBK%Wvo)w4vvibL8d@-_z^DK`^W z{@xgG~NkN88V)U3|o5) zNisGneDQN^mcCI`P#uD!a-EqaBgR7+eB{!|Ryea@{d;$J4zPYxPBXiqi1J`8~xb6mapi zoWUuaHN-aj*>ZM(&s;f}_0KHIPIAA1Xrry5dnmxC6+PWTeU?fLHhoA+naXoo*8 zdIJq!@;=!OpihI4tFR6KTEK!IR$8KR^oOeBG&Nc+g1!VQ7+tYGUTMUdbs&(?7GPV@ z@CbINC1@n%QLytE^1H&&(!rN|76?apX761xPm41I!e?JKO7Kh@0`1yqTfi}UvpVxZ zWvgU`2&S~^y}#G!?50TZ%im#(pN!aKMH}sp%f*`ot>g~y>P-|&379zi8hcz8cHEcO z)|f1FEBU85K35{C>kzJiO*y8X^e+pBpY&o5|1cmfe>CVicB&CIr0*LUZ`KHf2#vBm zu1Z^%h)Q!zZ5m?ny>lEj8WWsBwwzT>zg2u{qcQ&o#M51NrOlL(*EWTQN!q>p(!w0$ z!#}y;LT+>`5#BQny=Z}EU&r38-Imm|(5u-j`XJ|X_{}MsK@=6s$D6M56|eu3AFbns zwiKV|JEZN&+bml?OWPp&WoIj_lb+#SbrZL0X+u@Y+uOgM=F3=whr9py zrmU0(y;G|2M8-Tk=}a{%@hA1i5GRqvoJweyY(;L{IL%*N;ywKyy(oFvsqH4Vt7P!r z_WDVeV#m!&a@s-gaoa7O&)F^eCiT$G_k%>9^F(ka*zaK7Jj=lIR^d<5z#-#p9+c-i z4Mk^JTXZuH$tq=QAmJ%c-u}w%^ESO+x{mo8KN?km*6Q_m*m&u>=vVdh&B4<3`v5mr zC!+U`ch*vZ=X@R0U5)$&^vR{)`q#g7(6p6Ryx%z!HHE`HzO&f=RH6MA=Tnyzk`f{}oMHXsJD%{7#Me z9b5gh&7!Kq+@#c8|K)&rU9bLy%sbw%OX39|P7|-*Z(1Tu=ZexcCZ9B*RqAyE1wRKo zVo};U`{2vYnEc499uQM;cP~7kmgGct?Rukg1~L8AdCtCZPJkU>wEkX9ys?PErQ*ui zWe=fn5;R=L>(jm9L@gR0SlMNo{OjSfiorK<*Bg#}RA>P~dCa^0r^*!noa?SO71tD& zLsLL`=22y*xjsrxT5AgLlI_`R(Y%F2BROc^3f{S}8WE7lQh@myU)4r0^Pf~R`8d$y zytLaAEo}VkadeLIc4!iB=QlAiDP^f~QY|y0*Y|(Pjpf*G%6D%w`{Yq3Hgn~QiLp-5 z9Y5q|LAvh_9#9gbtwPJR05=IuUlfn-yy&_t76InJ)oT^ZP4QO(Z~iy}VHYTOrwKR$ zE7SkfPyUqDU1`%#9g`q8LK0@o;R=hyryxJCc_^l^gS5Aw_CQEjU zBtC@B0$lG((TiVhRoCT)-qTWDs2>(U=sTvw7Xia6Vw&oQ4{8F+k1VL0M(mp7k9?c& zRhbTZ_?}WpMC}Gj+{(}{z59}T3*4D(^w}zRV5%4`B@dY^xpTKdb-2NSwN`UJsf4Gl zK{_#yzi!F9?oa)mswbX#=PJO#UnB4v<2KI-X(Do_bl?N_$jwEPBj)h7!&xy-B1F`9 z%a`an&8lbKO+I+4bABlwUmGqw@Nyvo%}XgfE^CTsegn2_uKDGQbPd^j+SKFrOLURy zyI$Uuly~kXu3inI_+6O^JwB~g;nv}-8RP!Gv;S6sO2-*Los_#eIolgmg4ImaHPWB0 zs-46AF|LF*@>OI8lz(uki{m3Gi4$qa#qh{)L$n>+J51N8Qfi>`9`#qkc6N!1GXqqO z6=@Sj(BY+$VWKkoUR#kDI;fU+KSNs2^NY`q8WzmKM{dHS#Xc36XCf!OESAW0oTrX| ztC_&U4Db6rcWo!e>U}WYm1UcS2{9QolXsn2L7CM8;9Tg}yKp2zF7E&BoI}r43i!qppU*wduz43B@N@k<<~pnlX7h`5zptmMFRb2f z_YBctV>=t%NVr1s3ZHc9e-_gHQR$#Wy-Aeaz>_PTmd)U))@GL4(iIL;M3S&`qW9nq2g5 z_MlgFUB{10nf|AC2YvcqT^;EA>AM1h@#SjV;)-QUfqdvQY|^%>b(xxe8p!tt$q&*U zqIb4?RQ5yUDKNCR zb4VF<+0fTBNKM7?xtwQ%R4{?>?cGK+X`$aMi5wg<8@C+J2zu(*|0|=RjY6A>7nwIs z_8P&d8tWpuUC-L;H|T?}>2-F_nL;4v{U+a2d{9X3LiM?D@S(H>HG z98-U$VOAJ#^3vsg^&L5P0Rv2r6#5|zDuBP@zE+WPxQgtv;zf7uxh`(!Z}rjQl=r8- z;|J}TeIQop*G>m=I@sCOY0eiVU9b%shgI zj7ap(qeIO=N%rbV`qHBG?@(NLF)!8A0y5*~prcnE1{v0D61Qj#->JZ2J`${2L3$M7 z^rp+i*AA5!t$;oMlV@;w*R$*4HvT9vvdIIO0EL)|bmmKNzN&dQWwK(I{Wnn~odklg z094inmhKHRCuB3`^JiaS_VHmOy`jXJn+e)2_kRHQ8Ew_@B&A1(`RSWu!|tA=%RWy! z#dwpxT?1d6cgpwmCHs4wRHm&5!p$MG2UUF7+v`pF*xFe;(P2BZLUYbnJMkraf9EvS zp?1sToxL*G_h+6GFPiKM@K4Wd(?5I77CUQt{!@ z&TSyF{QNxfWUa%AJjtNChGP8V3wA=n@3~e80x^ipT4k#%)f>-$It?u`ZQ)jN_Xm{Y z1K}OBuiabTHFh~#BvKGAPi4CeXK=V&hEbxQK& zMR}J>WXL_;>oozpKHP+J#B!6IC~3R9OyX`c%S_|1UhS^oH#o(1&-y6G>%E0w(JqBt zs=$kbDb{mDo)pVrn%t9vb$57%Ap1baMxy}S)Bw@Dnkz3*ez+q&lm`(qOn1N0%zli# zmGEP97M*)Hw{v;pdZ5?6_habthBeoJz$A#-j=}E5bE)v~gkegc6HwxDnudFddM=>f z=D`PImERipBD&gdcggfr$hZk;O<D>9G2I%; zaM=Y;eM`FxE}yl93SBW5ER?g%z=O>qxP>7pdLl1qi_k%_Qhtx|J&p4_jh^u~DAvew zKVk=YTzE>qT%#dd6IAqE_grJEiMX$hrw*0z#|CEd!KD5hkN4`Vw4Ud~i}i_`qAQb< zT?yfB>+O)3^^CVmFM~cNPj$7dWU5W^Oxtdo=Ckd5anIp0Wtxe&LthmFo_MrvlDN&~ z!vc5AhMczS+PG7VK*3y}M;krKt4S{|nOAcNcMYwW*xBbuOSIXt3!RKboqaL_=Z-~P zhjiOW+Sz2SZ3X5}yx%w-*kBlhS0Bfqju-foon=GL>qUK!gf9L~wU?PS7Ks#e;e!Kj z6}FZKI_J}BmT{f20q)N3S2Y`|FG4#~;#c(EohuZTI=8%eX%XW|enof1bzzr{A%gcK z%*Ft1`r3u16wrEgpZRpM+(Ytc?&GdAf_8riDfvaWBwDp{JIizBG)Cp6&^4 z=zZh0HLm%HdB2aABW>K~nl)f^z5zvb>*9}Jm)f~lYG8wjTnv(syDM-AC3FL*b z?^4!L-9v;yeQd~I#du+Bg*D>@jJ=POreA}sz8Q!`-p9$fD;Uyzg`XcTPCIHrfwoReLYzFb_ z^yYwRvu=Fqrgxg7k;R+5@CQ`}Te*E)URQE!7+pQ=PukCR|N0$)4YC56!?YR5B!8hg zPm{IP=q4VW+l_3NRQ%vncY3E+4$B~}ScDke#;Vbxc7<3PF@5dP)I|Lr&osel`vux^ z(+UQ2b^?=l0OG|~Y<<;|=ANp&;Mw7H|7s!DdeNx74&BG&ez8`+Y|QI@Tx){ZA3kw4 zF98ho_oh%En^t?Ij;4P;xyKf1mCLgva{Y}Nq>qvG7D+!M193flH|23;#q_t#jgoF{D7h-|HGtjkNOYwB8K0|(l#8$NDb)+d^!?zz9C z(bppuCeM$K1OIzZqa3ofX8WdyTX;!7FUoE21pnQ9sz1T8r0Tob_Kk4>n|kxjAQ8}q z^N;usxRjtGY}bjbG{UAsvzmxTF%t@?3B8)>v|=pcSvu+m&m_1yiR8QDS_lDrXh)3B z8oQe%GqDEEbNXCxlTeYkv32M!Rzo5btDHlT+-DPchXezDkL%%agL;fVa1ZUNp!Q?j zXjS?mdKb7tv&BgjZbmN$FzQw}%#iT*p~V(LqJMandZ(`Ix(VD*LFr~QZs|i`1CyQU zZ7cRn%1n1O{p$&KfhkEO*}8Y0#DKo4Ro1gb1-#T0nTJ`uWowpC30L}~`jLxX)^x;E zjCj>+HEsqRO*wAfM?n9IhMndf4OoVkj13s<7W8C!SGmK1B0^2=Ucy5>4a!Oa{j8mW zHJbT78gLSS-?MattkfXa!KRveg6{Jjm|S60EU1Vh?zqTu{zR|UNfwyl$0$Uu$)HkS z(-^(mso*;2_3q@jv+B&ykY$k--y^5fG`+rt0+-qaysnd~ zMSr43wLwqz61}^?&$6f2{iPvU!jsT@X5*}lH6g7PbhdE8G#%Ci^4*mS>+Mer@MOtg z{j-)#MPzd$4Nn=h_j*7!z4J;y_{Mg|k!=-6U7J_%X~XYpa$n_pGo;(be2eX~nDZ>U z$+f>s!(QVl-UhqdVIJG0wS{FAttK_}t0}uP&U$N(wE8BcBThLKkrXAP(eS6N^mMsnIO^WKQhV}*h!DB47RV;sZAcgOj8=b}&J5H~ zLAwA{GbA>nmx5>oCv@e02aFM%la1x>H7LvBGtoL^O*T&9Q;)W(35RUS_lW)(k!hNK zh!Nh44UQM5(X(^_0gn%I5L5759x=sGij0Nie>yEE;~{@aGoB!>xba+MrPI)UEV<01 znX#wc{sS0g8JpX=)t$8yy7w#$MyG5#jR$@pfS|0@(#=_mk3MtThr2I#MkjiiPac%$ z)gT5;Fw6x`&_^S1$+!lF-s*(k_7`>?lHm1AOQGB6Qg)=9I|y_DN)5V6vxthB8<*e_|s#9b{deqV_rxw~5-GsMB+c;(Kh z8n1bBM2RQhuLY{QdSWys`^lk55k;v9!C&=BZ&ZcEcuKaA!^u^5XQcGy+YGmW70qF` zPiudJ)O3kE56au7z?^;Q4I(XWkTW8s=)7wHubM%hfttYzE-2zv2n5Pg^@lGE_mWOy zuy+^PsV95A8En2PE#^HMK&Nx|Bbnj{nL~6GP}EjkV+iK5*JlggT-sY8J|98|5tNNIy%D81F`ZQB*dZv>s z50zuLOI8*{7RPgl`85pem`Ix%1V4XJb-z+i5XmauA~oR+QzB6wGq*NvA0d|B(+t7} z(0=Ylsj#_6du=Tm3&8KH((jH?lzvdWD9($H^(!`Hn@fkZvOfzR5-SkFGXcQ?En0i= zDDysWBi#knjR2TX0LIUD?EWIPxK}DKZDu!5i&thqS%~O9i3(-(4>lspxgO^_ujqJp zrt-M{Vrshn;tuo2yU)x9br>nVhOBJshv$i+rTrjM6YGnc;SjaZ4eyv}Er$77ufA2> zXTQ)VVSLm?%JeJ%RT_Vq=en0)i1hoiWRpv?|0$WPW!|l`o6Cn-BFl|!nd|ddNtZnB zqIf81WL}yJc5x4|SBw455p&SaP`KM;qmco&{3ztB?O(0m0^~l!m&YW-;xKept&<~6 z+s9>wL%VgnC2mf#5E9tbt9Mr4kwliHGkFS;5Cif$Ubu(V};D6_!a~-wEa9wx7Mlsp5ErYYpnvBX?{kUFcLWn`wpq&gWD`n6aFNhaL*N;*EF>Y zxxL1ukl=ei?;D4miYO>BZU$Zvjz7X09E03A+dD~)| zX0AAN((rfly{f9yv-@frA~rs(p6Z|n7f;ltmkujw`d z62e*sXct^OlBlq{_iPvcl2onL$t-9&c&XVBY5ndfqZnagN-J$v?SV<+p??D}6%$22K^wptzy?l8qmhkSG@eTMioS5uXj4gvxAd-`hbYN^$t zrjmX~l5G;Y)2dGfr2(@z6I71&Rr7cK8RG9@xL1bG1LT$zV2h_gYzzsULmA!42SwAXUD1Njp=y-bMv#x z&oxqPhVGsK`$;TL&}y{O{6sVOzz&MEaw2a%Z=LGghlXc9#HV7VLUZZfI~zEOgNvl+ zyVl}k9BVyl+B+}gN@*xeTHSU+);#pwu8-nYkR;y2_j;$q6uOGG8Sm7jIG@Ok<|Xz4 zG)(X5OcIyhs`AE_y-DqRffX`ihPGs!qvK8~>6_g13KUFbY(N?i63(2;ZGCGg;whnD z2y<2-s8qfZO259&kZKc@=8JjYr*Vw350N@X3FP>hO5)s0ZYg6x*f{?z&S+cZ{L8<$ z_ld(!GKKsqKO+n|A{dy3H{Extf=`K9n`eHHMuY{K^hIxzX-aNFZ&P&VOoX9Jv|mP+ zajRePsLl{=&w~uMRR0%OPs!9Y=vnn5WCfQF(=3dS$aL07r6u1lFU$lnJs~}9qBZ5l zW!JdjEPx&nD&f&y66}NXPUyCWO5urZrTX0meUHZb%9%BgI+eCSE>RJak-z zInXK~v-4vz1{V^@g8d{~??n3z8tr7xKd5XzRz&aOqO z`ad(V@Kx3}c#LI;uSPGWQgIei#0Dud_t1WuL@J2jt#;>LJ5o-Ma!DlN?$|I9(9*m! z`}%>!Z$+71EslE(TcaPy{y9~F5PfN4`6(liqE%V~KA6aeT^C>8&%`1cTfEK~7=^Ow zCxNk@&D02*Yu+H+l%@BX;dYX&z1 zH8sPbYIIU`#>3&6tt_vw(R4pa;JXKGpVnzhAF!)Sk^vmsp0w%O+pNT4!vQH_@?yI_}OG~qO(aahxMVT)ZKDAs8k{-_|O z>UHmB2I^Sm&N~`Xp`zU{;SDVkYb(O|Z#jm3uC5;Weq?|j zYiw+zL?Q<(egq>OxFbXq$WJs9&O5ihD}<@+5u_y;>dSWUljGFj74w{nAm<%oH)eP8 z#{A@3izJWG5>;#Gpw?NVIi;yg3e8Ys5g{drJLe2;&hPDJ3>)lAtu(1|>dPmu5sK(6 zvmB$u%kzxni1X`0WoCzb3myRCou|!SslNB@p>TIRZ^kr=L_F+cfB|0I`8E~FnMPR) zFtEH9Qp>)jNSXrBoL;sU?rSxxo$BRzGt-^CTK98bSV)fcb5he)jxJy(egyh!YG1%S z-BF>}ER>5huY}S?yy#4Qh8qf2MGRq}*Hj0qHn6bmi$&w6dMis#7mWj`l{JQY3 z?@=9zLg|UZor+@s`k_!yzT7JJt{ekH**vni4fR8Hp*YlYV#{Rlq&xmuJs5qf_u3R> zc}j1WeczapDk_p`hT_|2kBm_{+MHa@--wl+3ihYw=XeYaDgrIR~k``F!x1rJHm z&9s(qigN*ZIha-nIlfqDJ>-n>tVwt4yTA5?KAJCQbNiNOOy0jx%yq|MeA>^f&l3Vb zy^lak*p4TZ=}lk^(0llo2?yCnWr{wQP-v8b%FClaI&OJZ6iWfeVcQ1u2Nun&&9+G^ zpQ9`Tc-UkR1Q=3+7;Inf0xSLYk6$ z&qS4Dr8V&jx^gh8DmZgql5#}YzdnMP<)t0T-0g}9tMW|tL5RTBHT%?gXKWJ; z)n38;gcUooQho z%#psU4@9QwStkc%E~1~8^GO{J)pmSBg!i}jNe$T4lZt(lbubH6v6oEj^aM(p_IbG~ zPY_uOl~Fru24<3(98nfio~Y@eV`OsMS+1Tsvd5=uu{M#*S5wr)@>sDohkk_bj9`bY zwvW^oZ~HA@hvb^=cL)X8^Q`%#IC4DNWfQM1^Mfvw-fFRLDF3a5o*oWKt%Ca27L#~a z3^=(^*2e8&J|NnhKH<)@S8qiUvJJznO_Uq=#&B&QjFza%00NLN4u zUcYm%N-7OlNN8n$Uj2-A8XXiv{kz+{hwYA%nQVw`)Ncv9bJK7mbu%(gf;i=9Y9VL0 z!J3S8b2c0S2nEZLdFBmBklE>uGC0Ditf;fw#Ehn(VEmge74s{#E}w-PH-(3lQ!w>S zR#M)Bxc%Fuq%zTbqFgU$tq~AEP8#2N9MFQKsj{e56y&3tV+<9y*Yr9Hlg}%)!HB1g z<|pxF_({q7?{D6fk07Jx3Bc12CpK#$KRMI{OW0*auT=Spukgn8RM*r|SI`hba*wqcMH19R#l&1TF7`3lS}=ge`21I0Jx>ujbK1PxKA>KD zt?DmqEyMMCgA29{zj&bum+wXK={2s`&=BxeA}&UjBNL<{k~uHs^s$K-_NRgq*NXt3 zOPUX4cH3)|^VdJS*nHdHnrM1icFk;|?r<9zrD;*-NZWi7mc6cz%nhu`i&iPJ+5RM2 zNU_aAZ}nS;(bl(27uG!~EI_VbZ>SA#$xsteRGg)MFQNlO^)(VKm$b_!^QL0&6xvKn zOc7TZQx91#PSz@TE)e&wlS7{dTlupUl`hrs>Hh1FGc*vcLOfPnQhV)GARGwedn>y% z)|oe?@2tY~=TUi^G`q6_0~&?Cmof@{e7PzPSyQ_R|J=!k)6=qF%kpr4(7fM5)x1B0 zcl>j~qoib;4W?h6x_I8m(zqQ9*o@)Jz2QjS7u-hBMJ$wm-3iIB_7Y2#X*3~R>x?ZC znuW6Qxk`+wVwd9JLx_jx5BJBn^cXIZ_aNWAEhd1S@zRBX}im1>ItyU;*SpsmO#Kw{Tw!4M8Kl{6wP4u2u&Q|U-#ar9dK)=;wtYfEuWNE*{m)t5tjzk2 zjJNXa-Pd#X+GLjb;ki;j=%g+(M*6L$^@tNtw74UbQpmp5whcQw;XHof_4#BLiaJkL z7bJXjrfg>7F*eik7-^Cv?Vv@hcQVk7V6a>J$Cy(!(wp1M+w97jk5|fw z6zRq`a*vIv8tWk{Z3BZk7q>;OIWPO6H~!?)bn?n^SRPFI&8EJ5s)9B^$4qp9C{>Kv za*LR*H^aPp8NU|(a#uvxVgdC!IIvd~95`uPo}BI(hbagVy~i-cl_Ty_$@}%ZHu?>X zK3mXX4*{l|=$4P+UqKX%I{1+2f^0g|otelk_aXe6@n<9j$7kwb7Q59})Ojh}kEkfN z;AV@Bi&l^@R}SY0d#D>$g?N=@^nQ-F%LMT4xuP3T|LE|OU+d~+>{>i8c~L?~f~98` zzI`j?dLq>lSG&Qnb0IM3Xn$xS7oXu}x=k+4>%5!}~BLIwD6xyb895ZK`&h;$lA1CQfxx4WW z;kYO$LU|El-=*SS|A?%VZ4RZ%%MR_@yR6L^IiK67=xy~x_Cby|;mslDe=Qz4%V9yW zs*=YoLYd(n{^b-^A1>%;OzeVnpeM8dTCpUfuEk&DC?6cMXVRyhV{H;38Y1|qAhsXK zn?wQtU_{AdwCsudv`ap$n5y&Q=1k$;-~Iq4t*}xtU{jW4^3XdZzpe z@9nB;B5X`znE-Ti*6E09r>A)v{JeaY6g?E zfbF@diNr~)DZyq=y%(0aOouUq4$znhXx_o=WbFB^C*@u>{*nTwPG4TLX+v-E7}&K@ zdk9SzZ#sNf6F*T;K{g4_F9`Y2QZ7i9Z^hP+VINBe&k&Nl8MYNB!jOmwq|m4c@!pr)_lh~(cGQcH=2T+izDD7 za+ni#X*(SZeJJu21|X;TM5Ci?pDCqqUvz!tQNbgGjN03IO(V)|+5QZLzX}9_Tkk() z?m?N>lcERm@q7N1?a4pjE3+g`?xCYAlcZZ(lFtgE6eT9re6bYF^>@R)`gj{nTK{!V zs6YLc7^}1nf0qgT0oWp>J2UIf0{i3$^QRvTalUd&6aw0Ng6u=sQaqO0l!)8!83YS* zH9oc6OFU#OO_1&x?f_u=`sI-d-gXJ9?L*~>P-cC3cc%=GBboU;cL5vSdz1Q^H0V4A zTaEd!*4E!r7n29kO%4R;BXVryNg%3w667IdnC5-3#SaN9C z+ec^c#W_Ix%+L0uHwk12*N=7>h;%4T5QOSX1HVn`v(lv(#c#$ZI!o@qstfasf@GoV z^+1X3!17X0UyXW>TxwlJ_bcKYIv?{saZpDSopV;i$`tjfxANOD$c`d9#c))A4vBsr zQqSnU{@884W7*Bs`ue%DQ~z-8af)i|7yNI(pX=ZB+nbnnXC31mhniSm?FUCZ4l&qW zap?5L*Dp4Eh}xx*K-(L3#inHY8WH0;bg_Mfm zZiFF;WnQ8eMd<)oem{Kk6Td`7P{b@xjiQD2GBesjB`lU=OlZ5B!+Jf`tArps(PL%t%0L%sy5wSM~>m+V!s)g~{d)2BwE z{y~q5<6EkT=2PNNha@O*xYkLZ>(WoE%$D79h=C29onLqM zgRm5o{|RVR1Ovv2&Hde#{=5rplQZ?l_`(Kar6O=BxR|OC(ZMSk|Y!q{H>^YUPC_*~iZL=;HZyV$Hg=|1Gj7E5nD9HRT?GO(GB@x&uuMd~#?@-t2_e@PB$BV(z_Y!k+wFH0Z!S3!8&L&_ zL@~<^9rIiWuCzfX(m{Yr9YH0zyv{P5XJ0q1r zA-@y9#<=ZJyE%m`5D$=Q^nu!SG5DhRS);61isa?jcXp_6@1Hg;=V$GNC{aMwLpYIK zsxx&mrYECut@T(6>)2BXH4cF$-+wWwU<%NyiNfcD>*<$L{7lzyvGzkrNDSZwK)3-?GA=ek0vN$APqk|3b0S2425SKZgcDht%lUAoGsmJ+HXNY^G z@8?V-ncUIX^N>obkVY0*C=^ktvMl&%k$DA+-~Zw^cR*v^NkA^gl;7Fv`n&^3U5X|TsD z%6a~vV?nYH*27kd4t#tBG(97chE>!$PT6u&F(1iF>v-7%cnZAc%C=u$OpzoH7iRv2 z&vB8*PwLC^Om7x7C)U_fqb<>fAL;3kR?V>`d3=Iz0!~ws4QjlmGG!({toNJ{0Jp3X zk>o?TI2_54I!M=w-&xnBj8a}>oOPLc)4DEQvwi(SXVWt$S@fS}U*O|PXL3_)vVt4A#RmPH ze=0J~CVzRY3waVUyT?7vnUlmiUZ2FB#hLMvqzE#eKG2zbEsgJuE?;`%LQx1lxzp9e z)p!Q^7ASV2(}p7Em1uz8h=?cc9rMjT`;4*wr8AB+$4q$R{(_&AtuNQK}Hg`s)rj4 zqIuSX8Dq*1ip^-0ZY03S;De)s&yK)FhRU}gCNtG?3A4avQPZF$0jx>`h-WpWM%eY0 z_?YKv3cn>?-4iAM_}=J#KUoMSXpcu@AK5(pWP*VzTL`Q zM^yLIis-mZLq$=^ zCsr(nn()Oj@qZn-D**5GlXZ2FvAeGQ5;I~l$BlAl+gsj?pO0ue5%PIX>QZiG?v)v4 zA27HRt1C0=u@X!gL49zu+N{f5eGvAI2zJf3AhLH71{rQn-~L(rYsj;oGiUCyT4xee z1AJ8%?{?46hx2n5`w((i=g^(~#zUTvW>*NHiTUhBZP01%z6FR{!%P{DB|(?PM(LBP`L{R% zm)iYL>^j71C#T#M{+|Y-fVWp)f-=$zbbXOpAv8A2?K@Ot;baM9`JigdpWnS)XO|oa zwR9lL(yFmq?l`PyZlcz!4@#TVKZ~rhNq@g``INYO__MA{Bh9H)cv4jysq%4oDtJGv zTUAV@2zmmFp6@+@NqXNg|H1on0KcZHIRYPY+$|T0w>k5XiZl9~J`ilBg=B1GOSu1B z%7@F8R|I+dC!TC$2}CJZ#%8%c``$Z2N?c^CP}be;K@Co3hMVmZ`|d`Ah%sE5fryuB zYE0YHP}0%Jyg1d%&>ldzFo`eF?M!Kklv}8V&F_jfadyw~I0!v&adIN^ z3(LXOUSPV{Yj{tD-{}L3aB5_0(KH2&g87%d`8m$C&F}ybB-ZZ=5N-Ni8;_50A8TXp^?nZv z2HnUauG-o28lS->W8}5UReos0qpvt9X~*Q;%a*pE`Z(brNmLw@46#i%v?Hc*#c^88 z;K4?%`G-ve07Sp)1mFaHbtCTO)y~Dt*bBIPva2ZM^y+kPa1dL+m)VLeEq9`?4T6^D z`qfqh=8&7Nulds|i{=JsAN|+^XeZC~pAl|khRyhW48Y~AhgOjH!C9#h^~8 z8Ug(4jjCW+n>Yqo9dMQhY@=?H5FE*@a8WJ)ggLVd`p9#jGvi}HB) zHk-4Zlw z#^lpA0S)e@#XOgJEB((v;gUd;EbX3Eb1jQC7}WncC)Gf0@`+vI`<*KEIv~p&nJ6_7 zr1f6CS{KrB@_i<0NPF$cQmIpTdjIZC-@4Y$D(}$1kqPg?n~1qrZ)jag=WE`FOoe#? z^CkxBJDMV6Gt3p|2*tiB(wlrzOlHqIf5!r%{!>C0c5NqMwS1nU?OWS=B& z(y#K^PGVon$#cI}ALP8nDPS4wl01gt=kY6%f``tSJLsl@UWDQC-q-CVU{Kw;gb@A= zE7+I{bx-dX`w;XQkFv){DO~T3UelAU^`F&&$j{ThLHgsQ^j3a_Z<-bSF9zy{8p`*>}l=>uBf($I}%!|s34934yGI(37 z&>5;-e0tKl+Ir!0<*WQwT+5P?gEj|}EjWJdJ~7uk;J zG-9{%W11uXv+$YkIw!5Ti|y@y5U$IGT*x;TRqBX0kMzwX7rl{Yz0L0HI}h|Ns1RL; ziaaki8OH|>f8vc26r@b61H4zy2Lvmt|7XwdsI0WtI#CgTB<0Q7Z$ahZOXFfok2QPW z$_Te=9j6y+S*lzAQCs-mqR>Q$v8%H`pJ)ojKA_NEB-rt!PW#vYEz!(pmWTPaYq;8u z9jikZ)+^1k=d4+tE_fpNUThAQsxkGpNCYo5yKSZ#J*sq_s~?<>J^F%Q!N8$piQw}L z90Aco{Y2TV3{juGnTgBa4q1tof;o@$NX)2bnW!E<8dauqr})pclm?fw_jms97al;$ z`y8e;bHR}ZX)Tr64+=gz|*iZ^GW5tAMGx#9D4+%7UoN2Fs)vcgh0=aF~9 zt8U~K8~=Y1^5wCvB#B<1aD=@P&BLF1QcyFIA;Acm-uSR!d*xdIH3OnmlV7KiRN}Q(^N8dBc{Qm_73ELm(o$ox5@t-h$Z>)Q;k&#g|W`OB}c~^oLvKGTPI)7Z* zwom1|Q1iN8j2e6zTm1pE=GJ>(`a$K*DO|Dff6;L|h<*p#8dW6sU4|fTol_NZwL9J9 zXQ2}!`8Bw4Gt%%tcQ;q`tz;B;&PPrc4z-J(U%#^a%*n)FGW?5r6hRZ;LwX#4Zm(rg zU+XqB0lz?+dd3T5x0&Y>#P~f~mpl=O-ZbHPm~+$Bt9r4M<(qtksAZpd=g8gL;iiWF zcOE)$(`<0?<~{*=sb5_n+x#Pozal%#9du|!#CV~sTQY22`@i6ryT7k`y<;%m%9}^8 zQcp*8^?zX+IjIp;UnKI@Oy(}zN!>`vpvt@$FXZ%_<|rLHO7ZeW_c;Jfv3A;Va^3X8 zvExaVJ+({ArsnDZQwUAtVnfF=j32^(MWfR=|3;=*{OZ58lDfS7pTiUE|L1P2|L1Oc zeJ0%PabTdjWl#U(6Q_j{ZQm|=w~n11UA>TA;Jyu)&Je@Xs+(3Z(~zr@YVX~~V2V=z zxux}b#sAKAx86OGyZ;L-X-P~wjTN`pA8KJTj>kmSrX;)n=fY2J=X-TQUn_4w*bxaE z8ih`5?m@)7%S8;%TJdT-cRHP%V-Cu8W$)R12&1TAV|a3`J_~MijxZEhS#vPT{m)9M z+t2^<2RiycC&h7-oEO~XP_uSht$)ELyd8Vn`7iTijfg8e{P=t%7lHR+{5TqwXpOH(g4l`U^dO6LJ7coal{Nlhrz|0LY2I;$|DP||0W{4dZQ2$i z|AQfoQ8KO8vwm^WEfllAjkVik5N$ce4*s7lvSNSkoO>K$9Bey3Td3_c_=5oX_Voq{XNi zRsYX(utf4DFo$MTSB8B!!Fi{W17Rv`QSB&6n^8byW^gujS0(2T=O$J;vrFZ2C*Rx;`*`zdv(FChs;p z4RnX)U_(40-BEEjFV6}YYf9rukThdM!WTYKCUej~?y%iQyQ3MbqB6^Wm<<9<^Mz`3 zBjF5oqUXJx+rkuSb5wCz=lu5uG?zg2osZDR931ciVYFJ{OukPmz5(XC;MYbY>F+Zk z&>zl>id*fiYt$70)X^5Ro8~#0TD{O9!C~`#P~qbmkI*M+Q{cASO*TkC+84l^umcxp zOU&cEY|t?V2;-4_W3mxPAMGy3v)s^Fda@7Uxr}qi^ZYlW5PHFNfjxCBnbxcu!@k_5 z+tswKq{=H{-hy{URnw0@dwndhcG^9xEK}_+MfNe`mU}DgptJ-Uo6LeIW+1z#NAxp0?d}{KZ{O;jn+|ZH)&*Y3a zA-f!U6ku5wX{x)1b*f6s-*vai(d1G!-AF_qS43M7FP8#m7AtLNIgdG{dCnUl2<^+y zA*xqZwEPeE$=|+SFX4NgyYSPZe`L#}66djwD`o>}YEEKu=`}Yss;0%q#Of@NEuWL- z6K1AQ1;3`7$(H6L*y(k8!%6qAL-O*hBaYZ!_(+?KOW@$Okwjcqt_98Ox81YcZXUpi zsL$We-%ym6e#AxV!_+^kfj17JjtRc!qR&hl@KU=U&oNOcDS@lITHEoH{^+c zh2ZT1gT|+lY%1?9nzUB zFs`(b(o`;3yYHrD^J=n}pI^TkH&DcJyF~5XOT0><kY_Ephci}V>$~gv=YiWt8pu;_8 zK%G*!U8$<3o_?CWdj^?CTq61uV;>In@UxMNilqK9j^fkYGjA~;Utgkztxx{HB#q(w z!|r;sYL~e6b%`*sLgf0E%PZWvVa6JH{{HJ+>k`mJ=}Q)@?$<}(!0Oaf@X+@TX<#np z#)(Nue93SD!Sz(?y8Qt=L2bhBx}f34k0mVo3hQ)$wF6oR>Le1`4SKJEufuuYo-j{_ zC0{nB8t+JQ1f03&h)GS=%kDFq!)G*Xoc5?dIlW0Oh!PLyW&kw7PkY|#+gi-NsD&Vq zwXG>fHH$dbs!zxM0wW#TSf}%;M{IkZ0_IFZlka`d*L_EW1($!zx)0o}twJ;Y->#MX#cwjS+@U96cGP`f~I8wTrm6pFd%lIk5PUn0Cf3}eiRA+r@|*>Zv6sFHne5o zCY_pBL21HzejmMNhn^OYm=Hv_4GqR{G7>}e^u|AaCR#C|ox8JSZeO?OcK{ISuZgK! zdL@V>xW9Kb?*tOv`LYn!dv)z0cFJCFjIKCifeX>y=-JBRtTiIdfKKE~19e0+K#y8W zt0-$^GwJzlo1DiwrF~r?L4%Gv?ZmhPnfE_-drVNjy8U6~yM&mQ?-Iz!-z3D>h*nzr z`Gj2MiJ9Ka#XhD-y-Tc;0)WZ}F4kWuA3X48sbAisIrB{6t;SY2kK=N0Elu%WHowdPh)A?M@cXBuJpEUr*2y{1Slt5C!ZVa1`~6WQVo(;H7s7GqRVb*tN!vnktp z=Ejy8Ou7_!OO+4Ue8-& z9vsI{rQQy&I&*6FWLvAXORSSVueN6qh5ti-VPWC3QxOh->7q1Y?@VqNFD1DZ7VDjx zj@g)L>ACj28&}}lc<5>8RMMyP5|O9XT&J57w1*$~SSQ4j{Y>9zK{r@4_5TO`N}lyf zj+GOXJ_H{~y9k$`f8x3FrRm`dWNYIa!`n9N4`xnyn!upu+wVk^AEG~|_q9kD&g*F2 zE_P#S?7e#3U8h`m^6E2a6ze$}Vl88x3SW3By7%8O72e&{&=w;uiBBvw8Rg{f{|Q&L z^dO`p2s!#O!RTcZc1fqt?2lqo%Rdlnasdy4I{r7J)u!uBQ)~R`28s8lS^|qXU*~X~ z)=t?22)=#5hRX3qiM!S6tbYxUNv=5uKd>>w`g~vW+A5!Y$VFWe)3W+w*@h$1O&-Sy zPUz{xI-KM)Q%)h5XJ*f!-k_pvUF-f zm&zG*Y$8E$*}hWJ>X9Vg^xlOF$9#i%#chY|#G12PTArv~yeS!35oK;@{VH3X2qQUI zQJY>%^v1xpUf>6>^?H}_#e*WnJ5l~A+82!SL4vw}?yZUt%4aQ>B*zCg)*B?y;fc@? zV!~-4_1rS&Pa;(LHJwl0vNv7)f`C4#|9gUI(=4mF>H{sGS&Gdf__-cj$+N4K5Uuj5Of|q zPa+k)kwO1}YU!G-84pH$l?ua;7UMj7SuDZ9qe%{dg0uj3cMRIQvX3;2&>}1e@-x$8 z*1^=ytn>Jt-S7z5-&F~uuBLAwtbSl& z`1fGrqQVIwU$7Gc{-goMpDv+yR}*_D6(7v>m8@Vrc7xMBb1dTd?nAa-bVY0a@EcKn zI>7(7CxpmFpwII)n+uKP7L~c_zsNt`RFUwHTW^xF2!(VpAt!z;O&yV-t#Q3yhCyyP zhalkjgRTI&JjX1T|^n4>)3{So< z^0S$sqBrwQk?g8cxqs}}P%?`nb>sMNnh*rl&r(So@sx;gi2b|rr zNZ)WnsB+dbeh&hY5>qn6GibtjPGT5_2qio>RC5}*TKk1I{DXfaR)T2$2~G zp8q4HIWC@B4}4YR$@mTC%eD@PBWC)Rxn;=O&&i8vU2N`dRS%?U9k98)?G~`uF&F$8R{r{;DE{HJ9+b>28VazVExVCQI8le;(4{dFIm5V`2;}*KvAeZ~tt|GYoXfeT0 zTckI9dYc|)pV5Y0hZ)znvlf3b-s%s@op!CZwxq{Yx<51J=eC(uq$GTy6ER_wh67F)W_Gw!VqaP=&T)f|3&& z#2#jAMw!r7^lwp(yfzReMse;L?k@qHKzKEyz!ta&T0A7O?oC0|@&Va6sG+6G2LqZV$g_OY z(r1uGddT{Oj8pq7N?qtiX25yQ`!K5KFq2|LE8kX`OwjT)1t6C>XLIO@<|!HZdx|bn z+=T%7Kfg)2iq4G+B5g01;KJwGu~zE(1-L?Jc>G%~b&K4cXg|jx=W~K_a;UBbqGch`ms&HrgY}HhmDgoZE-H zD1y8NQWEcVKt}Wg;=3s0{Q>0HETJbV7r0aqq^jj&vVYA=5IJ74QgD+LJP1NQ2aDZ* zS_c1SB99ILj-U-TTRm1yfhzX1Ro@{R)o&2WP_Nkr%9NGgq4`Vb zPZAz*JDBU}J5PT|6Yr;Q^AL9zh`^4w;$l_Z#w;r~w>NfFt#25#@t1boHkhj70s&8i1Hl7n-L9|RVgVYv4ezk*nqc{YyvR z&YAZx?f8ZT_l(cuUHq%}zweA%R`Z%%rBrlRW?h9#4*AE8#i}+~$F(M$W&5^rgy{g- zl}DN!g*>dhICVEYoUmN4cKPAZ3p5OsaVPZ*7rDE7x!4m(!*JH4&5OlTy&J?3UVRuh zMu5I5IV7tyU+nnmrg!t%?r;zIFpoaF0iCmi(0I-ER80gLJ|aQxv5P%hz4Thztj9rp z@fbUrS(Wk+g=L4rLgt%;>GjYOLqHhCI|wj=ETyOSzmFgG#~u<12V$dlGDszfnw6?K zj(UBhs?s#3&z%hLcM^}#I#A5%8~MPCxkGSN#qisuR# z30{iRi!|`#H;Ff>D|!_cs^x;i+*E<+} zZ1Zz_bgA%}PJ7a)I1%Lfmj95bm&0s1UiJ8Lk7Ug7CaOsd_`XE%isI4L8OgA%5q7~zyShH zsmvaMgcL0BzRYx{QvO|SHOb<`2@sXs&q1)J=d$FNpsnnH#L?kXkW}vNQIG8`GFB{e zQ81F1&3$9ujogTb1GQ8*kQ0Ll?}}7VCur`YIY|C3Fnmwgj&XN5se0BIp=qZkV5{!a zweaAK-ji=CxCJ=HJrzixE7`2!^L5`;KnN#%_&fWqqhE{C*!A$xl?u|?HXl;(3KO2s z-%_U^$D-kS4^+QBIJY$jD4=XYV5pj!>%jzC{~YODZLWUgAYd_|aYl$*}OXK;ZkPU=?4Ui3sRa=$;%0t?_t7d(>kVR8h8Bw#xRD#!+tTnj?vwI#m zOuLl~n6Ua!zClGOR+5>RxFGXF^}oVo`e@v=crv>;l~~FP+FrVQ{+}=+?Y2B%;gp;L#R&X9g2g8Z@>1z+3OZ z@5*SviWzO&D@}i#ufm?gPJGOewkg_MH$qPYXYHYH>Iy08J8S7UI*rxy>`j#COW@jb z*3$lV7U#iLz$-6srz@t}wkOfs4XO&PhCE_O<_?qI$;I@Y%77&P;H5UQQTqC``)yGb zbAjCz(;O>`)$`HhVsx-unOa%~Cq!eVtTpNHZG<%ZLv<8n?Cbo__S}y9pL4V(EmRy< z+9b(7G(TF&F_yHtTwN3D-{U)G6&R(EuL@flrvMLA+!#yR@`8j;Jj7ogl^yIYv=$%6 zZGdiWfL(}Y3f&%YQh@ttY4s@mRILqS8GW&)lQ$h_o3k6PIG)L2iH-Gi+VonTytgW- zi=B{pS=W+oqtD(~03<(sB36 zID3r7;HdLRIe7i!ORUPEy7)A8xg@e`86IQ~eBCG_Hgr1O6$HG!FL-rSvBu1ivBM>2 zakXQ@Ue?R{>!LACR5KZ>J1d$y7BIUA%@(al!Z0W3_U=XzveTaq{~e7p1u#P9dBb( zSyA_DbKOM5quXg3&r-^6H*9>20P&k}jpjx++iY4B7lIs}Q)d5hd4CN&a3n^wdo8Ne zc*fMD{O%U;E~Kp~Xv*zBMOp@X8DsaiD_j8^*YvlqdWk&=X!TkrwuUH3T9wPY zlBx%^3qv>Yq4MN;0H~^t)lQ8>U590r$3Z0MQHhq`7guo_n>cIC+1>fE`~pilgZiqc zz7Ut+s=iUncuP8kOTohh37G8rMPSBXHFGrf=Ts)NDxFuwYj}X>V^tR}05AeTg{rGW z@SEVtSD(loPYuN66uesp{3A(Qv;O29e8|blHT2G@$`OxkOcUKoKuthXHFqQV?Dl(+ zSh3MpvNoed$1t%{B_3is=dWs4VU*!c>I%=i9J2-%Tw^4or+L?OPaIqxN}LPu&>=P# z`R2>F?*^?=X6cJOe4`=@RQoLRUBZ zBL_(9m@^(EH~$oY^%g0MEAj&)%^rt5`U1G@#%h8K@1q=~R0ztQq3aYq@r6+(Ptukv zsISDmB=#W(@lR^+WaUy@Yv+Q++KKf*r9&TxXwjX z!*O}0-FuU)%2R*$PDmf2-XU*k^M-hhkd@G(EAdF*_(7j2BQ-C+idm3fs=!nsc%Vaw;67Eu9@p@C-{B7etBKxECnvUiEV_ zQ(snJ@Dl-yKi-jP?#?My!E)jd|^YoUapAMFe`8dV#?nKmDRuqcnepcJ}k z$jwVhr*01iksSC=A?u@F(W5*_!Lj*c?iGm$0(;C(!t1r}*5GO(4G9n|a5Iav zKmDr0G_Mhsh zy{60!wYb*y_=BU%g?GVn*`U=_!K3KpL^{Y$x76_0tcvi@L%ymhHMGm3e;YH zfzHX%>!~Y5zqhU{NN?vNtK8rb!r6CH?8XR!b>DW5;=n(lQ7`u2CH;*cSn@1CXygZx zFsfyC15=iw;L$ao5%n`q>lbf*sy90pt;VIx#*{vM)XSqKRcU$hEP5hHWJDk}Ef{@;i^|`qdEIg`;r@hKI`uxsXg4KdsET^ussEvPlP#M77?-AOE=hG;&i>!RB zA-9mw9$1B*R3vnLXuq(x36GHTWqMTD*NH6zYMFBu0t)1#@)D#$iLcQ<;r1&!@M6_! zWUJjRZG?KZ0l4{IRC3C2kv@WO<`lBlFZa~rE@hFohz(3+=bgia0YUL$&%^(IdZ2zg zb$|S=#!m@xBz^&ENBSzf+_`V9Quk8}94SdGwVpUgO2`#Ytp>1VD^n0C0>KMZSV^f? zSot)$j5Oly-z2$H#;~3*oY0dje!!FTa;gyG=t~Xwrby5iD=@+cqV!txfU7Z3iUGV$ zqQfMdVC6qhOalHd#)}ypzg1a6$di6l+$4LUCc_+hc_~!DrOeC zJQwv95vJAwb>W8L?UL}N`x<{BVVm>$boZQ3c_3L5!wFM)Wv6*VH|G(Ua{yu!Sx$Gd zK}vLyv713(OD`Or*4Ylb{2NqX8A*M1>@8Dv4#KoAj}tkNmmmT%y{_985{phiiH7W3 zf`Y3wEURvYA42I~1UHo^_7!WVIFqZbq~1ljmRko{e);4sw>^RWJd8F;oSY(4dwaOn zynAM+DkI;m+|2bcn~a`{cc-`!-=ZhwkPZy$qU+#i_&=QJq*9li8xODft;{%+J25#3 zhmxF;Pk8Dj#nn4D;4kJE4SAP1=Hz{1j1EX^7v5(VNx&VE8(c^zdB)VhfP(u(b{DGU zaR8-153*!vNWC*2yPb{21RetxeOt#ER1FBn+(JxZTNzNmr%OVw3AQU<2G2}RG5~zU z^VI|{2svMi`K-s312W(g{3J5gV<3QQQC)4E{UuPYWHF616iJ8KqTvCSV5{<5PB$uH zUK!tmH?hsxV)R+r`TCE&;+01PnN$&Y6*)5OFXkW@jl1knWje4Epq+V8U&xwF2M~Q&vd#gOX~cXREgj3k zZ~{OyDe#8&&!4IWG6t|T{*^gW{>4nzi)QT^0HIP-4DsEbKv^Wit5rdRJNx?Z@1g1n z{oajIyS5B`(S!XZV_n@gWyh~it-s1QNT*D=?pweCIsVE4xp>*uKmm>hJC=O#3VEDL zTF!S3@cp`2CM%(#`Q)-`K6)WF`KwgH`>ygnIu3F%9W{Vlv>Ct2b_#g2Q8HsreD%@p zOO&Z}yb~L^(Jh&4rh%+PMjf@L@=nFqoY-fq60rvFj0qsdoDdIyt??Eu8Mh#Wf+SB{ zm~gbcskt?EHM4bb@O-U!AN!jw&Lp@m^dWIG%&C#hj4U7UG*D@+dwzxaAruBA-b0=3N15FtJ#e)$^mQc6)mkZnL9-sTje{b&*sII3UjP)!nFGdX^iGnieJu zDB}>G7{^jmr(BTGI8apR5=1EGztAU2_UVz)L`!tnKKRawbg@D1GH(HuBBvh(Ew$<4 z)HkLHY(N54+X!$gxQpOmfW76#xDS|f?S}c4MJlRZF)PLY)C7iFRm`R z9-s?_`*8bDmgakpG-&dq2D+vx+dCsXcWH=BTh;8XQKB@zks&7(*sg!)sKUYtHVyPg zVFk!HOpAXb_)erQC~qH`%sO>%q02G!v8VDG%G6s?=Jf~u$CdG7XvK8k=@X!I&_nW3 z!ig>Xcf&xAn1nT+98wB@|4Wzmw=oKa%j3Bza<`P&#brK5Z~= zRr4E)CiGGM9vfz`p^ka7KRQ4^$|P`Tf8y(_@TP?Z9+D$6J?c4e(|>yjvbf22|GPqWNk0P# z22|MEMX;O45uK!$<)X|{Jb)^nD?$8^&YYqYGt4+nO%n@op8)y*Gp4R8&plhdczWYP z`!R=9!_rn&ruWpCTyk64BK9(9`vPo4+OI&Gxahno;Q`ZHt=Xv5P?fd0R=R>Op*D!@ zg#)!0&H-d^^jMMuk|kD^s@ZpLkLKJdO%F;KonOtYGy~>uA|{jXuWFMQd~PGdn#1+c zj3Q~UYZ;NZLO%$zd3j8Byzw=V{p@LB*I$(q`lJ@Gg5gBn|3<{iUZW*$j|iujXTFgW zAp3yZWB!Cne9prNEzmghmocj1{Q%8+l);}$sdA}tK*tTU64L|B>|NX-{O;t&H7|ufBZ`A$_t?&k@ zw>|fr-S6nagF;m$q1CFqemyp18rwqS8OZA{Xch~1lI@}|7KosPE&ZE)Z6=<)Cih5# zT(E-;@e&)G4MAsr<=<;-_4os7!|VLE4fSYw-8R+lUA*Zwa&|GryOGgqcB;5>;QH3ll2;YXQ?%IcGK2R68&sWNMKhX0qy>C7L zcPi!oaoXd5C_WzZeE7Gt)bWcJO6{3@=kCZ8jOG*x$QT#2l4MD}k)1M)N3| zM2yuoU%DhTJ`UulA>dq-mipo4s0pqt`6S=p+jBg|88b^C#GA;f+$eeYr3(X!dBU3? zRW&3gawyk+ju4GUsGS+P{IkLh7^zcT-)9uD#DW}f!4q}EmPrDZ>4|sF}z1mhHG*h zQRfw{iJtsX9t6y51Z(93Xscf4K|LsNTl}W;6s;cj=kVGTmQJSLhJFgAXHcmfe& kyO{99B(iS?t?vBsG+VXZAa{#nAMkTg2cn&)dGp?X0mdX6v;Y7A literal 0 HcmV?d00001 diff --git a/BioTracker/CoreApp/BioTracker/resources/introduction/images/context_entity.png b/BioTracker/CoreApp/BioTracker/resources/introduction/images/context_entity.png new file mode 100644 index 0000000000000000000000000000000000000000..98a28c322853d2d079f0be5374cca42a531455ff GIT binary patch literal 41908 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