diff --git a/JPSvis.pro b/JPSvis.pro index 924daac5dcaee8834f1fc9c071b0eb6ada7be40b..da3e562e547664a96fb0660b739bbeec107ce6b8 100644 --- a/JPSvis.pro +++ b/JPSvis.pro @@ -601,7 +601,8 @@ HEADERS += src/geometry/Building.h \ src/network/TraVisToServer.h \ src/MainWindow.h \ src/TrailPlotter.h \ - src/fix/osx_thread_fix.mm + src/fix/osx_thread_fix.mm \ + src/geometry/GeometryFactory.h SOURCES += src/geometry/Building.cpp \ src/geometry/Crossing.cpp \ @@ -643,7 +644,8 @@ SOURCES += src/geometry/Building.cpp \ src/geometry/PointPlotter.cpp \ src/network/TraVisToServer.cpp \ src/MainWindow.cpp \ - src/TrailPlotter.cpp + src/TrailPlotter.cpp \ + src/geometry/GeometryFactory.cpp FORMS += forms/settings.ui \ forms/mainwindow.ui diff --git a/forms/mainwindow.ui b/forms/mainwindow.ui index 6397f294d7cad1d58910691b9cc5bbc98ee616f6..21186d13457f8dc8680e207fdd78cdd97dbced63 100644 --- a/forms/mainwindow.ui +++ b/forms/mainwindow.ui @@ -634,6 +634,7 @@ border-color: rgb(255, 255, 255);</string> <addaction name="separator"/> <addaction name="actionShow_Onscreen_Infos"/> <addaction name="separator"/> + <addaction name="actionShowGeometry_Structure"/> </widget> <widget class="QMenu" name="menuTools"> <property name="title"> @@ -1304,6 +1305,20 @@ border-color: rgb(255, 255, 255);</string> <string>Remember Settings</string> </property> </action> + <action name="actionShowGeometry_Structure"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="text"> + <string>Show Geometry Structure</string> + </property> + <property name="toolTip"> + <string>Display the structure of the geometry </string> + </property> + <property name="shortcut"> + <string>Ctrl+G</string> + </property> + </action> </widget> <resources> <include location="icons.qrc"/> @@ -1359,7 +1374,7 @@ border-color: rgb(255, 255, 255);</string> </connection> <connection> <sender>BtFullscreen</sender> - <signal>clicked(bool)</signal> + <signal>toggled(bool)</signal> <receiver>mainwindow</receiver> <slot>slotFullScreen(bool)</slot> <hints> @@ -2141,6 +2156,22 @@ border-color: rgb(255, 255, 255);</string> </hint> </hints> </connection> + <connection> + <sender>actionShowGeometry_Structure</sender> + <signal>triggered()</signal> + <receiver>mainwindow</receiver> + <slot>slotShowGeometryStructure()</slot> + <hints> + <hint type="sourcelabel"> + <x>-1</x> + <y>-1</y> + </hint> + <hint type="destinationlabel"> + <x>224</x> + <y>199</y> + </hint> + </hints> + </connection> </connections> <slots> <slot>slotHelpAbout()</slot> @@ -2204,5 +2235,6 @@ border-color: rgb(255, 255, 255);</string> <slot>slotChangeNavLinesColor()</slot> <slot>slotShowHideFloor()</slot> <slot>slotChangeFloorColor()</slot> + <slot>slotShowGeometryStructure()</slot> </slots> </ui> diff --git a/src/Frame.cpp b/src/Frame.cpp index 8d75c2a72a3a65877a03df2d06a3c1d7f8718057..9aba040823a6ebf407111958ed2b45cc7d2242c4 100644 --- a/src/Frame.cpp +++ b/src/Frame.cpp @@ -51,12 +51,10 @@ Frame::Frame(int id) { _elementCursor=0; _id=id; - //_polydata = vtkPolyData::New(); _polydata2D = vtkPolyData::New(); _polydata3D = vtkPolyData::New(); _framePoints.reserve(1500); } - Frame::~Frame() { while (!_framePoints.empty()) { diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index e0e97fc0fe5db21d18e464cbe3f661b12983e3a5..fe3af9a322bd6dacefbd23a41d06ee87cf93990e 100755 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -7,12 +7,12 @@ * @section LICENSE * This file is part of OpenPedSim. * - * OpenPedSim is free software: you can redistribute it and/or modify + * JuPedSim 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, + * JuPedSim 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. @@ -62,6 +62,12 @@ #include <QDebug> #include <QtXml> #include <QTemporaryFile> +#include <QListView> +#include <QFileSystemModel> +#include <QTableView> +#include <QSplitter> +#include <QStandardItemModel> + #include <iostream> #include <limits> @@ -151,6 +157,10 @@ MainWindow::MainWindow(QWidget *parent) : QObject::connect(this, SIGNAL(signal_controlSequence(QString)), travistoOptions, SLOT(slotControlSequence(QString))); + + QObject::connect(&visualisationThread->getGeometry().GetModel(), + SIGNAL(itemChanged(QStandardItem*)),this,SLOT(slotOnGeometryItemChanged(QStandardItem*))); + isPlaying = false; isPaused = false; numberOfDatasetLoaded=0; @@ -449,14 +459,14 @@ bool MainWindow::slotLoadFile() } // This function is only used in online Mode -FacilityGeometry* MainWindow::parseGeometry(QDomNode geoNode) +void MainWindow::parseGeometry(const QDomNode &geoNode) { cout<<"parsing the geo"<<endl; - if(geoNode.isNull()) return NULL; + if(geoNode.isNull()) return ; //check if there is a tag 'file' there in QString fileName = geoNode.toElement().elementsByTagName("file").item(0).toElement().attribute("location"); - FacilityGeometry* geometry = visualisationThread->getGeometry(); + auto&& geometry = visualisationThread->getGeometry(); if(!fileName.isEmpty()) { if (fileName.endsWith(".xml",Qt::CaseInsensitive)) { @@ -482,11 +492,11 @@ FacilityGeometry* MainWindow::parseGeometry(QDomNode geoNode) //must not be a file name SaxParser::parseGeometryTRAV(fileName,geometry,geoNode); } - return geometry; + //return geometry; } // This function is only used in online Mode -FacilityGeometry* MainWindow::parseGeometry(QString geometryString) +void MainWindow::parseGeometry(const QString& geometryString) { // QDomDocument doc(""); @@ -524,7 +534,7 @@ FacilityGeometry* MainWindow::parseGeometry(QString geometryString) //cout<<"filename: "<<geofileName.toStdString()<<endl;exit(0); - FacilityGeometry* geometry = visualisationThread->getGeometry(); + auto&& geometry = visualisationThread->getGeometry(); @@ -553,7 +563,7 @@ FacilityGeometry* MainWindow::parseGeometry(QString geometryString) //delete the file file.remove(); - return geometry; + } // TODO: still used? @@ -649,7 +659,7 @@ bool MainWindow::addPedestrianGroup(int groupID,QString fileName) SystemSettings::setFilenamePrefix(QFileInfo ( fileName ).baseName()+"_"); //the geometry actor - FacilityGeometry* geometry = visualisationThread->getGeometry(); + auto&& geometry = visualisationThread->getGeometry(); //try to get a geometry filename QString geometry_file=SaxParser::extractGeometryFilename(fileName); @@ -713,9 +723,6 @@ bool MainWindow::addPedestrianGroup(int groupID,QString fileName) } //no other geometry format was detected - if(geometry==NULL) - geometry=new FacilityGeometry(); - double frameRate=15; //default frame rate statusBar()->showMessage(tr("parsing the file")); @@ -726,7 +733,7 @@ bool MainWindow::addPedestrianGroup(int groupID,QString fileName) QXmlInputSource source(&file); QXmlSimpleReader reader; - SaxParser handler(geometry,dataset,&frameRate); + SaxParser handler(geometry,*dataset,&frameRate); reader.setContentHandler(&handler); reader.parse(source); file.close(); @@ -743,7 +750,7 @@ bool MainWindow::addPedestrianGroup(int groupID,QString fileName) // set the visualisation window title visualisationThread->setWindowTitle(fileName); visualisationThread->slotSetFrameRate(frameRate); - visualisationThread->setGeometry(geometry); + //visualisationThread->setGeometry(geometry); //visualisationThread->setWindowTitle(caption); labelFrameNumber->setText("fps: " + frameRateStr+"/"+frameRateStr); @@ -807,9 +814,7 @@ void MainWindow::slotSetOfflineMode(bool status) ui.actionOnline->setChecked(true); extern_offline_mode = false; labelMode->setText(" Online "); - } - } void MainWindow::slotSetOnlineMode(bool status) @@ -1326,10 +1331,9 @@ void MainWindow::slotStartVisualisationThread(QString data,int numberOfAgents,fl } //FacilityGeometry *geo = parseGeometry(geoNode); - FacilityGeometry *geo = parseGeometry(data); - + parseGeometry(data); visualisationThread->slotSetFrameRate(frameRate); - visualisationThread->setGeometry(geo); + //visualisationThread->setGeometry(geo); visualisationThread->start(); //enable some buttons @@ -1841,3 +1845,74 @@ void MainWindow::slotShowHideGeometryCaptions() //SystemSettings::setShowCaptions(value); //SystemSettings::setOnScreenInfos(value); } + +void MainWindow::slotShowGeometryStructure() +{ + //QListView list; + _geoStructure.setWindowTitle("Geometry structure"); + _geoStructure.setVisible(! _geoStructure.isVisible()); + _geoStructure.show(); + visualisationThread->getGeometry().RefreshView(); + _geoStructure.setModel(&visualisationThread->getGeometry().GetModel()); + cout<<"showing the list"<<endl; + + + /* + QFileSystemModel *model = new QFileSystemModel; + model->setRootPath(QDir::currentPath()); + QTreeView *tree = new QTreeView(&_splitter); + tree->setModel(model); + _splitter.show(); +*/ + + /* + QTreeView *tree = new QTreeView(&_splitter); + QListView *list = new QListView(); + QTableView *table = new QTableView(); + + + _splitter.addWidget( tree ); + _splitter.addWidget( list ); + _splitter.addWidget( table ); + + QStandardItemModel* model = new QStandardItemModel( 5, 2 ); + + for( int r=0; r<5; r++ ) + for( int c=0; c<2; c++) + { + QStandardItem *item = new QStandardItem( QString("Row:%0, Column:%1").arg(r).arg(c) ); + item->setCheckable(true); + + if( c == 0 ) + for( int i=0; i<3; i++ ) + { + QStandardItem *child = new QStandardItem( QString("Item %0").arg(i) ); + child->setEditable( false ); + child->setCheckable(true); + item->appendRow( child ); + cout<<"adding"<<endl; + } + + model->setItem(r, c, item); + } + + model->setHorizontalHeaderItem( 0, new QStandardItem( "Foo" ) ); + model->setHorizontalHeaderItem( 1, new QStandardItem( "Bar-Baz" ) ); + + tree->setModel( model ); + list->setModel( model ); + table->setModel( model ); + + list->setSelectionModel( tree->selectionModel() ); + table->setSelectionModel( tree->selectionModel() ); + + table->setSelectionBehavior( QAbstractItemView::SelectRows ); + table->setSelectionMode( QAbstractItemView::SingleSelection ); + _splitter.show(); +*/ +} + +void MainWindow::slotOnGeometryItemChanged( QStandardItem *item) +{ + cout<<"triggered"<<endl; +} diff --git a/src/MainWindow.h b/src/MainWindow.h index 7cffd303d463dfb56e7a7f1fadf56e3b334a162f..a2df0c2bad98a2504785412c94a33a14e61fa0f2 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -37,6 +37,10 @@ #include "ui_mainwindow.h" #include <QMainWindow> #include <QSettings> +#include <QSplitter> +#include <QTreeView> +#include <QStandardItem> +#include <QTreeWidget> #include <vector> @@ -47,6 +51,7 @@ class ThreadVisualisation; class QString; class QDomNode; class FacilityGeometry; +class GeometryFactory; class Building; class Message; class Settings; @@ -236,6 +241,11 @@ public Q_SLOTS: /// information include Time and pedestrians left in the facility void slotShowOnScreenInfos(); + ///show the detailed structure of the geometry + void slotShowGeometryStructure(); + + void slotOnGeometryItemChanged(QStandardItem *item); + private: Q_SIGNALS: void signal_controlSequence(QString); @@ -264,8 +274,8 @@ private: /// parse the geometry Node and return a pointer to geometry object /// used in online mode only - FacilityGeometry* parseGeometry(QDomNode geoNode); - FacilityGeometry* parseGeometry(QString geometryString); + void parseGeometry(const QDomNode& geoNode); + void parseGeometry(const QString &geometryString); /** * parse a shape node and get the initials heights and colors of pedestrians. @@ -317,6 +327,10 @@ private: QLabel *labelFrameNumber; QLabel *labelRecording; QLabel *labelMode; + QSplitter _splitter; + //QTreeWidget _geoStructure; + QTreeView _geoStructure; + }; #endif // TRAVISTO_H diff --git a/src/SaxParser.cpp b/src/SaxParser.cpp index 9b3631cf4fc7e91942b4aba0e0c01ca4abe205d4..01ef8bc3431a0176f492fd3d6ace6a1575fe24be 100644 --- a/src/SaxParser.cpp +++ b/src/SaxParser.cpp @@ -37,6 +37,8 @@ #include "geometry/JPoint.h" #include "geometry/FacilityGeometry.h" #include "geometry/Building.h" +#include "geometry/GeometryFactory.h" + #include "geometry/Wall.h" #include "geometry/SubRoom.h" @@ -79,15 +81,17 @@ using namespace std; * @param roomCaption * @return */ -SaxParser::SaxParser(FacilityGeometry* geo, SyncData* data, double* fps) +SaxParser::SaxParser(GeometryFactory& geoFac, SyncData& dataset, double * fps):_geoFactory(geoFac),_dataset(dataset) { - _geometry=geo; - _dataset=data; _para=fps; _parsingWalls=false; _parsingCrossings=false; _color=0.0; - _dataset->clearFrames(); + _dataset.clearFrames(); + + _geometry = std::shared_ptr<FacilityGeometry>(new FacilityGeometry("No name")); + _geoFactory.AddElement(-1,-1,_geometry); + //default header InitHeader(0,0,0); } @@ -134,16 +138,16 @@ bool SaxParser::startElement(const QString & /* namespaceURI */, if(fileName.endsWith(".xml",Qt::CaseInsensitive)) { //SaxParser::parseGeometryJPS(fileName,geometry); } else if (fileName.endsWith(".trav",Qt::CaseInsensitive)) { - SaxParser::parseGeometryTRAV(fileName,_geometry); + SaxParser::parseGeometryTRAV(fileName,_geoFactory); } } } } } else if (qName == "floor") { double xMin=0, - xMax=0, - yMin=0, - yMax=0; + xMax=0, + yMin=0, + yMax=0; for(int i=0; i<at.length(); i++) { if(at.localName(i)=="xMin") { @@ -160,7 +164,7 @@ bool SaxParser::startElement(const QString & /* namespaceURI */, _geometry->addFloor(xMin,yMin,xMax,yMax); } else if (qName == "cuboid") { double length=0, height=0, - width=0, color=0; + width=0, color=0; double center[3]= {0,0,0}; for(int i=0; i<at.length(); i++) { @@ -249,8 +253,14 @@ bool SaxParser::startElement(const QString & /* namespaceURI */, } else if (qName == "agents") { } else if (qName == "roomCaption") { } else if (qName == "frameRate") { - } else if (qName == "geometry") { - } else if (qName == "wall") { + } else if (qName == "geometry") + { + //cout<<"geo tag found"<<endl; + //_geometry = std::shared_ptr<FacilityGeometry>(new FacilityGeometry("No name")); + //_geoFactory.AddElement(0,0,_geometry); + + } + else if (qName == "wall") { _parsingWalls=true; _thickness=15; _height=250; @@ -495,7 +505,7 @@ bool SaxParser::endElement(const QString & /* namespaceURI */, if (qName == "header") { } else if (qName == "agents") { - _dataset->setNumberOfAgents(_currentText.toInt()); + _dataset.setNumberOfAgents(_currentText.toInt()); } else if (qName == "frameRate") { _para[0]=_currentText.toFloat(); } else if (qName == "wall") { @@ -537,7 +547,7 @@ bool SaxParser::endElement(const QString & /* namespaceURI */, //compute the polydata, might increase the runtime frame->ComputePolyData(); - _dataset->addFrame(frame); + _dataset.addFrame(frame); //to be on the safe side _currentFrame.clear(); @@ -545,8 +555,8 @@ bool SaxParser::endElement(const QString & /* namespaceURI */, } else if (qName == "geometry") { } else if (qName == "point") { } else if (qName == "shape") { - _dataset->setInitialHeights(_initialPedestriansHeights); - _dataset->setInitialColors(_initialPedestriansColors); + _dataset.setInitialHeights(_initialPedestriansHeights); + _dataset.setInitialColors(_initialPedestriansColors); } _currentText.clear(); return true; @@ -582,8 +592,10 @@ void SaxParser::clearPoints() } /// provided for convenience and will be removed in the next version -bool SaxParser::parseGeometryJPS(QString fileName, FacilityGeometry *geometry) +bool SaxParser::parseGeometryJPS(QString fileName, GeometryFactory& geoFac) { + auto geometry= shared_ptr<FacilityGeometry>(new FacilityGeometry("test")); + double captionsColor=0;//red if(!fileName.endsWith(".xml",Qt::CaseInsensitive)) return false; QString wd; @@ -734,6 +746,7 @@ bool SaxParser::parseGeometryJPS(QString fileName, FacilityGeometry *geometry) geometry->addObjectLabel(pos,pos,"door_"+QString::number(tr->GetID()).toStdString(),captionsColor); } + geoFac.AddElement(0,0,geometry); //TODO:dirty hack for parsing the Hlines // free memory delete building; @@ -743,7 +756,7 @@ bool SaxParser::parseGeometryJPS(QString fileName, FacilityGeometry *geometry) /// provided for convenience and will be removed in the next version -void SaxParser::parseGeometryTRAV(QString content, FacilityGeometry *geometry,QDomNode geo) +void SaxParser::parseGeometryTRAV(QString content, GeometryFactory& geoFac,QDomNode geo) { cout<<"external geometry found"<<endl; @@ -751,6 +764,7 @@ void SaxParser::parseGeometryTRAV(QString content, FacilityGeometry *geometry,QD // to be filled QDomDocument doc(""); QDomNode geoNode; + auto geometry= shared_ptr<FacilityGeometry>(new FacilityGeometry("no mame")); //first try to open the file if(content.endsWith(".trav",Qt::CaseInsensitive) ) { @@ -928,6 +942,8 @@ void SaxParser::parseGeometryTRAV(QString content, FacilityGeometry *geometry,QD // you should normally have only one geometry node, but one never knows... geoNode = geoNode.nextSiblingElement("geometry"); } + + geoFac.AddElement(0,0,geometry); } QString SaxParser::extractGeometryFilename(QString &filename) @@ -968,24 +984,23 @@ QString SaxParser::extractGeometryFilename(QString &filename) //maybe this is already the geometry file itself ? //do a rapid test -// FacilityGeometry* geo = new FacilityGeometry(); -// QFileInfo fileInfoGeometry(filename); -// extracted_geo_name=fileInfoGeometry.fileName(); + // FacilityGeometry* geo = new FacilityGeometry(); + // QFileInfo fileInfoGeometry(filename); + // extracted_geo_name=fileInfoGeometry.fileName(); -// //just check if it starts with geometry -// //if(parseGeometryJPS(extracted_geo_name,geo)==true) -// //{ -// return extracted_geo_name; -// //} -// delete geo; + // //just check if it starts with geometry + // //if(parseGeometryJPS(extracted_geo_name,geo)==true) + // //{ + // return extracted_geo_name; + // //} + // delete geo; return ""; } -void SaxParser::parseGeometryXMLV04(QString filename, FacilityGeometry *geo) +void SaxParser::parseGeometryXMLV04(QString filename, GeometryFactory& geoFac) { QDomDocument doc(""); - QFile file(filename); int size =file.size()/(1024*1024); @@ -995,7 +1010,7 @@ void SaxParser::parseGeometryXMLV04(QString filename, FacilityGeometry *geo) //cout<<"The file is too large: "<<filename.toStdString()<<endl; return; } - + auto geo= shared_ptr<FacilityGeometry>(new FacilityGeometry("no name")); //cout<<"filename: "<<filename.toStdString()<<endl; //TODO: check if you can parse this with the building classes. @@ -1157,6 +1172,9 @@ void SaxParser::parseGeometryXMLV04(QString filename, FacilityGeometry *geo) double center[3]= {(x1+x2)/2.0, (y1+y2)/2.0, (z2+z1)/2.0}; geo->addObjectLabel(center,center,id,21); } + + //room 0, subroom 0 + geoFac.AddElement(0,0,geo); } bool SaxParser::ParseTxtFormat(QString fileName, SyncData* dataset, double * fps) @@ -1190,7 +1208,7 @@ bool SaxParser::ParseTxtFormat(QString fileName, SyncData* dataset, double * fps bool ok; maxFrame=line.split(":")[1].toDouble(&ok); if(!ok) maxFrame=1000;//default value - //cout<<"frame: "<<maxFrame<<endl; exit(0); + //cout<<"frame: "<<maxFrame<<endl; exit(0); } //initialize the process dialog diff --git a/src/SaxParser.h b/src/SaxParser.h index 322042ecad853d835c4f3317c1cc5f4416a1cd05..7c3e7a63b557211dea27682400bf83112b75860e 100644 --- a/src/SaxParser.h +++ b/src/SaxParser.h @@ -34,6 +34,7 @@ #include <QTreeWidget> #include <vector> #include "SyncData.h" +#include"geometry/GeometryFactory.h" @@ -42,13 +43,13 @@ class JPoint; class TrajectoryPoint; class FrameElement; class SyncData; -class FacilityGeometry; +class GeometryFactory; class SaxParser: public QXmlDefaultHandler { public: - SaxParser(FacilityGeometry* _geometry,SyncData* _dataset, double * fps); + SaxParser(GeometryFactory& geoFac, SyncData& _dataset, double * fps); virtual ~SaxParser(); bool startElement(const QString &namespaceURI, const QString &localName, @@ -66,13 +67,13 @@ public: const QString& value); /// provided for convenience and will be removed in the next version - static bool parseGeometryJPS(QString content, FacilityGeometry *geo); + static bool parseGeometryJPS(QString content, GeometryFactory& geo); /// provided for convenience and will be removed in the next version - static void parseGeometryXMLV04(QString content, FacilityGeometry *geo); + static void parseGeometryXMLV04(QString content, GeometryFactory& geo); /// provided for convenience and will be removed in the next version - static void parseGeometryTRAV(QString content, FacilityGeometry *geo,QDomNode geoNode=QDomNode()); + static void parseGeometryTRAV(QString fileName, GeometryFactory& geoFac, QDomNode geoNode=QDomNode()); /// take a large file and find the geometry file location. static QString extractGeometryFilename(QString& filename); @@ -86,8 +87,9 @@ private: void InitHeader(int major, int minor, int patch); private: - FacilityGeometry* _geometry; - SyncData* _dataset; + GeometryFactory& _geoFactory; + std::shared_ptr<FacilityGeometry> _geometry; + SyncData& _dataset; double* _para; QString _currentText; int _currentFrameID=-1; diff --git a/src/ThreadVisualisation.cpp b/src/ThreadVisualisation.cpp index a447beac1d902416d054296cc38e023352fb5ac5..44ccfb42d0083cc2856319f3eba621890b907536 100644 --- a/src/ThreadVisualisation.cpp +++ b/src/ThreadVisualisation.cpp @@ -77,6 +77,7 @@ #include "geometry/FacilityGeometry.h" +#include "geometry/GeometryFactory.h" #include "geometry/LinePlotter2D.h" #include "ThreadVisualisation.h" @@ -98,23 +99,21 @@ ThreadVisualisation::ThreadVisualisation(QObject *parent): QThread(parent) { - renderer=NULL; - renderWindow=NULL; - renderWinInteractor=NULL; - runningTime=vtkTextActor::New();; - framePerSecond=25; - axis=NULL; - winTitle="header without room caption"; - geometry=new FacilityGeometry(); - + _renderer=NULL; + _renderWindow=NULL; + _renderWinInteractor=NULL; + _runningTime=vtkTextActor::New();; + _framePerSecond=25; + _axis=NULL; + _winTitle="header without room caption"; + //_geometry=new FacilityGeometry(); } ThreadVisualisation::~ThreadVisualisation() { - if(axis) - axis->Delete(); - delete geometry; + if(_axis) + _axis->Delete(); if(extern_glyphs_pedestrians_3D) extern_glyphs_pedestrians_3D->Delete(); if(extern_glyphs_pedestrians_actor_3D) extern_glyphs_pedestrians_actor_3D->Delete(); @@ -122,18 +121,18 @@ ThreadVisualisation::~ThreadVisualisation() if(extern_glyphs_pedestrians_actor_2D) extern_glyphs_pedestrians_actor_2D->Delete(); if(extern_pedestrians_labels) extern_pedestrians_labels->Delete(); - runningTime->Delete(); + _runningTime->Delete(); } void ThreadVisualisation::setFullsreen(bool status) { - renderWindow->SetFullScreen(status); + _renderWindow->SetFullScreen(status); } void ThreadVisualisation::slotSetFrameRate(float fps) { - framePerSecond=fps; + _framePerSecond=fps; } @@ -141,27 +140,28 @@ void ThreadVisualisation::run() { //deactivate the output windows - vtkObject::GlobalWarningDisplayOff(); + //vtkObject::GlobalWarningDisplayOff(); //emit signalStatusMessage("running"); // Create the renderer - renderer = vtkRenderer::New(); + _renderer = vtkRenderer::New(); // set the background //renderer->SetBackground(.00,.00,.00); - renderer->SetBackground(1.0,1.0,1.0); + _renderer->SetBackground(1.0,1.0,1.0); //add the geometry - geometry->CreateActors(); - renderer->AddActor(geometry->getActor2D()); - renderer->AddActor(geometry->getActor3D()); + _geometry.Init(_renderer); + //_geometry->CreateActors(); + //_renderer->AddActor(_geometry->getActor2D()); + //_renderer->AddActor(_geometry->getActor3D()); initGlyphs2D(); initGlyphs3D(); //create the trails extern_trail_plotter = new PointPlotter(); - renderer->AddActor(extern_trail_plotter->getActor()); + _renderer->AddActor(extern_trail_plotter->getActor()); // add axis //axis= vtkAxesActor::New(); @@ -233,9 +233,9 @@ void ThreadVisualisation::run() } // Create the render window - renderWindow = vtkRenderWindow::New(); - renderWindow->AddRenderer( renderer ); - renderWindow->SetSize(960, 800); + _renderWindow = vtkRenderWindow::New(); + _renderWindow->AddRenderer( _renderer ); + _renderWindow->SetSize(960, 800); //renderWindow->SetSize(640, 480); // add the legend @@ -243,23 +243,23 @@ void ThreadVisualisation::run() // initLegend(); //add the running time frame - runningTime->SetTextScaleModeToViewport(); + _runningTime->SetTextScaleModeToViewport(); //runningTime->SetTextScaleModeToProp(); //runningTime->SetMinimumSize(10,10); //runningTime->SetMinimumSize(180,80); //runningTime->SetInput(txt); //runningTime->SetDisplayPosition(500,700); - runningTime->SetVisibility(SystemSettings::getOnScreenInfos()); + _runningTime->SetVisibility(SystemSettings::getOnScreenInfos()); // set the properties of the caption - vtkTextProperty* tprop = runningTime->GetTextProperty(); + vtkTextProperty* tprop = _runningTime->GetTextProperty(); //tprop->SetFontFamilyToArial(); //tprop->BoldOn(); //tprop->SetLineSpacing(1.0); tprop->SetFontSize(10); tprop->SetColor(1.0,0.0,0.0); - renderer->AddActor2D(runningTime); + _renderer->AddActor2D(_runningTime); //CAUTION: this is necessary for WIN32 to update the window name // but his will freeze your system on linux @@ -267,12 +267,12 @@ void ThreadVisualisation::run() renderWindow->Render(); #endif - renderWindow->SetWindowName(winTitle.toStdString().c_str()); + _renderWindow->SetWindowName(_winTitle.toStdString().c_str()); // Create an interactor - renderWinInteractor = vtkRenderWindowInteractor::New(); - renderWindow->SetInteractor( renderWinInteractor ); - renderWinInteractor->Initialize(); + _renderWinInteractor = vtkRenderWindowInteractor::New(); + _renderWindow->SetInteractor( _renderWinInteractor ); + _renderWinInteractor->Initialize(); //add a light kit { @@ -288,17 +288,17 @@ void ThreadVisualisation::run() if(false || SystemSettings::get2D()) { - renderer->GetActiveCamera()->OrthogonalizeViewUp(); - renderer->GetActiveCamera()->ParallelProjectionOn(); - renderer->ResetCamera(); + _renderer->GetActiveCamera()->OrthogonalizeViewUp(); + _renderer->GetActiveCamera()->ParallelProjectionOn(); + _renderer->ResetCamera(); } //create a timer for rendering the window TimerCallback *renderingTimer = new TimerCallback(); - int timer= renderWinInteractor->CreateRepeatingTimer(1000.0/framePerSecond); + int timer= _renderWinInteractor->CreateRepeatingTimer(1000.0/_framePerSecond); renderingTimer->SetRenderTimerId(timer); - renderingTimer->setTextActor(runningTime); - renderWinInteractor->AddObserver(vtkCommand::TimerEvent,renderingTimer); + renderingTimer->setTextActor(_runningTime); + _renderWinInteractor->AddObserver(vtkCommand::TimerEvent,renderingTimer); //create the necessary connections QObject::connect(renderingTimer, SIGNAL(signalRunningTime(unsigned long )), @@ -312,7 +312,7 @@ void ThreadVisualisation::run() // Create my interactor style InteractorStyle* style = InteractorStyle::New(); - renderWinInteractor->SetInteractorStyle( style ); + _renderWinInteractor->SetInteractorStyle( style ); style->Delete(); @@ -335,7 +335,7 @@ void ThreadVisualisation::run() //save the top view camera _topViewCamera=vtkCamera::New(); //renderer->GetActiveCamera()->Modified(); - _topViewCamera->DeepCopy(renderer->GetActiveCamera()); + _topViewCamera->DeepCopy(_renderer->GetActiveCamera()); //update all (restored) system settings setGeometryVisibility2D(SystemSettings::get2D()); @@ -354,18 +354,18 @@ void ThreadVisualisation::run() setNavLinesColor(SystemSettings::getNavLinesColor()); - renderWinInteractor->Start(); + _renderWinInteractor->Start(); #ifdef __APPLE__ -//InitMultiThreading(); + //InitMultiThreading(); -//dispatch_async(main_q, ^(void){ -// is_main_thread(); //Unfortunately not -// std::cout << "now spinning the visualizer" << std::endl; -// renderWinInteractor->Start(); + //dispatch_async(main_q, ^(void){ + // is_main_thread(); //Unfortunately not + // std::cout << "now spinning the visualizer" << std::endl; + // renderWinInteractor->Start(); -//}); + //}); //[[NSThread new] start]; //#include <objc/objc.h> //NSThread* myThread = [[NSThread alloc] initWithTarget:self selector:@selector(workerThreadFunction:) object:nil]; @@ -375,17 +375,17 @@ void ThreadVisualisation::run() emit signal_controlSequences("CONTROL_RESET"); -// still debugging. TODO, check the source of the leak while using cocoa + // still debugging. TODO, check the source of the leak while using cocoa #ifndef __APPLE__ //clear some stuffs //delete extern_trail_plotter; finalize(); - renderer->Delete(); - renderWindow->Delete(); - renderWinInteractor->Delete(); + _renderer->Delete(); + _renderWindow->Delete(); + _renderWinInteractor->Delete(); _topViewCamera->Delete(); - renderer=NULL; + _renderer=NULL; delete renderingTimer; #endif @@ -400,41 +400,36 @@ void ThreadVisualisation::slotControlSequence(const char* para) void ThreadVisualisation::setGeometryVisibility( bool status) { - if(geometry) { - if(SystemSettings::get2D()) { - geometry->set2D(status); - } else { - geometry->set3D(status); - } + + if(SystemSettings::get2D()) + { + _geometry.Set2D(status); + } else + { + _geometry.Set3D(status); } } /// show / hide the walls void ThreadVisualisation::showWalls(bool status) { - if(geometry) { - geometry->showWalls(status); - } + _geometry.ShowWalls(status); } /// show/ hide the exits void ThreadVisualisation::showDoors(bool status) { - if(geometry) { - geometry->showDoors(status); - } + _geometry.ShowDoors(status); } void ThreadVisualisation::showNavLines(bool status) { - if(geometry) { - geometry->showNavLines(status); - } + _geometry.ShowNavLines(status); } void ThreadVisualisation::showFloor(bool status) { - geometry->showFloor(status); + _geometry.ShowFloor(status); } void ThreadVisualisation::initGlyphs2D() @@ -543,14 +538,14 @@ void ThreadVisualisation::initGlyphs2D() //extern_glyphs_pedestrians_actor_2D->GetProperty()->BackfaceCullingOn(); //if(extern_trajectories_firstSet.getNumberOfAgents()>0) - renderer->AddActor(extern_glyphs_pedestrians_actor_2D); + _renderer->AddActor(extern_glyphs_pedestrians_actor_2D); // structure for the labels VTK_CREATE(vtkLabeledDataMapper, labelMapper); extern_pedestrians_labels->SetMapper(labelMapper); labelMapper->SetFieldDataName("labels"); labelMapper->SetLabelModeToLabelFieldData(); - renderer->AddActor2D(extern_pedestrians_labels); + _renderer->AddActor2D(extern_pedestrians_labels); extern_pedestrians_labels->SetVisibility(false); } @@ -644,7 +639,7 @@ void ThreadVisualisation::initGlyphs3D() extern_glyphs_pedestrians_actor_3D->SetMapper(mapper); extern_glyphs_pedestrians_actor_3D->GetProperty()->BackfaceCullingOn(); //if(extern_trajectories_firstSet.getNumberOfAgents()>0) - renderer->AddActor(extern_glyphs_pedestrians_actor_3D); + _renderer->AddActor(extern_glyphs_pedestrians_actor_3D); extern_glyphs_pedestrians_actor_3D->SetVisibility(false); } @@ -713,24 +708,24 @@ void ThreadVisualisation::initLegend(/*std::vector scalars*/) //scalarBar->SetPickable(1); //scalarBar->SetTextPositionToPrecedeScalarBar(); //scalarBar->SetLabelFormat("%-#5.1f"); - renderer->AddActor2D(scalarBar); - renderer->Render(); + _renderer->AddActor2D(scalarBar); + _renderer->Render(); } void ThreadVisualisation::setAxisVisible(bool status) { - axis->SetVisibility(status); + _axis->SetVisibility(status); } void ThreadVisualisation::setCameraPerspective(int mode) { - if(renderer==NULL) return; + if(_renderer==NULL) return; switch (mode) { case 1: //TOP oder RESET - renderer->GetActiveCamera()->DeepCopy(_topViewCamera); + _renderer->GetActiveCamera()->DeepCopy(_topViewCamera); break; case 2://SIDE @@ -758,85 +753,82 @@ void ThreadVisualisation::setBackgroundColor(const QColor& col) { double bgcolor[3]; QcolorToDouble(col,bgcolor); - if (renderer!=NULL) - renderer->SetBackground(bgcolor); + if (_renderer!=NULL) + _renderer->SetBackground(bgcolor); } void ThreadVisualisation::setWindowTitle(QString title) { if(title.isEmpty())return; - winTitle=title; + _winTitle=title; } /// @todo check this construct void ThreadVisualisation::setGeometry(FacilityGeometry* geometry) { - this->geometry=geometry; + //this->_geometry=geometry; + cout<<"dont call me"<<endl; + exit(0); } -FacilityGeometry* ThreadVisualisation::getGeometry() +GeometryFactory &ThreadVisualisation::getGeometry() { - //if(geometry==NULL){ //delete the old object - delete geometry; - geometry=new FacilityGeometry(); - //} - return geometry; + //delete _geometry; + //_geometry=new FacilityGeometry(); + return _geometry; } void ThreadVisualisation::setWallsColor(const QColor &color) { double rbgColor[3]; QcolorToDouble(color,rbgColor); - geometry->changeWallsColor(rbgColor); + _geometry.ChangeWallsColor(rbgColor); } void ThreadVisualisation::setFloorColor(const QColor &color) { double rbgColor[3]; QcolorToDouble(color,rbgColor); - geometry->changeFloorColor(rbgColor); + _geometry.ChangeFloorColor(rbgColor); } void ThreadVisualisation::setGeometryLabelsVisibility(int v) { - geometry->showGeometryLabels(v); + _geometry.ShowGeometryLabels(v); } void ThreadVisualisation::setExitsColor(const QColor &color) { double rbgColor[3]; QcolorToDouble(color,rbgColor); - geometry->changeExitsColor(rbgColor); + _geometry.ChangeExitsColor(rbgColor); } void ThreadVisualisation::setNavLinesColor(const QColor &color) { double rbgColor[3]; QcolorToDouble(color,rbgColor); - geometry->changeNavLinesColor(rbgColor); + _geometry.ChangeNavLinesColor(rbgColor); } /// enable/disable 2D /// todo: consider disabling the 2d option in the 3d, and vice-versa void ThreadVisualisation::setGeometryVisibility2D(bool status) { - if(geometry!=NULL) //FIXME this should never happens - geometry->set2D(status); + _geometry.Set2D(status); } /// enable/disable 3D /// todo: consider disabling the 2d option in the 3d, and vice-versa void ThreadVisualisation::setGeometryVisibility3D(bool status) { - if(geometry!=NULL) //FIXME this should never happens, seems to be called by slotReset() ! - geometry->set3D(status); + _geometry.Set3D(status); } void ThreadVisualisation::setOnscreenInformationVisibility(bool show) { - //if(runningTime) - runningTime->SetVisibility(show); + _runningTime->SetVisibility(show); } void ThreadVisualisation::Create2dAgent() diff --git a/src/ThreadVisualisation.h b/src/ThreadVisualisation.h index 7abc79132bf4414b9942bc9fd7b26f975d8ed0d2..12eab0aef5107b9709e958fa02c565f4a77f7ccc 100644 --- a/src/ThreadVisualisation.h +++ b/src/ThreadVisualisation.h @@ -41,6 +41,7 @@ #include <vtkTensorGlyph.h> #include <vtkSmartPointer.h> #include <vtkPolyDataMapper.h> +#include "geometry/GeometryFactory.h" // forwarded classes class QThread; @@ -91,9 +92,9 @@ public: /// load and display the geometry where /// the pedestrians will move - void setGeometry(FacilityGeometry* geometry); + void setGeometry(FacilityGeometry* _geometry); - FacilityGeometry* getGeometry(); + GeometryFactory& getGeometry(); ///this is for convenience and will be delete later void setWindowTitle(QString title); @@ -178,16 +179,17 @@ private: void Create2dAgent(); private: - FacilityGeometry* geometry; - vtkRenderer* renderer; - vtkRenderWindow* renderWindow; - vtkRenderWindowInteractor* renderWinInteractor; - vtkAxesActor* axis; - vtkTextActor* runningTime; + //FacilityGeometry* _geometry; + GeometryFactory _geometry; + vtkRenderer* _renderer; + vtkRenderWindow* _renderWindow; + vtkRenderWindowInteractor* _renderWinInteractor; + vtkAxesActor* _axis; + vtkTextActor* _runningTime; vtkCamera* _topViewCamera; - QString winTitle; + QString _winTitle; - float framePerSecond; + float _framePerSecond; }; diff --git a/src/geometry/FacilityGeometry.cpp b/src/geometry/FacilityGeometry.cpp index 65d8a892443d3d236247f7074cf7d7e52657c3a7..8ecf48cd02e4ce338cb4ec5835a3cb75c9553168 100644 --- a/src/geometry/FacilityGeometry.cpp +++ b/src/geometry/FacilityGeometry.cpp @@ -68,7 +68,7 @@ using namespace std; vtkSmartPointer<type> name = vtkSmartPointer<type>::New() -FacilityGeometry::FacilityGeometry() +FacilityGeometry::FacilityGeometry(const string &description) { assembly = vtkAssembly::New(); @@ -105,13 +105,11 @@ FacilityGeometry::FacilityGeometry() stepColor = 130; doorColor = 50; navlineColor=95; + _description=description; } FacilityGeometry::~FacilityGeometry() { - //if(assembly) - // assembly->Delete(); - lookupTable->Delete(); captions->Delete(); @@ -128,7 +126,6 @@ FacilityGeometry::~FacilityGeometry() delete linesPlotter2D; } - vtkAssembly* FacilityGeometry::getActor2D() { return assembly2D; @@ -246,7 +243,7 @@ void FacilityGeometry::addNewElement(double center[3], double length, double ori actor->GetProperty()->SetOpacity(0.5); assemblyDoors3D->AddPart(actor); } - break; + break; case WALL: { double colorRGB[3]; lookupTable->GetColor(wallColor, colorRGB); @@ -260,7 +257,7 @@ void FacilityGeometry::addNewElement(double center[3], double length, double ori //src->SetRadius(wallWidth); assemblyWalls3D->AddPart(actor); } - break; + break; case STEP: { double colorRGB[3]; lookupTable->GetColor(stepColor, colorRGB); @@ -269,9 +266,9 @@ void FacilityGeometry::addNewElement(double center[3], double length, double ori src->SetZLength(stepHeight); assemblyDoors3D->AddPart(actor); } - break; + break; - //default behaviour not defined + //default behaviour not defined default: break; } @@ -320,17 +317,17 @@ void FacilityGeometry::addStair(double x1, double y1, double z1, double x2, doub linesPlotter2D->PlotWall(m,n,wallColor/255.0); -// JPoint *p1 = new JPoint(x1,y1,z1); -// JPoint *p2 = new JPoint(x2,y2,z2); -// double *center = p1->centreCoordinatesWith(*p2); -// double angle =p1->angleMadeWith(*p2); -// double length =p1->distanceTo(*p2)+wallThickness; + // JPoint *p1 = new JPoint(x1,y1,z1); + // JPoint *p2 = new JPoint(x2,y2,z2); + // double *center = p1->centreCoordinatesWith(*p2); + // double angle =p1->angleMadeWith(*p2); + // double length =p1->distanceTo(*p2)+wallThickness; -// addNewElement(center, length, angle, WALL); + // addNewElement(center, length, angle, WALL); -// delete p1; -// delete p2; -// delete center; + // delete p1; + // delete p2; + // delete center; } void FacilityGeometry::addDoor(double x1, double y1, double z1, double x2, double y2, double z2,double thickness ,double height, double color) @@ -483,10 +480,10 @@ void FacilityGeometry::addStair(JPoint* p1, JPoint* p2, string caption) addNewElementText(center,orientation,caption.c_str(),50); } -// double *center = p1->centreCoordinatesWith(*p2); -// double angle =p1->angleMadeWith(*p2); -// double length =p1->distanceTo(*p2)+wallThickness; -// addNewElement( center, length, angle, WALL); + // double *center = p1->centreCoordinatesWith(*p2); + // double angle =p1->angleMadeWith(*p2); + // double length =p1->distanceTo(*p2)+wallThickness; + // addNewElement( center, length, angle, WALL); } void FacilityGeometry::addDoor(JPoint* p1, JPoint* p2, string caption) @@ -666,7 +663,7 @@ void FacilityGeometry::addFloor(double x1, double y1, double x2, double y2, doub void FacilityGeometry::addObjectSphere(double center[3], double radius, - double color) +double color) { double colorRGB[3]; @@ -693,7 +690,7 @@ void FacilityGeometry::addObjectSphere(double center[3], double radius, void FacilityGeometry::addObjectCylinder(double center[3], double radius, - double height, double orientation[3],double color) +double height, double orientation[3],double color) { double colorRGB[3]; @@ -720,7 +717,7 @@ void FacilityGeometry::addObjectCylinder(double center[3], double radius, } void FacilityGeometry::addObjectBox(double center[3], double height, - double width, double length, double color) +double width, double length, double color) { double colorRGB[3]; @@ -869,7 +866,7 @@ vtkActor2DCollection* FacilityGeometry::getCaptions() // orientation and color ignored void FacilityGeometry::addNewElementText(double center[3], double orientation[3], - string text, double color) +string text, double color) { //return ; @@ -912,3 +909,7 @@ void FacilityGeometry::showGeometryLabels(int status) } +const std::string & FacilityGeometry::GetDescription() const +{ + return _description; +} diff --git a/src/geometry/FacilityGeometry.h b/src/geometry/FacilityGeometry.h index 05610a3d3a9a53d44b69a16c2e7c05fb27800ec4..bea3e52ae67a6ebf7d5ece8024b5922b297e4c46 100644 --- a/src/geometry/FacilityGeometry.h +++ b/src/geometry/FacilityGeometry.h @@ -63,7 +63,8 @@ public: BOX //!< BOX defined by centre, length, width and height }; - FacilityGeometry(); + FacilityGeometry(const std::string & description); + virtual ~FacilityGeometry(); vtkAssembly* getActor2D(); @@ -109,6 +110,8 @@ public: ///draw obstacles void addObstacles(vtkPolyData* polygonPolyData); + const std::string & GetDescription() const ; + /// draw other kinds of objects void addObjectSphere(double center[3], double radius, double couleur=1); void addObjectCone(double center[3], double height, double radius, double couleur=2); @@ -172,6 +175,8 @@ private: // other parts vtkAssembly* assemblyCaptions; vtkActor2DCollection* captions; + + std::string _description; }; #endif /* FACILITYGEOMETRY_H_ */