diff --git a/TraVisTo.pro b/JPSvis.pro similarity index 97% rename from TraVisTo.pro rename to JPSvis.pro index 08ae1839ad35884d0926129621711ab8c901d751..59c0f830e0f4196056838a06810cf14808576907 100644 --- a/TraVisTo.pro +++ b/JPSvis.pro @@ -1,5 +1,5 @@ TEMPLATE = app -TARGET = TraVisTo +TARGET = JPSvis CONFIG += qt QT += xml network @@ -322,7 +322,6 @@ HEADERS += src/geometry/Building.h \ forms/Settings.h \ src/SaxParser.h \ src/Debug.h \ - src/travisto.h \ src/Frame.h \ src/InteractorStyle.h \ src/Message.h \ @@ -340,7 +339,8 @@ HEADERS += src/geometry/Building.h \ src/geometry/PointPlotter.h \ src/geometry/LinePlotter2D.h \ src/geometry/PointPlotter2D.h \ - src/network/TraVisToServer.h + src/network/TraVisToServer.h \ + src/MainWindow.h SOURCES += src/geometry/Building.cpp \ src/geometry/Crossing.cpp \ @@ -365,7 +365,6 @@ SOURCES += src/geometry/Building.cpp \ src/SaxParser.cpp \ src/Debug.cpp \ src/main.cpp \ - src/travisto.cpp \ src/Frame.cpp \ src/InteractorStyle.cpp \ src/Pedestrian.cpp \ @@ -381,10 +380,9 @@ SOURCES += src/geometry/Building.cpp \ src/geometry/FacilityGeometry.cpp \ src/geometry/LinePlotter.cpp \ src/geometry/PointPlotter.cpp \ - src/network/TraVisToServer.cpp + src/network/TraVisToServer.cpp \ + src/MainWindow.cpp FORMS += forms/settings.ui \ - forms/travisto.ui -RESOURCES += forms/icons.qrc \ - forms/icons.qrc \ - forms/icons.qrc -RC_FILE = forms/travisto.rc + forms/mainwindow.ui +RESOURCES += forms/icons.qrc +RC_FILE = forms/jpsvis.rc diff --git a/TraVisToProjet.xml b/JPSvisSettings.xml similarity index 100% rename from TraVisToProjet.xml rename to JPSvisSettings.xml diff --git a/debug/TraVisTo.exe b/debug/TraVisTo.exe deleted file mode 100644 index 6bf16681f2e6ae50097de5408c5153ebe10c516d..0000000000000000000000000000000000000000 Binary files a/debug/TraVisTo.exe and /dev/null differ diff --git a/forms/icons.qrc b/forms/icons.qrc index 5a7522a59523597fdaf33f7b6e1f783c5a0ab0d8..fb0945af70acdfb57cd471f398ff6505c5c7dbd0 100644 --- a/forms/icons.qrc +++ b/forms/icons.qrc @@ -4,7 +4,7 @@ <file>icons/window_fullscreen-64.png</file> <file>icons/Play1Hot.png</file> <file>icons/Stop1PressedBlue.png</file> - <file>icons/fullscreen.jpeg</file> + <file>icons/JPSvis.png</file> <file>icons/PauseHot.png</file> <file>icons/RecordPressed.png</file> </qresource> diff --git a/forms/icons/fullscreen.jpeg b/forms/icons/fullscreen.jpeg deleted file mode 100644 index 98d614198857fd5ee110a25360c8f7363a9765a1..0000000000000000000000000000000000000000 Binary files a/forms/icons/fullscreen.jpeg and /dev/null differ diff --git a/forms/jpsvis.ico b/forms/jpsvis.ico new file mode 100644 index 0000000000000000000000000000000000000000..d0053f4b6b57f66f10537da50ee6e2e6364ee349 Binary files /dev/null and b/forms/jpsvis.ico differ diff --git a/forms/jpsvis.rc b/forms/jpsvis.rc new file mode 100644 index 0000000000000000000000000000000000000000..8a3a9b0926d38ea69cd4eb1d50d21fd279a5a29a --- /dev/null +++ b/forms/jpsvis.rc @@ -0,0 +1 @@ +IDI_ICON1 ICON DISCARDABLE "jpsvis.ico" diff --git a/forms/travisto.ui b/forms/mainwindow.ui similarity index 95% rename from forms/travisto.ui rename to forms/mainwindow.ui index fbcc70bc9bfc4e56d4869441b28e4c9bc854f7b5..3340f6e4d58ca09fcaa44838f7c2f1fac4a08a6f 100644 --- a/forms/travisto.ui +++ b/forms/mainwindow.ui @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> - <class>TraVisToClass</class> - <widget class="QMainWindow" name="TraVisToClass"> + <class>mainwindow</class> + <widget class="QMainWindow" name="mainwindow"> <property name="geometry"> <rect> <x>0</x> @@ -35,11 +35,11 @@ <bool>true</bool> </property> <property name="windowTitle"> - <string>TraVisTo</string> + <string>JPSvis</string> </property> <property name="windowIcon"> <iconset resource="icons.qrc"> - <normaloff>:/new/iconsS/icons/fullscreen.PNG</normaloff>:/new/iconsS/icons/fullscreen.PNG</iconset> + <normaloff>:/new/iconsS/icons/JPSvis.png</normaloff>:/new/iconsS/icons/JPSvis.png</iconset> </property> <property name="toolTip"> <string>Visualise Pedestrian Motions</string> @@ -459,7 +459,7 @@ border-color: rgb(255, 255, 255);</string> <property name="smallDecimalPoint"> <bool>false</bool> </property> - <property name="numDigits"> + <property name="digitCount"> <number>10</number> </property> <property name="segmentStyle"> @@ -533,7 +533,7 @@ border-color: rgb(255, 255, 255);</string> <x>0</x> <y>0</y> <width>450</width> - <height>25</height> + <height>21</height> </rect> </property> <widget class="QMenu" name="menuFile"> @@ -582,6 +582,9 @@ border-color: rgb(255, 255, 255);</string> <string>Options</string> </property> <widget class="QMenu" name="menuCaption_Color"> + <property name="enabled"> + <bool>false</bool> + </property> <property name="title"> <string>Caption Color</string> </property> @@ -722,6 +725,9 @@ border-color: rgb(255, 255, 255);</string> <property name="text"> <string>Tutorial</string> </property> + <property name="visible"> + <bool>false</bool> + </property> </action> <action name="actionNetwork_settings"> <property name="enabled"> @@ -1103,6 +1109,9 @@ border-color: rgb(255, 255, 255);</string> <property name="text"> <string>Render PNG to AVI</string> </property> + <property name="visible"> + <bool>false</bool> + </property> </action> <action name="actionCameraViewAgent"> <property name="text"> @@ -1122,11 +1131,17 @@ border-color: rgb(255, 255, 255);</string> <property name="text"> <string>Auto</string> </property> + <property name="visible"> + <bool>false</bool> + </property> </action> <action name="actionCaptionCustom"> <property name="text"> <string>Choose...</string> </property> + <property name="visible"> + <bool>false</bool> + </property> </action> <action name="actionWalls_Color"> <property name="text"> @@ -1217,7 +1232,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionAbout</sender> <signal>triggered()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotHelpAbout()</slot> <hints> <hint type="sourcelabel"> @@ -1233,7 +1248,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionExit</sender> <signal>triggered()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotExit()</slot> <hints> <hint type="sourcelabel"> @@ -1249,7 +1264,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>BtStart</sender> <signal>clicked()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotStartPlaying()</slot> <hints> <hint type="sourcelabel"> @@ -1265,7 +1280,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>BtFullscreen</sender> <signal>clicked(bool)</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotFullScreen(bool)</slot> <hints> <hint type="sourcelabel"> @@ -1281,7 +1296,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>BtRecord</sender> <signal>clicked()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotRecord()</slot> <hints> <hint type="sourcelabel"> @@ -1297,7 +1312,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>BtReset</sender> <signal>clicked()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotReset()</slot> <hints> <hint type="sourcelabel"> @@ -1313,7 +1328,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>BtStop</sender> <signal>clicked()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotStopPlaying()</slot> <hints> <hint type="sourcelabel"> @@ -1329,7 +1344,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionNetwork_settings</sender> <signal>triggered()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotNetworkSettings()</slot> <hints> <hint type="sourcelabel"> @@ -1345,7 +1360,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionOnline</sender> <signal>toggled(bool)</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotSetOnlineMode(bool)</slot> <hints> <hint type="sourcelabel"> @@ -1361,7 +1376,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionOffline</sender> <signal>toggled(bool)</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotSetOfflineMode(bool)</slot> <hints> <hint type="sourcelabel"> @@ -1377,7 +1392,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionLoad_File</sender> <signal>triggered()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotLoadFile()</slot> <hints> <hint type="sourcelabel"> @@ -1393,7 +1408,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionFirst_Group</sender> <signal>toggled(bool)</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotToggleFirstPedestrianGroup()</slot> <hints> <hint type="sourcelabel"> @@ -1409,7 +1424,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionSecond_Group</sender> <signal>toggled(bool)</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotToggleSecondPedestrianGroup()</slot> <hints> <hint type="sourcelabel"> @@ -1425,7 +1440,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionThird_Group</sender> <signal>toggled(bool)</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotToggleThirdPedestrianGroup()</slot> <hints> <hint type="sourcelabel"> @@ -1441,7 +1456,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionAdd_Trajectories_File</sender> <signal>triggered()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotAddDataSet()</slot> <hints> <hint type="sourcelabel"> @@ -1457,7 +1472,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionClear_Trajectories_Files</sender> <signal>triggered()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotClearAllDataset()</slot> <hints> <hint type="sourcelabel"> @@ -1473,7 +1488,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionShow_Trajectories</sender> <signal>triggered()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotShowTrajectoryOnly()</slot> <hints> <hint type="sourcelabel"> @@ -1489,7 +1504,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionShow_Agents</sender> <signal>triggered()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotShowPedestrianOnly()</slot> <hints> <hint type="sourcelabel"> @@ -1505,7 +1520,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>contrastSettingSlider</sender> <signal>valueChanged(int)</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotUpdateContrastSlider(int)</slot> <hints> <hint type="sourcelabel"> @@ -1521,7 +1536,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>speedSettingSlider</sender> <signal>valueChanged(int)</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotUpdateSpeedSlider(int)</slot> <hints> <hint type="sourcelabel"> @@ -1537,7 +1552,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionShow_Geometry</sender> <signal>changed()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotShowGeometry()</slot> <hints> <hint type="sourcelabel"> @@ -1553,7 +1568,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>action2_D</sender> <signal>changed()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotToogle2D()</slot> <hints> <hint type="sourcelabel"> @@ -1569,7 +1584,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>action3_D</sender> <signal>changed()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotToogle3D()</slot> <hints> <hint type="sourcelabel"> @@ -1585,7 +1600,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionShow_Legend</sender> <signal>changed()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotToogleShowLegend()</slot> <hints> <hint type="sourcelabel"> @@ -1601,7 +1616,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>framesIndicatorSlider</sender> <signal>sliderMoved(int)</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotUpdateFrameSlider(int)</slot> <hints> <hint type="sourcelabel"> @@ -1617,7 +1632,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>framesIndicatorSlider</sender> <signal>sliderPressed()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotFrameSliderPressed()</slot> <hints> <hint type="sourcelabel"> @@ -1633,7 +1648,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>framesIndicatorSlider</sender> <signal>sliderReleased()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotFrameSliderReleased()</slot> <hints> <hint type="sourcelabel"> @@ -1649,7 +1664,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionFrames_Navigation</sender> <signal>changed()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotFramesByFramesNavigation()</slot> <hints> <hint type="sourcelabel"> @@ -1665,7 +1680,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>BtNextFrame</sender> <signal>clicked()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotNextFrame()</slot> <hints> <hint type="sourcelabel"> @@ -1681,7 +1696,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>BtPreviousFrame</sender> <signal>clicked()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotPreviousFrame()</slot> <hints> <hint type="sourcelabel"> @@ -1697,7 +1712,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionShow_Captions</sender> <signal>changed()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotShowPedestrianCaption()</slot> <hints> <hint type="sourcelabel"> @@ -1713,7 +1728,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionShow_Axis</sender> <signal>changed()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotToogleShowAxis()</slot> <hints> <hint type="sourcelabel"> @@ -1729,7 +1744,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionCameraViewFront</sender> <signal>triggered(bool)</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotSetCameraPerspectiveToFront()</slot> <hints> <hint type="sourcelabel"> @@ -1745,7 +1760,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionCameraViewSide</sender> <signal>triggered(bool)</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotSetCameraPerspectiveToSide()</slot> <hints> <hint type="sourcelabel"> @@ -1761,7 +1776,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionCameraViewTop</sender> <signal>triggered(bool)</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotSetCameraPerspectiveToTop()</slot> <hints> <hint type="sourcelabel"> @@ -1777,7 +1792,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionBackground_Color</sender> <signal>triggered()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotChangeBackgroundColor()</slot> <hints> <hint type="sourcelabel"> @@ -1793,7 +1808,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionPedestrian_Shape</sender> <signal>triggered()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotChangePedestrianShape()</slot> <hints> <hint type="sourcelabel"> @@ -1809,7 +1824,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionClear_Geometry</sender> <signal>triggered()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotClearGeometry()</slot> <hints> <hint type="sourcelabel"> @@ -1825,7 +1840,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionSnapshot</sender> <signal>triggered()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotTakeScreenShot()</slot> <hints> <hint type="sourcelabel"> @@ -1841,7 +1856,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionRecord_PNG_sequences</sender> <signal>triggered()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotRecordPNGsequence()</slot> <hints> <hint type="sourcelabel"> @@ -1857,7 +1872,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionRender_PNG_to_AVI</sender> <signal>triggered()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotRenderPNG2AVI()</slot> <hints> <hint type="sourcelabel"> @@ -1873,7 +1888,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionCameraViewAgent</sender> <signal>triggered()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotSetCameraPerspectiveToVirtualAgent()</slot> <hints> <hint type="sourcelabel"> @@ -1889,7 +1904,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionCaptionAuto</sender> <signal>triggered()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotCaptionColorAuto()</slot> <hints> <hint type="sourcelabel"> @@ -1905,7 +1920,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionCaptionCustom</sender> <signal>triggered()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotCaptionColorCustom()</slot> <hints> <hint type="sourcelabel"> @@ -1921,7 +1936,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionWalls_Color</sender> <signal>triggered()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotChangeWallsColor()</slot> <hints> <hint type="sourcelabel"> @@ -1937,7 +1952,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionExits_Color</sender> <signal>triggered()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotChangeExitsColor()</slot> <hints> <hint type="sourcelabel"> @@ -1953,7 +1968,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionShow_Onscreen_Infos</sender> <signal>triggered()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotShowOnScreenInfos()</slot> <hints> <hint type="sourcelabel"> @@ -1969,7 +1984,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionShow_Exits</sender> <signal>triggered()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotShowHideExits()</slot> <hints> <hint type="sourcelabel"> @@ -1985,7 +2000,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionShow_Walls</sender> <signal>triggered()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotShowHideWalls()</slot> <hints> <hint type="sourcelabel"> @@ -2001,7 +2016,7 @@ border-color: rgb(255, 255, 255);</string> <connection> <sender>actionShow_Geometry_Captions</sender> <signal>triggered()</signal> - <receiver>TraVisToClass</receiver> + <receiver>mainwindow</receiver> <slot>slotShowHideGeometryCaptions()</slot> <hints> <hint type="sourcelabel"> diff --git a/forms/travisto.ico b/forms/travisto.ico deleted file mode 100644 index ede08f4467b5d1c85853b91f5ff55eb79fca461d..0000000000000000000000000000000000000000 Binary files a/forms/travisto.ico and /dev/null differ diff --git a/forms/travisto.rc b/forms/travisto.rc deleted file mode 100644 index 1ac2d8df2939cea7864127fd363efb8242f76565..0000000000000000000000000000000000000000 --- a/forms/travisto.rc +++ /dev/null @@ -1 +0,0 @@ -IDI_ICON1 ICON DISCARDABLE "travisto.ico" diff --git a/release/TraVisTo.exe b/release/TraVisTo.exe deleted file mode 100644 index e45b603fde372783c53260530b0858afc16b414e..0000000000000000000000000000000000000000 Binary files a/release/TraVisTo.exe and /dev/null differ diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6c3f0df55b58431be47db84c9ef77c180b4399e6 --- /dev/null +++ b/src/MainWindow.cpp @@ -0,0 +1,1567 @@ +/** + * @file travisto.cpp + * @author Ulrich Kemloh <kemlohulrich@gmail.com> + * @version 0.1 + * Copyright (C) <2009-2010> + * + * @section LICENSE + * This file is part of OpenPedSim. + * + * OpenPedSim is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * OpenPedSim is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with OpenPedSim. If not, see <http://www.gnu.org/licenses/>. + * + * @section DESCRIPTION + * + * \brief main program class + * + * + * Created on: 11.05.2009 + * + */ + + +#include "MainWindow.h" +#include "SaxParser.h" +#include "SystemSettings.h" +#include "./forms/Settings.h" + + +#include "extern_var.h" +#include "TrajectoryPoint.h" +#include "Frame.h" +#include "Debug.h" +#include "ThreadVisualisation.h" +#include "ThreadDataTransfert.h" +#include "SimpleVisualisationWindow.h" + +#include "geometry/FacilityGeometry.h" + +#include <QMessageBox> +#include <QtXml/QDomDocument> +#include <QTime> +#include <QApplication> +#include <QCloseEvent> +#include <QThread> +#include <QIODevice> +#include <QDir> +#include <QFile> +#include <QFileDialog> +#include <QInputDialog> +#include <QString> +#include <QColorDialog> +#include <QDebug> +#include <QtXml> + +#include <iostream> +#include <limits> +#include <string> +#include <vector> + +using namespace std; + +MainWindow::MainWindow(QWidget *parent) : + QMainWindow(parent) { + ui.setupUi(this); + this->setWindowTitle("JPSvis"); + + //disable the maximize Button + setWindowFlags( Qt::Window | Qt::WindowMinimizeButtonHint | Qt::WindowCloseButtonHint ); + + //create the 2 threads and connect them + dataTransferThread = new ThreadDataTransfer(this); + visualisationThread = new ThreadVisualisation(this); + + + travistoOptions = new Settings(this); + travistoOptions->setWindowTitle("Settings"); + travistoOptions->setWindowFlags(Qt::Window | Qt::WindowCloseButtonHint); + + + if(!QObject::connect(dataTransferThread, + SIGNAL(signal_controlSequence(const char*)), this, + SLOT(slotControlSequence(const char *)))){ + Debug::Error("dataTransferThread Thread: control sequence could not be connected"); + } + + if(!QObject::connect(dataTransferThread, + SIGNAL(signal_startVisualisationThread(QString,int,float )), this, + SLOT(slotStartVisualisationThread(QString,int,float )))){ + Debug::Error(" signal_startVisualisationThread not connected"); + } + + if(!QObject::connect(dataTransferThread, + SIGNAL(signal_stopVisualisationThread(bool )), this, + SLOT(slotShutdownVisualisationThread(bool )))){ + Debug::Error(" signal_stopVisualisationThread not connected "); + } + + if(!QObject::connect(dataTransferThread, + SIGNAL(signal_errorMessage(QString)), this, + SLOT(slotErrorOutput(QString)))){ + Debug::Error("signal_errorMessage not connected "); + } + + QObject::connect(visualisationThread, + SIGNAL(signal_controlSequences(const char*)), this, + SLOT(slotControlSequence(const char *))); + + QObject::connect(&extern_trajectories_firstSet, + SIGNAL(signal_controlSequences(const char*)), this, + SLOT(slotControlSequence(const char *))); + + QObject::connect(&extern_trajectories_secondSet, + SIGNAL(signal_controlSequences(const char*)), this, + SLOT(slotControlSequence(const char *))); + + QObject::connect(&extern_trajectories_thirdSet, + SIGNAL(signal_controlSequences(const char*)), this, + SLOT(slotControlSequence(const char *))); + + + QObject::connect(dataTransferThread, SIGNAL(signal_CurrentAction(QString)), + this, SLOT(slotCurrentAction(QString))); + + QObject::connect(this, SIGNAL(signal_controlSequence(QString)), + travistoOptions, SLOT(slotControlSequence(QString))); + + isPlaying = false; + isPaused = false; + numberOfDatasetLoaded=0; + frameSliderHold=false; + + + labelCurrentAction = new QLabel(); + labelCurrentAction->setFrameStyle(QFrame::Panel | QFrame::Sunken); + // currentAction->setLineWidth(5); + // currentAction->setMargin(2); + // currentAction->setMidLineWidth(2); + labelCurrentAction->setText(" Idle "); + statusBar()->addPermanentWidget(labelCurrentAction); + + labelFrameNumber = new QLabel(); + labelFrameNumber->setFrameStyle(QFrame::Panel | QFrame::Sunken); + // frameNumber->setLineWidth(5); + // frameNumber->setFixedWidth(80); + // frameNumber->setMargin(2); + // frameNumber->setMidLineWidth(2); + labelFrameNumber->setText("fps:"); + statusBar()->addPermanentWidget(labelFrameNumber); + + labelRecording = new QLabel(); + labelRecording->setFrameStyle(QFrame::Panel | QFrame::Sunken); + labelRecording->setText(" rec: off "); + statusBar()->addPermanentWidget(labelRecording); + + labelMode = new QLabel(); + labelMode->setFrameStyle(QFrame::Panel | QFrame::Sunken); + labelMode->setText(" Offline "); + statusBar()->addPermanentWidget(labelMode); + + + ui.BtNextFrame->setVisible(false); + ui.BtPreviousFrame->setVisible(false); + //TODO: Maybe this is not longer needed + ui.framePerSecondSliderLabel->setVisible(false); + ui.contrastSettingSlider->setVisible(false); + + QStringList arguments =QApplication::arguments(); + int group=1; // there are max 3 groups of pedestrians + bool mayPlay=false; + + // arguments.append("-online"); + // arguments.append("-caption"); + arguments.append("-2D"); + // parse arguments list + if(arguments.size()>1) + for(int argCount=1;argCount<arguments.size();argCount++){ + + QString argument=arguments[argCount]; + + if(argument.compare("help")==0) { + Debug::Error("Usage: ./TraVisTo [file1] [file2] [file3] [-2D] [-caption] [-online [port]]"); + } + else if(argument.compare("-2D")==0) { + ui.action2_D->setChecked(true); + slotToogle2D(); + }else if(argument.compare("-caption")==0) { + ui.actionShow_Captions->setChecked(true); + slotShowPedestrianCaption(); + + }else if(argument.compare("-online")==0) { + slotSetOnlineMode(true); + + // checking for other possible options [ port...] + if(argCount!=arguments.size()-1){ + bool ok=false; + int port = arguments[++argCount].toInt(&ok); + Debug:: + Debug::Messages(" listening port: %d",port); + + if (ok) { + SystemSettings::setListningPort(port); + }else{ // maybe that wasnt the port + argCount--; // to ensure that the "option" will be checked + } + } + mayPlay=true; + + }else if(argument.startsWith("-")) { + const char* std=argument.toStdString().c_str(); + Debug::Error(" unknown options: %s",std); + Debug::Error("Usage: ./TraVisTo [file1] [file2] [file3] [-2D] [-caption] [-online [port] ]"); + + }else if(addPedestrianGroup(group,argument)){ + //slotHelpAbout(); + group++; + mayPlay=true; + } + + } + + if(mayPlay)slotStartPlaying(); +} + +MainWindow::~MainWindow() { + + extern_shutdown_visual_thread=true; + extern_recording_enable=false; + + + if (visualisationThread->isRunning()) { + //std::Debug::Messages("Thread visualisation is still running" << std::endl; + waitForVisioThread(); + } + + if (dataTransferThread->isRunning()) { + //std::Debug::Messages("Thread visualisation is still running" << std::endl; + //it is your own fault if you were still recording something + waitForDataThread(); + } + + delete dataTransferThread; + delete visualisationThread; + delete travistoOptions; + delete labelCurrentAction; + delete labelFrameNumber; + delete labelRecording; + delete labelMode; + +} + +void MainWindow::slotHelpAbout() { + + QMessageBox::about( + this, + "About JPSVis", + "Version 0.5 built with QT 4.8 and VTK 5.10\n\n" + "JPSVis is part of the Juelich Pedestrian Simulator (JuPdsim)" + "and stands for Trajectories Visualisation Tool. It is a tool for visualizing pedestrians motion\n" + "developped at the Forschungszentrum Juelich GmbH, Germany\n\n" + "Copyright 2009-2014.\n" + "Authors: Ulrich Kemloh\n\n" + "For questions, contact +49-40-246161-4193 \nor mail at \n" + "u.kemloh@fz-juelich.de\n"); + +} + + + +/** + *setup the network port to bind + * + */ + +void MainWindow::slotNetworkSettings() { + bool ok; + + int port = QInputDialog::getInt(this, tr("input a port "), tr( + "port(default to 8081):"), 8989, 5000, 65355, 1, &ok); + + if (ok) { + SystemSettings::setListningPort(port); + } +} + + +void MainWindow::slotStartPlaying() { + + //first reset this variable. just for the case + // the thread was shutdown from the reset option + extern_shutdown_visual_thread = false; + + + if (!isPlaying) { + statusBar()->showMessage(QString::fromUtf8("waiting for data")); + //only start the visualisation thread if in offline modus + // otherwise both threads should be started + if (extern_offline_mode) { + if(anyDatasetLoaded()){ //at least one dataset was loaded, restarting the playback + + // starting the playback from the beginning + extern_trajectories_firstSet.resetFrameCursor(); + extern_trajectories_secondSet.resetFrameCursor(); + extern_trajectories_thirdSet.resetFrameCursor(); + + } else if (!slotAddDataSet()) { //else load a dataset + return;//could not read any data + } + visualisationThread->start(); + + } else /*if (extern_online_mode)*/ { //live visualisation + dataTransferThread->start(); + //visualisationThread->start(); + } + + //enable recording + ui.BtRecord->setEnabled(true); + labelCurrentAction->setText(" playing "); + + ui.action3_D->setEnabled(false); + ui.action2_D->setEnabled(false); + + //disable legend + ui.actionShow_Legend->setEnabled(false); + + //change Icon to Pause + QIcon icon1; + icon1.addPixmap(QPixmap(QString::fromUtf8( + ":/new/iconsS/icons/PauseHot.png")), QIcon::Normal, QIcon::Off); + ui.BtStart->setToolTip("pause the visualisation"); + ui.BtStart->setIcon(icon1); + + //anyDataLoaded=true; + isPlaying = true; + extern_is_pause = false; + + } else if (isPaused) { //resume playing + isPaused = false; + extern_is_pause = false; + //restore the play Icon + QIcon icon1; + icon1.addPixmap(QPixmap(QString::fromUtf8( + ":/new/iconsS/icons/PauseHot.png")), QIcon::Normal, QIcon::Off); + ui.BtStart->setIcon(icon1); + labelCurrentAction->setText(" playing "); + ui.BtStart->setToolTip("pause the visualisation"); + + } else { //call pause + isPaused = true; + extern_is_pause = true; + QIcon icon1; + icon1.addPixmap(QPixmap(QString::fromUtf8( + ":/new/iconsS/icons/Play1Hot.png")), QIcon::Normal, QIcon::Off); + ui.BtStart->setIcon(icon1); + ui.BtStart->setToolTip("resume the visualisation"); + labelCurrentAction->setText(" paused "); + } + + //no matter what, the stop button should be enabled + ui.BtStop->setEnabled(true); +} + +void MainWindow::slotStopPlaying() { + + if (extern_recording_enable) { + int res = QMessageBox::question(this, "action", + "do you wish to stop the recording?", QMessageBox::Discard + | QMessageBox::Yes, QMessageBox::Yes); + if (res == QMessageBox::Yes) { + extern_recording_enable = false; + //currentAction->setText(" Idle "); + labelRecording->setText("rec: OFF"); + + } else { + return; + } + } + + //shutdown the threads + //fixme: shut the network thread as well + // maybe this is a feature ! + extern_shutdown_visual_thread=true; + waitForVisioThread(); + + //reset all frames cursors + resetAllFrameCursor(); + + //disable/reset all graphical elements + isPlaying = false; + isPaused = false; + resetGraphicalElements(); + labelCurrentAction->setText(" Idle "); +} + +/** + * open a file containing visualisation data, parse them + * and initialize the visualization + * + */ +bool MainWindow::slotLoadFile() { + + return slotAddDataSet(); + +} + + +// This function is only used in online Mode +FacilityGeometry* MainWindow::parseGeometry(QDomNode geoNode){ + + cout<<"parsing the geo"<<endl; + if(geoNode.isNull()) return NULL; + + //check if there is a tag 'file' there in + QString fileName = geoNode.toElement().elementsByTagName("file").item(0).toElement().attribute("location"); + FacilityGeometry* geometry = visualisationThread->getGeometry(); + + if(!fileName.isEmpty()) + { + if (fileName.endsWith(".xml",Qt::CaseInsensitive)) + { + //cout<<"good bye"<<endl; exit(0); + //should be a file name + //return parseGeometryPG3(fileName); + //SaxParser::parseGeometryPG3(fileName,geometry); + } + else if (fileName.endsWith(".trav",Qt::CaseInsensitive)) + { + //must not be a file name + SaxParser::parseGeometryTRAV(fileName,geometry); + } + } + // I assume it is a trav format node, + //which is the only one which can directly be inserted into a file + else + { + //must not be a file name + SaxParser::parseGeometryTRAV(fileName,geometry,geoNode); + } + return geometry; +} + +// TODO: still used? +bool MainWindow::parsePedestrianShapes(QDomNode shapeNode, int groupID){ + + if(shapeNode.isNull()) return false; + QStringList heights; + QStringList colors; + + QDomNodeList agents = shapeNode.toElement().elementsByTagName("agentInfo"); + + for (unsigned int i = 0; i < agents.length(); i++) { + + bool ok=false; + int id=agents.item(i).toElement().attribute("ID").toInt(&ok); + if(!ok) continue; // invalid ID + double height=agents.item(i).toElement().attribute("height").toDouble(&ok); + if(!ok)height=std::numeric_limits<double>::quiet_NaN(); + + int color=agents.item(i).toElement().attribute("color").toDouble(&ok); + if(!ok)color=std::numeric_limits<int>::quiet_NaN(); + Debug::Messages("id= %d height= %lf color =%d",id,height,color); + + if(!isnan(height)){ + heights.append(QString::number(id)); + heights.append(QString::number(height)); + } + if(!isnan(color)){ + colors.append(QString::number(id)); + colors.append(QString::number(color)); + } + + } + switch (groupID){ + + case 1: + extern_trajectories_firstSet.setInitialHeights(heights); + extern_trajectories_firstSet.setInitialColors(colors); + break; + + case 2: + extern_trajectories_secondSet.setInitialHeights(heights); + extern_trajectories_secondSet.setInitialColors(colors); + break; + + case 3: + extern_trajectories_thirdSet.setInitialHeights(heights); + extern_trajectories_thirdSet.setInitialColors(colors); + break; + } + + return true; + +} + + +/// add a new dataset +bool MainWindow::slotAddDataSet(){ + + if (numberOfDatasetLoaded>=3){ + QMessageBox::information(this,"notice","You can load at most 3 datasets.\n In" + " Order to load other data, please first clear previously loaded data."); + return false; + } + // if at least one data set was loaded + if (numberOfDatasetLoaded>=1){ + int res = QMessageBox::question(this, "action", + "adding a new dataset will reset the visualisation process. Continue?", QMessageBox::Discard + | QMessageBox::Yes, QMessageBox::Yes); + + if (res == QMessageBox::Discard) return false; + + } + + // just continue + numberOfDatasetLoaded++; + if(addPedestrianGroup(numberOfDatasetLoaded)==false){ + numberOfDatasetLoaded--; + return false; + } + + QString stre(numberOfDatasetLoaded); + stre.setNum(numberOfDatasetLoaded); + stre.append(" dataset loaded"); + statusBar()->showMessage(stre); + + return true; +} + +///clear all datasets previously entered. +void MainWindow::slotClearAllDataset(){ + + clearDataSet(1); + clearDataSet(2); + clearDataSet(3); + numberOfDatasetLoaded=0; +} + + +bool MainWindow::addPedestrianGroup(int groupID,QString fileName){ + statusBar()->showMessage(tr("Select a file")); + + if(fileName.isEmpty()) + fileName = QFileDialog::getOpenFileName(this, + "Select the file containing data to visualize", + "F:\\workspace\\JPSvis\\data", + "Visualisation Files (*.dat *.trav *.xml *.pg3 *.jul);;All Files (*.*)"); + + if (fileName.isNull()) { + return false; + } + //the geometry actor + //FacilityGeometry* geometry=NULL; + FacilityGeometry* geometry = visualisationThread->getGeometry(); + + // if xml is detected, just load and show the geometry then exit + if(fileName.endsWith(".xml",Qt::CaseInsensitive)){ + SaxParser::parseGeometryXMLV04(fileName,geometry); + //slotLoadParseShowGeometry(fileName); + //return false; + } + + QFile file(fileName); + if (!file.open(QIODevice::ReadOnly)) { + Debug::Error("could not open the File: ",fileName.toStdString().c_str()); + return false; + } + + SyncData* dataset=NULL; + + + switch(groupID){ + case 1: + Debug::Messages("handling first set"); + dataset=&extern_trajectories_firstSet; + extern_first_dataset_loaded=true; + extern_first_dataset_visible=true; + ui.actionFirst_Group->setEnabled(true); + ui.actionFirst_Group->setChecked(true); + slotToggleFirstPedestrianGroup(); + break; + + case 2: + Debug::Messages("handling second set"); + dataset=&extern_trajectories_secondSet; + extern_second_dataset_loaded=true; + extern_second_dataset_visible=true; + ui.actionSecond_Group->setEnabled(true); + ui.actionSecond_Group->setChecked(true); + slotToggleSecondPedestrianGroup(); + break; + + case 3: + Debug::Messages("handling third set"); + dataset=&extern_trajectories_thirdSet; + extern_third_dataset_loaded=true; + extern_third_dataset_visible=true; + ui.actionThird_Group->setEnabled(true); + ui.actionThird_Group->setChecked(true); + slotToggleThirdPedestrianGroup(); + break; + + default: + Debug::Error("invalid pedestrian group: %d " ,groupID); + Debug::Error("should be 1, 2 or 3"); + return false; + break; + } + + double frameRate=15; //default frame rate + statusBar()->showMessage(tr("parsing the file")); + QXmlInputSource source(&file); + QXmlSimpleReader reader; + + //no other geometry format was detected + if(geometry==NULL) + geometry=new FacilityGeometry(); + SaxParser handler(geometry,dataset,&frameRate); + reader.setContentHandler(&handler); + reader.parse(source); + file.close(); + + + QString frameRateStr=QString::number(frameRate); + SystemSettings::setFilenamePrefix(QFileInfo ( fileName ).baseName()+"_"); + + // set the visualisation window title + visualisationThread->setWindowTitle(fileName); + visualisationThread->slotSetFrameRate(frameRate); + visualisationThread->setGeometry(geometry); + //visualisationThread->setWindowTitle(caption); + labelFrameNumber->setText("fps: " + frameRateStr+"/"+frameRateStr); + + //shutdown the visio thread + extern_shutdown_visual_thread=true; + waitForVisioThread(); + + statusBar()->showMessage(tr("file loaded and parsed")); + + return true; +} + + +void MainWindow::slotRecord() { + + if (extern_recording_enable) { + int res = QMessageBox::warning(this, "action", + "JuPedSim is already recording a video\n" + "do you wish to stop the recording?", QMessageBox::Yes + | QMessageBox::No, QMessageBox::No); + if (res == QMessageBox::Yes) { + extern_recording_enable = false; + ui.BtRecord->setToolTip("Start Recording"); + labelCurrentAction->setText(" Playing "); + return; + } + } + extern_launch_recording = true; + ui.BtRecord->setToolTip("Stop Recording"); + labelRecording->setText("recording"); + //labelCurrentAction->setText(" recording "); + +} + + +QString MainWindow::getTagValueFromElement(QDomNode node, + const char * tagName) { + if (node.isNull()) + return ""; + return node.toElement().namedItem(tagName).firstChild().nodeValue(); + +} + +void MainWindow::slotFullScreen(bool status) { + + Debug::Messages("changing full screen status %d",status); + extern_fullscreen_enable = true; + + //dont forget this. + extern_force_system_update=true; + +} + +void MainWindow::slotSetOfflineMode(bool status) { + + if (status) { + ui.actionOnline->setChecked(false); + extern_offline_mode = true; + labelMode->setText(" Offline "); + } else { + ui.actionOnline->setChecked(true); + extern_offline_mode = false; + labelMode->setText(" Online "); + + } + +} + +void MainWindow::slotSetOnlineMode(bool status) { + if (status) { + ui.actionOffline->setChecked(false); + extern_offline_mode = false; + labelMode->setText(" Online "); + } else { + ui.actionOffline->setChecked(true); + extern_offline_mode = true; + labelMode->setText(" Offline "); + + } +} + +void MainWindow::slotReset() { + + //stop any recording + if (extern_recording_enable) { + int res = QMessageBox::question(this, "action", + "do you wish to stop the recording?", QMessageBox::Discard + | QMessageBox::Yes, QMessageBox::Yes); + if (res == QMessageBox::Yes) { + extern_recording_enable = false; + labelCurrentAction->setText(" Playing "); + }else{ + return; + } + } + + if(anyDatasetLoaded()) + { + int res = QMessageBox::question(this, "action", + "This will also clear any dataset if loaded.\n" + "Do you wish to continue?", QMessageBox::Discard + | QMessageBox::Yes, QMessageBox::Yes); + if (res == QMessageBox::No) { + return; + } + } + + + //shutdown the visual thread + extern_shutdown_visual_thread = true; + waitForVisioThread(); + waitForDataThread(); + + //reset all buttons + //anyDataLoaded = false; + slotClearAllDataset(); + isPlaying = false; + isPaused = false; + labelCurrentAction->setText(" Idle "); + resetGraphicalElements(); + +} + +void MainWindow::slotCurrentAction(QString msg) { + msg = " " + msg + " "; + //labelCurrentAction->setText(msg); + statusBar()->showMessage(msg); + // labelMode->setText(msg); +} + +void MainWindow::slotFrameNumber(unsigned long actualFrameCount) { + QString msg; + msg.setNum(actualFrameCount); + + ui.frameSliderLabel->setText("Frame: " + msg); + + //compute the mamixum framenumber + int maxFrameCount=1; + if(extern_first_dataset_loaded){ + maxFrameCount=extern_trajectories_firstSet.getFramesNumber(); + + } + if(extern_second_dataset_loaded){ + int frameCount=extern_trajectories_secondSet.getFramesNumber(); + if(frameCount>maxFrameCount) maxFrameCount=frameCount; + + } + if(extern_third_dataset_loaded){ + int frameCount=extern_trajectories_thirdSet.getFramesNumber(); + if(frameCount>maxFrameCount) maxFrameCount=frameCount; + } + if(!frameSliderHold)if(maxFrameCount!=0)//TODO WTF, otherwise an arrymtic exeption arises + ui.framesIndicatorSlider->setValue((ui.framesIndicatorSlider->maximum()*actualFrameCount)/maxFrameCount); +} + +void MainWindow::slotRunningTime(unsigned long timems) { + // QString msg; + // msg.setNum(timems); + // msg.append(" milsec"); + //labelRunningTime->setText(msg); + ui.lcdRunningTime->display((int)timems); +} + +void MainWindow::slotRenderingTime(int fps) +{ + QString msg =labelFrameNumber->text().replace(QRegExp("[0-9]+/"),QString::number(fps)+"/"); + labelFrameNumber->setText(msg); +} + + +void MainWindow::slotExit() { + cleanUp(); + qApp->exit(); +} + +void MainWindow::closeEvent(QCloseEvent* event) { + hide(); + cleanUp(); + event->accept(); +} + +/** + * performs the necessary cleaning such as: + * closing data + * stopping recording + */ +void MainWindow::cleanUp() { + //stop the recording process + extern_recording_enable = false; + extern_shutdown_visual_thread = true; + + if(SystemSettings::getRecordPNGsequence()) + slotRecordPNGsequence(); + + waitForVisioThread(); + waitForDataThread(); + +} + + + +void MainWindow::slotControlSequence(const char * sex) { + + QString str(sex); + + //todo: check wich stack is empty and disable + // the correspinding datasets. + // are all stacks empty? then stop + // visualisation adn recording if any + if (str.compare("CONTROL_STACK_EMPTY") == 0) { + + statusBar()->showMessage(tr(" stack empty ")); + extern_recording_enable = false; + ui.BtRecord->setToolTip("Start Recording"); + labelRecording->setText(" rec: off "); + + //Debug::Messages("stack empty" << endl; + // Debug::Messages("stoping the playback and recording if any" << endl; + // //extern_recording_enable = false; + // extern_shutdown_visual_thread=true; + // waitForVisioThread(); + // + // //isPlaying = true; //very important + // //isPaused = true; + // //extern_is_pause = true; + // + // + // extern_screen_contrast=1; + // extern_is_pause = false; + // isPlaying=false; + // isPaused=false; + + //pause the system + // QIcon icon1; + // icon1.addPixmap(QPixmap(QString::fromUtf8( + // ":/new/iconsS/icons/Play1Hot.png")), QIcon::Normal, QIcon::Off); + // ui.BtStart->setIcon(icon1); + // labelCurrentAction->setText("paused"); + // extern_is_pause = true; + // isPlaying = true; //very important, cuz the visio was running + // isPaused = true; + // extern_update_step=1; + + + } else if (str.compare("CONTROL_RESET") == 0) { + Debug::Messages("resetting all"); + isPlaying = false; + isPaused = false; + labelCurrentAction->setText(" Idle "); + extern_update_step=1; + //extern_screen_contrast=1; + + //reset the frames cursor + extern_trajectories_firstSet.resetFrameCursor(); + extern_trajectories_secondSet.resetFrameCursor(); + extern_trajectories_thirdSet.resetFrameCursor(); + + resetGraphicalElements(); + + } else if (str.compare("STACK_REACHS_BEGINNING")==0){ + //return to normal speed + if(extern_update_step<0){ + Debug::Messages("stack reaches beginning, resuming the playback with vel 1"); + extern_update_step=1; + ui.speedSettingSlider->setValue(1); + } + + } +} + + +void MainWindow::resetGraphicalElements(){ + + //restore play button + QIcon icon1; + icon1.addPixmap(QPixmap( + QString::fromUtf8(":/new/iconsS/icons/Play1Hot.png")), + QIcon::Normal, QIcon::Off); + ui.BtStart->setIcon(icon1); + + //disable record button + ui.BtRecord->setEnabled(false); + + //disable fullscreen + ui.BtFullscreen->setEnabled(false); + + //disable stop button + + ui.BtStop->setEnabled(false); + //reset the slider + ui.framesIndicatorSlider->setValue(ui.framesIndicatorSlider->minimum()); + + //reset the speed cursor + ui.speedSettingSlider->setValue(1); + //reset the contrast + + // bla bla + ui.actionShow_Legend->setEnabled(true); + + //restore the play Icon + + // + ui.actionShow_Trajectories->setEnabled(true); + + ui.action3_D->setEnabled(true); + ui.action2_D->setEnabled(true); + + labelRecording->setText("rec: OFF"); + statusBar()->showMessage(tr("select a File")); + + //resetting the start/stop recording action + //check whether the a png recording sequence was playing, stop if the case + if(SystemSettings::getRecordPNGsequence()) + slotRecordPNGsequence(); + +} + + +void MainWindow::slotToggleFirstPedestrianGroup(){ + if(ui.actionFirst_Group->isChecked()){ + extern_first_dataset_visible=true; + }else{ + extern_first_dataset_visible=false; + } + extern_force_system_update=true; + +} + +/// enable/disable the second pedestrian group +void MainWindow::slotToggleSecondPedestrianGroup(){ + if(ui.actionSecond_Group->isChecked()){ + extern_second_dataset_visible=true; + }else{ + extern_second_dataset_visible=false; + } + extern_force_system_update=true; +} + +/// enable/disable the third pedestrian group +void MainWindow::slotToggleThirdPedestrianGroup(){ + if(ui.actionThird_Group->isChecked()){ + extern_third_dataset_visible=true; + }else{ + extern_third_dataset_visible=false; + } + extern_force_system_update=true; +} + +bool MainWindow::anyDatasetLoaded(){ + return + (extern_first_dataset_loaded|| + extern_second_dataset_loaded|| + extern_third_dataset_loaded); +} + +void MainWindow::slotShowTrajectoryOnly(){ + if(ui.actionShow_Trajectories->isChecked()){ + //visualisationThread->setTrailVisibility(true); + extern_tracking_enable=true; + //ui.actionShow_Trajectories->setEnabled(false); + }else{ + extern_tracking_enable=false; + //visualisationThread->setTrailVisibility(false); + } +} + + +/// TODO: implement me +void MainWindow::slotShowPedestrianOnly(){ + Debug::Error("Not implemented"); +} + +void MainWindow::slotShowGeometry(){ + + if (ui.actionShow_Geometry->isChecked()){ + visualisationThread->setGeometryVisibility(true); + ui.actionShow_Exits->setEnabled(true); + ui.actionShow_Walls->setEnabled(true); + } + else{ + visualisationThread->setGeometryVisibility(false); + ui.actionShow_Exits->setEnabled(false); + ui.actionShow_Walls->setEnabled(false); + } + +} + +/// shows/hide geometry +void MainWindow::slotShowHideExits(){ + if (ui.actionShow_Exits->isChecked()){ + visualisationThread->showDoors(true); + } + else{ + visualisationThread->showDoors(false); + } +} + +/// shows/hide geometry +void MainWindow::slotShowHideWalls(){ + if (ui.actionShow_Walls->isChecked()){ + visualisationThread->showWalls(true); + } + else{ + visualisationThread->showWalls(false); + } +} + + +/// update the playing speed +void MainWindow::slotUpdateSpeedSlider(int newValue){ + + QString msg; + msg.setNum(newValue); + + extern_update_step=newValue; + //Debug::Error( " speed updated to: %d", extern_update_step); + ui.speedSliderLabel->setText("Speed: " + msg + " "); + +} + +/// update the position slider +void MainWindow::slotUpdateFrameSlider(int newValue){ + + // first get the correct position + int maxFrameCount=1; + if(extern_first_dataset_loaded){ + int t=extern_trajectories_firstSet.getFramesNumber(); + if(maxFrameCount<t) maxFrameCount=t; + } + if(extern_second_dataset_loaded){ + int t=extern_trajectories_secondSet.getFramesNumber(); + if(maxFrameCount<t) maxFrameCount=t; + + } + if(extern_third_dataset_loaded){ + int t=extern_trajectories_thirdSet.getFramesNumber(); + if(maxFrameCount<t) maxFrameCount=t; + } + + int update = ((maxFrameCount*newValue)/ui.framesIndicatorSlider->maximum()); + + // then set the correct position + if(extern_first_dataset_loaded){ + extern_trajectories_firstSet.setFrameCursorTo(update); + //Debug::Error( " first dataset frames update to [1] : " <<update<<endl; + + } + if(extern_second_dataset_loaded){ + extern_trajectories_secondSet.setFrameCursorTo(update); + //Debug::Error( " second dataset frames update to[2] : " <<update<<endl; + + } + if(extern_third_dataset_loaded){ + extern_trajectories_thirdSet.setFrameCursorTo(update); + //Debug::Error( " third dataset frames update to [3] : " <<update<<endl; + } + + +} + +/// update the contrast +/// TODO: now known as framePerScond slider +void MainWindow::slotUpdateContrastSlider(int newValue){ + + // extern_screen_contrast=ui.contrastSettingSlider->value(); + //extern_screen_contrast=newValue; + QString msg; + msg.setNum(newValue); + ui.framePerSecondSliderLabel->setText("Frames Per Second: " +msg +" "); + Debug::Error( " contrast updated to: %d",newValue); + +} + + +///clear the corresponding dataset; +void MainWindow::clearDataSet(int ID){ + + switch(ID){ + case 1: + //extern_trajectories_firstSet.clear(); + extern_trajectories_firstSet.clearFrames(); + extern_trajectories_firstSet.resetFrameCursor(); + extern_first_dataset_loaded=false; + extern_first_dataset_visible=false; + ui.actionFirst_Group->setEnabled(false); + ui.actionFirst_Group->setChecked(false); + slotToggleFirstPedestrianGroup(); + numberOfDatasetLoaded--; + break; + + case 2: + extern_trajectories_secondSet.clearFrames(); + //extern_trajectories_secondSet.clear(); + extern_trajectories_secondSet.resetFrameCursor(); + extern_second_dataset_visible=false; + extern_second_dataset_loaded=false; + ui.actionSecond_Group->setEnabled(false); + ui.actionSecond_Group->setChecked(false); + slotToggleSecondPedestrianGroup(); + numberOfDatasetLoaded--; + break; + + case 3: + extern_trajectories_thirdSet.clearFrames(); + //extern_trajectories_thirdSet.clear(); + extern_trajectories_thirdSet.resetFrameCursor(); + extern_third_dataset_loaded=false; + extern_third_dataset_visible=false; + ui.actionThird_Group->setEnabled(false); + ui.actionThird_Group->setChecked(false); + slotToggleThirdPedestrianGroup(); + numberOfDatasetLoaded--; + break; + + default: + break; + } + + if(numberOfDatasetLoaded<0)numberOfDatasetLoaded=0; + + //finally clear the geometry + slotClearGeometry(); +} + +void MainWindow::resetAllFrameCursor(){ + extern_trajectories_thirdSet.resetFrameCursor(); + extern_trajectories_secondSet.resetFrameCursor(); + extern_trajectories_firstSet.resetFrameCursor(); +} + +/// wait for visualisation thread to shutdown +///@todo why two different threads shutdown procedure. +void MainWindow::waitForVisioThread(){ + while(visualisationThread->isRunning()){ + visualisationThread->wait(200); + Debug::Messages("waiting for visualisation engine to terminate ..."); +#ifdef __linux__ + visualisationThread->quit(); +#else + visualisationThread->terminate(); +#endif + } + Debug::Messages("Visualisation Engine shutdown successfully"); + + //to avoid some sudden shutting down after resuming + extern_shutdown_visual_thread=false; +} + +/// wait for datatransfer thread to be ready +void MainWindow::waitForDataThread(){ + + while(dataTransferThread->isRunning()){ + dataTransferThread->shutdown(); + Debug::Messages("Waiting for network engine to terminate ..."); + dataTransferThread->wait(500); + } + Debug::Messages("Network Engine shutdown successfully."); +} + + +/// set visualisation mode to 2D +void MainWindow::slotToogle2D(){ + if(ui.action2_D->isChecked()){ + extern_is_3D=false; + ui.action3_D->setChecked(false); + SystemSettings::set2D(true); + + }else{ + extern_is_3D=true; + ui.action3_D->setChecked(true); + SystemSettings::set2D(false); + } + visualisationThread->setGeometryVisibility2D(SystemSettings::get2D()); + extern_force_system_update=true; +} + +/// set visualisation mode to 3D +void MainWindow::slotToogle3D(){ + if(ui.action3_D->isChecked()){ + extern_is_3D=true; + ui.action2_D->setChecked(false); + SystemSettings::set2D(false); + + } else { + extern_is_3D=false; + ui.action2_D->setChecked(true); + SystemSettings::set2D(true); + } + visualisationThread->setGeometryVisibility3D(!SystemSettings::get2D()); + extern_force_system_update=true; +} + +void MainWindow::slotFrameSliderPressed(){ + frameSliderHold=true; +} + +void MainWindow::slotFrameSliderReleased(){ + frameSliderHold=false; +} + +void MainWindow::slotToogleShowLegend(){ + if(ui.actionShow_Legend->isChecked()){ + SystemSettings::setShowLegend(true); + }else{ + SystemSettings::setShowLegend(false); + } +} +/*** + * + * @param geodata the geometry data received from the data transfer thread + */ +void MainWindow::slotStartVisualisationThread(QString data,int numberOfAgents,float frameRate){ + + extern_trajectories_firstSet.setNumberOfAgents(numberOfAgents); + + labelFrameNumber->setText("fps: "+QString::number(frameRate)+"/"+QString::number(frameRate)); + + extern_first_dataset_loaded=true; + extern_first_dataset_visible=true; + ui.actionFirst_Group->setEnabled(true); + ui.actionFirst_Group->setChecked(true); + slotToggleFirstPedestrianGroup(); + + QDomDocument doc(""); + data = "<travisto>\n" +data+ "\n</travisto>\n"; + + QString errorMsg=""; + doc.setContent(data,&errorMsg); + + if(!errorMsg.isEmpty()){ + Debug::Error("%s", (const char *)errorMsg.toStdString().c_str()); + return; + } + + QDomNode geoNode =doc.elementsByTagName("geometry").item(0); + FacilityGeometry *geo = parseGeometry(geoNode); + + visualisationThread->slotSetFrameRate(frameRate); + visualisationThread->setGeometry(geo); + visualisationThread->start(); +} + +/// this method is called by the data transfer thread +/// investigate if you should shutdown the thread +void MainWindow::slotShutdownVisualisationThread( bool clearAndStop){ + //FIXME: it could have some side effects. + //you should close this threads + if(clearAndStop){ + extern_shutdown_visual_thread=true; + waitForVisioThread(); + } + clearDataSet(1); +} + +void MainWindow::slotFramesByFramesNavigation(){ + if(ui.actionFrames_Navigation->isChecked()){ + ui.BtNextFrame->setVisible(true); + ui.BtPreviousFrame->setVisible(true); + } + else{ + ui.BtNextFrame->setVisible(false); + ui.BtPreviousFrame->setVisible(false); + } +} + +void MainWindow::slotNextFrame(){ + + if(extern_first_dataset_loaded){ + int newValue=extern_trajectories_firstSet.getFrameCursor()+1; + extern_trajectories_firstSet.setFrameCursorTo(newValue); + //Debug::Error( " update to : " <<newValue<<endl; + } + if(extern_second_dataset_loaded){ + int newValue=extern_trajectories_secondSet.getFrameCursor()+1; + extern_trajectories_secondSet.setFrameCursorTo(newValue); + //Debug::Error( " update to : " <<newValue<<endl; + } + if(extern_third_dataset_loaded){ + int newValue=extern_trajectories_thirdSet.getFrameCursor()+1; + extern_trajectories_thirdSet.setFrameCursorTo(newValue); + //Debug::Error( " update to : " <<newValue<<endl; + + } +} + +void MainWindow::slotPreviousFrame(){ + if(extern_first_dataset_loaded){ + int newValue=extern_trajectories_firstSet.getFrameCursor()-1; + extern_trajectories_firstSet.setFrameCursorTo(newValue); + //Debug::Error( " update to : " <<newValue<<endl; + } + if(extern_second_dataset_loaded){ + int newValue=extern_trajectories_secondSet.getFrameCursor()-1; + extern_trajectories_secondSet.setFrameCursorTo(newValue); + //Debug::Error( " update to : " <<newValue<<endl; + } + if(extern_third_dataset_loaded){ + int newValue=extern_trajectories_thirdSet.getFrameCursor()-1; + extern_trajectories_thirdSet.setFrameCursorTo(newValue); + //Debug::Error( " update to : " <<newValue<<endl; + + } +} + +void MainWindow::slotShowPedestrianCaption(){ + + SystemSettings::setShowCaptions(ui.actionShow_Captions->isChecked()); + extern_force_system_update=true; +} + + +void MainWindow::slotToogleShowAxis(){ + + visualisationThread->setAxisVisible(ui.actionShow_Axis->isChecked()); +} + + +//todo: rename this to slotChangeSettting +void MainWindow::slotChangePedestrianShape(){ + + // Qt::WindowFlags flags = Qt::Window | Qt::WindowCloseButtonHint; + // + // Settings* travistoOptions = new Settings(this); + // travistoOptions->setWindowFlags(flags); + + travistoOptions->show(); + + //shape->deleteLater(); + +} + +void MainWindow::slotCaptionColorAuto(){ + emit signal_controlSequence("CAPTION_AUTO"); +} + +void MainWindow::slotCaptionColorCustom(){ + emit signal_controlSequence("CAPTION_CUSTOM"); +} + +void MainWindow::slotChangeBackgroundColor(){ + + QColorDialog* colorDialog = new QColorDialog(this); + colorDialog->setToolTip("Choose a new color for the background"); + QColor col=colorDialog->getColor(Qt::white,this,"Select new background color"); + + //the user may have cancelled the process + if(col.isValid()==false) return; + + double bkcolor[3]={(double)col.red()/255.0 ,(double)col.green()/255.0 ,(double)col.blue()/255.0}; + visualisationThread->setBackgroundColor(bkcolor); + + delete colorDialog; + +} +/// change the wall color +void MainWindow::slotChangeWallsColor(){ + + QColorDialog* colorDialog = new QColorDialog(this); + colorDialog->setToolTip("Choose a new color for walls"); + QColor col=colorDialog->getColor(Qt::white,this,"Select new wall color"); + + //the user may have cancelled the process + if(col.isValid()==false) return; + + double bkcolor[3]={(double)col.red()/255.0 ,(double)col.green()/255.0 ,(double)col.blue()/255.0}; + + visualisationThread->setWallsColor(bkcolor); + + delete colorDialog; + +} + +/// change the exits color +void MainWindow::slotChangeExitsColor(){ + QColorDialog* colorDialog = new QColorDialog(this); + colorDialog->setToolTip("Choose a new color for walls"); + QColor col=colorDialog->getColor(Qt::white,this,"Select new wall color"); + + //the user may have cancelled the process + if(col.isValid()==false) return; + + double bkcolor[3]={(double)col.red()/255.0 ,(double)col.green()/255.0 ,(double)col.blue()/255.0}; + + visualisationThread->setExitsColor(bkcolor); + + delete colorDialog; +} + +void MainWindow::slotSetCameraPerspectiveToTop(){ + int p= 1; //TOP + + visualisationThread->setCameraPerspective(p); + //disable the virtual agent view + SystemSettings::setVirtualAgent(-1); + //cerr <<"Setting camera view to top"<<endl; +} + +void MainWindow::slotSetCameraPerspectiveToFront(){ + int p= 2; //FRONT + visualisationThread->setCameraPerspective(p); + //disable the virtual agent view + SystemSettings::setVirtualAgent(-1); + // cerr <<"Setting camera view to FRONT"<<endl; +} + +void MainWindow::slotSetCameraPerspectiveToSide(){ + int p= 3; //SIDE + visualisationThread->setCameraPerspective(p); + //disable the virtual agent view + SystemSettings::setVirtualAgent(-1); + //cerr <<"Setting camera view to Side"<<endl; +} + +void MainWindow::slotSetCameraPerspectiveToVirtualAgent(){ + + bool ok=false; + int agent = QInputDialog::getInt(this, tr("choose the agent you want to see the scene through"), tr( + "agent ID(default to 1):"),1,1,500, 1, &ok); + + if (ok) { + int p= 4; //virtual agent + visualisationThread->setCameraPerspective(p); + + //get the virtual agent ID + SystemSettings::setVirtualAgent(agent); + } +} + +/// @todo does it work? mem check? +void MainWindow::slotClearGeometry(){ + visualisationThread->setGeometry(NULL); +} + +void MainWindow::slotErrorOutput(QString err) { + QMessageBox msgBox; + msgBox.setText("Error"); + msgBox.setInformativeText(err); + msgBox.setStandardButtons(QMessageBox::Ok); + msgBox.setIcon(QMessageBox::Critical); + msgBox.exec(); +} + +void MainWindow::slotTakeScreenShot(){ + //extern_take_screenshot=true; + extern_take_screenshot=!extern_take_screenshot; +} + +/// load settings, parsed from the project file +void MainWindow::loadSettings(){ + + Debug::Error("Not implemented"); + +} + +/// start/stop the recording process als png images sequences +void MainWindow::slotRecordPNGsequence(){ + if(!isPlaying){ + slotErrorOutput("Start a video first"); + } + + // get the status from the system settings and toogle it + bool status =SystemSettings::getRecordPNGsequence(); + + if(status){ + ui.actionRecord_PNG_sequences->setText("Record PNG sequence"); + }else{ + ui.actionRecord_PNG_sequences->setText("Stop PNG Recording"); + } + + // toggle the status + SystemSettings::setRecordPNGsequence(!status); + +} + +/// render a PNG image sequence to an AVI video +void MainWindow::slotRenderPNG2AVI(){ + slotErrorOutput("Not Implemented yet, sorry !"); + +} + +void MainWindow::dragEnterEvent(QDragEnterEvent *event){ + if (event->mimeData()->hasFormat("text/uri-list")) + event->acceptProposedAction(); +} + +void MainWindow::dropEvent(QDropEvent *event) { + + if (!extern_offline_mode) { + slotErrorOutput("online mode, ignoring DnD !"); + return; + } + + QList<QUrl> urls = event->mimeData()->urls(); + if (urls.isEmpty()) + return; + + slotStopPlaying(); + + bool mayPlay = false; + + for (int i = 0; i < urls.size(); i++) { + QString fileName = urls[i].toLocalFile(); + if (fileName.isEmpty()) + continue; + if (addPedestrianGroup(numberOfDatasetLoaded + i + 1, fileName)) { + mayPlay = true; + } + } + + if (mayPlay) { + slotStartPlaying(); + } +} + +/// show/hide onscreen information +/// information include Time and pedestrians left in the facility +void MainWindow::slotShowOnScreenInfos(){ + bool value=ui.actionShow_Onscreen_Infos->isChecked(); + visualisationThread->setOnscreenInformationVisibility(value); + SystemSettings::setOnScreenInfos(value); +} + +/// show/hide the geometry captions +void MainWindow::slotShowHideGeometryCaptions(){ + + bool value=ui.actionShow_Geometry_Captions->isChecked(); + visualisationThread->setGeometryLabelsVisibility(value); + //SystemSettings::setOnScreenInfos(value); +} diff --git a/src/travisto.h b/src/MainWindow.h similarity index 98% rename from src/travisto.h rename to src/MainWindow.h index a61f1df63f7bd3f1ce7a9b0a77c11a9e3d101d4f..6c5e91e1035459f675c02c8fc03cd52f31f31e2a 100644 --- a/src/travisto.h +++ b/src/MainWindow.h @@ -34,7 +34,7 @@ #define TRAVISTO_H -#include "ui_travisto.h" +#include "ui_mainwindow.h" #include <QMainWindow> #include <vector> @@ -79,13 +79,13 @@ extern bool extern_second_dataset_visible; extern bool extern_third_dataset_visible; -class TraVisTo : public QMainWindow +class MainWindow : public QMainWindow { Q_OBJECT public: - TraVisTo(QWidget *parent = 0); - virtual ~TraVisTo(); + MainWindow(QWidget *parent = 0); + virtual ~MainWindow(); public Q_SLOTS: @@ -313,7 +313,7 @@ private: private: - Ui::TraVisToClass ui; + Ui::mainwindow ui; bool isPlaying; bool isPaused; diff --git a/src/main.cpp b/src/main.cpp index b75ef2010d9073cf1f23921d161c989b0e230edd..035b704f97107ad5572a422f0071500113e217de 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -52,7 +52,7 @@ #undef VTK_USE_FFMPEG #include <QApplication> -#include "travisto.h" +#include "MainWindow.h" #define vtkErrorMacro (x) () @@ -63,7 +63,7 @@ int main(int argc, char *argv[]) // To ensure that decimal numbers use a "point" instead of "colon" on some systems setlocale(LC_NUMERIC, "en_US" ); - TraVisTo w; + MainWindow w; w.show(); return a.exec(); diff --git a/src/travisto.cpp b/src/travisto.cpp deleted file mode 100644 index d6df14daaaaed7bf176ca883889f17eb8f4a12b4..0000000000000000000000000000000000000000 --- a/src/travisto.cpp +++ /dev/null @@ -1,1566 +0,0 @@ -/** - * @file travisto.cpp - * @author Ulrich Kemloh <kemlohulrich@gmail.com> - * @version 0.1 - * Copyright (C) <2009-2010> - * - * @section LICENSE - * This file is part of OpenPedSim. - * - * OpenPedSim is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * OpenPedSim is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with OpenPedSim. If not, see <http://www.gnu.org/licenses/>. - * - * @section DESCRIPTION - * - * \brief main program class - * - * - * Created on: 11.05.2009 - * - */ - - -#include "travisto.h" -#include "SaxParser.h" -#include "SystemSettings.h" -#include "./forms/Settings.h" - - -#include "extern_var.h" -#include "TrajectoryPoint.h" -#include "Frame.h" -#include "Debug.h" -#include "ThreadVisualisation.h" -#include "ThreadDataTransfert.h" -#include "SimpleVisualisationWindow.h" - -#include "geometry/FacilityGeometry.h" - -#include <QMessageBox> -#include <QtXml/QDomDocument> -#include <QTime> -#include <QApplication> -#include <QCloseEvent> -#include <QThread> -#include <QIODevice> -#include <QDir> -#include <QFile> -#include <QFileDialog> -#include <QInputDialog> -#include <QString> -#include <QColorDialog> -#include <QDebug> -#include <QtXml> - -#include <iostream> -#include <limits> -#include <string> -#include <vector> - -using namespace std; - -TraVisTo::TraVisTo(QWidget *parent) : - QMainWindow(parent) { - ui.setupUi(this); - this->setWindowTitle("TraVisTo"); - - //disable the maximize Button - setWindowFlags( Qt::Window | Qt::WindowMinimizeButtonHint | Qt::WindowCloseButtonHint ); - - //create the 2 threads and connect them - dataTransferThread = new ThreadDataTransfer(this); - visualisationThread = new ThreadVisualisation(this); - - - travistoOptions = new Settings(this); - travistoOptions->setWindowTitle("Settings"); - travistoOptions->setWindowFlags(Qt::Window | Qt::WindowCloseButtonHint); - - - if(!QObject::connect(dataTransferThread, - SIGNAL(signal_controlSequence(const char*)), this, - SLOT(slotControlSequence(const char *)))){ - Debug::Error("dataTransferThread Thread: control sequence could not be connected"); - } - - if(!QObject::connect(dataTransferThread, - SIGNAL(signal_startVisualisationThread(QString,int,float )), this, - SLOT(slotStartVisualisationThread(QString,int,float )))){ - Debug::Error(" signal_startVisualisationThread not connected"); - } - - if(!QObject::connect(dataTransferThread, - SIGNAL(signal_stopVisualisationThread(bool )), this, - SLOT(slotShutdownVisualisationThread(bool )))){ - Debug::Error(" signal_stopVisualisationThread not connected "); - } - - if(!QObject::connect(dataTransferThread, - SIGNAL(signal_errorMessage(QString)), this, - SLOT(slotErrorOutput(QString)))){ - Debug::Error("signal_errorMessage not connected "); - } - - QObject::connect(visualisationThread, - SIGNAL(signal_controlSequences(const char*)), this, - SLOT(slotControlSequence(const char *))); - - QObject::connect(&extern_trajectories_firstSet, - SIGNAL(signal_controlSequences(const char*)), this, - SLOT(slotControlSequence(const char *))); - - QObject::connect(&extern_trajectories_secondSet, - SIGNAL(signal_controlSequences(const char*)), this, - SLOT(slotControlSequence(const char *))); - - QObject::connect(&extern_trajectories_thirdSet, - SIGNAL(signal_controlSequences(const char*)), this, - SLOT(slotControlSequence(const char *))); - - - QObject::connect(dataTransferThread, SIGNAL(signal_CurrentAction(QString)), - this, SLOT(slotCurrentAction(QString))); - - QObject::connect(this, SIGNAL(signal_controlSequence(QString)), - travistoOptions, SLOT(slotControlSequence(QString))); - - isPlaying = false; - isPaused = false; - numberOfDatasetLoaded=0; - frameSliderHold=false; - - - labelCurrentAction = new QLabel(); - labelCurrentAction->setFrameStyle(QFrame::Panel | QFrame::Sunken); - // currentAction->setLineWidth(5); - // currentAction->setMargin(2); - // currentAction->setMidLineWidth(2); - labelCurrentAction->setText(" Idle "); - statusBar()->addPermanentWidget(labelCurrentAction); - - labelFrameNumber = new QLabel(); - labelFrameNumber->setFrameStyle(QFrame::Panel | QFrame::Sunken); - // frameNumber->setLineWidth(5); - // frameNumber->setFixedWidth(80); - // frameNumber->setMargin(2); - // frameNumber->setMidLineWidth(2); - labelFrameNumber->setText("fps:"); - statusBar()->addPermanentWidget(labelFrameNumber); - - labelRecording = new QLabel(); - labelRecording->setFrameStyle(QFrame::Panel | QFrame::Sunken); - labelRecording->setText(" rec: off "); - statusBar()->addPermanentWidget(labelRecording); - - labelMode = new QLabel(); - labelMode->setFrameStyle(QFrame::Panel | QFrame::Sunken); - labelMode->setText(" Offline "); - statusBar()->addPermanentWidget(labelMode); - - - ui.BtNextFrame->setVisible(false); - ui.BtPreviousFrame->setVisible(false); - //TODO: Maybe this is not longer needed - ui.framePerSecondSliderLabel->setVisible(false); - ui.contrastSettingSlider->setVisible(false); - - QStringList arguments =QApplication::arguments(); - int group=1; // there are max 3 groups of pedestrians - bool mayPlay=false; - - // arguments.append("-online"); - // arguments.append("-caption"); - arguments.append("-2D"); - // parse arguments list - if(arguments.size()>1) - for(int argCount=1;argCount<arguments.size();argCount++){ - - QString argument=arguments[argCount]; - - if(argument.compare("help")==0) { - Debug::Error("Usage: ./TraVisTo [file1] [file2] [file3] [-2D] [-caption] [-online [port]]"); - } - else if(argument.compare("-2D")==0) { - ui.action2_D->setChecked(true); - slotToogle2D(); - }else if(argument.compare("-caption")==0) { - ui.actionShow_Captions->setChecked(true); - slotShowPedestrianCaption(); - - }else if(argument.compare("-online")==0) { - slotSetOnlineMode(true); - - // checking for other possible options [ port...] - if(argCount!=arguments.size()-1){ - bool ok=false; - int port = arguments[++argCount].toInt(&ok); - Debug:: - Debug::Messages(" listening port: %d",port); - - if (ok) { - SystemSettings::setListningPort(port); - }else{ // maybe that wasnt the port - argCount--; // to ensure that the "option" will be checked - } - } - mayPlay=true; - - }else if(argument.startsWith("-")) { - const char* std=argument.toStdString().c_str(); - Debug::Error(" unknown options: %s",std); - Debug::Error("Usage: ./TraVisTo [file1] [file2] [file3] [-2D] [-caption] [-online [port] ]"); - - }else if(addPedestrianGroup(group,argument)){ - //slotHelpAbout(); - group++; - mayPlay=true; - } - - } - - if(mayPlay)slotStartPlaying(); -} - -TraVisTo::~TraVisTo() { - - extern_shutdown_visual_thread=true; - extern_recording_enable=false; - - - if (visualisationThread->isRunning()) { - //std::Debug::Messages("Thread visualisation is still running" << std::endl; - waitForVisioThread(); - } - - if (dataTransferThread->isRunning()) { - //std::Debug::Messages("Thread visualisation is still running" << std::endl; - //it is your own fault if you were still recording something - waitForDataThread(); - } - - delete dataTransferThread; - delete visualisationThread; - delete travistoOptions; - delete labelCurrentAction; - delete labelFrameNumber; - delete labelRecording; - delete labelMode; - -} - -void TraVisTo::slotHelpAbout() { - - QMessageBox::about( - this, - "About TraVisTo", - "Version 0.4 build with QT 4.6 and VTK 5.4\n\n" - "TraVisTo stands for Trajectories Visualisation Tool. It is a tool for visualizing pedestrians motion\n" - "developped at the Forschungszentrum Juelich GmbH, Germany\n\n" - "Copyright 2009-2012.\n" - "Authors: Ulrich Kemloh\n\n" - "For questions, contact +49-40-246161-4193 \nor mail at \n" - "u.kemloh@fz-juelich.de\n"); - -} - - - -/** - *setup the network port to bind - * - */ - -void TraVisTo::slotNetworkSettings() { - bool ok; - - int port = QInputDialog::getInt(this, tr("input a port "), tr( - "port(default to 8081):"), 8989, 5000, 65355, 1, &ok); - - if (ok) { - SystemSettings::setListningPort(port); - } -} - - -void TraVisTo::slotStartPlaying() { - - //first reset this variable. just for the case - // the thread was shutdown from the reset option - extern_shutdown_visual_thread = false; - - - if (!isPlaying) { - statusBar()->showMessage(QString::fromUtf8("waiting for data")); - //only start the visualisation thread if in offline modus - // otherwise both threads should be started - if (extern_offline_mode) { - if(anyDatasetLoaded()){ //at least one dataset was loaded, restarting the playback - - // starting the playback from the beginning - extern_trajectories_firstSet.resetFrameCursor(); - extern_trajectories_secondSet.resetFrameCursor(); - extern_trajectories_thirdSet.resetFrameCursor(); - - } else if (!slotAddDataSet()) { //else load a dataset - return;//could not read any data - } - visualisationThread->start(); - - } else /*if (extern_online_mode)*/ { //live visualisation - dataTransferThread->start(); - //visualisationThread->start(); - } - - //enable recording - ui.BtRecord->setEnabled(true); - labelCurrentAction->setText(" playing "); - - ui.action3_D->setEnabled(false); - ui.action2_D->setEnabled(false); - - //disable legend - ui.actionShow_Legend->setEnabled(false); - - //change Icon to Pause - QIcon icon1; - icon1.addPixmap(QPixmap(QString::fromUtf8( - ":/new/iconsS/icons/PauseHot.png")), QIcon::Normal, QIcon::Off); - ui.BtStart->setToolTip("pause the visualisation"); - ui.BtStart->setIcon(icon1); - - //anyDataLoaded=true; - isPlaying = true; - extern_is_pause = false; - - } else if (isPaused) { //resume playing - isPaused = false; - extern_is_pause = false; - //restore the play Icon - QIcon icon1; - icon1.addPixmap(QPixmap(QString::fromUtf8( - ":/new/iconsS/icons/PauseHot.png")), QIcon::Normal, QIcon::Off); - ui.BtStart->setIcon(icon1); - labelCurrentAction->setText(" playing "); - ui.BtStart->setToolTip("pause the visualisation"); - - } else { //call pause - isPaused = true; - extern_is_pause = true; - QIcon icon1; - icon1.addPixmap(QPixmap(QString::fromUtf8( - ":/new/iconsS/icons/Play1Hot.png")), QIcon::Normal, QIcon::Off); - ui.BtStart->setIcon(icon1); - ui.BtStart->setToolTip("resume the visualisation"); - labelCurrentAction->setText(" paused "); - } - - //no matter what, the stop button should be enabled - ui.BtStop->setEnabled(true); -} - -void TraVisTo::slotStopPlaying() { - - if (extern_recording_enable) { - int res = QMessageBox::question(this, "action", - "do you wish to stop the recording?", QMessageBox::Discard - | QMessageBox::Yes, QMessageBox::Yes); - if (res == QMessageBox::Yes) { - extern_recording_enable = false; - //currentAction->setText(" Idle "); - labelRecording->setText("rec: OFF"); - - } else { - return; - } - } - - //shutdown the threads - //fixme: shut the network thread as well - // maybe this is a feature ! - extern_shutdown_visual_thread=true; - waitForVisioThread(); - - //reset all frames cursors - resetAllFrameCursor(); - - //disable/reset all graphical elements - isPlaying = false; - isPaused = false; - resetGraphicalElements(); - labelCurrentAction->setText(" Idle "); -} - -/** - * open a file containing visualisation data, parse them - * and initialize the visualization - * - */ -bool TraVisTo::slotLoadFile() { - - return slotAddDataSet(); - -} - - -// This function is only used in online Mode -FacilityGeometry* TraVisTo::parseGeometry(QDomNode geoNode){ - - cout<<"parsing the geo"<<endl; - if(geoNode.isNull()) return NULL; - - //check if there is a tag 'file' there in - QString fileName = geoNode.toElement().elementsByTagName("file").item(0).toElement().attribute("location"); - FacilityGeometry* geometry = visualisationThread->getGeometry(); - - if(!fileName.isEmpty()) - { - if (fileName.endsWith(".xml",Qt::CaseInsensitive)) - { - //cout<<"good bye"<<endl; exit(0); - //should be a file name - //return parseGeometryPG3(fileName); - //SaxParser::parseGeometryPG3(fileName,geometry); - } - else if (fileName.endsWith(".trav",Qt::CaseInsensitive)) - { - //must not be a file name - SaxParser::parseGeometryTRAV(fileName,geometry); - } - } - // I assume it is a trav format node, - //which is the only one which can directly be inserted into a file - else - { - //must not be a file name - SaxParser::parseGeometryTRAV(fileName,geometry,geoNode); - } - return geometry; -} - -// TODO: still used? -bool TraVisTo::parsePedestrianShapes(QDomNode shapeNode, int groupID){ - - if(shapeNode.isNull()) return false; - QStringList heights; - QStringList colors; - - QDomNodeList agents = shapeNode.toElement().elementsByTagName("agentInfo"); - - for (unsigned int i = 0; i < agents.length(); i++) { - - bool ok=false; - int id=agents.item(i).toElement().attribute("ID").toInt(&ok); - if(!ok) continue; // invalid ID - double height=agents.item(i).toElement().attribute("height").toDouble(&ok); - if(!ok)height=std::numeric_limits<double>::quiet_NaN(); - - int color=agents.item(i).toElement().attribute("color").toDouble(&ok); - if(!ok)color=std::numeric_limits<int>::quiet_NaN(); - Debug::Messages("id= %d height= %lf color =%d",id,height,color); - - if(!isnan(height)){ - heights.append(QString::number(id)); - heights.append(QString::number(height)); - } - if(!isnan(color)){ - colors.append(QString::number(id)); - colors.append(QString::number(color)); - } - - } - switch (groupID){ - - case 1: - extern_trajectories_firstSet.setInitialHeights(heights); - extern_trajectories_firstSet.setInitialColors(colors); - break; - - case 2: - extern_trajectories_secondSet.setInitialHeights(heights); - extern_trajectories_secondSet.setInitialColors(colors); - break; - - case 3: - extern_trajectories_thirdSet.setInitialHeights(heights); - extern_trajectories_thirdSet.setInitialColors(colors); - break; - } - - return true; - -} - - -/// add a new dataset -bool TraVisTo::slotAddDataSet(){ - - if (numberOfDatasetLoaded>=3){ - QMessageBox::information(this,"notice","You can load at most 3 datasets.\n In" - " Order to load other data, please first clear previously loaded data."); - return false; - } - // if at least one data set was loaded - if (numberOfDatasetLoaded>=1){ - int res = QMessageBox::question(this, "action", - "adding a new dataset will reset the visualisation process. Continue?", QMessageBox::Discard - | QMessageBox::Yes, QMessageBox::Yes); - - if (res == QMessageBox::Discard) return false; - - } - - // just continue - numberOfDatasetLoaded++; - if(addPedestrianGroup(numberOfDatasetLoaded)==false){ - numberOfDatasetLoaded--; - return false; - } - - QString stre(numberOfDatasetLoaded); - stre.setNum(numberOfDatasetLoaded); - stre.append(" dataset loaded"); - statusBar()->showMessage(stre); - - return true; -} - -///clear all datasets previously entered. -void TraVisTo::slotClearAllDataset(){ - - clearDataSet(1); - clearDataSet(2); - clearDataSet(3); - numberOfDatasetLoaded=0; -} - - -bool TraVisTo::addPedestrianGroup(int groupID,QString fileName){ - statusBar()->showMessage(tr("Select a file")); - - if(fileName.isEmpty()) - fileName = QFileDialog::getOpenFileName(this, - "Select the file containing data to visualize", - "F:\\workspace\\TraVisTo\\data", - "Visualisation Files (*.dat *.trav *.xml *.pg3 *.jul);;All Files (*.*)"); - - if (fileName.isNull()) { - return false; - } - //the geometry actor - //FacilityGeometry* geometry=NULL; - FacilityGeometry* geometry = visualisationThread->getGeometry(); - - // if xml is detected, just load and show the geometry then exit - if(fileName.endsWith(".xml",Qt::CaseInsensitive)){ - SaxParser::parseGeometryXMLV04(fileName,geometry); - //slotLoadParseShowGeometry(fileName); - //return false; - } - - QFile file(fileName); - if (!file.open(QIODevice::ReadOnly)) { - Debug::Error("could not open the File: ",fileName.toStdString().c_str()); - return false; - } - - SyncData* dataset=NULL; - - - switch(groupID){ - case 1: - Debug::Messages("handling first set"); - dataset=&extern_trajectories_firstSet; - extern_first_dataset_loaded=true; - extern_first_dataset_visible=true; - ui.actionFirst_Group->setEnabled(true); - ui.actionFirst_Group->setChecked(true); - slotToggleFirstPedestrianGroup(); - break; - - case 2: - Debug::Messages("handling second set"); - dataset=&extern_trajectories_secondSet; - extern_second_dataset_loaded=true; - extern_second_dataset_visible=true; - ui.actionSecond_Group->setEnabled(true); - ui.actionSecond_Group->setChecked(true); - slotToggleSecondPedestrianGroup(); - break; - - case 3: - Debug::Messages("handling third set"); - dataset=&extern_trajectories_thirdSet; - extern_third_dataset_loaded=true; - extern_third_dataset_visible=true; - ui.actionThird_Group->setEnabled(true); - ui.actionThird_Group->setChecked(true); - slotToggleThirdPedestrianGroup(); - break; - - default: - Debug::Error("invalid pedestrian group: %d " ,groupID); - Debug::Error("should be 1, 2 or 3"); - return false; - break; - } - - double frameRate=15; //default frame rate - statusBar()->showMessage(tr("parsing the file")); - QXmlInputSource source(&file); - QXmlSimpleReader reader; - - //no other geometry format was detected - if(geometry==NULL) - geometry=new FacilityGeometry(); - SaxParser handler(geometry,dataset,&frameRate); - reader.setContentHandler(&handler); - reader.parse(source); - file.close(); - - - QString frameRateStr=QString::number(frameRate); - SystemSettings::setFilenamePrefix(QFileInfo ( fileName ).baseName()+"_"); - - // set the visualisation window title - visualisationThread->setWindowTitle(fileName); - visualisationThread->slotSetFrameRate(frameRate); - visualisationThread->setGeometry(geometry); - //visualisationThread->setWindowTitle(caption); - labelFrameNumber->setText("fps: " + frameRateStr+"/"+frameRateStr); - - //shutdown the visio thread - extern_shutdown_visual_thread=true; - waitForVisioThread(); - - statusBar()->showMessage(tr("file loaded and parsed")); - - return true; -} - - -void TraVisTo::slotRecord() { - - if (extern_recording_enable) { - int res = QMessageBox::warning(this, "action", - "TraVisTo is already recording a video\n" - "do you wish to stop the recording?", QMessageBox::Yes - | QMessageBox::No, QMessageBox::No); - if (res == QMessageBox::Yes) { - extern_recording_enable = false; - ui.BtRecord->setToolTip("Start Recording"); - labelCurrentAction->setText(" Playing "); - return; - } - } - extern_launch_recording = true; - ui.BtRecord->setToolTip("Stop Recording"); - labelRecording->setText("recording"); - //labelCurrentAction->setText(" recording "); - -} - - -QString TraVisTo::getTagValueFromElement(QDomNode node, - const char * tagName) { - if (node.isNull()) - return ""; - return node.toElement().namedItem(tagName).firstChild().nodeValue(); - -} - -void TraVisTo::slotFullScreen(bool status) { - - Debug::Messages("changing full screen status %d",status); - extern_fullscreen_enable = true; - - //dont forget this. - extern_force_system_update=true; - -} - -void TraVisTo::slotSetOfflineMode(bool status) { - - if (status) { - ui.actionOnline->setChecked(false); - extern_offline_mode = true; - labelMode->setText(" Offline "); - } else { - ui.actionOnline->setChecked(true); - extern_offline_mode = false; - labelMode->setText(" Online "); - - } - -} - -void TraVisTo::slotSetOnlineMode(bool status) { - if (status) { - ui.actionOffline->setChecked(false); - extern_offline_mode = false; - labelMode->setText(" Online "); - } else { - ui.actionOffline->setChecked(true); - extern_offline_mode = true; - labelMode->setText(" Offline "); - - } -} - -void TraVisTo::slotReset() { - - //stop any recording - if (extern_recording_enable) { - int res = QMessageBox::question(this, "action", - "do you wish to stop the recording?", QMessageBox::Discard - | QMessageBox::Yes, QMessageBox::Yes); - if (res == QMessageBox::Yes) { - extern_recording_enable = false; - labelCurrentAction->setText(" Playing "); - }else{ - return; - } - } - - if(anyDatasetLoaded()) - { - int res = QMessageBox::question(this, "action", - "This will also clear any dataset if loaded.\n" - "Do you wish to continue?", QMessageBox::Discard - | QMessageBox::Yes, QMessageBox::Yes); - if (res == QMessageBox::No) { - return; - } - } - - - //shutdown the visual thread - extern_shutdown_visual_thread = true; - waitForVisioThread(); - waitForDataThread(); - - //reset all buttons - //anyDataLoaded = false; - slotClearAllDataset(); - isPlaying = false; - isPaused = false; - labelCurrentAction->setText(" Idle "); - resetGraphicalElements(); - -} - -void TraVisTo::slotCurrentAction(QString msg) { - msg = " " + msg + " "; - //labelCurrentAction->setText(msg); - statusBar()->showMessage(msg); - // labelMode->setText(msg); -} - -void TraVisTo::slotFrameNumber(unsigned long actualFrameCount) { - QString msg; - msg.setNum(actualFrameCount); - - ui.frameSliderLabel->setText("Frame: " + msg); - - //compute the mamixum framenumber - int maxFrameCount=1; - if(extern_first_dataset_loaded){ - maxFrameCount=extern_trajectories_firstSet.getFramesNumber(); - - } - if(extern_second_dataset_loaded){ - int frameCount=extern_trajectories_secondSet.getFramesNumber(); - if(frameCount>maxFrameCount) maxFrameCount=frameCount; - - } - if(extern_third_dataset_loaded){ - int frameCount=extern_trajectories_thirdSet.getFramesNumber(); - if(frameCount>maxFrameCount) maxFrameCount=frameCount; - } - if(!frameSliderHold)if(maxFrameCount!=0)//TODO WTF, otherwise an arrymtic exeption arises - ui.framesIndicatorSlider->setValue((ui.framesIndicatorSlider->maximum()*actualFrameCount)/maxFrameCount); -} - -void TraVisTo::slotRunningTime(unsigned long timems) { - // QString msg; - // msg.setNum(timems); - // msg.append(" milsec"); - //labelRunningTime->setText(msg); - ui.lcdRunningTime->display((int)timems); -} - -void TraVisTo::slotRenderingTime(int fps) -{ - QString msg =labelFrameNumber->text().replace(QRegExp("[0-9]+/"),QString::number(fps)+"/"); - labelFrameNumber->setText(msg); -} - - -void TraVisTo::slotExit() { - cleanUp(); - qApp->exit(); -} - -void TraVisTo::closeEvent(QCloseEvent* event) { - hide(); - cleanUp(); - event->accept(); -} - -/** - * performs the necessary cleaning such as: - * closing data - * stopping recording - */ -void TraVisTo::cleanUp() { - //stop the recording process - extern_recording_enable = false; - extern_shutdown_visual_thread = true; - - if(SystemSettings::getRecordPNGsequence()) - slotRecordPNGsequence(); - - waitForVisioThread(); - waitForDataThread(); - -} - - - -void TraVisTo::slotControlSequence(const char * sex) { - - QString str(sex); - - //todo: check wich stack is empty and disable - // the correspinding datasets. - // are all stacks empty? then stop - // visualisation adn recording if any - if (str.compare("CONTROL_STACK_EMPTY") == 0) { - - statusBar()->showMessage(tr(" stack empty ")); - extern_recording_enable = false; - ui.BtRecord->setToolTip("Start Recording"); - labelRecording->setText(" rec: off "); - - //Debug::Messages("stack empty" << endl; - // Debug::Messages("stoping the playback and recording if any" << endl; - // //extern_recording_enable = false; - // extern_shutdown_visual_thread=true; - // waitForVisioThread(); - // - // //isPlaying = true; //very important - // //isPaused = true; - // //extern_is_pause = true; - // - // - // extern_screen_contrast=1; - // extern_is_pause = false; - // isPlaying=false; - // isPaused=false; - - //pause the system - // QIcon icon1; - // icon1.addPixmap(QPixmap(QString::fromUtf8( - // ":/new/iconsS/icons/Play1Hot.png")), QIcon::Normal, QIcon::Off); - // ui.BtStart->setIcon(icon1); - // labelCurrentAction->setText("paused"); - // extern_is_pause = true; - // isPlaying = true; //very important, cuz the visio was running - // isPaused = true; - // extern_update_step=1; - - - } else if (str.compare("CONTROL_RESET") == 0) { - Debug::Messages("resetting all"); - isPlaying = false; - isPaused = false; - labelCurrentAction->setText(" Idle "); - extern_update_step=1; - //extern_screen_contrast=1; - - //reset the frames cursor - extern_trajectories_firstSet.resetFrameCursor(); - extern_trajectories_secondSet.resetFrameCursor(); - extern_trajectories_thirdSet.resetFrameCursor(); - - resetGraphicalElements(); - - } else if (str.compare("STACK_REACHS_BEGINNING")==0){ - //return to normal speed - if(extern_update_step<0){ - Debug::Messages("stack reaches beginning, resuming the playback with vel 1"); - extern_update_step=1; - ui.speedSettingSlider->setValue(1); - } - - } -} - - -void TraVisTo::resetGraphicalElements(){ - - //restore play button - QIcon icon1; - icon1.addPixmap(QPixmap( - QString::fromUtf8(":/new/iconsS/icons/Play1Hot.png")), - QIcon::Normal, QIcon::Off); - ui.BtStart->setIcon(icon1); - - //disable record button - ui.BtRecord->setEnabled(false); - - //disable fullscreen - ui.BtFullscreen->setEnabled(false); - - //disable stop button - - ui.BtStop->setEnabled(false); - //reset the slider - ui.framesIndicatorSlider->setValue(ui.framesIndicatorSlider->minimum()); - - //reset the speed cursor - ui.speedSettingSlider->setValue(1); - //reset the contrast - - // bla bla - ui.actionShow_Legend->setEnabled(true); - - //restore the play Icon - - // - ui.actionShow_Trajectories->setEnabled(true); - - ui.action3_D->setEnabled(true); - ui.action2_D->setEnabled(true); - - labelRecording->setText("rec: OFF"); - statusBar()->showMessage(tr("select a File")); - - //resetting the start/stop recording action - //check whether the a png recording sequence was playing, stop if the case - if(SystemSettings::getRecordPNGsequence()) - slotRecordPNGsequence(); - -} - - -void TraVisTo::slotToggleFirstPedestrianGroup(){ - if(ui.actionFirst_Group->isChecked()){ - extern_first_dataset_visible=true; - }else{ - extern_first_dataset_visible=false; - } - extern_force_system_update=true; - -} - -/// enable/disable the second pedestrian group -void TraVisTo::slotToggleSecondPedestrianGroup(){ - if(ui.actionSecond_Group->isChecked()){ - extern_second_dataset_visible=true; - }else{ - extern_second_dataset_visible=false; - } - extern_force_system_update=true; -} - -/// enable/disable the third pedestrian group -void TraVisTo::slotToggleThirdPedestrianGroup(){ - if(ui.actionThird_Group->isChecked()){ - extern_third_dataset_visible=true; - }else{ - extern_third_dataset_visible=false; - } - extern_force_system_update=true; -} - -bool TraVisTo::anyDatasetLoaded(){ - return - (extern_first_dataset_loaded|| - extern_second_dataset_loaded|| - extern_third_dataset_loaded); -} - -void TraVisTo::slotShowTrajectoryOnly(){ - if(ui.actionShow_Trajectories->isChecked()){ - //visualisationThread->setTrailVisibility(true); - extern_tracking_enable=true; - //ui.actionShow_Trajectories->setEnabled(false); - }else{ - extern_tracking_enable=false; - //visualisationThread->setTrailVisibility(false); - } -} - - -/// TODO: implement me -void TraVisTo::slotShowPedestrianOnly(){ - Debug::Error("Not implemented"); -} - -void TraVisTo::slotShowGeometry(){ - - if (ui.actionShow_Geometry->isChecked()){ - visualisationThread->setGeometryVisibility(true); - ui.actionShow_Exits->setEnabled(true); - ui.actionShow_Walls->setEnabled(true); - } - else{ - visualisationThread->setGeometryVisibility(false); - ui.actionShow_Exits->setEnabled(false); - ui.actionShow_Walls->setEnabled(false); - } - -} - -/// shows/hide geometry -void TraVisTo::slotShowHideExits(){ - if (ui.actionShow_Exits->isChecked()){ - visualisationThread->showDoors(true); - } - else{ - visualisationThread->showDoors(false); - } -} - -/// shows/hide geometry -void TraVisTo::slotShowHideWalls(){ - if (ui.actionShow_Walls->isChecked()){ - visualisationThread->showWalls(true); - } - else{ - visualisationThread->showWalls(false); - } -} - - -/// update the playing speed -void TraVisTo::slotUpdateSpeedSlider(int newValue){ - - QString msg; - msg.setNum(newValue); - - extern_update_step=newValue; - //Debug::Error( " speed updated to: %d", extern_update_step); - ui.speedSliderLabel->setText("Speed: " + msg + " "); - -} - -/// update the position slider -void TraVisTo::slotUpdateFrameSlider(int newValue){ - - // first get the correct position - int maxFrameCount=1; - if(extern_first_dataset_loaded){ - int t=extern_trajectories_firstSet.getFramesNumber(); - if(maxFrameCount<t) maxFrameCount=t; - } - if(extern_second_dataset_loaded){ - int t=extern_trajectories_secondSet.getFramesNumber(); - if(maxFrameCount<t) maxFrameCount=t; - - } - if(extern_third_dataset_loaded){ - int t=extern_trajectories_thirdSet.getFramesNumber(); - if(maxFrameCount<t) maxFrameCount=t; - } - - int update = ((maxFrameCount*newValue)/ui.framesIndicatorSlider->maximum()); - - // then set the correct position - if(extern_first_dataset_loaded){ - extern_trajectories_firstSet.setFrameCursorTo(update); - //Debug::Error( " first dataset frames update to [1] : " <<update<<endl; - - } - if(extern_second_dataset_loaded){ - extern_trajectories_secondSet.setFrameCursorTo(update); - //Debug::Error( " second dataset frames update to[2] : " <<update<<endl; - - } - if(extern_third_dataset_loaded){ - extern_trajectories_thirdSet.setFrameCursorTo(update); - //Debug::Error( " third dataset frames update to [3] : " <<update<<endl; - } - - -} - -/// update the contrast -/// TODO: now known as framePerScond slider -void TraVisTo::slotUpdateContrastSlider(int newValue){ - - // extern_screen_contrast=ui.contrastSettingSlider->value(); - //extern_screen_contrast=newValue; - QString msg; - msg.setNum(newValue); - ui.framePerSecondSliderLabel->setText("Frames Per Second: " +msg +" "); - Debug::Error( " contrast updated to: %d",newValue); - -} - - -///clear the corresponding dataset; -void TraVisTo::clearDataSet(int ID){ - - switch(ID){ - case 1: - //extern_trajectories_firstSet.clear(); - extern_trajectories_firstSet.clearFrames(); - extern_trajectories_firstSet.resetFrameCursor(); - extern_first_dataset_loaded=false; - extern_first_dataset_visible=false; - ui.actionFirst_Group->setEnabled(false); - ui.actionFirst_Group->setChecked(false); - slotToggleFirstPedestrianGroup(); - numberOfDatasetLoaded--; - break; - - case 2: - extern_trajectories_secondSet.clearFrames(); - //extern_trajectories_secondSet.clear(); - extern_trajectories_secondSet.resetFrameCursor(); - extern_second_dataset_visible=false; - extern_second_dataset_loaded=false; - ui.actionSecond_Group->setEnabled(false); - ui.actionSecond_Group->setChecked(false); - slotToggleSecondPedestrianGroup(); - numberOfDatasetLoaded--; - break; - - case 3: - extern_trajectories_thirdSet.clearFrames(); - //extern_trajectories_thirdSet.clear(); - extern_trajectories_thirdSet.resetFrameCursor(); - extern_third_dataset_loaded=false; - extern_third_dataset_visible=false; - ui.actionThird_Group->setEnabled(false); - ui.actionThird_Group->setChecked(false); - slotToggleThirdPedestrianGroup(); - numberOfDatasetLoaded--; - break; - - default: - break; - } - - if(numberOfDatasetLoaded<0)numberOfDatasetLoaded=0; - - //finally clear the geometry - slotClearGeometry(); -} - -void TraVisTo::resetAllFrameCursor(){ - extern_trajectories_thirdSet.resetFrameCursor(); - extern_trajectories_secondSet.resetFrameCursor(); - extern_trajectories_firstSet.resetFrameCursor(); -} - -/// wait for visualisation thread to shutdown -///@todo why two different threads shutdown procedure. -void TraVisTo::waitForVisioThread(){ - while(visualisationThread->isRunning()){ - visualisationThread->wait(200); - Debug::Messages("waiting for visualisation engine to terminate ..."); -#ifdef __linux__ - visualisationThread->quit(); -#else - visualisationThread->terminate(); -#endif - } - Debug::Messages("Visualisation Engine shutdown successfully"); - - //to avoid some sudden shutting down after resuming - extern_shutdown_visual_thread=false; -} - -/// wait for datatransfer thread to be ready -void TraVisTo::waitForDataThread(){ - - while(dataTransferThread->isRunning()){ - dataTransferThread->shutdown(); - Debug::Messages("Waiting for network engine to terminate ..."); - dataTransferThread->wait(500); - } - Debug::Messages("Network Engine shutdown successfully."); -} - - -/// set visualisation mode to 2D -void TraVisTo::slotToogle2D(){ - if(ui.action2_D->isChecked()){ - extern_is_3D=false; - ui.action3_D->setChecked(false); - SystemSettings::set2D(true); - - }else{ - extern_is_3D=true; - ui.action3_D->setChecked(true); - SystemSettings::set2D(false); - } - visualisationThread->setGeometryVisibility2D(SystemSettings::get2D()); - extern_force_system_update=true; -} - -/// set visualisation mode to 3D -void TraVisTo::slotToogle3D(){ - if(ui.action3_D->isChecked()){ - extern_is_3D=true; - ui.action2_D->setChecked(false); - SystemSettings::set2D(false); - - } else { - extern_is_3D=false; - ui.action2_D->setChecked(true); - SystemSettings::set2D(true); - } - visualisationThread->setGeometryVisibility3D(!SystemSettings::get2D()); - extern_force_system_update=true; -} - -void TraVisTo::slotFrameSliderPressed(){ - frameSliderHold=true; -} - -void TraVisTo::slotFrameSliderReleased(){ - frameSliderHold=false; -} - -void TraVisTo::slotToogleShowLegend(){ - if(ui.actionShow_Legend->isChecked()){ - SystemSettings::setShowLegend(true); - }else{ - SystemSettings::setShowLegend(false); - } -} -/*** - * - * @param geodata the geometry data received from the data transfer thread - */ -void TraVisTo::slotStartVisualisationThread(QString data,int numberOfAgents,float frameRate){ - - extern_trajectories_firstSet.setNumberOfAgents(numberOfAgents); - - labelFrameNumber->setText("fps: "+QString::number(frameRate)+"/"+QString::number(frameRate)); - - extern_first_dataset_loaded=true; - extern_first_dataset_visible=true; - ui.actionFirst_Group->setEnabled(true); - ui.actionFirst_Group->setChecked(true); - slotToggleFirstPedestrianGroup(); - - QDomDocument doc(""); - data = "<travisto>\n" +data+ "\n</travisto>\n"; - - QString errorMsg=""; - doc.setContent(data,&errorMsg); - - if(!errorMsg.isEmpty()){ - Debug::Error("%s", (const char *)errorMsg.toStdString().c_str()); - return; - } - - QDomNode geoNode =doc.elementsByTagName("geometry").item(0); - FacilityGeometry *geo = parseGeometry(geoNode); - - visualisationThread->slotSetFrameRate(frameRate); - visualisationThread->setGeometry(geo); - visualisationThread->start(); -} - -/// this method is called by the data transfer thread -/// investigate if you should shutdown the thread -void TraVisTo::slotShutdownVisualisationThread( bool clearAndStop){ - //FIXME: it could have some side effects. - //you should close this threads - if(clearAndStop){ - extern_shutdown_visual_thread=true; - waitForVisioThread(); - } - clearDataSet(1); -} - -void TraVisTo::slotFramesByFramesNavigation(){ - if(ui.actionFrames_Navigation->isChecked()){ - ui.BtNextFrame->setVisible(true); - ui.BtPreviousFrame->setVisible(true); - } - else{ - ui.BtNextFrame->setVisible(false); - ui.BtPreviousFrame->setVisible(false); - } -} - -void TraVisTo::slotNextFrame(){ - - if(extern_first_dataset_loaded){ - int newValue=extern_trajectories_firstSet.getFrameCursor()+1; - extern_trajectories_firstSet.setFrameCursorTo(newValue); - //Debug::Error( " update to : " <<newValue<<endl; - } - if(extern_second_dataset_loaded){ - int newValue=extern_trajectories_secondSet.getFrameCursor()+1; - extern_trajectories_secondSet.setFrameCursorTo(newValue); - //Debug::Error( " update to : " <<newValue<<endl; - } - if(extern_third_dataset_loaded){ - int newValue=extern_trajectories_thirdSet.getFrameCursor()+1; - extern_trajectories_thirdSet.setFrameCursorTo(newValue); - //Debug::Error( " update to : " <<newValue<<endl; - - } -} - -void TraVisTo::slotPreviousFrame(){ - if(extern_first_dataset_loaded){ - int newValue=extern_trajectories_firstSet.getFrameCursor()-1; - extern_trajectories_firstSet.setFrameCursorTo(newValue); - //Debug::Error( " update to : " <<newValue<<endl; - } - if(extern_second_dataset_loaded){ - int newValue=extern_trajectories_secondSet.getFrameCursor()-1; - extern_trajectories_secondSet.setFrameCursorTo(newValue); - //Debug::Error( " update to : " <<newValue<<endl; - } - if(extern_third_dataset_loaded){ - int newValue=extern_trajectories_thirdSet.getFrameCursor()-1; - extern_trajectories_thirdSet.setFrameCursorTo(newValue); - //Debug::Error( " update to : " <<newValue<<endl; - - } -} - -void TraVisTo::slotShowPedestrianCaption(){ - - SystemSettings::setShowCaptions(ui.actionShow_Captions->isChecked()); - extern_force_system_update=true; -} - - -void TraVisTo::slotToogleShowAxis(){ - - visualisationThread->setAxisVisible(ui.actionShow_Axis->isChecked()); -} - - -//todo: rename this to slotChangeSettting -void TraVisTo::slotChangePedestrianShape(){ - - // Qt::WindowFlags flags = Qt::Window | Qt::WindowCloseButtonHint; - // - // Settings* travistoOptions = new Settings(this); - // travistoOptions->setWindowFlags(flags); - - travistoOptions->show(); - - //shape->deleteLater(); - -} - -void TraVisTo::slotCaptionColorAuto(){ - emit signal_controlSequence("CAPTION_AUTO"); -} - -void TraVisTo::slotCaptionColorCustom(){ - emit signal_controlSequence("CAPTION_CUSTOM"); -} - -void TraVisTo::slotChangeBackgroundColor(){ - - QColorDialog* colorDialog = new QColorDialog(this); - colorDialog->setToolTip("Choose a new color for the background"); - QColor col=colorDialog->getColor(Qt::white,this,"Select new background color"); - - //the user may have cancelled the process - if(col.isValid()==false) return; - - double bkcolor[3]={(double)col.red()/255.0 ,(double)col.green()/255.0 ,(double)col.blue()/255.0}; - visualisationThread->setBackgroundColor(bkcolor); - - delete colorDialog; - -} -/// change the wall color -void TraVisTo::slotChangeWallsColor(){ - - QColorDialog* colorDialog = new QColorDialog(this); - colorDialog->setToolTip("Choose a new color for walls"); - QColor col=colorDialog->getColor(Qt::white,this,"Select new wall color"); - - //the user may have cancelled the process - if(col.isValid()==false) return; - - double bkcolor[3]={(double)col.red()/255.0 ,(double)col.green()/255.0 ,(double)col.blue()/255.0}; - - visualisationThread->setWallsColor(bkcolor); - - delete colorDialog; - -} - -/// change the exits color -void TraVisTo::slotChangeExitsColor(){ - QColorDialog* colorDialog = new QColorDialog(this); - colorDialog->setToolTip("Choose a new color for walls"); - QColor col=colorDialog->getColor(Qt::white,this,"Select new wall color"); - - //the user may have cancelled the process - if(col.isValid()==false) return; - - double bkcolor[3]={(double)col.red()/255.0 ,(double)col.green()/255.0 ,(double)col.blue()/255.0}; - - visualisationThread->setExitsColor(bkcolor); - - delete colorDialog; -} - -void TraVisTo::slotSetCameraPerspectiveToTop(){ - int p= 1; //TOP - - visualisationThread->setCameraPerspective(p); - //disable the virtual agent view - SystemSettings::setVirtualAgent(-1); - //cerr <<"Setting camera view to top"<<endl; -} - -void TraVisTo::slotSetCameraPerspectiveToFront(){ - int p= 2; //FRONT - visualisationThread->setCameraPerspective(p); - //disable the virtual agent view - SystemSettings::setVirtualAgent(-1); - // cerr <<"Setting camera view to FRONT"<<endl; -} - -void TraVisTo::slotSetCameraPerspectiveToSide(){ - int p= 3; //SIDE - visualisationThread->setCameraPerspective(p); - //disable the virtual agent view - SystemSettings::setVirtualAgent(-1); - //cerr <<"Setting camera view to Side"<<endl; -} - -void TraVisTo::slotSetCameraPerspectiveToVirtualAgent(){ - - bool ok=false; - int agent = QInputDialog::getInt(this, tr("choose the agent you want to see the scene through"), tr( - "agent ID(default to 1):"),1,1,500, 1, &ok); - - if (ok) { - int p= 4; //virtual agent - visualisationThread->setCameraPerspective(p); - - //get the virtual agent ID - SystemSettings::setVirtualAgent(agent); - } -} - -/// @todo does it work? mem check? -void TraVisTo::slotClearGeometry(){ - visualisationThread->setGeometry(NULL); -} - -void TraVisTo::slotErrorOutput(QString err) { - QMessageBox msgBox; - msgBox.setText("Error"); - msgBox.setInformativeText(err); - msgBox.setStandardButtons(QMessageBox::Ok); - msgBox.setIcon(QMessageBox::Critical); - msgBox.exec(); -} - -void TraVisTo::slotTakeScreenShot(){ - //extern_take_screenshot=true; - extern_take_screenshot=!extern_take_screenshot; -} - -/// load settings, parsed from the project file -void TraVisTo::loadSettings(){ - - Debug::Error("Not implemented"); - -} - -/// start/stop the recording process als png images sequences -void TraVisTo::slotRecordPNGsequence(){ - if(!isPlaying){ - slotErrorOutput("Start a video first"); - } - - // get the status from the system settings and toogle it - bool status =SystemSettings::getRecordPNGsequence(); - - if(status){ - ui.actionRecord_PNG_sequences->setText("Record PNG sequence"); - }else{ - ui.actionRecord_PNG_sequences->setText("Stop PNG Recording"); - } - - // toggle the status - SystemSettings::setRecordPNGsequence(!status); - -} - -/// render a PNG image sequence to an AVI video -void TraVisTo::slotRenderPNG2AVI(){ - slotErrorOutput("Not Implemented yet, sorry !"); - -} - -void TraVisTo::dragEnterEvent(QDragEnterEvent *event){ - if (event->mimeData()->hasFormat("text/uri-list")) - event->acceptProposedAction(); -} - -void TraVisTo::dropEvent(QDropEvent *event) { - - if (!extern_offline_mode) { - slotErrorOutput("online mode, ignoring DnD !"); - return; - } - - QList<QUrl> urls = event->mimeData()->urls(); - if (urls.isEmpty()) - return; - - slotStopPlaying(); - - bool mayPlay = false; - - for (int i = 0; i < urls.size(); i++) { - QString fileName = urls[i].toLocalFile(); - if (fileName.isEmpty()) - continue; - if (addPedestrianGroup(numberOfDatasetLoaded + i + 1, fileName)) { - mayPlay = true; - } - } - - if (mayPlay) { - slotStartPlaying(); - } -} - -/// show/hide onscreen information -/// information include Time and pedestrians left in the facility -void TraVisTo::slotShowOnScreenInfos(){ - bool value=ui.actionShow_Onscreen_Infos->isChecked(); - visualisationThread->setOnscreenInformationVisibility(value); - SystemSettings::setOnScreenInfos(value); -} - -/// show/hide the geometry captions -void TraVisTo::slotShowHideGeometryCaptions(){ - - bool value=ui.actionShow_Geometry_Captions->isChecked(); - visualisationThread->setGeometryLabelsVisibility(value); - //SystemSettings::setOnScreenInfos(value); -}