diff --git a/IO/IniFileParser.cpp b/IO/IniFileParser.cpp index 7c41b83e5d216a5b073a0cb70c1c14f773093125..475a45330710db640712058fe9fdd4d1826b1dbf 100644 --- a/IO/IniFileParser.cpp +++ b/IO/IniFileParser.cpp @@ -132,171 +132,17 @@ bool IniFileParser::Parse(std::string iniFile) return false; } - //check the structure of inifile - if (xMainNode->FirstChild("header")) { - //logfile - TiXmlNode* xHeader = xMainNode->FirstChild("header"); - if (xHeader->FirstChild("logfile")) { - _config->SetErrorLogFile( - _config->GetProjectRootDir() + xHeader->FirstChild("logfile")->FirstChild()->Value()); - _config->SetLog(2); - Log->Write("INFO:\tlogfile <%s>", _config->GetErrorLogFile().c_str()); - } - - - Log->Write("----\nJuPedSim - JPScore\n"); - Log->Write("Current date : %s %s", __DATE__, __TIME__); - Log->Write("Version : %s", JPSCORE_VERSION); - Log->Write("Compiler : %s (%s)", true_cxx.c_str(), true_cxx_ver.c_str()); - Log->Write("Commit hash : %s", GIT_COMMIT_HASH); - Log->Write("Commit date : %s", GIT_COMMIT_DATE); - Log->Write("Branch : %s\n----\n", GIT_BRANCH); - - - //seed - if (xHeader->FirstChild("seed")) { - TiXmlNode* seedNode = xHeader->FirstChild("seed")->FirstChild(); - if (seedNode) { - const char* seedValue = seedNode->Value(); - _config->SetSeed((unsigned int)atoi(seedValue));//strtol - } - else { - _config->SetSeed((unsigned int)time(NULL)); - } - } - // srand(_config->GetSeed()); - Log->Write("INFO:\trandom seed <%d>", _config->GetSeed()); - - // max simulation time - if (xHeader->FirstChild("max_sim_time")) { - const char* tmax = - xHeader->FirstChildElement("max_sim_time")->FirstChild()->Value(); - _config->SetTmax(atof(tmax)); - Log->Write("INFO: \tMaximal simulation time <%.2f> seconds", _config->GetTmax()); - } - - // Progressbar - if (xHeader->FirstChild("progressbar")) { - _config->SetPRB(true); - Log->Write("INFO: \tUse Progressbar"); - } - - // geometry file name - if (xHeader->FirstChild("geometry")) { - std::string filename = xHeader->FirstChild("geometry")->FirstChild()->Value(); - _config->SetGeometryFile(filename); - Log->Write("INFO: \tgeometry <%s>", filename.c_str()); - } - - - //max CPU - int max_threads = 1; -#ifdef _OPENMP - max_threads = omp_get_max_threads(); -#endif - if (xHeader->FirstChild("num_threads")) { - TiXmlNode* numthreads = xHeader->FirstChild("num_threads")->FirstChild(); - if (numthreads) { -#ifdef _OPENMP - omp_set_num_threads(xmltoi(numthreads->Value())); -#endif - } - } - _config->SetMaxOpenMPThreads(omp_get_max_threads()); - Log->Write("INFO:\tUsing num_threads <%d> threads (%d available)", _config->GetMaxOpenMPThreads(), max_threads); - - //display statistics - if (xMainNode->FirstChild("show_statistics")) { - std::string value = xMainNode->FirstChild("show_statistics")->FirstChild()->Value(); - _config->SetShowStatistics(value=="true"); - Log->Write("INFO: \tShow statistics: %s", value.c_str()); - } - - //trajectories - TiXmlNode* xTrajectories = xMainNode->FirstChild("trajectories"); - if (xTrajectories) { - double fps; - xMainNode->FirstChildElement("trajectories")->Attribute("fps", &fps); - _config->SetFps(fps); - - string format = - xMainNode->FirstChildElement("trajectories")->Attribute( - "format") ? - xMainNode->FirstChildElement("trajectories")->Attribute( - "format") : - "xml-plain"; - int embedMesh = 0; - if (xMainNode->FirstChildElement("trajectories")->Attribute( - "embed_mesh")) { - embedMesh = - string(xMainNode->FirstChildElement("trajectories")->Attribute("embed_mesh"))=="true" ? 1 : 0; - } - if (format=="xml-plain") - _config->SetFileFormat(FORMAT_XML_PLAIN); - if (format=="xml-plain" && embedMesh==1) - _config->SetFileFormat(FORMAT_XML_PLAIN_WITH_MESH); - if (format=="xml-bin") - _config->SetFileFormat(FORMAT_XML_BIN); - if (format=="plain") - _config->SetFileFormat(FORMAT_PLAIN); - if (format=="vtk") - _config->SetFileFormat(FORMAT_VTK); - - //color mode - string color_mode = - xMainNode->FirstChildElement("trajectories")->Attribute( - "color_mode") ? - xMainNode->FirstChildElement("trajectories")->Attribute( - "color_mode") : - "velocity"; - - if (color_mode=="velocity") - Pedestrian::SetColorMode( - AgentColorMode::BY_VELOCITY); //TODO: config parameter! does not belong to the pedestrian model, we should create a pedestrian config instead. [gl march '16] - if (color_mode=="spotlight") Pedestrian::SetColorMode(AgentColorMode::BY_SPOTLIGHT); - if (color_mode=="group") Pedestrian::SetColorMode(AgentColorMode::BY_GROUP); - if (color_mode=="knowledge") Pedestrian::SetColorMode(AgentColorMode::BY_KNOWLEDGE); - if (color_mode=="router") Pedestrian::SetColorMode(AgentColorMode::BY_ROUTER); - if (color_mode=="final_goal") Pedestrian::SetColorMode(AgentColorMode::BY_FINAL_GOAL); - if (color_mode=="intermediate_goal") Pedestrian::SetColorMode(AgentColorMode::BY_INTERMEDIATE_GOAL); - - - - - //a file descriptor was given - if (xTrajectories->FirstChild("file")) { - std::string tmp; - tmp = xTrajectories->FirstChildElement("file")->Attribute( - "location"); - fs::path p(tmp); - fs::path curr_abs_path = fs::current_path(); - fs::path rel_path = fs::path(_config->GetProjectRootDir()) / fs::path(tmp); - fs::path combined = (curr_abs_path /= rel_path); - std::string traj = combined.string(); - - if (traj.c_str()) - { - _config->SetTrajectoriesFile(traj); - _config->SetOriginalTrajectoriesFile(traj); - } + //check the structure of inifile + if (xMainNode->FirstChild("header")) { + TiXmlNode* xHeader = xMainNode->FirstChild("header"); + ParseHeader(xHeader); + }//if header + else { + ParseHeader(xMainNode); + }//else header - Log->Write("INFO: \toutput file <%s>", _config->GetTrajectoriesFile().c_str()); - Log->Write("INFO: \tin format <%s> at <%.0f> frames per seconds",format.c_str(), _config->GetFps()); - } - if (xTrajectories->FirstChild("socket")) { - std::string tmp = - xTrajectories->FirstChildElement("socket")->Attribute("hostname"); - if (tmp.c_str()) - _config->SetHostname(tmp); - int port; - xTrajectories->FirstChildElement("socket")->Attribute("port", &port); - _config->SetPort(port); - Log->Write("INFO: \tStreaming results to output [%s:%d] ", - _config->GetHostname().c_str(), _config->GetPort()); - } - } // JPSfire // ------------------------------------- @@ -404,6 +250,170 @@ bool IniFileParser::Parse(std::string iniFile) return true; } +bool IniFileParser::ParseHeader(TiXmlNode* xHeader) +{ + //logfile + if (xHeader->FirstChild("logfile")) { + _config->SetErrorLogFile( + _config->GetProjectRootDir() + xHeader->FirstChild("logfile")->FirstChild()->Value()); + _config->SetLog(2); + Log->Write("INFO:\tlogfile <%s>", _config->GetErrorLogFile().c_str()); + } + Log->Write("----\nJuPedSim - JPScore\n"); + Log->Write("Current date : %s %s", __DATE__, __TIME__); + Log->Write("Version : %s", JPSCORE_VERSION); + Log->Write("Compiler : %s (%s)", true_cxx.c_str(), true_cxx_ver.c_str()); + Log->Write("Commit hash : %s", GIT_COMMIT_HASH); + Log->Write("Commit date : %s", GIT_COMMIT_DATE); + Log->Write("Branch : %s\n----\n", GIT_BRANCH); + + + //seed + if (xHeader->FirstChild("seed")) { + TiXmlNode* seedNode = xHeader->FirstChild("seed")->FirstChild(); + if (seedNode) { + const char* seedValue = seedNode->Value(); + _config->SetSeed((unsigned int)atoi(seedValue));//strtol + } + else { + _config->SetSeed((unsigned int)time(NULL)); + } + } + // srand(_config->GetSeed()); + Log->Write("INFO:\trandom seed <%d>", _config->GetSeed()); + + // max simulation time + if (xHeader->FirstChild("max_sim_time")) { + const char* tmax = + xHeader->FirstChildElement("max_sim_time")->FirstChild()->Value(); + _config->SetTmax(atof(tmax)); + Log->Write("INFO: \tMaximal simulation time <%.2f> seconds", _config->GetTmax()); + } + + // Progressbar + if (xHeader->FirstChild("progressbar")) { + _config->SetPRB(true); + Log->Write("INFO: \tUse Progressbar"); + } + + // geometry file name + if (xHeader->FirstChild("geometry")) { + std::string filename = xHeader->FirstChild("geometry")->FirstChild()->Value(); + _config->SetGeometryFile(filename); + Log->Write("INFO: \tgeometry <%s>", filename.c_str()); + } + + + //max CPU + int max_threads = 1; +#ifdef _OPENMP + max_threads = omp_get_max_threads(); +#endif + if (xHeader->FirstChild("num_threads")) { + TiXmlNode* numthreads = xHeader->FirstChild("num_threads")->FirstChild(); + if (numthreads) { +#ifdef _OPENMP + omp_set_num_threads(xmltoi(numthreads->Value())); +#endif + } + } + _config->SetMaxOpenMPThreads(omp_get_max_threads()); + Log->Write("INFO:\tUsing num_threads <%d> threads (%d available)", _config->GetMaxOpenMPThreads(), max_threads); + + //display statistics + if (xHeader->FirstChild("show_statistics")) { + std::string value = xHeader->FirstChild("show_statistics")->FirstChild()->Value(); + _config->SetShowStatistics(value=="true"); + Log->Write("INFO: \tShow statistics: %s", value.c_str()); + } + + //trajectories + TiXmlNode* xTrajectories = xHeader->FirstChild("trajectories"); + if (xTrajectories) { + double fps; + xHeader->FirstChildElement("trajectories")->Attribute("fps", &fps); + _config->SetFps(fps); + + string format = + xHeader->FirstChildElement("trajectories")->Attribute( + "format") ? + xHeader->FirstChildElement("trajectories")->Attribute( + "format") : + "xml-plain"; + int embedMesh = 0; + if (xHeader->FirstChildElement("trajectories")->Attribute( + "embed_mesh")) { + embedMesh = + string(xHeader->FirstChildElement("trajectories")->Attribute("embed_mesh"))=="true" ? 1 : 0; + } + if (format=="xml-plain") + _config->SetFileFormat(FORMAT_XML_PLAIN); + if (format=="xml-plain" && embedMesh==1) + _config->SetFileFormat(FORMAT_XML_PLAIN_WITH_MESH); + if (format=="xml-bin") + _config->SetFileFormat(FORMAT_XML_BIN); + if (format=="plain") + _config->SetFileFormat(FORMAT_PLAIN); + if (format=="vtk") + _config->SetFileFormat(FORMAT_VTK); + + //color mode + string color_mode = + xHeader->FirstChildElement("trajectories")->Attribute( + "color_mode") ? + xHeader->FirstChildElement("trajectories")->Attribute( + "color_mode") : + "velocity"; + + if (color_mode=="velocity") + Pedestrian::SetColorMode( + AgentColorMode::BY_VELOCITY); //TODO: config parameter! does not belong to the pedestrian model, we should create a pedestrian config instead. [gl march '16] + if (color_mode=="spotlight") Pedestrian::SetColorMode(AgentColorMode::BY_SPOTLIGHT); + if (color_mode=="group") Pedestrian::SetColorMode(AgentColorMode::BY_GROUP); + if (color_mode=="knowledge") Pedestrian::SetColorMode(AgentColorMode::BY_KNOWLEDGE); + if (color_mode=="router") Pedestrian::SetColorMode(AgentColorMode::BY_ROUTER); + if (color_mode=="final_goal") Pedestrian::SetColorMode(AgentColorMode::BY_FINAL_GOAL); + if (color_mode=="intermediate_goal") Pedestrian::SetColorMode(AgentColorMode::BY_INTERMEDIATE_GOAL); + + + + + //a file descriptor was given + if (xTrajectories->FirstChild("file")) { + std::string tmp; + tmp = xTrajectories->FirstChildElement("file")->Attribute( + "location"); + fs::path p(tmp); + fs::path curr_abs_path = fs::current_path(); + fs::path rel_path = fs::path(_config->GetProjectRootDir()) / fs::path(tmp); + fs::path combined = (curr_abs_path /= rel_path); + std::string traj = combined.string(); + + if (traj.c_str()) + { + _config->SetTrajectoriesFile(traj); + _config->SetOriginalTrajectoriesFile(traj); + } + + + Log->Write("INFO: \toutput file <%s>", _config->GetTrajectoriesFile().c_str()); + Log->Write("INFO: \tin format <%s> at <%.0f> frames per seconds",format.c_str(), _config->GetFps()); + } + + if (xTrajectories->FirstChild("socket")) { + std::string tmp = + xTrajectories->FirstChildElement("socket")->Attribute("hostname"); + if (tmp.c_str()) + _config->SetHostname(tmp); + int port; + xTrajectories->FirstChildElement("socket")->Attribute("port", &port); + _config->SetPort(port); + Log->Write("INFO: \tStreaming results to output [%s:%d] ", + _config->GetHostname().c_str(), _config->GetPort()); + } + } + +} bool IniFileParser::ParseGCFMModel(TiXmlElement* xGCFM, TiXmlElement* xMainNode) { Log->Write("\nINFO:\tUsing the GCFM model"); diff --git a/IO/IniFileParser.h b/IO/IniFileParser.h index 1454f761d740909c644ac4539a3ddc63074e6d74..53dc72d6722f5c9cb19f7d34de435ef511a31bad 100644 --- a/IO/IniFileParser.h +++ b/IO/IniFileParser.h @@ -44,6 +44,8 @@ public: bool Parse(std::string iniFile); private: + bool ParseHeader(TiXmlNode* xHeader); + bool ParseGCFMModel(TiXmlElement* xGCFM, TiXmlElement* xMain); bool ParseKrauszModel(TiXmlElement* xKrausz, TiXmlElement* xMain); diff --git a/demos/scenario_11_sources/inifile.xml b/demos/scenario_11_sources/inifile.xml index 82eed7abbc2c4357a96d4c64ba8bd83f95783515..e9e8f124c381987312220f95d8c10a6de9b1a6a5 100644 --- a/demos/scenario_11_sources/inifile.xml +++ b/demos/scenario_11_sources/inifile.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8" ?> <JuPedSim project="JPS-Project" version="0.8" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://xsd.jupedsim.org/0.6/jps_ini_core.xsd"> - +<header> <!-- seed used for initialising random generator --> <seed>12542</seed> <!-- geometry file --> @@ -16,7 +16,7 @@ <!-- where to store the logs --> <logfile>log.txt</logfile> - +</header> <!-- traffic information: e.g closed doors or smoked rooms --> <traffic_constraints> <!-- doors states are: close or open -->