/* * This file is part of the Owl Positioning System (OwlPS) project. * It is subject to the copyright notice and license terms in the * COPYRIGHT.t2t file found in the top-level directory of this * distribution and at * https://code.lm7.fr/mcy/owlps/src/master/COPYRIGHT.t2t * No part of the OwlPS Project, including this file, may be copied, * modified, propagated, or distributed except according to the terms * contained in the COPYRIGHT.t2t file; the COPYRIGHT.t2t file must be * distributed along with this file, either separately or by replacing * this notice by the COPYRIGHT.t2t file's contents. */ #include "topologyreadercsv.hh" #include "posexcept.hh" #include "stock.hh" #include "area.hh" #include "waypoint.hh" using namespace std ; /* *** Constructors *** */ TopologyReaderCSV::TopologyReaderCSV( const string &areas_file_name, const string &waypoints_file_name): areas_file(areas_file_name), waypoints_file(waypoints_file_name) { read_topology() ; } /* *** Operations *** */ void TopologyReaderCSV::read_topology() { while (areas_file.next_line()) process_area_line() ; while (waypoints_file.next_line()) process_waypoint_line() ; } void TopologyReaderCSV::process_area_line() { string building_name ; if (! areas_file.read_field(building_name)) throw malformed_input_data("Cannot read building name!") ; Building &building = const_cast( Stock::find_create_building(building_name)) ; string name ; if (! areas_file.read_field(name)) throw malformed_input_data("Cannot read area name!") ; Point3D p_min ; if (! areas_file.read_point3d(p_min)) throw malformed_input_data("Cannot read area min coordinates!") ; Point3D p_max ; if (! areas_file.read_point3d(p_max)) throw malformed_input_data("Cannot read area max coordinates!") ; Area *area = new Area(&building, name, p_min, p_max) ; try { building.add_area(area) ; } catch (element_already_exists &e) { delete area ; } } void TopologyReaderCSV::process_waypoint_line() { Point3D coordinates ; if (! waypoints_file.read_point3d(coordinates)) throw malformed_input_data("Cannot read waypoint coordinates!") ; Waypoint &waypoint_ref = const_cast(Stock::find_create_waypoint(coordinates)) ; vector buildings ; string building_name ; while (waypoints_file.read_field(building_name)) buildings.push_back(const_cast( &Stock::find_create_building(building_name))) ; if (buildings.empty()) throw malformed_input_data("Cannot read building name!") ; for (auto i = buildings.begin() ; i != buildings.end() ; ++i) { waypoint_ref.add_building(*i) ; (*i)->add_waypoint(&waypoint_ref) ; } }