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

242 lines
6.3 KiB
C++
Executable File

/**
* @RDE_HEADER@
* Interface-Implementation of Mine
* $Id$
* $HeadURL$
* $Author$
*/
// Own
#include "mine_impl.h"
#include <MapImpl/map_impl.h>
#include <Map/party_id_to_color_functor.h>
#include <GraphicalObjects/graphical_object_ellipse.h>
#include <GraphicalObjects/graphical_object_picture_marker.h>
#include <GraphicalObjects/tactical_appearance.h>
#include <Symbology/sidc_codec.h>
// ESRI
// Qt
#include <QPainter>
#include <QPen>
namespace SituationMap
{
//-----------------------------------------------------------------------------
// constants
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Utils:
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// class MineImpl
//-----------------------------------------------------------------------------
MineImpl::MineImpl(const QString &debugInfo)
: Mine() // Interface
, BaseClass(debugInfo) // Implementation
// , AbstractEffectSimulationImpl() // Secondary implementation
, m_logger(getLogger("MineImpl"))
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
}
MineImpl::~MineImpl()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
}
QString MineImpl::toString() const
{
QString str;
str.append(BaseClass::toString());
// str.append( AbstractEffectSimulationImpl::toString() );
return str;
}
bool MineImpl::state() const
{
return m_state.value();
}
void MineImpl::setState(bool state)
{
m_state = state;
}
SymbolImage MineImpl::symbolImage() const
{
SymbolImage symImage;
GraphicalObjectPictureMarker *pMarker = static_cast<GraphicalObjectPictureMarker *>(m_mainGraphicalObject);
if (pMarker)
{
symImage.setImage(pMarker->image());
symImage.setValid(!symImage.image().isNull());
}
return symImage;
}
bool MineImpl::updateViewImpl()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START"
<< " origin =" << this->origin() //.x() << ", " << this->origin().y()
<< " radius =" << this->radius()
<< " visibility=" << m_visibility
<< " visiTechn=" << m_visibilityTechnical
<< " visiTact=" << m_visibilityTactical;
if (!m_graphicsLayer)
{
ERROR_LOG(m_logger) << LOGFUNCTION << " no graphicsLayer";
return false;
}
if (nullptr == m_mainGraphicalObject)
{
ERROR_LOG(m_logger) << LOGFUNCTION << " no m_mainGraphicalObject";
return false;
}
// image:
GraphicalObjectPictureMarker *pMarker = static_cast<GraphicalObjectPictureMarker *>(m_mainGraphicalObject);
if (m_state.changed())
{
const QImage &img = renderMineSymbol(partyColor(),
20,
m_state.value());
pMarker->setImage(img);
}
pMarker->setOrigin(this->originTranslated());
// tacticalAppearance:
if (m_tacticalAppearance)
{
if (partyChanged())
m_symbol.refValue().color = partyColor();
m_tacticalAppearance->setOrigin(this->originTranslated());
}
bool success = BaseClass::updateViewImpl();
// reset changed:
m_state.reset();
TRACE_LOG(m_logger) << LOGFUNCTION << " END, success=" << success;
return success;
}
bool MineImpl::init(MapImpl *mapImpl, const QString &logicalLayerName)
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
if (mapImpl)
{
switch (mapImpl->symbologyType())
{
case AdvancedSymbology::SymbologyType::APP6D:
case AdvancedSymbology::SymbologyType::MIL2525D:
m_symbol.refValue().sidc = AdvancedSymbology::SidcCodec::encodeComplete(mapImpl->symbologyType(), "10011500002102000000"); // SymbolSet = 15 210100 ; 280000 -> Crash on Click
break;
case AdvancedSymbology::SymbologyType::MIL2525C:
// m_symbol.refValue().sidc = AdvancedSymbology::SidcCodec::encodeComplete(mapImpl->symbologyType(),"GHMPOB----"); // 0754 GHMPOMP--- (Antipersonnel (AP) Mines H) -> Point
m_symbol.refValue().sidc = AdvancedSymbology::SidcCodec::encodeComplete(mapImpl->symbologyType(), "GHMPOB----"); // 0760 GHMPOB---- (Booby Trap H) -> Point
break;
case AdvancedSymbology::SymbologyType::APP6B:
m_symbol.refValue().sidc = AdvancedSymbology::SidcCodec::encodeComplete(mapImpl->symbologyType(), "GUOPVY----"); // APP6B: 2549 GUOPVY---- (Booby Trap U) -> Point
break;
case AdvancedSymbology::SymbologyType::None:
// empty
break;
} // switch
} // if (mapImpl)
bool success = BaseClass::init(mapImpl, logicalLayerName);
if (success)
{
// create underlying object (to save most attributes only there)
if (!m_mainGraphicalObject)
m_mainGraphicalObject = new GraphicalObjectPictureMarker(m_mapImpl->getEsriGeoView(),
m_graphicsLayer,
m_debugInfo + QStringLiteral("#Image"),
m_uniqueMapId);
}
else
ERROR_LOG(m_logger) << LOGFUNCTION << " init failed";
TRACE_LOG(m_logger) << LOGFUNCTION << " END, success=" << success;
return success;
}
QImage MineImpl::renderMineSymbol(const QColor &color, int size, bool filled)
{
QImage image(size, size, QImage::Format_ARGB32);
image.fill(Qt::transparent);
QPainter painter(&image);
QPen pen(color);
pen.setWidth(2); // filled == deactivated == triggered
if (!filled)
pen.setWidth(1); // !filled == active == still armed
painter.setPen(pen);
const int sizeHalf = size / 2.0;
QPointF center(sizeHalf, sizeHalf);
// circle
if (filled)
painter.setBrush(color);
painter.drawEllipse(center, sizeHalf * 0.5, sizeHalf * 0.5);
// lines
QLine newLine(0, sizeHalf, size / 4.0, sizeHalf);
painter.drawLine(newLine);
QTransform trans;
trans.translate(sizeHalf, sizeHalf);
trans.rotate(90);
trans.translate(-sizeHalf, -sizeHalf);
newLine = trans.map(newLine);
painter.drawLine(newLine);
newLine = trans.map(newLine);
painter.drawLine(newLine);
newLine = trans.map(newLine);
painter.drawLine(newLine);
painter.end();
return image;
}
} // namespace SituationMap