/** * @RDE_HEADER@ * Interface-Implementation of Mine * $Id$ * $HeadURL$ * $Author$ */ // Own #include "mine_impl.h" #include #include #include #include #include #include // ESRI // Qt #include #include 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(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(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