2023-07-26 20:53:08 +08:00

76 lines
2.5 KiB
Python

import logging
import shutil
from rscder.utils.setting import Settings
from PyQt5.QtWidgets import QMessageBox
from PyQt5.QtCore import QObject, pyqtSignal
from rscder.plugins.basic import BasicPlugin
import importlib
import os
import sys
import inspect
from rscder.plugins.about import AboutPlugin
from rscder.plugins.change_rate import RateSetPlugin
from rscder.plugins.evaluation import EvaluationPlugin
from rscder.plugins.export_to import ExportPlugin
from rscder.plugins.filter_collection import MainPlugin as FilterPlugin
from rscder.plugins.follow import FollowPlugin
from rscder.plugins.unsupervised_method import UnsupervisedPlugin
from rscder.plugins.veg_method import VegtationPlugin
PLUGINS = [
AboutPlugin, RateSetPlugin, EvaluationPlugin, ExportPlugin, FilterPlugin, FollowPlugin, UnsupervisedPlugin, VegtationPlugin
]
class PluginLoader(QObject):
plugin_loaded = pyqtSignal()
def __init__(self, ctx):
super().__init__()
self.ctx = ctx
self.plugins = dict()
@staticmethod
def copy_plugin_to_3rd(dir, random_suffix=True):
if not os.path.exists(Settings.Plugin().root):
os.makedirs(Settings.Plugin().root)
return shutil.copytree(dir,
os.path.join(Settings.Plugin().root,
os.path.basename(dir)))
@staticmethod
def load_plugin_info(path):
sys.path.insert(0, os.path.join(path, '..'))
info = None
try:
module = importlib.import_module(os.path.basename(path))
mes = inspect.getmembers(module)
for name, obj in mes:
# logging
logging.info(f'{name}:{obj}')
if inspect.isclass(obj) and issubclass(obj, BasicPlugin):
info = obj.info()
break
except Exception as e:
logging.info(str(e))
QMessageBox.critical(None, 'Error', f'{path} load error: {e}')
finally:
sys.path.pop(0)
return info
def load_plugin(self):
for plugin in PLUGINS:
try:
self.plugins[plugin.__name__] = plugin(self.ctx)
except Exception as e:
# import traceback
# traceback.print_exc()
self.ctx['message_box'].error(f'{plugin["name"]} load error: {e}')
self.plugin_loaded.emit()