Compare commits

...
Author SHA1 Message Date
berrux-dev d327c66c46 Close bld/OSG floor: OSG 3.4.1 from source + port osgQt to Qt6 + wire BgViewer dtEntity
Migrate BuildingViewer (16 files: DDS members, m_logger inits, QOpenGLWidget); gui:3:bld.info + gui:3:bdv now load
2026-10-24 19:32:52 +02:00
berrux-dev 8e9594d25c Close ppm.msdl/ppm.saab floors: re-implement MSDL/SAAB import without Qt XmlPatterns
Qt6::Xml (QDomDocument) + xmllint schema check; MSDL links XercesC + xsdc++ tree classes; both moved into GROUP12
2026-10-24 19:31:04 +02:00
35 changed files with 539 additions and 467 deletions

No files matched your search

+12 -18
View File
@@ -210,8 +210,12 @@ OPTION(BUILD_PLUGINS_PLANEDITOR "Build PlanEditor plugin (requires Qt6 WebEngine
OPTION(BUILD_PLUGINS_ONLINEHELP "Build OnlineHelp plugin (requires Qt6 WebEngine)" OFF) OPTION(BUILD_PLUGINS_ONLINEHELP "Build OnlineHelp plugin (requires Qt6 WebEngine)" OFF)
OPTION(BUILD_PLUGINS_SERVICEMONITOR "Build ServiceMonitor plugin (requires Qt6 WebEngine)" OFF) OPTION(BUILD_PLUGINS_SERVICEMONITOR "Build ServiceMonitor plugin (requires Qt6 WebEngine)" OFF)
OPTION(BUILD_PLUGINS_PARTICIPANT_ORG_CHART "Build ParticipantOrgChart (requires Qt6 WebEngine)" OFF) OPTION(BUILD_PLUGINS_PARTICIPANT_ORG_CHART "Build ParticipantOrgChart (requires Qt6 WebEngine)" OFF)
OPTION(BUILD_PLUGINS_MSDL "Build MSDL module (requires Qt6 XmlPatterns)" OFF) # MSDL/Saab no longer require Qt XmlPatterns (removed in Qt 6.0): their import
OPTION(BUILD_PLUGINS_SAAB "Build Saab module (requires Qt6 XmlPatterns)" OFF) # code was re-implemented with Qt6::Xml (QDomDocument) for the schema check plus
# the external xmllint step for real XSD validation; MSDL additionally links
# XercesC + uses xsdc++-generated tree classes (needs libxerces-c-dev + xsdcxx).
OPTION(BUILD_PLUGINS_MSDL "Build MSDL module (needs XercesC + xsdc++)" OFF)
OPTION(BUILD_PLUGINS_SAAB "Build Saab module (Qt6::Xml only)" OFF)
OPTION(BUILD_RTI "Build RTI Connext DDS dependent modules" OFF) OPTION(BUILD_RTI "Build RTI Connext DDS dependent modules" OFF)
OPTION(BUILD_VIEWER_ONLY "Build only Viewer module (no RTI required)" OFF) OPTION(BUILD_VIEWER_ONLY "Build only Viewer module (no RTI required)" OFF)
# Add Lts/ include path globally for QosProfile and other Lts headers # Add Lts/ include path globally for QosProfile and other Lts headers
@@ -360,22 +364,12 @@ if(NOT Qt6_FOUND)
message(STATUS "Found Qt6 (minimal): ${Qt6Core_VERSION}") message(STATUS "Found Qt6 (minimal): ${Qt6Core_VERSION}")
endif() endif()
# Qt6::XmlPatterns (consumed by the MSDL/Saab import libs, gated by # MSDL/Saab import libs (gated by BUILD_PLUGINS_MSDL / BUILD_PLUGINS_SAAB) no
# BUILD_PLUGINS_MSDL / BUILD_PLUGINS_SAAB): the XmlPatterns module (its own # longer use Qt XmlPatterns (QXmlSchema/QXmlSchemaValidator), which was removed
# qtxmlpatterns repo) was removed in Qt 6.0 and never re-introduced, so no Qt 6 # in Qt 6.0. They were re-implemented with Qt6::Xml (QDomDocument) for the
# install carries it. It is NOT part of the component lists above (a missing # schema well-formedness check plus the external xmllint step for real XSD
# component there would flip Qt6_FOUND off and disable the whole GUI path). # validation; MSDL additionally links XercesC and uses xsdc++-generated tree
# Find it separately; when absent the two plugins must stay disabled - their # classes. No Qt6::XmlPatterns lookup is needed any more.
# CMakeLists reference Qt6::XmlPatterns in link libraries and CMake errors at
# generate time for an undefined namespaced target.
if(NOT TARGET Qt6::XmlPatterns)
find_package(Qt6XmlPatterns QUIET)
if(Qt6XmlPatterns_FOUND)
message(STATUS "Found Qt6XmlPatterns")
else()
message(STATUS "Qt6XmlPatterns not found (PpmMSDLGuiPlugin/PpmSAABGuiPlugin require it; keep BUILD_PLUGINS_MSDL/BUILD_PLUGINS_SAAB OFF)")
endif()
endif()
# Qt6::WebChannel (consumed by PpmOrgChartGuiPlugin's QWebChannel page setup): # Qt6::WebChannel (consumed by PpmOrgChartGuiPlugin's QWebChannel page setup):
# in Qt5 Qt5::WebEngineWidgets transitively linked Qt5::WebChannel (Qt5's # in Qt5 Qt5::WebEngineWidgets transitively linked Qt5::WebChannel (Qt5's
@@ -125,7 +125,8 @@ class Shot
Shot(const int32_t id, const osg::Vec3d& shooterPos, const osg::Vec3d& targetPos, int buildingIdSrc, Shot(const int32_t id, const osg::Vec3d& shooterPos, const osg::Vec3d& targetPos, int buildingIdSrc,
int rommNumberSrc, int buildingIdDst, int rommNumberDst, int lineType, const osg::Vec4& color, int rommNumberSrc, int buildingIdDst, int rommNumberDst, int lineType, const osg::Vec4& color,
unsigned int duration_s, unsigned int durationMax_s, double simTimeCreated) unsigned int duration_s, unsigned int durationMax_s, double simTimeCreated)
: mId(id), mShooterPos(shooterPos), mTargetPos(targetPos), mBuildingIdSrc(buildingIdSrc), : m_logger(BuildingViewer::getLogger("Shot")), mId(id), mShooterPos(shooterPos),
mTargetPos(targetPos), mBuildingIdSrc(buildingIdSrc),
mRoomNumberSrc(rommNumberSrc), mBuildingIdDst(buildingIdDst), mRoomNumberDst(rommNumberDst), mRoomNumberSrc(rommNumberSrc), mBuildingIdDst(buildingIdDst), mRoomNumberDst(rommNumberDst),
mLineType(lineType), mColor(color), mDuration_s(duration_s), m_DurationMax_s(durationMax_s), mLineType(lineType), mColor(color), mDuration_s(duration_s), m_DurationMax_s(durationMax_s),
mSimTimeCreated(simTimeCreated) mSimTimeCreated(simTimeCreated)
@@ -180,6 +180,7 @@ CtrlImpl::CtrlImpl(dtEntity::EntityManager &em, QWidget *parentWidget)
, mPaused(false) , mPaused(false)
, mNonRealtimeMode(false) , mNonRealtimeMode(false)
, mFrameRate(30) , mFrameRate(30)
, m_logger(BuildingViewer::getLogger("CtrlImpl"))
{ {
if (!mEntityManager->GetES(mMapSystem) || if (!mEntityManager->GetES(mMapSystem) ||
!mEntityManager->GetES(mPlayerSystem)) !mEntityManager->GetES(mPlayerSystem))
@@ -3,7 +3,7 @@
#include <QtWidgets/QApplication> #include <QtWidgets/QApplication>
#include <QtWidgets/QVBoxLayout> #include <QtWidgets/QVBoxLayout>
#include <QtCore/QEvent> #include <QtCore/QEvent>
#include <QGLWidget> #include <QtOpenGLWidgets/QOpenGLWidget>
#include <QWindow> #include <QWindow>
#include <dtEntity/log.h> #include <dtEntity/log.h>
@@ -176,7 +176,7 @@ void ViewWidget::viewModeChanged()
bool ViewWidget::isOpenGlWindowExposed() const bool ViewWidget::isOpenGlWindowExposed() const
{ {
QGLWidget *gl = qobject_cast<QGLWidget*>(m_pView); QOpenGLWidget *gl = qobject_cast<QOpenGLWidget*>(m_pView);
if (!gl || !gl->windowHandle()) if (!gl || !gl->windowHandle())
return false; return false;
return gl->windowHandle()->isExposed(); return gl->windowHandle()->isExposed();
@@ -4,7 +4,6 @@
#include <osg/Material> #include <osg/Material>
#include <osg/BlendFunc> #include <osg/BlendFunc>
#include <osg/BlendColor> #include <osg/BlendColor>
#include <QStringRef>
#include <QtCore/QVector> #include <QtCore/QVector>
namespace VCtrl namespace VCtrl
@@ -87,10 +86,11 @@ void SplitVisitor::apply(osg::Group &node)
for (unsigned int i = 0; i < node.getNumDescriptions(); ++i) for (unsigned int i = 0; i < node.getNumDescriptions(); ++i)
{ {
QString descr = QString::fromStdString(node.getDescription(i)); QString descr = QString::fromStdString(node.getDescription(i));
const QVector<QStringRef> descprt = descr.splitRef(QLatin1Char(';')); // Qt6: QStringRef removed; split()/splitRef() both return QVector<QString>
for (const QStringRef &prt : descprt) const QVector<QString> descprt = descr.split(QLatin1Char(';'));
for (const QString &prt : descprt)
{ {
const QVector<QStringRef> items = prt.split(QLatin1Char('=')); const QVector<QString> items = prt.split(QLatin1Char('='));
if (items.size() == 2 && items[0] == QLatin1String("base_height")) if (items.size() == 2 && items[0] == QLatin1String("base_height"))
h = items[1].toFloat(); h = items[1].toFloat();
} }
@@ -113,6 +113,7 @@ if(QT6_GUI_AVAILABLE)
NGL_TARGET_LINK_LIBRARIES(BuildingViewerCommon NGL_TARGET_LINK_LIBRARIES(BuildingViewerCommon
PRIVATE PRIVATE
Qt6::OpenGL Qt6::OpenGL
Qt6::OpenGLWidgets
${OPENGL_LIBRARIES} ${OPENGL_LIBRARIES}
${BGVIEWER_DTENTITYOSG_LIBRARY} ${BGVIEWER_DTENTITYOSG_LIBRARY}
${BGVIEWER_DTENTITY_LIBRARY} ${BGVIEWER_DTENTITY_LIBRARY}
@@ -126,6 +127,7 @@ NGL_TARGET_INCLUDE_DIRECTORIES(BuildingViewerCommon
${CMAKE_CURRENT_SOURCE_DIR}/BgViewer/viewerCtrl ${CMAKE_CURRENT_SOURCE_DIR}/BgViewer/viewerCtrl
${CMAKE_CURRENT_SOURCE_DIR}/../share ${CMAKE_CURRENT_SOURCE_DIR}/../share
${OSG_INCLUDE_DIR} ${OSG_INCLUDE_DIR}
${BGVIEWER_INCLUDE_DIR}
) )
IF (NOT WIN32) IF (NOT WIN32)
@@ -3,6 +3,7 @@
#include "bdv_communication_interface_internal.h" #include "bdv_communication_interface_internal.h"
#include <ParticipantManagement/ppm_translation.h> #include <ParticipantManagement/ppm_translation.h>
#include <NGLLogger/NGLLoggerBootstrap.h>
#include <QtCore/QTimer> #include <QtCore/QTimer>
#include <cassert> #include <cassert>
#include <utility> #include <utility>
@@ -29,7 +30,8 @@ static inline std::string createRoomNumberString(int roomNumber)
} }
CommunicationInterfaceInternal::CommunicationInterfaceInternal(VCtrl::ViewerInterface* pviewerInterface) CommunicationInterfaceInternal::CommunicationInterfaceInternal(VCtrl::ViewerInterface* pviewerInterface)
: m_pviewerInterface(pviewerInterface) : m_pviewerInterface(pviewerInterface),
m_logger(NGL::NGLLoggerBootstrap::getNGLRootLogger().getNGLLogger("BuildingViewer.CommunicationInterfaceInternal"))
{ {
assert(m_pviewerInterface); assert(m_pviewerInterface);
} }
@@ -203,10 +205,10 @@ void CommunicationInterfaceInternal::setTeamConfiguration(const QMap<qint32, Par
for (const ParticipantManagement::Party& party : parties) for (const ParticipantManagement::Party& party : parties)
{ {
BdvParty bdvParty; BdvParty bdvParty;
bdvParty.id = party.id(); bdvParty.id = party.id;
bdvParty.name = ParticipantManagement::trPartyName(party.name()); bdvParty.name = ParticipantManagement::trPartyName(party.name);
const uint32_t argb = party.color(); const uint32_t argb = party.color;
bdvParty.color.w = (((argb >> 24) & 0xff) / 255.); bdvParty.color.w = (((argb >> 24) & 0xff) / 255.);
bdvParty.color.x = (((argb >> 16) & 0xff) / 255.); bdvParty.color.x = (((argb >> 16) & 0xff) / 255.);
bdvParty.color.y = (((argb >> 8) & 0xff) / 255.); bdvParty.color.y = (((argb >> 8) & 0xff) / 255.);
@@ -256,9 +258,9 @@ void CommunicationInterfaceInternal::systemSetMountingPoint(const Infrastructure
{ {
int buildingId = data.buildingId(); int buildingId = data.buildingId();
const QString& mountingPointName = filename; const QString& mountingPointName = filename;
double x = data.relPosition().offsetX(); double x = data.relPosition().offsetX;
double y = data.relPosition().offsetY(); double y = data.relPosition().offsetY;
double z = data.relPosition().offsetZ(); double z = data.relPosition().offsetZ;
const std::string buildingIdStr = createBuildingIdString(buildingId); const std::string buildingIdStr = createBuildingIdString(buildingId);
@@ -446,7 +448,8 @@ static inline bool isPlayerId(const std::string& playerIdString, int* playerId)
const QString playerIdQString(QString::fromStdString(playerIdString)); const QString playerIdQString(QString::fromStdString(playerIdString));
bool bOk = false; bool bOk = false;
if (playerIdQString.startsWith(QLatin1String(PLAYER_PREFIX))) if (playerIdQString.startsWith(QLatin1String(PLAYER_PREFIX)))
*playerId = playerIdQString.midRef(QLatin1String(PLAYER_PREFIX).size()).toInt(&bOk); // Qt6: QString::midRef removed; mid() returns the same substring by value.
*playerId = playerIdQString.mid(QLatin1String(PLAYER_PREFIX).size()).toInt(&bOk);
return bOk; return bOk;
} }
@@ -10,6 +10,7 @@
#include <LtsAppManager/lts_app_manager.h> #include <LtsAppManager/lts_app_manager.h>
#include <LtsPluginManager/lts_plugin_manager.h> #include <LtsPluginManager/lts_plugin_manager.h>
#include <LtsSession/lts_session.h> #include <LtsSession/lts_session.h>
#include <NGLLogger/NGLLoggerBootstrap.h>
#include <QtCore/QDir> #include <QtCore/QDir>
#include <QtWidgets/QMessageBox> #include <QtWidgets/QMessageBox>
#include <ngltools/ngltools_filesystem.h> #include <ngltools/ngltools_filesystem.h>
@@ -22,7 +23,8 @@ static char* argv_dummy[] = {(char*)"Dummy"};
BgViewerController::BgViewerController(QObject* parent) BgViewerController::BgViewerController(QObject* parent)
: QObject(parent), m_mainloop(argc_dummy, argv_dummy, nullptr), m_widgetStolen(false), m_comIfc(nullptr), : QObject(parent), m_mainloop(argc_dummy, argv_dummy, nullptr), m_widgetStolen(false), m_comIfc(nullptr),
m_pBgViewerDDSController(nullptr), m_bgvApp(nullptr), m_tickTimer(new QTimer(this)) m_pBgViewerDDSController(nullptr), m_bgvApp(nullptr), m_tickTimer(new QTimer(this)),
m_logger(NGL::NGLLoggerBootstrap::getNGLRootLogger().getNGLLogger("BuildingViewer.BgViewerController"))
{ {
m_tickTimer->setInterval(1000 / 25); m_tickTimer->setInterval(1000 / 25);
connect(m_tickTimer, &QTimer::timeout, this, [this]() { m_mainloop.tick(); }); connect(m_tickTimer, &QTimer::timeout, this, [this]() { m_mainloop.tick(); });
@@ -322,11 +322,11 @@ void BuildingViewerDdsController::uninitialize()
QPointF BuildingViewerDdsController::toRelativePosition(const Core::GeoPosition& geoPos) const QPointF BuildingViewerDdsController::toRelativePosition(const Core::GeoPosition& geoPos) const
{ {
if (std::isnan(geoPos.lon()) || std::isnan(geoPos.lat()) || qIsNull(geoPos.lon()) || qIsNull(geoPos.lat())) if (std::isnan(geoPos.lon) || std::isnan(geoPos.lat) || qIsNull(geoPos.lon) || qIsNull(geoPos.lat))
return {}; return {};
LtsCoordTrans::UtmCoordinate coord( LtsCoordTrans::UtmCoordinate coord(
LtsCoordTrans::UtmCoordinate::fromGeographic(geoPos.lon(), geoPos.lat(), m_baseCoordinate.zone)); LtsCoordTrans::UtmCoordinate::fromGeographic(geoPos.lon, geoPos.lat, m_baseCoordinate.zone));
return coord.relativeTo(m_baseCoordinate); return coord.relativeTo(m_baseCoordinate);
} }
@@ -335,7 +335,7 @@ LtsUtils::QPoint3D BuildingViewerDdsController::toRelative3D(const Core::GeoPosi
const auto ret = toRelativePosition(geoPos); const auto ret = toRelativePosition(geoPos);
if (ret.isNull()) if (ret.isNull())
return {}; return {};
return LtsUtils::QPoint3D(ret.x(), ret.y(), geoPos.z()); return LtsUtils::QPoint3D(ret.x(), ret.y(), geoPos.z);
} }
bool BuildingViewerDdsController::clear() bool BuildingViewerDdsController::clear()
@@ -371,12 +371,12 @@ bool BuildingViewerDdsController::calcBaseCoordinate(
if (!bAtLeasOneFound) if (!bAtLeasOneFound)
{ {
bAtLeasOneFound = true; bAtLeasOneFound = true;
geoPosition = mse.geoPosition(); geoPosition = mse.geoPosition;
} }
else else
{ {
geoPosition.lat() = std::min(geoPosition.lat(), mse.geoPosition().lat()); geoPosition.lat = std::min(geoPosition.lat, mse.geoPosition.lat);
geoPosition.lon() = std::min(geoPosition.lon(), mse.geoPosition().lon()); geoPosition.lon = std::min(geoPosition.lon, mse.geoPosition.lon);
} }
} }
if (!bAtLeasOneFound) if (!bAtLeasOneFound)
@@ -384,7 +384,7 @@ bool BuildingViewerDdsController::calcBaseCoordinate(
WARNING_LOG(m_logger) << "No building available in exercise " << m_exerciseId; WARNING_LOG(m_logger) << "No building available in exercise " << m_exerciseId;
return false; return false;
} }
m_baseCoordinate = LtsCoordTrans::UtmCoordinate::fromGeographic(geoPosition.lon(), geoPosition.lat()); m_baseCoordinate = LtsCoordTrans::UtmCoordinate::fromGeographic(geoPosition.lon, geoPosition.lat);
return true; return true;
} }
@@ -422,11 +422,11 @@ bool BuildingViewerDdsController::writeBuildingDataToXML(const QString& modelPat
const auto bi = BuildingInfo::fromJson(ele.toObject()); const auto bi = BuildingInfo::fromJson(ele.toObject());
if (!bi.isValid()) if (!bi.isValid())
continue; continue;
mse.id(bi.id); mse.id = bi.id;
mse.angle(bi.angleDegree); mse.angle = bi.angleDegree;
mse.geoPosition(Core::GeoPosition(bi.position.x(), bi.position.y(), bi.position.z())); mse.geoPosition = Core::GeoPosition(bi.position.x(), bi.position.y(), bi.position.z());
mse.name(bi.name.toStdString()); mse.name = bi.name.toStdString();
mseMap.insert(mse.id(), mse); mseMap.insert(mse.id, mse);
} }
} }
else else
@@ -435,17 +435,17 @@ bool BuildingViewerDdsController::writeBuildingDataToXML(const QString& modelPat
const auto mMap = m_ismDtc->mainStructureElements(); const auto mMap = m_ismDtc->mainStructureElements();
for (const auto& mse : mMap) for (const auto& mse : mMap)
{ {
if (mse.modelId() == 0) if (mse.modelId == 0)
continue; continue;
if (!m_ismDtc->isElementAssignedToExercise(mse, m_exerciseId)) if (!m_ismDtc->isElementAssignedToExercise(mse, m_exerciseId))
{ {
DEBUG_LOG(m_logger) DEBUG_LOG(m_logger)
<< "Not writing mse with id " << mse.id() << "Not writing mse with id " << mse.id
<< " to building xml file since it is not assigned to the current exercise which has id " << " to building xml file since it is not assigned to the current exercise which has id "
<< m_exerciseId; << m_exerciseId;
continue; continue;
} }
mseMap.insert(mse.id(), mse); mseMap.insert(mse.id, mse);
} }
} }
INFO_LOG(m_logger) << getSessionInfo() INFO_LOG(m_logger) << getSessionInfo()
@@ -460,7 +460,7 @@ bool BuildingViewerDdsController::writeBuildingDataToXML(const QString& modelPat
QXmlStreamWriter sw(&f); QXmlStreamWriter sw(&f);
sw.setAutoFormatting(true); sw.setAutoFormatting(true);
sw.setAutoFormattingIndent(2); sw.setAutoFormattingIndent(2);
sw.setCodec("UTF-8"); // Qt6: QXmlStreamWriter::setCodec removed; it writes UTF-8 by default.
sw.writeStartDocument(QStringLiteral("1.0"), true); sw.writeStartDocument(QStringLiteral("1.0"), true);
sw.writeStartElement(QStringLiteral("MetaData")); sw.writeStartElement(QStringLiteral("MetaData"));
{ {
@@ -478,28 +478,28 @@ bool BuildingViewerDdsController::writeBuildingDataToXML(const QString& modelPat
for (const InfrastructureManagement::MainStructureElement& mse : std::as_const(mseMap)) for (const InfrastructureManagement::MainStructureElement& mse : std::as_const(mseMap))
{ {
m_knownBuildings += mse.id(); m_knownBuildings += mse.id;
sw.writeStartElement(QStringLiteral("Model")); sw.writeStartElement(QStringLiteral("Model"));
sw.writeAttribute(QStringLiteral("Type"), QStringLiteral("House")); sw.writeAttribute(QStringLiteral("Type"), QStringLiteral("House"));
{ {
const QString name(QString::fromStdString(mse.name())); const QString name(QString::fromStdString(mse.name));
sw.writeStartElement(QStringLiteral("Description")); sw.writeStartElement(QStringLiteral("Description"));
sw.writeAttribute(QStringLiteral("Name"), name); sw.writeAttribute(QStringLiteral("Name"), name);
sw.writeEndElement(); sw.writeEndElement();
sw.writeStartElement(QStringLiteral("Feature")); sw.writeStartElement(QStringLiteral("Feature"));
sw.writeAttribute(QStringLiteral("Id"), BuildingViewer::databaseId2FeatureId(mse.id())); sw.writeAttribute(QStringLiteral("Id"), BuildingViewer::databaseId2FeatureId(mse.id));
sw.writeEndElement(); sw.writeEndElement();
sw.writeStartElement(QStringLiteral("Orientation")); sw.writeStartElement(QStringLiteral("Orientation"));
sw.writeAttribute(QStringLiteral("Angle"), QString::number(360 - mse.angle())); sw.writeAttribute(QStringLiteral("Angle"), QString::number(360 - mse.angle));
sw.writeEndElement(); sw.writeEndElement();
const QPointF offset(toRelativePosition(mse.geoPosition())); const QPointF offset(toRelativePosition(mse.geoPosition));
sw.writeStartElement(QStringLiteral("Position")); sw.writeStartElement(QStringLiteral("Position"));
sw.writeAttribute(QStringLiteral("X"), QString::number(offset.x(), 'f', 13)); sw.writeAttribute(QStringLiteral("X"), QString::number(offset.x(), 'f', 13));
sw.writeAttribute(QStringLiteral("Y"), QString::number(offset.y(), 'f', 13)); sw.writeAttribute(QStringLiteral("Y"), QString::number(offset.y(), 'f', 13));
sw.writeAttribute(QStringLiteral("Z"), QString::number(mse.geoPosition().z(), 'f', 13)); sw.writeAttribute(QStringLiteral("Z"), QString::number(mse.geoPosition.z, 'f', 13));
sw.writeEndElement(); sw.writeEndElement();
sw.writeStartElement(QStringLiteral("File")); sw.writeStartElement(QStringLiteral("File"));
sw.writeAttribute(QStringLiteral("Name"), name + QStringLiteral(".flt")); sw.writeAttribute(QStringLiteral("Name"), name + QStringLiteral(".flt"));
@@ -552,7 +552,7 @@ void BuildingViewerDdsController::onReplayChanged(const SituationReplay::SitRepl
{ {
Q_UNUSED(modType) Q_UNUSED(modType)
switch (srp.state()) switch (srp.state)
{ {
case SituationReplay::SrpState::Stopped: case SituationReplay::SrpState::Stopped:
m_connection->setSimuationPace(1.0); m_connection->setSimuationPace(1.0);
@@ -560,7 +560,7 @@ void BuildingViewerDdsController::onReplayChanged(const SituationReplay::SitRepl
break; break;
case SituationReplay::SrpState::Started: case SituationReplay::SrpState::Started:
case SituationReplay::SrpState::Resumed: case SituationReplay::SrpState::Resumed:
m_connection->setSimuationPace(srp.pace()); m_connection->setSimuationPace(srp.pace);
break; break;
case SituationReplay::SrpState::Paused: case SituationReplay::SrpState::Paused:
@@ -629,7 +629,7 @@ void BuildingViewerDdsController::handleMountingPoint(const InfrastructureManage
return; return;
} }
QVector3D position(mp.relPosition().offsetX(), mp.relPosition().offsetY(), mp.relPosition().offsetZ()); QVector3D position(mp.relPosition().offsetX, mp.relPosition().offsetY, mp.relPosition().offsetZ);
QString strfeatureID = BuildingViewer::databaseId2FeatureId(mp.buildingId()); QString strfeatureID = BuildingViewer::databaseId2FeatureId(mp.buildingId());
QString strMountingPointID = strfeatureID + QStringLiteral("_MountingPoint_") + QString::number(mountingPointId); QString strMountingPointID = strfeatureID + QStringLiteral("_MountingPoint_") + QString::number(mountingPointId);
@@ -712,7 +712,7 @@ void BuildingViewerDdsController::setCurrentTrainingAreaMap(const QString& model
bool BuildingViewerDdsController::isValidParticipant(const ParticipantManagement::Participant& participant) const bool BuildingViewerDdsController::isValidParticipant(const ParticipantManagement::Participant& participant) const
{ {
if (participant.id() == 0) if (participant.id == 0)
{ {
if (m_logger.isDebugEnabled()) if (m_logger.isDebugEnabled())
DEBUG_LOG(m_logger) << getSessionInfo() DEBUG_LOG(m_logger) << getSessionInfo()
@@ -720,32 +720,32 @@ bool BuildingViewerDdsController::isValidParticipant(const ParticipantManagement
return false; return false;
} }
if (participant.isDeleted()) if (participant.isDeleted)
{ {
DEBUG_LOG(m_logger) << getSessionInfo() << "isValidParticipant: Not handling participant with id " DEBUG_LOG(m_logger) << getSessionInfo() << "isValidParticipant: Not handling participant with id "
<< participant.id() << " since it is marked as 'deleted'"; << participant.id << " since it is marked as 'deleted'";
return false; return false;
} }
if (m_session == nullptr) if (m_session == nullptr)
return false; return false;
if (!m_session->isVisibleParty(participant.partyId())) if (!m_session->isVisibleParty(participant.partyId))
{ {
DEBUG_LOG(m_logger) << getSessionInfo() << "isValidParticipant: Not handling participant with id " DEBUG_LOG(m_logger) << getSessionInfo() << "isValidParticipant: Not handling participant with id "
<< participant.id() << " since it is not visible for party with id " << participant.id << " since it is not visible for party with id "
<< participant.partyId(); << participant.partyId;
return false; return false;
} }
if (!m_ppmDtc) if (!m_ppmDtc)
return false; return false;
ParticipantManagement::TypeClass tc = m_ppmDtc->type(participant.typeId()).typeClass(); ParticipantManagement::TypeClass tc = m_ppmDtc->type(participant.typeId).typeClass;
if (tc == ParticipantManagement::TypeClass::SupportUnit || tc == ParticipantManagement::TypeClass::Unit) if (tc == ParticipantManagement::TypeClass::SupportUnit || tc == ParticipantManagement::TypeClass::Unit)
{ {
DEBUG_LOG(m_logger) << getSessionInfo() << "isValidParticipant: Not handling participant with id " DEBUG_LOG(m_logger) << getSessionInfo() << "isValidParticipant: Not handling participant with id "
<< participant.id() << " since its type is 'SupportUnit', 'Unit' or 'Structure'"; << participant.id << " since its type is 'SupportUnit', 'Unit' or 'Structure'";
return false; return false;
} }
@@ -787,7 +787,7 @@ void BuildingViewerDdsController::createParticipants()
auto cb = [this, &positionMap, sizeL](const ParticipantManagement::Participant& part) { auto cb = [this, &positionMap, sizeL](const ParticipantManagement::Participant& part) {
if (!isValidParticipant(part)) if (!isValidParticipant(part))
return; return;
createParticipant(part, positionMap.value(part.id()), sizeL); createParticipant(part, positionMap.value(part.id), sizeL);
}; };
m_ppmDtc->participants(cb); m_ppmDtc->participants(cb);
@@ -826,7 +826,7 @@ void BuildingViewerDdsController::onBoobyTrapChanged(const AreaEffectSimulation:
switch (modType) switch (modType)
{ {
case DataModification::eModified: case DataModification::eModified:
deleteParticipant(990000 + boobyTrap.id()); deleteParticipant(990000 + boobyTrap.id);
Q_FALLTHROUGH(); Q_FALLTHROUGH();
case DataModification::eAdded: { case DataModification::eAdded: {
int sizeL = LtsUtils::OperatorSettings::getInstance() int sizeL = LtsUtils::OperatorSettings::getInstance()
@@ -836,7 +836,7 @@ void BuildingViewerDdsController::onBoobyTrapChanged(const AreaEffectSimulation:
break; break;
} }
case DataModification::eRemoved: { case DataModification::eRemoved: {
deleteParticipant(990000 + boobyTrap.id()); deleteParticipant(990000 + boobyTrap.id);
break; break;
} }
} }
@@ -851,17 +851,17 @@ void BuildingViewerDdsController::onParticipantChanged(const ParticipantManageme
switch (modType) switch (modType)
{ {
case DataModification::eModified: case DataModification::eModified:
deleteParticipant(participant.id()); deleteParticipant(participant.id);
Q_FALLTHROUGH(); Q_FALLTHROUGH();
case DataModification::eAdded: { case DataModification::eAdded: {
int sizeL = LtsUtils::OperatorSettings::getInstance() int sizeL = LtsUtils::OperatorSettings::getInstance()
->value(QStringLiteral("BgViewer"), QStringLiteral("PlayerSymbolSize"), 20) ->value(QStringLiteral("BgViewer"), QStringLiteral("PlayerSymbolSize"), 20)
.toInt(); .toInt();
createParticipant(participant, m_ppmDtc->participantPosition(participant.id()), sizeL); createParticipant(participant, m_ppmDtc->participantPosition(participant.id), sizeL);
break; break;
} }
case DataModification::eRemoved: { case DataModification::eRemoved: {
deleteParticipant(participant.id()); deleteParticipant(participant.id);
break; break;
} }
} }
@@ -878,8 +878,8 @@ void BuildingViewerDdsController::onDynParticipantChanged(const ParticipantManag
case DataModification::eAdded: case DataModification::eAdded:
case DataModification::eModified: case DataModification::eModified:
if (m_ppmDtc) if (m_ppmDtc)
createParticipant(m_ppmDtc->participant(data.participantId()), createParticipant(m_ppmDtc->participant(data.participantId),
m_ppmDtc->participantPosition(data.participantId()), sizeL); m_ppmDtc->participantPosition(data.participantId), sizeL);
break; break;
case DataModification::eRemoved: { case DataModification::eRemoved: {
break; break;
@@ -890,12 +890,12 @@ void BuildingViewerDdsController::onDynParticipantChanged(const ParticipantManag
void BuildingViewerDdsController::onHitLineInfoChanged(const ParticipantManagement::HitLineInfo& hli, void BuildingViewerDdsController::onHitLineInfoChanged(const ParticipantManagement::HitLineInfo& hli,
DataModification modType) DataModification modType)
{ {
DEBUG_LOG(m_logger) << "X 0000 onHitLineInfoChanged id=" << hli.id(); DEBUG_LOG(m_logger) << "X 0000 onHitLineInfoChanged id=" << hli.id;
if (modType == DataModification::eRemoved) if (modType == DataModification::eRemoved)
{ {
DEBUG_LOG(m_logger) << "onHitLineInfoChanged removeHit id=" << hli.id(); DEBUG_LOG(m_logger) << "onHitLineInfoChanged removeHit id=" << hli.id;
m_connection->removeRoomHit(hli.id()); m_connection->removeRoomHit(hli.id);
return; return;
} }
@@ -903,24 +903,24 @@ void BuildingViewerDdsController::onHitLineInfoChanged(const ParticipantManageme
return; return;
m_ppmDtc->waitForHistoricalDataParticipant(); m_ppmDtc->waitForHistoricalDataParticipant();
const ParticipantManagement::Participant& partSrc = m_ppmDtc->participant(hli.originatorParticipantId()); const ParticipantManagement::Participant& partSrc = m_ppmDtc->participant(hli.originatorParticipantId);
const ParticipantManagement::Participant& partDst = m_ppmDtc->participant(hli.injuryParticipantId()); const ParticipantManagement::Participant& partDst = m_ppmDtc->participant(hli.injuryParticipantId);
if (partSrc.id() == 0 || partDst.id() == 0) if (partSrc.id == 0 || partDst.id == 0)
{ {
ERROR_LOG(m_logger) << "no knownn part: " << partSrc.id() << " dst: " << partDst.id(); ERROR_LOG(m_logger) << "no knownn part: " << partSrc.id << " dst: " << partDst.id;
return; return;
} }
const QString& strFeatureID = BuildingViewer::databaseId2FeatureId(hli.injuryBuildingId()); const QString& strFeatureID = BuildingViewer::databaseId2FeatureId(hli.injuryBuildingId);
if (!m_viewerInterface->isViewOpen(strFeatureID.toStdString())) if (!m_viewerInterface->isViewOpen(strFeatureID.toStdString()))
{ {
DEBUG_LOG(m_logger) << "building not opened: hli.buildingId()=" << hli; DEBUG_LOG(m_logger) << "building not opened: hli.buildingId()=" << hli;
return; return;
} }
if (hli.injuryBuildingId() != 0) if (hli.injuryBuildingId != 0)
{ {
auto itBuildingHit = m_buildingHits.constFind(hli.injuryBuildingId()); auto itBuildingHit = m_buildingHits.constFind(hli.injuryBuildingId);
if (itBuildingHit != m_buildingHits.constEnd()) if (itBuildingHit != m_buildingHits.constEnd())
{ {
const QVector<BuildingHit>& bHits = itBuildingHit.value(); const QVector<BuildingHit>& bHits = itBuildingHit.value();
@@ -929,14 +929,14 @@ void BuildingViewerDdsController::onHitLineInfoChanged(const ParticipantManageme
for (const BuildingHit& bh : bHits) for (const BuildingHit& bh : bHits)
{ {
const bool testFlag = (bh.chargeTypeId == hli.chargeTypeId() && const bool testFlag = (bh.chargeTypeId == hli.chargeTypeId &&
bh.originatorParticipantId == hli.originatorParticipantId() && bh.originatorParticipantId == hli.originatorParticipantId &&
hli.sampleTime() - m_hitlineDuration_ms < bh.sampleTime); hli.sampleTime - m_hitlineDuration_ms < bh.sampleTime);
DEBUG_LOG(m_logger) << "testFlag " << testFlag; DEBUG_LOG(m_logger) << "testFlag " << testFlag;
if (bh.chargeTypeId == hli.chargeTypeId() && if (bh.chargeTypeId == hli.chargeTypeId &&
bh.originatorParticipantId == hli.originatorParticipantId() && bh.originatorParticipantId == hli.originatorParticipantId &&
hli.sampleTime() - m_hitlineDuration_ms < bh.sampleTime) hli.sampleTime - m_hitlineDuration_ms < bh.sampleTime)
return; return;
} }
} }
@@ -950,32 +950,32 @@ void BuildingViewerDdsController::onHitLineInfoChanged(const ParticipantManageme
DEBUG_LOG(m_logger) << "onHitLineInfoChanged createPlayerSymbols"; DEBUG_LOG(m_logger) << "onHitLineInfoChanged createPlayerSymbols";
createPlayerSymbols(partDst, sizeL); createPlayerSymbols(partDst, sizeL);
LtsUtils::QPoint3D originatorSrc = toRelative3D(hli.originatorPos()); LtsUtils::QPoint3D originatorSrc = toRelative3D(hli.originatorPos);
LtsUtils::QPoint3D injuryDest = toRelative3D(hli.injuryPos()); LtsUtils::QPoint3D injuryDest = toRelative3D(hli.injuryPos);
DEBUG_LOG(m_logger) << "onHitLineInfoChanged playerHit" DEBUG_LOG(m_logger) << "onHitLineInfoChanged playerHit"
<< " hli.originatorPos() z=" << hli.originatorPos().z() << " hli.originatorPos() z=" << hli.originatorPos.z
<< " hli.injuryPos() z=" << hli.injuryPos().z() << " Src=" << originatorSrc.x() << "/" << " hli.injuryPos() z=" << hli.injuryPos.z << " Src=" << originatorSrc.x() << "/"
<< originatorSrc.y() << "/" << originatorSrc.z() << " Dest= " << injuryDest.x() << "/" << originatorSrc.y() << "/" << originatorSrc.z() << " Dest= " << injuryDest.x() << "/"
<< injuryDest.y() << "/" << injuryDest.z() << injuryDest.y() << "/" << injuryDest.z()
<< " hli.originatorBuildingId=" << hli.originatorBuildingId() << " hli.originatorBuildingId=" << hli.originatorBuildingId
<< " hli.originatorRoomId=" << hli.originatorRoomId() << " hli.originatorRoomId=" << hli.originatorRoomId
<< " hli.injuryBuildingId=" << hli.injuryBuildingId() << " hli.injuryBuildingId=" << hli.injuryBuildingId
<< " hli.injuryRoomId=" << hli.injuryRoomId(); << " hli.injuryRoomId=" << hli.injuryRoomId;
DEBUG_LOG(m_logger) << "Before z-correction:" DEBUG_LOG(m_logger) << "Before z-correction:"
<< " Src=" << originatorSrc.x() << "/" << originatorSrc.y() << "/" << originatorSrc.z() << " Src=" << originatorSrc.x() << "/" << originatorSrc.y() << "/" << originatorSrc.z()
<< " Dest= " << injuryDest.x() << "/" << injuryDest.y() << "/" << injuryDest.z(); << " Dest= " << injuryDest.x() << "/" << injuryDest.y() << "/" << injuryDest.z();
double zAddOriginator = m_buildingHeight.value(hli.originatorBuildingId(), 0); double zAddOriginator = m_buildingHeight.value(hli.originatorBuildingId, 0);
double zAddInjury = m_buildingHeight.value(hli.injuryBuildingId(), 0); double zAddInjury = m_buildingHeight.value(hli.injuryBuildingId, 0);
DEBUG_LOG(m_logger) << "z-correction: zAddOriginator=" << zAddOriginator; DEBUG_LOG(m_logger) << "z-correction: zAddOriginator=" << zAddOriginator;
DEBUG_LOG(m_logger) << "z-correction: zAddInjury=" << zAddInjury; DEBUG_LOG(m_logger) << "z-correction: zAddInjury=" << zAddInjury;
if (hli.originatorBuildingId() <= 0) if (hli.originatorBuildingId <= 0)
zAddOriginator = zAddInjury; zAddOriginator = zAddInjury;
if (hli.injuryBuildingId() <= 0) if (hli.injuryBuildingId <= 0)
zAddInjury = zAddOriginator; zAddInjury = zAddOriginator;
originatorSrc.setZ(originatorSrc.z() + zAddInjury); originatorSrc.setZ(originatorSrc.z() + zAddInjury);
@@ -988,54 +988,55 @@ void BuildingViewerDdsController::onHitLineInfoChanged(const ParticipantManageme
int buildingIdSrc = -1; int buildingIdSrc = -1;
int roomNumberSrc = -1; int roomNumberSrc = -1;
{ {
auto itId2Number = m_roomId2RoomNumber.constFind(hli.originatorBuildingId()); auto itId2Number = m_roomId2RoomNumber.constFind(hli.originatorBuildingId);
if (itId2Number != m_roomId2RoomNumber.constEnd()) if (itId2Number != m_roomId2RoomNumber.constEnd())
{ {
const auto& mapRooms = itId2Number.value(); const auto& mapRooms = itId2Number.value();
const auto itRoom = mapRooms.constFind(hli.originatorRoomId()); const auto itRoom = mapRooms.constFind(hli.originatorRoomId);
if (itRoom != mapRooms.constEnd()) if (itRoom != mapRooms.constEnd())
{ {
buildingIdSrc = hli.originatorBuildingId(); buildingIdSrc = hli.originatorBuildingId;
roomNumberSrc = itRoom.value(); roomNumberSrc = itRoom.value();
} }
else else
WARNING_LOG(m_logger) << "onHitLineInfoChanged: Room id can not be mapped! Building id: " WARNING_LOG(m_logger) << "onHitLineInfoChanged: Room id can not be mapped! Building id: "
<< hli.injuryBuildingId() << ", originatorRoomId: " << hli.originatorRoomId(); << hli.injuryBuildingId << ", originatorRoomId: " << hli.originatorRoomId;
} }
} }
int buildingIdDst = -1; int buildingIdDst = -1;
int roomNumberDst = -1; int roomNumberDst = -1;
{ {
auto itId2Number = m_roomId2RoomNumber.constFind(hli.injuryBuildingId()); auto itId2Number = m_roomId2RoomNumber.constFind(hli.injuryBuildingId);
if (itId2Number != m_roomId2RoomNumber.constEnd()) if (itId2Number != m_roomId2RoomNumber.constEnd())
{ {
const auto& mapRooms = itId2Number.value(); const auto& mapRooms = itId2Number.value();
const auto itRoom = mapRooms.constFind(hli.injuryRoomId()); const auto itRoom = mapRooms.constFind(hli.injuryRoomId);
if (itRoom != mapRooms.constEnd()) if (itRoom != mapRooms.constEnd())
{ {
buildingIdDst = hli.injuryBuildingId(); buildingIdDst = hli.injuryBuildingId;
roomNumberDst = itRoom.value(); roomNumberDst = itRoom.value();
} }
else else
WARNING_LOG(m_logger) << "onHitLineInfoChanged: Room id can not be mapped! Building id: " WARNING_LOG(m_logger) << "onHitLineInfoChanged: Room id can not be mapped! Building id: "
<< hli.injuryBuildingId() << ", room id: " << hli.injuryRoomId(); << hli.injuryBuildingId << ", room id: " << hli.injuryRoomId;
} }
} }
DEBUG_LOG(m_logger) << "After translate buildingId, roomId:" DEBUG_LOG(m_logger) << "After translate buildingId, roomId:"
<< " hli.originatorBuildingId=" << hli.originatorBuildingId() << " -> " << buildingIdSrc << " hli.originatorBuildingId=" << hli.originatorBuildingId << " -> " << buildingIdSrc
<< " hli.originatorRoomId=" << hli.originatorRoomId() << " -> " << roomNumberSrc << " hli.originatorRoomId=" << hli.originatorRoomId << " -> " << roomNumberSrc
<< " hli.injuryBuildingId=" << hli.injuryBuildingId() << " -> " << buildingIdDst << " hli.injuryBuildingId=" << hli.injuryBuildingId << " -> " << buildingIdDst
<< " hli.injuryRoomId=" << hli.injuryBuildingId() << " -> " << roomNumberDst << " hli.injuryRoomId=" << hli.injuryBuildingId << " -> " << roomNumberDst
<< " hli.sampleTime=" << hli.sampleTime(); << " hli.sampleTime=" << hli.sampleTime;
int lineType = 2; int lineType = 2;
m_pdmDtc->chargeType(hli.chargeTypeId()); m_pdmDtc->chargeType(hli.chargeTypeId);
lineType = m_pdmDtc->getChargeTypeSpecialProperty(hli.chargeTypeId(), 0, 0); // DDS enums are enum class; lineType is int.
lineType = static_cast<int>(m_pdmDtc->getChargeTypeSpecialProperty(hli.chargeTypeId, 0, 0));
m_connection->playerHit(hli.id(), partSrc.id(), partDst.id(), originatorSrc, injuryDest, buildingIdSrc, m_connection->playerHit(hli.id, partSrc.id, partDst.id, originatorSrc, injuryDest, buildingIdSrc,
roomNumberSrc, buildingIdDst, roomNumberDst, lineType, hli.sampleTime()); roomNumberSrc, buildingIdDst, roomNumberDst, lineType, hli.sampleTime);
} }
void BuildingViewerDdsController::onPartyChanged(const ParticipantManagement::Party& party, DataModification modType) void BuildingViewerDdsController::onPartyChanged(const ParticipantManagement::Party& party, DataModification modType)
@@ -1046,7 +1047,7 @@ void BuildingViewerDdsController::onPartyChanged(const ParticipantManagement::Pa
int sizeL = LtsUtils::OperatorSettings::getInstance() int sizeL = LtsUtils::OperatorSettings::getInstance()
->value(QStringLiteral("BgViewer"), QStringLiteral("PlayerSymbolSize"), 20) ->value(QStringLiteral("BgViewer"), QStringLiteral("PlayerSymbolSize"), 20)
.toInt(); .toInt();
updatePlayerSymbols(sizeL, party.id()); updatePlayerSymbols(sizeL, party.id);
syncTeams(); syncTeams();
} }
@@ -1063,35 +1064,35 @@ void BuildingViewerDdsController::onPositionChanged(const ParticipantManagement:
int buildingID = -1; int buildingID = -1;
int roomNumber = -1; int roomNumber = -1;
auto itId2Number = m_roomId2RoomNumber.constFind(position.buildingId()); auto itId2Number = m_roomId2RoomNumber.constFind(position.buildingId);
if (itId2Number != m_roomId2RoomNumber.constEnd()) if (itId2Number != m_roomId2RoomNumber.constEnd())
{ {
const auto& mapRooms = itId2Number.value(); const auto& mapRooms = itId2Number.value();
const auto itRoom = mapRooms.constFind(position.roomId()); const auto itRoom = mapRooms.constFind(position.roomId);
if (itRoom != mapRooms.constEnd()) if (itRoom != mapRooms.constEnd())
{ {
buildingID = position.buildingId(); buildingID = position.buildingId;
roomNumber = itRoom.value(); roomNumber = itRoom.value();
} }
else else
{ {
WARNING_LOG(m_logger) << "onPositionChanged: Room id can not be mapped! Building id: " WARNING_LOG(m_logger) << "onPositionChanged: Room id can not be mapped! Building id: "
<< position.buildingId() << ", room id: " << position.roomId(); << position.buildingId << ", room id: " << position.roomId;
} }
} }
if ((roomNumber < 0) && (buildingID <= 0) && (position.buildingId() > 0) && if ((roomNumber < 0) && (buildingID <= 0) && (position.buildingId > 0) &&
(position.reportingSource() == Core::PositionReportingSource::Ops || (position.reportingSource == Core::PositionReportingSource::Ops ||
position.reportingSource() == Core::PositionReportingSource::Wls)) position.reportingSource == Core::PositionReportingSource::Wls))
{ {
buildingID = position.buildingId(); buildingID = position.buildingId;
} }
const int playerId = position.participantId(); const int playerId = position.participantId;
auto it = m_lastPositionTime.find(playerId); auto it = m_lastPositionTime.find(playerId);
if (it == m_lastPositionTime.end()) if (it == m_lastPositionTime.end())
{ {
m_lastPositionTime.insert(playerId, position.sampleTime()); m_lastPositionTime.insert(playerId, position.sampleTime);
if (isOutdatedPosition(position)) if (isOutdatedPosition(position))
m_connection->setPlayerVisible(playerId, false); m_connection->setPlayerVisible(playerId, false);
} }
@@ -1099,7 +1100,7 @@ void BuildingViewerDdsController::onPositionChanged(const ParticipantManagement:
{ {
if (isOutdatedPosition(it.value()) && !isOutdatedPosition(position)) if (isOutdatedPosition(it.value()) && !isOutdatedPosition(position))
m_connection->setPlayerVisible(playerId, true); m_connection->setPlayerVisible(playerId, true);
it.value() = position.sampleTime(); it.value() = position.sampleTime;
} }
if (buildingID <= 0 && roomNumber <= 0) if (buildingID <= 0 && roomNumber <= 0)
@@ -1118,8 +1119,8 @@ void BuildingViewerDdsController::onPositionChanged(const ParticipantManagement:
return; return;
} }
m_connection->playerPlace(position.participantId(), toRelative3D(position.pos()), buildingID, roomNumber, m_connection->playerPlace(position.participantId, toRelative3D(position.pos), buildingID, roomNumber,
position.reportingSource()); position.reportingSource);
} }
void BuildingViewerDdsController::onParticipantGearEventChanged(const ParticipantManagement::ParticipantGearEvent& data, void BuildingViewerDdsController::onParticipantGearEventChanged(const ParticipantManagement::ParticipantGearEvent& data,
@@ -1129,12 +1130,12 @@ void BuildingViewerDdsController::onParticipantGearEventChanged(const Participan
{ {
case DataModification::eAdded: case DataModification::eAdded:
case DataModification::eModified: { case DataModification::eModified: {
m_participantGearEvents[data.participantId()] = data.sampleTime(); m_participantGearEvents[data.participantId] = data.sampleTime;
break; break;
} }
case DataModification::eRemoved: { case DataModification::eRemoved: {
const int playerId = data.participantId(); const int playerId = data.participantId;
m_participantGearEvents.remove(playerId); m_participantGearEvents.remove(playerId);
m_connection->playerUpdatePlayerSymbol(playerId, buildPlayerSymbolFilePath(playerId, cColorSymbolId)); m_connection->playerUpdatePlayerSymbol(playerId, buildPlayerSymbolFilePath(playerId, cColorSymbolId));
break; break;
@@ -1158,44 +1159,44 @@ void BuildingViewerDdsController::createParticipant(const ParticipantManagement:
createPlayerSymbols(participant, sizeL); createPlayerSymbols(participant, sizeL);
m_connection->playerCreate(participant.id(), participant.partyId(), buildPlayerSymbolFilePath(participant.id()), m_connection->playerCreate(participant.id, participant.partyId, buildPlayerSymbolFilePath(participant.id),
toRelative3D(position.pos()), position.buildingId(), toRelative3D(position.pos), position.buildingId,
m_roomId2RoomNumber.value(position.buildingId()).value(position.roomId()), m_roomId2RoomNumber.value(position.buildingId).value(position.roomId),
position.reportingSource()); position.reportingSource);
const bool isOutdated = isOutdatedPosition(position); const bool isOutdated = isOutdatedPosition(position);
const int participantId = participant.id(); const int participantId = participant.id;
const bool isValid = const bool isValid =
(position.buildingId() > 0 && m_roomId2RoomNumber.value(position.buildingId()).value(position.roomId()) > 0); (position.buildingId > 0 && m_roomId2RoomNumber.value(position.buildingId).value(position.roomId) > 0);
m_connection->setPlayerVisible(participantId, (!isOutdated && isValid)); m_connection->setPlayerVisible(participantId, (!isOutdated && isValid));
m_lastPositionTime.insert(participantId, position.sampleTime()); m_lastPositionTime.insert(participantId, position.sampleTime);
} }
void BuildingViewerDdsController::createBoobyTrap(const AreaEffectSimulation::BoobyTrap& trap, int sizeL) void BuildingViewerDdsController::createBoobyTrap(const AreaEffectSimulation::BoobyTrap& trap, int sizeL)
{ {
if (trap.effectStateId() != AreaEffectSimulation::AesEffectState::EsActivated && if (trap.effectStateId != AreaEffectSimulation::AesEffectState::EsActivated &&
trap.effectStateId() != AreaEffectSimulation::AesEffectState::EsPrepared) trap.effectStateId != AreaEffectSimulation::AesEffectState::EsPrepared)
return; return;
ParticipantManagement::Participant participant; ParticipantManagement::Participant participant;
if (trap.partyId().has_value()) if (trap.partyId.has_value())
participant.partyId() = trap.partyId().get(); participant.partyId = trap.partyId.get();
participant.designator() = trap.name(); participant.designator = trap.name;
participant.designator() = trap.name(); participant.designator = trap.name;
participant.id() = trap.id() + 990000; participant.id = trap.id + 990000;
participant.sampleTime() = trap.sampleTime(); participant.sampleTime = trap.sampleTime;
participant.symbol() = "AP6D|CMPL|10011500002104000000"; participant.symbol = "AP6D|CMPL|10011500002104000000";
createPlayerSymbols(participant, sizeL); createPlayerSymbols(participant, sizeL);
Core::GeoPosition pos; Core::GeoPosition pos;
pos.lat() = trap.impactPosition().lat(); pos.lat = trap.impactPosition.lat;
pos.lon() = trap.impactPosition().lon(); pos.lon = trap.impactPosition.lon;
DEBUG_LOG(m_logger) << "Try create Booby trap with id " << trap.id() << " internal id " << participant.id(); DEBUG_LOG(m_logger) << "Try create Booby trap with id " << trap.id << " internal id " << participant.id;
DEBUG_LOG(m_logger) << "Try create Booby trap with pos " << pos.lat() << " " << pos.lon(); DEBUG_LOG(m_logger) << "Try create Booby trap with pos " << pos.lat << " " << pos.lon;
m_connection->playerCreate(participant.id(), participant.partyId(), buildPlayerSymbolFilePath(participant.id()), m_connection->playerCreate(participant.id, participant.partyId, buildPlayerSymbolFilePath(participant.id),
toRelative3D(pos), -1, -1, Core::PositionReportingSource::External); toRelative3D(pos), -1, -1, Core::PositionReportingSource::External);
m_connection->setPlayerVisible(participant.id(), true); m_connection->setPlayerVisible(participant.id, true);
} }
void BuildingViewerDdsController::updatePlayerSymbols(const int sizeL, const int forParty) void BuildingViewerDdsController::updatePlayerSymbols(const int sizeL, const int forParty)
@@ -1207,7 +1208,7 @@ void BuildingViewerDdsController::updatePlayerSymbols(const int sizeL, const int
if (!isValidParticipant(participant)) if (!isValidParticipant(participant))
return; return;
if (forParty == -1 || participant.partyId() == forParty) if (forParty == -1 || participant.partyId == forParty)
createPlayerSymbols(participant, sizeL); createPlayerSymbols(participant, sizeL);
}; };
m_ppmDtc->participants(cb); m_ppmDtc->participants(cb);
@@ -1219,9 +1220,9 @@ void BuildingViewerDdsController::createPlayerSymbols(const ParticipantManagemen
SymbolInfo symbolinfo; SymbolInfo symbolinfo;
for (int i = 0; i < m_vecFlashColors.size(); ++i) for (int i = 0; i < m_vecFlashColors.size(); ++i)
{ {
Q_ASSERT(participant.id() != 0); Q_ASSERT(participant.id != 0);
symbolinfo.participantId = participant.id(); symbolinfo.participantId = participant.id;
symbolinfo.strPathToSymbolFile = buildPlayerSymbolFilePath(participant.id(), i); symbolinfo.strPathToSymbolFile = buildPlayerSymbolFilePath(participant.id, i);
symbolinfo.color = m_vecFlashColors.at(i); symbolinfo.color = m_vecFlashColors.at(i);
symbolinfo.useThisSymbolNow = !symbolinfo.color.isValid(); symbolinfo.useThisSymbolNow = !symbolinfo.color.isValid();
createSymbolResultWatcher(participant, symbolinfo, sizeL); createSymbolResultWatcher(participant, symbolinfo, sizeL);
@@ -1304,7 +1305,7 @@ void BuildingViewerDdsController::reCheckHitLine()
for (const auto& hli : hitMap) for (const auto& hli : hitMap)
{ {
if (hli.sampleTime() < (m_session->partitionTime() - 3000)) if (hli.sampleTime < (m_session->partitionTime() - 3000))
onBuildingHitLineInfoChanged(hli, DataModification::eAdded); onBuildingHitLineInfoChanged(hli, DataModification::eAdded);
} }
} }
@@ -1332,17 +1333,17 @@ void BuildingViewerDdsController::updateBuildingRoomNames(
const InfrastructureManagement::MainStructureElement& building) const InfrastructureManagement::MainStructureElement& building)
{ {
const std::vector<InfrastructureManagement::StructureElement>& vecElements = building.elements(); const std::vector<InfrastructureManagement::StructureElement>& vecElements = building.elements;
int32_t buildingDatabaseId = building.id(); int32_t buildingDatabaseId = building.id;
QString featureID = BuildingViewer::databaseId2FeatureId(buildingDatabaseId); QString featureID = BuildingViewer::databaseId2FeatureId(buildingDatabaseId);
for (const auto& se : vecElements) for (const auto& se : vecElements)
{ {
if (se.structureElementTypeId() == InfrastructureManagement::StructureElementType::Building) if (se.structureElementTypeId == InfrastructureManagement::StructureElementType::Building)
m_connection->excSetBuildingDisplayName(featureID, QString::fromStdString(se.displayName())); m_connection->excSetBuildingDisplayName(featureID, QString::fromStdString(se.displayName));
if (se.structureElementTypeId() == InfrastructureManagement::StructureElementType::Room) if (se.structureElementTypeId == InfrastructureManagement::StructureElementType::Room)
m_connection->excSetRoomDisplayName(featureID, QString::number(se.mountingPointId()), m_connection->excSetRoomDisplayName(featureID, QString::number(se.mountingPointId),
QString::fromStdString(se.displayName())); QString::fromStdString(se.displayName));
} }
} }
@@ -1429,25 +1430,25 @@ void BuildingViewerDdsController::onBuildingStateChanged(const Buildings::Buildi
return; return;
QMap<int, int> roomDestructions; QMap<int, int> roomDestructions;
for (const Buildings::RoomState& rs : data.roomStates()) for (const Buildings::RoomState& rs : data.roomStates)
{ {
roomDestructions.insert(rs.mountingPointId(), rs.damagePercent()); roomDestructions.insert(rs.mountingPointId, rs.damagePercent);
} }
m_connection->buildingHit(data.id(), data.id(), data.damagePercent(), roomDestructions); m_connection->buildingHit(data.id, data.id, data.damagePercent, roomDestructions);
} }
void BuildingViewerDdsController::onBuildingHitLineInfoChanged(const Buildings::BuildingHitLineInfo& hli, void BuildingViewerDdsController::onBuildingHitLineInfoChanged(const Buildings::BuildingHitLineInfo& hli,
DataModification modType) DataModification modType)
{ {
int topidId = static_cast<int>(hli.id()); int topidId = static_cast<int>(hli.id);
DEBUG_LOG(m_logger) << "onBuildingHitLineInfoChanged: " << hli; DEBUG_LOG(m_logger) << "onBuildingHitLineInfoChanged: " << hli;
const QString& strFeatureID = BuildingViewer::databaseId2FeatureId(hli.buildingId()); const QString& strFeatureID = BuildingViewer::databaseId2FeatureId(hli.buildingId);
if (!m_viewerInterface->isViewOpen(strFeatureID.toStdString())) if (!m_viewerInterface->isViewOpen(strFeatureID.toStdString()))
{ {
DEBUG_LOG(m_logger) << "building not opened: hli.buildingId()=" << hli.buildingId(); DEBUG_LOG(m_logger) << "building not opened: hli.buildingId()=" << hli.buildingId;
return; return;
} }
@@ -1457,28 +1458,28 @@ void BuildingViewerDdsController::onBuildingHitLineInfoChanged(const Buildings::
if (isRemove) if (isRemove)
{ {
DEBUG_LOG(m_logger) << "onBuildingHitLineInfoChanged: remove "; DEBUG_LOG(m_logger) << "onBuildingHitLineInfoChanged: remove ";
QVector<BuildingHit>& bhl = m_buildingHits[hli.buildingId()]; QVector<BuildingHit>& bhl = m_buildingHits[hli.buildingId];
auto it = std::find_if(bhl.begin(), bhl.end(), [hli](const BuildingHit& bh) { return (bh.id == hli.id()); }); auto it = std::find_if(bhl.begin(), bhl.end(), [hli](const BuildingHit& bh) { return (bh.id == hli.id); });
if (it != bhl.end()) if (it != bhl.end())
{ {
DEBUG_LOG(m_logger) << "bhl.erase(it)"; DEBUG_LOG(m_logger) << "bhl.erase(it)";
bhl.erase(it); bhl.erase(it);
} }
m_connection->removeRoomHit(hli.id()); m_connection->removeRoomHit(hli.id);
return; return;
} }
else else
{ {
BuildingHit bh; BuildingHit bh;
bh.id = hli.id(); bh.id = hli.id;
bh.sampleTime = hli.sampleTime(); bh.sampleTime = hli.sampleTime;
bh.originatorParticipantId = hli.originatorParticipantId(); bh.originatorParticipantId = hli.originatorParticipantId;
bh.chargeTypeId = hli.chargeTypeId(); bh.chargeTypeId = hli.chargeTypeId;
bool contains = false; bool contains = false;
for (const auto& it : m_buildingHits[hli.buildingId()]) for (const auto& it : m_buildingHits[hli.buildingId])
{ {
if (it.id == bh.id) if (it.id == bh.id)
contains = true; contains = true;
@@ -1486,13 +1487,13 @@ void BuildingViewerDdsController::onBuildingHitLineInfoChanged(const Buildings::
if (!contains) if (!contains)
{ {
m_buildingHits[hli.buildingId()].push_back(bh); m_buildingHits[hli.buildingId].push_back(bh);
} }
} }
int lineType = 2; int lineType = 2;
m_connection->roomHit(topidId, hli.originatorParticipantId(), hli.buildingId(), hli.hitOnRoomId(), m_connection->roomHit(topidId, hli.originatorParticipantId, hli.buildingId, hli.hitOnRoomId,
toRelative3D(hli.originatorPos()), lineType, isRemove ? 0 : hli.sampleTime()); toRelative3D(hli.originatorPos), lineType, isRemove ? 0 : hli.sampleTime);
} }
void BuildingViewerDdsController::onCleanupBuildingHitlines() void BuildingViewerDdsController::onCleanupBuildingHitlines()
@@ -1509,33 +1510,33 @@ void BuildingViewerDdsController::onCleanupBuildingHitlines()
void BuildingViewerDdsController::onMainStructureElementChanged( void BuildingViewerDdsController::onMainStructureElementChanged(
const InfrastructureManagement::MainStructureElement& mse, DataModification modType) const InfrastructureManagement::MainStructureElement& mse, DataModification modType)
{ {
if (!isBuildingKnown(mse.id())) if (!isBuildingKnown(mse.id))
return; return;
switch (modType) switch (modType)
{ {
case DataModification::eAdded: case DataModification::eAdded:
case DataModification::eModified: { case DataModification::eModified: {
if (mse.modelId() != 0 && m_ismDtc->isElementAssignedToExercise(mse, m_exerciseId)) if (mse.modelId != 0 && m_ismDtc->isElementAssignedToExercise(mse, m_exerciseId))
{ {
DEBUG_LOG(m_logger) << "m_buildingHeight.insert id=" << mse.id() << " z=" << mse.geoPosition().z(); DEBUG_LOG(m_logger) << "m_buildingHeight.insert id=" << mse.id << " z=" << mse.geoPosition.z;
m_buildingHeight.insert(mse.id(), mse.geoPosition().z()); m_buildingHeight.insert(mse.id, mse.geoPosition.z);
QHash<int, int> roomId2RoomNumber; QHash<int, int> roomId2RoomNumber;
for (const InfrastructureManagement::StructureElement& se : mse.elements()) for (const InfrastructureManagement::StructureElement& se : mse.elements)
{ {
if (se.structureElementTypeId() != InfrastructureManagement::StructureElementType::Room) if (se.structureElementTypeId != InfrastructureManagement::StructureElementType::Room)
continue; continue;
roomId2RoomNumber[se.id()] = se.mountingPointId(); roomId2RoomNumber[se.id] = se.mountingPointId;
} }
m_roomId2RoomNumber[mse.id()] = roomId2RoomNumber; m_roomId2RoomNumber[mse.id] = roomId2RoomNumber;
updateBuildingRoomNames(mse); updateBuildingRoomNames(mse);
} }
break; break;
} }
case DataModification::eRemoved: case DataModification::eRemoved:
m_roomId2RoomNumber.remove(mse.id()); m_roomId2RoomNumber.remove(mse.id);
m_buildingHeight.remove(mse.id()); m_buildingHeight.remove(mse.id);
break; break;
} }
} }
@@ -89,7 +89,7 @@ class BuildingViewerDdsController : public QObject
inline bool isOutdatedPosition(const ParticipantManagement::ParticipantPosition& position) const inline bool isOutdatedPosition(const ParticipantManagement::ParticipantPosition& position) const
{ {
return position.participantId() <= 0 || isOutdatedPosition(position.sampleTime()); return position.participantId <= 0 || isOutdatedPosition(position.sampleTime);
} }
bool calcBaseCoordinate(const QMap<qint32, InfrastructureManagement::MainStructureElement>& mseMap); bool calcBaseCoordinate(const QMap<qint32, InfrastructureManagement::MainStructureElement>& mseMap);
@@ -22,7 +22,8 @@ int32_t featureId2DatabaseId(const QString &strFeatureId)
if (!strFeatureId.startsWith(gStrFeatureIdPrefix)) if (!strFeatureId.startsWith(gStrFeatureIdPrefix))
return -1; return -1;
bool isOk = false; bool isOk = false;
int32_t buildingDatabaseId = strFeatureId.midRef(gStrFeatureIdPrefix.size()).toInt(&isOk); // Qt6: QString::midRef removed; mid() returns the same substring by value.
int32_t buildingDatabaseId = strFeatureId.mid(gStrFeatureIdPrefix.size()).toInt(&isOk);
return isOk ? buildingDatabaseId : -1; return isOk ? buildingDatabaseId : -1;
} }
} }
@@ -4,6 +4,7 @@
#include "bdv_edit_item.h" #include "bdv_edit_item.h"
#include "ui_bdv_building_edit.h" #include "ui_bdv_building_edit.h"
#include <NGLLogger/NGLLoggerBootstrap.h>
#include <Buildings/bld.hpp> #include <Buildings/bld.hpp>
#include <Buildings/bld_ftc.h> #include <Buildings/bld_ftc.h>
@@ -16,7 +17,8 @@ namespace BuildingViewer
{ {
BuildingEdit::BuildingEdit(QWidget* parent) BuildingEdit::BuildingEdit(QWidget* parent)
: LtsWidgets::LtsDialog(parent, LtsWidgets::ButtonCombination::OkApplyCancel), : LtsWidgets::LtsDialog(parent, LtsWidgets::ButtonCombination::OkApplyCancel),
m_requestHelper(new LtsUtils::RequestHelper(this)), m_ui(new Ui::BuildingEdit) m_requestHelper(new LtsUtils::RequestHelper(this)), m_ui(new Ui::BuildingEdit),
m_logger(NGL::NGLLoggerBootstrap::getNGLRootLogger().getNGLLogger("BuildingViewer.BuildingEdit"))
{ {
m_ui->setupUi(this); m_ui->setupUi(this);
@@ -69,7 +71,7 @@ bool BuildingEdit::init(int32_t buildingDatabaseId,
m_bldFtc = bldFtc; m_bldFtc = bldFtc;
InfrastructureManagement::MainStructureElement building = m_ismDtc->mainStructureElement(m_buildingDatabaseId); InfrastructureManagement::MainStructureElement building = m_ismDtc->mainStructureElement(m_buildingDatabaseId);
m_buildingId = building.id(); m_buildingId = building.id;
buildModel(); buildModel();
m_buildingName = m_model->getBuildingName(); m_buildingName = m_model->getBuildingName();
@@ -158,14 +160,14 @@ bool BuildingEdit::apply()
{ {
m_requestHelper->addRequest([this, fortifyFactors]() { m_requestHelper->addRequest([this, fortifyFactors]() {
Buildings::SetFortifyFactorRequest fortifyRequest; Buildings::SetFortifyFactorRequest fortifyRequest;
fortifyRequest.buildingId(m_buildingDatabaseId); fortifyRequest.buildingId = m_buildingDatabaseId;
fortifyRequest.fortifyFactors().reserve(fortifyFactors.size()); fortifyRequest.fortifyFactors.reserve(fortifyFactors.size());
for (const auto& e : fortifyFactors) for (const auto& e : fortifyFactors)
{ {
DEBUG_LOG(m_logger) << "push_back= databaseId=" << e.structureElementId() DEBUG_LOG(m_logger) << "push_back= databaseId=" << e.structureElementId()
<< " fortifyFactor=" << e.fortifyFactor(); << " fortifyFactor=" << e.fortifyFactor();
fortifyRequest.fortifyFactors().push_back( fortifyRequest.fortifyFactors.push_back(
Buildings::FortifyFactor(e.structureElementId(), e.fortifyFactor())); Buildings::FortifyFactor(e.structureElementId(), e.fortifyFactor()));
} }
@@ -184,12 +186,12 @@ bool BuildingEdit::apply()
for (const auto& treeItem : displayNames) for (const auto& treeItem : displayNames)
{ {
for (const auto& room : building.elements()) for (const auto& room : building.elements)
{ {
if (room.id() == treeItem.structureElementId()) if (room.id == treeItem.structureElementId())
{ {
auto copy = room; auto copy = room;
copy.displayName(treeItem.displayName().toStdString()); copy.displayName = treeItem.displayName().toStdString();
vecModifiedRooms.push_back(copy); vecModifiedRooms.push_back(copy);
break; break;
} }
@@ -231,7 +233,7 @@ void BuildingEdit::slotMainStructureElementChanged(const InfrastructureManagemen
if (modType == DataModification::eRemoved) if (modType == DataModification::eRemoved)
return; return;
if (mse.id() == m_buildingDatabaseId) if (mse.id == m_buildingDatabaseId)
{ {
slotHandleExternalDdsChange(); slotHandleExternalDdsChange();
@@ -243,7 +245,7 @@ void BuildingEdit::slotBuildingStateChanged(const Buildings::BuildingState& stat
if (modType == DataModification::eRemoved) if (modType == DataModification::eRemoved)
return; return;
if (state.id() == m_buildingDatabaseId) if (state.id == m_buildingDatabaseId)
{ {
slotHandleExternalDdsChange(); slotHandleExternalDdsChange();
@@ -265,11 +267,11 @@ bool BuildingEdit::sendBuildingStateRequest(ProjectDataManagement::Vulnerability
buildings.resize(1); buildings.resize(1);
Buildings::SetBuildingStatesRequest requestData; Buildings::SetBuildingStatesRequest requestData;
building.buildingId(m_buildingId); building.buildingId = m_buildingId;
building.roomIds().set(structureElementIds); building.roomIds.set(structureElementIds);
buildings[0] = building; buildings[0] = building;
requestData.buildings(buildings); requestData.buildings = buildings;
requestData.vulnerabilityState(state); requestData.vulnerabilityState = state;
DEBUG_LOG(m_logger) << Q_FUNC_INFO << "currentData: " << state; DEBUG_LOG(m_logger) << Q_FUNC_INFO << "currentData: " << state;
@@ -17,11 +17,13 @@ namespace BuildingViewer
BuildingEditModel::BuildingEditModel(QObject* parent, BuildingEditModel::BuildingEditModel(QObject* parent,
const std::shared_ptr<InfrastructureManagement::Interface::Dtc>& ismDtc, const std::shared_ptr<InfrastructureManagement::Interface::Dtc>& ismDtc,
const std::shared_ptr<Buildings::Interface::Dtc>& bldDtc) const std::shared_ptr<Buildings::Interface::Dtc>& bldDtc)
: NGLTreeModel(parent, new NGLTreeItem(QVariant()), , : NGLTreeModel(parent, new NGLTreeItem(QVariant()), {
m_logger(NGL::NGLLoggerBootstrap::getNGLRootLogger()){
tr("Selected Building"), QStringLiteral("Name (DEBUG)"), tr("Selected Building"), QStringLiteral("Name (DEBUG)"),
QStringLiteral("MountingPointId (DEBUG)"), QStringLiteral("StructureElementId (DEBUG)"), QStringLiteral("MountingPointId (DEBUG)"), QStringLiteral("StructureElementId (DEBUG)"),
tr("Fortify Factor"), tr("Damage Percent")}), tr("Fortify Factor"), tr("Damage Percent")}),
// m_logger moved out of the NGLTreeModel(...) call (it is a member init);
// getNGLLogger() returns the INGLLogger& the reference member binds to.
m_logger(NGL::NGLLoggerBootstrap::getNGLRootLogger().getNGLLogger("BuildingViewer.BuildingEditModel")),
m_ismDtc(ismDtc), m_bldDtc(bldDtc), m_buildingName(QString()) m_ismDtc(ismDtc), m_bldDtc(bldDtc), m_buildingName(QString())
{ {
} }
@@ -125,11 +127,11 @@ bool BuildingEditModel::init(int32_t mseId)
int rootId = 0; int rootId = 0;
qint32 mapId = 0; qint32 mapId = 0;
const std::vector<InfrastructureManagement::StructureElement>& vecElements = building.elements(); const std::vector<InfrastructureManagement::StructureElement>& vecElements = building.elements;
for (const auto& se : vecElements) for (const auto& se : vecElements)
{ {
DEBUG_LOG(m_logger) << "se: " << se; DEBUG_LOG(m_logger) << "se: " << se;
if (se.structureElementTypeId() == InfrastructureManagement::StructureElementType::Building) if (se.structureElementTypeId == InfrastructureManagement::StructureElementType::Building)
{ {
BuildingViewer::TreeItem rootItemBuilding(se); BuildingViewer::TreeItem rootItemBuilding(se);
rootName = rootItemBuilding.name(); rootName = rootItemBuilding.name();
@@ -142,12 +144,12 @@ bool BuildingEditModel::init(int32_t mseId)
for (const auto& se : vecElements) for (const auto& se : vecElements)
{ {
DEBUG_LOG(m_logger) << "se: =" << se; DEBUG_LOG(m_logger) << "se: =" << se;
if (se.structureElementTypeId() == InfrastructureManagement::StructureElementType::Floor) if (se.structureElementTypeId == InfrastructureManagement::StructureElementType::Floor)
{ {
BuildingViewer::TreeItem itemRoom(se); BuildingViewer::TreeItem itemRoom(se);
itemRoom.setSuperior(rootId); itemRoom.setSuperior(rootId);
lookupFloorId2TreeId[se.id()] = mapId; lookupFloorId2TreeId[se.id] = mapId;
treemap[mapId++] = itemRoom; treemap[mapId++] = itemRoom;
} }
} }
@@ -158,20 +160,20 @@ bool BuildingEditModel::init(int32_t mseId)
auto bs = m_bldDtc->buildingState(mseId); auto bs = m_bldDtc->buildingState(mseId);
QMap<int32_t, Buildings::RoomState> roomStates; QMap<int32_t, Buildings::RoomState> roomStates;
for (const auto& e : bs.roomStates()) for (const auto& e : bs.roomStates)
roomStates[e.id()] = e; roomStates[e.id] = e;
for (const auto& se : vecElements) for (const auto& se : vecElements)
{ {
if (se.structureElementTypeId() == InfrastructureManagement::StructureElementType::Room) if (se.structureElementTypeId == InfrastructureManagement::StructureElementType::Room)
{ {
double fortifyFactor = 1.0; double fortifyFactor = 1.0;
qint32 damagePercent = bs.damagePercent(); qint32 damagePercent = bs.damagePercent;
if (roomStates.contains(se.id())) if (roomStates.contains(se.id))
{ {
fortifyFactor = roomStates[se.id()].fortifyFactor(); fortifyFactor = roomStates[se.id].fortifyFactor;
damagePercent = roomStates[se.id()].damagePercent(); damagePercent = roomStates[se.id].damagePercent;
} }
BuildingViewer::TreeItem itemRoom(se, fortifyFactor, damagePercent); BuildingViewer::TreeItem itemRoom(se, fortifyFactor, damagePercent);
@@ -179,13 +181,13 @@ bool BuildingEditModel::init(int32_t mseId)
try try
{ {
int32_t floorID = se.path()[1]; int32_t floorID = se.path[1];
itemRoom.setSuperior(lookupFloorId2TreeId[floorID]); itemRoom.setSuperior(lookupFloorId2TreeId[floorID]);
} }
catch (const std::out_of_range& e) catch (const std::out_of_range& e)
{ {
WARNING_LOG(m_logger) << "Caught exception while trying to get superior id for building " << rootName WARNING_LOG(m_logger) << "Caught exception while trying to get superior id for building " << rootName
<< " with room with mounting point id: " << se.mountingPointId() << ": " << " with room with mounting point id: " << se.mountingPointId << ": "
<< e.what(); << e.what();
return false; return false;
} }
@@ -1,6 +1,7 @@
#include "bdv_thread_video_exporter.h" #include "bdv_thread_video_exporter.h"
#include <NGLLogger/NGLLoggerBootstrap.h>
#include "bdv_replay_handler.h" #include "bdv_replay_handler.h"
@@ -11,7 +12,9 @@
namespace BuildingViewer namespace BuildingViewer
{ {
VideoExporter::VideoExporter(QObject* parent) : QObject(parent) VideoExporter::VideoExporter(QObject* parent)
: QObject(parent),
m_logger(NGL::NGLLoggerBootstrap::getNGLRootLogger().getNGLLogger("BuildingViewer.VideoExporter"))
{ {
DEBUG_LOG(m_logger) << "ThreadVideoExporter has been created"; DEBUG_LOG(m_logger) << "ThreadVideoExporter has been created";
} }
@@ -1,6 +1,7 @@
#include "bdv_topic_replay_interface.h" #include "bdv_topic_replay_interface.h"
#include <NGLLogger/NGLLoggerBootstrap.h>
#include "bdv_replay_handler.h" #include "bdv_replay_handler.h"
#include "bdv_thread_video_exporter.h" #include "bdv_thread_video_exporter.h"
@@ -26,7 +27,8 @@ namespace BuildingViewer
{ {
TopicReplayInterface::TopicReplayInterface(BgViewerController* bgvController, LtsSession::LtsSession* session) TopicReplayInterface::TopicReplayInterface(BgViewerController* bgvController, LtsSession::LtsSession* session)
: m_bgvController(bgvController), m_session(session) : m_bgvController(bgvController), m_session(session),
m_logger(NGL::NGLLoggerBootstrap::getNGLRootLogger().getNGLLogger("BuildingViewer.TopicReplayInterface"))
{ {
session->getForeignGuiInterface<SituationReplay::ForeignGuiInterface>(m_replayIfc); session->getForeignGuiInterface<SituationReplay::ForeignGuiInterface>(m_replayIfc);
} }
@@ -240,20 +242,20 @@ bool TopicReplayInterface::exportBuildings(const QVector<int>& buildingIds) cons
for (const int buildingId : buildingIds) for (const int buildingId : buildingIds)
{ {
const auto mse = ismDtc->mainStructureElement(buildingId); const auto mse = ismDtc->mainStructureElement(buildingId);
if (mse.id() != buildingId) if (mse.id != buildingId)
{ {
WARNING_LOG(m_logger) << "Could not find MainStructureElement for building with id " << buildingId WARNING_LOG(m_logger) << "Could not find MainStructureElement for building with id " << buildingId
<< " - skipping"; << " - skipping";
continue; continue;
} }
const QString fnIve = QString::fromStdString(mse.name()) + QStringLiteral(".flt.ive"); const QString fnIve = QString::fromStdString(mse.name) + QStringLiteral(".flt.ive");
const QString fnXml = QString::fromStdString(mse.name()) + QStringLiteral(".flt.xml"); const QString fnXml = QString::fromStdString(mse.name) + QStringLiteral(".flt.xml");
if (!copyFile(fnIve, modelPath, outputPath) || !copyFile(fnXml, modelPath, outputPath)) if (!copyFile(fnIve, modelPath, outputPath) || !copyFile(fnXml, modelPath, outputPath))
return false; return false;
bi.name = QString::fromStdString(mse.name()); bi.name = QString::fromStdString(mse.name);
bi.position = LtsUtils::QPoint3D(mse.geoPosition().lon(), mse.geoPosition().lat(), mse.geoPosition().z()); bi.position = LtsUtils::QPoint3D(mse.geoPosition.lon, mse.geoPosition.lat, mse.geoPosition.z);
bi.angleDegree = mse.angle(); bi.angleDegree = mse.angle;
bi.id = mse.id(); bi.id = mse.id;
knownBuildings += bi; knownBuildings += bi;
} }
@@ -2,6 +2,7 @@
#include "bdv_viewer_data_dialog.h" #include "bdv_viewer_data_dialog.h"
#include <NGLLogger/NGLLoggerBootstrap.h>
#include "ui_bdv_viewer_data_dialog.h" #include "ui_bdv_viewer_data_dialog.h"
#include <LtsSession/lts_session_data.h> #include <LtsSession/lts_session_data.h>
@@ -12,6 +13,7 @@ namespace BuildingViewer
BgViewerDataViewDialog::BgViewerDataViewDialog(QWidget *parent) BgViewerDataViewDialog::BgViewerDataViewDialog(QWidget *parent)
: LtsWidgets::LtsDialog(parent, LtsWidgets::ButtonCombination::CloseOnly) : LtsWidgets::LtsDialog(parent, LtsWidgets::ButtonCombination::CloseOnly)
, m_ui(new Ui::BgViewerDataViewDialog) , m_ui(new Ui::BgViewerDataViewDialog)
, m_logger(NGL::NGLLoggerBootstrap::getNGLRootLogger().getNGLLogger("BuildingViewer.BgViewerDataViewDialog"))
{ {
m_ui->setupUi(this); m_ui->setupUi(this);
@@ -2,6 +2,7 @@
#include "bdv_viewer_data_view.h" #include "bdv_viewer_data_view.h"
#include <NGLLogger/NGLLoggerBootstrap.h>
#include "ui_bdv_viewer_data_view.h" #include "ui_bdv_viewer_data_view.h"
#include "bdv_viewer_data_model.h" #include "bdv_viewer_data_model.h"
@@ -15,6 +16,7 @@ BgViewerDataView::BgViewerDataView(QWidget *parent)
: QWidget(parent) : QWidget(parent)
, m_ui(new Ui::BgViewerDataView) , m_ui(new Ui::BgViewerDataView)
, m_pModel(new BgViewerDataViewModel(this)) , m_pModel(new BgViewerDataViewModel(this))
, m_logger(NGL::NGLLoggerBootstrap::getNGLRootLogger().getNGLLogger("BuildingViewer.BgViewerDataView"))
{ {
m_ui->setupUi(this); m_ui->setupUi(this);
@@ -6,7 +6,7 @@
# #
ADD_SUBDIRECTORY(Common) ADD_SUBDIRECTORY(Common)
# MSDL requires XmlPatterns - skip for Qt6 migration baseline # MSDL re-implemented without Qt XmlPatterns (Qt6::Xml + XercesC/xsdc++ + xmllint)
IF(BUILD_PLUGINS_MSDL) IF(BUILD_PLUGINS_MSDL)
ADD_SUBDIRECTORY(MSDL) ADD_SUBDIRECTORY(MSDL)
ENDIF() ENDIF()
@@ -21,7 +21,7 @@ ADD_SUBDIRECTORY(ParticipantSelection)
ADD_SUBDIRECTORY(ParticipantTemplates) ADD_SUBDIRECTORY(ParticipantTemplates)
ADD_SUBDIRECTORY(PartyEdit) ADD_SUBDIRECTORY(PartyEdit)
ADD_SUBDIRECTORY(PpmComboBox) ADD_SUBDIRECTORY(PpmComboBox)
# Saab requires XmlPatterns - skip for Qt6 migration baseline # Saab re-implemented without Qt XmlPatterns (Qt6::Xml only)
IF(BUILD_PLUGINS_SAAB) IF(BUILD_PLUGINS_SAAB)
ADD_SUBDIRECTORY(Saab) ADD_SUBDIRECTORY(Saab)
ENDIF() ENDIF()
@@ -79,6 +79,9 @@ INSTALL_SHARED_FILES(zwmsmsdl_SRCS
WS WS
) )
# .ui files live in the ui/ subdirectory; tell AUTOUIC where to find them
set(CMAKE_AUTOUIC_SEARCH_PATHS ${CMAKE_CURRENT_SOURCE_DIR}/ui)
NGL_WRAP_UI(zwmsmsdl_SRCS ${zwmsmsdl_UICS}) NGL_WRAP_UI(zwmsmsdl_SRCS ${zwmsmsdl_UICS})
NGL_ADD_LIBRARY2(WS zwmsmsdl SHARED ${zwmsmsdl_SRCS} ${zwmsmsdl_UICS} ${zwmsmsdl_IDLS}) NGL_ADD_LIBRARY2(WS zwmsmsdl SHARED ${zwmsmsdl_SRCS} ${zwmsmsdl_UICS} ${zwmsmsdl_IDLS})
NGL_TARGET_INCLUDE_DIRECTORIES(zwmsmsdl NGL_TARGET_INCLUDE_DIRECTORIES(zwmsmsdl
@@ -93,7 +96,6 @@ if(QT6_GUI_AVAILABLE)
PRIVATE PRIVATE
${Qt6_Gui} ${Qt6_Gui}
Qt6::Xml Qt6::Xml
Qt6::XmlPatterns
XercesC::XercesC XercesC::XercesC
PUBLIC PUBLIC
svcPpmCommon svcPpmCommon
@@ -184,7 +184,7 @@ msdl_1::MilitaryScenarioType::ForceSides_type Private::createTagForceSides(const
for (const ParticipantManagement::Party &party : mapForces) for (const ParticipantManagement::Party &party : mapForces)
{ {
if (party.id() == 0 || party.id() == 1) if (party.id == 0 || party.id == 1)
continue; continue;
QString obHaStr = QUuid::createUuid().toString(); QString obHaStr = QUuid::createUuid().toString();
@@ -202,7 +202,7 @@ msdl_1::MilitaryScenarioType::ForceSides_type Private::createTagForceSides(const
const ParticipantManagement::Party &party = itForce.value(); const ParticipantManagement::Party &party = itForce.value();
msdl_1::ForceSideType::ObjectHandle_type obHaTy(strUUID.toStdString().c_str()); msdl_1::ForceSideType::ObjectHandle_type obHaTy(strUUID.toStdString().c_str());
msdl_1::ForceSideType::ForceSideName_type foSiNaTy(party.name().c_str()); msdl_1::ForceSideType::ForceSideName_type foSiNaTy(party.name.c_str());
msdl_1::ForceSideType foSiTy(obHaTy, foSiNaTy); msdl_1::ForceSideType foSiTy(obHaTy, foSiNaTy);
@@ -218,7 +218,7 @@ msdl_1::MilitaryScenarioType::ForceSides_type Private::createTagForceSides(const
ParticipantManagement::Role role = itRelationship.value().role(); ParticipantManagement::Role role = itRelationship.value().role;
msdl_1::ForceSideType::Associations_type::Association_type::Relationship_type relType = msdl_1::ForceSideType::Associations_type::Association_type::Relationship_type::UNK; msdl_1::ForceSideType::Associations_type::Association_type::Relationship_type relType = msdl_1::ForceSideType::Associations_type::Association_type::Relationship_type::UNK;
if (role == ParticipantManagement::Role::Enemy) if (role == ParticipantManagement::Role::Enemy)
@@ -238,7 +238,7 @@ msdl_1::MilitaryScenarioType::ForceSides_type Private::createTagForceSides(const
foSiTy.Associations(asType); foSiTy.Associations(asType);
foSiSe.push_back(foSiTy); foSiSe.push_back(foSiTy);
mapForceHandles[party.id()] = strUUID; mapForceHandles[party.id] = strUUID;
} }
return foType; return foType;
@@ -315,7 +315,7 @@ msdl_1::MilitaryScenarioType::Organizations_type::Units_type Private::createTagU
QString obHaStr = QUuid::createUuid().toString(); QString obHaStr = QUuid::createUuid().toString();
obHaStr = obHaStr.mid(1, obHaStr.size() - 2); obHaStr = obHaStr.mid(1, obHaStr.size() - 2);
mapParticipantsUUIDs[participant.id()] = obHaStr.toStdString(); mapParticipantsUUIDs[participant.id] = obHaStr.toStdString();
} }
unitsType unitsTy; unitsType unitsTy;
@@ -326,16 +326,16 @@ msdl_1::MilitaryScenarioType::Organizations_type::Units_type Private::createTagU
for (const ParticipantManagement::Participant &participant : mapParticipants) for (const ParticipantManagement::Participant &participant : mapParticipants)
{ {
if (participant.partyId() != it.key()) if (participant.partyId != it.key())
continue; continue;
if (participant.isDeleted()) if (participant.isDeleted)
continue; continue;
forceRelationDataType foReDaTy; forceRelationDataType foReDaTy;
forceRelationChoiceType foReChTy = forceRelationChoiceType::FORCE_SIDE; forceRelationChoiceType foReChTy = forceRelationChoiceType::FORCE_SIDE;
if (participant.superiorId() == 0) if (participant.superiorId == 0)
{ {
foReChTy = forceRelationChoiceType::FORCE_SIDE; foReChTy = forceRelationChoiceType::FORCE_SIDE;
@@ -346,12 +346,12 @@ msdl_1::MilitaryScenarioType::Organizations_type::Units_type Private::createTagU
{ {
foReChTy = forceRelationChoiceType::UNIT; foReChTy = forceRelationChoiceType::UNIT;
msdl_1::CommandRelationType::CommandingSuperiorHandle_type handle(mapParticipantsUUIDs.value(participant.superiorId())); msdl_1::CommandRelationType::CommandingSuperiorHandle_type handle(mapParticipantsUUIDs.value(participant.superiorId));
forceRelationDataType::CommandRelation_type cmdRelation(handle, msdl_1::CommandRelationType::CommandRelationshipType_type::TACON); forceRelationDataType::CommandRelation_type cmdRelation(handle, msdl_1::CommandRelationType::CommandRelationshipType_type::TACON);
foReDaTy.CommandRelation(cmdRelation); foReDaTy.CommandRelation(cmdRelation);
} }
unitType::ObjectHandle_type unObHaTy(mapParticipantsUUIDs.value(participant.id())); unitType::ObjectHandle_type unObHaTy(mapParticipantsUUIDs.value(participant.id));
unitType::SymbolIdentifier_type syIdTy = "S--------------"; unitType::SymbolIdentifier_type syIdTy = "S--------------";
relationsType::ForceRelation_type foReTy(foReChTy, foReDaTy); relationsType::ForceRelation_type foReTy(foReChTy, foReDaTy);
@@ -360,7 +360,7 @@ msdl_1::MilitaryScenarioType::Organizations_type::Units_type Private::createTagU
unitType unitTy(unObHaTy, syIdTy, reTy); unitType unitTy(unObHaTy, syIdTy, reTy);
unitTy.SymbolIdentifier(syIdTy); unitTy.SymbolIdentifier(syIdTy);
unitType::Name_type naTy(participant.designator().c_str()); unitType::Name_type naTy(participant.designator.c_str());
unitTy.Name(naTy); unitTy.Name(naTy);
unSe.push_back(unitTy); unSe.push_back(unitTy);
@@ -389,16 +389,16 @@ msdl_1::MilitaryScenarioType::Organizations_type::Equipment_type Private::create
for (const ParticipantManagement::Participant &participant : mapParticipants) for (const ParticipantManagement::Participant &participant : mapParticipants)
{ {
if (participant.partyId() != partyId) if (participant.partyId != partyId)
continue; continue;
if (participant.isDeleted()) if (participant.isDeleted)
continue; continue;
ownerDataType::UnitOwnerHandle_type foOwHaTy; ownerDataType::UnitOwnerHandle_type foOwHaTy;
foOwHaTy = mapParticipantsUUIDs.value(participant.id()).c_str(); foOwHaTy = mapParticipantsUUIDs.value(participant.id).c_str();
ownerDataType owDaTy; ownerDataType owDaTy;
owDaTy.UnitOwnerHandle(foOwHaTy); owDaTy.UnitOwnerHandle(foOwHaTy);
@@ -409,11 +409,11 @@ msdl_1::MilitaryScenarioType::Organizations_type::Equipment_type Private::create
auto vecDISEntities = mapTypes.value(participant.typeId()).disEntities(); auto vecDISEntities = mapTypes.value(participant.typeId).disEntities;
if (!vecDISEntities.size()) if (!vecDISEntities.size())
{ {
WARNING_LOG(logger) << "Participant id " << participant.id() WARNING_LOG(logger) << "Participant id " << participant.id
<< " belongs to a type id " << participant.typeId() << " which has no DIS id! Skipping export of participant!"; << " belongs to a type id " << participant.typeId << " which has no DIS id! Skipping export of participant!";
continue; continue;
} }
@@ -425,9 +425,9 @@ msdl_1::MilitaryScenarioType::Organizations_type::Equipment_type Private::create
coordDataType::GCC_type::X_type x(mapParticipantPositions[participant.id()].pos().lon()); coordDataType::GCC_type::X_type x(mapParticipantPositions[participant.id].pos.lon);
coordDataType::GCC_type::X_type y(mapParticipantPositions[participant.id()].pos().lat()); coordDataType::GCC_type::X_type y(mapParticipantPositions[participant.id].pos.lat);
coordDataType::GCC_type::Z_type z(mapParticipantPositions[participant.id()].pos().z()); coordDataType::GCC_type::Z_type z(mapParticipantPositions[participant.id].pos.z);
coordDataType::GCC_type utTy(x, y, z); coordDataType::GCC_type utTy(x, y, z);
coordDataType coDaTy; coordDataType coDaTy;
@@ -459,7 +459,7 @@ msdl_1::MilitaryScenarioType::Organizations_type::Equipment_type Private::create
eqItTy.ObjectHandle(eqObHaTy); eqItTy.ObjectHandle(eqObHaTy);
equipItemType::Name_type naTy(mapEquipment.value(mapTypes.value(participant.typeId()).equipmentTypeId()).name()); equipItemType::Name_type naTy(mapEquipment.value(mapTypes.value(participant.typeId).equipmentTypeId).name);
eqItTy.Name(naTy); eqItTy.Name(naTy);
eqItTy.SymbolIdentifier(syIdTy); eqItTy.SymbolIdentifier(syIdTy);
@@ -22,21 +22,21 @@ ScenarioDataDialog::ScenarioDataDialog(QWidget *parent,
connect(mUi->m_pushButton_Cancel, &QPushButton::clicked, this, &ScenarioDataDialog::onButtonCancel); connect(mUi->m_pushButton_Cancel, &QPushButton::clicked, this, &ScenarioDataDialog::onButtonCancel);
ExerciseManagement::Exercise exercise = exmDtc->exercise(pSession->exerciseId()); ExerciseManagement::Exercise exercise = exmDtc->exercise(pSession->exerciseId());
mUi->m_lineEdit_ExerciseDescription->setText(LtsUtils::OperatorSettings::getInstance()->value(QStringLiteral("MSDL"), QStringLiteral("exerciseDescription"), QString::fromStdString(exercise.description())).toString()); mUi->m_lineEdit_ExerciseDescription->setText(LtsUtils::OperatorSettings::getInstance()->value(QStringLiteral("MSDL"), QStringLiteral("exerciseDescription"), QString::fromStdString(exercise.description)).toString());
QString strName(QString::fromStdString(exercise.name())); QString strName(QString::fromStdString(exercise.name));
strName.remove(QLatin1Char(' ')); strName.remove(QLatin1Char(' '));
mUi->m_lineEdit_ExerciseName->setText(LtsUtils::OperatorSettings::getInstance()->value(QStringLiteral("MSDL"), QStringLiteral("exerciseName"), strName).toString()); mUi->m_lineEdit_ExerciseName->setText(LtsUtils::OperatorSettings::getInstance()->value(QStringLiteral("MSDL"), QStringLiteral("exerciseName"), strName).toString());
mUi->m_lineEdit_Domain->setText(LtsUtils::OperatorSettings::getInstance()->value(QStringLiteral("MSDL"), QStringLiteral("exerciseDomain"), QString::fromStdString(exercise.partitionName())).toString()); mUi->m_lineEdit_Domain->setText(LtsUtils::OperatorSettings::getInstance()->value(QStringLiteral("MSDL"), QStringLiteral("exerciseDomain"), QString::fromStdString(exercise.partitionName)).toString());
mUi->m_lineEdit_Version->setText(LtsUtils::OperatorSettings::getInstance()->value(QStringLiteral("MSDL"), QStringLiteral("exerciseVersion"), QString()).toString()); mUi->m_lineEdit_Version->setText(LtsUtils::OperatorSettings::getInstance()->value(QStringLiteral("MSDL"), QStringLiteral("exerciseVersion"), QString()).toString());
mUi->m_lineEdit_Purpose->setText(LtsUtils::OperatorSettings::getInstance()->value(QStringLiteral("MSDL"), QStringLiteral("exercisePurpose"), QString()).toString()); mUi->m_lineEdit_Purpose->setText(LtsUtils::OperatorSettings::getInstance()->value(QStringLiteral("MSDL"), QStringLiteral("exercisePurpose"), QString()).toString());
OperatorManagement::User user = opmDtc->user(LtsSessionData::LtsSessionData::getInstance()->getOperatorId()); OperatorManagement::User user = opmDtc->user(LtsSessionData::LtsSessionData::getInstance()->getOperatorId());
mUi->m_lineEdit_Type->setText(LtsUtils::OperatorSettings::getInstance()->value(QStringLiteral("MSDL"), QStringLiteral("pocType"), QString::fromStdString(user.description())).toString()); mUi->m_lineEdit_Type->setText(LtsUtils::OperatorSettings::getInstance()->value(QStringLiteral("MSDL"), QStringLiteral("pocType"), QString::fromStdString(user.description)).toString());
mUi->m_lineEdit_AuthorName->setText(LtsUtils::OperatorSettings::getInstance()->value(QStringLiteral("MSDL"), QStringLiteral("pocAuthor"), QString::fromStdString(user.name())).toString()); mUi->m_lineEdit_AuthorName->setText(LtsUtils::OperatorSettings::getInstance()->value(QStringLiteral("MSDL"), QStringLiteral("pocAuthor"), QString::fromStdString(user.name)).toString());
mUi->m_lineEdit_Organization->setText(LtsUtils::OperatorSettings::getInstance()->value(QStringLiteral("MSDL"), QStringLiteral("pocOrganization"), QString()).toString()); mUi->m_lineEdit_Organization->setText(LtsUtils::OperatorSettings::getInstance()->value(QStringLiteral("MSDL"), QStringLiteral("pocOrganization"), QString()).toString());
mUi->m_lineEdit_Email->setText(LtsUtils::OperatorSettings::getInstance()->value(QStringLiteral("MSDL"), QStringLiteral("pocEmail"), QString()).toString()); mUi->m_lineEdit_Email->setText(LtsUtils::OperatorSettings::getInstance()->value(QStringLiteral("MSDL"), QStringLiteral("pocEmail"), QString()).toString());
mUi->m_lineEdit_Telephone->setText(LtsUtils::OperatorSettings::getInstance()->value(QStringLiteral("MSDL"), QStringLiteral("pocTelephone"), QString()).toString()); mUi->m_lineEdit_Telephone->setText(LtsUtils::OperatorSettings::getInstance()->value(QStringLiteral("MSDL"), QStringLiteral("pocTelephone"), QString()).toString());
@@ -17,12 +17,9 @@
#include <QtCore/QUuid> #include <QtCore/QUuid>
#include <QtCore/QTextStream> #include <QtCore/QTextStream>
#include <QtCore/QUrl> #include <QtCore/QUrl>
#include <QAbstractMessageHandler>
#include <QtXml/QDomDocument> #include <QtXml/QDomDocument>
#include <QMimeData> #include <QMimeData>
#include <QtCore/QProcess> #include <QtCore/QProcess>
#include <QtXmlPatterns/QXmlSchema>
#include <QtXmlPatterns/QXmlSchemaValidator>
#include <ngltools/ngltools_filesystem.h> #include <ngltools/ngltools_filesystem.h>
#include <Common/participant_dis_helper.h> #include <Common/participant_dis_helper.h>
@@ -89,17 +86,17 @@ ImportMsdl::ImportMsdl(ParticipantManagement::ParticipantEditModel *pModel, cons
for (const ParticipantManagement::Type &type : std::as_const(m_mapTypes)) for (const ParticipantManagement::Type &type : std::as_const(m_mapTypes))
{ {
for (const auto &disId : type.disEntities()) for (const auto &disId : type.disEntities)
{ {
QString strMSDL_DISId = ParticipantManagement::DIS::convertDISTypeInteger2MSDLString(disId); QString strMSDL_DISId = ParticipantManagement::DIS::convertDISTypeInteger2MSDLString(disId);
if (m_mapMSDL_DIS_2TypeId.find(strMSDL_DISId) != m_mapMSDL_DIS_2TypeId.end()) if (m_mapMSDL_DIS_2TypeId.find(strMSDL_DISId) != m_mapMSDL_DIS_2TypeId.end())
{ {
WARNING_LOG(mLogger) << "DIS id \"" << strMSDL_DISId << "\" which is assigned to type id \"" << type.id() << "\" is already assigned to type id \"" << m_mapMSDL_DIS_2TypeId[strMSDL_DISId] << "\""; WARNING_LOG(mLogger) << "DIS id \"" << strMSDL_DISId << "\" which is assigned to type id \"" << type.id << "\" is already assigned to type id \"" << m_mapMSDL_DIS_2TypeId[strMSDL_DISId] << "\"";
continue; continue;
} }
m_mapMSDL_DIS_2TypeId[strMSDL_DISId] = type.id(); m_mapMSDL_DIS_2TypeId[strMSDL_DISId] = type.id;
} }
} }
} }
@@ -286,13 +283,14 @@ bool ImportMsdl::schemaValidation()
return false; return false;
} }
QXmlSchema schema; // Qt6: Qt XmlPatterns (QXmlSchema) was removed. Check the schema file is
msdl::SchemaMessageHandler smh; // well-formed XML via Qt6::Xml (QDomDocument); the external xmllint step below
schema.setMessageHandler(&smh); // performs the full schema/instance validation.
schema.load(&schemaFile, QUrl::fromLocalFile(schemaFile.fileName())); QDomDocument schemaDoc;
schemaDoc.setContent(&schemaFile, false);
if (!schema.isValid()) if (schemaDoc.documentElement().isNull())
{ {
LtsWidgets::LtsMessageDialog::showMessage(this, tr("Schema is invalid")); LtsWidgets::LtsMessageDialog::showMessage(this, tr("Schema is invalid"));
return false; return false;
@@ -322,16 +320,6 @@ bool ImportMsdl::schemaValidation()
#endif #endif
QXmlSchemaValidator validator(schema);
if (false )
{
#ifdef LTS_DEBUG
LtsWidgets::LtsMessageDialog::showMessage(this, tr("Instance document is invalid"));
#endif
return false;
}
return true; return true;
} }
@@ -341,17 +329,14 @@ ParticipantManagement::ParticipantData ImportMsdl::createParticipant(const MSDLP
ParticipantManagement::ParticipantData p; ParticipantManagement::ParticipantData p;
p.designator(unit.m_designator.toStdString()); p.designator = unit.m_designator.toStdString();
p.tacticalIdentifier(unit.m_tacticalIdentifier.toStdString()); p.tacticalIdentifier = unit.m_tacticalIdentifier.toStdString();
p.equipmentNumber = 0;
p.equipmentNumber() = 0; p.assignState = ParticipantManagement::ParticipantAssignState::HandoutExcon;
p.assignState() = ParticipantManagement::ParticipantAssignState::HandoutExcon;
p.symbol = m_mapTypes[unit.m_mappedTypeId].symbol;
p.typeId = unit.m_mappedTypeId;
p.symbol(m_mapTypes[unit.m_mappedTypeId].symbol());
p.typeId(unit.m_mappedTypeId);
return p; return p;
} }
@@ -370,7 +355,7 @@ void ImportMsdl::insertParty(const MSDLParty &party)
{ {
ParticipantManagement::ParticipantData newParty; ParticipantManagement::ParticipantData newParty;
newParty.designator(party.m_forceSideName.toStdString()); newParty.designator = party.m_forceSideName.toStdString();
createNode(newParty, m_indexRoot, party.m_ownHandle); createNode(newParty, m_indexRoot, party.m_ownHandle);
} }
@@ -753,7 +738,7 @@ void ImportMsdl::mapParticipant2Type(MSDLParticipant &participant, qint32 mapped
{ {
m_mapMSDL_DIS_2TypeId[participant.m_DISTypeMSDL] = mappedTypeId; m_mapMSDL_DIS_2TypeId[participant.m_DISTypeMSDL] = mappedTypeId;
m_mapTypes[mappedTypeId].disEntities().push_back(ParticipantManagement::DIS::convertMSDLString2Integer(participant.m_DISTypeMSDL)); m_mapTypes[mappedTypeId].disEntities.push_back(ParticipantManagement::DIS::convertMSDLString2Integer(participant.m_DISTypeMSDL));
m_setTouchedTypes.insert(mappedTypeId); m_setTouchedTypes.insert(mappedTypeId);
} }
} }
@@ -182,18 +182,3 @@ void ImportMsdlShow::slotCustomContextMenuActionTriggered(QAction *ac)
} }
void SchemaMessageHandler::handleMessage(QtMsgType type,
const QString &description,
const QUrl &identifier,
const QSourceLocation &sourceLocation)
{
ERROR_LOG(mLogger) << "type: " << type << " desc: " << description;
if (identifier.isValid())
ERROR_LOG(mLogger) << "identifier: " << identifier.toString();
if (!sourceLocation.isNull())
ERROR_LOG(mLogger) << "sourceLocation: "
<< sourceLocation.uri().toString()
<< " line: " << sourceLocation.line()
<< " column: " << sourceLocation.column()
;
}
@@ -4,7 +4,6 @@
#pragma once #pragma once
#include <QtXml/QDomDocument> #include <QtXml/QDomDocument>
#include <QtXmlPatterns/QAbstractMessageHandler>
#include <nglwidgets/ngldialog.h> #include <nglwidgets/ngldialog.h>
#include "msdl_logging.h" #include "msdl_logging.h"
@@ -13,23 +12,6 @@
namespace msdl namespace msdl
{ {
class SchemaMessageHandler : public QAbstractMessageHandler
{
Q_OBJECT
public:
explicit SchemaMessageHandler(QObject *parent = nullptr)
: QAbstractMessageHandler(parent)
, mLogger(getLogger("SchemaMessageHandler"))
{}
protected:
void handleMessage(QtMsgType type,
const QString &description,
const QUrl &identifier = QUrl(),
const QSourceLocation &sourceLocation = QSourceLocation()) override;
private:
LOGGER_T mLogger;
};
class ImportMsdlShow : public NGLDialog class ImportMsdlShow : public NGLDialog
{ {
Q_OBJECT Q_OBJECT
@@ -26,13 +26,13 @@ MappingDialog::MappingDialog(QWidget *parent, bool typeClassIsUnit, const QStrin
for (const ParticipantManagement::Type &type : std::as_const(m_mapTypes)) for (const ParticipantManagement::Type &type : std::as_const(m_mapTypes))
{ {
if (!m_offerDatabaseEntriesWithoutDISType && (type.disEntities().size() == 0)) if (!m_offerDatabaseEntriesWithoutDISType && (type.disEntities.size() == 0))
{ {
WARNING_LOG(mLogger) << "Type id " << type.id() << " does not have assigned DIS types! Type cannot be used when importing MSDL data!"; WARNING_LOG(mLogger) << "Type id " << type.id << " does not have assigned DIS types! Type cannot be used when importing MSDL data!";
continue; continue;
} }
const ParticipantManagement::TypeClass typeClassId = type.typeClass(); const ParticipantManagement::TypeClass typeClassId = type.typeClass;
if (typeClassIsUnit) if (typeClassIsUnit)
{ {
@@ -49,7 +49,7 @@ MappingDialog::MappingDialog(QWidget *parent, bool typeClassIsUnit, const QStrin
} }
for (const auto &typeclass : setTypeClasses) for (const auto &typeclass : setTypeClasses)
mUi->m_ltsComboBox_typeClass->addItem(ParticipantManagement::toString(typeclass), typeclass); mUi->m_ltsComboBox_typeClass->addItem(ParticipantManagement::toString(typeclass), static_cast<int>(typeclass));
slotClassTypeChanged(); slotClassTypeChanged();
@@ -68,21 +68,21 @@ void MappingDialog::slotClassTypeChanged()
{ {
mUi->m_ltsComboBox_type->clear(); mUi->m_ltsComboBox_type->clear();
int currentClass = mUi->m_ltsComboBox_typeClass->currentData().toInt(); ParticipantManagement::TypeClass currentClass = static_cast<ParticipantManagement::TypeClass>(mUi->m_ltsComboBox_typeClass->currentData().toInt());
for (const ParticipantManagement::Type &type : std::as_const(m_mapTypes)) for (const ParticipantManagement::Type &type : std::as_const(m_mapTypes))
{ {
if (type.typeClass() != currentClass) if (type.typeClass != currentClass)
continue; continue;
if (!m_offerDatabaseEntriesWithoutDISType && (type.disEntities().size() == 0)) if (!m_offerDatabaseEntriesWithoutDISType && (type.disEntities.size() == 0))
{ {
WARNING_LOG(mLogger) << "Type id " << type.id() << " does not have assigned DIS types! Type cannot be used when importing MSDL data!"; WARNING_LOG(mLogger) << "Type id " << type.id << " does not have assigned DIS types! Type cannot be used when importing MSDL data!";
continue; continue;
} }
mUi->m_ltsComboBox_type->addItem(QString::fromStdString(type.name()), type.id()); mUi->m_ltsComboBox_type->addItem(QString::fromStdString(type.name), type.id);
} }
} }
@@ -122,6 +122,6 @@ bool MappingDialog::autoMapAllUnmappedElements() const
int32_t MappingDialog::getMappedTypeId() const int32_t MappingDialog::getMappedTypeId() const
{ {
int index = mUi->m_ltsComboBox_type->currentData().toInt(); int index = mUi->m_ltsComboBox_type->currentData().toInt();
return m_mapTypes[index].id(); return m_mapTypes[index].id;
} }
} }
@@ -3,7 +3,7 @@
#include "ppm_msdl_edit.h" #include "ppm_msdl_edit.h"
#include "ui_ppm_msdl_edit.h" #include "ui_ppm_msdl_edit.h"
#include "msdl/msdl_import.h" #include "msdl/msdl_import.h"
#include "msdl_export.h" #include "msdl/msdl_export.h"
#include <QtGui/QAction> #include <QtGui/QAction>
#include <AdvancedSymbology/asb_data_plugin_interface.h> #include <AdvancedSymbology/asb_data_plugin_interface.h>
@@ -18,6 +18,7 @@ namespace ParticipantManagement
{ {
MSDLEdit::MSDLEdit(LtsSession::LtsSession *session, QWidget *parent) MSDLEdit::MSDLEdit(LtsSession::LtsSession *session, QWidget *parent)
: LtsWidgets::LtsDialog(parent, LtsWidgets::ButtonCombination::OkApplyCancel) : LtsWidgets::LtsDialog(parent, LtsWidgets::ButtonCombination::OkApplyCancel)
, m_logger(getLogger("MSDLEdit"))
, m_actionRemove(nullptr) , m_actionRemove(nullptr)
, m_actionEdit(nullptr) , m_actionEdit(nullptr)
, m_ppmDtc(nullptr) , m_ppmDtc(nullptr)
@@ -3,7 +3,7 @@
#include "ppm_saab_edit.h" #include "ppm_saab_edit.h"
#include "ui_ppm_saab_edit.h" #include "ui_ppm_saab_edit.h"
#include "saab/saab_import.h" #include "saab/saab_import.h"
#include "saab_export.h" #include "saab/saab_export.h"
#include <QtGui/QAction> #include <QtGui/QAction>
#include <AdvancedSymbology/asb_data_plugin_interface.h> #include <AdvancedSymbology/asb_data_plugin_interface.h>
@@ -18,6 +18,7 @@ namespace ParticipantManagement
{ {
SAABEdit::SAABEdit(LtsSession::LtsSession *session, QWidget *parent) SAABEdit::SAABEdit(LtsSession::LtsSession *session, QWidget *parent)
: LtsWidgets::LtsDialog(parent, LtsWidgets::ButtonCombination::OkApplyCancel) : LtsWidgets::LtsDialog(parent, LtsWidgets::ButtonCombination::OkApplyCancel)
, m_logger(getLogger("SAABEdit"))
, m_actionRemove(nullptr) , m_actionRemove(nullptr)
, m_actionEdit(nullptr) , m_actionEdit(nullptr)
, m_ppmDtc(nullptr) , m_ppmDtc(nullptr)
@@ -43,6 +43,9 @@ SET(zwmssaab_UICS
ui/saab_mapping_dialog.ui ui/saab_mapping_dialog.ui
) )
# .ui files live in the ui/ subdirectory; tell AUTOUIC where to find them
set(CMAKE_AUTOUIC_SEARCH_PATHS ${CMAKE_CURRENT_SOURCE_DIR}/ui)
NGL_WRAP_UI(zwmssaab_SRCS ${zwmssaab_UICS}) NGL_WRAP_UI(zwmssaab_SRCS ${zwmssaab_UICS})
NGL_ADD_LIBRARY2(WS zwmssaab SHARED ${zwmssaab_SRCS} ${zwmssaab_UICS} ${zwmssaab_IDLS}) NGL_ADD_LIBRARY2(WS zwmssaab SHARED ${zwmssaab_SRCS} ${zwmssaab_UICS} ${zwmssaab_IDLS})
NGL_TARGET_INCLUDE_DIRECTORIES(zwmssaab NGL_TARGET_INCLUDE_DIRECTORIES(zwmssaab
@@ -55,7 +58,6 @@ if(QT6_GUI_AVAILABLE)
PRIVATE PRIVATE
${Qt6_Gui} ${Qt6_Gui}
Qt6::Xml Qt6::Xml
Qt6::XmlPatterns
PUBLIC PUBLIC
svcPpmCommon svcPpmCommon
LtsUtilsSettings LtsUtilsSettings
@@ -45,6 +45,7 @@ ExportSaab::ExportSaab(LtsSession::LtsSession *session, const std::shared_ptr<Pa
, m_session(session) , m_session(session)
, m_configFile(nullptr) , m_configFile(nullptr)
, m_ui(new Ui_SAABExport) , m_ui(new Ui_SAABExport)
, m_logger(saab::getLogger("ExportSaab"))
{ {
m_ui->setupUi(this); m_ui->setupUi(this);
@@ -369,13 +370,13 @@ void ExportSaab::writeExercise(QXmlStreamWriter *writer) const
using namespace XmlStrings; using namespace XmlStrings;
writer->writeStartElement(SAAB_EXERCISE()); writer->writeStartElement(SAAB_EXERCISE());
writer->writeAttribute(SAAB_ID(), QUuid(l, m_currentExercise.id(), w2, b1, b2, b3, b4, b5, b6, b7, GuidContext::GuidExercise).toString(QUuid::WithoutBraces)); writer->writeAttribute(SAAB_ID(), QUuid(l, m_currentExercise.id, w2, b1, b2, b3, b4, b5, b6, b7, GuidContext::GuidExercise).toString(QUuid::WithoutBraces));
writer->writeTextElement(SAAB_EXPORT_TIME(), toSaabTime(m_session->partitionTime())); writer->writeTextElement(SAAB_EXPORT_TIME(), toSaabTime(m_session->partitionTime()));
writer->writeTextElement(SAAB_PLANNED_START_TIME(), toSaabTime(m_currentExercise.beginTime())); writer->writeTextElement(SAAB_PLANNED_START_TIME(), toSaabTime(m_currentExercise.beginTime));
writer->writeTextElement(SAAB_PLANNED_STOP_TIME(), toSaabTime(m_currentExercise.endTime())); writer->writeTextElement(SAAB_PLANNED_STOP_TIME(), toSaabTime(m_currentExercise.endTime));
writer->writeTextElement(SAAB_DESIGNATION(), QString::fromStdString(m_currentExercise.name())); writer->writeTextElement(SAAB_DESIGNATION(), QString::fromStdString(m_currentExercise.name));
writer->writeTextElement(SAAB_DESCRIPTION(), QString::fromStdString(m_currentExercise.description())); writer->writeTextElement(SAAB_DESCRIPTION(), QString::fromStdString(m_currentExercise.description));
writer->writeTextElement(SAAB_WIND_SPEED(), QStringLiteral("0")); writer->writeTextElement(SAAB_WIND_SPEED(), QStringLiteral("0"));
writer->writeTextElement(SAAB_WIND_DIRECTION(), QStringLiteral("0")); writer->writeTextElement(SAAB_WIND_DIRECTION(), QStringLiteral("0"));
writer->writeEmptyElement(SAAB_EVALUATION_PACKAGE_FILE_NAME()); writer->writeEmptyElement(SAAB_EVALUATION_PACKAGE_FILE_NAME());
@@ -420,13 +421,13 @@ SaabPlayer *ExportSaab::toSaabPlayer(const ParticipantManagement::Party &party,
result = new SaabUnit; result = new SaabUnit;
result->symbol = m_mapPartyToForce.value(party.id()).symbolCode; result->symbol = m_mapPartyToForce.value(party.id).symbolCode;
static_cast<SaabUnit *>(result)->unitSize = m_mapPartyToForce.value(party.id()).echelonCode; static_cast<SaabUnit *>(result)->unitSize = m_mapPartyToForce.value(party.id).echelonCode;
result->designation = QString::fromStdString(party.name()); result->designation = QString::fromStdString(party.name);
result->trashcan = false; result->trashcan = false;
result->isExternalPlayer = true; result->isExternalPlayer = true;
result->force = m_mapPartyToForce.value(party.id()).forceCode; result->force = m_mapPartyToForce.value(party.id).forceCode;
result->guid = QUuid(l, m_currentExercise.id(), w2, static_cast<uchar>(party.id()), b2, b3, b4, b5, b6, b7, GuidContext::GuidParty).toString(QUuid::WithoutBraces); result->guid = QUuid(l, m_currentExercise.id, w2, static_cast<uchar>(party.id), b2, b3, b4, b5, b6, b7, GuidContext::GuidParty).toString(QUuid::WithoutBraces);
QList<int> keys = remainingParticipants.keys(); QList<int> keys = remainingParticipants.keys();
@@ -438,7 +439,7 @@ SaabPlayer *ExportSaab::toSaabPlayer(const ParticipantManagement::Party &party,
ParticipantManagement::Participant participant = remainingParticipants.value(key); ParticipantManagement::Participant participant = remainingParticipants.value(key);
if (!(participant.partyId() == party.id() && participant.superiorId() == 0)) if (!(participant.partyId == party.id && participant.superiorId == 0))
continue; continue;
SaabPlayer *player = toSaabPlayer(participant, remainingParticipants); SaabPlayer *player = toSaabPlayer(participant, remainingParticipants);
@@ -454,26 +455,26 @@ SaabPlayer *ExportSaab::toSaabPlayer(const ParticipantManagement::Party &party,
SaabPlayer *ExportSaab::toSaabPlayer(const ParticipantManagement::Participant &participant, QMap<int, ParticipantManagement::Participant> &remainingParticipants) SaabPlayer *ExportSaab::toSaabPlayer(const ParticipantManagement::Participant &participant, QMap<int, ParticipantManagement::Participant> &remainingParticipants)
{ {
if (participant.isDeleted()) if (participant.isDeleted)
{ {
DEBUG_LOG(m_logger) << "Participant with id " << participant.id() << " id deleted --> skipping"; DEBUG_LOG(m_logger) << "Participant with id " << participant.id << " id deleted --> skipping";
return nullptr; return nullptr;
} }
if (participant.externalId()) if (participant.externalId)
{ {
DEBUG_LOG(m_logger) << "Particpant with id " << participant.id() << " has external ID set to " << participant.externalId() << " --> not being exported."; DEBUG_LOG(m_logger) << "Particpant with id " << participant.id << " has external ID set to " << participant.externalId << " --> not being exported.";
return nullptr; return nullptr;
} }
SaabPlayer *result; SaabPlayer *result;
ParticipantManagement::Type type = m_types.value(participant.typeId()); ParticipantManagement::Type type = m_types.value(participant.typeId);
if (!m_mapTypeToSaabSymbol.contains(type.id())) if (!m_mapTypeToSaabSymbol.contains(type.id))
mapType(type); mapType(type);
switch (type.typeClass()) switch (type.typeClass)
{ {
case ParticipantManagement::TypeClass::SupportEntity: case ParticipantManagement::TypeClass::SupportEntity:
result = new SaabOcPlayer; result = new SaabOcPlayer;
@@ -491,9 +492,9 @@ SaabPlayer *ExportSaab::toSaabPlayer(const ParticipantManagement::Participant &p
{ {
result = new SaabUnit; result = new SaabUnit;
DEBUG_LOG(m_logger) << "Reading unit with " << participant.inferiorIds().size() << " inferiors"; DEBUG_LOG(m_logger) << "Reading unit with " << participant.inferiorIds.size() << " inferiors";
for (int32_t id : participant.inferiorIds()) for (int32_t id : participant.inferiorIds)
{ {
SaabPlayer *player = toSaabPlayer(remainingParticipants.value(id), remainingParticipants); SaabPlayer *player = toSaabPlayer(remainingParticipants.value(id), remainingParticipants);
@@ -509,7 +510,7 @@ SaabPlayer *ExportSaab::toSaabPlayer(const ParticipantManagement::Participant &p
if (!static_cast<SaabUnit *>(result)->inferiors.size()) if (!static_cast<SaabUnit *>(result)->inferiors.size())
{ {
DEBUG_LOG(m_logger) << "Unit " << participant.id() << " has no inferiors."; DEBUG_LOG(m_logger) << "Unit " << participant.id << " has no inferiors.";
return nullptr; return nullptr;
} }
@@ -519,11 +520,11 @@ SaabPlayer *ExportSaab::toSaabPlayer(const ParticipantManagement::Participant &p
case ParticipantManagement::TypeClass::Aircraft: case ParticipantManagement::TypeClass::Aircraft:
case ParticipantManagement::TypeClass::Unknown: case ParticipantManagement::TypeClass::Unknown:
default: default:
DEBUG_LOG(m_logger) << "Type " << participant.typeId() << " is not supported."; DEBUG_LOG(m_logger) << "Type " << participant.typeId << " is not supported.";
return nullptr; return nullptr;
} }
QString symbol = m_mapTypeToSaabSymbol.value(type.id()); QString symbol = m_mapTypeToSaabSymbol.value(type.id);
if (typeid(*result) == typeid(SaabUnit)) if (typeid(*result) == typeid(SaabUnit))
{ {
@@ -535,22 +536,22 @@ SaabPlayer *ExportSaab::toSaabPlayer(const ParticipantManagement::Participant &p
else else
result->symbol = symbol; result->symbol = symbol;
result->designation = QString::fromStdString(participant.designator()); result->designation = QString::fromStdString(participant.designator);
result->trashcan = participant.isDeleted(); result->trashcan = participant.isDeleted;
result->rank = QStringLiteral("OF1"); result->rank = QStringLiteral("OF1");
result->isExternalPlayer = true; result->isExternalPlayer = true;
if (participant.equipmentNumber().has_value()) if (participant.equipmentNumber.has_value())
result->simulatorId = participant.equipmentNumber().get(); result->simulatorId = participant.equipmentNumber.get();
result->force = m_mapPartyToForce.value(participant.partyId()).forceCode; result->force = m_mapPartyToForce.value(participant.partyId).forceCode;
result->guid = QUuid(participant.id(), m_currentExercise.id(), w2, static_cast<uchar>(participant.partyId()), b2, b3, b4, b5, b6, b7, GuidContext::GuidParticipant).toString(QUuid::WithoutBraces); result->guid = QUuid(participant.id, m_currentExercise.id, w2, static_cast<uchar>(participant.partyId), b2, b3, b4, b5, b6, b7, GuidContext::GuidParticipant).toString(QUuid::WithoutBraces);
return result; return result;
} }
ParticipantManagement::Participant ExportSaab::rootParticipant(const ParticipantManagement::Participant &participant, const QMap<int, ParticipantManagement::Participant> &participants) const ParticipantManagement::Participant ExportSaab::rootParticipant(const ParticipantManagement::Participant &participant, const QMap<int, ParticipantManagement::Participant> &participants) const
{ {
if (participant.superiorId()) if (participant.superiorId)
return rootParticipant(participants.value(participant.superiorId()), participants); return rootParticipant(participants.value(participant.superiorId), participants);
return participant; return participant;
} }
@@ -563,10 +564,10 @@ void ExportSaab::mapType(const ParticipantManagement::Type &type)
{ {
using namespace ParticipantManagement; using namespace ParticipantManagement;
MapType dialog(ParticipantManagement::trTypeName(type.name()), MapType dialog(ParticipantManagement::trTypeName(type.name),
m_mapEchelons, m_mapEchelons,
m_mapSymbols, m_mapSymbols,
type.typeClass() == TypeClass::Unit || type.typeClass() == TypeClass::SupportUnit, type.typeClass == TypeClass::Unit || type.typeClass == TypeClass::SupportUnit,
this); this);
dialog.exec(); dialog.exec();
@@ -579,19 +580,19 @@ void ExportSaab::mapType(const ParticipantManagement::Type &type)
saabTypeStr.append(dialog.echelonCode()); saabTypeStr.append(dialog.echelonCode());
} }
m_mapTypeToSaabSymbol.insert(type.id(), saabTypeStr); m_mapTypeToSaabSymbol.insert(type.id, saabTypeStr);
} }
void ExportSaab::mapPartyToForce(const ParticipantManagement::Party &party) void ExportSaab::mapPartyToForce(const ParticipantManagement::Party &party)
{ {
MapParty dialog(QString::fromStdString(party.name()), m_mapForces, m_mapEchelons, m_mapSymbols, this); MapParty dialog(QString::fromStdString(party.name), m_mapForces, m_mapEchelons, m_mapSymbols, this);
dialog.exec(); dialog.exec();
if (dialog.isSkipped()) if (dialog.isSkipped())
return; return;
m_mapPartyToForce.insert(party.id(), { m_mapForces.take(dialog.force()), dialog.echelonCode(), dialog.symbolCode() }); m_mapPartyToForce.insert(party.id, { m_mapForces.take(dialog.force()), dialog.echelonCode(), dialog.symbolCode() });
} }
} }
@@ -166,17 +166,16 @@ ParticipantManagement::ParticipantData ImportSaab::createParticipant(SaabPlayer
p.tacticalIdentifier(player->designation.toStdString()); p.tacticalIdentifier = player->designation.toStdString();
p.equipmentNumber = (player->simulatorId != INT_MIN ? player->simulatorId : 0);
p.equipmentNumber(player->simulatorId != INT_MIN ? player->simulatorId : 0); p.assignState = ParticipantManagement::ParticipantAssignState::HandoutExcon;
p.assignState() = ParticipantManagement::ParticipantAssignState::HandoutExcon;
if (player->simulatorId != INT_MIN) if (player->simulatorId != INT_MIN)
p.externalId(player->simulatorId); p.externalId = player->simulatorId;
p.symbol(m_mapTypes[player->mappedTypeId].symbol()); p.symbol = m_mapTypes[player->mappedTypeId].symbol;
p.typeId(player->mappedTypeId); p.typeId = player->mappedTypeId;
return p; return p;
} }
@@ -192,7 +191,7 @@ void ImportSaab::insertParty(SaabUnit *party)
{ {
ParticipantManagement::ParticipantData newParty; ParticipantManagement::ParticipantData newParty;
newParty.designator(party->designation.toStdString()); newParty.designator = party->designation.toStdString();
createNode(newParty, m_indexRoot, party); createNode(newParty, m_indexRoot, party);
} }
@@ -182,18 +182,3 @@ void ImportSaabShow::slotCustomContextMenuActionTriggered(QAction *ac)
} }
void SchemaMessageHandler::handleMessage(QtMsgType type,
const QString &description,
const QUrl &identifier,
const QSourceLocation &sourceLocation)
{
ERROR_LOG(mLogger) << "type: " << type << " desc: " << description;
if (identifier.isValid())
ERROR_LOG(mLogger) << "identifier: " << identifier.toString();
if (!sourceLocation.isNull())
ERROR_LOG(mLogger) << "sourceLocation: "
<< sourceLocation.uri().toString()
<< " line: " << sourceLocation.line()
<< " column: " << sourceLocation.column()
;
}
@@ -4,7 +4,6 @@
#pragma once #pragma once
#include <QtXml/QDomDocument> #include <QtXml/QDomDocument>
#include <QtXmlPatterns/QAbstractMessageHandler>
#include <nglwidgets/ngldialog.h> #include <nglwidgets/ngldialog.h>
#include "saab_logging.h" #include "saab_logging.h"
@@ -13,25 +12,6 @@
namespace saab namespace saab
{ {
class SchemaMessageHandler : public QAbstractMessageHandler
{
Q_OBJECT
public:
explicit SchemaMessageHandler(QObject *parent = nullptr)
: QAbstractMessageHandler(parent)
, mLogger(getLogger("SchemaMessageHandler"))
{}
~SchemaMessageHandler()
{}
protected:
void handleMessage(QtMsgType type,
const QString &description,
const QUrl &identifier = QUrl(),
const QSourceLocation &sourceLocation = QSourceLocation());
private:
LOGGER_T mLogger;
};
class ImportSaabShow : public NGLDialog class ImportSaabShow : public NGLDialog
{ {
Q_OBJECT Q_OBJECT
@@ -26,16 +26,16 @@ MappingDialog::MappingDialog(QWidget *parent, bool typeClassIsUnit, const QStrin
for (const ParticipantManagement::Type &type : std::as_const(m_mapTypes)) for (const ParticipantManagement::Type &type : std::as_const(m_mapTypes))
{ {
if (!m_offerDatabaseEntriesWithoutDISType && (type.disEntities().size() == 0)) if (!m_offerDatabaseEntriesWithoutDISType && (type.disEntities.size() == 0))
{ {
WARNING_LOG(mLogger) << "Type id " << type.id() << " does not have assigned DIS types! Type cannot be used when importing SAAB data!"; WARNING_LOG(mLogger) << "Type id " << type.id << " does not have assigned DIS types! Type cannot be used when importing SAAB data!";
continue; continue;
} }
if (type.isDeleted()) if (type.isDeleted)
continue; continue;
const ParticipantManagement::TypeClass typeClassId = type.typeClass(); const ParticipantManagement::TypeClass typeClassId = type.typeClass;
if (typeClassId == ParticipantManagement::TypeClass::Unknown || if (typeClassId == ParticipantManagement::TypeClass::Unknown ||
typeClassId == ParticipantManagement::TypeClass::Vessel || typeClassId == ParticipantManagement::TypeClass::Vessel ||
@@ -57,7 +57,7 @@ MappingDialog::MappingDialog(QWidget *parent, bool typeClassIsUnit, const QStrin
} }
for (const auto &typeclass : setTypeClasses) for (const auto &typeclass : setTypeClasses)
mUi->m_ltsComboBox_typeClass->addItem(ParticipantManagement::toString(typeclass), typeclass); mUi->m_ltsComboBox_typeClass->addItem(ParticipantManagement::toString(typeclass), static_cast<int>(typeclass));
slotClassTypeChanged(); slotClassTypeChanged();
@@ -76,24 +76,24 @@ void MappingDialog::slotClassTypeChanged()
{ {
mUi->m_ltsComboBox_type->clear(); mUi->m_ltsComboBox_type->clear();
int currentClass = mUi->m_ltsComboBox_typeClass->currentData().toInt(); ParticipantManagement::TypeClass currentClass = static_cast<ParticipantManagement::TypeClass>(mUi->m_ltsComboBox_typeClass->currentData().toInt());
for (const ParticipantManagement::Type &type : std::as_const(m_mapTypes)) for (const ParticipantManagement::Type &type : std::as_const(m_mapTypes))
{ {
if(type.isDeleted()) if(type.isDeleted)
continue; continue;
if (type.typeClass() != currentClass) if (type.typeClass != currentClass)
continue; continue;
if (!m_offerDatabaseEntriesWithoutDISType && (type.disEntities().size() == 0)) if (!m_offerDatabaseEntriesWithoutDISType && (type.disEntities.size() == 0))
{ {
WARNING_LOG(mLogger) << "Type id " << type.id() << " does not have assigned DIS types! Type cannot be used when importing SAAB data!"; WARNING_LOG(mLogger) << "Type id " << type.id << " does not have assigned DIS types! Type cannot be used when importing SAAB data!";
continue; continue;
} }
mUi->m_ltsComboBox_type->addItem(QString::fromStdString(type.name()), type.id()); mUi->m_ltsComboBox_type->addItem(QString::fromStdString(type.name), type.id);
} }
} }
@@ -126,6 +126,6 @@ bool MappingDialog::skipAllUnmappedElements() const
int32_t MappingDialog::getMappedTypeId() const int32_t MappingDialog::getMappedTypeId() const
{ {
int index = mUi->m_ltsComboBox_type->currentData().toInt(); int index = mUi->m_ltsComboBox_type->currentData().toInt();
return m_mapTypes[index].id(); return m_mapTypes[index].id;
} }
} }
@@ -0,0 +1,117 @@
# FindOpenSceneGraph.cmake
#
# Locate an installed OpenSceneGraph and expose the module variables that the
# Legatus BuildingViewer stack links against:
# OSG_INCLUDE_DIR, OPENSCENEGRAPH_INCLUDE_DIRS
# OPENSCENEGRAPH_LIBRARIES (the OSG component libs that were found)
# OPENTHREADS_LIBRARIES
# OPENSCENEGRAPH_FOUND, OPENSCENEGRAPH_VERSION
#
# NOTE (Qt6-migration port): OSG 3.4.1 ships no FindOpenSceneGraph.cmake and
# installs no OpenSceneGraphConfig.cmake, so this module is supplied to close
# the bld/OSG floor. It finds the 3.4.1 build installed under CMAKE_PREFIX_PATH
# (the component libs live under <prefix>/lib64) and honours the requested
# components -- including the ported Qt6 osgQt (see the .osg-port notes).
#
# Mirrors the classic OSG Find-module variable names that BuildingViewer/Common
# links: ${OSG_INCLUDE_DIR}, ${OPENSCENEGRAPH_LIBRARIES}, ${OPENTHREADS_LIBRARIES}.
SET(OSG_SEARCH_PREFIXES ${CMAKE_PREFIX_PATH} /usr/local /usr)
# Include dir: locate the osg/Version header.
FIND_PATH(OSG_INCLUDE_DIR
NAMES osg/Version
PATHS ${OSG_SEARCH_PREFIXES}
PATH_SUFFIXES include)
# OpenThreads support library (distinct SONAME: libOpenThreads.so.20 for 3.4.1).
FIND_LIBRARY(OPENTHREADS_LIBRARY
NAMES OpenThreads
PATHS ${OSG_SEARCH_PREFIXES}
PATH_SUFFIXES lib lib64)
# OSG component libraries. Find each that exists and collect them so
# OPENSCENEGRAPH_LIBRARIES covers the transitive dependency set the BgViewer
# SDK and BuildingViewerCommon link (the SDK's NEEDED entries require
# osg/DB/GA/Qt/Shadow/Sim/Text/Util/Viewer/Particle/Manipulator/Animation).
SET(OSG_COMPONENT_LIBS
osg
osgDB
osgUtil
osgGA
osgText
osgViewer
osgAnimation
osgManipulator
osgParticle
osgShadow
osgSim
osgWidget
osgQt)
SET(OPENSCENEGRAPH_LIBRARIES "")
FOREACH(_osg_lib ${OSG_COMPONENT_LIBS})
FIND_LIBRARY(OSG_LIBRARY_${_osg_lib}
NAMES ${_osg_lib}
PATHS ${OSG_SEARCH_PREFIXES}
PATH_SUFFIXES lib lib64)
IF(OSG_LIBRARY_${_osg_lib})
LIST(APPEND OPENSCENEGRAPH_LIBRARIES ${OSG_LIBRARY_${_osg_lib}})
SET(OPENSCENEGRAPH_${_osg_lib}_FOUND TRUE)
ELSE()
SET(OPENSCENEGRAPH_${_osg_lib}_FOUND FALSE)
ENDIF()
ENDFOREACH()
# Core libs are mandatory for the package to count as found.
SET(_osg_core_ok TRUE)
IF(NOT OSG_LIBRARY_osg OR NOT OSG_LIBRARY_osgDB OR NOT OSG_LIBRARY_osgUtil
OR NOT OSG_LIBRARY_osgGA OR NOT OSG_LIBRARY_osgViewer OR NOT OPENTHREADS_LIBRARY)
SET(_osg_core_ok FALSE)
ENDIF()
# Any requested component that is missing makes the package not found.
FOREACH(_osg_req ${OpenSceneGraph_FIND_COMPONENTS})
IF(NOT OSG_LIBRARY_${_osg_req})
SET(_osg_core_ok FALSE)
MESSAGE(STATUS "OpenSceneGraph: required component '${_osg_req}' not found")
ENDIF()
ENDFOREACH()
# Version string from the installed header's OPENSCENEGRAPH_*_VERSION macros.
IF(OSG_INCLUDE_DIR)
FILE(READ "${OSG_INCLUDE_DIR}/osg/Version" _osg_version_header)
STRING(REGEX MATCH "#define[ \t]+OPENSCENEGRAPH_MAJOR_VERSION[ \t]+[0-9]+"
_osg_m "${_osg_version_header}")
STRING(REGEX MATCH "#define[ \t]+OPENSCENEGRAPH_MINOR_VERSION[ \t]+[0-9]+"
_osg_n "${_osg_version_header}")
STRING(REGEX MATCH "#define[ \t]+OPENSCENEGRAPH_PATCH_VERSION[ \t]+[0-9]+"
_osg_p "${_osg_version_header}")
STRING(REGEX REPLACE "[^0-9]" "" _osg_major "${_osg_m}")
STRING(REGEX REPLACE "[^0-9]" "" _osg_minor "${_osg_n}")
STRING(REGEX REPLACE "[^0-9]" "" _osg_patch "${_osg_p}")
IF(_osg_major AND _osg_minor AND _osg_patch)
SET(OPENSCENEGRAPH_VERSION "${_osg_major}.${_osg_minor}.${_osg_patch}")
ENDIF()
ENDIF()
IF(OSG_INCLUDE_DIR AND _osg_core_ok)
SET(OPENSCENEGRAPH_FOUND TRUE)
SET(OPENSCENEGRAPH_INCLUDE_DIRS ${OSG_INCLUDE_DIR})
SET(OPENTHREADS_LIBRARIES ${OPENTHREADS_LIBRARY})
ELSE()
SET(OPENSCENEGRAPH_FOUND FALSE)
ENDIF()
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(OpenSceneGraph
FOUND_VAR OPENSCENEGRAPH_FOUND
VERSION_VAR OPENSCENEGRAPH_VERSION
REQUIRED_VARS OPENSCENEGRAPH_INCLUDE_DIRS OPENSCENEGRAPH_LIBRARIES OPENTHREADS_LIBRARIES)
MARK_AS_ADVANCED(
OSG_INCLUDE_DIR OPENTHREADS_LIBRARY
OSG_LIBRARY_osg OSG_LIBRARY_osgDB OSG_LIBRARY_osgUtil OSG_LIBRARY_osgGA
OSG_LIBRARY_osgText OSG_LIBRARY_osgViewer OSG_LIBRARY_osgAnimation
OSG_LIBRARY_osgManipulator OSG_LIBRARY_osgParticle OSG_LIBRARY_osgShadow
OSG_LIBRARY_osgSim OSG_LIBRARY_osgWidget OSG_LIBRARY_osgQt)
@@ -57,13 +57,15 @@ BUILD_WEBENGINE_PLUGINS:
BUILD_XMLPATTERNS_PLUGINS: BUILD_XMLPATTERNS_PLUGINS:
--xmlpatterns-plugins / --no-xmlpatterns-plugins --xmlpatterns-plugins / --no-xmlpatterns-plugins
Enable/disable the XmlPatterns-based plugins (MSDL, Saab) Enable/disable the MSDL/Saab plugins. They no longer
when Qt6XmlPatterns is present in the Qt install. Qt require Qt XmlPatterns (removed in Qt 6.0, not
removed the XmlPatterns module in Qt 6.0 ("What's New in re-introduced): their import logic was re-implemented
Qt 6.0" / Qt Wiki: removed, not planned to be with Qt6::Xml (QDomDocument) + the existing xmllint
re-introduced; no Qt 6 release ships it, no aqt step, and MSDL additionally links XercesC + uses
module), so with a stock Qt 6.10.2 install these xsdc++-generated tree classes (needs xsdcxx +
plugins stay disabled (environmental floor). (default: ON) libxerces-c-dev, both in APT_PACKAGES). With the
prerequisites present these build by default.
(default: ON)
Build groups: Build groups:
--group1 / --no-group1 Enable/disable DDS core libraries build --group1 / --no-group1 Enable/disable DDS core libraries build
@@ -311,6 +313,19 @@ APT_PACKAGES=(
# uses Poppler types unconditionally, so a green Group 12 build requires it. # uses Poppler types unconditionally, so a green Group 12 build requires it.
pkg-config pkg-config
libpoppler-qt6-dev libpoppler-qt6-dev
# MSDL/Saab no longer require Qt XmlPatterns (removed in Qt 6.0): their import
# logic was re-implemented with Qt6::Xml (QDomDocument) + the existing xmllint
# schema-validation step. MSDL additionally links XercesC and uses xsdc++-
# generated tree classes, so it needs libxerces-c-dev (XercesC C++ parser) and
# xsdcxx (the xsdc++ code generator, XSD_GENERATE_TREE). Saab only needs
# Qt6::Xml; both are installed together so the two plugins build from the same
# image.
xsdcxx
libxerces-c-dev
# xmllint (libxml2-utils): the MSDL import validates the incoming document against
# its XSD via an external `xmllint --schema` step (QProcess) - pre-existing in the
# legacy (msdl_import.cpp). Provision it so that runtime schema check can run.
libxml2-utils
) )
# INTERFACE libraries (header-only) are built automatically as dependencies # INTERFACE libraries (header-only) are built automatically as dependencies
@@ -654,15 +669,12 @@ RUN pip3 install --break-system-packages --quiet aqtinstall && \
--outputdir ${QT_BASE_DIR} && \ --outputdir ${QT_BASE_DIR} && \
rm -rf /root/.cache/Aqt rm -rf /root/.cache/Aqt
# Qt6 XmlPatterns (MSDL/Saab plugins) is intentionally NOT installed: Qt removed # MSDL/Saab plugins: Qt removed the XmlPatterns module in Qt 6.0 (not re-
# the XmlPatterns module in Qt 6.0 ("What's New in Qt 6.0" / Qt Wiki: removed and # introduced), so their import logic was re-implemented with Qt6::Xml
# not planned to be re-introduced - unlike e.g. Multimedia/WebEngine which # (QDomDocument) + the existing external xmllint schema-validation step. MSDL
# returned in 6.1/6.2; no Qt 6 release ships it, no aqt module). Mixing an # additionally links XercesC and uses xsdc++-generated tree classes; xsdcxx +
# out-of-tree libQt6XmlPatterns built against an older Qt with a 6.10 install # libxerces-c-dev are installed via APT_PACKAGES above, so the plugins build with
# would put two Qt minor versions in one # a stock Qt 6.10.2 install.
# process. MSDL/Saab therefore stay disabled with a stock Qt install; to enable
# them, install a Qt-version-matching XmlPatterns (lib + headers + cmake config)
# into ${QT_BASE_DIR}/${QT_VERSION}/${QT_ARCH_DIR} and pass --xmlpatterns-plugins.
# Install KDReports from source (apt package not available in Ubuntu 22.04/26.04) # Install KDReports from source (apt package not available in Ubuntu 22.04/26.04)
# Try apt install first (will fail), then build from KDAB GitHub mirror # Try apt install first (will fail), then build from KDAB GitHub mirror
@@ -1221,10 +1233,11 @@ GROUP11_TARGETS=(
# BldInfoGuiPlugin - links BuildingViewerCommon (dtEntity/OSG SDK absent) # BldInfoGuiPlugin - links BuildingViewerCommon (dtEntity/OSG SDK absent)
# BdvViewerGuiPlugin - links BuildingViewerCommon (same floor; CMake skips its # BdvViewerGuiPlugin - links BuildingViewerCommon (same floor; CMake skips its
# subdirectory when BuildingViewerCommon is not built) # subdirectory when BuildingViewerCommon is not built)
# PpmMSDLGuiPlugin - links Qt6::XmlPatterns; Qt removed the XmlPatterns # PpmMSDLGuiPlugin / - former XmlPatterns floor, now CLOSED: re-implemented without
# PpmSAABGuiPlugin - module in Qt 6.0 (not re-introduced; no Qt 6 release # PpmSAABGuiPlugin - Qt XmlPatterns (removed in Qt 6.0) using Qt6::Xml (QDomDocument)
# ships it, incl. 6.10.2). With a stock Qt install the # + the existing xmllint step; MSDL also needs xsdcxx +
# BUILD_PLUGINS_MSDL/SAAB flags resolve to OFF (see # libxerces-c-dev (both in APT_PACKAGES). Now in GROUP12 and built
# by default when the prerequisites are present (see
# resolve_xmlpatterns) # resolve_xmlpatterns)
# The Flt*/Smo* targets only exist when BUILD_FILTERMANAGEMENT / # The Flt*/Smo* targets only exist when BUILD_FILTERMANAGEMENT /
# BUILD_PLUGINS_SERVICEMONITOR are ON (script defaults; see the cmake call). # BUILD_PLUGINS_SERVICEMONITOR are ON (script defaults; see the cmake call).
@@ -1341,12 +1354,14 @@ GROUP12_TARGETS=(
PlanOverlaysGuiPlugin PlanOverlaysGuiPlugin
PpmComboBoxGuiPlugin PpmComboBoxGuiPlugin
PpmDataPlugin PpmDataPlugin
PpmMSDLGuiPlugin
PpmOperationalPlaningGuiPlugin PpmOperationalPlaningGuiPlugin
PpmOrgChartGuiPlugin PpmOrgChartGuiPlugin
PpmParticipantEditGuiPlugin PpmParticipantEditGuiPlugin
PpmParticipantInfoGuiPlugin PpmParticipantInfoGuiPlugin
PpmParticipantTemplatesGuiPlugin PpmParticipantTemplatesGuiPlugin
PpmPartyEditGuiPlugin PpmPartyEditGuiPlugin
PpmSAABGuiPlugin
PpmTypeEditGuiPlugin PpmTypeEditGuiPlugin
PpmUasGuiPlugin PpmUasGuiPlugin
PreDataPlugin PreDataPlugin
@@ -1691,22 +1706,21 @@ if [[ "${BUILD_ARCGIS}" == "ON" ]]; then
fi fi
fi fi
# The MSDL/Saab plugins link Qt6::XmlPatterns. Qt removed the XmlPatterns # The MSDL/Saab plugins no longer require Qt XmlPatterns (removed in Qt 6.0, not
# module in Qt 6.0 ("What's New in Qt 6.0" removal table / Qt Wiki: removed and # re-introduced). Their import logic was re-implemented with Qt6::Xml
# not planned to be re-introduced - unlike Multimedia/WebEngine, which returned # (QDomDocument) plus the existing external xmllint schema-validation step; MSDL
# in 6.1/6.2). No Qt 6 release (incl. 6.10.2) ships it and there is no aqt # additionally links XercesC and uses xsdc++-generated tree classes. So build
# module. An out-of-tree libQt6XmlPatterns built against an older Qt would mix # them by default. MSDL needs the xsdcxx code generator + libxerces-c-dev (both
# two Qt minor versions in one process (ABI risk), so with a stock Qt install # are in APT_PACKAGES); if they are missing here, keep both plugins OFF and flag
# the plugins are gated OFF. If a Qt-version-matching XmlPatterns (lib + # the gap. (Saab only needs Qt6::Xml, but is gated together to keep the effective
# headers + Qt6XmlPatterns cmake config) is placed into the Qt prefix, they # value a single switch.)
# enable automatically.
resolve_xmlpatterns() { resolve_xmlpatterns() {
BUILD_XMLPATTERNS_EFFECTIVE="${BUILD_XMLPATTERNS_PLUGINS}" BUILD_XMLPATTERNS_EFFECTIVE="${BUILD_XMLPATTERNS_PLUGINS}"
if [[ "${BUILD_XMLPATTERNS_EFFECTIVE}" == "ON" ]]; then if [[ "${BUILD_XMLPATTERNS_EFFECTIVE}" == "ON" ]]; then
if ls "${QT_BASE_DIR}/${QT_VERSION}/${QT_ARCH_DIR}/lib/libQt6XmlPatterns.so.6" >/dev/null 2>&1; then if command -v xsdcxx >/dev/null 2>&1 && [ -e /usr/lib/x86_64-linux-gnu/libxerces-c.so ]; then
log_info "Qt6XmlPatterns present in the Qt install - MSDL/Saab plugins will be built" log_info "xsdcxx + XercesC present - MSDL/Saab plugins will be built (re-implemented without Qt XmlPatterns)"
else else
log_warn "Qt6XmlPatterns is not present in the Qt install (removed in Qt 6.0, not re-introduced) - keeping BUILD_PLUGINS_MSDL/BUILD_PLUGINS_SAAB OFF (ppm.msdl / ppm.saab stay unbuilt)" log_warn "xsdcxx / libxerces-c-dev missing - keeping BUILD_PLUGINS_MSDL/BUILD_PLUGINS_SAAB OFF (ppm.msdl / ppm.saab stay unbuilt)"
BUILD_XMLPATTERNS_EFFECTIVE=OFF BUILD_XMLPATTERNS_EFFECTIVE=OFF
fi fi
fi fi