void QgsVectorLayerJoinBuffer::cacheJoinLayer( QgsVectorJoinInfo& joinInfo ) { //memory cache not required or already done if ( !joinInfo.memoryCache || joinInfo.cachedAttributes.size() > 0 ) { return; } QgsVectorLayer* cacheLayer = dynamic_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( joinInfo.joinLayerId ) ); if ( cacheLayer ) { int joinFieldIndex; if ( joinInfo.joinFieldName.isEmpty() ) joinFieldIndex = joinInfo.joinFieldIndex; //for compatibility with 1.x else joinFieldIndex = cacheLayer->pendingFields().indexFromName( joinInfo.joinFieldName ); if ( joinFieldIndex < 0 || joinFieldIndex >= cacheLayer->pendingFields().count() ) return; joinInfo.cachedAttributes.clear(); QgsFeatureIterator fit = cacheLayer->getFeatures( QgsFeatureRequest().setFlags( QgsFeatureRequest::NoGeometry ) ); QgsFeature f; while ( fit.nextFeature( f ) ) { const QgsAttributes& attrs = f.attributes(); joinInfo.cachedAttributes.insert( attrs[joinFieldIndex].toString(), attrs ); } } }
void QgsMapToolOffsetCurve::canvasReleaseEvent( QMouseEvent * e ) { Q_UNUSED( e ); QgsVectorLayer* vlayer = currentVectorLayer(); if ( !vlayer ) { deleteRubberBandAndGeometry(); return; } if ( !mGeometryModified ) { deleteRubberBandAndGeometry(); vlayer->destroyEditCommand(); return; } if ( mMultiPartGeometry ) { mModifiedGeometry.convertToMultiType(); } vlayer->beginEditCommand( tr( "Offset curve" ) ); bool editOk; if ( mSourceLayerId == vlayer->id() && !mForceCopy ) { editOk = vlayer->changeGeometry( mModifiedFeature, &mModifiedGeometry ); } else { QgsFeature f; f.setGeometry( mModifiedGeometry ); //add empty values for all fields (allows inserting attribute values via the feature form in the same session) QgsAttributes attrs( vlayer->pendingFields().count() ); const QgsFields& fields = vlayer->pendingFields(); for ( int idx = 0; idx < fields.count(); ++idx ) { attrs[idx] = QVariant(); } f.setAttributes( attrs ); editOk = vlayer->addFeature( f ); } if ( editOk ) { vlayer->endEditCommand(); } else { vlayer->destroyEditCommand(); } deleteRubberBandAndGeometry(); deleteDistanceItem(); delete mSnapVertexMarker; mSnapVertexMarker = 0; mForceCopy = false; mCanvas->refresh(); }
bool QgsGraduatedSymbolRenderer::writeXML( QDomNode & layer_node, QDomDocument & document, const QgsVectorLayer& vl ) const { bool returnval = true; QDomElement graduatedsymbol = document.createElement( "graduatedsymbol" ); layer_node.appendChild( graduatedsymbol ); // // Mode field first ... // QString modeValue = ""; if ( mMode == QgsGraduatedSymbolRenderer::Empty ) { modeValue == "Empty"; } else if ( QgsGraduatedSymbolRenderer::Quantile ) { modeValue = "Quantile"; } else //default { modeValue = "Equal Interval"; } QDomElement modeElement = document.createElement( "mode" ); QDomText modeText = document.createTextNode( modeValue ); modeElement.appendChild( modeText ); graduatedsymbol.appendChild( modeElement ); // // classification field now ... // QDomElement classificationfield = document.createElement( "classificationfield" ); const QgsVectorDataProvider* theProvider = vl.dataProvider(); if ( !theProvider ) { return false; } QString classificationFieldName; if ( vl.pendingFields().contains( mClassificationField ) ) { classificationFieldName = vl.pendingFields()[ mClassificationField ].name(); } QDomText classificationfieldtxt = document.createTextNode( classificationFieldName ); classificationfield.appendChild( classificationfieldtxt ); graduatedsymbol.appendChild( classificationfield ); for ( QList<QgsSymbol*>::const_iterator it = mSymbols.begin(); it != mSymbols.end(); ++it ) { if ( !( *it )->writeXML( graduatedsymbol, document, &vl ) ) { returnval = false; } } return returnval; }
void QgsComposerPicture::updatePictureExpression() { QgsVectorLayer * vl = 0; if ( mComposition->atlasComposition().enabled() ) { vl = mComposition->atlasComposition().coverageLayer(); } if ( mSourceExpression.size() > 0 ) { if ( mPictureExpr ) { delete mPictureExpr; } mPictureExpr = new QgsExpression( mSourceExpression ); // expression used to evaluate picture source // test for evaluation errors if ( mPictureExpr->hasParserError() ) { QgsMessageLog::logMessage( tr( "Picture expression parsing error: %1" ).arg( mPictureExpr->parserErrorString() ), tr( "Composer" ) ); } if ( vl ) { const QgsFields& fields = vl->pendingFields(); mPictureExpr->prepare( fields ); } } }
void QgsVectorLayerFeatureIterator::prepareJoins() { QgsAttributeList fetchAttributes = ( mRequest.flags() & QgsFeatureRequest::SubsetOfAttributes ) ? mRequest.subsetOfAttributes() : L->pendingAllAttributesList(); QgsAttributeList sourceJoinFields; // attributes that also need to be fetched from this layer in order to have joins working mFetchJoinInfo.clear(); QgsVectorLayerJoinBuffer* joinBuffer = L->mJoinBuffer; const QgsFields& fields = L->pendingFields(); for ( QgsAttributeList::const_iterator attIt = fetchAttributes.constBegin(); attIt != fetchAttributes.constEnd(); ++attIt ) { if ( !fields.exists( *attIt ) ) continue; if ( fields.fieldOrigin( *attIt ) != QgsFields::OriginJoin ) continue; int sourceLayerIndex; const QgsVectorJoinInfo* joinInfo = joinBuffer->joinForFieldIndex( *attIt, fields, sourceLayerIndex ); Q_ASSERT( joinInfo ); QgsVectorLayer* joinLayer = qobject_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( joinInfo->joinLayerId ) ); Q_ASSERT( joinLayer ); if ( !mFetchJoinInfo.contains( joinLayer ) ) { FetchJoinInfo info; info.joinInfo = joinInfo; info.joinLayer = joinLayer; if ( joinInfo->targetFieldName.isEmpty() ) info.targetField = joinInfo->targetFieldIndex; //for compatibility with 1.x else info.targetField = fields.indexFromName( joinInfo->targetFieldName ); if ( joinInfo->joinFieldName.isEmpty() ) info.joinField = joinInfo->joinFieldIndex; //for compatibility with 1.x else info.joinField = joinLayer->pendingFields().indexFromName( joinInfo->joinFieldName ); info.indexOffset = *attIt - sourceLayerIndex; if ( info.joinField < sourceLayerIndex ) info.indexOffset++; // for joined fields, we always need to request the targetField from the provider too if ( !fetchAttributes.contains( info.targetField ) ) sourceJoinFields << info.targetField; mFetchJoinInfo.insert( joinLayer, info ); } // store field source index - we'll need it when fetching from provider mFetchJoinInfo[ joinLayer ].attributes.push_back( sourceLayerIndex ); } // add sourceJoinFields if we're using a subset if ( mRequest.flags() & QgsFeatureRequest::SubsetOfAttributes ) mRequest.setSubsetOfAttributes( mRequest.subsetOfAttributes() + sourceJoinFields ); }
void QgsVectorLayerProperties::on_mButtonAddJoin_clicked() { QgsAddJoinDialog d( layer ); if ( d.exec() == QDialog::Accepted ) { QgsVectorJoinInfo info; info.targetFieldName = d.targetFieldName(); info.joinLayerId = d.joinedLayerId(); info.joinFieldName = d.joinFieldName(); info.memoryCache = d.cacheInMemory(); if ( layer ) { //create attribute index if possible if ( d.createAttributeIndex() ) { QgsVectorLayer* joinLayer = qobject_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( info.joinLayerId ) ); if ( joinLayer ) { joinLayer->dataProvider()->createAttributeIndex( joinLayer->pendingFields().indexFromName( info.joinFieldName ) ); } } layer->addJoin( info ); addJoinToTreeWidget( info ); pbnQueryBuilder->setEnabled( layer && layer->dataProvider() && layer->dataProvider()->supportsSubsetString() && !layer->isEditable() && layer->vectorJoins().size() < 1 ); } } }
bool QgsUniqueValueRenderer::writeXML( QDomNode & layer_node, QDomDocument & document, const QgsVectorLayer& vl ) const { const QgsVectorDataProvider* theProvider = vl.dataProvider(); if ( !theProvider ) { return false; } QString classificationFieldName; const QgsFields& fields = vl.pendingFields(); if ( mClassificationField >= 0 && mClassificationField < fields.count() ) { classificationFieldName = fields[ mClassificationField ].name(); } bool returnval = true; QDomElement uniquevalue = document.createElement( "uniquevalue" ); layer_node.appendChild( uniquevalue ); QDomElement classificationfield = document.createElement( "classificationfield" ); QDomText classificationfieldtxt = document.createTextNode( classificationFieldName ); classificationfield.appendChild( classificationfieldtxt ); uniquevalue.appendChild( classificationfield ); for ( QMap<QString, QgsSymbol*>::const_iterator it = mSymbols.begin(); it != mSymbols.end(); ++it ) { if ( !( it.value()->writeXML( uniquevalue, document, &vl ) ) ) { returnval = false; } } return returnval; }
void QgsVectorLayerJoinBuffer::updateFields( QgsFields& fields ) { QList< QgsVectorJoinInfo>::const_iterator joinIt = mVectorJoins.constBegin(); for ( int joinIdx = 0 ; joinIt != mVectorJoins.constEnd(); ++joinIt, ++joinIdx ) { QgsVectorLayer* joinLayer = qobject_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( joinIt->joinLayerId ) ); if ( !joinLayer ) { continue; } joinIt->tmpTargetField = fields.indexFromName( joinIt->targetFieldName ); const QgsFields& joinFields = joinLayer->pendingFields(); joinIt->tmpJoinField = joinFields.indexFromName( joinIt->joinFieldName ); for ( int idx = 0; idx < joinFields.count(); ++idx ) { //skip the join field to avoid double field names (fields often have the same name) if ( joinFields[idx].name() != joinIt->joinFieldName ) { QgsField f = joinFields[idx]; f.setName( joinLayer->name() + "_" + f.name() ); fields.append( f, QgsFields::OriginJoin, idx + ( joinIdx*1000 ) ); } } } }
void QgsServerProjectParser::addLayerProjectSettings( QDomElement& layerElem, QDomDocument& doc, QgsMapLayer* currentLayer ) const { if ( !currentLayer ) { return; } // Layer tree name QDomElement treeNameElem = doc.createElement( "TreeName" ); QDomText treeNameText = doc.createTextNode( currentLayer->name() ); treeNameElem.appendChild( treeNameText ); layerElem.appendChild( treeNameElem ); if ( currentLayer->type() == QgsMapLayer::VectorLayer ) { QgsVectorLayer* vLayer = static_cast<QgsVectorLayer*>( currentLayer ); const QSet<QString>& excludedAttributes = vLayer->excludeAttributesWMS(); int displayFieldIdx = vLayer->fieldNameIndex( vLayer->displayField() ); QString displayField = displayFieldIdx < 0 ? "maptip" : vLayer->displayField(); //attributes QDomElement attributesElem = doc.createElement( "Attributes" ); const QgsFields& layerFields = vLayer->pendingFields(); for ( int idx = 0; idx < layerFields.count(); ++idx ) { const QgsField& field = layerFields[idx]; if ( excludedAttributes.contains( field.name() ) ) { continue; } // field alias in case of displayField if ( idx == displayFieldIdx ) { displayField = vLayer->attributeDisplayName( idx ); } QDomElement attributeElem = doc.createElement( "Attribute" ); attributeElem.setAttribute( "name", field.name() ); attributeElem.setAttribute( "type", QVariant::typeToName( field.type() ) ); attributeElem.setAttribute( "typeName", field.typeName() ); QString alias = vLayer->attributeAlias( idx ); if ( !alias.isEmpty() ) { attributeElem.setAttribute( "alias", alias ); } //edit type to text attributeElem.setAttribute( "editType", vLayer->editFormConfig()->widgetType( idx ) ); attributeElem.setAttribute( "comment", field.comment() ); attributeElem.setAttribute( "length", field.length() ); attributeElem.setAttribute( "precision", field.precision() ); attributesElem.appendChild( attributeElem ); } //displayfield layerElem.setAttribute( "displayField", displayField ); //geometry type layerElem.setAttribute( "geometryType", QGis::featureType( vLayer->wkbType() ) ); layerElem.appendChild( attributesElem ); } }
void QgsVectorLayerJoinBuffer::updateFields( QgsFields& fields ) { QList< QgsVectorJoinInfo>::const_iterator joinIt = mVectorJoins.constBegin(); for ( int joinIdx = 0 ; joinIt != mVectorJoins.constEnd(); ++joinIt, ++joinIdx ) { QgsVectorLayer* joinLayer = qobject_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( joinIt->joinLayerId ) ); if ( !joinLayer ) { continue; } const QgsFields& joinFields = joinLayer->pendingFields(); QString joinFieldName; if ( joinIt->joinFieldName.isEmpty() && joinIt->joinFieldIndex >= 0 && joinIt->joinFieldIndex < joinFields.count() ) joinFieldName = joinFields.field( joinIt->joinFieldIndex ).name(); //for compatibility with 1.x else joinFieldName = joinIt->joinFieldName; for ( int idx = 0; idx < joinFields.count(); ++idx ) { //skip the join field to avoid double field names (fields often have the same name) if ( joinFields[idx].name() != joinFieldName ) { QgsField f = joinFields[idx]; f.setName( joinLayer->name() + "_" + f.name() ); fields.append( f, QgsFields::OriginJoin, idx + ( joinIdx*1000 ) ); } } } }
bool QgsGeometryCheckerResultTab::exportErrorsDo( const QString& file ) { QList< QPair<QString, QString> > attributes; attributes.append( qMakePair( QString( "FeatureID" ), QString( "String;10;" ) ) ); attributes.append( qMakePair( QString( "ErrorDesc" ), QString( "String;80;" ) ) ); QLibrary ogrLib( QgsProviderRegistry::instance()->library( "ogr" ) ); if ( !ogrLib.load() ) { return false; } typedef bool ( *createEmptyDataSourceProc )( const QString&, const QString&, const QString&, QGis::WkbType, const QList< QPair<QString, QString> >&, const QgsCoordinateReferenceSystem * ); createEmptyDataSourceProc createEmptyDataSource = ( createEmptyDataSourceProc ) cast_to_fptr( ogrLib.resolve( "createEmptyDataSource" ) ); if ( !createEmptyDataSource ) { return false; } if ( !createEmptyDataSource( file, "ESRI Shapefile", mFeaturePool->getLayer()->dataProvider()->encoding(), QGis::WKBPoint, attributes, &mFeaturePool->getLayer()->crs() ) ) { return false; } QgsVectorLayer* layer = new QgsVectorLayer( file, QFileInfo( file ).baseName(), "ogr" ); if ( !layer->isValid() ) { delete layer; return false; } int fieldFeatureId = layer->fieldNameIndex( "FeatureID" ); int fieldErrDesc = layer->fieldNameIndex( "ErrorDesc" ); for ( int row = 0, nRows = ui.tableWidgetErrors->rowCount(); row < nRows; ++row ) { QgsGeometryCheckError* error = ui.tableWidgetErrors->item( row, 0 )->data( Qt::UserRole ).value<QgsGeometryCheckError*>(); QgsFeature f( layer->pendingFields() ); f.setAttribute( fieldFeatureId, error->featureId() ); f.setAttribute( fieldErrDesc, error->description() ); f.setGeometry( new QgsGeometry( error->location().clone() ) ); layer->dataProvider()->addFeatures( QgsFeatureList() << f ); } // Remove existing layer with same uri QStringList toRemove; foreach ( QgsMapLayer* maplayer, QgsMapLayerRegistry::instance()->mapLayers() ) { if ( dynamic_cast<QgsVectorLayer*>( maplayer ) && static_cast<QgsVectorLayer*>( maplayer )->dataProvider()->dataSourceUri() == layer->dataProvider()->dataSourceUri() ) { toRemove.append( maplayer->id() ); } } if ( !toRemove.isEmpty() ) { QgsMapLayerRegistry::instance()->removeMapLayers( toRemove ); } QgsMapLayerRegistry::instance()->addMapLayers( QList<QgsMapLayer*>() << layer ); return true; }
void RgShortestPathWidget::exportPath() { RgExportDlg dlg( this ); if ( !dlg.exec() ) return; QgsVectorLayer *vl = dlg.mapLayer(); if ( vl == NULL ) return; QgsPoint p1, p2; QgsGraph *path = getPath( p1, p2 ); if ( path == NULL ) return; QgsCoordinateTransform ct( mPlugin->iface()->mapCanvas()->mapSettings().destinationCrs(), vl->crs() ); int startVertexIdx = path->findVertex( p1 ); int stopVertexIdx = path->findVertex( p2 ); double time = 0.0; double cost = 0.0; Unit timeUnit = Unit::byName( mPlugin->timeUnitName() ); Unit distanceUnit = Unit::byName( mPlugin->distanceUnitName() ); QgsPolyline p; while ( startVertexIdx != stopVertexIdx ) { if ( stopVertexIdx < 0 ) break; QgsGraphArcIdList l = path->vertex( stopVertexIdx ).inArc(); if ( l.empty() ) break; const QgsGraphArc& e = path->arc( l.front() ); cost += e.property( 0 ).toDouble(); time += e.property( 1 ).toDouble(); p.push_front( ct.transform( path->vertex( e.inVertex() ).point() ) ); stopVertexIdx = e.outVertex(); } p.push_front( ct.transform( p1 ) ); QgsFeature f; f.initAttributes( vl->pendingFields().count() ); f.setGeometry( QgsGeometry::fromPolyline( p ) ); f.setAttribute( 0, cost / distanceUnit.multipler() ); f.setAttribute( 1, time / timeUnit.multipler() ); QgsFeatureList features; features << f; vl->dataProvider()->addFeatures( features ); vl->updateExtents(); mPlugin->iface()->mapCanvas()->update(); delete path; }
bool QgsFieldExpressionWidget::isExpressionValid( const QString expressionStr ) { QgsVectorLayer* vl = layer(); QgsExpression expression( expressionStr ); expression.prepare( vl ? vl->pendingFields() : QgsFields() ); return !expression.hasParserError(); }
void FieldSelectorDelegate::setEditorData( QWidget *editor, const QModelIndex &index ) const { const QgsVectorLayerAndAttributeModel *m = dynamic_cast< const QgsVectorLayerAndAttributeModel *>( index.model() ); if ( !m ) return; QgsVectorLayer *vl = m->vectorLayer( index ); if ( !vl ) return; QgsFieldComboBox *fcb = qobject_cast<QgsFieldComboBox *>( editor ); if ( !fcb ) return; int idx = m->attributeIndex( vl ); if ( vl->pendingFields().exists( idx ) ) fcb->setField( vl->pendingFields()[ idx ].name() ); }
void QgsServerProjectParser::addLayerProjectSettings( QDomElement& layerElem, QDomDocument& doc, QgsMapLayer* currentLayer ) const { if ( !currentLayer ) { return; } if ( currentLayer->type() == QgsMapLayer::VectorLayer ) { QgsVectorLayer* vLayer = static_cast<QgsVectorLayer*>( currentLayer ); const QSet<QString>& excludedAttributes = vLayer->excludeAttributesWMS(); QString displayField = vLayer->displayField(); //attributes QDomElement attributesElem = doc.createElement( "Attributes" ); const QgsFields& layerFields = vLayer->pendingFields(); for ( int idx = 0; idx < layerFields.count(); ++idx ) { const QgsField& field = layerFields[idx]; if ( excludedAttributes.contains( field.name() ) ) { continue; } // field alias in case of displayField if ( field.name() == displayField ) { displayField = vLayer->attributeDisplayName( idx ); } QDomElement attributeElem = doc.createElement( "Attribute" ); attributeElem.setAttribute( "name", field.name() ); attributeElem.setAttribute( "type", QVariant::typeToName( field.type() ) ); attributeElem.setAttribute( "typeName", field.typeName() ); QString alias = vLayer->attributeAlias( idx ); if ( !alias.isEmpty() ) { attributeElem.setAttribute( "alias", alias ); } //edit type to text attributeElem.setAttribute( "editType", vLayer->editorWidgetV2( idx ) ); attributeElem.setAttribute( "comment", field.comment() ); attributeElem.setAttribute( "length", field.length() ); attributeElem.setAttribute( "precision", field.precision() ); attributesElem.appendChild( attributeElem ); } //displayfield layerElem.setAttribute( "displayField", displayField ); layerElem.appendChild( attributesElem ); } }
void QgsComposerAttributeTableV2::setDisplayAttributes( const QSet<int>& attr, bool refresh ) { QgsVectorLayer* source = sourceLayer(); if ( !source ) { return; } //rebuild columns list, taking only attributes with index in supplied QSet qDeleteAll( mColumns ); mColumns.clear(); const QgsFields& fields = source->pendingFields(); if ( !attr.empty() ) { QSet<int>::const_iterator attIt = attr.constBegin(); for ( ; attIt != attr.constEnd(); ++attIt ) { int attrIdx = ( *attIt ); if ( !fields.exists( attrIdx ) ) { continue; } QString currentAlias = source->attributeDisplayName( attrIdx ); QgsComposerTableColumn* col = new QgsComposerTableColumn; col->setAttribute( fields[attrIdx].name() ); col->setHeading( currentAlias ); mColumns.append( col ); } } else { //resetting, so add all attributes to columns for ( int idx = 0; idx < fields.count(); ++idx ) { QString currentAlias = source->attributeDisplayName( idx ); QgsComposerTableColumn* col = new QgsComposerTableColumn; col->setAttribute( fields[idx].name() ); col->setHeading( currentAlias ); mColumns.append( col ); } } if ( refresh ) { refreshAttributes(); } }
bool QgsContinuousColorRenderer::writeXML( QDomNode & layer_node, QDomDocument & document, const QgsVectorLayer& vl ) const { const QgsVectorDataProvider* theProvider = vl.dataProvider(); if ( !theProvider ) { return false; } QString classificationFieldName; const QgsFields& fields = vl.pendingFields(); if ( mClassificationField >= 0 && mClassificationField < fields.count() ) { classificationFieldName = fields[ mClassificationField ].name(); } bool returnval = true; QDomElement continuoussymbol = document.createElement( "continuoussymbol" ); layer_node.appendChild( continuoussymbol ); QDomElement classificationfield = document.createElement( "classificationfield" ); QDomText classificationfieldtxt = document.createTextNode( classificationFieldName ); classificationfield.appendChild( classificationfieldtxt ); continuoussymbol.appendChild( classificationfield ); //polygon outlines QDomElement drawPolygonOutlines = document.createElement( "polygonoutline" ); int drawPolyInt = mDrawPolygonOutline ? 1 : 0; QDomText drawPolygonText = document.createTextNode( QString::number( drawPolyInt ) ); drawPolygonOutlines.appendChild( drawPolygonText ); continuoussymbol.appendChild( drawPolygonOutlines ); QDomElement lowestsymbol = document.createElement( "lowestsymbol" ); continuoussymbol.appendChild( lowestsymbol ); if ( mMinimumSymbol ) { mMinimumSymbol->writeXML( lowestsymbol, document, &vl ); } QDomElement highestsymbol = document.createElement( "highestsymbol" ); continuoussymbol.appendChild( highestsymbol ); if ( mMaximumSymbol ) { mMaximumSymbol->writeXML( highestsymbol, document, &vl ); } return returnval; }
void QgsAddJoinDialog::on_mJoinLayerComboBox_currentIndexChanged( int index ) { mJoinFieldComboBox->clear(); QString layerId = mJoinLayerComboBox->itemData( index ).toString(); QgsMapLayer* layer = QgsMapLayerRegistry::instance()->mapLayer( layerId ); QgsVectorLayer* vLayer = dynamic_cast<QgsVectorLayer*>( layer ); if ( !vLayer ) { return; } QStandardItemModel* subsetModel = new QStandardItemModel( this ); const QgsFields& layerFields = vLayer->pendingFields(); for ( int idx = 0; idx < layerFields.count(); ++idx ) { mJoinFieldComboBox->addItem( layerFields[idx].name(), idx ); QStandardItem* subsetItem = new QStandardItem( layerFields[idx].name() ); subsetItem->setCheckable( true ); //subsetItem->setFlags( subsetItem->flags() | Qt::ItemIsUserCheckable ); subsetModel->appendRow( subsetItem ); } //does provider support creation of attribute indices? QgsVectorDataProvider* dp = vLayer->dataProvider(); if ( dp && ( dp->capabilities() & QgsVectorDataProvider::CreateAttributeIndex ) ) { mCreateIndexCheckBox->setEnabled( true ); } else { mCreateIndexCheckBox->setEnabled( false ); mCreateIndexCheckBox->setChecked( false ); } mJoinFieldsSubsetView->setModel( subsetModel ); if ( !mUseCustomPrefix->isChecked() ) { mCustomPrefix->setText( layer->name() + "_" ); } }
int QgsSymbol::readFieldName( QDomNode &synode, QString name, const QgsVectorLayer &vl ) { QDomNode node = synode.namedItem( name + "name" ); if ( !node.isNull() ) { const QgsFieldMap &fields = vl.pendingFields(); QString name = node.toElement().text(); for ( QgsFieldMap::const_iterator it = fields.begin(); it != fields.end(); it++ ) if ( it->name() == name ) return it.key(); return -1; } node = synode.namedItem( name ); return node.isNull() ? -1 : node.toElement().text().toInt(); }
void QgsVectorLayerProperties::addJoinToTreeWidget( const QgsVectorJoinInfo& join ) { QTreeWidgetItem* joinItem = new QTreeWidgetItem(); QgsVectorLayer* joinLayer = qobject_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( join.joinLayerId ) ); if ( !joinLayer ) { return; } joinItem->setText( 0, joinLayer->name() ); joinItem->setData( 0, Qt::UserRole, join.joinLayerId ); QString joinFieldName = joinLayer->pendingFields().value( join.joinField ).name(); QString targetFieldName = layer->pendingFields().value( join.targetField ).name(); joinItem->setText( 1, joinFieldName ); joinItem->setData( 1, Qt::UserRole, join.joinField ); joinItem->setText( 2, targetFieldName ); joinItem->setData( 2, Qt::UserRole, join.targetField ); mJoinTreeWidget->addTopLevelItem( joinItem ); }
void test_willRenderFeature_symbolsForFeature() { // prepare features QgsVectorLayer* layer = new QgsVectorLayer( "point?field=fld:int", "x", "memory" ); int idx = layer->fieldNameIndex( "fld" ); QVERIFY( idx != -1 ); QgsFeature f1; f1.initAttributes( 1 ); f1.setAttribute( idx, QVariant( 2 ) ); QgsFeature f2; f2.initAttributes( 1 ); f2.setAttribute( idx, QVariant( 8 ) ); QgsFeature f3; f3.initAttributes( 1 ); f3.setAttribute( idx, QVariant( 100 ) ); // prepare renderer QgsSymbolV2* s1 = QgsSymbolV2::defaultSymbol( QGis::Point ); QgsSymbolV2* s2 = QgsSymbolV2::defaultSymbol( QGis::Point ); RRule* rootRule = new RRule( NULL ); rootRule->appendChild( new RRule( s1, 0, 0, "fld >= 5 and fld <= 20" ) ); rootRule->appendChild( new RRule( s2, 0, 0, "fld <= 10" ) ); QgsRuleBasedRendererV2 r( rootRule ); QVERIFY( r.capabilities() & QgsFeatureRendererV2::MoreSymbolsPerFeature ); QgsRenderContext ctx; // dummy render context r.startRender( ctx, layer->pendingFields() ); // test willRenderFeature QVERIFY( r.willRenderFeature( f1 ) ); QVERIFY( r.willRenderFeature( f2 ) ); QVERIFY( !r.willRenderFeature( f3 ) ); // test symbolsForFeature QgsSymbolV2List lst1 = r.symbolsForFeature( f1 ); QVERIFY( lst1.count() == 1 ); QgsSymbolV2List lst2 = r.symbolsForFeature( f2 ); QVERIFY( lst2.count() == 2 ); QgsSymbolV2List lst3 = r.symbolsForFeature( f3 ); QVERIFY( lst3.count() == 0 ); r.stopRender( ctx ); delete layer; }
void QgsJoinDialog::joinedLayerChanged( QgsMapLayer* layer ) { mJoinFieldComboBox->clear(); QgsVectorLayer* vLayer = dynamic_cast<QgsVectorLayer*>( layer ); if ( !vLayer ) { return; } mUseJoinFieldsSubset->setChecked( false ); QStandardItemModel* subsetModel = new QStandardItemModel( this ); const QgsFields& layerFields = vLayer->pendingFields(); for ( int idx = 0; idx < layerFields.count(); ++idx ) { QStandardItem* subsetItem = new QStandardItem( layerFields[idx].name() ); subsetItem->setCheckable( true ); //subsetItem->setFlags( subsetItem->flags() | Qt::ItemIsUserCheckable ); subsetModel->appendRow( subsetItem ); } mJoinFieldsSubsetView->setModel( subsetModel ); QgsVectorDataProvider* dp = vLayer->dataProvider(); bool canCreateAttrIndex = dp && ( dp->capabilities() & QgsVectorDataProvider::CreateAttributeIndex ); if ( canCreateAttrIndex ) { mCreateIndexCheckBox->setEnabled( true ); } else { mCreateIndexCheckBox->setEnabled( false ); mCreateIndexCheckBox->setChecked( false ); } if ( !mUseCustomPrefix->isChecked() ) { mCustomPrefix->setText( layer->name() + "_" ); } }
void QgsComposerAttributeTableV2::resetColumns() { QgsVectorLayer* source = sourceLayer(); if ( !source ) { return; } //remove existing columns qDeleteAll( mColumns ); mColumns.clear(); //rebuild columns list from vector layer fields const QgsFields& fields = source->pendingFields(); for ( int idx = 0; idx < fields.count(); ++idx ) { QString currentAlias = source->attributeDisplayName( idx ); QgsComposerTableColumn* col = new QgsComposerTableColumn; col->setAttribute( fields[idx].name() ); col->setHeading( currentAlias ); mColumns.append( col ); } }
void QgsAttributeTableModel::loadAttributes() { if ( !layer() ) { return; } bool ins = false, rm = false; QgsAttributeList attributes; const QgsFields& fields = layer()->pendingFields(); for ( int idx = 0; idx < fields.count(); ++idx ) { switch ( layer()->editType( idx ) ) { case QgsVectorLayer::Hidden: continue; case QgsVectorLayer::ValueMap: mValueMaps.insert( idx, new QMap< QString, QVariant >( layer()->valueMap( idx ) ) ); break; case QgsVectorLayer::ValueRelation: { const QgsVectorLayer::ValueRelationData &data = layer()->valueRelation( idx ); QgsVectorLayer *layer = qobject_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( data.mLayer ) ); if ( !layer ) continue; int ki = layer->fieldNameIndex( data.mKey ); int vi = layer->fieldNameIndex( data.mValue ); QgsExpression *e = 0; if ( !data.mFilterExpression.isEmpty() ) { e = new QgsExpression( data.mFilterExpression ); if ( e->hasParserError() || !e->prepare( layer->pendingFields() ) ) continue; } if ( ki >= 0 && vi >= 0 ) { QSet<int> attributes; attributes << ki << vi; QgsFeatureRequest::Flag flags = QgsFeatureRequest::NoGeometry; if ( e ) { if ( e->needsGeometry() ) flags = QgsFeatureRequest::NoFlags; foreach ( const QString &field, e->referencedColumns() ) { int idx = layer->fieldNameIndex( field ); if ( idx < 0 ) continue; attributes << idx; } } QMap< QString, QVariant > *map = new QMap< QString, QVariant >(); QgsFeatureIterator fit = layer->getFeatures( QgsFeatureRequest().setFlags( flags ).setSubsetOfAttributes( attributes.toList() ) ); QgsFeature f; while ( fit.nextFeature( f ) ) { if ( e && !e->evaluate( &f ).toBool() ) continue; map->insert( f.attribute( vi ).toString(), f.attribute( ki ) ); } mValueMaps.insert( idx, map ); } } break; default: break; } attributes << idx; }
void QgsMapToolSelectUtils::setSelectFeatures( QgsMapCanvas* canvas, QgsGeometry* selectGeometry, bool doContains, bool doDifference, bool singleSelect ) { if ( selectGeometry->type() != QGis::Polygon ) { return; } QgsVectorLayer* vlayer = QgsMapToolSelectUtils::getCurrentVectorLayer( canvas ); if ( vlayer == nullptr ) { return; } // toLayerCoordinates will throw an exception for any 'invalid' points in // the rubber band. // For example, if you project a world map onto a globe using EPSG 2163 // and then click somewhere off the globe, an exception will be thrown. //QgsGeometry selectGeomTrans( *selectGeometry ); //if ( canvas->mapSettings().hasCrsTransformEnabled() ) //{ // try // { // QgsCoordinateTransform ct( canvas->mapSettings().destinationCrs(), vlayer->crs() ); // selectGeomTrans.transform( ct ); // } // catch ( QgsCsException &cse ) // { // Q_UNUSED( cse ); // // catch exception for 'invalid' point and leave existing selection unchanged // QgsLogger::warning( "Caught CRS exception " + QString( __FILE__ ) + ": " + QString::number( __LINE__ ) ); // LOG_INFO( "CRS Exception\nSelection extends beyond layer's coordinate system" ); // return; // } //} QgsGeometry selectGeomTrans; try{ selectGeomTrans = toLayerCoordinates( canvas, selectGeometry, vlayer ); } catch ( QgsCsException & ) { return; } QApplication::setOverrideCursor( Qt::WaitCursor ); QgsDebugMsg( "Selection layer: " + vlayer->name() ); QgsDebugMsg( "Selection polygon: " + selectGeomTrans.exportToWkt() ); QgsDebugMsg( "doContains: " + QString( doContains ? "T" : "F" ) ); QgsDebugMsg( "doDifference: " + QString( doDifference ? "T" : "F" ) ); QgsRenderContext context = QgsRenderContext::fromMapSettings( canvas->mapSettings() ); QgsFeatureRendererV2* r = vlayer->rendererV2(); if ( r ) r->startRender( context, vlayer->pendingFields() ); QgsFeatureRequest request; request.setFilterRect( selectGeomTrans.boundingBox() ); request.setFlags( QgsFeatureRequest::ExactIntersect ); if ( r ) request.setSubsetOfAttributes( r->usedAttributes(), vlayer->pendingFields() ); else request.setSubsetOfAttributes( QgsAttributeList() ); QgsFeatureIterator fit = vlayer->getFeatures( request ); QgsFeatureIds newSelectedFeatures; QgsFeature f; QgsFeatureId closestFeatureId = 0; bool foundSingleFeature = false; double closestFeatureDist = std::numeric_limits<double>::max(); while ( fit.nextFeature( f ) ) { #if (VERSION_INT >= 21601) context.expressionContext().setFeature( f ); //taken from QGIS 2.16.1 // make sure to only use features that are visible if ( r && !r->willRenderFeature( f, context ) ) #else if ( r && !r->willRenderFeature( f ) ) #endif continue; QgsGeometry* g = f.geometry(); if ( doContains ) { if ( !selectGeomTrans.contains( g ) ) continue; } else { if ( !selectGeomTrans.intersects( g ) ) continue; } if ( singleSelect ) { foundSingleFeature = true; double distance = g->distance( selectGeomTrans ); if ( distance <= closestFeatureDist ) { closestFeatureDist = distance; closestFeatureId = f.id(); } } else { newSelectedFeatures.insert( f.id() ); } } if ( singleSelect && foundSingleFeature ) { newSelectedFeatures.insert( closestFeatureId ); } if ( r ) r->stopRender( context ); QgsDebugMsg( "Number of new selected features: " + QString::number( newSelectedFeatures.size() ) ); if ( doDifference ) { QgsFeatureIds layerSelectedFeatures = vlayer->selectedFeaturesIds(); QgsFeatureIds selectedFeatures; QgsFeatureIds deselectedFeatures; QgsFeatureIds::const_iterator i = newSelectedFeatures.constEnd(); while ( i != newSelectedFeatures.constBegin() ) { --i; if ( layerSelectedFeatures.contains( *i ) ) { deselectedFeatures.insert( *i ); } else { selectedFeatures.insert( *i ); } } vlayer->modifySelection( selectedFeatures, deselectedFeatures ); } else { SelectFeatures( vlayer, newSelectedFeatures ); // vlayer->setSelectedFeatures( newSelectedFeatures ); } QApplication::restoreOverrideCursor(); }
bool QgsComposerAttributeTableV2::getTableContents( QgsComposerTableContents &contents ) { contents.clear(); if (( mSource == QgsComposerAttributeTableV2::AtlasFeature || mSource == QgsComposerAttributeTableV2::RelationChildren ) && !mComposition->atlasComposition().enabled() ) { //source mode requires atlas, but atlas disabled return false; } QgsVectorLayer* layer = sourceLayer(); if ( !layer ) { //no source layer return false; } //prepare filter expression std::auto_ptr<QgsExpression> filterExpression; bool activeFilter = false; if ( mFilterFeatures && !mFeatureFilter.isEmpty() ) { filterExpression = std::auto_ptr<QgsExpression>( new QgsExpression( mFeatureFilter ) ); if ( !filterExpression->hasParserError() ) { activeFilter = true; } } QgsRectangle selectionRect; if ( mComposerMap && mShowOnlyVisibleFeatures ) { selectionRect = *mComposerMap->currentMapExtent(); if ( layer && mComposition->mapSettings().hasCrsTransformEnabled() ) { //transform back to layer CRS QgsCoordinateTransform coordTransform( layer->crs(), mComposition->mapSettings().destinationCrs() ); try { selectionRect = coordTransform.transformBoundingBox( selectionRect, QgsCoordinateTransform::ReverseTransform ); } catch ( QgsCsException &cse ) { Q_UNUSED( cse ); return false; } } } QgsFeatureRequest req; if ( mSource == QgsComposerAttributeTableV2::RelationChildren ) { QgsRelation relation = QgsProject::instance()->relationManager()->relation( mRelationId ); QgsFeature* atlasFeature = mComposition->atlasComposition().currentFeature(); if ( atlasFeature ) { req = relation.getRelatedFeaturesRequest( *atlasFeature ); } else { //no atlas feature, so empty table return true; } } if ( !selectionRect.isEmpty() ) req.setFilterRect( selectionRect ); req.setFlags( mShowOnlyVisibleFeatures ? QgsFeatureRequest::ExactIntersect : QgsFeatureRequest::NoFlags ); if ( mSource == QgsComposerAttributeTableV2::AtlasFeature && mComposition->atlasComposition().enabled() ) { //source mode is current atlas feature QgsFeature* atlasFeature = mComposition->atlasComposition().currentFeature(); if ( atlasFeature ) { req.setFilterFid( atlasFeature->id() ); } else { //no atlas feature, so empty table return true; } } QgsFeature f; int counter = 0; QgsFeatureIterator fit = layer->getFeatures( req ); while ( fit.nextFeature( f ) && counter < mMaximumNumberOfFeatures ) { //check feature against filter if ( activeFilter ) { QVariant result = filterExpression->evaluate( &f, layer->pendingFields() ); // skip this feature if the filter evaluation is false if ( !result.toBool() ) { continue; } } //check against atlas feature intersection if ( mFilterToAtlasIntersection ) { if ( !f.geometry() || ! mComposition->atlasComposition().enabled() ) { continue; } QgsFeature* atlasFeature = mComposition->atlasComposition().currentFeature(); if ( !atlasFeature || !atlasFeature->geometry() || !f.geometry()->intersects( atlasFeature->geometry() ) ) { //feature falls outside current atlas feature continue; } } QgsComposerTableRow currentRow; QList<QgsComposerTableColumn*>::const_iterator columnIt = mColumns.constBegin(); for ( ; columnIt != mColumns.constEnd(); ++columnIt ) { int idx = layer->fieldNameIndex(( *columnIt )->attribute() ); if ( idx != -1 ) { currentRow << f.attributes()[idx]; } else { // Lets assume it's an expression QgsExpression* expression = new QgsExpression(( *columnIt )->attribute() ); expression->setCurrentRowNumber( counter + 1 ); expression->prepare( layer->pendingFields() ); QVariant value = expression->evaluate( f ) ; currentRow << value; } } if ( !mShowUniqueRowsOnly || !contentsContainsRow( contents, currentRow ) ) { contents << currentRow; ++counter; } } //sort the list, starting with the last attribute QgsComposerAttributeTableCompareV2 c; QList< QPair<int, bool> > sortColumns = sortAttributes(); for ( int i = sortColumns.size() - 1; i >= 0; --i ) { c.setSortColumn( sortColumns.at( i ).first ); c.setAscending( sortColumns.at( i ).second ); qStableSort( contents.begin(), contents.end(), c ); } recalculateTableSize(); return true; }
void QgsLabelPropertyDialog::init( const QString& layerId, int featureId ) { if ( !mMapRenderer ) { return; } //get feature attributes QgsVectorLayer* vlayer = dynamic_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( layerId ) ); if ( !vlayer ) { return; } QgsFeature f; if ( !vlayer->featureAtId( featureId, f, false, true ) ) { return; } const QgsAttributeMap& attributeValues = f.attributeMap(); //get layerproperties. Problem: only for pallabeling... QgsPalLabeling* lbl = dynamic_cast<QgsPalLabeling*>( mMapRenderer->labelingEngine() ); if ( !lbl ) { return; } blockElementSignals( true ); //get label field and fill line edit QString labelFieldName = vlayer->customProperty( "labeling/fieldName" ).toString(); if ( !labelFieldName.isEmpty() ) { mCurrentLabelField = vlayer->fieldNameIndex( labelFieldName ); mLabelTextLineEdit->setText( attributeValues[mCurrentLabelField].toString() ); const QgsFieldMap& layerFields = vlayer->pendingFields(); switch ( layerFields[mCurrentLabelField].type() ) { case QVariant::Double: mLabelTextLineEdit->setValidator( new QDoubleValidator( this ) ); break; case QVariant::Int: case QVariant::UInt: case QVariant::LongLong: mLabelTextLineEdit->setValidator( new QIntValidator( this ) ); break; default: break; } } //get attributes of the feature and fill data defined values QgsPalLayerSettings& layerSettings = lbl->layer( layerId ); mLabelFont = layerSettings.textFont; //set all the gui elements to the default values mFontSizeSpinBox->setValue( layerSettings.textFont.pointSizeF() ); mBufferColorButton->setColor( layerSettings.textColor ); mLabelDistanceSpinBox->setValue( layerSettings.dist ); mBufferSizeSpinBox->setValue( layerSettings.bufferSize ); mMinScaleSpinBox->setValue( layerSettings.scaleMin ); mMaxScaleSpinBox->setValue( layerSettings.scaleMax ); mHaliComboBox->setCurrentIndex( mHaliComboBox->findText( "Left" ) ); mValiComboBox->setCurrentIndex( mValiComboBox->findText( "Bottom" ) ); disableGuiElements(); mDataDefinedProperties = layerSettings.dataDefinedProperties; QMap< QgsPalLayerSettings::DataDefinedProperties, int >::const_iterator propIt = mDataDefinedProperties.constBegin(); for ( ; propIt != mDataDefinedProperties.constEnd(); ++propIt ) { switch ( propIt.key() ) { case QgsPalLayerSettings::Show: mShowLabelChkbx->setEnabled( true ); mShowLabelChkbx->setChecked( attributeValues[propIt.value()].toInt() != 0 ); break; case QgsPalLayerSettings::AlwaysShow: mAlwaysShowChkbx->setEnabled( true ); mAlwaysShowChkbx->setChecked( attributeValues[propIt.value()].toBool() ); break; case QgsPalLayerSettings::MinScale: mMinScaleSpinBox->setEnabled( true ); mMinScaleSpinBox->setValue( attributeValues[propIt.value()].toInt() ); break; case QgsPalLayerSettings::MaxScale: mMaxScaleSpinBox->setEnabled( true ); mMaxScaleSpinBox->setValue( attributeValues[propIt.value()].toInt() ); break; case QgsPalLayerSettings::Size: mFontSizeSpinBox->setEnabled( true ); mLabelFont.setPointSizeF( attributeValues[propIt.value()].toDouble() ); mFontSizeSpinBox->setValue( attributeValues[propIt.value()].toDouble() ); break; case QgsPalLayerSettings::BufferSize: mBufferSizeSpinBox->setEnabled( true ); mBufferSizeSpinBox->setValue( attributeValues[propIt.value()].toDouble() ); break; case QgsPalLayerSettings::PositionX: mXCoordSpinBox->setEnabled( true ); mXCoordSpinBox->setValue( attributeValues[propIt.value()].toDouble() ); break; case QgsPalLayerSettings::PositionY: mYCoordSpinBox->setEnabled( true ); mYCoordSpinBox->setValue( attributeValues[propIt.value()].toDouble() ); break; case QgsPalLayerSettings::LabelDistance: mLabelDistanceSpinBox->setEnabled( true ); mLabelDistanceSpinBox->setValue( attributeValues[propIt.value()].toDouble() ); break; case QgsPalLayerSettings::Hali: mHaliComboBox->setEnabled( true ); mHaliComboBox->setCurrentIndex( mHaliComboBox->findText( attributeValues[propIt.value()].toString() ) ); break; case QgsPalLayerSettings::Vali: mValiComboBox->setEnabled( true ); mValiComboBox->setCurrentIndex( mValiComboBox->findText( attributeValues[propIt.value()].toString() ) ); break; case QgsPalLayerSettings::BufferColor: mBufferColorButton->setEnabled( true ); mBufferColorButton->setColor( QColor( attributeValues[propIt.value()].toString() ) ); break; case QgsPalLayerSettings::Color: mFontColorButton->setEnabled( true ); mFontColorButton->setColor( QColor( attributeValues[propIt.value()].toString() ) ); break; case QgsPalLayerSettings::Rotation: mRotationSpinBox->setEnabled( true ); mRotationSpinBox->setValue( attributeValues[propIt.value()].toDouble() ); break; //font related properties case QgsPalLayerSettings::Bold: mLabelFont.setBold( attributeValues[propIt.value()].toBool() ); break; case QgsPalLayerSettings::Italic: mLabelFont.setItalic( attributeValues[propIt.value()].toBool() ); break; case QgsPalLayerSettings::Underline: mLabelFont.setUnderline( attributeValues[propIt.value()].toBool() ); break; case QgsPalLayerSettings::Strikeout: mLabelFont.setStrikeOut( attributeValues[propIt.value()].toBool() ); break; case QgsPalLayerSettings::Family: mLabelFont.setFamily( attributeValues[propIt.value()].toString() ); break; default: break; } } mFontPushButton->setEnabled( labelFontEditingPossible() ); blockElementSignals( false ); }
void QgsDxfExport::writeEntities() { startSection(); writeGroup( 2, "ENTITIES" ); //label engine QgsDxfPalLabeling labelEngine( this, mExtent.isEmpty() ? dxfExtent() : mExtent, mSymbologyScaleDenominator, mMapUnits ); QgsRenderContext& ctx = labelEngine.renderContext(); //iterate through the maplayers QList< QgsMapLayer* >::iterator layerIt = mLayers.begin(); for ( ; layerIt != mLayers.end(); ++layerIt ) { QgsVectorLayer* vl = qobject_cast<QgsVectorLayer*>( *layerIt ); if ( !vl || !layerIsScaleBasedVisible( vl ) ) { continue; } QgsSymbolV2RenderContext sctx( ctx, QgsSymbolV2::MM , 1.0, false, 0, 0 ); QgsFeatureRendererV2* renderer = vl->rendererV2(); renderer->startRender( ctx, vl->pendingFields() ); QStringList attributes = renderer->usedAttributes(); bool labelLayer = ( labelEngine.prepareLayer( vl, attributes, ctx ) != 0 ); if ( mSymbologyExport == QgsDxfExport::SymbolLayerSymbology && ( renderer->capabilities() & QgsFeatureRendererV2::SymbolLevels ) && renderer->usingSymbolLevels() ) { writeEntitiesSymbolLevels( vl ); renderer->stopRender( ctx ); continue; } QgsFeatureRequest freq = QgsFeatureRequest().setSubsetOfAttributes( attributes, vl->pendingFields() ); if ( !mExtent.isEmpty() ) { freq.setFilterRect( mExtent ); } QgsFeatureIterator featureIt = vl->getFeatures( freq ); QgsFeature fet; while ( featureIt.nextFeature( fet ) ) { sctx.setFeature( &fet ); if ( mSymbologyExport == NoSymbology ) { addFeature( sctx, dxfLayerName( vl->name() ), 0, 0 ); //no symbology at all } else { if ( !renderer ) { continue; } QgsSymbolV2List symbolList = renderer->symbolsForFeature( fet ); if ( symbolList.size() < 1 ) { continue; } if ( mSymbologyExport == QgsDxfExport::SymbolLayerSymbology ) //symbol layer symbology, but layer does not use symbol levels { QgsSymbolV2List::iterator symbolIt = symbolList.begin(); for ( ; symbolIt != symbolList.end(); ++symbolIt ) { int nSymbolLayers = ( *symbolIt )->symbolLayerCount(); for ( int i = 0; i < nSymbolLayers; ++i ) { addFeature( sctx, dxfLayerName( vl->name() ), ( *symbolIt )->symbolLayer( i ), *symbolIt ); } } } else { //take first symbollayer from first symbol QgsSymbolV2* s = symbolList.first(); if ( !s || s->symbolLayerCount() < 1 ) { continue; } addFeature( sctx, dxfLayerName( vl->name() ), s->symbolLayer( 0 ), s ); } if ( labelLayer ) { labelEngine.registerFeature( vl->id(), fet, ctx ); } } } renderer->stopRender( ctx ); } labelEngine.drawLabeling( ctx ); endSection(); }
void QgsMapToolAddFeature::canvasReleaseEvent( QMouseEvent * e ) { QgsDebugMsg( "entered." ); QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( mCanvas->currentLayer() ); if ( !vlayer ) { notifyNotVectorLayer(); return; } QGis::WkbType layerWKBType = vlayer->wkbType(); QgsVectorDataProvider* provider = vlayer->dataProvider(); if ( !( provider->capabilities() & QgsVectorDataProvider::AddFeatures ) ) { QMessageBox::information( 0, tr( "Layer cannot be added to" ), tr( "The data provider for this layer does not support the addition of features." ) ); return; } if ( !vlayer->isEditable() ) { notifyNotEditableLayer(); return; } // POINT CAPTURING if ( mode() == CapturePoint ) { if ( e->button() != Qt::LeftButton ) return; //check we only use this tool for point/multipoint layers if ( vlayer->geometryType() != QGis::Point ) { QMessageBox::information( 0, tr( "Wrong editing tool" ), tr( "Cannot apply the 'capture point' tool on this vector layer" ) ); return; } QgsPoint idPoint; //point in map coordinates QList<QgsSnappingResult> snapResults; QgsPoint savePoint; //point in layer coordinates if ( mSnapper.snapToBackgroundLayers( e->pos(), snapResults ) == 0 ) { idPoint = snapPointFromResults( snapResults, e->pos() ); try { savePoint = toLayerCoordinates( vlayer, idPoint ); QgsDebugMsg( "savePoint = " + savePoint.toString() ); } catch ( QgsCsException &cse ) { Q_UNUSED( cse ); QMessageBox::information( 0, tr( "Coordinate transform error" ), tr( "Cannot transform the point to the layers coordinate system" ) ); return; } } //only do the rest for provider with feature addition support //note that for the grass provider, this will return false since //grass provider has its own mechanism of feature addition if ( provider->capabilities() & QgsVectorDataProvider::AddFeatures ) { QgsFeature* f = new QgsFeature( vlayer->pendingFields(), 0 ); QgsGeometry *g = 0; if ( layerWKBType == QGis::WKBPoint || layerWKBType == QGis::WKBPoint25D ) { g = QgsGeometry::fromPoint( savePoint ); } else if ( layerWKBType == QGis::WKBMultiPoint || layerWKBType == QGis::WKBMultiPoint25D ) { g = QgsGeometry::fromMultiPoint( QgsMultiPoint() << savePoint ); } f->setGeometry( g ); vlayer->beginEditCommand( tr( "Feature added" ) ); if ( addFeature( vlayer, f ) ) { vlayer->endEditCommand(); } else { delete f; vlayer->destroyEditCommand(); } mCanvas->refresh(); } } // LINE AND POLYGON CAPTURING else if ( mode() == CaptureLine || mode() == CapturePolygon ) { //check we only use the line tool for line/multiline layers if ( mode() == CaptureLine && vlayer->geometryType() != QGis::Line ) { QMessageBox::information( 0, tr( "Wrong editing tool" ), tr( "Cannot apply the 'capture line' tool on this vector layer" ) ); return; } //check we only use the polygon tool for polygon/multipolygon layers if ( mode() == CapturePolygon && vlayer->geometryType() != QGis::Polygon ) { QMessageBox::information( 0, tr( "Wrong editing tool" ), tr( "Cannot apply the 'capture polygon' tool on this vector layer" ) ); return; } //add point to list and to rubber band if ( e->button() == Qt::LeftButton ) { int error = addVertex( e->pos() ); if ( error == 1 ) { //current layer is not a vector layer return; } else if ( error == 2 ) { //problem with coordinate transformation QMessageBox::information( 0, tr( "Coordinate transform error" ), tr( "Cannot transform the point to the layers coordinate system" ) ); return; } startCapturing(); } else if ( e->button() == Qt::RightButton ) { // End of string deleteTempRubberBand(); //lines: bail out if there are not at least two vertices if ( mode() == CaptureLine && size() < 2 ) { stopCapturing(); return; } //polygons: bail out if there are not at least two vertices if ( mode() == CapturePolygon && size() < 3 ) { stopCapturing(); return; } //create QgsFeature with wkb representation QgsFeature* f = new QgsFeature( vlayer->pendingFields(), 0 ); QgsGeometry *g; if ( mode() == CaptureLine ) { if ( layerWKBType == QGis::WKBLineString || layerWKBType == QGis::WKBLineString25D ) { g = QgsGeometry::fromPolyline( points().toVector() ); } else if ( layerWKBType == QGis::WKBMultiLineString || layerWKBType == QGis::WKBMultiLineString25D ) { g = QgsGeometry::fromMultiPolyline( QgsMultiPolyline() << points().toVector() ); } else { QMessageBox::critical( 0, tr( "Error" ), tr( "Cannot add feature. Unknown WKB type" ) ); stopCapturing(); return; //unknown wkbtype } f->setGeometry( g ); } else // polygon { if ( layerWKBType == QGis::WKBPolygon || layerWKBType == QGis::WKBPolygon25D ) { g = QgsGeometry::fromPolygon( QgsPolygon() << points().toVector() ); } else if ( layerWKBType == QGis::WKBMultiPolygon || layerWKBType == QGis::WKBMultiPolygon25D ) { g = QgsGeometry::fromMultiPolygon( QgsMultiPolygon() << ( QgsPolygon() << points().toVector() ) ); } else { QMessageBox::critical( 0, tr( "Error" ), tr( "Cannot add feature. Unknown WKB type" ) ); stopCapturing(); return; //unknown wkbtype } if ( !g ) { stopCapturing(); delete f; return; // invalid geometry; one possibility is from duplicate points } f->setGeometry( g ); int avoidIntersectionsReturn = f->geometry()->avoidIntersections(); if ( avoidIntersectionsReturn == 1 ) { //not a polygon type. Impossible to get there } #if 0 else if ( avoidIntersectionsReturn == 2 ) //MH120131: disable this error message until there is a better way to cope with the single type / multi type problem { //bail out... QMessageBox::critical( 0, tr( "Error" ), tr( "The feature could not be added because removing the polygon intersections would change the geometry type" ) ); delete f; stopCapturing(); return; } #endif else if ( avoidIntersectionsReturn == 3 ) { QMessageBox::critical( 0, tr( "Error" ), tr( "An error was reported during intersection removal" ) ); } if ( !f->geometry()->asWkb() ) //avoid intersection might have removed the whole geometry { QString reason; if ( avoidIntersectionsReturn != 2 ) { reason = tr( "The feature cannot be added because it's geometry is empty" ); } else { reason = tr( "The feature cannot be added because it's geometry collapsed due to intersection avoidance" ); } QMessageBox::critical( 0, tr( "Error" ), reason ); delete f; stopCapturing(); return; } } vlayer->beginEditCommand( tr( "Feature added" ) ); if ( addFeature( vlayer, f ) ) { //add points to other features to keep topology up-to-date int topologicalEditing = QgsProject::instance()->readNumEntry( "Digitizing", "/TopologicalEditing", 0 ); //use always topological editing for avoidIntersection. //Otherwise, no way to guarantee the geometries don't have a small gap in between. QStringList intersectionLayers = QgsProject::instance()->readListEntry( "Digitizing", "/AvoidIntersectionsList" ); bool avoidIntersection = !intersectionLayers.isEmpty(); if ( avoidIntersection ) //try to add topological points also to background layers { QStringList::const_iterator lIt = intersectionLayers.constBegin(); for ( ; lIt != intersectionLayers.constEnd(); ++lIt ) { QgsMapLayer* ml = QgsMapLayerRegistry::instance()->mapLayer( *lIt ); QgsVectorLayer* vl = qobject_cast<QgsVectorLayer*>( ml ); //can only add topological points if background layer is editable... if ( vl && vl->geometryType() == QGis::Polygon && vl->isEditable() ) { vl->addTopologicalPoints( f->geometry() ); } } } else if ( topologicalEditing ) { vlayer->addTopologicalPoints( f->geometry() ); } vlayer->endEditCommand(); } else { delete f; vlayer->destroyEditCommand(); } stopCapturing(); } } }
void QgsMapToolFillRing::canvasReleaseEvent( QMouseEvent * e ) { //check if we operate on a vector layer QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( mCanvas->currentLayer() ); if ( !vlayer ) { notifyNotVectorLayer(); return; } if ( !vlayer->isEditable() ) { notifyNotEditableLayer(); return; } //add point to list and to rubber band if ( e->button() == Qt::LeftButton ) { int error = addVertex( e->pos() ); if ( error == 1 ) { //current layer is not a vector layer return; } else if ( error == 2 ) { //problem with coordinate transformation QMessageBox::information( 0, tr( "Coordinate transform error" ), tr( "Cannot transform the point to the layers coordinate system" ) ); return; } startCapturing(); } else if ( e->button() == Qt::RightButton ) { deleteTempRubberBand(); closePolygon(); vlayer->beginEditCommand( tr( "Ring added and filled" ) ); int addRingReturnCode = vlayer->addRing( points() ); if ( addRingReturnCode != 0 ) { QString errorMessage; //todo: open message box to communicate errors if ( addRingReturnCode == 1 ) { errorMessage = tr( "A problem with geometry type occured" ); } else if ( addRingReturnCode == 2 ) { errorMessage = tr( "The inserted Ring is not closed" ); } else if ( addRingReturnCode == 3 ) { errorMessage = tr( "The inserted Ring is not a valid geometry" ); } else if ( addRingReturnCode == 4 ) { errorMessage = tr( "The inserted Ring crosses existing rings" ); } else if ( addRingReturnCode == 5 ) { errorMessage = tr( "The inserted Ring is not contained in a feature" ); } else { errorMessage = tr( "An unknown error occured" ); } QMessageBox::critical( 0, tr( "Error, could not add ring" ), errorMessage ); vlayer->destroyEditCommand(); } else { // find parent feature and get it attributes double xMin, xMax, yMin, yMax; QgsRectangle bBox; xMin = std::numeric_limits<double>::max(); xMax = -std::numeric_limits<double>::max(); yMin = std::numeric_limits<double>::max(); yMax = -std::numeric_limits<double>::max(); for ( QList<QgsPoint>::const_iterator it = points().constBegin(); it != points().constEnd(); ++it ) { if ( it->x() < xMin ) { xMin = it->x(); } if ( it->x() > xMax ) { xMax = it->x(); } if ( it->y() < yMin ) { yMin = it->y(); } if ( it->y() > yMax ) { yMax = it->y(); } } bBox.setXMinimum( xMin ); bBox.setYMinimum( yMin ); bBox.setXMaximum( xMax ); bBox.setYMaximum( yMax ); QgsFeatureIterator fit = vlayer->getFeatures( QgsFeatureRequest().setFilterRect( bBox ).setFlags( QgsFeatureRequest::ExactIntersect ) ); QgsFeature f; bool res = false; while ( fit.nextFeature( f ) ) { //create QgsFeature with wkb representation QgsFeature* ft = new QgsFeature( vlayer->pendingFields(), 0 ); QgsGeometry *g; g = QgsGeometry::fromPolygon( QgsPolygon() << points().toVector() ); ft->setGeometry( g ); ft->setAttributes( f.attributes() ); if ( QgsApplication::keyboardModifiers() == Qt::ControlModifier ) { res = vlayer->addFeature( *ft ); } else { QgsAttributeDialog *dialog = new QgsAttributeDialog( vlayer, ft, false, NULL, true ); dialog->setIsAddDialog( true ); res = dialog->exec(); // will also add the feature } if ( res ) { vlayer->endEditCommand(); } else { delete ft; vlayer->destroyEditCommand(); } res = false; } } stopCapturing(); } }