⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qgsgrassedittools.cpp

📁 一个非常好的GIS开源新版本
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************    qgsgrassedittools.cpp -    GRASS Edit tools                             -------------------    begin                : March, 2004    copyright            : (C) 2004 by Radim Blazek    email                : blazek@itc.it ***************************************************************************//*************************************************************************** *                                                                         * *   This program is free software; you can redistribute it and/or modify  * *   it under the terms of the GNU General Public License as published by  * *   the Free Software Foundation; either version 2 of the License, or     * *   (at your option) any later version.                                   * *                                                                         * ***************************************************************************/#include "qgisinterface.h"#include "qgsmapcanvas.h"#include "qgsmaplayer.h"#include "qgsvectorlayer.h"#include "qgsgrassedittools.h"#include "qgsgrassedit.h"#include "qgsgrassattributes.h"#include "../../src/providers/grass/qgsgrassprovider.h"#include "qgsvertexmarker.h"extern "C" {#include <grass/gis.h>#include <grass/Vect.h>}QgsGrassEditTool::QgsGrassEditTool(QgsGrassEdit* edit)  : QgsMapTool(edit->mCanvas), e(edit){}void QgsGrassEditTool::canvasPressEvent(QMouseEvent * event){  QgsPoint point = toLayerCoords(e->layer(), event->pos());  mouseClick(point,  event->button());  // Set last click  e->mLastPoint = point;  e->statusBar()->message(e->mCanvasPrompt);#ifdef QGISDEBUG  std::cerr << "n_points = " << e->mEditPoints->n_points << std::endl;#endif}void QgsGrassEditTool::canvasMoveEvent(QMouseEvent * event){  QgsPoint point = toLayerCoords(e->layer(), event->pos());  mouseMove(point);  e->statusBar()->message(e->mCanvasPrompt);}// ------------------------------------------------------------------// NEW POINT + NEW CENTROID// ------------------------------------------------------------------QgsGrassEditNewPoint::QgsGrassEditNewPoint(QgsGrassEdit* edit, bool newCentroid)  : QgsGrassEditTool(edit), mNewCentroid(newCentroid){  if (newCentroid)    e->setCanvasPropmt( QObject::tr("New centroid"), "", "" );  else    e->setCanvasPropmt( QObject::tr("New point"), "", "" );}void QgsGrassEditNewPoint::mouseClick(QgsPoint & point, Qt::ButtonState button){  if ( button != Qt::LeftButton)    return;  Vect_reset_line ( e->mEditPoints );  e->snap ( point );   Vect_append_point ( e->mEditPoints, point.x(), point.y(), 0.0 );  int type;  if (mNewCentroid) // new centroid or point ?    type = GV_CENTROID;  else    type = GV_POINT;  int line;  line = e->writeLine ( type, e->mEditPoints );  e->updateSymb();  e->displayUpdated();  if ( e->mAttributes )   {    e->mAttributes->setLine ( line );    e->mAttributes->clear();  }  else  {    e->mAttributes = new QgsGrassAttributes ( e, e->mProvider, line, e->mIface->getMainWindow() );  }  for ( int i = 0; i < e->mCats->n_cats; i++ ) {    e->addAttributes ( e->mCats->field[i], e->mCats->cat[i] );  }  e->mAttributes->show();  e->mAttributes->raise();}// ------------------------------------------------------------------// NEW LINE + NEW BOUNDARY// ------------------------------------------------------------------QgsGrassEditNewLine::QgsGrassEditNewLine(QgsGrassEdit* edit, bool newBoundary)  : QgsGrassEditTool(edit), mNewBoundary(newBoundary){  e->setCanvasPropmt( QObject::tr("New vertex"), "", "");}void QgsGrassEditNewLine::deactivate(){  // Delete last segment  if ( e->mEditPoints->n_points > 1 ) {    Vect_reset_line ( e->mPoints );    Vect_append_points ( e->mPoints, e->mEditPoints, GV_FORWARD );    e->displayDynamic ( e->mPoints );  }  e->setCanvasPropmt( QObject::tr("New vertex"), "", "");  QgsGrassEditTool::deactivate(); // call default bahivour}void QgsGrassEditNewLine::activate(){  std::cerr << "QgsGrassEditNewLine::activate()" << std::endl;  // Display dynamic segment  if ( e->mEditPoints->n_points > 0 ) {    Vect_reset_line ( e->mPoints );    Vect_append_points ( e->mPoints, e->mEditPoints, GV_FORWARD );    QgsPoint point = toMapCoords( e->mCanvas->mouseLastXY() );    Vect_append_point ( e->mPoints, point.x(), point.y(), 0.0 );    e->displayDynamic ( e->mPoints );  }  QgsGrassEditTool::activate(); // call default bahivour}void QgsGrassEditNewLine::mouseClick(QgsPoint & point, Qt::ButtonState button){  switch ( button ) {    case Qt::LeftButton:      if ( e->mEditPoints->n_points > 2 )      {        e->snap ( point, e->mEditPoints->x[0], e->mEditPoints->y[0] );       }      else      {        e->snap ( point );       }      Vect_append_point ( e->mEditPoints, point.x(), point.y(), 0.0 );      // Draw      Vect_reset_line ( e->mPoints );      Vect_append_points ( e->mPoints, e->mEditPoints, GV_FORWARD );      e->displayDynamic ( e->mPoints );      break;    case Qt::MidButton:      if ( e->mEditPoints->n_points > 0 ) {        e->mEditPoints->n_points--;        Vect_reset_line ( e->mPoints );        Vect_append_points ( e->mPoints, e->mEditPoints, GV_FORWARD );        QgsPoint point = toMapCoords( e->mCanvas->mouseLastXY() );        Vect_append_point ( e->mPoints, point.x(), point.y(), 0.0 );        e->displayDynamic ( e->mPoints );      }      break;    case Qt::RightButton:      e->eraseDynamic();      if ( e->mEditPoints->n_points > 1 ) {        int type;        if ( mNewBoundary ) // boundary or line?          type = GV_BOUNDARY;        else          type = GV_LINE;        int line;        line = e->writeLine ( type, e->mEditPoints );        e->updateSymb();        e->displayUpdated();        if ( e->mAttributes )         {          e->mAttributes->setLine ( line );          e->mAttributes->clear();        }        else        {          e->mAttributes = new QgsGrassAttributes ( e, e->mProvider, line, e->mIface->getMainWindow() );        }        for ( int i = 0; i < e->mCats->n_cats; i++ ) {          e->addAttributes ( e->mCats->field[i], e->mCats->cat[i] );        }        e->mAttributes->show();        e->mAttributes->raise();      }      Vect_reset_line ( e->mEditPoints );      break;  }  if ( e->mEditPoints->n_points == 0 ) {    e->setCanvasPropmt( QObject::tr("New point"), "", "");  } else if ( e->mEditPoints->n_points == 1 ) {    e->setCanvasPropmt( QObject::tr("New point"), QObject::tr("Undo last point"), "" );  } else if ( e->mEditPoints->n_points > 1 ) {    e->setCanvasPropmt( QObject::tr("New point"), QObject::tr("Undo last point"), QObject::tr("Close line"));  }}void QgsGrassEditNewLine::mouseMove(QgsPoint & newPoint){  if ( e->mEditPoints->n_points > 0 ) {    // Draw the line with new segment    Vect_reset_line ( e->mPoints );    Vect_append_points ( e->mPoints, e->mEditPoints, GV_FORWARD );    Vect_append_point ( e->mPoints, newPoint.x(), newPoint.y(), 0.0 );    e->displayDynamic ( e->mPoints );  }}// ------------------------------------------------------------------// MOVE VERTEX// ------------------------------------------------------------------QgsGrassEditMoveVertex::QgsGrassEditMoveVertex(QgsGrassEdit* edit)  : QgsGrassEditTool(edit){  e->setCanvasPropmt( QObject::tr("Select vertex"), "", "" );}    void QgsGrassEditMoveVertex::mouseClick(QgsPoint & point, Qt::ButtonState button){  double thresh = e->threshold();  switch ( button ) {    case Qt::LeftButton:      // Move previously selected vertex       if ( e->mSelectedLine > 0 ) {        e->eraseDynamic();        e->eraseElement ( e->mSelectedLine );        // Move vertex        int type = e->mProvider->readLine ( e->mPoints, e->mCats, e->mSelectedLine );        e->snap ( point );         e->mPoints->x[e->mSelectedPart] = point.x();        e->mPoints->y[e->mSelectedPart] = point.y();        Vect_line_prune ( e->mPoints );        e->mProvider->rewriteLine ( e->mSelectedLine, type, e->mPoints, e->mCats );        e->updateSymb();        e->displayUpdated();        e->mSelectedLine = 0;        Vect_reset_line ( e->mEditPoints );        e->setCanvasPropmt( QObject::tr("Select vertex"), "", "" );      } else {        // Select new line        e->mSelectedLine = e->mProvider->findLine ( point.x(), point.y(), GV_LINES, thresh );        if ( e->mSelectedLine ) { // highlite          e->mProvider->readLine ( e->mEditPoints, NULL, e->mSelectedLine );          e->displayElement ( e->mSelectedLine, e->mSymb[QgsGrassEdit::SYMB_HIGHLIGHT], e->mSize );          double xl, yl; // nearest point on the line          // Note first segment is 1!          e->mSelectedPart = Vect_line_distance ( e->mEditPoints, point.x(), point.y(), 0.0, 0,             &xl, &yl, NULL, NULL, NULL, NULL );          double dist1 = Vect_points_distance ( xl, yl, 0.0, e->mEditPoints->x[e->mSelectedPart-1],             e->mEditPoints->y[e->mSelectedPart-1], 0.0, 0);          double dist2 = Vect_points_distance ( xl, yl, 0.0, e->mEditPoints->x[e->mSelectedPart],             e->mEditPoints->y[e->mSelectedPart], 0.0, 0);          if ( dist1 < dist2 ) e->mSelectedPart--;          e->setCanvasPropmt( QObject::tr("Select new position"), "", "Release vertex" );        }      }      break;    case Qt::RightButton:      e->eraseDynamic();      e->displayElement ( e->mSelectedLine, e->mSymb[e->mLineSymb[e->mSelectedLine]], e->mSize );      e->mSelectedLine = 0;      Vect_reset_line ( e->mEditPoints );      e->setCanvasPropmt( QObject::tr("Select vertex"), "", "" );      break;    case Qt::MidButton:      break;  }}void QgsGrassEditMoveVertex::mouseMove(QgsPoint & newPoint){  if ( e->mSelectedLine > 0 ) {    // Transform coordinates    Vect_reset_line ( e->mPoints );    if ( e->mSelectedPart == 0 ) {      Vect_append_point ( e->mPoints, e->mEditPoints->x[1], e->mEditPoints->y[1], 0.0 );      Vect_append_point ( e->mPoints, newPoint.x(), newPoint.y(), 0.0 );    } else if ( e->mSelectedPart == e->mEditPoints->n_points-1 ) {      Vect_append_point ( e->mPoints, e->mEditPoints->x[e->mSelectedPart-1],         e->mEditPoints->y[e->mSelectedPart-1], 0.0 );      Vect_append_point ( e->mPoints, newPoint.x(), newPoint.y(), 0.0 );    } else {      Vect_append_point ( e->mPoints, e->mEditPoints->x[e->mSelectedPart-1],         e->mEditPoints->y[e->mSelectedPart-1], 0.0 );      Vect_append_point ( e->mPoints, newPoint.x(), newPoint.y(), 0.0 );      Vect_append_point ( e->mPoints, e->mEditPoints->x[e->mSelectedPart+1],         e->mEditPoints->y[e->mSelectedPart+1], 0.0 );    }    for (int i = 0; i < e->mPoints->n_points; i++ ) {      std::cerr << e->mPoints->x[i] << " " << e->mPoints->y[i] << std::endl;    }    e->displayDynamic ( e->mPoints );  }}// ------------------------------------------------------------------// ADD VERTEX// ------------------------------------------------------------------QgsGrassEditAddVertex::QgsGrassEditAddVertex(QgsGrassEdit* edit)  : QgsGrassEditTool(edit){  e->setCanvasPropmt( QObject::tr("Select line segment"), "", "" );}    void QgsGrassEditAddVertex::mouseClick(QgsPoint & point, Qt::ButtonState button){  double thresh = e->threshold();  switch ( button ) {    case Qt::LeftButton:      // Add vertex to previously selected line      if ( e->mSelectedLine > 0 ) {        e->eraseDynamic();        e->eraseElement ( e->mSelectedLine );        // Move vertex        int type = e->mProvider->readLine ( e->mPoints, e->mCats, e->mSelectedLine );        if ( e->mAddVertexEnd && e->mSelectedPart == e->mEditPoints->n_points-1 ) {          e->snap ( point );           Vect_append_point ( e->mPoints, point.x(), point.y(), 0.0 );        } else {          Vect_line_insert_point ( e->mPoints, e->mSelectedPart, point.x(), point.y(), 0.0 );        }        Vect_line_prune ( e->mPoints );        e->mProvider->rewriteLine ( e->mSelectedLine, type, e->mPoints, e->mCats );        e->updateSymb();        e->displayUpdated();        e->mSelectedLine = 0;        Vect_reset_line ( e->mEditPoints );        e->setCanvasPropmt( QObject::tr("Select line segment"), "", "" );      } else {        // Select new line        e->mSelectedLine = e->mProvider->findLine ( point.x(), point.y(), GV_LINES, thresh );        if ( e->mSelectedLine ) { // highlite          e->mProvider->readLine ( e->mEditPoints, NULL, e->mSelectedLine );          e->displayElement ( e->mSelectedLine, e->mSymb[QgsGrassEdit::SYMB_HIGHLIGHT], e->mSize );          double xl, yl; // nearest point on the line          // Note first segment is 1!          e->mSelectedPart = Vect_line_distance ( e->mEditPoints, point.x(), point.y(), 0.0, 0,             &xl, &yl, NULL, NULL, NULL, NULL );          double dist1 = Vect_points_distance ( xl, yl, 0.0, e->mEditPoints->x[e->mSelectedPart-1],             e->mEditPoints->y[e->mSelectedPart-1], 0.0, 0);          double dist2 = Vect_points_distance ( xl, yl, 0.0, e->mEditPoints->x[e->mSelectedPart],             e->mEditPoints->y[e->mSelectedPart], 0.0, 0);          double maxdist = (dist1 + dist2)/4;          if ( e->mSelectedPart == 1 && dist1 < maxdist ) {            e->mSelectedPart = 0;            e->mAddVertexEnd = true;          } else if ( e->mSelectedPart == e->mEditPoints->n_points-1 && dist2 < maxdist ) {            e->mAddVertexEnd = true;          } else {            e->mAddVertexEnd = false;          }          e->setCanvasPropmt( QObject::tr("New vertex position"), "", QObject::tr("Release") );        } else {          e->setCanvasPropmt( QObject::tr("Select line segment"), "", "" );        }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -