Skip to content

Commit c0532e0

Browse files
authored
Merge pull request #2881 from alicevision/dev/core_add_file_utils
Perform path resolution function in Meshroom core
2 parents 480e498 + cc4efe9 commit c0532e0

File tree

2 files changed

+68
-19
lines changed

2 files changed

+68
-19
lines changed

meshroom/core/fileUtils.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import os
2+
import re
3+
4+
pattern = r"(?P<FILESTEM_PREFIX>.*?)(?P<FRAMEID_STR>[-._]\d+)?(?P<EXTENSION>\.\w{3,4})"
5+
compiled_pattern = re.compile(pattern)
6+
compiled_frameId = re.compile(r"(\D+)?(?P<FRAMEID>\d+$)")
7+
8+
def getFileElements(inputFilePath: str):
9+
10+
filename = os.path.basename(inputFilePath)
11+
match = compiled_pattern.search(filename)
12+
frameId_str = match.group("FRAMEID_STR")
13+
14+
fileElements = {}
15+
if match:
16+
fileElements = {
17+
"<PATH>": inputFilePath,
18+
"<FILENAME>": filename,
19+
"<FILESTEM>": match.group("FILESTEM_PREFIX"),
20+
"<FILESTEM_PREFIX>": match.group("FILESTEM_PREFIX"),
21+
"<EXTENSION>": match.group("EXTENSION"),
22+
}
23+
if frameId_str is not None:
24+
fileElements["<FRAMEID_STR>"] = frameId_str
25+
fileElements["<FILESTEM>"] += frameId_str
26+
match_frameId = compiled_frameId.search(frameId_str)
27+
fileElements["<FRAMEID>"] = match_frameId.group("FRAMEID")
28+
29+
return fileElements
30+
31+
32+
def getViewElements(vp):
33+
34+
vpPath = vp.childAttribute("path").value
35+
36+
viewElements = getFileElements(vpPath)
37+
38+
viewElements["<VIEW_ID>"] = str(vp.childAttribute("viewId").value)
39+
viewElements["<INTRINSIC_ID>"] = str(vp.childAttribute("intrinsicId").value)
40+
viewElements["<POSE_ID>"] = str(vp.childAttribute("poseId").value)
41+
42+
return viewElements
43+
44+
45+
def replacePatterns(input, pattern, replacements):
46+
# Use all substrings of "input" matching the regex "pattern" as a key to substitute themselves by their value in the dictionary "replacements".
47+
# If "replacements" does not contain the key, the key is removed from "input" to build the resolved string.
48+
def replaceMatch(match):
49+
key = match.group()
50+
return replacements.get(key, "")
51+
return pattern.sub(replaceMatch, input)
52+
53+
54+
compiled_element = re.compile(r"<\w*>")
55+
56+
def resolvePath(input, outputTemplate: str) -> str:
57+
58+
if isinstance(input, str):
59+
replacements = getFileElements(input)
60+
else:
61+
replacements = getViewElements(input)
62+
63+
resolved = replacePatterns(outputTemplate, compiled_element, replacements)
64+
65+
return resolved
66+

meshroom/ui/components/filepath.py

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -111,34 +111,17 @@ def fileSizeMB(self, path):
111111
@Slot(str, QObject, result=str)
112112
def resolve(self, path, vp):
113113
# Resolve dynamic path that depends on viewpoint
114+
from meshroom.core import fileUtils
114115

115-
replacements = {}
116116
if vp == None:
117117
replacements = FilepathHelper.getFilenamesFromFolder(FilepathHelper, FilepathHelper.dirname(FilepathHelper, path), FilepathHelper.extension(FilepathHelper, path))
118118
resolved = [path for i in range(len(replacements))]
119119
for key in replacements:
120120
for i in range(len(resolved)):
121121
resolved[i] = resolved[i].replace("<FRAMEID>", replacements[i])
122122
return resolved
123-
else:
124123

125-
vpPath = vp.childAttribute("path").value
126-
filename = FilepathHelper.basename(FilepathHelper, vpPath)
127-
replacements = {
128-
"<VIEW_ID>": str(vp.childAttribute("viewId").value),
129-
"<INTRINSIC_ID>": str(vp.childAttribute("intrinsicId").value),
130-
"<POSE_ID>": str(vp.childAttribute("poseId").value),
131-
"<PATH>": vpPath,
132-
"<FILENAME>": filename,
133-
"<FILESTEM>": FilepathHelper.removeExtension(FilepathHelper, filename),
134-
"<EXTENSION>": FilepathHelper.extension(FilepathHelper, filename),
135-
}
136-
137-
resolved = path
138-
for key in replacements:
139-
resolved = resolved.replace(key, replacements[key])
140-
141-
return resolved
124+
return fileUtils.resolvePath(vp, path)
142125

143126
@Slot(str, result="QVariantList")
144127
@Slot(str, str, result="QVariantList")

0 commit comments

Comments
 (0)