From ea2c329933711115ecf2a7be49c6417feb7311e9 Mon Sep 17 00:00:00 2001
From: Ulrich Kemloh <kemlohulrich@gmail.com>
Date: Mon, 20 Jul 2015 16:21:05 +0200
Subject: [PATCH] navigation lines in online mode

---
 src/MainWindow.cpp |  45 +++++--------
 src/SaxParser.cpp  | 163 ---------------------------------------------
 2 files changed, 16 insertions(+), 192 deletions(-)

diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp
index f23550a..f725d71 100755
--- a/src/MainWindow.cpp
+++ b/src/MainWindow.cpp
@@ -498,31 +498,8 @@ void MainWindow::parseGeometry(const QDomNode &geoNode)
 // This function is only used in online Mode
 void MainWindow::parseGeometry(const 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)) {
+    if (file.open(QIODevice::ReadWrite | QIODevice::Text)) {
         QTextStream stream(&file);
         stream << geometryString << endl;
     }
@@ -536,8 +513,6 @@ void MainWindow::parseGeometry(const QString& geometryString)
 
     auto&& geometry = _visualisationThread->getGeometry();
 
-
-
     if(!geofileName.isEmpty()) {
         SystemSettings::CreateLogfile();
         if (geofileName.endsWith(".xml",Qt::CaseInsensitive)) {
@@ -554,16 +529,28 @@ void MainWindow::parseGeometry(const QString& geometryString)
     // 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;
 
+        QDomNode geoNode;
         //must not be a file name
         SaxParser::parseGeometryTRAV(geometryString,geometry,geoNode);
     }
 
+    //workaround. In some cases there are still hlines in the input files which are not parsed.
+    if(geofileName.endsWith(".xml",Qt::CaseInsensitive))
+    {
+        QXmlInputSource source;
+        source.setData(geometryString);
+        QXmlSimpleReader reader;
+
+        SyncData dummy;
+        double fps;
+        SaxParser handler(geometry,dummy,&fps);
+        reader.setContentHandler(&handler);
+        reader.parse(source);
+    }
+
     //delete the file
     file.remove();
-
 }
 
 // TODO: still used?
diff --git a/src/SaxParser.cpp b/src/SaxParser.cpp
index 4972b90..5deef98 100644
--- a/src/SaxParser.cpp
+++ b/src/SaxParser.cpp
@@ -778,170 +778,7 @@ bool SaxParser::parseGeometryJPS(QString fileName, GeometryFactory& geoFac)
     return true;
 }
 
