/** * @RDE_HEADER@ * Moduletest * $Id$ * $HeadURL$ * $Author$ */ // Own #include "sit_map.h" #include #include //#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include #include // Qt #include #include #include #include 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::ObjectFactory::registerMe(typeid(SituationMap::Cube), new SituationMap::GenericObjectFactory()); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::Polygon), new SituationMap::GenericObjectFactory()); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::Polyline), new SituationMap::GenericObjectFactory()); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::Text), new SituationMap::GenericObjectFactory()); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::Participant), new SituationMap::GenericObjectFactory()); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::AreaFire), new SituationMap::GenericObjectFactory()); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::BiologicalAgent), new SituationMap::GenericObjectFactory()); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::ChemicalAgent), new SituationMap::GenericObjectFactory()); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::BuildingOutline), new SituationMap::GenericObjectFactory()); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::DangerArea), new SituationMap::GenericObjectFactory()); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::FunctionalArea), new SituationMap::GenericObjectFactory()); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::GeoImage), new SituationMap::GenericObjectFactory()); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::HitLine), new SituationMap::GenericObjectFactory()); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::Mine), new SituationMap::GenericObjectFactory()); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::MineField), new SituationMap::GenericObjectFactory()); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::NineLiner), new SituationMap::GenericObjectFactory()); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::NuclearAgent), new SituationMap::GenericObjectFactory()); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::SingleFire), new SituationMap::GenericObjectFactory()); // SituationMap::ObjectFactory::registerMe(typeid(SituationMap::SingleFireCentral), new SituationMap::GenericObjectFactory()); SituationMap::ObjectFactory::registerMe(typeid(SituationMap::SidcSymbol), new SituationMap::GenericObjectFactory()); 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"