/** * @RDE_HEADER@ * Interface-Implementation of BuildingOutline * $Id$ * $HeadURL$ * $Author$ */ // Own #include "building_outline_impl.h" #include #include #include #include "Map/object_factory.h" #include // ESRI // Qt namespace SituationMap { //----------------------------------------------------------------------------- // class BuildingOutlineImpl //----------------------------------------------------------------------------- BuildingOutlineImpl::BuildingOutlineImpl(const QString &debugInfo) : BuildingOutline() // Interface , BaseClass(debugInfo) // Implementation , m_logger(getLogger("BuildingOutlineImpl")) { TRACE_LOG(m_logger) << LOGFUNCTION << " START"; m_markerOrigin.setMapObjectImpl(this); TRACE_LOG(m_logger) << LOGFUNCTION << " END"; } BuildingOutlineImpl::~BuildingOutlineImpl() { TRACE_LOG(m_logger) << LOGFUNCTION << " START"; delete m_marker; delete m_modelSceneMarker; TRACE_LOG(m_logger) << LOGFUNCTION << " END"; } PositionCont BuildingOutlineImpl::positions() const { return BaseClass::positions(); } bool BuildingOutlineImpl::setPositions(const PositionCont &posCont) { return BaseClass::setPositions(posCont); } QColor BuildingOutlineImpl::majorColor() const { if (m_forcedMajorColor.isValid()) return m_forcedMajorColor; // use fillColor here: return (m_mainGraphicalObject) ? m_mainGraphicalObject->fillStyle().fillColor() : BaseClass::majorColor(); } LineStyle BuildingOutlineImpl::lineStyle() const { return BaseClass::lineStyle(); } LineStyle &BuildingOutlineImpl::rLineStyle() { return BaseClass::rLineStyle(); } void BuildingOutlineImpl::setLineStyle(const LineStyle &lineStyle) { BaseClass::setLineStyle(lineStyle); } FillStyle BuildingOutlineImpl::fillStyle() const { return BaseClass::fillStyle(); } FillStyle &BuildingOutlineImpl::rFillStyle() { return BaseClass::rFillStyle(); } void BuildingOutlineImpl::setFillStyle(const FillStyle &fillStyle) { BaseClass::setFillStyle(fillStyle); } void BuildingOutlineImpl::setMarker(const Point3D &markerOrigin) { m_markerOrigin.setOrigin(markerOrigin); } BuildingOutline::ModelSceneSymbolData BuildingOutlineImpl::getModelSceneSymbolData() { return m_modelSceneSymolData; } void BuildingOutlineImpl::setModelSceneSymbolData(const BuildingOutline::ModelSceneSymbolData &modelSceneSymbolData) { m_modelSceneSymolData = modelSceneSymbolData; } bool BuildingOutlineImpl::updateViewImpl() { TRACE_LOG(m_logger) << LOGFUNCTION << " START" << " visibility=" << m_visibility << " visiTechn=" << m_visibilityTechnical << " visiTact=" << m_visibilityTactical << " scale=" << m_mainGraphicalObject->scale() << " posCont=" << m_positions.positions() << " url=" << m_modelSceneSymolData.url.toString() << " scale=" << m_modelSceneSymolData.scale << " m_heading=" << m_modelSceneSymolData.heading; bool success = BaseClass::updateViewImpl(); updateViewImplMarker(); if (m_mapImpl->mode() == Mode::Mode_3D) updateModelSceneSymbol(); if (!success) ERROR_LOG(m_logger) << LOGFUNCTION << " updateViewImpl failed"; TRACE_LOG(m_logger) << LOGFUNCTION << " END, success=" << success; return success; } bool BuildingOutlineImpl::updateViewImplMarker() { if (m_markerOrigin.isEmpty()) { delete m_marker; m_marker = nullptr; } else { if (!m_marker) { m_marker = new GraphicalObjectPictureMarker(m_mapImpl->getEsriGeoView(), m_graphicsLayer, m_debugInfo + QLatin1String("#Marker"), m_uniqueMapId); } const float scale = m_mainGraphicalObject->scale() * m_mainGraphicalObject->lineStyle().lineWidth() * 0.5f; m_marker->setMarkerSymbol(MarkerSymbolType::Triangle, qRound(5.0f * scale), m_mainGraphicalObject->rLineStyle().lineColor()); m_marker->setPickable(m_mainGraphicalObject->pickable()); m_marker->setDrawOrder(m_internalDrawOrder+1); m_marker->setOrigin(m_markerOrigin.originTranslated()); m_marker->setVisibility(m_visibility && m_visibilityTechnical); if (!m_marker->updateView()) ERROR_LOG(m_logger) << LOGFUNCTION << " debugInfo='" << m_debugInfo << "'" << " updateView failed"; } return true; } bool BuildingOutlineImpl::updateModelSceneSymbol() { TRACE_LOG(m_logger) << LOGFUNCTION << " START" << " debugInfo='" << m_debugInfo << "'" << " url=" << m_modelSceneSymolData.url.toString() << " scale=" << m_modelSceneSymolData.scale << " m_heading=" << m_modelSceneSymolData.heading; bool success = false; if (m_markerOrigin.isEmpty()) { ERROR_LOG(m_logger) << LOGFUNCTION << " no markerOrigin" << " debugInfo='" << m_debugInfo << "'"; return false; } if (m_modelSceneSymolData.url.isEmpty()) { delete m_modelSceneMarker; m_modelSceneMarker= nullptr; } else { if (!m_modelSceneMarker) m_modelSceneMarker = new GraphicalObjectModelSceneMarker(m_mapImpl->getEsriGeoView(), m_graphicsLayer, m_debugInfo + QLatin1String("#ModelSceneMarker"), m_uniqueMapId); // Symbol: m_modelSceneMarker->setUrl(m_modelSceneSymolData.url); m_modelSceneMarker->setOrigin(m_markerOrigin.originTranslated()); m_modelSceneMarker->setHeading(m_modelSceneSymolData.heading); m_modelSceneMarker->setScale(m_modelSceneSymolData.scale); // use scale of m_modelSceneSymolData, not of m_mainGraphicalObject m_modelSceneMarker->setVisibility(m_visibility && m_visibilityTechnical); success = m_modelSceneMarker->updateView(); if (!success) ERROR_LOG(m_logger) << LOGFUNCTION << " updateView failed" << " debugInfo='" << m_debugInfo << "'"; } TRACE_LOG(m_logger) << LOGFUNCTION << " END" << " debugInfo='" << m_debugInfo << "'"; return success; } bool BuildingOutlineImpl::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(), "10042500002701000000"); // SymbolSet = 25 270100 break; case AdvancedSymbology::SymbologyType::MIL2525C: m_symbol.refValue().sidc = AdvancedSymbology::SidcCodec::encodeComplete(mapImpl->symbologyType(), "G*MPOGZ---****X"); break; case AdvancedSymbology::SymbologyType::APP6B: m_symbol.refValue().sidc = AdvancedSymbology::SidcCodec::encodeComplete(mapImpl->symbologyType(), "GFCPBOGB--"); // APP6B: 3845: GFCPBOGB-- -> Polygon break; case AdvancedSymbology::SymbologyType::None: // empty break; } // switch } // if (mapImpl) bool success = BaseClass::init(mapImpl, logicalLayerName, GraphicalObjectPathType::Polygon); setLineStyle(LineStyle(Qt::black, 2)); if (!success) ERROR_LOG(m_logger) << LOGFUNCTION << " init failed"; TRACE_LOG(m_logger) << LOGFUNCTION << " END, success=" << success; return success; } void BuildingOutlineImpl::updateIdentifierPosition() { if (m_positions.isEmpty()) return; BoundingBox bbox; this->boundingBox(bbox); if (!bbox.isValid()) return BaseClass::updateIdentifierPosition(); OriginTranslated objCenterPoint; objCenterPoint.setMapObjectImpl(this); objCenterPoint.setOrigin(bbox.center()); m_identifierPositionCandidateTranslated = objCenterPoint.originTranslated(); } } // namespace SituationMap