25 QString QgsRectanglesOvalsDiamondsAlgorithm::name()
const
27 return QStringLiteral(
"rectanglesovalsdiamonds" );
30 QString QgsRectanglesOvalsDiamondsAlgorithm::displayName()
const
32 return QObject::tr(
"Rectangles, ovals, diamonds" );
35 QStringList QgsRectanglesOvalsDiamondsAlgorithm::tags()
const
37 return QObject::tr(
"buffer,grow,fixed,variable,distance,rectangle,oval,diamond,point" ).split(
',' );
40 QString QgsRectanglesOvalsDiamondsAlgorithm::group()
const
42 return QObject::tr(
"Vector geometry" );
45 QString QgsRectanglesOvalsDiamondsAlgorithm::groupId()
const
47 return QStringLiteral(
"vectorgeometry" );
50 QString QgsRectanglesOvalsDiamondsAlgorithm::shortHelpString()
const
52 return QObject::tr(
"Creates rectangle, oval or diamond-shaped polygons from the input point layer using "
53 "specified width, height and (optional) rotation values. Multipart inputs should be promoted "
54 "to singleparts first." );
57 QString QgsRectanglesOvalsDiamondsAlgorithm::outputName()
const
59 return QObject::tr(
"Polygon" );
62 QList<int> QgsRectanglesOvalsDiamondsAlgorithm::inputLayerTypes()
const
87 QgsRectanglesOvalsDiamondsAlgorithm *QgsRectanglesOvalsDiamondsAlgorithm::createInstance()
const
89 return new QgsRectanglesOvalsDiamondsAlgorithm();
92 void QgsRectanglesOvalsDiamondsAlgorithm::initParameters(
const QVariantMap & )
94 addParameter(
new QgsProcessingParameterEnum( QStringLiteral(
"SHAPE" ), QObject::tr(
"Shape" ), QStringList() << QObject::tr(
"Rectangle" ) << QObject::tr(
"Diamond" ) << QObject::tr(
"Oval" ),
false, 0 ) );
96 auto widthParam = std::make_unique < QgsProcessingParameterDistance >( QStringLiteral(
"WIDTH" ), QObject::tr(
"Width" ), 1.0, QStringLiteral(
"INPUT" ),
false, 0.0 );
97 widthParam->setIsDynamic(
true );
99 widthParam->setDynamicLayerParameterName( QStringLiteral(
"INPUT" ) );
100 addParameter( widthParam.release() );
102 auto heightParam = std::make_unique < QgsProcessingParameterDistance >( QStringLiteral(
"HEIGHT" ), QObject::tr(
"Height" ), 1.0, QStringLiteral(
"INPUT" ),
false, 0.0 );
103 heightParam->setIsDynamic(
true );
105 heightParam->setDynamicLayerParameterName( QStringLiteral(
"INPUT" ) );
106 addParameter( heightParam.release() );
108 auto rotationParam = std::make_unique < QgsProcessingParameterNumber >( QStringLiteral(
"ROTATION" ), QObject::tr(
"Rotation" ),
QgsProcessingParameterNumber::Double, 0.0,
true, -360.0, 360.0 );
109 rotationParam->setIsDynamic(
true );
111 rotationParam->setDynamicLayerParameterName( QStringLiteral(
"INPUT" ) );
112 addParameter( rotationParam.release() );
119 mShape = parameterAsEnum( parameters, QStringLiteral(
"SHAPE" ), context );
121 mWidth = parameterAsDouble( parameters, QStringLiteral(
"WIDTH" ), context );
124 mWidthProperty = parameters.value( QStringLiteral(
"WIDTH" ) ).value<
QgsProperty >();
126 mHeight = parameterAsDouble( parameters, QStringLiteral(
"HEIGHT" ), context );
128 if ( mDynamicHeight )
129 mHeightProperty = parameters.value( QStringLiteral(
"HEIGHT" ) ).value<
QgsProperty >();
131 mRotation = parameterAsDouble( parameters, QStringLiteral(
"ROTATION" ), context );
133 if ( mDynamicRotation )
134 mRotationProperty = parameters.value( QStringLiteral(
"ROTATION" ) ).value<
QgsProperty >();
136 mSegments = parameterAsDouble( parameters, QStringLiteral(
"SEGMENTS" ), context );
149 throw QgsProcessingException( QObject::tr(
"Multipart geometry. Please promote input layer to singleparts first." ) );
152 double width = mWidth;
156 double height = mHeight;
157 if ( mDynamicHeight )
160 double rotation = mRotation;
161 if ( mDynamicRotation )
164 if ( width == 0 || height == 0 )
169 const double phi = rotation * M_PI / 180;
170 const double xOffset = width / 2.0;
171 const double yOffset = height / 2.0;
173 const double x = point.
x();
174 const double y = point.
y();
176 QVector< double > ringX( 5 );
177 QVector< double > ringY( 5 );
183 ringX = { -xOffset + x, -xOffset + x, xOffset + x, xOffset + x, -xOffset + x };
184 ringY = { -yOffset + y, yOffset + y, yOffset + y, -yOffset + y, -yOffset + y };
188 ringX = { x, -xOffset + x, x, xOffset + x, x };
189 ringY = { -yOffset + y, y, yOffset + y, y, -yOffset + y };
193 ringX.resize( mSegments + 1 );
194 ringY.resize( mSegments + 1 );
195 for (
int i = 0; i < mSegments; i ++ )
197 const double t = ( 2 * M_PI ) / mSegments * i;
198 ringX[ i ] = xOffset * cos( t ) + x;
199 ringY[ i ] = yOffset * sin( t ) + y;
201 ringX[ mSegments ] = ringX.at( 0 );
202 ringY[ mSegments ] = ringY.at( 0 );
208 for (
int i = 0; i < ringX.size(); ++i )
210 const double px = ringX.at( i );
211 const double py = ringY.at( i );
212 ringX[ i ] = ( px - x ) * cos( phi ) + ( py - y ) * sin( phi ) + x;
213 ringY[ i ] = -( px - x ) * sin( phi ) + ( py - y ) * cos( phi ) + y;
217 std::unique_ptr< QgsPolygon > poly = std::make_unique< QgsPolygon >();