Estoy desarrollando un complemento para QGIS que necesita asignar un UUID a cualquier característica tan pronto como se agregue a la capa. Estoy usando la señal featureAdded para escribir el UUID en el campo correspondiente de la función.
Este es el código que estoy usando (lo más simplificado posible):
def run(self):
self.iface.mapCanvas().currentLayer().featureAdded.connect(self.onFeatureAdded)
def onFeatureAdded(self, fid):
layer = self.iface.mapCanvas().currentLayer()
layer.beginEditCommand("Set UUID")
print layer.changeAttributeValue(fid, layer.fieldNameIndex('guid_pol'), 'some_random_uuid') # prints True
layer.endEditCommand()
(Creé un nuevo complemento con el complemento 'Creador de complementos' y el anterior es el único código que le he agregado ).
A menos que me falte algo, esto sigue las pautas de la documentación en el libro de cocina para desarrolladores de QGIS : http://docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/vector.html#modifying-vector-layers-with- un búfer de edición
Cuando edito la capa, si agrego una característica, el campo 'guid_pol' se establece en 'some_random_uuid' como se esperaba. Sin embargo, puedo confirmar los cambios sin problemas si, en lugar de confirmarlos, intento cancelarlos QGIS falla con el error 0xC0000005 (Infracción de acceso) .
Curiosamente, el comando 'Establecer UUID' no se agrega a la pila de deshacer / rehacer (al menos, no al panel Deshacer / rehacer ) y si intento deshacerlo también se bloquea .
Estoy usando QGIS 2.14 pero observé un comportamiento similar con QGIS 2.12.
Me está costando que esto funcione. ¿Hay algo que estoy haciendo mal?
fuente