Initial commit

This commit is contained in:
torsten committed 2026-08-13 18:33:10 +02:00
commit b7d90b9afe
16245 files changed
+3396666

No files matched your search

+53
View File
@@ -0,0 +1,53 @@
#
# $Id$
# $HeadURL$
# $Author$
#
# SIT_MAP
SET(SIT_MAP_EXE_SRCS
sit_map_main.cpp
sit_map.cpp
sit_map.h
log4cxx_sitmapMain.props
)
NGL_ADD_EXECUTABLE(WS NO_TRANSLATION sitMapExample ${SIT_MAP_EXE_SRCS})
NGL_TARGET_LINK_LIBRARIES(sitMapExample
Qt5::Network
NGLLogger
nglapplication
LtsPluginManager
LtsPluginLoader
situationMap
situationMapObjects
situationMapFunctionDialog
situationMapSideBar
advancedSymbologyGui
ArcGIS::ArcGIS
ArcGISQt5Hack
# situationMapSideBar
)
# Copy on LIBchanges:
IF(TARGET sitMapExample)
SET(LOG4CXX_PROPS_FILE log4cxx_sitmapMain.props)
ADD_CUSTOM_COMMAND(TARGET sitMapExample POST_BUILD
COMMAND ${CMAKE_COMMAND}
ARGS -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/${LOG4CXX_PROPS_FILE} $<TARGET_FILE_DIR:sitMapExample>/${LOG4CXX_PROPS_FILE}
)
ENDIF()
IF(MSVC)
# Configure the template file
SET(VS_USER_FILE sitMapExample.vcxproj.user)
configure_file( ../../SituationMap.vcxproj.user.in ${CMAKE_CURRENT_BINARY_DIR}/${VS_USER_FILE} @ONLY)
ENDIF(MSVC)
NGL_INSTALL_TARGET(sitMapExample)
NGL_INSTALL(FILES WS ${CMAKE_CURRENT_SOURCE_DIR}/${LOG4CXX_PROPS_FILE} DESTINATION "bin")
@@ -0,0 +1,175 @@
log4j.reset=true
log4j.rootLogger=INFO, file, stdout
# SitMap
###########################################################
log4j.logger.SituationMap.sitmapMain=INFO
log4j.logger.SituationMap.SitMap=INFO
# AdvancedSymbology (AdvSymbology)
###########################################################
#log4j.logger.AdvSymbology.SymbolDictionary=INFO
#log4j.logger.AdvSymbology.SymbolDictionaryImpl=INFO
#log4j.logger.AdvSymbology.EsriDictionaryProcessor=INFO
#log4j.logger.AdvSymbology.SymbolResult=INFO
#log4j.logger.AdvSymbology.Sidc2525Delta=INFO
# SituationMap
###########################################################
#log4j.logger.SituationMap.INFO
#log4j.logger.SituationMap.MapImpl=INFO
#log4j.logger.SituationMap.MapSettings=INFO
#log4j.logger.SituationMap.MapInitializer=INFO
#log4j.logger.SituationMap.JumpPoints=INFO
#log4j.logger.SituationMap.LayerFactoryImpl=INFO
#log4j.logger.SituationMap.LogicalLayer=INFO
#log4j.logger.SituationMap.LayerControl=INFO
#log4j.logger.SituationMap.CoordTranslationFunctorImpl=INFO
#log4j.logger.SituationMap.CoordTranslationThread=INFO
#log4j.logger.SituationMap.PositionsTranslated=INFO
#log4j.logger.SituationMap.GridImpl=INFO
#log4j.logger.SituationMap.ObjectFactory=INFO
#log4j.logger.SituationMap.IdGenerator=INFO
#log4j.logger.SituationMap.ObjectContainer=INFO
#log4j.logger.SituationMap.ObjectContainerCTC=INFO
#log4j.logger.SituationMap.OverlayHandlerImpl=INFO
#log4j.logger.SituationMap.OverviewMapHandlerImpl=INFO
#log4j.logger.SituationMap.OverviewMap=INFO
log4j.logger.SituationMap.LocationDisplayImpl=TRACE
log4j.logger.SituationMap.ViewshedImpl=TRACE
log4j.logger.SituationMap.ViewshedBase=TRACE
log4j.logger.SituationMap.AbstractMapObjectImpl=INFO
log4j.logger.SituationMap.AbstractEffectSimulationImpl=INFO
log4j.logger.SituationMap.OriginTranslated=INFO
log4j.logger.SituationMap.PositionsTranslated=INFO
log4j.logger.SituationMap.AbstractMultiPointMapObjectImpl=INFO
log4j.logger.SituationMap.AbstractSinglePointMapObjectImpl=INFO
log4j.logger.SituationMap.BasicPathObjectImpl=INFO
log4j.logger.SituationMap.IndicationContainer=INFO
log4j.logger.SituationMap.PolygonImpl=INFO
log4j.logger.SituationMap.PolylineImpl=INFO
log4j.logger.SituationMap.TextImpl=INFO
log4j.logger.SituationMap.AreaFireImpl=INFO
log4j.logger.SituationMap.BiologicalAgentImpl=INFO
log4j.logger.SituationMap.BuildingOutlineImpl=INFO
log4j.logger.SituationMap.ChemicalAgentImpl=INFO
log4j.logger.SituationMap.DangerAreaImpl=INFO
log4j.logger.SituationMap.FunctionalAreaImpl=INFO
log4j.logger.SituationMap.GeoImageImpl=INFO
log4j.logger.SituationMap.HitLineImpl=INFO
log4j.logger.SituationMap.MapObjectIndicatorImpl=INFO
log4j.logger.SituationMap.MineImpl=INFO
log4j.logger.SituationMap.MineFieldImpl=INFO
log4j.logger.SituationMap.NuclearAgentImpl=INFO
log4j.logger.SituationMap.ParticipantImpl=INFO
log4j.logger.SituationMap.SingleFireImpl=INFO
log4j.logger.SituationMap.AbstractGraphicalObject=INFO
log4j.logger.SituationMap.GraphicalObjectEllipse=INFO
log4j.logger.SituationMap.GraphicalObjectPath=INFO
log4j.logger.SituationMap.GraphicalObjectMultiPath=INFO
log4j.logger.SituationMap.GraphicalObjectPictureMarker=INFO
log4j.logger.SituationMap.GraphicalObjectRange=INFO
log4j.logger.SituationMap.GraphicalObjectText=INFO
log4j.logger.SituationMap.TacticalAppearance=INFO
log4j.logger.SituationMap.EventDispatcher=INFO
log4j.logger.SituationMap.Rubberband=DEBUG
log4j.logger.SituationMap.RubberbandRectangle=INFO
log4j.logger.SituationMap.RubberbandDrawablesAndHandles=INFO
log4j.logger.SituationMap.RubberbandFrameHandle=INFO
log4j.logger.SituationMap.RubberbandPointHandle=INFO
log4j.logger.SituationMap.RubberbandStateSelect=INFO
log4j.logger.SituationMap.ObjectIndicatorImpl=INFO
# SituationMap-SideBar
###########################################################
log4j.logger.SituationMap.SideBar=INFO
log4j.logger.SituationMap.SideBarItem=INFO
log4j.logger.SituationMap.SideBarModel=INFO
# PlanEditor
###########################################################
log4j.logger.SituationMap.PlanEditor=TRACE
log4j.logger.SituationMap.PlanRenderer=TRACE
# Appnd_File
###########################################################
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.MaxFileSize=1MB
log4j.appender.file.MaxBackupIndex=9
log4j.appender.file.file=${LOG4QT_LOGDIR}/${LOG4QT_USER}_SituationMap.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d %-5p %c |#| %m (%.50F:%L) %n
# Appnd_Console
###########################################################
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern= %d %-5p %c{1} |#| %m (%-.30F:%L) %n
#log4j.appender.stdout.layout.ConversionPattern= %d %-5p %-30c |#| %m (%-.30F:%L) %n
# Appnd_Syslog
###########################################################
log4j.appender.syslog=org.apache.log4j.SyslogAppender
log4j.appender.syslog.Threshold=ERROR
log4j.appender.syslog.SysLogHost=localhost
log4j.appender.syslog.Facility=LOCAL7
log4j.appender.syslog.layout=org.apache.log4j.PatternLayout
log4j.appender.syslog.layout.ConversionPattern= %-4r %-5p %c %x - %m
log4j.appender.syslog.LevelRangeFilter.AcceptOnMatch=true
log4j.appender.syslog.LevelRangeFilter.LevelMin=INFO
log4j.appender.syslog.LevelRangeFilter.LevelMax=FATAL
###########################################################
###########################################################
###########################################################
# 1) Available Levels in LOG4CXX Version 0.10.0:
# TRACE,
# DEBUG,
# INFO,
# WARN,
# ERROR
# FATAL
#
# d = date/time
# p = priority (Level)
# c = category/channel
# m = message
# F = file
# L = line
# n = platform dependent line separator character or characters.
# ....
#
# Examples for console:
# a)
# %d %p %c #%m# (%.50F:%L)%n
# date/time
# priority
# category/channel
# #message#
# (Maximal 50Character des Filename von rechts:Line)
# line separator
#
# b)
# %d (%.15F:%L) %-5p %c |#| %m%n
# date/time
# (Maximal 15Character des Filename von rechts:Line)
# priority, Right pad with spaces if the priority name is less than 5 characters long.
# category/channel
# message
# line separator
#
+688
View File
@@ -0,0 +1,688 @@
/**
* @RDE_HEADER@
* Interface
* $Id$
* $HeadURL$
* $Author$
*/
// Own
#include "sit_map.h"
#include <ngltools/ngltools_filesystem.h>
#include <Map/grid.h>
#include <Map/situation_map_utils.h>
#include <Symbology/symbol_dictionary.h>
#include <Map/map_initializer.h>
#include <Map/object_factory.h>
#include <Map/camera.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/line_of_sight_impl.h>
#include <MapObjectsImpl/map_object_attributes_impl.h>
#include <MapObjectsImpl/map_object_indicator_impl.h>
#include <MapObjectsImpl/mine_impl.h>
#include <MapObjectsImpl/mine_field_impl.h>
#include <MapObjectsImpl/nuclear_agent_impl.h>
#include <MapObjectsImpl/participant_impl.h>
#include <MapObjectsImpl/single_fire_impl.h>
//#include <MapObjectsImpl/single_fire_central_impl.h>
#include <MapObjectsImpl/sound_area_impl.h>
#include <MapImpl/sidc_symbol_impl.h>
#include <MapImpl/sight_fan_impl.h>
#include <Map/camera.h>
#include <Map/viewshed.h>
#include <FunctionDialog/function_dialog.h>
#include <QStackedLayout>
#include <SideBar/side_bar.h>
#include <Map/party_id_to_color_functor.h>
// PlanModel:
#include <GeometryModel/geometry_model_factory.h>
#include <GeometryModel/geometry_model.h>
#include <Map/geometry_model_renderer.h>
// Qt
#include <QApplication>
#include <QTimer>
#include <QPushButton>
#include <QComboBox>
#include <QGridLayout>
#include <QSharedPointer>
#include <QGraphicsView>
#include <QGraphicsProxyWidget>
#include <QMenu>
#include <QFileDialog>
#include <QDir>
//-----------------------------------------------------------------------------
class myMapInitializer : public SituationMap::MapInitializer
{
Q_OBJECT
using BaseClass = SituationMap::MapInitializer;
public:
explicit myMapInitializer(SituationMap::Map &map
, SituationMap::MapSettings &mapSettings
, const QString &debugName)
: SituationMap::MapInitializer(map, mapSettings, debugName)
{}
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::LineOfSight), new SituationMap::GenericObjectFactory<SituationMap::LineOfSightImpl>() );
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::MapObjectAttributes), new SituationMap::GenericObjectFactory<SituationMap::MapObjectAttributesImpl>() );
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::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::SoundArea), new SituationMap::GenericObjectFactory<SituationMap::SoundAreaImpl>() );
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::SidcSymbol), new SituationMap::GenericObjectFactory<SituationMap::SidcSymbolImpl>() );
SituationMap::ObjectFactory::registerMe(typeid(SituationMap::SightFan), new SituationMap::GenericObjectFactory<SituationMap::SightFanImpl>());
return true;
} // initializeObjectFactory()
AdvancedSymbology::SymbologyType symbologyType() const override
{
return m_symbologyType;
} // symbologyType
void setSymbologyType(AdvancedSymbology::SymbologyType symbologyType)
{
m_symbologyType = symbologyType;
}
protected:
AdvancedSymbology::SymbologyType m_symbologyType = AdvancedSymbology::SymbologyType::APP6B;
};
//-----------------------------------------------------------------------------
class SitMap::Private
{
public:
Private() = default;
~Private() = default;
// map
QPointer<SituationMap::Map> m_map = nullptr;
bool m_demoMode = false;
QStackedLayout* m_stackedLayout = nullptr;
QSharedPointer<SituationMap::MapSettings> m_mapSettings;
QSharedPointer<myMapInitializer> m_mapInitializer;
// admin
QGridLayout* m_mainLayout = nullptr;
QPushButton* m_pbDestroyMap = nullptr;
QPushButton* m_pbToggleMode = nullptr;
SituationMap::Viewpoint2D m_viewpoint4Toggle;
QPushButton* m_pbQuit = nullptr;
QComboBox* m_cbIniFile = nullptr;
QString m_initFilePath;
QComboBox* m_cb2D3D = nullptr;
QComboBox* m_cbSymbologyType = nullptr;
int symbologyType() const
{
if (m_cbSymbologyType)
{
return m_cbSymbologyType->currentData().toInt();
}
return -1;
}
QPushButton* m_pbPlan = nullptr;
QMenu* m_popupMenu = nullptr;
QTimer* m_getRotationTimer = nullptr;
}; // class SitMap::Private
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//SitMap
//-----------------------------------------------------------------------------
SitMap::SitMap(bool demoMode, QWidget *parent)
: QDialog(parent)
, m_logger(SituationMap::getLogger("SitMap"))
, d(new Private)
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
this->setObjectName( QLatin1String("SitMapExample-Widget") );
d->m_mainLayout = new QGridLayout(this);
d->m_mainLayout->setObjectName( QLatin1String("SitMapExample-MainLayoutGrid") );
//-----------------------------------
// Buttons
//-----------------------------------
QVariant data;
QGridLayout* topLayout = new QGridLayout();
topLayout->setObjectName( QLatin1String("SitMapExample-TopLayoutGrid") );
d->m_mainLayout->addLayout(topLayout, 0, 0);
d->m_cbIniFile = new QComboBox();
d->m_cbIniFile->setObjectName( QLatin1String("SitMapExample-IniFileComboBox") );
topLayout->addWidget(d->m_cbIniFile, 0, 0);
d->m_cbIniFile->addItem(QStringLiteral("situation_map_defaults.ini"), QLatin1String("situation_map_defaults.ini"));
d->m_cbIniFile->addItem(QStringLiteral("situation_map_ahtc.ini"), QLatin1String("situation_map_ahtc.ini"));
d->m_cbIniFile->addItem(QStringLiteral("situation_map_demo_center.ini"), QLatin1String("situation_map_demo_center.ini"));
d->m_cbIniFile->addItem(QStringLiteral("situation_map_guez.ini"), QLatin1String("situation_map_guez.ini"));
d->m_cbIniFile->addItem(QStringLiteral("situation_map_land400.ini"), QLatin1String("situation_map_land400.ini"));
d->m_cbIniFile->addItem(QStringLiteral("situation_map_qatar.ini"), QLatin1String("situation_map_qatar.ini"));
d->m_cbIniFile->addItem(QStringLiteral("situation_map_luxemburg.ini"), QLatin1String("situation_map_luxemburg.ini"));
d->m_cbIniFile->addItem(QStringLiteral("select"), QString());
onIniFileActivated(d->m_cbIniFile->currentText());
connect(d->m_cbIniFile, QOverload<const QString&>::of(&QComboBox::activated),
this, &SitMap::onIniFileActivated);
d->m_cbSymbologyType = new QComboBox();
d->m_cbSymbologyType->setObjectName( QLatin1String("SitMapExample-SymbologyComboBox") );
topLayout->addWidget(d->m_cbSymbologyType, 0, 1);
// debugging :
if (0)
{
// highlighted -> UserInteraction
connect(d->m_cbSymbologyType, static_cast<void (QComboBox::*)(int)>(&QComboBox::highlighted), this, [](int idx){
qCritical() << " called: highlighted(int) " << idx;
});
// currentIndexChanged -> programmatically & UserInteraction
connect(d->m_cbSymbologyType, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, [](int idx){
qCritical() << " called: currentIndexChanged(int) " << idx;
});
// activated -> UserInteraction
connect(d->m_cbSymbologyType, static_cast<void (QComboBox::*)(int)>(&QComboBox::activated), this, [](int idx)
{
qCritical() << " called: activated(int) " << idx;
});
} //
// : debugging
d->m_cb2D3D = new QComboBox();
d->m_cb2D3D->setObjectName( QLatin1String("SitMapExample-cb2D3D") );
data.setValue(SituationMap::Mode::Mode_2D);
d->m_cb2D3D->addItem(QStringLiteral("2D"), data);
data.setValue(SituationMap::Mode::Mode_3D);
d->m_cb2D3D->addItem(QStringLiteral("3D"), data);
topLayout->addWidget(d->m_cb2D3D, 0, 2);
d->m_pbDestroyMap = new QPushButton( QLatin1String("Create Map") );
d->m_pbDestroyMap->setObjectName( QLatin1String("SitMapExample-CreateDestroyMapButton") );
topLayout->addWidget(d->m_pbDestroyMap, 0, 3);
connect(d->m_pbDestroyMap, &QPushButton::clicked, this, &SitMap::onCreateDestroyClicked);
d->m_pbToggleMode = new QPushButton( QLatin1String("Toggle Mode") );
d->m_pbToggleMode->setObjectName( QLatin1String("SitMapExample-ToggleModeButton") );
topLayout->addWidget(d->m_pbToggleMode, 0, 4);
connect(d->m_pbToggleMode, &QPushButton::clicked, this, &SitMap::onToggleModeClicked);
d->m_pbToggleMode->setDisabled(true);
AdvancedSymbology::SymbologyType symType;
symType = AdvancedSymbology::SymbologyType::MIL2525D;
data.setValue(symType); d->m_cbSymbologyType->addItem(AdvancedSymbology::toString(symType), data);
symType = AdvancedSymbology::SymbologyType::MIL2525C;
data.setValue(symType); d->m_cbSymbologyType->addItem(AdvancedSymbology::toString(symType), data);
symType = AdvancedSymbology::SymbologyType::APP6B;
data.setValue(symType); d->m_cbSymbologyType->addItem(AdvancedSymbology::toString(symType), data);
symType = AdvancedSymbology::SymbologyType::APP6D;
data.setValue(symType); d->m_cbSymbologyType->addItem(AdvancedSymbology::toString(symType), data);
symType = AdvancedSymbology::SymbologyType::None;
data.setValue(symType); d->m_cbSymbologyType->addItem(AdvancedSymbology::toString(symType), data);
d->m_cbSymbologyType->setCurrentText(AdvancedSymbology::toString(AdvancedSymbology::SymbologyType::APP6D));
//-----------------------------------
// Map
//-----------------------------------
// createMap();
{
QGridLayout* bottomLayout = new QGridLayout();
bottomLayout->setObjectName( QLatin1String("SitMapExample-TopBottomLayoutGrid") );
d->m_mainLayout->addLayout(bottomLayout, 2, 0);
d->m_pbPlan = new QPushButton( QLatin1String("Plan") );
d->m_pbPlan->setObjectName( QLatin1String("SitMapExample-Plan") );
connect(d->m_pbPlan, &QPushButton::clicked, this, &SitMap::onPlanClicked);
bottomLayout->addWidget(d->m_pbPlan, 0, 0);
d->m_pbQuit = new QPushButton( QLatin1String("Quit") );
d->m_pbQuit->setObjectName( QLatin1String("SitMapExample-Quit") );
bottomLayout->addWidget(d->m_pbQuit, 1, 0);
connect(d->m_pbQuit, &QPushButton::clicked, []() {
QCoreApplication::quit();
});
// tbc
}
if (demoMode)
{
// topLayout
d->m_cbSymbologyType->hide();
d->m_cb2D3D->hide();
d->m_pbDestroyMap->hide();
// bottomLayout
d->m_pbPlan->hide();
// createMap:
onCreateDestroyClicked();
} // if (demoMode)
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
}
SitMap::~SitMap()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
delete d;
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
}
SituationMap::Map *SitMap::map()
{
return d->m_map;
}
void SitMap::onCreateDestroyClicked()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
static bool destroy = true;
destroy = !destroy;
if (destroy)
{
d->m_cbIniFile->setEnabled(true);
d->m_cbSymbologyType->setEnabled(true);
d->m_cb2D3D->setEnabled(true);
d->m_pbDestroyMap->setText( QLatin1String("Create Map") );
if (d->m_getRotationTimer)
d->m_getRotationTimer->stop(); // to avoid slot being called
delete d->m_map;
} else {
d->m_cbIniFile->setEnabled(false);
d->m_cbSymbologyType->setEnabled(false);
d->m_cb2D3D->setEnabled(false);
d->m_pbDestroyMap->setText( QLatin1String("Destroy Map") );
createMap();
}
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
}
void SitMap::onToggleModeClicked()
{
NOTICE_LOG(m_logger) << LOGFUNCTION << " START" << " curMode=" << d->m_cb2D3D->currentText();
d->m_pbToggleMode->setDisabled(true);
d->m_viewpoint4Toggle = d->m_map->viewpoint2D();
qCritical() << " save last d->m_viewpoint4Toggle=" << d->m_viewpoint4Toggle.toString();
// toogle mode:
SituationMap::Mode newMapMode = SituationMap::toggleMode(d->m_map->mode());
// destroy:
onCreateDestroyClicked();
// rebuild
QVariant data;
data.setValue(newMapMode);
int idx = d->m_cb2D3D->findData(data);
d->m_cb2D3D->setCurrentIndex(idx);
// create
onCreateDestroyClicked();
}
void SitMap::createMap()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
d->m_map = SituationMap::Map::create(this);
d->m_map->setObjectName(QLatin1String("SitMapExample-Map"));
// d->m_mainLayout->addWidget(d->m_map, 1, 0);
if (!d->m_stackedLayout)
d->m_stackedLayout = new QStackedLayout();
d->m_stackedLayout->setStackingMode(QStackedLayout::StackAll);
d->m_mainLayout->addLayout(d->m_stackedLayout, 1, 0);
d->m_stackedLayout->addWidget(d->m_map);
NOTICE_LOG(m_logger) << LOGFUNCTION << " iniFile = '" << d->m_initFilePath << "'";
d->m_mapSettings = QSharedPointer<SituationMap::MapSettings> ( new SituationMap::MapSettings(d->m_initFilePath) );
d->m_mapInitializer = QSharedPointer<myMapInitializer>
( new myMapInitializer(*d->m_map, *d->m_mapSettings, QLatin1String("SitMapExample")) );
// toggle?
if (! d->m_viewpoint4Toggle.isNull())
d->m_mapInitializer->setViewPoint(d->m_viewpoint4Toggle);
// Take SymbologyType from UI and not from ini file:
int symbologyTypeInt = d->symbologyType();
if (symbologyTypeInt == -1)
{
ERROR_LOG(m_logger) << LOGFUNCTION << " Error retrieving symbologyType";
abort();
}
AdvancedSymbology::SymbologyType symbologyTypeUI =
static_cast<AdvancedSymbology::SymbologyType>(symbologyTypeInt);
d->m_mapInitializer->setSymbologyType(symbologyTypeUI);
if (d->m_mapInitializer->hasErrors())
{
FATAL_LOG(m_logger) << LOGFUNCTION << " MapInitializer-filename='" << d->m_mapInitializer->filename()
<< "'' has following errors: "
<< " exists = " << d->m_mapInitializer->exists()
<< " accessError = " << d->m_mapInitializer->accessError()
<< " formatError = " << d->m_mapInitializer->formatError();
return;
} else {
const SituationMap::Mode mapMode = d->m_cb2D3D->currentData().value<SituationMap::Mode>();
if (d->m_mapInitializer->initMap(mapMode) )
{
INFO_LOG(m_logger) << LOGFUNCTION << " MapInitializer::initMap() ok";
} else {
ERROR_LOG(m_logger) << LOGFUNCTION << " MapInitializer::initMap() failed";
return;
}
}
// 50. turn over to application (if required):
d->m_map->setTimeString(QStringLiteral("#"));
// connect (d->m_map.data(), &SituationMap::Map::mapObjectsClicked, this, &SitMap::onMapObjectClicked);
connect( d->m_map.data()
, &SituationMap::Map::contextMenuClicked
, this
, &SitMap::onMapContextClicked );
if (d->m_map->isReady())
d->m_pbToggleMode->setEnabled(true);
else
connect(d->m_map.data(), &SituationMap::Map::mapReady, this, [this]() {
d->m_pbToggleMode->setEnabled(true);
});
// Create FunctionDialog:
SituationMap::FunctionDialog::addButtonToMap(d->m_map);
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
} // SitMap::createMap
static QVector<SituationMap::RefPointer<SituationMap::Participant>>& participantMap()
{
static QVector<SituationMap::RefPointer<SituationMap::Participant>> s_participantCont;
return s_participantCont;
}
void SitMap::onPlanClicked()
{
if (!d->m_map || !d->m_map->isReady())
return;
const SituationMap::PartyIdToColorFunctor::PartyData pData1(QStringLiteral("P1"),
AdvancedSymbology::Role::Friend,
Qt::blue, Qt::blue);
const SituationMap::PartyIdToColorFunctor::PartyData pData2(QStringLiteral("P2"),
AdvancedSymbology::Role::HostileFaker,
Qt::red, Qt::red);
d->m_map->partyIdToColorFunctor().setParty(1, pData1);
d->m_map->partyIdToColorFunctor().setParty(2, pData2);
const QSize windowSize = this->size();
const QSize offset(50, 50);
SituationMap::LayerFactory &layerFac = d->m_map->layerFactory();
QStringList layernames = layerFac.layernames(SituationMap::LayerType::Operational);
QString layername = layernames[0];
layername = QStringLiteral("Participants");
SituationMap::ObjectFactory &objFac = d->m_map->objectFactory();
SituationMap::RefPointer<SituationMap::Participant> participant;
int counter = 0;
int partyId = 1;
for (int x = offset.width(); x<windowSize.width()-offset.width(); x+=offset.width())
{
for (int y = offset.height(); y<windowSize.height()-offset.height(); y+=offset.height())
{
++counter;
QString debugName = QString(QStringLiteral("ModuleTestId1 cnt=%1")).arg(counter);
QPointF geoCoord = d->m_map->viewPortWindowPointToGeoCoordinate(QPointF(x,y));
SituationMap::SymbolData symData;
symData.sidc = QStringLiteral("AP6D|CMPL|10031000111205000000");
symData.color = Qt::cyan; // Will be overwritten via partyId.
participant = objFac.create<SituationMap::Participant>(layername, debugName);
participantMap().append(participant);
participant->setOrigin(SituationMap::Point3D::fromQPointF(geoCoord));
participant->setSymbol(symData);
if (partyId == 2)
partyId = 1;
else
partyId = 2;
participant->setPartyId(partyId);
if (!participant->updateView())
{
qCritical() << "updateView failed: debugName='" << debugName << "'";
abort();
}
} // for
} // for
QTimer *timer = new QTimer(this);
timer->setInterval(150);
static int s_partyId = 1;
static int s_finishCounter=0;
connect(timer, &QTimer::timeout, this, [timer]() {
qCritical() << " new partyId= " << s_partyId << " count=" << participantMap().size() << ")";
++s_finishCounter;
if (s_finishCounter>10)
timer->stop();
int counter = rand()%5;
for(auto participant : qAsConst(participantMap()))
{
int curPartyId = participant->partyId();
if (curPartyId == 2)
curPartyId = 1;
else
curPartyId = 2;
participant->setPartyId(curPartyId);
SituationMap::SymbolData symData = participant->symbol();
int mod = ((++counter)%9);
switch (mod)
{
case 0: symData.sidc = QStringLiteral("AP6D|CMPL|10031000111205000000"); break;
case 1: symData.sidc = QStringLiteral("AP6D|CMPL|10031500001202000000"); break;
case 2: symData.sidc = QStringLiteral("AP6D|CMPL|10031500001302000000"); break;
case 3: symData.sidc = QStringLiteral("AP6D|CMPL|10031500001402000000"); break;
case 4: symData.sidc = QStringLiteral("AP6D|CMPL|10031500001502000000"); break;
case 5: symData.sidc = QStringLiteral("AP6D|CMPL|10031500001602000000"); break;
case 6: symData.sidc = QStringLiteral("AP6D|CMPL|10031500001702000000"); break;
case 7: symData.sidc = QStringLiteral("AP6D|CMPL|10031500001802000000"); break;
case 8: symData.sidc = QStringLiteral("AP6D|CMPL|10031500001902000000"); break;
}
participant->setSymbol(symData);
if (!participant->updateView())
{
qCritical() << "updateView failed:";
abort();
}
}
});
timer->start();
}
void SitMap::onMapObjectClicked(const SituationMap::Map::RefPointerMapObjectList & mapObjList, const QPointF &viewportPosition)
{
DEBUG_LOG(m_logger) << LOGFUNCTION << "START onMapObjectClicked"
<< " viewportPosition=" << viewportPosition
<< " mapObjList.size()=" << mapObjList.size();
for (auto mapObj : mapObjList)
{
DEBUG_LOG(m_logger) << LOGFUNCTION << " id=" << mapObj->uniqueMapId()
<< " object-debugInfo=" << mapObj->debugInfo()
<< " object-identifier=" << mapObj->identifier();
// Selection:
if (mapObj->pickable())
{
mapObj->setSelected(!mapObj->selected());
mapObj->updateView();
DEBUG_LOG(m_logger) << LOGFUNCTION << (mapObj->selected() ? " is selected" : " is not selected");
}
}
DEBUG_LOG(m_logger) << LOGFUNCTION << "END onMapObjectClicked";
}
void SitMap::onMapContextClicked(const SituationMap::Map::RefPointerMapObjectList & mapObjList, const QPointF & pos)
{
DEBUG_LOG(m_logger) << LOGFUNCTION << "START onMapContextClicked window pos x=" << pos.x() << " y=" << pos.y()
<< " mapObjList.size()=" << mapObjList.size();
return;
// delete d->m_popupMenu;
// d->m_popupMenu = new QMenu( d->m_map );
// d->m_popupMenu->addSection( QLatin1String("Object at mouse position") );
// for (auto mapObj : mapObjList)
// {
// DEBUG_LOG(m_logger) << LOGFUNCTION << " id=" << mapObj->uniqueMapId()
// << "object-debugInfo=" << mapObj->debugInfo()
// << "object-identifier=" << mapObj->identifier();
// d->m_popupMenu->addAction( mapObj->identifier() );
// }
// d->m_popupMenu->addSeparator();
// // d->m_popupMenu->popup(d->m_map->getQGraphicsView()->mapToGlobal(pos.toPoint()));
// d->m_popupMenu->popup( QPoint(100, 100) );
// DEBUG_LOG(m_logger) << LOGFUNCTION << "END onMapContextClicked";
}
void SitMap::onIniFileActivated(const QString &text)
{
if (text.compare(QLatin1String("select")) == 0)
{
d->m_initFilePath = QFileDialog::getOpenFileName(this,
QLatin1String("get ini file"),
QLatin1String(""),
QLatin1String("Ini files (*.ini)"));
} else {
// e.g. TDS-build/share/Lts/situation_map/situation_map_defaults.ini
d->m_initFilePath = NGL::findFile(NGL::FileType::ConfigFile, text);
}
NOTICE_LOG(m_logger) << LOGFUNCTION << "selected filename= '" << d->m_initFilePath << "'";
}
// SitMap::onMapContextClicked(const SituationMap::Map::RefPointerMapObjectList & mapObjList, const QPoint &)
#include "sit_map.moc"
+50
View File
@@ -0,0 +1,50 @@
/**
* @RDE_HEADER@
* Interface
* $Id$
* $HeadURL$
* $Author$
*/
#pragma once
// Qwn
#include <Common/ref_pointer.h>
#include <Common/situation_map_logging.h>
#include <Map/abstract_map_object.h>
#include <Map/map.h>
// Qt
#include <QDialog>
class SitMap : public QDialog
{
Q_OBJECT
public:
explicit SitMap(bool demoMode, QWidget *parent = nullptr);
virtual ~SitMap ();
SituationMap::Map *map();
public slots:
void onCreateDestroyClicked();
void onToggleModeClicked();
void createMap();
void onPlanClicked();
void onMapObjectClicked (const SituationMap::Map::RefPointerMapObjectList & mapObjList, const QPointF &viewportPosition);
void onMapContextClicked( const SituationMap::Map::RefPointerMapObjectList & mapObjList, const QPointF &pos);
protected slots:
void onIniFileActivated(const QString &text);
private:
SituationMap::LOGGER_T m_logger; ///< Interface of the Logging-Facility
class Private;
Private* d = nullptr;
};
+119
View File
@@ -0,0 +1,119 @@
/**
* @RDE_HEADER@
* Interface
* $Id$
* $HeadURL$
* $Author$
*/
// Own
#include "sit_map.h"
#include <SideBar/side_bar.h>
#include <LtsPluginManager/lts_plugin_loader.h>
#include <PluginInterfaces/style_plugin_interface.h>
#include <PluginInterfaces/project_plugin_interface.h>
#include <nglapplication/nglapplication.h>
#include <NGLLogger/INGLLogger.h>
// Qt
#include <QMessageBox>
#include <QDir>
#include <QNetworkProxy>
#include <QSurface>
// ESRI
//#include <arcgis/ProxySetup.h>
int main (int argc, char* argv[])
{
NGLApplication app ( argc, argv );
// ESRI :
#ifdef Q_OS_WIN
// Force usage of OpenGL ES through ANGLE on Windows
QCoreApplication::setAttribute(Qt::AA_UseOpenGLES);
#endif
// : ESRI
app.createLogger("sitmapMain", "log4cxx_sitmapMain.props");
STARTUP_LOG( app.baseLogger() );
// TODO: load style plugin
//QApplication::setStyle(QLatin1String("rde"));
//QDir::setSearchPaths(QLatin1String("icon"), QStringList(QLatin1String(":/icons/light")));
app.setOrganizationName( QLatin1String( "Rheinmetall Defence Electronics" ) );
app.setApplicationName( QLatin1String( "SituationMap Example Application" ) );
LtsPluginManager::LtsPluginLoader *pluginLoader = LtsPluginManager::LtsPluginLoader::getInstance();
pluginLoader->loadPlugins(LtsPluginManager::PluginType::STYLE, nullptr,
QStringList() << QStringLiteral("rme.light"));
pluginLoader->loadPlugins(LtsPluginManager::PluginType::PROJECT, nullptr,
QStringList() << QStringLiteral("legatus"));
// .. to keep some compatibility to old resource structure TODO: rm !
QDir::setSearchPaths( QLatin1String( "icon" ), QStringList( QLatin1String( ":/style/icons/" ) ) );
QDir::setSearchPaths( QLatin1String( "icon" ), QStringList( QLatin1String( ":/style/" ) ) ); // FIXME: does qt check for recursion ??
if(0)
{
INFO_LOG(app.baseLogger()) << LOGFUNCTION << " set PROXY PROXY PROXY PROXY PROXY PROXY PROXY";
QNetworkProxy proxy;
proxy.setType(QNetworkProxy::HttpProxy);
proxy.setHostName(QLatin1String("213.61.254.67")); // proxy-rde > 213.61.254.67
proxy.setUser(QLatin1String("Norbert Thoden/RH-UBD-BC"));
proxy.setPassword(QLatin1String("RDEWWW11"));
proxy.setPort(8080);
QNetworkProxy::setApplicationProxy(proxy);
} else {
NOTICE_LOG(app.baseLogger()) << LOGFUNCTION << " reset !!! QNETWORKPROXY QNETWORKPROXY QNETWORKPROXY QNETWORKPROXY QNETWORKPROXY !!!";
QNetworkProxy::setApplicationProxy(QNetworkProxy());
}
//QNetworkProxy proxy;
//proxy.setType(QNetworkProxy::HttpProxy);
//proxy.setHostName(QStringLiteral("proxy-rde"));
//proxy.setPort(8080);
//proxy.setUser(QStringLiteral("norbert.thoden@rheinmetall.com"));
//proxy.setPassword(QStringLiteral("RDEWWW11"));
//QNetworkProxy::setApplicationProxy(proxy);
bool demoMode = false;
if (argc == 2)
demoMode = true;
SitMap* sitMap= new SitMap(demoMode);
sitMap->setMinimumWidth(200);
sitMap->setMinimumHeight(200);
sitMap->resize(800, 600);
sitMap->show();
int ret = app.exec();
delete sitMap;
SHUTDOWN_LOG(app.baseLogger());
return ret;
}