New plugins load

MESHROOM_PLUGINS_PATH can be used to automatically load nodes and
pipelines from a folder structure.
This commit is contained in:
Fabien Castan 2025-04-12 19:38:58 +02:00
parent 92555f6ab3
commit db8fd02aeb
6 changed files with 42 additions and 2 deletions

View file

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

View file

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

View file

@ -22,6 +22,7 @@ parser.add_argument("--submitLabel",
args = parser.parse_args()
meshroom.core.initPlugins()
meshroom.core.initNodes()
meshroom.core.initSubmitters()

View file

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

View file

@ -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:

View file

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