bool QgsLineString::insertVertex( QgsVertexId position, const QgsPoint &vertex ) { if ( position.vertex < 0 || position.vertex > mX.size() ) { return false; } if ( mWkbType == QgsWkbTypes::Unknown || mX.isEmpty() ) { setZMTypeFromSubGeometry( &vertex, QgsWkbTypes::LineString ); } mX.insert( position.vertex, vertex.x() ); mY.insert( position.vertex, vertex.y() ); if ( is3D() ) { mZ.insert( position.vertex, vertex.z() ); } if ( isMeasure() ) { mM.insert( position.vertex, vertex.m() ); } clearCache(); //set bounding box invalid return true; }
bool QgsCircularString::insertVertex( QgsVertexId position, const QgsPoint &vertex ) { if ( position.vertex >= mX.size() || position.vertex < 1 ) { return false; } mX.insert( position.vertex, vertex.x() ); mY.insert( position.vertex, vertex.y() ); if ( is3D() ) { mZ.insert( position.vertex, vertex.z() ); } if ( isMeasure() ) { mM.insert( position.vertex, vertex.m() ); } bool vertexNrEven = ( position.vertex % 2 == 0 ); if ( vertexNrEven ) { insertVertexBetween( position.vertex - 2, position.vertex - 1, position.vertex ); } else { insertVertexBetween( position.vertex, position.vertex + 1, position.vertex - 1 ); } clearCache(); //set bounding box invalid return true; }
void QgsMapToolIdentify::closestVertexAttributes( const QgsAbstractGeometry &geometry, QgsVertexId vId, QgsMapLayer *layer, QMap< QString, QString > &derivedAttributes ) { QString str = QLocale::system().toString( vId.vertex + 1 ); derivedAttributes.insert( tr( "Closest vertex number" ), str ); QgsPoint closestPoint = geometry.vertexAt( vId ); QgsPointXY closestPointMapCoords = mCanvas->mapSettings().layerToMapCoordinates( layer, QgsPointXY( closestPoint.x(), closestPoint.y() ) ); derivedAttributes.insert( QStringLiteral( "Closest vertex X" ), formatXCoordinate( closestPointMapCoords ) ); derivedAttributes.insert( QStringLiteral( "Closest vertex Y" ), formatYCoordinate( closestPointMapCoords ) ); if ( closestPoint.is3D() ) { str = QLocale::system().toString( closestPoint.z(), 'g', 10 ); derivedAttributes.insert( QStringLiteral( "Closest vertex Z" ), str ); } if ( closestPoint.isMeasure() ) { str = QLocale::system().toString( closestPoint.m(), 'g', 10 ); derivedAttributes.insert( QStringLiteral( "Closest vertex M" ), str ); } if ( vId.type == QgsVertexId::CurveVertex ) { double radius, centerX, centerY; QgsVertexId vIdBefore = vId; --vIdBefore.vertex; QgsVertexId vIdAfter = vId; ++vIdAfter.vertex; QgsGeometryUtils::circleCenterRadius( geometry.vertexAt( vIdBefore ), geometry.vertexAt( vId ), geometry.vertexAt( vIdAfter ), radius, centerX, centerY ); derivedAttributes.insert( QStringLiteral( "Closest vertex radius" ), QLocale::system().toString( radius ) ); } }
void QgsMapToolIdentify::closestPointAttributes( const QgsAbstractGeometry &geometry, QgsMapLayer *layer, const QgsPointXY &layerPoint, QMap< QString, QString > &derivedAttributes ) { Q_UNUSED( layer ); // measure if ( QgsWkbTypes::hasM( geometry.wkbType() ) ) { QgsPoint closestPoint = QgsGeometryUtils::closestPoint( geometry, QgsPoint( layerPoint.x(), layerPoint.y() ) ); QString str = QLocale::system().toString( closestPoint.m(), 'g', 10 ); derivedAttributes.insert( QStringLiteral( "Closest point M" ), str ); } }
QgsLineString::QgsLineString( const QgsPoint &p1, const QgsPoint &p2 ) { mWkbType = QgsWkbTypes::LineString; mX.resize( 2 ); mX[ 0 ] = p1.x(); mX[ 1 ] = p2.x(); mY.resize( 2 ); mY[ 0 ] = p1.y(); mY[ 1 ] = p2.y(); if ( p1.is3D() ) { mWkbType = QgsWkbTypes::addZ( mWkbType ); mZ.resize( 2 ); mZ[ 0 ] = p1.z(); mZ[ 1 ] = p2.z(); } if ( p1.isMeasure() ) { mWkbType = QgsWkbTypes::addM( mWkbType ); mM.resize( 2 ); mM[ 0 ] = p1.m(); mM[ 1 ] = p2.m(); } }
void QgsLineString::addVertex( const QgsPoint &pt ) { if ( mWkbType == QgsWkbTypes::Unknown || mX.isEmpty() ) { setZMTypeFromSubGeometry( &pt, QgsWkbTypes::LineString ); } mX.append( pt.x() ); mY.append( pt.y() ); if ( is3D() ) { mZ.append( pt.z() ); } if ( isMeasure() ) { mM.append( pt.m() ); } clearCache(); //set bounding box invalid }
bool QgsLineString::moveVertex( QgsVertexId position, const QgsPoint &newPos ) { if ( position.vertex < 0 || position.vertex >= mX.size() ) { return false; } mX[position.vertex] = newPos.x(); mY[position.vertex] = newPos.y(); if ( is3D() && newPos.is3D() ) { mZ[position.vertex] = newPos.z(); } if ( isMeasure() && newPos.isMeasure() ) { mM[position.vertex] = newPos.m(); } clearCache(); //set bounding box invalid return true; }