From 6f33f1036973372b33941d75c6f357a0722462ec Mon Sep 17 00:00:00 2001 From: Ulrich Kemloh <kemlohulrich@gmail.com> Date: Mon, 28 Sep 2015 16:21:16 +0200 Subject: [PATCH] option to read and display vtk files(#33) --- forms/mainwindow.ui | 31 +++++++++++++- src/MainWindow.cpp | 70 +++++++++++++++---------------- src/MainWindow.h | 2 + src/SaxParser.cpp | 47 ++++++++++++++++++--- src/SaxParser.h | 5 ++- src/SystemSettings.cpp | 11 ++++- src/SystemSettings.h | 6 +++ src/ThreadVisualisation.cpp | 9 +++- src/ThreadVisualisation.h | 2 + src/geometry/FacilityGeometry.cpp | 48 ++++++++++++--------- src/geometry/FacilityGeometry.h | 5 +++ src/geometry/GeometryFactory.cpp | 37 ++++++++++------ src/geometry/GeometryFactory.h | 1 + src/geometry/LinePlotter2D.cpp | 6 ++- 14 files changed, 202 insertions(+), 78 deletions(-) diff --git a/forms/mainwindow.ui b/forms/mainwindow.ui index ed21be2..3251ae8 100644 --- a/forms/mainwindow.ui +++ b/forms/mainwindow.ui @@ -539,7 +539,7 @@ border-color: rgb(255, 255, 255);</string> <x>0</x> <y>0</y> <width>450</width> - <height>22</height> + <height>25</height> </rect> </property> <widget class="QMenu" name="menuFile"> @@ -631,6 +631,7 @@ border-color: rgb(255, 255, 255);</string> <addaction name="actionShow_Door_Caption"/> <addaction name="actionShow_Obstacles"/> <addaction name="actionShow_Navigation_Lines"/> + <addaction name="actionShow_Gradient_Field"/> <addaction name="actionShow_Geometry_Captions"/> <addaction name="actionFirst_Group"/> <addaction name="separator"/> @@ -1337,6 +1338,17 @@ border-color: rgb(255, 255, 255);</string> <string>Obstacles Color</string> </property> </action> + <action name="actionShow_Gradient_Field"> + <property name="checkable"> + <bool>true</bool> + </property> + <property name="checked"> + <bool>true</bool> + </property> + <property name="text"> + <string>Show Gradient Field</string> + </property> + </action> </widget> <resources> <include location="icons.qrc"/> @@ -2222,6 +2234,22 @@ border-color: rgb(255, 255, 255);</string> </hint> </hints> </connection> + <connection> + <sender>actionShow_Gradient_Field</sender> + <signal>triggered()</signal> + <receiver>mainwindow</receiver> + <slot>slotShowHideGradientField()</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> @@ -2288,5 +2316,6 @@ border-color: rgb(255, 255, 255);</string> <slot>slotShowGeometryStructure()</slot> <slot>slotChangeObstacleColor()</slot> <slot>slotShowHideObstacles()</slot> + <slot>slotShowHideGradientField()</slot> </slots> </ui> diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index a417cce..822aa4f 100755 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -687,6 +687,14 @@ bool MainWindow::addPedestrianGroup(int groupID,QString fileName) //return false; } + //check if it is vtrk file containinf gradient + if(fileName.endsWith(".vtk",Qt::CaseInsensitive)) + { + if (false==SaxParser::ParseGradientFieldVTK(fileName,geometry)) + return false; + + } + QFile file(fileName); if (!file.open(QIODevice::ReadOnly)) { Debug::Error("could not open the File: ",fileName.toStdString().c_str()); @@ -729,8 +737,15 @@ bool MainWindow::addPedestrianGroup(int groupID,QString fileName) reader.parse(source); file.close(); } + //parsing the vtk file +// else if(fileName.endsWith(".vtk",Qt::CaseInsensitive)) +// { +// if (false==SaxParser::ParseGradientFieldVTK(fileName,geometry)) +// return false; + +// } // try to parse the txt file - else + else if(fileName.endsWith(".txt",Qt::CaseInsensitive)) { if(false==SaxParser::ParseTxtFormat(fileName, dataset,&frameRate)) return false; @@ -947,35 +962,6 @@ void MainWindow::slotControlSequence(const char * sex) 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; @@ -1703,7 +1689,13 @@ void MainWindow::loadAllSettings() slotShowOnScreenInfos(); qDebug()<<"show OnScreensInfos: "<<checked; } - + if (settings.contains("view/showGradientField")) + { + bool checked = settings.value("view/showGradientField").toBool(); + ui.actionShow_Gradient_Field->setChecked(checked); + slotShowHideGradientField(); + qDebug()<<"show GradientField: "<<checked; + } //options if (settings.contains("options/rememberSettings")) { @@ -1774,7 +1766,8 @@ void MainWindow::saveAllSettings() settings.setValue("view/showGeoCaptions", ui.actionShow_Geometry_Captions->isChecked()); settings.setValue("view/showNavLines", ui.actionShow_Navigation_Lines->isChecked()); settings.setValue("view/showOnScreensInfos", ui.actionShow_Onscreen_Infos->isChecked()); - settings.setValue("view/showObstacles", ui.actionShow_Obstacles->isChecked()); + settings.setValue("view/showObstacles", ui.actionShow_Obstacles->isChecked()); + settings.setValue("view/showGradientField", ui.actionShow_Gradient_Field->isChecked()); //options: the color settings are saved in the methods where they are used. settings.setValue("options/listeningPort", SystemSettings::getListeningPort()); @@ -1876,6 +1869,13 @@ void MainWindow::slotShowHideObstacles() _visualisationThread->showObstacle(value); SystemSettings::setShowObstacles(value); } +void MainWindow::slotShowHideGradientField() +{ + bool value=ui.actionShow_Gradient_Field->isChecked(); + _visualisationThread->showGradientField(value); + SystemSettings::setShowGradientField(value); +} + void MainWindow::slotShowGeometryStructure() { //QListView list; @@ -1904,9 +1904,9 @@ void MainWindow::slotOnGeometryItemChanged( QStandardItem *item) { for(int i=0;i<item->rowCount();i++) { - QStandardItem *child= item->child(i); - child->setCheckState(item->checkState()); - slotOnGeometryItemChanged(child); + QStandardItem *child= item->child(i); + child->setCheckState(item->checkState()); + slotOnGeometryItemChanged(child); } } diff --git a/src/MainWindow.h b/src/MainWindow.h index 21240f6..adaff46 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -174,6 +174,8 @@ public Q_SLOTS: void slotShowHideGeometryCaptions(); /// show hide the obstacles void slotShowHideObstacles(); + /// show/hide the gradient field + void slotShowHideGradientField(); /// show pedestrians only without trail void slotShowPedestrianOnly(); diff --git a/src/SaxParser.cpp b/src/SaxParser.cpp index 3d5f9ba..6e10cb4 100644 --- a/src/SaxParser.cpp +++ b/src/SaxParser.cpp @@ -65,6 +65,14 @@ #include <vtkAssembly.h> #include <vtkProperty.h> #include <vtkTriangleFilter.h> +#include <vtkGenericDataObjectReader.h> +#include <vtkPolyDataReader.h> +#include <vtkStructuredGridReader.h> +#include <vtkStructuredPointsReader.h> +#include <vtkImageDataGeometryFilter.h> + + + #define VTK_CREATE(type, name) \ vtkSmartPointer<type> name = vtkSmartPointer<type>::New() @@ -259,6 +267,13 @@ bool SaxParser::startElement(const QString & /* namespaceURI */, //_geometry = std::shared_ptr<FacilityGeometry>(new FacilityGeometry("No name")); //_geoFactory.AddElement(0,0,_geometry); + }else if (qName == "gradient_field"){ + for(int i=0; i<at.length(); i++) { + if(at.localName(i)=="filename") { + ParseGradientFieldVTK(at.value(i),_geoFactory); + } + } + } else if (qName == "wall") { _parsingWalls=true; @@ -582,6 +597,7 @@ bool SaxParser::endElement(const QString & /* namespaceURI */, } else if (qName == "shape") { _dataset.setInitialHeights(_initialPedestriansHeights); _dataset.setInitialColors(_initialPedestriansColors); + } else if (qName == "gradient_field") { } _currentText.clear(); return true; @@ -635,8 +651,6 @@ bool SaxParser::parseGeometryJPS(QString fileName, GeometryFactory& geoFac) if(!building->InitGeometry()) return false; // create the polygons - - for(auto&& itr_room: building->GetAllRooms()) { for(auto&& itr_subroom: itr_room.second->GetAllSubRooms()) @@ -780,8 +794,6 @@ bool SaxParser::parseGeometryJPS(QString fileName, GeometryFactory& geoFac) return true; } - - /// provided for convenience and will be removed in the next version void SaxParser::parseGeometryTRAV(QString content, GeometryFactory& geoFac,QDomNode geo) @@ -1205,7 +1217,7 @@ void SaxParser::parseGeometryXMLV04(QString filename, GeometryFactory& geoFac) geoFac.AddElement(0,0,geo); } -bool SaxParser::ParseTxtFormat(QString fileName, SyncData* dataset, double * fps) +bool SaxParser::ParseTxtFormat(const QString &fileName, SyncData* dataset, double * fps) { //fileName="data/trajectories/1000_1_0_0_1_1.txt"; //fileName="data/trajectories/50_3_0_1_1_2.txt"; @@ -1360,6 +1372,31 @@ bool SaxParser::ParseTxtFormat(QString fileName, SyncData* dataset, double * fps return true; } +bool SaxParser::ParseGradientFieldVTK(const QString &fileName, GeometryFactory& geoFac) +{ + // Read the file + VTK_CREATE(vtkStructuredPointsReader, reader); + reader->SetFileName(fileName.toStdString().c_str()); + reader->Update(); + + VTK_CREATE(vtkImageDataGeometryFilter,geometryFilter ); + geometryFilter->SetInputConnection(reader->GetOutputPort()); + geometryFilter->Update(); + + VTK_CREATE(vtkPolyDataMapper,mapper); + mapper->SetInputConnection(geometryFilter->GetOutputPort()); + + VTK_CREATE(vtkActor, actor); + actor->SetMapper(mapper); + + shared_ptr<FacilityGeometry> gradient_field= shared_ptr<FacilityGeometry>(new FacilityGeometry("Gradient Field")); + gradient_field->addGradientField(actor); + + geoFac.AddElement(-1,-1,gradient_field); + geoFac.AddElement(-2,-2,gradient_field); + return true; +} + void SaxParser::InitHeader(int major, int minor, int patch) { if ( (minor==6) || (minor==5 && patch==1) ) { diff --git a/src/SaxParser.h b/src/SaxParser.h index cc74cf7..43dcd95 100644 --- a/src/SaxParser.h +++ b/src/SaxParser.h @@ -79,7 +79,10 @@ public: static QString extractGeometryFilename(QString& filename); /// parse the txt file format - static bool ParseTxtFormat(QString fileName, SyncData* dataset, double * fps); + static bool ParseTxtFormat(const QString& fileName, SyncData* dataset, double * fps); + + /// parse a vtk file + static bool ParseGradientFieldVTK(const QString& fileName, GeometryFactory& geoFac); private: //clear the mo diff --git a/src/SystemSettings.cpp b/src/SystemSettings.cpp index c5c508c..29d6788 100644 --- a/src/SystemSettings.cpp +++ b/src/SystemSettings.cpp @@ -54,6 +54,8 @@ bool SystemSettings::showExits=true; bool SystemSettings::showNavLines=true; bool SystemSettings::showTrajectories=false; bool SystemSettings::showObstacle=true; +bool SystemSettings::showGradienField=true; + unsigned short SystemSettings::port=8989; //double SystemSettings::bgColor[]= {1.0,1.0,1.0}; @@ -199,7 +201,14 @@ void SystemSettings::setShowObstacles(bool status) { showObstacle=status; } - +void SystemSettings::setShowGradientField(bool status) +{ + showGradienField=status; +} +bool SystemSettings::getShowGradientField() +{ + return showGradienField; +} bool SystemSettings::getShowObstacles() { return showObstacle; diff --git a/src/SystemSettings.h b/src/SystemSettings.h index d295c19..90f2e4b 100644 --- a/src/SystemSettings.h +++ b/src/SystemSettings.h @@ -87,6 +87,11 @@ public: void static setShowObstacles(bool status); bool static getShowObstacles(); + //set/get the gradient field visibility + void static setShowGradientField(bool status); + bool static getShowGradientField(); + + // set/get the navigation lines visibility void static setShowNavLines(bool status); bool static getShowNavLines(); @@ -207,6 +212,7 @@ private: static bool showGeometryCaptions; static bool showFloor; static bool showObstacle; + static bool showGradienField; static bool showWalls; static bool showExits; static bool showNavLines; diff --git a/src/ThreadVisualisation.cpp b/src/ThreadVisualisation.cpp index 305681a..fd618a5 100644 --- a/src/ThreadVisualisation.cpp +++ b/src/ThreadVisualisation.cpp @@ -354,7 +354,8 @@ void ThreadVisualisation::run() setFloorColor(SystemSettings::getFloorColor()); setExitsColor(SystemSettings::getExitsColor()); setNavLinesColor(SystemSettings::getNavLinesColor()); - + //FIXME: + showGradientField(SystemSettings::getShowGradientField()); _renderWinInteractor->Start(); @@ -432,11 +433,15 @@ void ThreadVisualisation::showFloor(bool status) { _geometry.ShowFloor(status); } + void ThreadVisualisation::showObstacle(bool status) { _geometry.ShowObstacles(status); } - +void ThreadVisualisation::showGradientField(bool status) +{ + _geometry.ShowGradientField(status); +} void ThreadVisualisation::initGlyphs2D() { if(extern_glyphs_pedestrians) extern_glyphs_pedestrians->Delete(); diff --git a/src/ThreadVisualisation.h b/src/ThreadVisualisation.h index f47c146..efe0288 100644 --- a/src/ThreadVisualisation.h +++ b/src/ThreadVisualisation.h @@ -146,6 +146,8 @@ public: /// show/ hide the obstacles void showObstacle(bool status); + /// show/hide the gradeint field + void showGradientField(bool status); /// show / hide stairs ///not implemented diff --git a/src/geometry/FacilityGeometry.cpp b/src/geometry/FacilityGeometry.cpp index ed9966a..79b5923 100644 --- a/src/geometry/FacilityGeometry.cpp +++ b/src/geometry/FacilityGeometry.cpp @@ -81,6 +81,7 @@ FacilityGeometry::FacilityGeometry(const string &description) floorActor = vtkActor::New(); obstaclesActor = vtkActor::New(); + gradientFieldActor = vtkActor::New(); captions=vtkActor2DCollection::New(); linesPlotter2D = new LinePlotter2D(); @@ -151,23 +152,23 @@ void FacilityGeometry::CreateActors() assembly3D->AddPart(assemblyCaptions); } - void FacilityGeometry::setVisibility(bool status) - { - if(SystemSettings::get2D()) - { - assembly2D->SetVisibility(status); - } - else - { - assembly3D->SetVisibility(status); - } - _visibility=status; - } - - bool FacilityGeometry::getVisibility() const - { - return _visibility; - } +void FacilityGeometry::setVisibility(bool status) +{ + if(SystemSettings::get2D()) + { + assembly2D->SetVisibility(status); + } + else + { + assembly3D->SetVisibility(status); + } + _visibility=status; +} + +bool FacilityGeometry::getVisibility() const +{ + return _visibility; +} /*** * This is the main build method and should be called by all functions * drawing a wall or a door. Important @@ -246,7 +247,6 @@ void FacilityGeometry::addNewElement(double center[3], double length, double ori void FacilityGeometry::addWall(double x1, double y1, double z1, double x2, double y2, double z2,double thickness,double height,double color) { - // all walls will have this parameters until changed wallColor=color; @@ -518,7 +518,6 @@ void FacilityGeometry::addNavLine(JPoint* p1, JPoint* p2, string caption) } } - void FacilityGeometry::addFloor(vtkPolyData* polygonPolyData ) { //triagulate everything @@ -542,6 +541,13 @@ void FacilityGeometry::addFloor(vtkPolyData* polygonPolyData ) assembly3D->AddPart(floorActor); } +void FacilityGeometry::addGradientField(vtkActor* gradientField) +{ + gradientFieldActor=gradientField; + assembly2D->AddPart(gradientFieldActor); + assembly3D->AddPart(gradientFieldActor); +} + void FacilityGeometry::addObstacles(vtkPolyData* polygonPolyData ) { //triagulate everything @@ -816,6 +822,10 @@ void FacilityGeometry::showFloor(bool status) { floorActor->SetVisibility(status); } +void FacilityGeometry::showGradientField(bool status) +{ + gradientFieldActor->SetVisibility(status); +} void FacilityGeometry::showObstacles(bool status) { diff --git a/src/geometry/FacilityGeometry.h b/src/geometry/FacilityGeometry.h index 2aee2b5..ec8eb65 100644 --- a/src/geometry/FacilityGeometry.h +++ b/src/geometry/FacilityGeometry.h @@ -110,6 +110,9 @@ public: ///draw obstacles void addObstacles(vtkPolyData* polygonPolyData); + ///add the gradient field + void addGradientField(vtkActor* gradientField); + const std::string & GetDescription() const ; /// draw other kinds of objects @@ -135,6 +138,7 @@ public: void showFloor(bool status); void showObstacles(bool status); void showGeometryLabels(int status); + void showGradientField(bool status); void setVisibility(bool status); bool getVisibility() const; @@ -175,6 +179,7 @@ private: vtkActor* floorActor; vtkActor* obstaclesActor; + vtkActor* gradientFieldActor; // other parts vtkAssembly* assemblyCaptions; diff --git a/src/geometry/GeometryFactory.cpp b/src/geometry/GeometryFactory.cpp index ce41a6b..4e48910 100644 --- a/src/geometry/GeometryFactory.cpp +++ b/src/geometry/GeometryFactory.cpp @@ -41,7 +41,7 @@ void GeometryFactory::Set3D(bool status) for(auto&& subroom:room.second) { if(_geometryFactory[room.first][subroom.first]->getVisibility()) - subroom.second->set3D(status); + subroom.second->set3D(status); } } } @@ -61,7 +61,7 @@ void GeometryFactory::ChangeWallsColor(double* color) for(auto&& subroom:room.second) { if(_geometryFactory[room.first][subroom.first]->getVisibility()) - subroom.second->changeWallsColor(color); + subroom.second->changeWallsColor(color); } } } @@ -73,7 +73,7 @@ void GeometryFactory::ChangeExitsColor(double* color) for(auto&& subroom:room.second) { if(_geometryFactory[room.first][subroom.first]->getVisibility()) - subroom.second->changeExitsColor(color); + subroom.second->changeExitsColor(color); } } } @@ -85,7 +85,7 @@ void GeometryFactory::ChangeNavLinesColor(double* color) for(auto&& subroom:room.second) { if(_geometryFactory[room.first][subroom.first]->getVisibility()) - subroom.second->changeNavLinesColor(color); + subroom.second->changeNavLinesColor(color); } } } @@ -109,7 +109,7 @@ void GeometryFactory::ChangeObstaclesColor(double* color) for(auto&& subroom:room.second) { if(_geometryFactory[room.first][subroom.first]->getVisibility()) - subroom.second->changeObstaclesColor(color); + subroom.second->changeObstaclesColor(color); } } } @@ -121,7 +121,7 @@ void GeometryFactory::ShowDoors(bool status) for(auto&& subroom:room.second) { if(_geometryFactory[room.first][subroom.first]->getVisibility()) - subroom.second->showDoors(status); + subroom.second->showDoors(status); } } } @@ -133,7 +133,7 @@ void GeometryFactory::ShowStairs(bool status) for(auto&& subroom:room.second) { if(_geometryFactory[room.first][subroom.first]->getVisibility()) - subroom.second->showStairs(status); + subroom.second->showStairs(status); } } } @@ -145,7 +145,7 @@ void GeometryFactory::ShowWalls(bool status) for(auto&& subroom:room.second) { if(_geometryFactory[room.first][subroom.first]->getVisibility()) - subroom.second->showWalls(status); + subroom.second->showWalls(status); } } } @@ -157,7 +157,7 @@ void GeometryFactory::ShowNavLines(bool status) for(auto&& subroom:room.second) { if(_geometryFactory[room.first][subroom.first]->getVisibility()) - subroom.second->showNavLines(status); + subroom.second->showNavLines(status); } } } @@ -169,7 +169,7 @@ void GeometryFactory::ShowFloor(bool status) for(auto&& subroom:room.second) { if(_geometryFactory[room.first][subroom.first]->getVisibility()) - subroom.second->showFloor(status); + subroom.second->showFloor(status); } } } @@ -180,7 +180,20 @@ void GeometryFactory::ShowObstacles(bool status) for(auto&& subroom:room.second) { if(_geometryFactory[room.first][subroom.first]->getVisibility()) - subroom.second->showObstacles(status); + subroom.second->showObstacles(status); + } + } +} + + +void GeometryFactory::ShowGradientField(bool status) +{ + for (auto&& room: _geometryFactory) + { + for(auto&& subroom:room.second) + { + if(_geometryFactory[room.first][subroom.first]->getVisibility()) + subroom.second->showGradientField(status); } } } @@ -192,7 +205,7 @@ void GeometryFactory::ShowGeometryLabels(int status) for(auto&& subroom:room.second) { if(_geometryFactory[room.first][subroom.first]->getVisibility()) - subroom.second->showGeometryLabels(status); + subroom.second->showGeometryLabels(status); } } } diff --git a/src/geometry/GeometryFactory.h b/src/geometry/GeometryFactory.h index 112cf4f..54930ab 100644 --- a/src/geometry/GeometryFactory.h +++ b/src/geometry/GeometryFactory.h @@ -31,6 +31,7 @@ public: void ShowNavLines(bool status); void ShowFloor(bool status); void ShowObstacles(bool status); + void ShowGradientField(bool status); void ShowGeometryLabels(int status); bool RefreshView(); void Clear(); diff --git a/src/geometry/LinePlotter2D.cpp b/src/geometry/LinePlotter2D.cpp index a02f39d..e64fa92 100644 --- a/src/geometry/LinePlotter2D.cpp +++ b/src/geometry/LinePlotter2D.cpp @@ -63,7 +63,8 @@ LinePlotter2D::LinePlotter2D() door_lines = vtkCellArray::New(); door_lineScalars = vtkFloatArray::New(); door_curPointID=0; - door_width=3.5; +// door_width=3.5; + door_width=2; wall_mapper= vtkPolyDataMapper::New(); wall_actor= vtkActor::New(); @@ -71,7 +72,8 @@ LinePlotter2D::LinePlotter2D() wall_lines = vtkCellArray::New(); wall_lineScalars = vtkFloatArray::New(); wall_curPointID=0; - wall_width=4; +// wall_width=4; + wall_width=2; navline_curPointID =0; navline_width=2; -- GitLab