4 votos

Seleccione la característica una por una y guárdela como imagen

He utilizado el siguiente código para seleccionar las características y guardarlas como imagen.

layer = self.iface.activeLayer();
layer.setSelectedFeatures([])
count =layer.featureCount()
lstChalta = []
lstFeatures = processing.features(layer)
for elem in lstFeatures:
   geom = elem.geometry()
   attr = elem.attributes()
   layer.setSelectedFeatures([elem.id()])
   self.iface.mapCanvas().zoomToSelected( layer )
   box = layer.boundingBoxOfSelected()
   self.iface.mapCanvas().setExtent(box)
   self.iface.mapCanvas().refresh()
   self.iface.mapCanvas().refresh()
   cno= str(attr[layer.fieldNameIndex('cno')])
   path = 'D:\Test'+ str(cno) + '.png'
   self.iface.mapCanvas().saveAsImage(path)
   #QMessageBox.information(None, "DEBUG:", str(test))

Cada vez que ejecuto el script, está seleccionando sólo la última característica. Sin embargo, si descomento la línea de la caja de mensajes, funciona bien y selecciona todas y cada una de las características una por una. Además, la imagen se guarda correctamente.

Quiero que funcione el script sin que aparezca el mensaje.

1voto

Yada Puntos 9489

No sé si existe un método mejor para esta cuestión pero, he descubierto este procedimiento:

¿Cómo cerrar programáticamente un QMessagebox sin hacer clic en ok o X?

donde se implementó programáticamente un QMessageBox para cerrar automáticamente después de un tiempo determinado. He probado otros métodos (que implican tiempo biblioteca python) con su código pero era necesario un retraso equivalente a un QMessagebox para obtener un resultado satisfactorio.

He modificado ligeramente tu código (para adaptarlo a mi sistema) y la propuesta del enlace anterior para utilizar un QMessageBox sin botón OK.

El siguiente código:

class CustomMessageBox(QMessageBox):

    def __init__(self, *__args):
        QMessageBox.__init__(self)
        self.timeout = 0
        self.autoclose = False
        self.currentTime = 0

    def showEvent(self, QShowEvent):
        self.currentTime = 0
        if self.autoclose:
            self.startTimer(1000)

    def timerEvent(self, *args, **kwargs):
        self.currentTime += 1
        if self.currentTime >= self.timeout:
            self.done(0)

    @staticmethod
    def showWithTimeout(timeoutSeconds, 
                        message, 
                        title, 
                        icon = QMessageBox.Information, 
                        buttons = QMessageBox.NoButton):

        w = CustomMessageBox()
        w.autoclose = True
        w.timeout = timeoutSeconds
        w.setText(message)
        w.setWindowTitle(title)
        w.setIcon(icon)
        w.setStandardButtons(buttons)
        w.exec_()

import processing
from PyQt4.QtGui import QMessageBox

layer = iface.activeLayer();
layer.setSelectedFeatures([])
count =layer.featureCount()
lstChalta = []

lstFeatures = processing.features(layer)

for elem in lstFeatures:
    geom = elem.geometry()
    attr = elem.attributes()
    layer.setSelectedFeatures([elem.id()])
    iface.mapCanvas().zoomToSelected( layer )
    box = layer.boundingBoxOfSelected()
    iface.mapCanvas().setExtent(box)
    iface.mapCanvas().refresh()
    cno= str(attr[layer.fieldNameIndex('cno')])
    path = '/home/zeito/Desktop/folder/Test'+ str(cno) + '.png'

    CustomMessageBox.showWithTimeout(.5, 
                                     'feature: ' + cno, 
                                     "Information", 
                                     icon = QMessageBox.Information)

    iface.mapCanvas().saveAsImage(path)

se estaba ejecutando con una capa vectorial donde creé su campo 'cno'; como se puede observar en la siguiente imagen:

enter image description here

Tomé una captura de pantalla durante la ejecución automática de mi código (ver la siguiente imagen para la característica 3).

enter image description here

Después de ejecutar el código, la carpeta de destino tenía las imágenes png como esperaba.

enter image description here

0 votos

@xunik: a mí me funciona perfectamente....

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X