QgsRelation QgsRelation::createFromXml( const QDomNode &node ) { QDomElement elem = node.toElement(); if ( elem.tagName() != "relation" ) { QgsLogger::warning( QApplication::translate( "QgsRelation", "Cannot create relation. Unexpected tag '%1'" ).arg( elem.tagName() ) ); } QgsRelation relation; QString referencingLayerId = elem.attribute( "referencingLayer" ); QString referencedLayerId = elem.attribute( "referencedLayer" ); QString id = elem.attribute( "id" ); QString name = elem.attribute( "name" ); const QMap<QString, QgsMapLayer*>& mapLayers = QgsMapLayerRegistry::instance()->mapLayers(); QgsMapLayer* referencingLayer = mapLayers[referencingLayerId]; QgsMapLayer* referencedLayer = mapLayers[referencedLayerId]; if ( !referencingLayer ) { QgsLogger::warning( QApplication::translate( "QgsRelation", "Relation defined for layer '%1' which does not exist." ).arg( referencingLayerId ) ); } else if ( QgsMapLayer::VectorLayer != referencingLayer->type() ) { QgsLogger::warning( QApplication::translate( "QgsRelation", "Relation defined for layer '%1' which is not of type VectorLayer." ).arg( referencingLayerId ) ); } if ( !referencedLayer ) { QgsLogger::warning( QApplication::translate( "QgsRelation", "Relation defined for layer '%1' which does not exist." ).arg( referencedLayerId ) ); } else if ( QgsMapLayer::VectorLayer != referencedLayer->type() ) { QgsLogger::warning( QApplication::translate( "QgsRelation", "Relation defined for layer '%1' which is not of type VectorLayer." ).arg( referencedLayerId ) ); } relation.mReferencingLayerId = referencingLayerId; relation.mReferencingLayer = qobject_cast<QgsVectorLayer*>( referencingLayer ); relation.mReferencedLayerId = referencedLayerId; relation.mReferencedLayer = qobject_cast<QgsVectorLayer*>( referencedLayer ); relation.mRelationId = id; relation.mRelationName = name; QDomNodeList references = elem.elementsByTagName( "fieldRef" ); for ( int i = 0; i < references.size(); ++i ) { QDomElement refEl = references.at( i ).toElement(); QString referencingField = refEl.attribute( "referencingField" ); QString referencedField = refEl.attribute( "referencedField" ); relation.addFieldPair( referencingField, referencedField ); } relation.updateRelationStatus(); return relation; }
QgsRelation QgsRelation::createFromXml( const QDomNode &node, QgsReadWriteContext &context ) { QDomElement elem = node.toElement(); if ( elem.tagName() != QLatin1String( "relation" ) ) { QgsLogger::warning( QApplication::translate( "QgsRelation", "Cannot create relation. Unexpected tag '%1'" ).arg( elem.tagName() ) ); } QgsRelation relation; QString referencingLayerId = elem.attribute( QStringLiteral( "referencingLayer" ) ); QString referencedLayerId = elem.attribute( QStringLiteral( "referencedLayer" ) ); QString id = elem.attribute( QStringLiteral( "id" ) ); QString name = context.projectTranslator()->translate( QStringLiteral( "project:relations" ), elem.attribute( QStringLiteral( "name" ) ) ); QString strength = elem.attribute( QStringLiteral( "strength" ) ); const QMap<QString, QgsMapLayer *> &mapLayers = QgsProject::instance()->mapLayers(); QgsMapLayer *referencingLayer = mapLayers[referencingLayerId]; QgsMapLayer *referencedLayer = mapLayers[referencedLayerId]; if ( !referencingLayer ) { QgsLogger::warning( QApplication::translate( "QgsRelation", "Relation defined for layer '%1' which does not exist." ).arg( referencingLayerId ) ); } else if ( QgsMapLayer::VectorLayer != referencingLayer->type() ) { QgsLogger::warning( QApplication::translate( "QgsRelation", "Relation defined for layer '%1' which is not of type VectorLayer." ).arg( referencingLayerId ) ); } if ( !referencedLayer ) { QgsLogger::warning( QApplication::translate( "QgsRelation", "Relation defined for layer '%1' which does not exist." ).arg( referencedLayerId ) ); } else if ( QgsMapLayer::VectorLayer != referencedLayer->type() ) { QgsLogger::warning( QApplication::translate( "QgsRelation", "Relation defined for layer '%1' which is not of type VectorLayer." ).arg( referencedLayerId ) ); } relation.d->mReferencingLayerId = referencingLayerId; relation.d->mReferencingLayer = qobject_cast<QgsVectorLayer *>( referencingLayer ); relation.d->mReferencedLayerId = referencedLayerId; relation.d->mReferencedLayer = qobject_cast<QgsVectorLayer *>( referencedLayer ); relation.d->mRelationId = id; relation.d->mRelationName = name; if ( strength == QLatin1String( "Composition" ) ) { relation.d->mRelationStrength = RelationStrength::Composition; } else { relation.d->mRelationStrength = RelationStrength::Association; } QDomNodeList references = elem.elementsByTagName( QStringLiteral( "fieldRef" ) ); for ( int i = 0; i < references.size(); ++i ) { QDomElement refEl = references.at( i ).toElement(); QString referencingField = refEl.attribute( QStringLiteral( "referencingField" ) ); QString referencedField = refEl.attribute( QStringLiteral( "referencedField" ) ); relation.addFieldPair( referencingField, referencedField ); } relation.updateRelationStatus(); return relation; }