Bases: InstancePlugin, OptionalPyblishPluginMixin
Extract Skeleton Pinning JSON file.
Extracted JSON file doesn't contain any data, it's just a placeholder that is filled by Integrator plugin (Integrate Pinning File).
Source code in client/ayon_usd/plugins/publish/extract_skeleton_pinning_json.py
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85 | class ExtractSkeletonPinningJSON(pyblish.api.InstancePlugin,
OptionalPyblishPluginMixin):
"""Extract Skeleton Pinning JSON file.
Extracted JSON file doesn't contain any data, it's just a placeholder
that is filled by Integrator plugin (Integrate Pinning File).
"""
label = "Extract Skeleton Pinning JSON"
order = pyblish.api.ExtractorOrder + 0.49
families: ClassVar = ["usd", "usdrender"]
settings_category: ClassVar = "usd"
@staticmethod
def _has_usd_representation(representations: list) -> bool:
return any(
representation.get("name") == "usd"
for representation in representations
)
def process(self, instance: pyblish.api.Instance) -> None:
"""Process the plugin."""
if not self.is_active(instance.data):
return
# we need to handle usdrender differently as usd for rendering will
# be produced much later on the farm.
if "usdrender" not in instance.data.get("families", []):
if not self._has_usd_representation(instance.data["representations"]):
self.log.info("No USD representation found, skipping.")
return
try:
staging_dir = Path(instance.data["stagingDir"])
except KeyError:
self.log.debug("No staging directory on instance found.")
try:
staging_dir = Path(instance.data["ifdFile"]).parent
except KeyError as e:
self.log.error("No staging directory found.")
raise KnownPublishError("Cannot determine staging directory.") from e
pin_file = f"{staging_dir.stem}_pin.json"
pin_file_path = staging_dir.joinpath(pin_file)
pin_representation = {
"name": "usd_pinning",
"ext": "json",
"files": pin_file_path.name,
"stagingDir": staging_dir.as_posix(),
}
current_timestamp = datetime.now().timestamp()
skeleton_pinning_data = {
"timestamp": current_timestamp,
}
Path.mkdir(staging_dir, parents=True, exist_ok=True)
with open(pin_file_path, "w") as f:
json.dump(skeleton_pinning_data, f, indent=4)
instance.data["representations"].append(pin_representation)
|
Process the plugin.
Source code in client/ayon_usd/plugins/publish/extract_skeleton_pinning_json.py
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85 | def process(self, instance: pyblish.api.Instance) -> None:
"""Process the plugin."""
if not self.is_active(instance.data):
return
# we need to handle usdrender differently as usd for rendering will
# be produced much later on the farm.
if "usdrender" not in instance.data.get("families", []):
if not self._has_usd_representation(instance.data["representations"]):
self.log.info("No USD representation found, skipping.")
return
try:
staging_dir = Path(instance.data["stagingDir"])
except KeyError:
self.log.debug("No staging directory on instance found.")
try:
staging_dir = Path(instance.data["ifdFile"]).parent
except KeyError as e:
self.log.error("No staging directory found.")
raise KnownPublishError("Cannot determine staging directory.") from e
pin_file = f"{staging_dir.stem}_pin.json"
pin_file_path = staging_dir.joinpath(pin_file)
pin_representation = {
"name": "usd_pinning",
"ext": "json",
"files": pin_file_path.name,
"stagingDir": staging_dir.as_posix(),
}
current_timestamp = datetime.now().timestamp()
skeleton_pinning_data = {
"timestamp": current_timestamp,
}
Path.mkdir(staging_dir, parents=True, exist_ok=True)
with open(pin_file_path, "w") as f:
json.dump(skeleton_pinning_data, f, indent=4)
instance.data["representations"].append(pin_representation)
|