Skip to content

Commit

Permalink
Merge branch 'develop' into feature/OP-2053_Add-validator-to-check-co…
Browse files Browse the repository at this point in the history
…rrect-version-of-extension-for-PS-and-AE
  • Loading branch information
kalisp authored Dec 14, 2021
2 parents 61bf279 + ca7a92b commit b97d79d
Show file tree
Hide file tree
Showing 11 changed files with 84 additions and 28 deletions.
5 changes: 4 additions & 1 deletion Dockerfile.centos7
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ RUN yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.n
ncurses \
ncurses-devel \
qt5-qtbase-devel \
xcb-util-wm \
xcb-util-renderutil \
&& yum clean all

# we need to build our own patchelf
Expand Down Expand Up @@ -92,7 +94,8 @@ RUN source $HOME/.bashrc \
RUN cp /usr/lib64/libffi* ./build/exe.linux-x86_64-3.7/lib \
&& cp /usr/lib64/libssl* ./build/exe.linux-x86_64-3.7/lib \
&& cp /usr/lib64/libcrypto* ./build/exe.linux-x86_64-3.7/lib \
&& cp /root/.pyenv/versions/${OPENPYPE_PYTHON_VERSION}/lib/libpython* ./build/exe.linux-x86_64-3.7/lib
&& cp /root/.pyenv/versions/${OPENPYPE_PYTHON_VERSION}/lib/libpython* ./build/exe.linux-x86_64-3.7/lib \
&& cp /usr/lib64/libxcb* ./build/exe.linux-x86_64-3.7/vendor/python/PySide2/Qt/lib

RUN cd /opt/openpype \
rm -rf ./vendor/bin
54 changes: 36 additions & 18 deletions openpype/hosts/maya/plugins/load/load_image_plane.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,14 @@ def __init__(self, cameras):
self.setWindowFlags(self.windowFlags() | QtCore.Qt.FramelessWindowHint)

self.camera = None
self.static_image_plane = False
self.show_in_all_views = False

