270 lines
8.0 KiB
C++
Executable File
270 lines
8.0 KiB
C++
Executable File
/**
|
|
* @RDE_HEADER@
|
|
* Interface-Implementation of BuildingOutline
|
|
* $Id$
|
|
* $HeadURL$
|
|
* $Author$
|
|
*/
|
|
|
|
// Own
|
|
#include "building_outline_impl.h"
|
|
#include <MapImpl/map_impl.h>
|
|
#include <GraphicalObjects/graphical_object_path.h>
|
|
#include <Map/bounding_box.h>
|
|
|
|
#include "Map/object_factory.h"
|
|
|
|
#include<Symbology/sidc_codec.h>
|
|
|
|
// 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
|
|
|
|
|