Initial commit

This commit is contained in:
torsten committed 2026-08-13 18:33:10 +02:00
commit b7d90b9afe
16245 files changed
+3396666

No files matched your search

@@ -0,0 +1,622 @@
/**
* @RDE_HEADER@
* TacticalAppearance
* $Id$
* $HeadURL$
* $Author$
*/
// Own
#include "tactical_appearance.h"
#include <MapImpl/map_impl.h>
#include <Symbology/symbol_dictionary.h>
#include <Symbology/sidc_builder_base.h>
#include <Symbology/sidc_codec.h>
#include <GraphicalObjects/graphical_object_picture_marker.h>
#include <Map/situation_map_utils.h> // operator<<
#include <Common/simple_value.h>
// ESRI
#include <arcgis/Map.h>
#include <arcgis/GraphicsOverlay.h>
#include <arcgis/PolygonBuilder.h>
#include <arcgis/PolylineBuilder.h>
#include <arcgis/MultipointBuilder.h>
// Qt
#include <QElapsedTimer>
namespace SituationMap
{
class TacticalAppearance::Private
{
public:
Private() = default;
~Private() = default;
// ESRI data:
MapImpl *m_mapImpl = nullptr;
QString m_logicalLayerName;
Esri::ArcGISRuntime::GraphicsOverlay *m_graphicOverlayTactical = nullptr;
AdvancedSymbology::SymbolDictionary *m_dictionary = nullptr;
AdvancedSymbology::SymbolResultWatcher m_symbolResultWatcher;
// OWN data:
SimpleValue<QString> m_uniqueDesignation;
SimpleValue<SymbolData> m_symbol;
AdvancedSymbology::SymbolDataToRender m_symDataToRender;
GraphicalObjectPictureMarker *m_pictureMarker = nullptr;
}; // class TacticalAppearance::Private
//-----------------------------------------------------------------------------
TacticalAppearance::TacticalAppearance(MapImpl *mapImpl,
const QString &logicalLayerName,
const QString &debugInfo,
const UniqueMapId &uniqueMapId)
: BaseClass(mapImpl->getEsriGeoView(), nullptr, debugInfo, uniqueMapId),
m_logger(getLogger("TacticalAppearance")),
d(new Private)
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START, debugInfo='" << m_debugInfo << "'"
<< ", logicalLayerName='" << logicalLayerName << "'";
d->m_symDataToRender.sizeL = 100;
d->m_mapImpl = mapImpl;
d->m_logicalLayerName = logicalLayerName;
if (!m_graphicsLayer && d->m_mapImpl)
m_graphicsLayer = d->m_mapImpl->getGraphicsLayer(d->m_logicalLayerName);
if (!m_graphicsLayer)
{
ERROR_LOG(m_logger) << LOGFUNCTION << " debugInfo='" << m_debugInfo << "'"
<< " getGraphicsLayer failed";
}
if (d->m_mapImpl)
d->m_dictionary = &(d->m_mapImpl->symbolDictionary());
// lambda:
// m_symbolResultWatcher is canceled on destruction.
// So it`s safe that no signal will be fired afterwards.
// To avoid CLang warnings use m_symbolResultWatcher as context (3rd para), although it´s not intended.
// Better idea?
QObject::connect(&d->m_symbolResultWatcher, &AdvancedSymbology::SymbolResultWatcher::resultReady, &d->m_symbolResultWatcher, [this]()
{
DEBUG_LOG(m_logger) << LOGFUNCTION << " debugInfo='" << m_debugInfo << "'"
<< " resultReady...";
QSharedPointer<AdvancedSymbology::SymbolResult> symResult = d->m_symbolResultWatcher.symbolResult();
if (! symResult)
return; // should NEVER happen! (Which object should have triggered the signal???)
if (d->m_pictureMarker)
{
d->m_pictureMarker->setImage(symResult->symbolImage().image());
d->m_pictureMarker->updateView();
}
});
TRACE_LOG(m_logger) << LOGFUNCTION << " END, debugInfo='" << m_debugInfo << "'";
}
TacticalAppearance::~TacticalAppearance()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START, debugInfo='" << m_debugInfo << "'";
// abort pending call to SymbolDictionary::findSymbol:
d->m_symbolResultWatcher.cancel();
delete d->m_pictureMarker;
d->m_pictureMarker = nullptr;
removeGraphicFromGraphicOverlayTactical();
delete d;
TRACE_LOG(m_logger) << LOGFUNCTION << " END, debugInfo='" << m_debugInfo << "'";
}
void TacticalAppearance::removeGraphicFromGraphicOverlayTactical()
{
if (m_logger.isTraceEnabled())
{
if (m_graphic)
{
Esri::ArcGISRuntime::GraphicsOverlay *gOverlay = m_graphic->graphicsOverlay();
if (gOverlay)
TRACE_LOG(m_logger) << LOGFUNCTION << " START debugInfo='" << m_debugInfo << "'" << " name = '" << gOverlay->overlayId() << "'";
}
}
if (m_graphic && d->m_graphicOverlayTactical && d->m_graphicOverlayTactical->graphics())
d->m_graphicOverlayTactical->graphics()->removeOne(m_graphic);
delete m_graphic;
m_graphic = nullptr;
}
bool TacticalAppearance::useDictionaryRenderMode(const AdvancedSymbology::GeometryType &geomType) const
{
bool usePictureMarker = isSinglePoint() && (AdvancedSymbology::GeometryType::Point == geomType || AdvancedSymbology::GeometryType::Undefined == geomType);
return !usePictureMarker || symbol().useAlwaysDictionaryRenderer;
} // bool TacticalAppearance::useDictionaryRenderMode() const
bool TacticalAppearance::create()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START, debugInfo='" << m_debugInfo << "'"
<< " m_visibility = " << m_visibility;
bool success = true;
//
// Prepare / create :
//
// a) singlePoint / exactly one coordinate -> use pictureMarker
// or
// b) multiPoint / more than one coordinate -> m_graphic / DictionaryRenderer
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* This assumption doesn't work any more because some polyline and polygon symbols will have only one
* anchor point and the real geometry is defined by additional attributes like radius, with, length ...
*
* JT 2016/12/20
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
if (m_graphicsLayer && m_visibility.value())
{
const SymbolData &symbolData_ref = d->m_symbol.value();
const QString &baseSymbolCode = AdvancedSymbology::SidcBuilderBase::concreteSidcToBaseSymbolCode(symbolData_ref.sidc);
const AdvancedSymbology::SymbolProperties &symbolProperties = d->m_dictionary->symbolProperties(baseSymbolCode);
AdvancedSymbology::GeometryType geomType = symbolProperties.geometryType();
if (useDictionaryRenderMode(geomType))
{
if (!d->m_graphicOverlayTactical)
d->m_graphicOverlayTactical = d->m_mapImpl->getGraphicsLayerDict(d->m_logicalLayerName);
if (!d->m_graphicOverlayTactical)
{
ERROR_LOG(m_logger) << LOGFUNCTION << " debugInfo='" << m_debugInfo << "'"
<< " getGraphicsLayerDict failed";
return false;
}
if (!m_graphic)
{
m_graphic = new Esri::ArcGISRuntime::Graphic();
m_graphic->setObjectName(m_debugInfo);
m_graphic->setZIndex(m_drawOrder.value());
// use attributeModel to store application obj id (SimWorld) at graphic
Esri::ArcGISRuntime::AttributeListModel *attLisModel = m_graphic->attributes();
if (attLisModel)
attLisModel->insertAttribute(QLatin1String(SituationMap::UniqueMapIdAttribute), m_uniqueMapId);
else
ERROR_LOG(m_logger) << LOGFUNCTION << " no AttributeListModel, debugInfo='" << m_debugInfo << "'" << " uniqueMapId=" << m_uniqueMapId;
// Adding an empty graphic leads to Segmentation fault.
// (in Esri_runtimecore::Map_renderer::Dictionary_renderer::derive_geometry)
bool successGraphic = addUpdateGraphic(); // CHECK
if (!successGraphic)
ERROR_LOG(m_logger) << LOGFUNCTION << " addUpdateGraphic failed, debugInfo='" << m_debugInfo << "'" << " uniqueMapId=" << m_uniqueMapId;
} // if (!m_graphic)
}
else
{
// m_graphic is needless now:
removeGraphicFromGraphicOverlayTactical();
}
}
// : Prepare / create
bool positionsEmpty = m_positions.value().isEmpty();
if (positionsEmpty)
ERROR_LOG(m_logger) << LOGFUNCTION << " debugInfo='" << m_debugInfo << "'" << " positions empty";
success = success && !positionsEmpty;
if (!success)
ERROR_LOG(m_logger) << LOGFUNCTION << " debugInfo='" << m_debugInfo << "'" << " create failed";
TRACE_LOG(m_logger) << LOGFUNCTION << " END, debugInfo='" << m_debugInfo << "'";
return success;
}
void TacticalAppearance::createPictureMarker()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START, debugInfo='" << m_debugInfo << "'";
if (!d->m_pictureMarker && d->m_mapImpl)
{
d->m_pictureMarker = new GraphicalObjectPictureMarker(d->m_mapImpl->getEsriGeoView()
, m_graphicsLayer
, m_debugInfo + QLatin1String("#PicMarkTacticalAppearance")
, m_uniqueMapId);
}
TRACE_LOG(m_logger) << LOGFUNCTION << " END, debugInfo='" << m_debugInfo << "'";
}
void TacticalAppearance::removePictureMarker()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START, debugInfo='" << m_debugInfo << "'";
delete d->m_pictureMarker;
d->m_pictureMarker = nullptr;
TRACE_LOG(m_logger) << LOGFUNCTION << " END, debugInfo='" << m_debugInfo << "'";
}
QString TacticalAppearance::uniqueDesignation() const
{
return d->m_uniqueDesignation.value();
}
void TacticalAppearance::setUniqueDesignation(const QString &uniqueDesignation)
{
d->m_uniqueDesignation = uniqueDesignation;
}
SymbolImage TacticalAppearance::symbolImage() const
{
SymbolImage symImage;
if (d->m_pictureMarker)
{
symImage.setImage(d->m_pictureMarker->image());
symImage.setValid(!symImage.image().isNull());
}
return symImage;
}
SymbolData TacticalAppearance::symbol() const
{
return d->m_symbol.value();
}
void TacticalAppearance::setSymbol(const SymbolData &symbol)
{
d->m_symbol = symbol;
}
bool TacticalAppearance::changed()
{
return BaseClass::changed()
|| d->m_uniqueDesignation.changed()
|| d->m_symbol.changed();
}
void TacticalAppearance::resetChanged()
{
BaseClass::resetChanged();
d->m_uniqueDesignation.reset();
d->m_symbol.reset();
}
Esri::ArcGISRuntime::Geometry TacticalAppearance::getGraphicGeometry() const
{
if (d->m_pictureMarker) return d->m_pictureMarker->getGraphicGeometry();
if (m_graphic) return m_graphic->geometry();
ERROR_LOG(m_logger) << LOGFUNCTION << "Geometry is undefined";
return Esri::ArcGISRuntime::Geometry();
} // Esri::ArcGISRuntime::Geometry TacticalAppearance::getGraphicGeometry() const
bool TacticalAppearance::updateViewImpl()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START, debugInfo='" << m_debugInfo << "'"
<< " symbol='" << d->m_symbol.value().sidc << "'"
<< " visibility=" << m_visibility
<< " selected=" << m_selected
<< " origin=" << this->origin()
<< " scale=" << m_scale.value();
const SymbolData &symbolData_ref = d->m_symbol.value();
const QString &baseSymbolCode = AdvancedSymbology::SidcBuilderBase::concreteSidcToBaseSymbolCode(symbolData_ref.sidc);
const AdvancedSymbology::SymbolProperties &symbolProperties = d->m_dictionary->symbolProperties(baseSymbolCode);
AdvancedSymbology::GeometryType geomType = symbolProperties.geometryType();
if (geomType == AdvancedSymbology::GeometryType::Undefined)
{
ERROR_LOG(m_logger) << LOGFUNCTION << " debugInfo='" << m_debugInfo << "'"
<< " GeometryType::Undefined, symbolProperties failed!?!";
return false;
}
TRACE_LOG(m_logger) << LOGFUNCTION << " START, debugInfo='" << m_debugInfo << "'"
<< ", geomType=" << geomType
<< ", useDictionaryRenderMode(geomType)=" << useDictionaryRenderMode(geomType);
bool success = create();
if (!success)
{
ERROR_LOG(m_logger) << LOGFUNCTION << " debugInfo='" << m_debugInfo << "'"
<< " create failed";
return false;
}
if (useDictionaryRenderMode(geomType))
{
// real work:
if (m_positions.changed() || d->m_symbol.changed() || m_visibility.changed())
{
auto buildPointClusterGeometry = [this]() -> Esri::ArcGISRuntime::Geometry
{
QSharedPointer<Esri::ArcGISRuntime::MultipointBuilder> builder(new Esri::ArcGISRuntime::MultipointBuilder(spatialReference()));
Esri::ArcGISRuntime::PointCollection points(spatialReference());
const auto posCont = positions();
for (const auto &pos : posCont)
{
DEBUG_LOG(m_logger) << LOGFUNCTION << " debugInfo='" << m_debugInfo << "'"
<< " addPoint:" << pos.x() << " - " << pos.y();
points.addPoint(pos.x(), pos.y());
}
builder->setPoints(&points);
return builder->toGeometry();
}; // buildPointClusterGeometry
Esri::ArcGISRuntime::Geometry geom;
switch (geomType)
{
case AdvancedSymbology::GeometryType::Undefined : break;
case AdvancedSymbology::GeometryType::Point :
case AdvancedSymbology::GeometryType::Polyline :
{
DEBUG_LOG(m_logger) << LOGFUNCTION << " debugInfo='" << m_debugInfo << "'" << " m_positions.count()=" << m_positions.value().count();
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
* If a PolylineBuilder is used here to create symbol geometry the construction appropriate symbol standard (MIL2525C / MIL2525D / App6)
* will not be done and the symbol is always a simple polyline. Using MultipointBuilder to build symbol geometry the result is based on
* underlying symbol standard.
* 2016/12/9 JT
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
geom = buildPointClusterGeometry();
} break;
case AdvancedSymbology::GeometryType::Polygon :
{
DEBUG_LOG(m_logger) << LOGFUNCTION << " debugInfo='" << m_debugInfo << "'" << " m_positions.count()=" << m_positions.value().count();
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
* Some symbols have polygon geometry and could have only one or two positions. In case of less than 3 positions do the same as for
* polylines and use MultipointBuilder to create the symbol geometry. In other case use PolygonBuilder.
* 2016/12/13 JT
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
if (positions().size() > 2)
{
QSharedPointer<Esri::ArcGISRuntime::PolygonBuilder> builder(new Esri::ArcGISRuntime::PolygonBuilder(spatialReference()));
const auto posCont = positions();
for (const auto &pos : posCont)
{
DEBUG_LOG(m_logger) << LOGFUNCTION << " debugInfo='" << m_debugInfo << "'" << " addPoint:" << pos.x() << " - " << pos.y();
builder->addPoint(pos.x(), pos.y());
}
geom = builder->toGeometry();
}
else
geom = buildPointClusterGeometry();
} break;
} // switch
if (geom.isEmpty())
{
ERROR_LOG(m_logger) << LOGFUNCTION << " Geometry NOT OK -> fallback symbol" << " (geometryType was " << geomType << ")";
createPictureMarker();
d->m_pictureMarker->setDebugInfo(m_debugInfo + QLatin1String("#fallback"));
int size = symbolData_ref.size;
if (size < 10) size = 10;
if (size > 100) size = 100;
d->m_pictureMarker->setMarkerSymbol(MarkerSymbolType::Diamond, size, symbolData_ref.color);
d->m_pictureMarker->setOrigin(this->origin());
d->m_pictureMarker->setDrawOrder(m_drawOrder.value());
d->m_pictureMarker->updateView();
success = false;
}
else // geom is not empty
{
removePictureMarker();
if (m_graphic)
{
success = true;
// move to graphic:
m_graphic->setGeometry(geom);
// prepare rawAttributes for DictionaryRenderer:
QVariantMap rawAttributes = d->m_symbol.value().attributeMap;
// build from scratch to honor removed attributes:
// (Otherwise the will remain wrongly)
rawAttributes[QLatin1String(SituationMap::UniqueMapIdAttribute)] = m_uniqueMapId;
rawAttributes[QLatin1String(SituationMap::IsPickableAttribute)] = m_pickable.value(); // set pickable attribute JT 2016/12/21
rawAttributes[QLatin1String("_type")] = QLatin1String("position_report");
rawAttributes[QLatin1String("_action")] = QLatin1String("update");
rawAttributes[QLatin1String("sidc")] = AdvancedSymbology::SidcCodec::decodeRawSidc(d->m_symbol.value().sidc); // in case of MIL2525
rawAttributes[QLatin1String("sic")] = AdvancedSymbology::SidcCodec::decodeRawSidc(d->m_symbol.value().sidc); // in case of APP6
Esri::ArcGISRuntime::AttributeListModel * attributeModel = m_graphic->attributes();
if (attributeModel)
attributeModel->setAttributesMap(rawAttributes);
else
ERROR_LOG(m_logger) << LOGFUNCTION << " debugInfo='" << m_debugInfo << "'" << " no AttributeListModel";
// // prepare rawAttributes for DictionaryRenderer:
// QVariantMap rawAttributes = d->m_symbol.value().attributeMap;
// rawAttributes[QLatin1String(SituationMap::IsPickableAttribute)] = m_pickable.value(); // set pickable attribute JT 2016/12/21
// rawAttributes[QLatin1String("_type")] = QLatin1String("position_report");
// rawAttributes[QLatin1String("_action")] = QLatin1String("update");
// rawAttributes[QLatin1String("sidc")] = AdvancedSymbology::SidcCodec::decodeRawSidc(d->m_symbol.value().sidc); // in case of MIL2525
// rawAttributes[QLatin1String("sic")] = AdvancedSymbology::SidcCodec::decodeRawSidc(d->m_symbol.value().sidc); // in case of APP6
// // move to graphic:
// m_graphic->setGeometry(geom);
// /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// * Replace:
// * m_graphic->attributes()->setAttributesMap(rawAttributes);
// *
// * because it doesn't work anymore in ArcGISRuntime V100.2
// * JT, 2018/01/24
// * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
// Esri::ArcGISRuntime::AttributeListModel * attributeModel = m_graphic->attributes();
// if (attributeModel)
// {
// if (!attributeModel->isEmpty())
// {
// for (auto it = rawAttributes.cbegin(); it != rawAttributes.cend(); ++it)
// {
// const QString &attrKey = it.key();
// if (attributeModel->containsAttribute(attrKey))
// {
// attributeModel->replaceAttribute(attrKey, rawAttributes[attrKey]);
// continue;
// }
// attributeModel->insertAttribute(attrKey, rawAttributes[attrKey]);
// }
// }
// else attributeModel->setAttributesMap(rawAttributes);
// }
// 2021-08, N. Thoden
// While switching back to the behaviour that one logical layer has
// 1st getGraphicsLayer and 2nd getGraphicsLayerDict [GUEZE-496],
// the tactical appereance of DangerArea and similar disappears.
// Reason: m_graphicsLayer and m_graphicOverlayTactical are different now!
// It seems like that in former versions (< V100.8) the graphic could
// be added to more than one Esri layer.
// Now (V100.8) adding to a second layer fails.
// But we can remove the m_graphic from the default m_graphicsLayer
// before adding the the desired one: m_graphicOverlayTactical
if (m_graphicsLayer->graphics()->contains(m_graphic))
m_graphicsLayer->graphics()->removeOne(m_graphic);
// add to graphicOverlayTactical:
if (! d->m_graphicOverlayTactical->graphics()->contains(m_graphic))
d->m_graphicOverlayTactical->graphics()->append(m_graphic);
bool successGraphic = d->m_graphicOverlayTactical->graphics()->contains(m_graphic);
if (!successGraphic)
ERROR_LOG(m_logger) << LOGFUNCTION << " debugInfo='" << m_debugInfo << "'"
<< " m_graphic not added to m_graphicOverlayTactical";
}
else
{
DEBUG_LOG(m_logger) << LOGFUNCTION << " debugInfo='" << m_debugInfo << "'"
<< " no m_graphic";
// success = false;
success = true; // if the DictionaryRenderer is used, m_graphic is null and that is ok.
}
} // if (geom.isEmpty())
}
}
else // !useDictionaryRenderMode(geomType)
{
createPictureMarker();
d->m_pictureMarker->setOrigin(this->origin());
// real work:
DEBUG_LOG(m_logger) << LOGFUNCTION << " debugInfo='" << m_debugInfo << "'"
<< " update geometry";
if (d->m_symbol.changed() || m_scale.changed())
{
if (d->m_dictionary)
{
int widthPixel = SituationMap::SymbolSizeLdefault;
widthPixel *= symbolData_ref.size * m_scale.value();
d->m_symDataToRender.sidc = symbolData_ref.sidc;
d->m_symDataToRender.fillColor = symbolData_ref.color;
d->m_symDataToRender.fillColorReplace = true;
d->m_symDataToRender.sizeL = widthPixel;
if (d->m_pictureMarker->image().isNull())
d->m_pictureMarker->setImage(d->m_dictionary->temporaryImage(d->m_symDataToRender.sizeL));
d->m_symbolResultWatcher.setSymbolResult(d->m_dictionary->fetchSymbol(d->m_symDataToRender));
success = true;
}
else
{
ERROR_LOG(m_logger) << LOGFUNCTION << " debugInfo='" << m_debugInfo << "'"
<< " visibility=" << m_visibility
<< " no dictionary";
}
}
if (d->m_pictureMarker)
{
d->m_pictureMarker->setDrawOrder(m_drawOrder.value());
d->m_pictureMarker->setVisibility(m_visibility.value());
d->m_pictureMarker->setSelected(m_selected.value());
d->m_pictureMarker->setPickable(m_pickable.value());
success = success && d->m_pictureMarker->updateView();
}
} // else !useDictionaryRenderMode(geomType)
if (d->m_pictureMarker)
{
d->m_pictureMarker->setOrigin(this->origin()); // to avoid incorrect number of positions..
d->m_pictureMarker->setVisibility(m_visibility.value());
d->m_pictureMarker->setSelected(m_selected.value());
success = d->m_pictureMarker->updateView() && success;
}
// in case of no pictureMarker:
if (m_graphic)
{
m_graphic->setZIndex(m_drawOrder.value());
m_graphic->setVisible(m_visibility.value());
m_graphic->setSelected(m_selected.value());
}
// reset flags
d->m_symbol.reset();
if (!success)
ERROR_LOG(m_logger) << LOGFUNCTION << " failure, debugInfo='" << m_debugInfo << "'";
TRACE_LOG(m_logger) << LOGFUNCTION << " END, debugInfo='" << m_debugInfo << "'"
<< " success = " << success
<< " visibility=" << m_visibility;
return success;
}
} // namespace SituationMap