diff --git a/src/SaxParser.cpp b/src/SaxParser.cpp index 2b5d4b9348ad2940bc47bef414462c897923f17b..7aeb42fb1174b3f16ad691ae44cde4d68593535b 100644 --- a/src/SaxParser.cpp +++ b/src/SaxParser.cpp @@ -591,11 +591,15 @@ bool SaxParser::parseGeometryJPS(QString fileName, FacilityGeometry *geometry) if(!building->InitGeometry()) return false; // create the polygons - int currentID=0; + int currentFloorPolyID=0; + int currentObstPolyID=0; + // Setup the points - VTK_CREATE(vtkPoints,points); + VTK_CREATE(vtkPoints,floor_points); + VTK_CREATE(vtkPoints,obstacles_points); // Add the polygon to a list of polygons - VTK_CREATE(vtkCellArray,polygons); + VTK_CREATE(vtkCellArray,floor_polygons); + VTK_CREATE(vtkCellArray,obstacles_polygons); for (int i = 0; i < building->GetNumberOfRooms(); i++) { Room* r = building->GetRoom(i); @@ -605,7 +609,6 @@ bool SaxParser::parseGeometryJPS(QString fileName, FacilityGeometry *geometry) SubRoom* sub = r->GetSubRoom(k); vector<Point> poly = sub->GetPolygon(); - if(sub->IsClockwise()==true) { std::reverse(poly.begin(),poly.end()); } @@ -615,10 +618,10 @@ bool SaxParser::parseGeometryJPS(QString fileName, FacilityGeometry *geometry) polygon->GetPointIds()->SetNumberOfIds(poly.size()); for (unsigned int s=0; s<poly.size(); s++) { - points->InsertNextPoint(poly[s]._x*FAKTOR,poly[s]._y*FAKTOR,sub->GetElevation(poly[s])*FAKTOR); - polygon->GetPointIds()->SetId(s, currentID++); + floor_points->InsertNextPoint(poly[s]._x*FAKTOR,poly[s]._y*FAKTOR,sub->GetElevation(poly[s])*FAKTOR); + polygon->GetPointIds()->SetId(s, currentFloorPolyID++); } - polygons->InsertNextCell(polygon); + floor_polygons->InsertNextCell(polygon); //plot the walls only for not stairs const vector<Wall>& walls= sub->GetAllWalls(); @@ -643,13 +646,12 @@ bool SaxParser::parseGeometryJPS(QString fileName, FacilityGeometry *geometry) geometry->addObjectLabel(pos,pos,caption,captionsColor); //plot the obstacles - const vector<Obstacle*>& obstacles = sub->GetAllObstacles(); - for( unsigned int j=0; j<obstacles.size(); j++) { - Obstacle* obst= obstacles[j]; - const vector<Wall>& walls= obst->GetAllWalls(); - for(unsigned int w=0; w<walls.size(); w++) { - Point p1 = walls[w].GetPoint1(); - Point p2 = walls[w].GetPoint2(); + 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); @@ -659,22 +661,38 @@ bool SaxParser::parseGeometryJPS(QString fileName, FacilityGeometry *geometry) 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, polygonPolyData); - polygonPolyData->SetPoints(points); - polygonPolyData->SetPolys(polygons); - geometry->addFloor(polygonPolyData); + 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, polygonPolyData); - //polygonPolyData->SetPoints(points); - //polygonPolyData->SetPolys(polygons); - //geometry->addFloor(polygonPolyData); + VTK_CREATE(vtkPolyData, obstPolygonPolyData); + obstPolygonPolyData->SetPoints(obstacles_points); + obstPolygonPolyData->SetPolys(obstacles_polygons); + geometry->addObstacles(obstPolygonPolyData); // add the crossings diff --git a/src/geometry/FacilityGeometry.cpp b/src/geometry/FacilityGeometry.cpp index 543c98e8d7bb9be0afd41e9fe626ebb4d2d1c964..65d8a892443d3d236247f7074cf7d7e52657c3a7 100644 --- a/src/geometry/FacilityGeometry.cpp +++ b/src/geometry/FacilityGeometry.cpp @@ -80,6 +80,7 @@ FacilityGeometry::FacilityGeometry() assembly3D = vtkAssembly::New(); floorActor = vtkActor::New(); + obstaclesActor = vtkActor::New(); captions=vtkActor2DCollection::New(); linesPlotter2D = new LinePlotter2D(); @@ -122,6 +123,7 @@ FacilityGeometry::~FacilityGeometry() assemblyDoors3D->Delete(); assembly3D->Delete(); floorActor->Delete(); + obstaclesActor->Delete(); delete linesPlotter2D; } @@ -579,6 +581,28 @@ void FacilityGeometry::addFloor(vtkPolyData* polygonPolyData ) assembly3D->AddPart(floorActor); } +void FacilityGeometry::addObstacles(vtkPolyData* polygonPolyData ) +{ + //triagulate everything + // Create a mapper and actor + VTK_CREATE(vtkTriangleFilter,filter); + VTK_CREATE(vtkPolyDataMapper,mapper); + +#if VTK_MAJOR_VERSION <= 5 + filter->SetInput(polygonPolyData); + mapper->SetInput(filter->GetOutput()); +#else + filter->SetInputData(polygonPolyData); + mapper->SetInputConnection(filter->GetOutputPort()); +#endif + + obstaclesActor->SetMapper(mapper); + obstaclesActor->GetProperty()->SetColor(0.4,0.4,0.4); + obstaclesActor->GetProperty()->SetOpacity(0.5); + + assembly2D->AddPart(obstaclesActor); + assembly3D->AddPart(obstaclesActor); +} void FacilityGeometry::addFloor(double x1, double y1, double x2, double y2, double z) { @@ -770,6 +794,11 @@ void FacilityGeometry::changeFloorColor(double *color) floorActor->GetProperty()->SetColor(color); } +void FacilityGeometry::changeObstaclesColor(double *color) +{ + obstaclesActor->GetProperty()->SetColor(color); +} + void FacilityGeometry::set2D(bool status) { assembly2D->SetVisibility(status); diff --git a/src/geometry/FacilityGeometry.h b/src/geometry/FacilityGeometry.h index 0553a10e275dfc52c7f7048903f16c6f9c70e68f..05610a3d3a9a53d44b69a16c2e7c05fb27800ec4 100644 --- a/src/geometry/FacilityGeometry.h +++ b/src/geometry/FacilityGeometry.h @@ -106,6 +106,9 @@ public: void addFloor(double x1, double y1, double x2, double y2, double z=0); void addFloor(vtkPolyData* polygonPolyData); + ///draw obstacles + void addObstacles(vtkPolyData* polygonPolyData); + /// 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); @@ -117,6 +120,7 @@ public: void changeExitsColor(double* color); void changeNavLinesColor(double* color); void changeFloorColor(double* color); + void changeObstaclesColor(double* color); void set2D(bool status); void set3D(bool status); @@ -163,6 +167,7 @@ private: vtkAssembly* assembly3D; vtkActor* floorActor; + vtkActor* obstaclesActor; // other parts vtkAssembly* assemblyCaptions;