Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions meshroom/core/fileUtils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import os
import re

pattern = r"(?P<FILESTEM_PREFIX>.*?)(?P<FRAMEID_STR>[-._]\d+)?(?P<EXTENSION>\.\w{3,4})"
compiled_pattern = re.compile(pattern)
compiled_frameId = re.compile(r"(\D+)?(?P<FRAMEID>\d+$)")

def getFileElements(inputFilePath: str):

filename = os.path.basename(inputFilePath)
match = compiled_pattern.search(filename)
frameId_str = match.group("FRAMEID_STR")

fileElements = {}
if match:
fileElements = {
"<PATH>": inputFilePath,
"<FILENAME>": filename,
"<FILESTEM>": match.group("FILESTEM_PREFIX"),
"<FILESTEM_PREFIX>": match.group("FILESTEM_PREFIX"),
"<EXTENSION>": match.group("EXTENSION"),
}
if frameId_str is not None:
fileElements["<FRAMEID_STR>"] = frameId_str
fileElements["<FILESTEM>"] += frameId_str
match_frameId = compiled_frameId.search(frameId_str)
fileElements["<FRAMEID>"] = match_frameId.group("FRAMEID")

return fileElements


def getViewElements(vp):

vpPath = vp.childAttribute("path").value

viewElements = getFileElements(vpPath)

viewElements["<VIEW_ID>"] = str(vp.childAttribute("viewId").value)
viewElements["<INTRINSIC_ID>"] = str(vp.childAttribute("intrinsicId").value)
viewElements["<POSE_ID>"] = str(vp.childAttribute("poseId").value)

return viewElements


def replacePatterns(input, pattern, replacements):
# Use all substrings of "input" matching the regex "pattern" as a key to substitute themselves by their value in the dictionary "replacements".
# If "replacements" does not contain the key, the key is removed from "input" to build the resolved string.
def replaceMatch(match):
key = match.group()
return replacements.get(key, "")
return pattern.sub(replaceMatch, input)


compiled_element = re.compile(r"<\w*>")

def resolvePath(input, outputTemplate: str) -> str:

if isinstance(input, str):
replacements = getFileElements(input)
else:
replacements = getViewElements(input)

resolved = replacePatterns(outputTemplate, compiled_element, replacements)

return resolved

21 changes: 2 additions & 19 deletions meshroom/ui/components/filepath.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,34 +111,17 @@ def fileSizeMB(self, path):
@Slot(str, QObject, result=str)
def resolve(self, path, vp):
# Resolve dynamic path that depends on viewpoint
from meshroom.core import fileUtils

replacements = {}
if vp == None:
replacements = FilepathHelper.getFilenamesFromFolder(FilepathHelper, FilepathHelper.dirname(FilepathHelper, path), FilepathHelper.extension(FilepathHelper, path))
resolved = [path for i in range(len(replacements))]
for key in replacements:
for i in range(len(resolved)):
resolved[i] = resolved[i].replace("<FRAMEID>", replacements[i])
return resolved
else:

vpPath = vp.childAttribute("path").value
filename = FilepathHelper.basename(FilepathHelper, vpPath)
replacements = {
"<VIEW_ID>": str(vp.childAttribute("viewId").value),
"<INTRINSIC_ID>": str(vp.childAttribute("intrinsicId").value),
"<POSE_ID>": str(vp.childAttribute("poseId").value),
"<PATH>": vpPath,
"<FILENAME>": filename,
"<FILESTEM>": FilepathHelper.removeExtension(FilepathHelper, filename),
"<EXTENSION>": FilepathHelper.extension(FilepathHelper, filename),
}

resolved = path
for key in replacements:
resolved = resolved.replace(key, replacements[key])

return resolved
return fileUtils.resolvePath(vp, path)

@Slot(str, result="QVariantList")
@Slot(str, str, result="QVariantList")
Expand Down
Loading