Portada › Foros QGIS › 6. Python › Copiar entidades con Python y Acciones en propiedades de capa.
- Este debate tiene 3 respuestas, 4 mensajes y ha sido actualizado por última vez el hace 6 años, 11 meses por
Luis Eduardo.
-
AutorEntradas
-
-
mayo 10, 2018 a las 11:00 am #1701
Fco J. Cooral
ParticipanteLa idea es la siguiente.
Sobre un proyecto en Qgis2.18.12 es coger una entidad de una capa existente y copiarla en esa capa actualizando la fecha.
He cogido el código de las acciones predeterminadas en QGIS 3.0 y lo he intentado utilizar en la versión Qgis2.18.12.Es posible que sea tema de compatibilidad de versión de Python? YA que en la versión 3.0 funciona correctamente
Gracias.
Adjunto el código introducido y el error a continuación:El codigo Python:
project = QgsProject.instance()
layer = QgsProject.instance().mapLayer(‘[% @layer_id %]’)
if not layer.isEditable():
qgis.utils.iface.messageBar().pushMessage( ‘Cannot duplicate feature in not editable mode on layer {layer}’.format( layer=layer.name() ) )
else:
features=[]
if len(‘[% $id %]’)>0:
features.append( layer.getFeature( [% $id %] ) )
else:
for x in layer.selectedFeatures():
features.append( x )
feature_count=0
children_info=»
featureids=[]
for f in features:
result=QgsVectorLayerUtils.duplicateFeature(layer, f, project, 0 )
featureids.append( result[0].id() )
feature_count+=1
for ch_layer in result[1].layers():
children_info+='{number_of_children} children on layer {children_layer}\n’.format( number_of_children=str( len( result[1].duplicatedFeatures(ch_layer) ) ), children_layer=ch_layer.name() )
ch_layer.selectByIds( result[1].duplicatedFeatures(ch_layer) )
layer.selectByIds( featureids )
qgis.utils.iface.messageBar().pushMessage( ‘{number_of_features} features on layer {layer} duplicated with\n{children_info}’.format( number_of_features=str( feature_count ), layer=layer.name(), children_info=children_info ) )El error mostrado en «Ejecutar acción de objeto»:
project = QgsProject.instance()
layer = QgsProject.instance().mapLayer(‘MEDICIONSUPERFICIES_4c63bd71_423f_4b83_9123_b67271ff1c48’)
if not layer.isEditable():
qgis.utils.iface.messageBar().pushMessage( ‘Cannot duplicate feature in not editable mode on layer {layer}’.format( layer=layer.name() ) )
else:
features=[]
if len(’28’)>0:
features.append( layer.getFeature( 28 ) )
else:
for x in layer.selectedFeatures():
features.append( x )
feature_count=0
children_info=»
featureids=[]
for f in features:
result=QgsVectorLayerUtils.duplicateFeature(layer, f, project, 0 )
featureids.append( result[0].id() )
feature_count+=1
for ch_layer in result[1].layers():
children_info+='{number_of_children} children on layer {children_layer}\n’.format( number_of_children=str( len( result[1].duplicatedFeatures(ch_layer) ) ), children_layer=ch_layer.name() )
ch_layer.selectByIds( result[1].duplicatedFeatures(ch_layer) )
layer.selectByIds( featureids )
qgis.utils.iface.messageBar().pushMessage( ‘{number_of_features} features on layer {layer} duplicated with\n{children_info}’.format( number_of_features=str( feature_count ), layer=layer.name(), children_info=children_info ) )Traceback (most recent call last):
File «», line 2, in
AttributeError: ‘QgsProject’ object has no attribute ‘mapLayer’Versión de Python:
2.7.5 (default, May 15 2013, 22:44:16) [MSC v.1500 64 bit (AMD64)]Versión de QGIS:
2.18.12 ‘Las Palmas’, a6c461bRuta de Python:
[‘C:/PROGRA~1/QGIS2~1.18/apps/qgis/./python/plugins\\processing’, ‘C:/PROGRA~1/QGIS2~1.18/apps/qgis/./python’, u’C:/Users/fjcorral/.qgis2/python’, u’C:/Users/fjcorral/.qgis2/python/plugins’, ‘C:/PROGRA~1/QGIS2~1.18/apps/qgis/./python/plugins’, ‘C:\\PROGRA~1\\QGIS2~1.18\\bin\\python27.zip’, ‘C:\\PROGRA~1\\QGIS2~1.18\\apps\\Python27\\DLLs’, ‘C:\\PROGRA~1\\QGIS2~1.18\\apps\\Python27\\lib’, ‘C:\\PROGRA~1\\QGIS2~1.18\\apps\\Python27\\lib\\plat-win’, ‘C:\\PROGRA~1\\QGIS2~1.18\\apps\\Python27\\lib\\lib-tk’, ‘C:\\PROGRA~1\\QGIS2~1.18\\bin’, ‘C:\\PROGRA~1\\QGIS2~1.18\\apps\\Python27’, ‘C:\\PROGRA~1\\QGIS2~1.18\\apps\\Python27\\lib\\site-packages’, ‘C:\\PROGRA~1\\QGIS2~1.18\\apps\\Python27\\lib\\site-packages\\jinja2-2.7.2-py2.7.egg’, ‘C:\\PROGRA~1\\QGIS2~1.18\\apps\\Python27\\lib\\site-packages\\markupsafe-0.23-py2.7-win-amd64.egg’, ‘C:\\PROGRA~1\\QGIS2~1.18\\apps\\Python27\\lib\\site-packages\\win32’, ‘C:\\PROGRA~1\\QGIS2~1.18\\apps\\Python27\\lib\\site-packages\\win32\\lib’, ‘C:\\PROGRA~1\\QGIS2~1.18\\apps\\Python27\\lib\\site-packages\\Pythonwin’, ‘C:\\PROGRA~1\\QGIS2~1.18\\apps\\Python27\\lib\\site-packages\\Shapely-1.2.18-py2.7-win-amd64.egg’, ‘C:\\PROGRA~1\\QGIS2~1.18\\apps\\Python27\\lib\\site-packages\\wx-2.8-msw-unicode’, ‘C:\\PROGRA~1\\QGIS2~1.18\\apps\\Python27\\lib\\site-packages\\xlrd-0.9.2-py2.7.egg’, ‘C:\\PROGRA~1\\QGIS2~1.18\\apps\\Python27\\lib\\site-packages\\xlwt-0.7.5-py2.7.egg’, u’C:/Users/fjcorral/.qgis2//python’, u’//FS03/Departamentales/Policia_Portuaria/Proyecto qgis medicion’] -
mayo 22, 2018 a las 9:11 pm #1772
JoseRuizMan
ParticipanteHola
Aún a riesgo de equivocarme porque ni el Python ni la programación son lo mío, si que existe una diferencia de versión entre ambas versiones, o sea QGIS 2,18 gasta Python 2,7 y QGIS 3 la 3,5 o similar.
A ver si algún otro compañero nos puede ratificar todo esto. Y creo recordar que Python tiene un pequeño módulo para convertir de la 2 a la 3 pero tampoco lo he usado recientemente. Yo con alguna cosa concreta sé que el compañero que lo maneja ha tenido que adaptar algunas de las funciones que usamos. Si puedo lo consultaré.
Saludos
-
junio 8, 2018 a las 9:45 pm #1811
Giseros.comSuperadministradorExiste algo para cambiar de versión de Python… No lo he probado para ver el funcionamiento, espero que alguien con más experiencia nos pueda ayudar.. ya que es un tema que suele interesar mucho
-
junio 12, 2019 a las 7:19 pm #2287
Luis Eduardo
ParticipanteSaludos, amigo ahi te especifica el error dice que QgsProjecct no tiene el metodo mapLayer, entonces lo que debes hacer es indagar en el API de la 2.18 cual es el metodo que te permite acceder a una capa introduciendo el id. Lo sustituyes u verificas si arroja otro error
Mira el API de QGis3 en la clase QgsProject: QgsMapLayer * mapLayer (const QString &layerId) const
Te dice que el metodod mapLayer sobre QgsProject requiere como argumento el id de una capa y te devuelve dicha capa
-
-
AutorEntradas
- Debes estar registrado para responder a este debate.