diff --git a/src/geometry/Building.cpp b/src/geometry/Building.cpp index a3b5d42a9aa911569fe7471717277303445f214a..9917f889a60024807ec7796fb1c625779b5f7444 100644 --- a/src/geometry/Building.cpp +++ b/src/geometry/Building.cpp @@ -577,63 +577,51 @@ bool Building::LoadGeometry(const std::string &geometryfile) // all rooms are read, now proceed with transitions TiXmlNode* xTransNode = xRootNode->FirstChild("transitions"); if(xTransNode) + { + for(TiXmlElement* xTrans = xTransNode->FirstChildElement("transition"); xTrans; - xTrans = xTrans->NextSiblingElement("transition")) { + xTrans = xTrans->NextSiblingElement("transition")) { - int id = xmltoi(xTrans->Attribute("id"), -1); - // string caption = "door " + id; - string caption = "door "; - caption += to_string(id); - caption = xmltoa(xTrans->Attribute("caption"), caption.c_str()); - int room1_id = xmltoi(xTrans->Attribute("room1_id"), -1); - int room2_id = xmltoi(xTrans->Attribute("room2_id"), -1); - int subroom1_id = xmltoi(xTrans->Attribute("subroom1_id"), -1); - int subroom2_id = xmltoi(xTrans->Attribute("subroom2_id"), -1); - string type = xmltoa(xTrans->Attribute("type"), "normal"); - - double x1 = xmltof( xTrans->FirstChildElement("vertex")->Attribute("px")); - double y1 = xmltof( xTrans->FirstChildElement("vertex")->Attribute("py")); - - double x2 = xmltof( xTrans->LastChild("vertex")->ToElement()->Attribute("px")); - double y2 = xmltof( xTrans->LastChild("vertex")->ToElement()->Attribute("py")); - - - Transition* t = new Transition(); - t->SetID(id); - t->SetCaption(caption); - t->SetPoint1(Point(x1, y1)); - t->SetPoint2(Point(x2, y2)); - t->SetType(type); - - if (room1_id != -1 && subroom1_id != -1) { - //Room* room = _rooms[room1_id]; - Room* room = GetRoom(room1_id); - SubRoom* subroom = room->GetSubRoom(subroom1_id); - - //subroom->AddGoalID(t->GetUniqueID()); - //MPI - room->AddTransitionID(t->GetUniqueID()); - t->SetRoom1(room); - t->SetSubRoom1(subroom); - - //new implementation - subroom->AddTransition(t); + parseTransition(xTrans); + AddTransition(t); + } +// ------ file + TiXmlNode * xNodeFile = xTransNode->FirstChild("file"); + if(xNodeFile) + { + std::string transFilename = xNodeFile->FirstChild()->ValueStr(); + Log->Write("INFO:\tParsing transition from file <%s>", transFilename.c_str()); + TiXmlDocument docTrans(transFilename); + if (!docTrans.LoadFile()) { + Log->Write("ERROR: \t%s", docTrans.ErrorDesc()); + Log->Write("ERROR: \t could not parse the transitions file."); + return false; } - if (room2_id != -1 && subroom2_id != -1) { - auto&& room = _rooms[room2_id]; - SubRoom* subroom = room->GetSubRoom(subroom2_id); - //subroom->AddGoalID(t->GetUniqueID()); - //MPI - room->AddTransitionID(t->GetUniqueID()); - t->SetRoom2(room.get()); - t->SetSubRoom2(subroom); - - //new implementation - subroom->AddTransition(t); + TiXmlElement* xRootNodeTrans = docTrans.RootElement(); + if (!xRootNodeTrans) { + Log->Write("ERROR:\tRoot element does not exist in transitions file."); + return false; + } + if (xRootNodeTrans->ValueStr() != "JPScore") { + Log->Write("ERROR:\tParsing transitions file. Root element value is not 'JPScore'."); + return false; + } + TiXmlNode* xTransNodeFile = xRootNodeTrans->FirstChild("transitions"); + if (!xTransNodeFile) { + Log->Write("ERROR:\tNo Transitions in file found."); + return false; + } + for (TiXmlElement* xTrans = xTransNodeFile->FirstChildElement("transition"); xTrans; + xTrans = xTrans->NextSiblingElement("transition")) { + Transition * t = parseTransitionNode(xTrans, building); + building->AddTransition(t); } - - AddTransition(t); } + else{ + Log->Write("INFO:\tNot parsing transition from file %s"); + } + + } Debug::Messages("Loading building file successful!!!\n"); @@ -642,6 +630,63 @@ bool Building::LoadGeometry(const std::string &geometryfile) } +Transition* Building::ParseTransition(TiXmlElement * xTrans) +{ + + int id = xmltoi(xTrans->Attribute("id"), -1); + // string caption = "door " + id; + string caption = "door "; + caption += to_string(id); + caption = xmltoa(xTrans->Attribute("caption"), caption.c_str()); + int room1_id = xmltoi(xTrans->Attribute("room1_id"), -1); + int room2_id = xmltoi(xTrans->Attribute("room2_id"), -1); + int subroom1_id = xmltoi(xTrans->Attribute("subroom1_id"), -1); + int subroom2_id = xmltoi(xTrans->Attribute("subroom2_id"), -1); + string type = xmltoa(xTrans->Attribute("type"), "normal"); + + double x1 = xmltof( xTrans->FirstChildElement("vertex")->Attribute("px")); + double y1 = xmltof( xTrans->FirstChildElement("vertex")->Attribute("py")); + + double x2 = xmltof( xTrans->LastChild("vertex")->ToElement()->Attribute("px")); + double y2 = xmltof( xTrans->LastChild("vertex")->ToElement()->Attribute("py")); + + + Transition* t = new Transition(); + t->SetID(id); + t->SetCaption(caption); + t->SetPoint1(Point(x1, y1)); + t->SetPoint2(Point(x2, y2)); + t->SetType(type); + + if (room1_id != -1 && subroom1_id != -1) { + //Room* room = _rooms[room1_id]; + Room* room = GetRoom(room1_id); + SubRoom* subroom = room->GetSubRoom(subroom1_id); + + //subroom->AddGoalID(t->GetUniqueID()); + //MPI + room->AddTransitionID(t->GetUniqueID()); + t->SetRoom1(room); + t->SetSubRoom1(subroom); + + //new implementation + subroom->AddTransition(t); + } + if (room2_id != -1 && subroom2_id != -1) { + auto&& room = _rooms[room2_id]; + SubRoom* subroom = room->GetSubRoom(subroom2_id); + //subroom->AddGoalID(t->GetUniqueID()); + //MPI + room->AddTransitionID(t->GetUniqueID()); + t->SetRoom2(room.get()); + t->SetSubRoom2(subroom); + + //new implementation + subroom->AddTransition(t); + } + return t; +} + void Building::WriteToErrorLog() const { Log->Write("GEOMETRY: ");