diff --git a/bin/meshroom_batch b/bin/meshroom_batch index 6bee4c1f..d08d40ea 100755 --- a/bin/meshroom_batch +++ b/bin/meshroom_batch @@ -146,6 +146,7 @@ if not args.input and not args.inputRecursive: print('Nothing to compute. You need to set --input or --inputRecursive.') sys.exit(1) +meshroom.core.initPlugins() meshroom.core.initNodes() graph = meshroom.core.graph.Graph(name=args.pipeline) diff --git a/bin/meshroom_compute b/bin/meshroom_compute index 59d8b647..8d15e7e5 100755 --- a/bin/meshroom_compute +++ b/bin/meshroom_compute @@ -61,6 +61,7 @@ if args.extern: else: logging.getLogger().setLevel(meshroom.logStringToPython[args.verbose]) +meshroom.core.initPlugins() meshroom.core.initNodes() graph = meshroom.core.graph.loadGraph(args.graphFile) diff --git a/bin/meshroom_submit b/bin/meshroom_submit index 404a87f9..34812e3d 100755 --- a/bin/meshroom_submit +++ b/bin/meshroom_submit @@ -22,6 +22,7 @@ parser.add_argument("--submitLabel", args = parser.parse_args() +meshroom.core.initPlugins() meshroom.core.initNodes() meshroom.core.initSubmitters() diff --git a/meshroom/core/__init__.py b/meshroom/core/__init__.py index 06cbeacd..fe9ec170 100644 --- a/meshroom/core/__init__.py +++ b/meshroom/core/__init__.py @@ -4,6 +4,7 @@ import importlib import inspect import logging import os +from pathlib import Path import pkgutil import sys import tempfile @@ -343,6 +344,35 @@ def loadAllNodes(folder): logging.debug(f'Nodes loaded [{package}]: {nodesStr}') +def loadPluginFolder(folder): + if not os.path.isdir(folder): + logging.info(f"Plugin folder '{folder}' does not exist.") + return + + mrFolder = Path(folder, 'meshroom') + if not mrFolder.exists(): + logging.info(f"Plugin folder '{folder}' does not contain a 'meshroom' folder.") + return + + binFolders = [Path(folder, 'bin')] + libFolders = [Path(folder, 'lib'), Path(folder, 'lib64')] + pythonPathFolders = [Path(folder)] + binFolders + + loadAllNodes(folder=mrFolder) + loadPipelineTemplates(folder=mrFolder) + + +def loadPluginsFolder(folder): + if not os.path.isdir(folder): + logging.debug(f"PluginSet folder '{folder}' does not exist.") + return + + for file in os.listdir(folder): + if os.path.isdir(file): + subFolder = os.path.join(folder, file) + loadPluginFolder(subFolder) + + def registerSubmitter(s): global submitters if s.name in submitters: @@ -392,3 +422,9 @@ def initPipelines(): for f in pipelineTemplatesFolders: loadPipelineTemplates(f) + +def initPlugins(): + additionalpluginsPath = EnvVar.getList(EnvVar.MESHROOM_PLUGINS_PATH) + nodesFolders = [os.path.join(meshroomFolder, 'plugins')] + additionalpluginsPath + for f in nodesFolders: + loadPluginFolder(folder=f) diff --git a/meshroom/env.py b/meshroom/env.py index 6e94e5f8..46ce30e9 100644 --- a/meshroom/env.py +++ b/meshroom/env.py @@ -42,10 +42,10 @@ class EnvVar(Enum): ) # Core - MESHROOM_PLUGINS_PATH = VarDefinition(str, "", "Paths to plugins folders") + MESHROOM_PLUGINS_PATH = VarDefinition(str, "", "Paths to plugins folders containing nodes, submitters and pipeline templates") MESHROOM_NODES_PATH = VarDefinition(str, "", "Paths to set of nodes folders") MESHROOM_SUBMITTERS_PATH = VarDefinition(str, "", "Paths to set of submitters folders") - MESHROOM_PIPELINE_TEMPLATES_PATH = VarDefinition(str, "", "Paths to pipeline templates folders") + MESHROOM_PIPELINE_TEMPLATES_PATH = VarDefinition(str, "", "Paths to et of pipeline templates folders") @staticmethod def get(envVar: "EnvVar") -> Any: diff --git a/meshroom/ui/app.py b/meshroom/ui/app.py index 9d51f0f0..11f921b4 100644 --- a/meshroom/ui/app.py +++ b/meshroom/ui/app.py @@ -232,6 +232,7 @@ class MeshroomApp(QApplication): # - clean cache directory and make sure it exists on disk ThumbnailCache.initialize() + meshroom.core.initPlugins() meshroom.core.initNodes() meshroom.core.initSubmitters()