📄 qgsgrassedittools.cpp
字号:
} 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 + -