Files
qt5-legatus-legacy/Lts/Viewer/SituationMap/ModuleTests/sit_map.cpp
T
2026-08-13 18:33:10 +02:00

348 lines
12 KiB
C++
Executable File

/**
* @RDE_HEADER@
* Moduletest
* $Id$
* $HeadURL$
* $Author$
*/
// Own
#include "sit_map.h"
#include <ngltools/ngltools_filesystem.h>
#include <Map/map.h>
//#include <Map/layer_factory.h>
#include <Map/grid.h>
#include <Map/map_initializer.h>
#include <Map/situation_map_utils.h>
#include <Symbology/symbol_dictionary.h>
#include <Map/object_factory.h>
#include <MapObjectsImpl/polygon_impl.h>
#include <MapObjectsImpl/polyline_impl.h>
#include <MapObjectsImpl/text_impl.h>
#include <MapObjectsImpl/area_fire_impl.h>
#include <MapObjectsImpl/biological_agent_impl.h>
#include <MapObjectsImpl/chemical_agent_impl.h>
#include <MapObjectsImpl/cube_impl.h>
#include <MapObjectsImpl/building_outline_impl.h>
#include <MapObjectsImpl/danger_area_impl.h>
#include <MapObjectsImpl/functional_area_impl.h>
#include <MapObjectsImpl/geo_image_impl.h>
#include <MapObjectsImpl/hit_line_impl.h>
#include <MapObjectsImpl/map_object_indicator_impl.h>
#include <MapObjectsImpl/mine_impl.h>
#include <MapObjectsImpl/mine_field_impl.h>
#include <MapObjectsImpl/nine_liner_impl.h>
#include <MapObjectsImpl/nuclear_agent_impl.h>
#include <MapObjectsImpl/participant_impl.h>
#include <MapImpl/sidc_symbol_impl.h>
#include <MapObjectsImpl/single_fire_impl.h>
//#include <MapObjectsImpl/single_fire_central_impl.h>
#include <FunctionDialog/function_dialog.h>
// Qt
#include <QApplication>
#include <QTimer>
#include <QPushButton>
#include <QGridLayout>
class myMapInitializer : public SituationMap::MapInitializer
{
Q_OBJECT
using BaseClass = SituationMap::MapInitializer;
public:
explicit myMapInitializer(SituationMap::Map &map
, SituationMap::MapSettings &mapSettings
, const QString &debugName
, QObject *parent = nullptr)
: BaseClass(map, mapSettings, debugName, parent) {}
bool initializeObjectFactory() override
{
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::MapObjectIndicator), new SituationMap::GenericObjectFactory<SituationMap::MapObjectIndicatorImpl>());
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::Cube), new SituationMap::GenericObjectFactory<SituationMap::CubeImpl>());
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::Polygon), new SituationMap::GenericObjectFactory<SituationMap::PolygonImpl>());
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::Polyline), new SituationMap::GenericObjectFactory<SituationMap::PolylineImpl>());
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::Text), new SituationMap::GenericObjectFactory<SituationMap::TextImpl>());
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::Participant), new SituationMap::GenericObjectFactory<SituationMap::ParticipantImpl>());
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::AreaFire), new SituationMap::GenericObjectFactory<SituationMap::AreaFireImpl>());
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::BiologicalAgent), new SituationMap::GenericObjectFactory<SituationMap::BiologicalAgentImpl>());
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::ChemicalAgent), new SituationMap::GenericObjectFactory<SituationMap::ChemicalAgentImpl>());
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::BuildingOutline), new SituationMap::GenericObjectFactory<SituationMap::BuildingOutlineImpl>());
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::DangerArea), new SituationMap::GenericObjectFactory<SituationMap::DangerAreaImpl>());
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::FunctionalArea), new SituationMap::GenericObjectFactory<SituationMap::FunctionalAreaImpl>());
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::GeoImage), new SituationMap::GenericObjectFactory<SituationMap::GeoImageImpl>());
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::HitLine), new SituationMap::GenericObjectFactory<SituationMap::HitLineImpl>());
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::Mine), new SituationMap::GenericObjectFactory<SituationMap::MineImpl>());
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::MineField), new SituationMap::GenericObjectFactory<SituationMap::MineFieldImpl>());
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::NineLiner), new SituationMap::GenericObjectFactory<SituationMap::NineLinerImpl>());
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::NuclearAgent), new SituationMap::GenericObjectFactory<SituationMap::NuclearAgentImpl>());
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::SingleFire), new SituationMap::GenericObjectFactory<SituationMap::SingleFireImpl>());
// SituationMap::ObjectFactory::registerMe(typeid(SituationMap::SingleFireCentral), new SituationMap::GenericObjectFactory<SituationMap::SingleFireCentralImpl>());
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::SidcSymbol), new SituationMap::GenericObjectFactory<SituationMap::SidcSymbolImpl>());
return true;
} // initializeObjectFactory()
// overload to support tpk-Files/BasemapBuiltIn
bool initializeCoordTranslationFunctor() override
{
if (m_map.layerFactory().isUsingBaseMapBuiltIn())
{
int wkid = 102100;
NOTICE_LOG(m_logger) << LOGFUNCTION << "\e[31m !!! using BaseMapBuiltIn -> wkId=" << wkid << "\e[0m";
m_map.initCoordTranslationFunctor();
return true;
}
return BaseClass::initializeCoordTranslationFunctor();
}
AdvancedSymbology::SymbologyType symbologyType() const override
{
return m_symbologyType;
} // symbologyType
void setSymbologyType(AdvancedSymbology::SymbologyType symbologyType)
{
m_symbologyType = symbologyType;
}
protected slots:
void onMapReady() override
{
// using center and scale:
m_map.setCenterPoint(QPointF(92750, 80525)); // QPointF(92750, 80525) -> Rennplatz - Bremen
m_map.setScale(3000000); // 3000000 -> Lower Saxony
// instead of "center and scale" it is possible to set an extent
// double xmin, double ymin, double xmax, double ymax
// m_map.setExtent(-200000, -200000, 300000, 300000);
// minMaxScale is optional:
// m_map.setMinScale(10000000);
// m_map.setMaxScale(100);
}
protected:
AdvancedSymbology::SymbologyType m_symbologyType = AdvancedSymbology::SymbologyType::APP6B;
}; // myMapInitializer
using namespace SituationMap;
class SitMap::Private
{
public:
Private() = default;
~Private() = default;
// map
AdvancedSymbology::SymbologyType m_symbologyType;
SituationMap::Map *m_map = nullptr;
// admin
QGridLayout *m_mainLayout = nullptr;
QPushButton *m_pbDestroyMap = nullptr;
QPushButton *m_pbQuit = nullptr;
QTimer *m_getRotationTimer = nullptr;
}; // class SitMap::Private
//-----------------------------------------------------------------------------
SitMap::SitMap(AdvancedSymbology::SymbologyType symbologyType, QWidget *parent)
: QDialog(parent)
, m_logger(SituationMap::getLogger("SitMap"))
, d(new Private)
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
this->setObjectName(QLatin1String("SitMap-Widget"));
d->m_symbologyType = symbologyType;
d->m_mainLayout = new QGridLayout(this);
d->m_mainLayout->setObjectName(QLatin1String("layout"));
//-----------------------------------
// Buttons
//-----------------------------------
d->m_pbDestroyMap = new QPushButton(QLatin1String("Destroy Map"));
d->m_mainLayout->addWidget(d->m_pbDestroyMap, 0, 0);
connect(d->m_pbDestroyMap, &QPushButton::clicked, this, &SitMap::onCreateDestroyClicked);
//-----------------------------------
// Map
//-----------------------------------
createMap();
{
QGridLayout *bottomLayout = new QGridLayout();
bottomLayout->setObjectName(QLatin1String("bottomLayout"));
d->m_mainLayout->addLayout(bottomLayout, 2, 0);
d->m_pbQuit = new QPushButton(QLatin1String("Quit"));
connect(d->m_pbQuit, &QPushButton::clicked, [ = ]()
{
QCoreApplication::quit();
});
bottomLayout->addWidget(d->m_pbQuit, 0, 0);
// tbc
}
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
}
SitMap::~SitMap()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
delete d->m_map;
delete d;
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
}
bool SitMap::isReady()
{
return d->m_map->isReady();
}
SituationMap::Map *SitMap::map()
{
return d->m_map;
}
void SitMap::onCreateDestroyClicked()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
static bool destroy = false;
destroy = !destroy;
if (destroy)
{
d->m_pbDestroyMap->setText(QLatin1String("Create Map"));
d->m_getRotationTimer->stop(); // to avoid slot being called
d->m_map->deleteLater();
}
else
{
d->m_pbDestroyMap->setText(QLatin1String("Destroy Map"));
createMap();
}
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
}
void SitMap::createMap()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
// 1. Map
d->m_map = SituationMap::Map::create(this);
connect(d->m_map, &SituationMap::Map::mapReady, this, [this]()
{
this->update(); // to fix redraw problem
DEBUG_LOG(m_logger) << " ===== emitting mapReady";
emit mapReady();
// Timer
d->m_getRotationTimer = new QTimer(this);
connect(d->m_getRotationTimer, &QTimer::timeout, this, [this]()
{
DEBUG_LOG(m_logger) << " get rotationDegree of=" << d->m_map->rotation();
});
d->m_getRotationTimer->setSingleShot(true);
d->m_getRotationTimer->start(2000);
});
connect(d->m_map, &SituationMap::Map::mapReadyAndSymbolDictionaryLoaded, this, [this]()
{
DEBUG_LOG(m_logger) << " ===== emitting mapReadyAndSymbolDictionaryLoaded";
emit mapReadyAndSymbolDictionaryLoaded();
});
// e.g. TDS-build/share/Lts/situation_map/situation_map_defaults.ini
QString initFilePath = NGL::findFile(NGL::FileType::ConfigFile, QStringLiteral("situation_map_defaults.ini"));
if (initFilePath.isEmpty())
{
FATAL_LOG(m_logger) << " initFilePath " << initFilePath;
abort();
}
SituationMap::MapSettings *mapSettings = new SituationMap::MapSettings(initFilePath, d->m_map);
myMapInitializer *mapInitializer = new myMapInitializer(*d->m_map, *mapSettings, QLatin1String("ModuleTest"), d->m_map);
// Take SymbologyType from argv not from ini file:
AdvancedSymbology::SymbologyType symbologyTypeArgv = d->m_symbologyType;
mapInitializer->setSymbologyType(symbologyTypeArgv);
if (mapInitializer->hasErrors())
{
FATAL_LOG(m_logger) << LOGFUNCTION << " MapInitializer-filename='" << mapInitializer->filename()
<< "'' has following errors: "
<< " exists = " << mapInitializer->exists()
<< " accessError = " << mapInitializer->accessError()
<< " formatError = " << mapInitializer->formatError();
return;
}
else
{
if (mapInitializer->initMap())
{
INFO_LOG(m_logger) << LOGFUNCTION << " MapInitializer::initMap() ok";
}
else
{
ERROR_LOG(m_logger) << LOGFUNCTION << " MapInitializer::initMap() failed";
}
}
DEBUG_LOG(m_logger) << LOGFUNCTION << " GridLevelCount=" << d->m_map->grid().levelCount();
// BasePoint, extent, rotation
connect(d->m_map, &SituationMap::Map::extentChanged, this, [ = ]()
{
DEBUG_LOG(m_logger) << LOGFUNCTION << " extent changed: ";
});
// Add widget
d->m_mainLayout->addWidget(d->m_map, 1, 0);
// 50. turn over to application (if required):
// Create FunctionDialog:
SituationMap::FunctionDialog::addButtonToMap(d->m_map);
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
}
#include "sit_map.moc"