self.widgets = {
"label": QtWidgets.QLabel("Select camera for image plane."),
"list": QtWidgets.QListWidget(),
"staticImagePlane": QtWidgets.QCheckBox(),
"showInAllViews": QtWidgets.QCheckBox(),
"warning": QtWidgets.QLabel("No cameras selected!"),
"buttons": QtWidgets.QWidget(),
"okButton": QtWidgets.QPushButton("Ok"),
Expand All @@ -31,6 +35,9 @@ def __init__(self, cameras):
for camera in cameras:
self.widgets["list"].addItem(camera)

self.widgets["staticImagePlane"].setText("Make Image Plane Static")
self.widgets["showInAllViews"].setText("Show Image Plane in All Views")

# Build buttons.
layout = QtWidgets.QHBoxLayout(self.widgets["buttons"])
layout.addWidget(self.widgets["okButton"])
Expand All @@ -40,6 +47,8 @@ def __init__(self, cameras):
layout = QtWidgets.QVBoxLayout(self)
layout.addWidget(self.widgets["label"])
layout.addWidget(self.widgets["list"])
layout.addWidget(self.widgets["staticImagePlane"])
layout.addWidget(self.widgets["showInAllViews"])
layout.addWidget(self.widgets["buttons"])
layout.addWidget(self.widgets["warning"])

Expand All @@ -54,6 +63,8 @@ def on_ok_pressed(self):
if self.camera is None:
self.widgets["warning"].setVisible(True)
return
self.show_in_all_views = self.widgets["showInAllViews"].isChecked()
self.static_image_plane = self.widgets["staticImagePlane"].isChecked()

self.close()

Expand All @@ -65,15 +76,15 @@ def on_cancel_pressed(self):
class ImagePlaneLoader(api.Loader):
"""Specific loader of plate for image planes on selected camera."""

families = ["plate", "render"]
families = ["image", "plate", "render"]
label = "Load imagePlane."
representations = ["mov", "exr", "preview", "png"]
icon = "image"
color = "orange"

def load(self, context, name, namespace, data):
def load(self, context, name, namespace, data, options=None):
import pymel.core as pm

new_nodes = []
image_plane_depth = 1000
asset = context['asset']['name']
Expand All @@ -85,17 +96,23 @@ def load(self, context, name, namespace, data):

# Get camera from user selection.
camera = None
default_cameras = [
"frontShape", "perspShape", "sideShape", "topShape"
]
cameras = [
x for x in pm.ls(type="camera") if x.name() not in default_cameras
]
camera_names = {x.getParent().name(): x for x in cameras}
camera_names["Create new camera."] = "create_camera"
window = CameraWindow(camera_names.keys())
window.exec_()
camera = camera_names[window.camera]
is_static_image_plane = None
is_in_all_views = None
if data:
camera = pm.PyNode(data.get("camera"))
is_static_image_plane = data.get("static_image_plane")
is_in_all_views = data.get("in_all_views")

if not camera:
cameras = pm.ls(type="camera")
camera_names = {x.getParent().name(): x for x in cameras}
camera_names["Create new camera."] = "create_camera"
window = CameraWindow(camera_names.keys())
window.exec_()
camera = camera_names[window.camera]

is_static_image_plane = window.static_image_plane
is_in_all_views = window.show_in_all_views

if camera == "create_camera":
camera = pm.createNode("camera")
Expand All @@ -111,13 +128,14 @@ def load(self, context, name, namespace, data):

# Create image plane
image_plane_transform, image_plane_shape = pm.imagePlane(
camera=camera, showInAllViews=False
fileName=context["representation"]["data"]["path"],
camera=camera, showInAllViews=is_in_all_views
)
image_plane_shape.depth.set(image_plane_depth)

image_plane_shape.imageName.set(
context["representation"]["data"]["path"]
)
if is_static_image_plane:
image_plane_shape.detach()
image_plane_transform.setRotation(camera.getRotation())

start_frame = pm.playbackOptions(q=True, min=True)
end_frame = pm.playbackOptions(q=True, max=True)
Expand Down
2 changes: 2 additions & 0 deletions openpype/hosts/maya/plugins/publish/collect_look.py
Original file line number Diff line number Diff line change
Expand Up @@ -492,6 +492,8 @@ def collect_attributes_changed(self, instance):
if not cmds.attributeQuery(attr, node=node, exists=True):
continue
attribute = "{}.{}".format(node, attr)
if cmds.getAttr(attribute, type=True) == "message":
continue
node_attributes[attr] = cmds.getAttr(attribute)

attributes.append({"name": node,
Expand Down
9 changes: 7 additions & 2 deletions openpype/hosts/maya/plugins/publish/collect_render.py
Original file line number Diff line number Diff line change
Expand Up @@ -224,14 +224,19 @@ def process(self, context):
# append full path
full_exp_files = []
aov_dict = {}

default_render_file = context.data.get('project_settings')\
.get('maya')\
.get('create')\
.get('CreateRender')\
.get('default_render_image_folder')
# replace relative paths with absolute. Render products are
# returned as list of dictionaries.
publish_meta_path = None
for aov in exp_files:
full_paths = []
for file in aov[aov.keys()[0]]:
full_path = os.path.join(workspace, "renders", file)
full_path = os.path.join(workspace, default_render_file,
file)
full_path = full_path.replace("\\", "/")
full_paths.append(full_path)
publish_meta_path = os.path.dirname(full_path)
Expand Down
19 changes: 16 additions & 3 deletions openpype/hosts/maya/plugins/publish/validate_render_image_rule.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,24 @@ class ValidateRenderImageRule(pyblish.api.InstancePlugin):

def process(self, instance):

assert get_file_rule("images") == "renders", (
"Workspace's `images` file rule must be set to: renders"
default_render_file = self.get_default_render_image_folder(instance)

assert get_file_rule("images") == default_render_file, (
"Workspace's `images` file rule must be set to: {}".format(
default_render_file
)
)

@classmethod
def repair(cls, instance):
pm.workspace.fileRules["images"] = "renders"
default = cls.get_default_render_image_folder(instance)
pm.workspace.fileRules["images"] = default
pm.system.Workspace.save()

@staticmethod
def get_default_render_image_folder(instance):
return instance.context.data.get('project_settings')\
.get('maya') \
.get('create') \
.get('CreateRender') \
.get('default_render_image_folder')
Original file line number Diff line number Diff line change
Expand Up @@ -394,9 +394,14 @@ def process(self, instance):
self.log.debug(filepath)

# Gather needed data ------------------------------------------------
default_render_file = instance.context.data.get('project_settings')\
.get('maya')\
.get('create')\
.get('CreateRender')\
.get('default_render_image_folder')
filename = os.path.basename(filepath)
comment = context.data.get("comment", "")
dirname = os.path.join(workspace, "renders")
dirname = os.path.join(workspace, default_render_file)
renderlayer = instance.data['setMembers'] # rs_beauty
deadline_user = context.data.get("user", getpass.getuser())
jobname = "%s - %s" % (filename, instance.name)
Expand Down
3 changes: 2 additions & 1 deletion openpype/settings/defaults/project_settings/maya.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@
"defaults": [
"Main"
],
"aov_separator": "underscore"
"aov_separator": "underscore",
"default_render_image_folder": "renders"
},
"CreateAnimation": {
"enabled": true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,11 @@
{"underscore": "_ (underscore)"},
{"dot": ". (dot)"}
]
},
{
"type": "text",
"key": "default_render_image_folder",
"label": "Default render image folder"
}
]
},
Expand Down
2 changes: 1 addition & 1 deletion repos/avalon-core
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ def startup_scripts(self, monkeypatch_session, download_test_data):
def test_db_asserts(self, dbcon, publish_finished):
"""Host and input data dependent expected results in DB."""
print("test_db_asserts")

assert 2 == dbcon.count_documents({"type": "version"}), \
"Not expected no of versions"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,10 @@ class TestPublishInPhotoshop(PhotoshopTestClass):
Always pulls and uses test data from GDrive!
Opens Photoshop, runs publish on prepared workile.
Test zip file sets 3 required env vars:
- HEADLESS_PUBLISH - this triggers publish immediately app is open
- IS_TEST - this differentiate between regular webpublish
- PYBLISH_TARGETS
Then checks content of DB (if subset, version, representations were
created.
Expand Down

0 comments on commit b97d79d

Please sign in to comment.