static Waypoint * DeserialiseWaypoint(const ConstDataNode &node, const Waypoints *waypoints) { std::unique_ptr<ConstDataNode> loc_node(node.GetChildNamed(_T("Location"))); if (!loc_node) return nullptr; GeoPoint loc; Deserialise(loc, *loc_node); const TCHAR *name = node.GetAttribute(_T("name")); if (name == nullptr) // Turnpoints need names return nullptr; if (waypoints != nullptr) { // Try to find waypoint by name const Waypoint *from_database = waypoints->LookupName(name); // If waypoint by name found and closer than 10m to the original if (from_database != nullptr && from_database->location.DistanceS(loc) <= fixed(10)) // Use this waypoint for the task return new Waypoint(*from_database); // Try finding the closest waypoint to the original one from_database = waypoints->GetNearest(loc, fixed(10)); // If closest waypoint found and closer than 10m to the original if (from_database != nullptr && from_database->location.DistanceS(loc) <= fixed(10)) // Use this waypoint for the task return new Waypoint(*from_database); } // Create a new waypoint from the original one Waypoint *wp = new Waypoint(loc); wp->name = name; node.GetAttribute(_T("id"), wp->id); const TCHAR *comment = node.GetAttribute(_T("comment")); if (comment != nullptr) wp->comment.assign(comment); node.GetAttribute(_T("altitude"), wp->elevation); return wp; }
void Deserialiser::Deserialise(OrderedTask &task) { task.Clear(); task.SetFactory(GetTaskFactoryType()); task.Reset(); OrderedTaskBehaviour beh = task.GetOrderedTaskBehaviour(); Deserialise(beh); task.SetOrderedTaskBehaviour(beh); const DataNode::List children = node.ListChildrenNamed(_T("Point")); for (const auto &i : children) { std::unique_ptr<DataNode> point_node(i); Deserialiser pser(*point_node, waypoints); pser.DeserialiseTaskpoint(task); } }
void LoadTask(OrderedTask &task, const ConstDataNode &node, const Waypoints *waypoints) { task.Clear(); task.SetFactory(GetTaskFactoryType(node)); task.Reset(); OrderedTaskSettings beh = task.GetOrderedTaskSettings(); Deserialise(beh, node); task.SetOrderedTaskSettings(beh); const auto children = node.ListChildrenNamed(_T("Point")); for (const auto &i : children) { std::unique_ptr<ConstDataNode> point_node(i); DeserialiseTaskpoint(task, *point_node, waypoints); } }