🐛 fix publishing of alembics

This commit is contained in:
Ondrej Samohel 2022-12-06 23:45:51 +01:00
parent 8b71066d9c
commit 1c985ca001
No known key found for this signature in database
GPG key ID: 02376E18990A97C6
8 changed files with 272 additions and 25 deletions

View file

@ -1,7 +1,13 @@
# -*- coding: utf-8 -*-
"""Library of functions useful for 3dsmax pipeline."""
import json
import six
from pymxs import runtime as rt
from typing import Union
import contextlib
JSON_PREFIX = "JSON::"
def imprint(node_name: str, data: dict) -> bool:
@ -10,7 +16,10 @@ def imprint(node_name: str, data: dict) -> bool:
return False
for k, v in data.items():
rt.setUserProp(node, k, v)
if isinstance(v, (dict, list)):
rt.setUserProp(node, k, f'{JSON_PREFIX}{json.dumps(v)}')
else:
rt.setUserProp(node, k, v)
return True
@ -39,10 +48,13 @@ def lsattr(
nodes = []
output_node(root, nodes)
if not value:
return [n for n in nodes if rt.getUserProp(n, attr)]
return [n for n in nodes if rt.getUserProp(n, attr) == value]
return [
n for n in nodes
if rt.getUserProp(n, attr) == value
] if value else [
n for n in nodes
if rt.getUserProp(n, attr)
]
def read(container) -> dict:
@ -53,12 +65,58 @@ def read(container) -> dict:
return data
for line in props.split("\r\n"):
key, value = line.split("=")
# if the line cannot be split we can't really parse it
if not key:
try:
key, value = line.split("=")
except ValueError:
# if the line cannot be split we can't really parse it
continue
data[key.strip()] = value.strip()
data["instance_node"] = container
value = value.strip()
if isinstance(value.strip(), six.string_types) and \
value.startswith(JSON_PREFIX):
try:
value = json.loads(value[len(JSON_PREFIX):])
except json.JSONDecodeError:
# not a json
pass
data[key.strip()] = value
data["instance_node"] = container.name
return data
@contextlib.contextmanager
def maintained_selection():
previous_selection = rt.getCurrentSelection()
try:
yield
finally:
if previous_selection:
rt.select(previous_selection)
else:
rt.select()
def get_all_children(parent, node_type=None):
"""Handy function to get all the children of a given node
Args:
parent (3dsmax Node1): Node to get all children of.
node_type (None, runtime.class): give class to check for
e.g. rt.FFDBox/rt.GeometryClass etc.
Returns:
list: list of all children of the parent node
"""
def list_children(node):
children = []
for c in node.Children:
children.append(c)
children = children + list_children(c)
return children
child_list = list_children(parent)
return ([x for x in child_list if rt.superClassOf(x) == node_type]
if node_type else child_list)