From df4dcd7f32dcdc934d971ba88b2676a20a6982a2 Mon Sep 17 00:00:00 2001 From: peri4 Date: Sun, 29 Jan 2023 20:27:43 +0300 Subject: [PATCH] PIGeoPosition as PIVariant support --- libs/main/types/pivariant.cpp | 3 +-- libs/main/types/pivariant.h | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/libs/main/types/pivariant.cpp b/libs/main/types/pivariant.cpp index 5684130f..667c5214 100644 --- a/libs/main/types/pivariant.cpp +++ b/libs/main/types/pivariant.cpp @@ -308,8 +308,7 @@ PIVariant::Type PIVariant::typeFromID(uint type_id) { uint PIVariant::typeIDFromName(const PIString & tname) { PIVariant::Type t = typeFromName(tname); - if (t == pivInvalid) return 0; - if (t == pivCustom) return tname.hash(); + if (t == pivCustom || t == pivInvalid) return tname.hash(); return typeIDFromType(t); } diff --git a/libs/main/types/pivariant.h b/libs/main/types/pivariant.h index 0c8d5384..55635283 100644 --- a/libs/main/types/pivariant.h +++ b/libs/main/types/pivariant.h @@ -28,6 +28,7 @@ #include "piconstchars.h" #include "pidatetime.h" +#include "pigeoposition.h" #include "piline.h" #include "pimathmatrix.h" #include "pinetworkaddress.h" @@ -1113,6 +1114,29 @@ REGISTER_VARIANT(PIMathMatrixd) REGISTER_VARIANT(PIVariantMap); REGISTER_VARIANT(PIVariantVector); +REGISTER_VARIANT(PIGeoPosition); +REGISTER_VARIANT_CAST(PIGeoPosition, PIString) { + PIGeoPosition g(v); + g.setEllipsoidModel(PIEllipsoidModel::WGS84Ellipsoid()); + g.transformTo(PIGeoPosition::Geodetic); + return PIString::fromNumber(g.latitudeGeodetic(), 'f', 8) + ", " + PIString::fromNumber(g.longitude(), 'f', 8) + ", " + + PIString::fromNumber(g.height(), 'f', 2); +}; + +REGISTER_VARIANT_CAST(PIString, PIGeoPosition) { + PIStringList sl = v.split(","); + if (sl.size() == 2) sl << "0"; + if (sl.size() >= 3) { + return PIGeoPosition({sl[0].toDouble(), sl[1].toDouble(), sl[2].toDouble()}, PIGeoPosition::Geodetic); + } + sl = v.split(";"); + if (sl.size() == 2) sl << "0"; + if (sl.size() >= 3) { + return PIGeoPosition({sl[0].toDouble(), sl[1].toDouble(), sl[2].toDouble()}, PIGeoPosition::Geodetic); + } + return PIGeoPosition({0., 0., 0.}, PIGeoPosition::Geodetic); +}; + //! \relatesalso PIBinaryStream //! \~english Store operator.