242 lines
6.3 KiB
C++
Executable File
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
|