76 lines
2.5 KiB
Python
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
|
|
from .ai_method import AIPlugin
|
|
PLUGINS = [
|
|
AboutPlugin, RateSetPlugin, EvaluationPlugin, ExportPlugin, FilterPlugin, FollowPlugin, UnsupervisedPlugin, VegtationPlugin, AIPlugin
|
|
]
|
|
|
|
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() |