void QgsSymbolsListWidget::setMarkerSize( double size ) { QgsMarkerSymbol *markerSymbol = static_cast<QgsMarkerSymbol *>( mSymbol ); if ( markerSymbol->size() == size ) return; markerSymbol->setSize( size ); emit changed(); }
void QgsSymbolsListWidget::setMarkerAngle( double angle ) { QgsMarkerSymbol *markerSymbol = static_cast<QgsMarkerSymbol *>( mSymbol ); if ( markerSymbol->angle() == angle ) return; markerSymbol->setAngle( angle ); emit changed(); }
void QgsSymbolsListWidget::createAuxiliaryField() { // try to create an auxiliary layer if not yet created if ( !mLayer->auxiliaryLayer() ) { QgsNewAuxiliaryLayerDialog dlg( mLayer, this ); dlg.exec(); } // return if still not exists if ( !mLayer->auxiliaryLayer() ) return; QgsPropertyOverrideButton *button = qobject_cast<QgsPropertyOverrideButton *>( sender() ); QgsSymbolLayer::Property key = static_cast< QgsSymbolLayer::Property >( button->propertyKey() ); const QgsPropertyDefinition def = QgsSymbolLayer::propertyDefinitions()[key]; // create property in auxiliary storage if necessary if ( !mLayer->auxiliaryLayer()->exists( def ) ) mLayer->auxiliaryLayer()->addAuxiliaryField( def ); // update property with join field name from auxiliary storage QgsProperty property = button->toProperty(); property.setField( QgsAuxiliaryLayer::nameFromProperty( def, true ) ); property.setActive( true ); button->updateFieldLists(); button->setToProperty( property ); QgsMarkerSymbol *markerSymbol = static_cast<QgsMarkerSymbol *>( mSymbol ); QgsLineSymbol *lineSymbol = static_cast<QgsLineSymbol *>( mSymbol ); switch ( key ) { case QgsSymbolLayer::PropertyAngle: if ( markerSymbol ) markerSymbol->setDataDefinedAngle( button->toProperty() ); break; case QgsSymbolLayer::PropertySize: if ( markerSymbol ) { markerSymbol->setDataDefinedSize( button->toProperty() ); markerSymbol->setScaleMethod( QgsSymbol::ScaleDiameter ); } break; case QgsSymbolLayer::PropertyStrokeWidth: if ( lineSymbol ) lineSymbol->setDataDefinedWidth( button->toProperty() ); break; default: break; } emit changed(); }
void QgsSingleSymbolRendererWidget::scaleMethodChanged( QgsSymbol::ScaleMethod scaleMethod ) { mRenderer->setScaleMethod( scaleMethod ); // Set also on the symbol clone QgsMarkerSymbol *markerSymbol = dynamic_cast<QgsMarkerSymbol *>( mSingleSymbol ); if ( markerSymbol ) { markerSymbol->setScaleMethod( scaleMethod ); } }
void QgsDataDefinedSizeLegendWidget::updatePreview() { QgsMarkerSymbol *symbol = mSourceSymbol->clone(); symbol->setDataDefinedSize( mSizeProperty ); QgsSingleSymbolRenderer *r = new QgsSingleSymbolRenderer( symbol ); r->setDataDefinedSizeLegend( dataDefinedSizeLegend() ); mPreviewLayer->setRenderer( r ); mPreviewModel->refreshLayerLegend( mPreviewLayerNode ); viewLayerTree->expandAll(); }
void QgsFeatureRenderer::convertSymbolRotation( QgsSymbol * symbol, const QString & field ) { if ( symbol->type() == QgsSymbol::Marker ) { QgsMarkerSymbol * s = static_cast<QgsMarkerSymbol *>( symbol ); const QgsDataDefined dd(( s->angle() ? QString::number( s->angle() ) + " + " : QString() ) + field ); s->setDataDefinedAngle( dd ); } }
void QgsPointClusterRenderer::drawGroup( QPointF centerPoint, QgsRenderContext& context, const ClusteredGroup& group ) { if ( group.size() > 1 ) { mClusterSymbol->renderPoint( centerPoint, &( group.at( 0 ).feature ), context, -1, false ); } else { //single isolated symbol, draw it untouched QgsMarkerSymbol* symbol = group.at( 0 ).symbol; symbol->renderPoint( centerPoint, &( group.at( 0 ).feature ), context, -1, group.at( 0 ).isSelected ); } }
void QgsSymbolsListWidget::updateDataDefinedMarkerAngle() { QgsMarkerSymbol *markerSymbol = static_cast<QgsMarkerSymbol *>( mSymbol ); QgsProperty dd( mRotationDDBtn->toProperty() ); spinAngle->setEnabled( !mRotationDDBtn->isActive() ); QgsProperty symbolDD( markerSymbol->dataDefinedAngle() ); if ( // shall we remove datadefined expressions for layers ? ( !symbolDD && !dd ) // shall we set the "en masse" expression for properties ? || dd ) { markerSymbol->setDataDefinedAngle( dd ); emit changed(); } }
void QgsMapToolRotatePointSymbols::createPixmapItem( QgsMarkerSymbol *markerSymbol ) { if ( !mCanvas ) { return; } //get the image that is used for that symbol, but without point rotation QImage pointImage; if ( markerSymbol ) { QgsSymbol *clone = markerSymbol->clone(); QgsMarkerSymbol *markerClone = static_cast<QgsMarkerSymbol *>( clone ); markerClone->setDataDefinedAngle( QgsProperty() ); pointImage = markerClone->bigSymbolPreviewImage(); delete clone; } mRotationItem = new QgsPointRotationItem( mCanvas ); mRotationItem->setSymbol( pointImage ); }
void QgsFeatureRenderer::convertSymbolSizeScale( QgsSymbol * symbol, QgsSymbol::ScaleMethod method, const QString & field ) { if ( symbol->type() == QgsSymbol::Marker ) { QgsMarkerSymbol * s = static_cast<QgsMarkerSymbol *>( symbol ); if ( QgsSymbol::ScaleArea == QgsSymbol::ScaleMethod( method ) ) { const QgsDataDefined dd( "coalesce(sqrt(" + QString::number( s->size() ) + " * (" + field + ")),0)" ); s->setDataDefinedSize( dd ); } else { const QgsDataDefined dd( "coalesce(" + QString::number( s->size() ) + " * (" + field + "),0)" ); s->setDataDefinedSize( dd ); } s->setScaleMethod( QgsSymbol::ScaleDiameter ); } else if ( symbol->type() == QgsSymbol::Line ) { QgsLineSymbol * s = static_cast<QgsLineSymbol *>( symbol ); const QgsDataDefined dd( "coalesce(" + QString::number( s->width() ) + " * (" + field + "),0)" ); s->setDataDefinedWidth( dd ); } }
void QgsSymbolsListWidget::updateSymbolInfo() { updateSymbolColor(); const auto overrideButtons {findChildren< QgsPropertyOverrideButton * >()}; for ( QgsPropertyOverrideButton *button : overrideButtons ) { button->registerExpressionContextGenerator( this ); } if ( mSymbol->type() == QgsSymbol::Marker ) { QgsMarkerSymbol *markerSymbol = static_cast<QgsMarkerSymbol *>( mSymbol ); spinSize->setValue( markerSymbol->size() ); spinAngle->setValue( markerSymbol->angle() ); if ( mLayer ) { QgsProperty ddSize( markerSymbol->dataDefinedSize() ); mSizeDDBtn->init( QgsSymbolLayer::PropertySize, ddSize, QgsSymbolLayer::propertyDefinitions(), mLayer, true ); spinSize->setEnabled( !mSizeDDBtn->isActive() ); QgsProperty ddAngle( markerSymbol->dataDefinedAngle() ); mRotationDDBtn->init( QgsSymbolLayer::PropertyAngle, ddAngle, QgsSymbolLayer::propertyDefinitions(), mLayer, true ); spinAngle->setEnabled( !mRotationDDBtn->isActive() ); } else { mSizeDDBtn->setEnabled( false ); mRotationDDBtn->setEnabled( false ); } } else if ( mSymbol->type() == QgsSymbol::Line ) { QgsLineSymbol *lineSymbol = static_cast<QgsLineSymbol *>( mSymbol ); spinWidth->setValue( lineSymbol->width() ); if ( mLayer ) { QgsProperty dd( lineSymbol->dataDefinedWidth() ); mWidthDDBtn->init( QgsSymbolLayer::PropertyStrokeWidth, dd, QgsSymbolLayer::propertyDefinitions(), mLayer, true ); spinWidth->setEnabled( !mWidthDDBtn->isActive() ); } else { mWidthDDBtn->setEnabled( false ); } } mSymbolUnitWidget->blockSignals( true ); mSymbolUnitWidget->setUnit( mSymbol->outputUnit() ); mSymbolUnitWidget->setMapUnitScale( mSymbol->mapUnitScale() ); mSymbolUnitWidget->blockSignals( false ); mOpacityWidget->setOpacity( mSymbol->opacity() ); // Clean up previous advanced symbol actions const QList<QAction *> actionList( btnAdvanced->menu()->actions() ); for ( const auto &action : actionList ) { if ( mClipFeaturesAction->text() == action->text() ) { btnAdvanced->menu()->removeAction( action ); } else if ( mStandardizeRingsAction->text() == action->text() ) { btnAdvanced->menu()->removeAction( action ); } } if ( mSymbol->type() == QgsSymbol::Line || mSymbol->type() == QgsSymbol::Fill ) { //add clip features option for line or fill symbols btnAdvanced->menu()->addAction( mClipFeaturesAction ); } if ( mSymbol->type() == QgsSymbol::Fill ) { btnAdvanced->menu()->addAction( mStandardizeRingsAction ); } btnAdvanced->setVisible( mAdvancedMenu || !btnAdvanced->menu()->isEmpty() ); whileBlocking( mClipFeaturesAction )->setChecked( mSymbol->clipFeaturesToExtent() ); whileBlocking( mStandardizeRingsAction )->setChecked( mSymbol->forceRHR() ); }
bool QgsPointDistanceRenderer::renderFeature( QgsFeature &feature, QgsRenderContext &context, int layer, bool selected, bool drawVertexMarker ) { Q_UNUSED( drawVertexMarker ); Q_UNUSED( context ); Q_UNUSED( layer ); /* * IMPORTANT: This algorithm is ported to Python in the processing "Points Displacement" algorithm. * Please port any changes/improvements to that algorithm too! */ //check if there is already a point at that position if ( !feature.hasGeometry() ) return false; QgsMarkerSymbol *symbol = firstSymbolForFeature( feature, context ); //if the feature has no symbol (e.g., no matching rule in a rule-based renderer), skip it if ( !symbol ) return false; //point position in screen coords QgsGeometry geom = feature.geometry(); QgsWkbTypes::Type geomType = geom.wkbType(); if ( QgsWkbTypes::flatType( geomType ) != QgsWkbTypes::Point ) { //can only render point type return false; } QString label; if ( mDrawLabels ) { label = getLabel( feature ); } QgsCoordinateTransform xform = context.coordinateTransform(); QgsFeature transformedFeature = feature; if ( xform.isValid() ) { geom.transform( xform ); transformedFeature.setGeometry( geom ); } double searchDistance = context.convertToMapUnits( mTolerance, mToleranceUnit, mToleranceMapUnitScale ); QgsPointXY point = transformedFeature.geometry().asPoint(); QList<QgsFeatureId> intersectList = mSpatialIndex->intersects( searchRect( point, searchDistance ) ); if ( intersectList.empty() ) { mSpatialIndex->insertFeature( transformedFeature ); // create new group ClusteredGroup newGroup; newGroup << GroupedFeature( transformedFeature, symbol->clone(), selected, label ); mClusteredGroups.push_back( newGroup ); // add to group index mGroupIndex.insert( transformedFeature.id(), mClusteredGroups.count() - 1 ); mGroupLocations.insert( transformedFeature.id(), point ); } else { // find group with closest location to this point (may be more than one within search tolerance) QgsFeatureId minDistFeatureId = intersectList.at( 0 ); double minDist = mGroupLocations.value( minDistFeatureId ).distance( point ); for ( int i = 1; i < intersectList.count(); ++i ) { QgsFeatureId candidateId = intersectList.at( i ); double newDist = mGroupLocations.value( candidateId ).distance( point ); if ( newDist < minDist ) { minDist = newDist; minDistFeatureId = candidateId; } } int groupIdx = mGroupIndex[ minDistFeatureId ]; ClusteredGroup &group = mClusteredGroups[groupIdx]; // calculate new centroid of group QgsPointXY oldCenter = mGroupLocations.value( minDistFeatureId ); mGroupLocations[ minDistFeatureId ] = QgsPointXY( ( oldCenter.x() * group.size() + point.x() ) / ( group.size() + 1.0 ), ( oldCenter.y() * group.size() + point.y() ) / ( group.size() + 1.0 ) ); // add to a group group << GroupedFeature( transformedFeature, symbol->clone(), selected, label ); // add to group index mGroupIndex.insert( transformedFeature.id(), groupIdx ); } return true; }