689 lines
25 KiB
C++
Executable File
689 lines
25 KiB
C++
Executable File
/**
|
|
* @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 : std::as_const(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"
|