-/*
 
-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;
-    SystemSettings::getWorkingDirectory(wd);
-    fileName=wd+"/"+fileName;
-
-    Building* building = new Building();
-    string geometrypath = fileName.toStdString();
-
-    // read the geometry
-    if(!building->LoadGeometry(geometrypath))
-        return false;
-    if(!building->InitGeometry())
-        return false; // create the polygons
-
-    int currentFloorPolyID=0;
-    int currentObstPolyID=0;
-
-    // Setup the points
-    VTK_CREATE(vtkPoints,floor_points);
-    VTK_CREATE(vtkPoints,obstacles_points);
-    // Add the polygon to a list of polygons
-    VTK_CREATE(vtkCellArray,floor_polygons);
-    VTK_CREATE(vtkCellArray,obstacles_polygons);
-
-    for(auto&& itr_room: building->GetAllRooms())
-    {
-        for(auto&& itr_subroom: itr_room.second->GetAllSubRooms())
-        {
-
-            //string caption = r->GetCaption();
-            SubRoom* sub = itr_subroom.second.get();
-
-            vector<Point> poly = sub->GetPolygon();
-            if(sub->IsClockwise()==true) {
-                std::reverse(poly.begin(),poly.end());
-            }
-
-            // Create the polygon
-            VTK_CREATE(vtkPolygon,polygon);
-            polygon->GetPointIds()->SetNumberOfIds(poly.size());
-
-            for (unsigned int s=0; s<poly.size(); s++) {
-                floor_points->InsertNextPoint(poly[s]._x*FAKTOR,poly[s]._y*FAKTOR,sub->GetElevation(poly[s])*FAKTOR);
-                polygon->GetPointIds()->SetId(s, currentFloorPolyID++);
-            }
-            floor_polygons->InsertNextCell(polygon);
-
-            //plot the walls only for not stairs
-            const vector<Wall>& walls= sub->GetAllWalls();
-            for(unsigned int w=0; w<walls.size(); w++) {
-                Point p1 = walls[w].GetPoint1();
-                Point p2 = walls[w].GetPoint2();
-                double z1= sub->GetElevation(p1);
-                double z2= sub->GetElevation(p2);
-
-                if(sub->GetType()=="stair") {
-                    geometry->addStair(p1._x*FAKTOR, p1._y*FAKTOR, z1*FAKTOR, p2._x*FAKTOR, p2._y*FAKTOR,z2*FAKTOR);
-                } else {
-                    geometry->addWall(p1._x*FAKTOR, p1._y*FAKTOR, z1*FAKTOR, p2._x*FAKTOR, p2._y*FAKTOR,z2*FAKTOR);
-                }
-            }
-
-            //insert the subroom caption
-            string caption=itr_room.second->GetCaption()+" ( " + QString::number(sub->GetSubRoomID()).toStdString() + " ) ";
-            const Point& p=sub->GetCentroid();
-            double z= sub->GetElevation(p);
-            double pos[3]= {p._x*FAKTOR,p._y*FAKTOR,z*FAKTOR};
-            geometry->addObjectLabel(pos,pos,caption,captionsColor);
-
-            //plot the obstacles
-            for(auto obst:sub->GetAllObstacles())
-            {
-                for(auto wall: obst->GetAllWalls())
-                {
-                    Point p1 = wall.GetPoint1();
-                    Point p2 = wall.GetPoint2();
-                    double z1= sub->GetElevation(p1);
-                    double z2= sub->GetElevation(p2);
-                    geometry->addWall(p1._x*FAKTOR, p1._y*FAKTOR, z1*FAKTOR, p2._x*FAKTOR, p2._y*FAKTOR,z2*FAKTOR);
-                }
-                //add the obstacle caption
-                const Point& p=obst->GetCentroid();
-                double z= sub->GetElevation(p);
-                double pos[3]= {p._x*FAKTOR,p._y*FAKTOR,z*FAKTOR};
-                geometry->addObjectLabel(pos,pos,obst->GetCaption(),captionsColor);
-
-                //add a special texture to the obstacles
-                auto poly = obst->GetPolygon();
-                //if(obst->IsClockwise()==true) {
-                //  std::reverse(poly.begin(),poly.end());
-                //}
-
-                // Create the polygon
-                VTK_CREATE(vtkPolygon,polygon);
-                polygon->GetPointIds()->SetNumberOfIds(poly.size());
-
-                for (unsigned int s=0; s<poly.size(); s++) {
-                    obstacles_points->InsertNextPoint(poly[s]._x*FAKTOR,poly[s]._y*FAKTOR,sub->GetElevation(poly[s])*FAKTOR);
-                    polygon->GetPointIds()->SetId(s, currentObstPolyID++);
-                }
-                obstacles_polygons->InsertNextCell(polygon);
-            }
-        }
-    }
-
-    // Create a PolyData to represent the floor
-    VTK_CREATE(vtkPolyData, floorPolygonPolyData);
-    floorPolygonPolyData->SetPoints(floor_points);
-    floorPolygonPolyData->SetPolys(floor_polygons);
-    geometry->addFloor(floorPolygonPolyData);
-
-    // Create a PolyData to represen the obstacles
-    //TODO:
-    VTK_CREATE(vtkPolyData, obstPolygonPolyData);
-    obstPolygonPolyData->SetPoints(obstacles_points);
-    obstPolygonPolyData->SetPolys(obstacles_polygons);
-    geometry->addObstacles(obstPolygonPolyData);
-
-
-    // add the crossings
-    const map<int, Crossing*>& crossings=building->GetAllCrossings();
-    for (std::map<int, Crossing*>::const_iterator it=crossings.begin(); it!=crossings.end(); ++it) {
-        Crossing* cr=it->second;
-        Point p1 = cr->GetPoint1();
-        Point p2 = cr->GetPoint2();
-        double z1= cr->GetSubRoom1()->GetElevation(p1);
-        double z2= cr->GetSubRoom1()->GetElevation(p2);
-        geometry->addNavLine(p1._x*FAKTOR, p1._y*FAKTOR, z1*FAKTOR, p2._x*FAKTOR, p2._y*FAKTOR,z2*FAKTOR);
-
-        const Point& p =cr->GetCentre();
-        double pos[3]= {p._x*FAKTOR,p._y*FAKTOR,z1*FAKTOR};
-        geometry->addObjectLabel(pos,pos,"nav_"+QString::number(cr->GetID()).toStdString(),captionsColor);
-    }
-
-    // add the exits
-    const map<int, Transition*>& transitions=building->GetAllTransitions();
-    for (std::map<int, Transition*>::const_iterator it=transitions.begin(); it!=transitions.end(); ++it) {
-        Transition* tr=it->second;
-        Point p1 = tr->GetPoint1();
-        Point p2 = tr->GetPoint2();
-        double z1= tr->GetSubRoom1()->GetElevation(p1);
-        double z2= tr->GetSubRoom1()->GetElevation(p2);
-        geometry->addDoor(p1._x*FAKTOR, p1._y*FAKTOR, z1*FAKTOR, p2._x*FAKTOR, p2._y*FAKTOR,z2*FAKTOR);
-
-        const Point& p =tr->GetCentre();
-        double pos[3]= {p._x*FAKTOR,p._y*FAKTOR,z1*FAKTOR};
-        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;
-    return true;
-}
-
- */
 
 /// provided for convenience and will be removed in the next version
 
-- 
GitLab