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

📄 qgsgrassedittools.cpp

📁 一个非常好的GIS开源新版本
💻 CPP
📖 第 1 页 / 共 2 页
字号:
      }      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 line segment"), "", "" );      break;    case Qt::MidButton:      break;  }}void QgsGrassEditAddVertex::mouseMove(QgsPoint & newPoint){  if ( e->mSelectedLine > 0 ) {    Vect_reset_line ( e->mPoints );    if ( e->mAddVertexEnd ) {      Vect_append_point ( e->mPoints, e->mEditPoints->x[e->mSelectedPart],         e->mEditPoints->y[e->mSelectedPart], 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],         e->mEditPoints->y[e->mSelectedPart], 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 );  }}// ------------------------------------------------------------------// DELETE VERTEX// ------------------------------------------------------------------QgsGrassEditDeleteVertex::QgsGrassEditDeleteVertex(QgsGrassEdit* edit)  : QgsGrassEditTool(edit){  e->setCanvasPropmt( QObject::tr("Select vertex"), "", "" );}    void QgsGrassEditDeleteVertex::mouseClick(QgsPoint & point, Qt::ButtonState button){  double thresh = e->threshold();  switch ( button ) {    case Qt::LeftButton:      // Delete 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 );        Vect_line_delete_point ( e->mPoints, e->mSelectedPart );        if ( e->mPoints->n_points < 2 ) // delete line        {          e->mProvider->deleteLine ( e->mSelectedLine );          // Check orphan records          for ( int i = 0 ; i < e->mCats->n_cats; i++ ) {            e->checkOrphan ( e->mCats->field[i], e->mCats->cat[i] );          }        }        else         {          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/next 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->displayDynamic ( e->mEditPoints->x[e->mSelectedPart], e->mEditPoints->y[e->mSelectedPart],             QgsVertexMarker::ICON_BOX, e->mSize );          e->setCanvasPropmt( QObject::tr("Delete vertex"), "", QObject::tr("Release vertex") );        } else {          e->setCanvasPropmt( QObject::tr("Select 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;  }}// ------------------------------------------------------------------// MOVE LINE// ------------------------------------------------------------------QgsGrassEditMoveLine::QgsGrassEditMoveLine(QgsGrassEdit* edit)  : QgsGrassEditTool(edit){  e->setCanvasPropmt( QObject::tr("Select element"), "", "" );}    void QgsGrassEditMoveLine::mouseClick(QgsPoint & point, Qt::ButtonState button){  double thresh = e->threshold();  switch ( button ) {    case Qt::LeftButton:      // Move previously selected line       if ( e->mSelectedLine > 0 ) {        e->eraseDynamic();        e->eraseElement ( e->mSelectedLine );        // Transform coordinates        int type = e->mProvider->readLine ( e->mPoints, e->mCats, e->mSelectedLine );        for ( int i = 0; i < e->mPoints->n_points; i++ ) {          e->mPoints->x[i] += point.x() - e->mLastPoint.x();           e->mPoints->y[i] += point.y() - e->mLastPoint.y();         }        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 element"), "", "" );      } else {        // Select new/next line        e->mSelectedLine = e->mProvider->findLine ( point.x(), point.y(), GV_POINT|GV_CENTROID, thresh );        if ( e->mSelectedLine == 0 )           e->mSelectedLine = e->mProvider->findLine ( point.x(), point.y(), GV_LINE|GV_BOUNDARY, thresh );        if ( e->mSelectedLine ) { // highlite          e->mProvider->readLine ( e->mEditPoints, NULL, e->mSelectedLine );          e->displayElement ( e->mSelectedLine, e->mSymb[QgsGrassEdit::SYMB_HIGHLIGHT], e->mSize );          e->setCanvasPropmt( QObject::tr("New location"), "", QObject::tr("Release selected") );        } else {           e->setCanvasPropmt( QObject::tr("Select element"), "", "" );        }      }      break;    case Qt::RightButton:      e->eraseDynamic();      e->displayElement ( e->mSelectedLine, e->mSymb[e->mLineSymb[e->mSelectedLine]], e->mSize );      e->mSelectedLine = 0;      e->setCanvasPropmt( QObject::tr("Select element"), "", "" );      break;    case Qt::MidButton:      break;  }}void QgsGrassEditMoveLine::mouseMove(QgsPoint & newPoint){  // Move previously selected line   if ( e->mSelectedLine > 0 ) {    // Transform coordinates    Vect_reset_line ( e->mPoints );    Vect_append_points ( e->mPoints, e->mEditPoints, GV_FORWARD );    for ( int i = 0; i < e->mPoints->n_points; i++ ) {      e->mPoints->x[i] += newPoint.x() - e->mLastPoint.x();       e->mPoints->y[i] += newPoint.y() - e->mLastPoint.y();     }    e->displayDynamic ( e->mPoints );  }}// ------------------------------------------------------------------// DELETE LINE// ------------------------------------------------------------------QgsGrassEditDeleteLine::QgsGrassEditDeleteLine(QgsGrassEdit* edit)  : QgsGrassEditTool(edit){  e->setCanvasPropmt( QObject::tr("Select element"), "", "" );}    void QgsGrassEditDeleteLine::mouseClick(QgsPoint & point, Qt::ButtonState button){  double thresh = e->threshold();  switch ( button ) {    case Qt::LeftButton:      // Delete previously selected line       if ( e->mSelectedLine > 0 ) {        e->eraseElement ( e->mSelectedLine );        e->mProvider->readLine ( NULL, e->mCats, e->mSelectedLine );        e->mProvider->deleteLine ( e->mSelectedLine );        // Check orphan records        for ( int i = 0 ; i < e->mCats->n_cats; i++ ) {          e->checkOrphan ( e->mCats->field[i], e->mCats->cat[i] );        }        e->updateSymb();        e->displayUpdated();      }      // Select new/next line      e->mSelectedLine = e->mProvider->findLine ( point.x(), point.y(), GV_POINT|GV_CENTROID, thresh );      if ( e->mSelectedLine == 0 )         e->mSelectedLine = e->mProvider->findLine ( point.x(), point.y(), GV_LINE|GV_BOUNDARY, thresh );      if ( e->mSelectedLine ) { // highlite, propmt        e->displayElement ( e->mSelectedLine, e->mSymb[QgsGrassEdit::SYMB_HIGHLIGHT], e->mSize );        e->setCanvasPropmt( QObject::tr("Delete selected / select next"), "", QObject::tr("Release selected") );      } else {        e->setCanvasPropmt( QObject::tr("Select element"), "", "" );      }      break;    case Qt::RightButton:      e->displayElement ( e->mSelectedLine, e->mSymb[e->mLineSymb[e->mSelectedLine]], e->mSize );      e->mSelectedLine = 0;      e->setCanvasPropmt( QObject::tr("Select element"), "", "" );      break;    case Qt::MidButton:      break;  }}// ------------------------------------------------------------------// SPLIT LINE// ------------------------------------------------------------------QgsGrassEditSplitLine::QgsGrassEditSplitLine(QgsGrassEdit* edit)  : QgsGrassEditTool(edit){  e->setCanvasPropmt( QObject::tr("Select position on line"), "", "" );}    void QgsGrassEditSplitLine::mouseClick(QgsPoint & point, Qt::ButtonState button){  double thresh = e->threshold();  switch ( button ) {    case Qt::LeftButton:      // Split previously selected line       if ( e->mSelectedLine > 0 ) {        e->eraseDynamic();        e->eraseElement ( e->mSelectedLine );        int type = e->mProvider->readLine ( e->mPoints, e->mCats, e->mSelectedLine );        double xl, yl;        Vect_line_distance ( e->mPoints, e->mLastPoint.x(), e->mLastPoint.y(), 0.0, 0,           &xl, &yl, NULL, NULL, NULL, NULL );        e->mPoints->n_points = e->mSelectedPart;        Vect_append_point ( e->mPoints, xl, yl, 0.0 );        e->mProvider->rewriteLine ( e->mSelectedLine, type, e->mPoints, e->mCats );        e->updateSymb();        e->displayUpdated();        Vect_reset_line ( e->mPoints );        Vect_append_point ( e->mPoints, xl, yl, 0.0 );        for ( int i = e->mSelectedPart; i < e->mEditPoints->n_points; i++ ) {          Vect_append_point ( e->mPoints, e->mEditPoints->x[i], e->mEditPoints->y[i], 0.0 );        }        e->mProvider->writeLine ( type, e->mPoints, e->mCats );        e->updateSymb();        e->displayUpdated();        e->mSelectedLine = 0;        Vect_reset_line ( e->mEditPoints );        e->setCanvasPropmt( QObject::tr("Select position on line"), "", "" );      } else {        // Select new/next 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 );          e->displayDynamic ( xl, yl, QgsVertexMarker::ICON_X, e->mSize );          e->setCanvasPropmt( QObject::tr("Split the line"), "", QObject::tr("Release the line") );        } else {          e->setCanvasPropmt( QObject::tr("Select point on line"), "", "" );        }      }      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 point on line"), "", "" );      break;    case Qt::MidButton:      break;  }}// ------------------------------------------------------------------// EDIT ATTRIBUTES// ------------------------------------------------------------------QgsGrassEditAttributes::QgsGrassEditAttributes(QgsGrassEdit* edit)  : QgsGrassEditTool(edit){  e->setCanvasPropmt( QObject::tr("Select element"), "", "" );}    void QgsGrassEditAttributes::mouseClick(QgsPoint & point, Qt::ButtonState button){  double thresh = e->threshold();  // Redraw previously selected line   if ( e->mSelectedLine > 0 ) {    e->displayElement ( e->mSelectedLine, e->mSymb[e->mLineSymb[e->mSelectedLine]], e->mSize );  }  // Select new/next line  e->mSelectedLine = e->mProvider->findLine ( point.x(), point.y(), GV_POINT|GV_CENTROID, thresh );  if ( e->mSelectedLine == 0 )     e->mSelectedLine = e->mProvider->findLine ( point.x(), point.y(), GV_LINE|GV_BOUNDARY, thresh );#ifdef QGISDEBUG  std::cerr << "mSelectedLine = " << e->mSelectedLine << std::endl;#endif  if ( e->mAttributes )   {    e->mAttributes->setLine ( 0 );    e->mAttributes->clear();    e->mAttributes->raise();  }  if ( e->mSelectedLine ) { // highlite    e->displayElement ( e->mSelectedLine, e->mSymb[QgsGrassEdit::SYMB_HIGHLIGHT], e->mSize );    e->mProvider->readLine ( NULL, e->mCats, e->mSelectedLine );    if ( !e->mAttributes )     {      e->mAttributes = new QgsGrassAttributes ( e, e->mProvider, e->mSelectedLine, e->mIface->getMainWindow() );    }    else    {      e->mAttributes->setLine ( e->mSelectedLine );    }    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();  }}

⌨️ 快捷键说明

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