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()