213 lines
6.8 KiB
Objective-C
Executable File
213 lines
6.8 KiB
Objective-C
Executable File
/**
|
|
**
|
|
** @RDE_HEADER@
|
|
** Definition of base class for rubberband drawing objects
|
|
** $Id$
|
|
** $HeadURL$
|
|
** $Author$
|
|
**
|
|
** -----------------------------------------------------------------------------------------------
|
|
**
|
|
** Hardware-Environment: Intel-PC
|
|
** Software-Environment: Windows 7, Qt 5.4. ArcGIS 10.2.5
|
|
**
|
|
** Language ........: C++ 11
|
|
**
|
|
** -----------------------------------------------------------------------------------------------
|
|
**
|
|
** Author ...........: Jörg Turla, SPD G, Tel. 3132
|
|
**
|
|
** -----------------------------------------------------------------------------------------------
|
|
**
|
|
** Notes .........:
|
|
**
|
|
** 27.03.2015, JT : First edition for use with Qt5
|
|
**
|
|
** -----------------------------------------------------------------------------------------------
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
|
|
#include <QtCore/QObject>
|
|
|
|
#include <QtGui/QColor>
|
|
|
|
#include <arcgis/MapGraphicsView.h>
|
|
#include <arcgis/Point.h>
|
|
|
|
#include <Common/referenced.h>
|
|
#include <Common/situation_map_logging.h>
|
|
|
|
|
|
class QGraphicsScene;
|
|
|
|
namespace SituationMap { namespace RB
|
|
{
|
|
|
|
Esri::ArcGISRuntime::Point convert(const QPointF &point, const Esri::ArcGISRuntime::SpatialReference& spatialReference);
|
|
|
|
|
|
|
|
/**
|
|
@class RubberbandDrawable rubberband_drawable.h
|
|
@brief Base class of all rubberband drawables and handles for rubberband internal use.
|
|
*/
|
|
class RubberbandDrawable : public QObject, public SituationMap::Referenced
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
|
|
enum class ZBufferPlane
|
|
{
|
|
FrameHandle = 10,
|
|
Drawables = 20,
|
|
LineHandle = 30,
|
|
ArrowSymbol = 31,
|
|
PointHandle = 40,
|
|
Widget = 100
|
|
}; /* InputMethode */
|
|
|
|
|
|
/**
|
|
Manages scene and map coordinates.
|
|
*/
|
|
struct RubberbandCoordinate
|
|
{
|
|
QPointF _sceneCoordinate;
|
|
Esri::ArcGISRuntime::Point _mapCoordinate;
|
|
|
|
|
|
RubberbandCoordinate()
|
|
{}
|
|
|
|
explicit RubberbandCoordinate( const QPointF & sceneCoordinate)
|
|
{
|
|
updateSceneCoordinate( sceneCoordinate );
|
|
} /* RubberbandCoordinate */
|
|
|
|
explicit RubberbandCoordinate( Esri::ArcGISRuntime::MapGraphicsView * mapView, const QPointF & sceneCoordinate)
|
|
{
|
|
updateSceneCoordinate( mapView, sceneCoordinate );
|
|
} /* RubberbandCoordinate */
|
|
|
|
|
|
explicit RubberbandCoordinate( Esri::ArcGISRuntime::MapGraphicsView * mapView, const Esri::ArcGISRuntime::Point & mapCoordinate)
|
|
: _mapCoordinate(mapCoordinate)
|
|
{
|
|
mapToScene( mapView );
|
|
} /* RubberbandCoordinate */
|
|
|
|
|
|
inline QPointF mapToScene(Esri::ArcGISRuntime::MapGraphicsView * mapView)
|
|
{
|
|
if (!_mapCoordinate.isValid())
|
|
return QPointF();
|
|
const QPointF pixelCoordinate = mapView->locationToScreen(_mapCoordinate);
|
|
_sceneCoordinate = mapView->mapToScene( pixelCoordinate.x(), pixelCoordinate.y() );
|
|
return _sceneCoordinate;
|
|
} /* QPointF mapToScene(Esri::ArcGISRuntime::MapGraphicsView * mapView) */
|
|
|
|
|
|
inline void updateSceneCoordinate( Esri::ArcGISRuntime::MapGraphicsView * mapView, const QPointF & sceneCoordinate)
|
|
{
|
|
if (mapView)
|
|
{
|
|
_sceneCoordinate = sceneCoordinate;
|
|
QPoint pixelCoordinate = mapView->mapFromScene(sceneCoordinate);
|
|
_mapCoordinate = mapView->screenToLocation( pixelCoordinate.x(), pixelCoordinate.y() );
|
|
}
|
|
else updateSceneCoordinate( sceneCoordinate );
|
|
} /* void updateSceneCoordinate( Esri::ArcGISRuntime::MapGraphicsView * mapView, const QPointF & sceneCoordinate) */
|
|
|
|
|
|
inline void updateSceneCoordinate( const QPointF & sceneCoordinate )
|
|
{
|
|
_sceneCoordinate = sceneCoordinate;
|
|
_mapCoordinate = Esri::ArcGISRuntime::Point();
|
|
} /* void updateSceneCoordinate( const QPointF & sceneCoordinate ) */
|
|
|
|
bool isNull() const
|
|
{
|
|
return _sceneCoordinate.isNull();
|
|
}
|
|
|
|
}; /* RubberbandCoordinate */
|
|
|
|
/**
|
|
@name Construction & Destruction
|
|
@{
|
|
*/
|
|
explicit RubberbandDrawable( QGraphicsView *view );
|
|
explicit RubberbandDrawable( Esri::ArcGISRuntime::MapGraphicsView * );
|
|
explicit RubberbandDrawable( Esri::ArcGISRuntime::MapGraphicsView *, QGraphicsScene * );
|
|
~RubberbandDrawable();
|
|
/** @} */
|
|
|
|
inline bool isVisible() const { return _isVisible; }
|
|
inline void setVisibility(bool on = true) { _isVisible = on; updateGraphic(); }
|
|
|
|
inline void setDrawColor (const QColor & col) { _drawColor = col; updateGraphic(); }
|
|
inline void setFillColor (const QColor & col) { _fillColor = col; updateGraphic(); }
|
|
inline void setLineWidth(unsigned int width) { _lineWidth = width; updateGraphic(); }
|
|
|
|
inline void zBufferPlane( ZBufferPlane zPlane ) { _zBufferValue = (unsigned int) zPlane; }
|
|
|
|
inline void setZValue(qreal zValue) { _zValue = zValue; updateGraphic(); }
|
|
inline qreal zValue() const { return _zValue; }
|
|
|
|
protected:
|
|
|
|
QPointer<QGraphicsScene> _scene;
|
|
QPointer<Esri::ArcGISRuntime::MapGraphicsView> _mapView;
|
|
|
|
bool _isVisible;
|
|
QColor _drawColor;
|
|
QColor _fillColor;
|
|
unsigned int _lineWidth;
|
|
qreal _zBufferValue;
|
|
qreal _zValue{0}; // combine _zBufferValue and _zValue???
|
|
|
|
LOGGER_T _logger;
|
|
|
|
#ifdef ADJUST_COORDINATES_EVERY_PAINT_EVENT
|
|
bool eventFilter(QObject*, QEvent*) override;
|
|
#endif
|
|
|
|
virtual void updateGraphic() = 0;
|
|
|
|
void makeLineStyle( bool dottedLine, QPen & lineStyle );
|
|
|
|
inline void forceUpdateViewWidget() { _mapView->viewport()->update(); }
|
|
|
|
virtual void adjustCoordinates() = 0;
|
|
virtual void adjustWindow( const QRectF& ) = 0;
|
|
|
|
|
|
QColor transparentFillColor() const
|
|
{
|
|
QColor fillColor(_fillColor);
|
|
|
|
if (fillColor.alphaF() > 0.85)
|
|
{
|
|
fillColor.setAlphaF( fillColor.alphaF()*0.5 );
|
|
}
|
|
return fillColor;
|
|
} // QColor transparentFillColor()
|
|
|
|
|
|
protected slots:
|
|
|
|
void onDo_adjustCoordinates();
|
|
void onDo_adjustWindow(const QRectF & );
|
|
|
|
private:
|
|
|
|
|
|
|
|
void doConnecting();
|
|
|
|
}; /* RubberbandDrawable */
|
|
|
|
} } /* namespace SituationMap::RB */
|