diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index bbe41520fe29a61cac45fe516769f63643ef5e3e..05765634aed745ceb36369e259c5fc791574afd9 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -61,6 +61,8 @@ #include <QColorDialog> #include <QDebug> #include <QtXml> +#include <QTemporaryFile> + #include <iostream> #include <limits> @@ -180,7 +182,7 @@ MainWindow::MainWindow(QWidget *parent) : int group=1; // there are max 3 groups of pedestrians bool mayPlay=false; - // arguments.append("-online"); + // arguments.append("-online"); // arguments.append("-caption"); arguments.append("-2D"); // parse arguments list @@ -424,6 +426,7 @@ FacilityGeometry* MainWindow::parseGeometry(QDomNode geoNode){ { if (fileName.endsWith(".xml",Qt::CaseInsensitive)) { + //parsing the file SaxParser::parseGeometryJPS(fileName,geometry); } else if (fileName.endsWith(".trav",Qt::CaseInsensitive)) @@ -436,12 +439,94 @@ FacilityGeometry* MainWindow::parseGeometry(QDomNode geoNode){ //which is the only one which can directly be inserted into a file else { + //cout<<"online geo: "<<geoNode.toDocument().toString().toStdString()<<endl; exit(0); + //geoNode.toText().toComment().toDocument().toString() + QDomDocument doc(""); + QDomNode geoNode; + if(!geoNode.isNull()){ + cout<<"online geo: "<<geoNode.toElement().toDocument().toString().toStdString()<<endl; exit(0); + } + //must not be a file name SaxParser::parseGeometryTRAV(fileName,geometry,geoNode); } return geometry; } +// This function is only used in online Mode +FacilityGeometry* MainWindow::parseGeometry(QString geometryString) +{ + +// 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); + + //create a temporary file with the content geonode + +// QTemporaryFile file; +// file.setFileName(file.fileName()+".xml"); +// if (file.open()) { +// QTextStream stream(&file); +// stream << geoNode << endl; +// } + + QFile file("_geometry_tmp_file.xml"); + if (file.open(QIODevice::WriteOnly | QIODevice::Text)) + { + QTextStream stream(&file); + stream << geometryString << endl; + } + + QString tmpFileName = file.fileName(); + + //check if there is a tag 'file' there in + QString geofileName = SaxParser::extractGeometryFilename(tmpFileName); + + //cout<<"filename: "<<geofileName.toStdString()<<endl;exit(0); + + FacilityGeometry* geometry = visualisationThread->getGeometry(); + + if(!geofileName.isEmpty()) + { + if (geofileName.endsWith(".xml",Qt::CaseInsensitive)) + { + //parsing the file + if(!SaxParser::parseGeometryJPS(geofileName,geometry)) + { + SaxParser::parseGeometryXMLV04(geofileName,geometry); + } + } + else if (geofileName.endsWith(".trav",Qt::CaseInsensitive)) + { + //must not be a file name + SaxParser::parseGeometryTRAV(geofileName,geometry); + } + } + // I assume it is a trav format node, + //which is the only one which can directly be inserted into a file + else + { + QDomDocument doc(""); + QDomNode geoNode; + + //must not be a file name + SaxParser::parseGeometryTRAV(geometryString,geometry,geoNode); + } + + //delete the file + file.remove(); + return geometry; +} + // TODO: still used? bool MainWindow::parsePedestrianShapes(QDomNode shapeNode, int groupID){ @@ -566,8 +651,7 @@ bool MainWindow::addPedestrianGroup(int groupID,QString fileName) //try to get a geometry filename QString geometry_file=SaxParser::extractGeometryFilename(fileName); - - //cout<<"geometry NaMe: "<<geometry_file.toStdString()<<endl; + //cout<<"geometry name: "<<geometry_file.toStdString()<<endl; // if xml is detected, just load and show the geometry then exit if(geometry_file.endsWith(".xml",Qt::CaseInsensitive)){ @@ -1336,7 +1420,7 @@ void MainWindow::slotStartVisualisationThread(QString data,int numberOfAgents,fl slotToggleFirstPedestrianGroup(); QDomDocument doc(""); - data = "<travisto>\n" +data+ "\n</travisto>\n"; + //data = "<travisto>\n" +data+ "\n</travisto>\n"; QString errorMsg=""; doc.setContent(data,&errorMsg); @@ -1345,9 +1429,10 @@ void MainWindow::slotStartVisualisationThread(QString data,int numberOfAgents,fl Debug::Error("%s", (const char *)errorMsg.toStdString().c_str()); return; } + //QDomNode geoNode =doc.elementsByTagName("geometry").item(0); - QDomNode geoNode =doc.elementsByTagName("geometry").item(0); - FacilityGeometry *geo = parseGeometry(geoNode); + //FacilityGeometry *geo = parseGeometry(geoNode); + FacilityGeometry *geo = parseGeometry(data); visualisationThread->slotSetFrameRate(frameRate); visualisationThread->setGeometry(geo); diff --git a/src/MainWindow.h b/src/MainWindow.h index ee30ea8194862c003a46336c219993d7de1d29fb..2263fbb9cb80c8765643335c6d7a74464722eaf9 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -278,7 +278,7 @@ 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); /** * parse a shape node and get the initials heights and colors of pedestrians. diff --git a/src/SaxParser.cpp b/src/SaxParser.cpp index 4c946b7aead7f140deb8c64477f75a1e1faeb067..c5e7be6c1666deb9655726ba8a4c3abc61209bb4 100644 --- a/src/SaxParser.cpp +++ b/src/SaxParser.cpp @@ -97,9 +97,26 @@ bool SaxParser::startElement(const QString & /* namespaceURI */, for(int i=0;i<at.length();i++){ if(at.localName(i)=="version") { - double version=at.value(i).toDouble(); - InitHeader(version); - //cout<<"version found:"<<version<<endl;exit(0); + QStringList query = at.value(i).split("."); + int major=0; + int minor=0; + int patch=0; + switch (query.size() ) { + case 1: + major=query.at(0).toInt(); + break; + case 2: + major=query.at(0).toInt(); + minor=query.at(1).toInt(); + break; + case 3: + major=query.at(0).toInt(); + minor=query.at(1).toInt(); + patch=query.at(2).toInt(); + break; + } + InitHeader(major,minor,patch); + //cout<<"version found:"<<at.value(i).toStdString()<<endl;exit(0); } } }else if (qName == "file") { @@ -1005,6 +1022,7 @@ QString SaxParser::extractGeometryFilename(QString &filename) while (!in.atEnd()) { //look for a line with line = in.readLine(); + //cout<<"checking: "<<line.toStdString()<<endl; if(line.contains("location" ,Qt::CaseInsensitive)) if(line.contains("<file" ,Qt::CaseInsensitive)) {//try to extract what ever is inside the quotes @@ -1016,30 +1034,32 @@ QString SaxParser::extractGeometryFilename(QString &filename) int endIndex = line.indexOf(end,startIndex); if(endIndex <= 0)continue; // false alarm extracted_geo_name= line.mid(startIndex,endIndex - startIndex); + cout<<"geoName:"<<extracted_geo_name.toStdString()<<endl; return extracted_geo_name; - //cout<<"geoName:"<<extracted_geo_name.toStdString()<<endl; //break;// we are done } if(line.contains("<geometry" ,Qt::CaseInsensitive)) - if(!line.contains("version" ,Qt::CaseInsensitive)) - {//old format - return ""; + if(line.contains("version" ,Qt::CaseInsensitive)) + {//real geometry file + QFileInfo fileInfoGeometry(filename); + extracted_geo_name=fileInfoGeometry.fileName(); + return extracted_geo_name; } } } //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 ""; } @@ -1095,7 +1115,7 @@ void SaxParser::parseGeometryXMLV04(QString filename, FacilityGeometry *geo) //parsing the subrooms QDomNodeList xSubRoomsNodeList=doc.elementsByTagName("subroom"); //parsing the walls - for (unsigned int i = 0; i < xSubRoomsNodeList.length(); i++) { + for ( int i = 0; i < xSubRoomsNodeList.length(); i++) { QDomElement xPoly = xSubRoomsNodeList.item(i).firstChildElement("polygon"); double position[3]={0,0,0}; double pos_count=1; @@ -1222,10 +1242,10 @@ void SaxParser::parseGeometryXMLV04(QString filename, FacilityGeometry *geo) } } -void SaxParser::InitHeader(double version) +void SaxParser::InitHeader(int major, int minor, int patch) { // set the parsing String map - if(version==0.5){ + if(minor==5 && patch==0){ _jps_xPos=QString("xPos"); _jps_yPos=QString("yPos"); _jps_zPos=QString("zPos"); @@ -1237,7 +1257,7 @@ void SaxParser::InitHeader(double version) _jps_ellipseOrientation=QString("ellipseOrientation"); _jps_ellipseColor=QString("ellipseColor"); } - else if (version==0.6){ + else if ( (minor==6) || (minor==5 && patch==1) ){ _jps_xPos=QString("x"); _jps_yPos=QString("y"); _jps_zPos=QString("z"); @@ -1251,8 +1271,8 @@ void SaxParser::InitHeader(double version) } else { - cout<<"unsupported header version: "<<version<<endl; - cout<<"Please use 0.5 or 0.6 "<<endl; + cout<<"unsupported header version: "<<major<<"."<<minor<<"."<<patch<<endl; + cout<<"Please use 0.5 0.5.1 or 0.6 "<<endl; exit(0); } } diff --git a/src/SaxParser.h b/src/SaxParser.h index faaa1f94c11775fb6d27f448ebbf84a587273c12..dbd4f6dd9e6e80e50884e2d13925828310bca764 100644 --- a/src/SaxParser.h +++ b/src/SaxParser.h @@ -79,7 +79,7 @@ public: private: //clear the mo void clearPoints(); - void InitHeader(double version); + void InitHeader(int major, int minor, int patch); private: FacilityGeometry* geometry; diff --git a/src/ThreadDataTransfert.cpp b/src/ThreadDataTransfert.cpp index a7356c79640cf30a92acebada4c8c8d0064d1115..dc9a0da92a215140df4e18240e8e073425eff5cd 100644 --- a/src/ThreadDataTransfert.cpp +++ b/src/ThreadDataTransfert.cpp @@ -70,10 +70,9 @@ ThreadDataTransfer::ThreadDataTransfer(QObject *parent): headerParsed=false; errNr=0; finished=false; + //Debug::setDebugLevel(Debug::ALL); } - - ThreadDataTransfer::~ThreadDataTransfer() { } @@ -159,17 +158,16 @@ void ThreadDataTransfer::slotReadMessage(){ void ThreadDataTransfer::slotProcessMessage(QString& data){ QDomDocument doc(""); - data = "<travisto>\n" +data+ "\n</travisto>\n"; - - //cout<<data.toStdString()<<endl; + //data = "<travisto>\n" +data+ "</travisto>"; + //cout<<data.toStdString()<<endl; QString errorMsg=""; doc.setContent(data,&errorMsg); if(!errorMsg.isEmpty()){ errNr++; - Debug::Error(">> %s",(const char *)errorMsg.toStdString().c_str()); - Debug::Error(">> %s",(const char *)data.toStdString().c_str()); + //Debug::Error(">> %s",(const char *)errorMsg.toStdString().c_str()); + //Debug::Error(">> %s",(const char *)data.toStdString().c_str()); return; } @@ -191,6 +189,7 @@ void ThreadDataTransfer::slotProcessMessage(QString& data){ if(!geometry.isNull()) { //emit signal_loadGeometry(data); geoData=data; + Debug::Messages("geometry received and parsed"); //parseGeometryNode(geometry); } if(!dataList.isEmpty()) { @@ -227,11 +226,6 @@ void ThreadDataTransfer::parseHeaderNode(QDomNode header ){ emit signal_stopVisualisationThread(true); } - - // no need - //unsigned long timeFirstFrame_us = header.toElement().elementsByTagName("timeFirstFrame").item(0) - //unsigned long timeFirstFrame_s = header.toElement().elementsByTagName("timeFirstFrame").item(0) - // .toElement().attribute("sec",0).toUInt(); QString frameRateStr=getTagValueFromElement(header, "frameRate"); frameRate =frameRateStr.toFloat(&ok); @@ -245,8 +239,34 @@ void ThreadDataTransfer::parseHeaderNode(QDomNode header ){ msgBox.setIcon(QMessageBox::Critical); msgBox.exec(); frameRate=25; - } + + //get the header version + if(header.toElement().hasAttributes()) + { + QString version=header.toElement().attribute("version"); + QStringList query = version.split("."); + int major=0; + int minor=0; + int patch=0; + switch (query.size() ) { + case 1: + major=query.at(0).toInt(); + break; + case 2: + major=query.at(0).toInt(); + minor=query.at(1).toInt(); + break; + case 3: + major=query.at(0).toInt(); + minor=query.at(1).toInt(); + patch=query.at(2).toInt(); + break; + } + InitHeader(major,minor,patch); + //cout<<"version found:"<<at.value(i).toStdString()<<endl;exit(0); + } + headerParsed=true; } @@ -259,56 +279,34 @@ QString ThreadDataTransfer::getTagValueFromElement(QDomNode node, } void ThreadDataTransfer::parseDataNode(QDomNodeList frames){ - //static int frameNumbers=0; - - //parsing the data - // TODO: i amybe a problem - //emit signal_CurrentAction("parsing data"); - for (int i = 0; i < frames.length(); i++) { Frame *newFrame = new Frame(); QDomElement el = frames.item(i).toElement(); QDomNodeList agents = el.elementsByTagName("agent"); - //cout << "found: " << agents.length() <<" agents" <<endl; - for (int i = 0; i < agents.length(); i++) { + for (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 xPos=agents.item(i).toElement().attribute("xPos","0").toDouble()*FAKTOR; - double yPos=agents.item(i).toElement().attribute("yPos","0").toDouble()*FAKTOR; - double zPos=agents.item(i).toElement().attribute("zPos","0").toDouble()*FAKTOR; - double agent_color =std::numeric_limits<double>::quiet_NaN(); - - double xVel=agents.item(i).toElement().attribute("xVel").toDouble(&ok)*FAKTOR; - if(!ok)xVel=std::numeric_limits<double>::quiet_NaN(); - double yVel=agents.item(i).toElement().attribute("yVel").toDouble(&ok)*FAKTOR; - if(!ok)yVel=std::numeric_limits<double>::quiet_NaN(); - double zVel=agents.item(i).toElement().attribute("zVel").toDouble(&ok)*FAKTOR; - if(!ok)zVel=std::numeric_limits<double>::quiet_NaN(); - - //coordinates of the ellipse, default to the head of the agent - double el_x=agents.item(i).toElement().attribute("xEll").toDouble(&ok)*FAKTOR; - if(!ok) el_x=xPos; - double el_y=agents.item(i).toElement().attribute("yEll").toDouble(&ok)*FAKTOR; - if(!ok) el_y=yPos; - double el_z=agents.item(i).toElement().attribute("zEll").toDouble(&ok)*FAKTOR; - if(!ok) el_z=zPos; - - double dia_a=agents.item(i).toElement().attribute("radiusA").toDouble(&ok)*FAKTOR; + double xPos=agents.item(i).toElement().attribute(_jps_xPos,"0").toDouble()*FAKTOR; + double yPos=agents.item(i).toElement().attribute(_jps_yPos,"0").toDouble()*FAKTOR; + double zPos=agents.item(i).toElement().attribute(_jps_zPos,"0").toDouble()*FAKTOR; + + double dia_a=agents.item(i).toElement().attribute(_jps_radiusA).toDouble(&ok)*FAKTOR; if(!ok)dia_a=std::numeric_limits<double>::quiet_NaN(); - double dia_b=agents.item(i).toElement().attribute("radiusB").toDouble(&ok)*FAKTOR; + double dia_b=agents.item(i).toElement().attribute(_jps_radiusB).toDouble(&ok)*FAKTOR; if(!ok)dia_b=std::numeric_limits<double>::quiet_NaN(); - double el_angle=agents.item(i).toElement().attribute("ellipseOrientation").toDouble(&ok); + double el_angle=agents.item(i).toElement().attribute(_jps_ellipseOrientation).toDouble(&ok); if(!ok){el_angle=std::numeric_limits<double>::quiet_NaN(); } - double el_color=agents.item(i).toElement().attribute("ellipseColor").toDouble(&ok); + double el_color=agents.item(i).toElement().attribute(_jps_ellipseColor).toDouble(&ok); if(!ok)el_color=std::numeric_limits<double>::quiet_NaN(); double pos[3]={xPos,yPos,zPos}; - double vel[3]={xVel,yPos,zPos}; - double ellipse[7]={el_x,el_y,el_z,dia_a,dia_b,el_angle,el_color}; - double para[2]={agent_color,el_angle}; + //double vel[3]={xVel,yPos,zPos}; + //double ellipse[7]={el_x,el_y,el_z,dia_a,dia_b,el_angle,el_color}; + //double para[2]={agent_color,el_angle}; double angle[3]={0,0,el_angle}; double radius[3]={dia_a,dia_b,30.0}; @@ -326,15 +324,12 @@ void ThreadDataTransfer::parseDataNode(QDomNodeList frames){ // frameNumbers++; } - // cout <<"frames size: "<<extern_trajectories_firstSet.getSize()<<endl; - // cout <<"frames numbes: "<<frameNumbers<<endl; if(headerParsed==true){ // static int count=1; // count++; // if (count<100) return; // start after 100 frames emit signal_startVisualisationThread(geoData,numberOfAgents,frameRate); headerParsed=false; - // count=0; } } @@ -386,8 +381,6 @@ void ThreadDataTransfer::parseShapeNode(QDomNode shape){ QDomNodeList agents = shape.toElement().elementsByTagName("agentInfo"); QStringList heights; QStringList colors; - - for (int i = 0; i < agents.length(); i++) { bool ok=false; @@ -414,3 +407,31 @@ void ThreadDataTransfer::parseShapeNode(QDomNode shape){ extern_trajectories_firstSet.setInitialHeights(heights); extern_trajectories_firstSet.setInitialColors(colors); } + +void ThreadDataTransfer::InitHeader(int major, int minor, int patch) +{ + // set the parsing String map + if(minor==5 && patch==0){ + _jps_xPos=QString("xPos"); + _jps_yPos=QString("yPos"); + _jps_zPos=QString("zPos"); + _jps_radiusA=QString("radiusA"); + _jps_radiusB=QString("radiusB"); + _jps_ellipseOrientation=QString("ellipseOrientation"); + _jps_ellipseColor=QString("ellipseColor"); + } + else if ( (minor==6) || (minor==5 && patch==1) ){ + _jps_xPos=QString("x"); + _jps_yPos=QString("y"); + _jps_zPos=QString("z"); + _jps_radiusA=QString("rA"); + _jps_radiusB=QString("rB"); + _jps_ellipseOrientation=QString("eO"); + _jps_ellipseColor=QString("eC"); + } + else + { + cout<<"unsupported header version: "<<major<<"."<<minor<<"."<<patch<<endl; + cout<<"Please use 0.5 0.5.1 or 0.6 "<<endl; + } +} diff --git a/src/ThreadDataTransfert.h b/src/ThreadDataTransfert.h index e2f2a42f75226a316f96425b3f81f3e90374a93b..f738cfe13c4cab602b4343b7e8ea88631a5ea038 100644 --- a/src/ThreadDataTransfert.h +++ b/src/ThreadDataTransfert.h @@ -74,6 +74,10 @@ public: /// parse data node void parseDataNode(QDomNodeList data); + //old and new geometry format + void InitHeader(int major, int minor, int patch); + + private: QString getTagValueFromElement(QDomNode node, const char * tagName); @@ -107,8 +111,6 @@ public Q_SLOTS: void slotProcessMessage(QString& data); void slotConnectionClosed(); void slotDisplayError(QAbstractSocket::SocketError socketError); - //void slotConnected(); - //void slotDisconnected(); private: @@ -121,6 +123,16 @@ private: int numberOfAgents; float frameRate; bool finished; + + // temp variables to be removed in the next versions + //header dependant variables + QString _jps_xPos; + QString _jps_yPos; + QString _jps_zPos; + QString _jps_radiusA; + QString _jps_radiusB; + QString _jps_ellipseOrientation; + QString _jps_ellipseColor; }; #endif /* THREADDATATRANSFERT_H_ */ diff --git a/src/geometry/FacilityGeometry.cpp b/src/geometry/FacilityGeometry.cpp index c4a2a995609066d9a4f79e125e9775cb4ed4ba8e..853e2a2080f271657110f83540ddb97b0bf9a370 100644 --- a/src/geometry/FacilityGeometry.cpp +++ b/src/geometry/FacilityGeometry.cpp @@ -550,7 +550,7 @@ void FacilityGeometry::addFloor(vtkPolyData* polygonPolyData ) floorActor->SetMapper(mapper); floorActor->GetProperty()->SetColor(0,0,1); - floorActor->GetProperty()->SetOpacity(0.5); + floorActor->GetProperty()->SetOpacity(0.4); assembly2D->AddPart(floorActor); assembly3D->AddPart(floorActor);