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)