111 PyErr_SetString( PyExc_ValueError, u
"argument 1 has unexpected type '%1'."_s.arg(
QgsWkbTypes::displayString( curveType ) ).toUtf8().constData() );
116 sipCpp->append( a0 );
134 QgsPoint pointN(
int i )
const;
145 SIP_PYOBJECT pointN(
int i )
const SIP_TYPEHINT( QgsPoint );
147 const int count = sipCpp->numPoints();
148 if ( a0 < -count || a0 >= count )
150 PyErr_SetString( PyExc_IndexError, QByteArray::number( a0 ) );
155 std::unique_ptr< QgsPoint > p;
157 p = std::make_unique< QgsPoint >( sipCpp->pointN( a0 ) );
159 p = std::make_unique< QgsPoint >( sipCpp->pointN( count + a0 ) );
160 sipRes = sipConvertFromType( p.release(), sipType_QgsPoint, Py_None );
192 return mZ.constData();
207 return mM.constData();
244 [](
double epsilon,
double x1,
double y1,
double z1,
double m1,
245 double x2,
double y2,
double z2,
double m2 )
249 [](
double epsilon,
double x1,
double y1,
double z1,
250 double x2,
double y2,
double z2 )
254 [](
double epsilon,
double x1,
double y1,
double m1,
255 double x2,
double y2,
double m2 )
259 [](
double epsilon,
double x1,
double y1,
260 double x2,
double y2 )
273 [](
double epsilon,
double x1,
double y1,
double z1,
double m1,
274 double x2,
double y2,
double z2,
double m2 )
278 [](
double epsilon,
double x1,
double y1,
double z1,
279 double x2,
double y2,
double z2 )
283 [](
double epsilon,
double x1,
double y1,
double m1,
284 double x2,
double y2,
double m2 )
288 [](
double epsilon,
double x1,
double y1,
289 double x2,
double y2 )
301 double xAt(
int index )
const override;
312 double xAt(
int index )
const override;
314 const int count = sipCpp->numPoints();
315 if ( a0 < -count || a0 >= count )
317 PyErr_SetString( PyExc_IndexError, QByteArray::number( a0 ) );
323 return PyFloat_FromDouble( sipCpp->xAt( a0 ) );
325 return PyFloat_FromDouble( sipCpp->xAt( count + a0 ) );
332 double yAt(
int index )
const override;
343 double yAt(
int index )
const override;
345 const int count = sipCpp->numPoints();
346 if ( a0 < -count || a0 >= count )
348 PyErr_SetString( PyExc_IndexError, QByteArray::number( a0 ) );
354 return PyFloat_FromDouble( sipCpp->yAt( a0 ) );
356 return PyFloat_FromDouble( sipCpp->yAt( count + a0 ) );
371 double zAt(
int index )
const override
373 if ( index >= 0 && index <
mZ.size() )
374 return mZ.at( index );
376 return std::numeric_limits<double>::quiet_NaN();
389 double zAt(
int index )
const override;
391 const int count = sipCpp->numPoints();
392 if ( a0 < -count || a0 >= count )
394 PyErr_SetString( PyExc_IndexError, QByteArray::number( a0 ) );
400 return PyFloat_FromDouble( sipCpp->zAt( a0 ) );
402 return PyFloat_FromDouble( sipCpp->zAt( count + a0 ) );
417 double mAt(
int index )
const override
419 if ( index >= 0 && index <
mM.size() )
420 return mM.at( index );
422 return std::numeric_limits<double>::quiet_NaN();
435 double mAt(
int index )
const override;
437 const int count = sipCpp->numPoints();
438 if ( a0 < -count || a0 >= count )
440 PyErr_SetString( PyExc_IndexError, QByteArray::number( a0 ) );
446 return PyFloat_FromDouble( sipCpp->mAt( a0 ) );
448 return PyFloat_FromDouble( sipCpp->mAt( count + a0 ) );
463 void setXAt(
int index,
double x );
476 void setXAt(
int index,
double x );
478 const int count = sipCpp->numPoints();
479 if ( a0 < -count || a0 >= count )
481 PyErr_SetString( PyExc_IndexError, QByteArray::number( a0 ) );
487 sipCpp->setXAt( a0, a1 );
489 sipCpp->setXAt( count + a0, a1 );
504 void setYAt(
int index,
double y );
517 void setYAt(
int index,
double y );
519 const int count = sipCpp->numPoints();
520 if ( a0 < -count || a0 >= count )
522 PyErr_SetString( PyExc_IndexError, QByteArray::number( a0 ) );
528 sipCpp->setYAt( a0, a1 );
530 sipCpp->setYAt( count + a0, a1 );
547 if ( index >= 0 && index <
mZ.size() )
563 void setZAt(
int index,
double z );
565 const int count = sipCpp->numPoints();
566 if ( a0 < -count || a0 >= count )
568 PyErr_SetString( PyExc_IndexError, QByteArray::number( a0 ) );
574 sipCpp->setZAt( a0, a1 );
576 sipCpp->setZAt( count + a0, a1 );
593 if ( index >= 0 && index <
mM.size() )
609 void setMAt(
int index,
double m );
611 const int count = sipCpp->numPoints();
612 if ( a0 < -count || a0 >= count )
614 PyErr_SetString( PyExc_IndexError, QByteArray::number( a0 ) );
620 sipCpp->setMAt( a0, a1 );
622 sipCpp->setMAt( count + a0, a1 );
630 QString
asWkt(
int precision = 17 )
const override;
631 bool fromWkb( QgsConstWkbPtr &wkb )
override;
632 bool fromWkt(
const QString &wkt )
override;
634 void clear()
override;
640 bool addMValue(
double mValue = 0 ) override;
641 bool addZValue(
double zValue = 0 ) override;
642 bool dropMValue() override;
643 bool dropZValue() override;
648 void scroll(
int firstVertexIndex ) final;
649 void swapXy() override;
652 void filterVertices(
const std::function<
bool(
const QgsPoint & ) > &filter )
override;
653 void transformVertices(
const std::function< QgsPoint(
const QgsPoint & ) > &transform )
override;
655 bool moveVertex( QgsVertexId position,
const QgsPoint &newPos )
override;
658 bool transform( QgsAbstractGeometryTransformer *transformer, QgsFeedback *feedback =
nullptr ) override;
659 void transform( const QgsCoordinateTransform &ct, Qgis::TransformDirection d = Qgis::TransformDirection::Forward,
bool transformZ = false ) override
SIP_THROW( QgsCsException );
660 void transform( const QTransform &t,
double zTranslate = 0.0,
double zScale = 1.0,
double mTranslate = 0.0,
double mScale = 1.0 ) override;
663 int compareToSameClass( const QgsAbstractGeometry *other ) const final;
678 void splitCurveAtVertexProtected(
int index, QVector<
double > &x1, QVector<
double > &y1, QVector<
double > &z1, QVector<
double > &m1, QVector<
double > &x2, QVector<
double > &y2, QVector<
double > &z2, QVector<
double > &m2 ) const;
684 void importVerticesFromWkb( const QgsConstWkbPtr &wkb );
698 std::function<
bool(
double,
double,
double,
double,
double,
double,
double,
double,
double )> comparator3DMeasure,
699 std::function<
bool(
double,
double,
double,
double,
double,
double,
double )> comparator3D,
700 std::function<
bool(
double,
double,
double,
double,
double,
double,
double )> comparatorMeasure,
701 std::function<
bool(
double,
double,
double,
double,
double )> comparator2D
711 const int size =
mX.count();
712 if ( size != otherLine->
mX.count() )
716 const double *
xData =
mX.constData();
717 const double *
yData =
mY.constData();
718 const double *
zData = is3DFlag ?
mZ.constData() :
nullptr;
719 const double *
mData = isMeasureFlag ?
mM.constData() :
nullptr;
720 const double *otherXData = otherLine->
mX.constData();
721 const double *otherYData = otherLine->
mY.constData();
722 const double *otherZData = is3DFlag ? otherLine->
mZ.constData() :
nullptr;
723 const double *otherMData = isMeasureFlag ? otherLine->
mM.constData() :
nullptr;
724 for (
int i = 0; i < size; ++i )
726 if ( is3DFlag && isMeasureFlag )
728 result &= comparator3DMeasure( epsilon, *
xData++, *
yData++, *
zData++, *
mData++, *otherXData++, *otherYData++, *otherZData++, *otherMData++ );
732 result &= comparator3D( epsilon, *
xData++, *
yData++, *
zData++, *otherXData++, *otherYData++, *otherZData++ );
734 else if ( isMeasureFlag )
736 result &= comparatorMeasure( epsilon, *
xData++, *
yData++, *
mData++, *otherXData++, *otherYData++, *otherMData++ );
740 result &= comparator2D( epsilon, *
xData++, *
yData++, *otherXData++, *otherYData++ );