27 #include "../../../dataaccess/dataset/ObjectId.h"
28 #include "../../../geometry/Coord2D.h"
29 #include "../../../geometry/Geometry.h"
30 #include "../../../geometry/LineString.h"
31 #include "../../../geometry/MultiPolygon.h"
32 #include "../../../geometry/Polygon.h"
33 #include "../../../geometry/Utils.h"
34 #include "../../../qt/widgets/canvas/MapDisplay.h"
35 #include "../../../qt/widgets/Utils.h"
36 #include "../../Feature.h"
37 #include "../../RepositoryManager.h"
38 #include "../../Utils.h"
39 #include "../Renderer.h"
44 #include <QMessageBox>
45 #include <QMouseEvent>
55 : AbstractTool(display, parent),
58 m_currentStage(FEATURE_SELECTION)
79 Qt::KeyboardModifiers keys = e->modifiers();
81 if(e->button() == Qt::LeftButton && m_currentStage == VERTEX_FOUND)
84 if(keys == Qt::NoModifier)
86 setStage(VERTEX_MOVING);
91 if(keys == Qt::ShiftModifier)
97 m_currentVertexIndex.makeInvalid();
99 setStage(VERTEX_SEARCH);
110 if(m_currentStage == VERTEX_READY_TO_ADD)
114 setStage(FEATURE_SELECTION);
121 switch(m_currentStage)
125 case VERTEX_READY_TO_ADD:
127 if(m_rtree.isEmpty())
133 std::vector<VertexIndex> report;
134 m_rtree.search(env, report);
138 setStage(VERTEX_FOUND);
140 m_currentVertexIndex = report[0];
148 m_currentVertexIndex.makeInvalid();
150 std::auto_ptr<te::gm::Point> borderPoint(0);
156 if(m_feature->getGeometry()->intersects(geometryFromEnvelope.get()) && !m_feature->getGeometry()->contains(geometryFromEnvelope.get()))
160 borderPoint.get() != 0 ? setStage(VERTEX_READY_TO_ADD) : setStage(VERTEX_SEARCH);
162 draw(borderPoint.get());
170 point = m_display->transform(point);
172 MoveVertex(m_lines, m_currentVertexIndex, point.x(), point.y());
174 storeEditedFeature();
190 switch(m_currentStage)
192 case FEATURE_SELECTION:
194 if(e->button() != Qt::LeftButton)
200 setStage(VERTEX_SEARCH);
209 setStage(VERTEX_SEARCH);
219 if(e->button() == Qt::LeftButton && m_currentStage == VERTEX_READY_TO_ADD)
228 point = m_display->transform(point);
230 AddVertex(m_lines, point.x(), point.y(), e, m_display->getSRID());
232 storeEditedFeature();
234 m_currentVertexIndex.makeInvalid();
236 setStage(VERTEX_SEARCH);
253 setStage(FEATURE_SELECTION);
257 m_currentVertexIndex.makeInvalid();
265 pickFeature(m_layer, env);
274 m_feature =
PickFeature(m_layer, env, m_display->getSRID());
279 GetLines(m_feature->getGeometry(), m_lines);
285 catch(std::exception& e)
287 QMessageBox::critical(m_display, tr(
"Error"), QString(tr(
"The geometry cannot be selected from the layer. Details:") +
" %1.").arg(e.what()));
298 QPixmap* draft = m_display->getDraftPixmap();
299 draft->fill(Qt::transparent);
303 renderer.
begin(draft, env, m_display->getSRID());
306 renderer.
drawRepository(m_layer->getId(), env, m_display->getSRID());
311 m_display->repaint();
317 renderer.
draw(m_feature->getGeometry(),
true);
322 if(m_currentVertexIndex.isValid())
325 std::auto_ptr<te::gm::Point> point(line->
getPointN(m_currentVertexIndex.m_pos));
327 renderer.
setPointStyle(
"circle", Qt::transparent, Qt::blue, 3, 24);
328 renderer.
draw(point.get());
334 assert(virtualVertex);
336 renderer.
setPointStyle(
"circle", Qt::transparent, Qt::darkGreen, 3, 24);
337 renderer.
draw(virtualVertex);
342 m_display->repaint();
352 QPointF pixelOffset(4.0, 4.0);
354 QRectF rect(pos - pixelOffset, pos + pixelOffset);
357 QPointF ll(rect.left(), rect.bottom());
358 QPointF ur(rect.right(), rect.top());
359 ll = m_display->transform(ll);
360 ur = m_display->transform(ur);
371 for(std::size_t i = 0; i < m_lines.size(); ++i)
375 for(std::size_t j = 0; j < line->
getNPoints(); ++j)
382 m_rtree.insert(e, index);
389 m_currentStage = stage;
395 switch(m_currentStage)
397 case FEATURE_SELECTION:
399 m_display->setCursor(Qt::ArrowCursor);
403 m_display->setCursor(Qt::OpenHandCursor);
407 m_display->setCursor(Qt::ClosedHandCursor);
411 m_display->setCursor(Qt::ArrowCursor);
void addGeometry(const std::string &source, te::gm::Geometry *geom)
TEEDITEXPORT void MoveVertex(std::vector< te::gm::LineString * > &lines, const VertexIndex &index, const double &x, const double &y)
void setPointStyle(const QString &mark, const QColor &fillColor, const QColor &contourColor, const std::size_t &contourWidth, const std::size_t &size)
StageType
Defines the operation stage to this tool.
This class implements a concrete tool for vertex operations (move, add, etc.).
void setStage(StageType stage)
void storeEditedFeature()
Point * getPointN(std::size_t i) const
It returns the specified point in this LineString.
bool mouseReleaseEvent(QMouseEvent *e)
This event handler can be reimplemented in a concrete tool class to receive mouse release events for ...
bool mousePressEvent(QMouseEvent *e)
This event handler can be reimplemented in a concrete tool class to receive mouse press events for th...
const double & getY(std::size_t i) const
It returns the n-th y coordinate value.
Coord2D getCenter() const
It returns the rectangle's center coordinate.
TEEDITEXPORT void RemoveVertex(std::vector< te::gm::LineString * > &lines, const VertexIndex &index)
LineString is a curve with linear interpolation between points.
static Renderer & getInstance()
It returns a reference to the singleton instance.
A point with x and y coordinate values.
An Envelope defines a 2D rectangular region.
void setIndex(const std::size_t &line, const std::size_t &pos)
const double & getX(std::size_t i) const
It returns the n-th x coordinate value.
te::gm::Envelope buildEnvelope(const QPointF &pos)
bool mouseMoveEvent(QMouseEvent *e)
This event handler can be reimplemented in a concrete tool class to receive mouse move events for the...
TEEDITEXPORT Feature * PickFeature(const te::map::AbstractLayerPtr &layer, const te::gm::Envelope &env, int srid)
TEEDITQTEXPORT QPointF GetPosition(QMouseEvent *e)
void draw(te::gm::Geometry *geom, bool showVertexes=false)
std::size_t getNPoints() const
It returns the number of points (vertexes) in the linestring.
Geometry is the root class of the geometries hierarchy, it follows OGC and ISO standards.
VertexIndex m_currentVertexIndex
This is a singleton for rendering geometries and features.
void draw(te::gm::Point *virtualVertex=0)
TEEDITEXPORT void AddVertex(std::vector< te::gm::LineString * > &lines, const double &x, const double &y, const te::gm::Envelope &env, int srid)
VertexTool(te::qt::widgets::MapDisplay *display, const te::map::AbstractLayerPtr &layer, QObject *parent=0)
It constructs a vertex tool associated with the given map display.
te::map::AbstractLayerPtr m_layer
void drawVertexes(te::gm::Geometry *geom)
void begin(QPaintDevice *device, const te::gm::Envelope &e, int srid)
TEEDITEXPORT void GetLines(te::gm::Geometry *geom, std::vector< te::gm::LineString * > &lines)
bool mouseDoubleClickEvent(QMouseEvent *e)
This event handler can be reimplemented in a concrete tool class to receive mouse double click events...
void drawRepository(const std::string &source, const te::gm::Envelope &e, int srid)
boost::intrusive_ptr< AbstractLayer > AbstractLayerPtr
bool isValid() const
It tells if the rectangle is valid or not.
TEGEOMEXPORT Geometry * GetGeomFromEnvelope(const Envelope *const e, int srid)
It creates a Geometry (a polygon) from the given envelope.
void pickFeature(const te::map::AbstractLayerPtr &layer, const QPointF &pos)