2009-11-07 12:04:42 +00:00
|
|
|
"""
|
|
|
|
QGIS utilities module
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
from PyQt4.QtCore import QCoreApplication
|
|
|
|
import sys
|
|
|
|
import traceback
|
|
|
|
|
|
|
|
|
|
|
|
#######################
|
|
|
|
# ERROR HANDLING
|
|
|
|
|
|
|
|
def showException(type, value, tb, msg):
|
|
|
|
lst = traceback.format_exception(type, value, tb)
|
|
|
|
if msg == None:
|
|
|
|
msg = QCoreApplication.translate('Python', 'An error has occured while executing Python code:')
|
|
|
|
txt = '<font color="red">%s</font><br><br>' % msg
|
|
|
|
for s in lst:
|
|
|
|
txt += s
|
|
|
|
txt += '<br>%s<br>%s<br><br>' % (QCoreApplication.translate('Python','Python version:'), sys.version)
|
|
|
|
txt += '%s %s' % (QCoreApplication.translate('Python','Python path:'), str(sys.path))
|
|
|
|
txt = txt.replace('\n', '<br>')
|
|
|
|
txt = txt.replace(' ', ' ') # preserve whitespaces for nicer output
|
|
|
|
|
|
|
|
from qgis.core import QgsMessageOutput
|
|
|
|
msg = QgsMessageOutput.createMessageOutput()
|
|
|
|
msg.setTitle(QCoreApplication.translate('Python', 'Python error'))
|
|
|
|
msg.setMessage(txt, QgsMessageOutput.MessageHtml)
|
|
|
|
msg.showMessage()
|
|
|
|
|
|
|
|
def qgis_excepthook(type, value, tb):
|
|
|
|
showException(type, value, tb, None)
|
|
|
|
|
|
|
|
def installErrorHook():
|
|
|
|
sys.excepthook = qgis_excepthook
|
|
|
|
|
|
|
|
def uninstallErrorHook():
|
|
|
|
sys.excepthook = sys.__excepthook__
|
|
|
|
|
|
|
|
# install error hook() on module load
|
|
|
|
installErrorHook()
|
|
|
|
|
|
|
|
# initialize 'iface' object
|
|
|
|
iface = None
|
|
|
|
|
|
|
|
def initInterface(pointer):
|
|
|
|
from qgis.gui import QgisInterface
|
|
|
|
from sip import wrapinstance
|
|
|
|
global iface
|
|
|
|
iface = wrapinstance(pointer, QgisInterface)
|
|
|
|
|
|
|
|
|
|
|
|
#######################
|
|
|
|
# CONSOLE OUTPUT
|
|
|
|
|
|
|
|
old_stdout = sys.stdout
|
|
|
|
console_output = None
|
|
|
|
|
|
|
|
# hook for python console so all output will be redirected
|
|
|
|
# and then shown in console
|
|
|
|
def console_displayhook(obj):
|
2009-11-15 17:45:45 +00:00
|
|
|
global console_output
|
2009-11-07 12:04:42 +00:00
|
|
|
console_output = obj
|
|
|
|
|
|
|
|
class QgisOutputCatcher:
|
|
|
|
def __init__(self):
|
|
|
|
self.data = ''
|
|
|
|
def write(self, stuff):
|
|
|
|
self.data += stuff
|
|
|
|
def get_and_clean_data(self):
|
|
|
|
tmp = self.data
|
|
|
|
self.data = ''
|
|
|
|
return tmp
|
2009-11-07 19:20:35 +00:00
|
|
|
def flush(self):
|
|
|
|
pass
|
|
|
|
|
2009-11-07 12:04:42 +00:00
|
|
|
|
|
|
|
def installConsoleHooks():
|
|
|
|
sys.displayhook = console_displayhook
|
|
|
|
sys.stdout = QgisOutputCatcher()
|
|
|
|
|
|
|
|
def uninstallConsoleHooks():
|
|
|
|
sys.displayhook = sys.__displayhook__
|
|
|
|
sys.stdout = old_stdout
|
|
|
|
|
|
|
|
|
|
|
|
#######################
|
|
|
|
# PLUGINS
|
|
|
|
|
|
|
|
# dictionary of plugins
|
|
|
|
plugins = {}
|
|
|
|
|
|
|
|
def pluginMetadata(packageName, fct):
|
|
|
|
""" fetch metadata from a plugin """
|
|
|
|
try:
|
|
|
|
package = sys.modules[packageName]
|
|
|
|
return getattr(package, fct)()
|
|
|
|
except:
|
|
|
|
return "__error__"
|
|
|
|
|
|
|
|
def loadPlugin(packageName):
|
|
|
|
""" load plugin's package and ensure that plugin is reloaded when changed """
|
|
|
|
|
|
|
|
try:
|
|
|
|
__import__(packageName)
|
|
|
|
return True
|
|
|
|
except:
|
|
|
|
pass # continue...
|
|
|
|
|
|
|
|
# snake in the grass, we know it's there
|
|
|
|
sys.path_importer_cache.clear()
|
|
|
|
|
|
|
|
# retry
|
|
|
|
try:
|
|
|
|
__import__(packageName)
|
|
|
|
reload(packageName)
|
|
|
|
return True
|
|
|
|
except:
|
|
|
|
msgTemplate = QCoreApplication.translate("Python", "Couldn't load plugin '%1' from ['%2']")
|
|
|
|
msg = msgTemplate.arg(packageName).arg("', '".join(sys.path))
|
|
|
|
showException(sys.exc_type, sys.exc_value, sys.exc_traceback, msg)
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
def startPlugin(packageName):
|
|
|
|
""" initialize the plugin """
|
|
|
|
global plugins, iface
|
|
|
|
|
|
|
|
package = sys.modules[packageName]
|
|
|
|
|
|
|
|
errMsg = QCoreApplication.translate("Python", "Couldn't load plugin %1" ).arg(packageName)
|
|
|
|
|
|
|
|
# create an instance of the plugin
|
|
|
|
try:
|
|
|
|
plugins[packageName] = package.classFactory(iface)
|
|
|
|
except:
|
|
|
|
msg = QCoreApplication.translate("Python", "%1 due an error when calling its classFactory() method").arg(errMsg)
|
|
|
|
showException(sys.exc_type, sys.exc_value, sys.exc_traceback, msg)
|
|
|
|
return False
|
|
|
|
|
|
|
|
# initGui
|
|
|
|
try:
|
|
|
|
plugins[packageName].initGui()
|
|
|
|
except:
|
|
|
|
msg = QCoreApplication.translate("Python", "%1 due an error when calling its initGui() method" ).arg( errMsg )
|
|
|
|
showException(sys.exc_type, sys.exc_value, sys.exc_traceback, msg)
|
|
|
|
return False
|
|
|
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
|
|
def unloadPlugin(packageName):
|
|
|
|
""" unload and delete plugin! """
|
|
|
|
global plugins
|
2009-12-16 00:37:01 +00:00
|
|
|
|
|
|
|
if not plugins.has_key(packageName): return False
|
2009-11-07 12:04:42 +00:00
|
|
|
|
|
|
|
try:
|
|
|
|
plugins[packageName].unload()
|
|
|
|
del plugins[packageName]
|
|
|
|
return True
|
|
|
|
except Exception, e:
|
2009-12-15 17:47:00 +00:00
|
|
|
msg = QCoreApplication.translate("Python", "Error while unloading plugin %1").arg(packageName)
|
2009-11-07 12:04:42 +00:00
|
|
|
showException(sys.exc_type, sys.exc_value, sys.exc_traceback, msg)
|
|
|
|
return False
|