Bonjour,
Merci pour ta réponse, c'est effectivement le tuto que je suivais...
bon après avoir passé au crible différents plugins que j'avais et bidouiller, re bidouiller, tenter des trucs, re tenter des trucs, les annuler, encore et encore...je suis arrivé à faire tourner un truc pas mal.
Pour le suivi au cas ou quelqu'un se poserait la question :
Pour la structure, je m'en suis sorti avac un fichier testExport.py qui appelle le fichier de dialogue testExportDialog.py, qui stocke les variables utilisateurs comme l'adresse du repertoire cible et l'envoie à un troisième fichier qui contient la routine d'export testExportEngine.py.
Je vous poste le code des trois fichiers :
Bon, le code est sûrement très sale et peut surement largement être optimisé, n'empêche qu'il tourne...si vous avez des remarques je suis néanmoins plus que preneur pour progresser...
Voici mon fichier principal - testExport.py
Code:
# Import the PyQt and QGIS libraries
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
# Initialize Qt resources from file resources.py
import resources
# Import the code for the dialog
from testExportDialog import testExportDialog
from PyQt4.QtGui import QApplication, QMainWindow, QMenu, QMessageBox
import shutil, os
class testExport:
def __init__(self, iface):
# Save reference to the QGIS interface
self.iface = iface
def initGui(self):
# Create action that will start plugin configuration
self.action = QAction(QIcon(":/plugins/testExport/icon.png"), \
"Export4vents", self.iface.mainWindow())
# connect the action to the run method
QObject.connect(self.action, SIGNAL("activated()"), self.run)
# Add toolbar button and menu item
self.iface.addToolBarIcon(self.action)
self.iface.addPluginToMenu("&testExportPlugin", self.action)
def unload(self):
# Remove the plugin menu item and icon
self.iface.removePluginMenu("&testExportPlugin",self.action)
self.iface.removeToolBarIcon(self.action)
# run method that performs all the real work
def run(self):
# create and show the dialog
dlg = testExportDialog()
# show the dialog
dlg.show()
result = dlg.exec_()
# See if OK was pressed
if result == 1:
aLayer=self.iface.activeLayer()
for features in aLayer.selectedFeatures():
attributs=features.attributeMap()
selection=attributs[0].toString()
selectionstr=str(selection)
shutil.copy(selectionstr,dest)
# do something useful (delete the line containing pass and
# substitute with your code
Ensuite le fichier de dialogue - testExportDialog.py :
Code:
from PyQt4 import QtCore, QtGui
from Ui_testExport import Ui_testExport
import os, shutil
from PyQt4 import QtCore, QtGui
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.core import *
from testExportEngine import testExportEngine
import os.path
import glob # file glob for iterating dir
# create the dialog for testExport
class testExportDialog(QtGui.QDialog):
def __init__(self):
QtGui.QDialog.__init__(self)
# Set up the user interface from Designer.
self.ui = Ui_testExport ()
self.ui.setupUi(self)
self.dir = os.path.realpath(os.path.curdir)
@pyqtSlot() #je ne sais pas vraiment à quoi sert cette ligne, mais si je l'enleve mon file browser s'ouvre à l'infini...
def on_slctOutputDir_clicked(self): #ouvre le file browser au clic sur le bouton correspondant
myDirName = QtGui.QFileDialog.getExistingDirectory(self, "Repertoire de destination des images :")
self.ui.OutputPath.setText(myDirName)
def accept(self):
myEngine=testExportEngine()
myEngine.dest=str(self.ui.OutputPath.text())
myEngine.run()
Et voici enfin ma routine - testExportEngine.py :
Code:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import shutil, os, qgis
from qgis.core import *
from PyQt4 import QtCore, QtGui
from PyQt4.QtCore import *
from PyQt4.QtGui import QMessageBox
class testExportEngine():
def __init__(self):
self.dest = None
def run(self):
dest2=str(self.dest)
aLayer=qgis.utils.iface.activeLayer()
for features in aLayer.selectedFeatures():
attributs=features.attributeMap()
selection=attributs[0].toString()
selectionstr=str(selection)
shutil.copy(selectionstr,dest2)
#QtGui.QMessageBox.information(None, "Copie réussie", "La copie s'est deroulee avec succes!")
Comme vous l'aurez surement remarqué, il y a quelques problèmes :
_la routine de testExportEngine.py est la même que le run dans le fichier principal, j'imagine qu'il y'a redondance mais si je l'enlève du testExport.py, le plugin ne fonctionne plus... :/ Je suppose que le fichier testExportEngine n'est pas nécessaire et que je peux ne l'écrire que dans le run du fichier principal mais toutes mes tentatives se sont soldées par de jolies "Python Error" bien rouges...
_Le message de "Copie Réussie" est actuellement commenté car j'aimerai qu'il s'affiche une fois tous les fichiers déplacés alors qu'à la place ou il se trouve, il s'affiche pour chaque image déplacée, la suivante étant copiée après avoir cliqué sur "ok" et de nouveau messagebox...et ainsi de suite sur 50 images c'est un peu lourd... Le mettre au même niveau que le "for" empêche mon plugin de tourner.
Y aurait il un moyen d'écrire un code du style "When job is done, affiche la messagebox"?
Que pensez vous du code de mon premier plugin ?
Sinon pour la suite, afin de finaliser mon apprentissage,j'aimerai maintenant :
_visualiser dans un encart une progressbar et un dialogue du genre 4/54 fichiers déplacés.
_changer le style (couleur par exemple) des points séléctionnés une fois les images déplacées afin d'être sur de ne pas les selectionner plusieurs fois.
_maitriser l'affichage d'erreurs par messagebox.warning du style "aucune couche active séléctionnée" et "la couche séléctionnée ne contient aucune séléction"
Je devrais avoir à peu près fait le tour...
Liens sociaux