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

167 lines
4.6 KiB
C++
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* @RDE_HEADER@
* Interface-Implementation of DangerArea
* $Id$
* $HeadURL$
* $Author$
*/
// Own
#include "cube_impl.h"
#include <Map/coord_translation_functor.h>
#include <Map/party_id_to_color_functor.h>
#include <MapImpl/map_impl.h>
#include <GraphicalObjects/graphical_object_cube.h>
// ESRI
#include <arcgis/GraphicsOverlay.h>
#include <arcgis/Renderer.h>
#include <arcgis/PolygonBuilder.h>
// Qt
namespace SituationMap
{
//-----------------------------------------------------------------------------
// class CubeImpl
//-----------------------------------------------------------------------------
CubeImpl::CubeImpl(const QString &debugInfo)
: Cube() // Interface
, BaseClass(debugInfo) // Implementation
, m_logger(getLogger("CubeImpl"))
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
}
CubeImpl::~CubeImpl()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
}
double CubeImpl::height() const
{
return m_height;
}
void CubeImpl::setHeight(double height)
{
m_height = height;
}
bool CubeImpl::updateViewImpl()
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START"
<< " symbol=" << m_symbol.value().sidc
<< " visibility=" << m_visibility
<< " visiTechn=" << m_visibilityTechnical
<< " visiTact=" << m_visibilityTactical;
// pre-condition
Esri::ArcGISRuntime::Renderer *curRenderer = nullptr;
if (m_graphicsLayer)
curRenderer = m_graphicsLayer->renderer();
if (!curRenderer)
{
ERROR_LOG(m_logger) << LOGFUNCTION << " no ArcGISRuntime::Renderer, layername='" << m_logicalLayerName << "'";
return false;
}
// Destroy if invisible :
// 13.09.2018, Norbert Thoden
// Regarding ESRI Case #02170796 - [BOS] Crash with Destruction of 3D Scene
// To reduce likelihood of crash:
// Destroy GraphicalObject (GO, m_mainGraphicalObject) if it becomes invisible
// With V100.3.0 the behaviour does not change.
// (switching cubes for 180 bldgs on and off)
//
if (m_visibility)
{
if (!m_mainGraphicalObject)
{
m_mainGraphicalObject = new GraphicalObjectCube(m_mapImpl->getEsriGeoView(),
m_graphicsLayer,
m_debugInfo + QStringLiteral("#GOCube"),
m_uniqueMapId);
}
} else {
delete m_mainGraphicalObject;
m_mainGraphicalObject = nullptr;
return true;
}
// : Destroy if invisible
GraphicalObjectCube *goCube = static_cast<GraphicalObjectCube *>(m_mainGraphicalObject);
if (goCube)
{
// in former times: partyName was used
// it´s replaced by more flexible ExtrusionColorName:
// const QString &partyName = m_mapImpl->partyIdToColorFunctor().partyIdToName(m_party.partyId.value());
// goCube->setPartyName(partyName);
const QColor &partyColor= m_mapImpl->partyIdToColorFunctor().partyIdToColor(m_party.partyId.value());
if (m_party.partyId.value() > -2) //Use Default: White or TeamColor
{
goCube->setExtrusionColorName( partyColor.name() );
}
else // Use given Color //need to be prepared in layerfactory!
{
goCube->setExtrusionColorName( majorColor().name() );
}
goCube->setPositions(m_positions.positionsTranslated());
goCube->setHeight(m_height);
}
else
{
ERROR_LOG(m_logger) << LOGFUNCTION << " no m_mainGraphicalObject";
return false;
}
bool success = BaseClass::updateViewImpl();
if (!success)
ERROR_LOG(m_logger) << LOGFUNCTION << " updateViewImpl failed";
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
return true;
}
bool CubeImpl::init(MapImpl *mapImpl, const QString &logicalLayerName)
{
TRACE_LOG(m_logger) << LOGFUNCTION << " START";
bool success = BaseClass::init(mapImpl, logicalLayerName);
// create underlying object (to save most attributes only there)
if (!m_mainGraphicalObject)
{
m_mainGraphicalObject = new GraphicalObjectCube(m_mapImpl->getEsriGeoView(),
m_graphicsLayer,
m_debugInfo + QStringLiteral("#GOCube"),
m_uniqueMapId);
//this MapObject is not very typical, therefore set some attributes:
this->setPickable(false);
this->setScaleEnable(false);
}
TRACE_LOG(m_logger) << LOGFUNCTION << " END";
return success;
}
} // namespace SituationMap