Merge pull request #536 from ynput/chore/AY-4916_Move-Houdini-client-code-settings-category

Houdini: move houdini client code - Add Settings Category
This commit is contained in:
Mustafa Taher 2024-05-31 18:13:18 +03:00 committed by GitHub
commit 3658ecaf0c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
94 changed files with 416 additions and 380 deletions

View file

@ -7,6 +7,7 @@ from abc import (
import six import six
import hou import hou
import pyblish.api
from ayon_core.pipeline import ( from ayon_core.pipeline import (
CreatorError, CreatorError,
LegacyCreator, LegacyCreator,
@ -14,11 +15,17 @@ from ayon_core.pipeline import (
CreatedInstance, CreatedInstance,
AYON_INSTANCE_ID, AYON_INSTANCE_ID,
AVALON_INSTANCE_ID, AVALON_INSTANCE_ID,
load,
publish
) )
from ayon_core.lib import BoolDef from ayon_core.lib import BoolDef
from .lib import imprint, read, lsattr, add_self_publish_button from .lib import imprint, read, lsattr, add_self_publish_button
SETTINGS_CATEGORY = "houdini"
class Creator(LegacyCreator): class Creator(LegacyCreator):
"""Creator plugin to create instances in Houdini """Creator plugin to create instances in Houdini
@ -169,7 +176,7 @@ class HoudiniCreator(NewCreator, HoudiniCreatorBase):
settings_name = None settings_name = None
add_publish_button = False add_publish_button = False
settings_category = "houdini" settings_category = SETTINGS_CATEGORY
def create(self, product_name, instance_data, pre_create_data): def create(self, product_name, instance_data, pre_create_data):
try: try:
@ -349,3 +356,39 @@ class HoudiniCreator(NewCreator, HoudiniCreatorBase):
for key, value in settings.items(): for key, value in settings.items():
setattr(self, key, value) setattr(self, key, value)
class HoudiniLoader(load.LoaderPlugin):
"""Base class for Houdini load plugins."""
hosts = ["houdini"]
settings_category = SETTINGS_CATEGORY
class HoudiniInstancePlugin(pyblish.api.InstancePlugin):
"""Base class for Houdini instance publish plugins."""
hosts = ["houdini"]
settings_category = SETTINGS_CATEGORY
class HoudiniContextPlugin(pyblish.api.ContextPlugin):
"""Base class for Houdini context publish plugins."""
hosts = ["houdini"]
settings_category = SETTINGS_CATEGORY
class HoudiniExtractorPlugin(publish.Extractor):
"""Base class for Houdini extract plugins.
Note:
The `HoudiniExtractorPlugin` is a subclass of `publish.Extractor`,
which in turn is a subclass of `pyblish.api.InstancePlugin`.
Should there be a requirement to create an extractor that operates
as a context plugin, it would be beneficial to incorporate
the functionalities present in `publish.Extractor`.
"""
hosts = ["houdini"]
settings_category = SETTINGS_CATEGORY

View file

@ -2,10 +2,10 @@
""" """
from ayon_core.pipeline import load from ayon_houdini.api import plugin
class SetFrameRangeLoader(load.LoaderPlugin): class SetFrameRangeLoader(plugin.HoudiniLoader):
"""Set frame range excluding pre- and post-handles""" """Set frame range excluding pre- and post-handles"""
product_types = { product_types = {
@ -42,7 +42,7 @@ class SetFrameRangeLoader(load.LoaderPlugin):
hou.playbar.setPlaybackRange(start, end) hou.playbar.setPlaybackRange(start, end)
class SetFrameRangeWithHandlesLoader(load.LoaderPlugin): class SetFrameRangeWithHandlesLoader(plugin.HoudiniLoader):
"""Set frame range including pre- and post-handles""" """Set frame range including pre- and post-handles"""
product_types = { product_types = {

View file

@ -1,12 +1,12 @@
import os import os
from ayon_core.pipeline import ( from ayon_core.pipeline import get_representation_path
load, from ayon_houdini.api import (
get_representation_path, pipeline,
plugin
) )
from ayon_houdini.api import pipeline
class AbcLoader(load.LoaderPlugin): class AbcLoader(plugin.HoudiniLoader):
"""Load Alembic""" """Load Alembic"""
product_types = {"model", "animation", "pointcache", "gpuCache"} product_types = {"model", "animation", "pointcache", "gpuCache"}

View file

@ -1,13 +1,13 @@
import os import os
from ayon_core.pipeline import ( from ayon_core.pipeline import get_representation_path
load, from ayon_houdini.api import (
get_representation_path, pipeline,
plugin
) )
from ayon_houdini.api import pipeline
class AbcArchiveLoader(load.LoaderPlugin): class AbcArchiveLoader(plugin.HoudiniLoader):
"""Load Alembic as full geometry network hierarchy """ """Load Alembic as full geometry network hierarchy """
product_types = {"model", "animation", "pointcache", "gpuCache"} product_types = {"model", "animation", "pointcache", "gpuCache"}

View file

@ -1,14 +1,14 @@
import os import os
import re import re
from ayon_core.pipeline import ( from ayon_core.pipeline import get_representation_path
load, from ayon_houdini.api import (
get_representation_path, pipeline,
plugin
) )
from ayon_houdini.api import pipeline
class AssLoader(load.LoaderPlugin): class AssLoader(plugin.HoudiniLoader):
"""Load .ass with Arnold Procedural""" """Load .ass with Arnold Procedural"""
product_types = {"ass"} product_types = {"ass"}

View file

@ -2,14 +2,14 @@
import os import os
import re import re
from ayon_core.pipeline import ( from ayon_core.pipeline import get_representation_path
load, from ayon_houdini.api import (
get_representation_path, pipeline,
plugin
) )
from ayon_houdini.api import pipeline
class BgeoLoader(load.LoaderPlugin): class BgeoLoader(plugin.HoudiniLoader):
"""Load bgeo files to Houdini.""" """Load bgeo files to Houdini."""
label = "Load bgeo" label = "Load bgeo"

View file

@ -1,16 +1,15 @@
from ayon_core.pipeline import ( import hou
load, from ayon_core.pipeline import get_representation_path
get_representation_path,
)
from ayon_houdini.api import pipeline
from ayon_houdini.api import (
pipeline,
plugin
)
from ayon_houdini.api.lib import ( from ayon_houdini.api.lib import (
set_camera_resolution, set_camera_resolution,
get_camera_from_container get_camera_from_container
) )
import hou
ARCHIVE_EXPRESSION = ('__import__("_alembic_hom_extensions")' ARCHIVE_EXPRESSION = ('__import__("_alembic_hom_extensions")'
'.alembicGetCameraDict') '.alembicGetCameraDict')
@ -84,7 +83,7 @@ def transfer_non_default_values(src, dest, ignore=None):
dest_parm.setFromParm(parm) dest_parm.setFromParm(parm)
class CameraLoader(load.LoaderPlugin): class CameraLoader(plugin.HoudiniLoader):
"""Load camera from an Alembic file""" """Load camera from an Alembic file"""
product_types = {"camera"} product_types = {"camera"}

View file

@ -1,13 +1,13 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
"""Fbx Loader for houdini. """ """Fbx Loader for houdini. """
from ayon_core.pipeline import ( from ayon_core.pipeline import get_representation_path
load, from ayon_houdini.api import (
get_representation_path, pipeline,
plugin
) )
from ayon_houdini.api import pipeline
class FbxLoader(load.LoaderPlugin): class FbxLoader(plugin.HoudiniLoader):
"""Load fbx files. """ """Load fbx files. """
label = "Load FBX" label = "Load FBX"

View file

@ -1,13 +1,14 @@
import os import os
import re import re
from ayon_core.pipeline import load
from ayon_houdini.api import pipeline
import hou import hou
from ayon_houdini.api import (
pipeline,
plugin
)
class FilePathLoader(load.LoaderPlugin):
class FilePathLoader(plugin.HoudiniLoader):
"""Load a managed filepath to a null node. """Load a managed filepath to a null node.
This is useful if for a particular workflow there is no existing loader This is useful if for a particular workflow there is no existing loader

View file

@ -1,13 +1,13 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import os import os
from ayon_core.pipeline import ( from ayon_core.pipeline import get_representation_path
load, from ayon_houdini.api import (
get_representation_path, pipeline,
plugin
) )
from ayon_houdini.api import pipeline
class HdaLoader(load.LoaderPlugin): class HdaLoader(plugin.HoudiniLoader):
"""Load Houdini Digital Asset file.""" """Load Houdini Digital Asset file."""
product_types = {"hda"} product_types = {"hda"}

View file

@ -1,14 +1,16 @@
import os import os
import re import re
import hou
from ayon_core.pipeline import ( from ayon_core.pipeline import (
load,
get_representation_path, get_representation_path,
AVALON_CONTAINER_ID, AVALON_CONTAINER_ID,
) )
from ayon_houdini.api import lib, pipeline from ayon_houdini.api import (
pipeline,
import hou plugin,
lib
)
def get_image_avalon_container(): def get_image_avalon_container():
@ -42,7 +44,7 @@ def get_image_avalon_container():
return image_container return image_container
class ImageLoader(load.LoaderPlugin): class ImageLoader(plugin.HoudiniLoader):
"""Load images into COP2""" """Load images into COP2"""
product_types = { product_types = {

View file

@ -1,16 +1,17 @@
import os import os
import re import re
from ayon_core.pipeline import (
load,
get_representation_path,
)
from ayon_houdini.api import pipeline
from ayon_core.pipeline.load import LoadError
import hou import hou
from ayon_core.pipeline import get_representation_path
from ayon_core.pipeline.load import LoadError
class RedshiftProxyLoader(load.LoaderPlugin): from ayon_houdini.api import (
pipeline,
plugin
)
class RedshiftProxyLoader(plugin.HoudiniLoader):
"""Load Redshift Proxy""" """Load Redshift Proxy"""
product_types = {"redshiftproxy"} product_types = {"redshiftproxy"}

View file

@ -1,12 +1,14 @@
from ayon_core.pipeline import ( from ayon_core.pipeline import (
load,
get_representation_path, get_representation_path,
AVALON_CONTAINER_ID, AVALON_CONTAINER_ID,
) )
from ayon_houdini.api import lib from ayon_houdini.api import (
plugin,
lib
)
class USDSublayerLoader(load.LoaderPlugin): class USDSublayerLoader(plugin.HoudiniLoader):
"""Sublayer USD file in Solaris""" """Sublayer USD file in Solaris"""
product_types = { product_types = {

View file

@ -1,12 +1,14 @@
from ayon_core.pipeline import ( from ayon_core.pipeline import (
load,
get_representation_path, get_representation_path,
AVALON_CONTAINER_ID, AVALON_CONTAINER_ID,
) )
from ayon_houdini.api import lib from ayon_houdini.api import (
plugin,
lib
)
class USDReferenceLoader(load.LoaderPlugin): class USDReferenceLoader(plugin.HoudiniLoader):
"""Reference USD file in Solaris""" """Reference USD file in Solaris"""
product_types = { product_types = {

View file

@ -1,10 +1,12 @@
import os import os
from ayon_core.pipeline import load from ayon_houdini.api import (
from ayon_houdini.api import pipeline pipeline,
plugin
)
class SopUsdImportLoader(load.LoaderPlugin): class SopUsdImportLoader(plugin.HoudiniLoader):
"""Load USD to SOPs via `usdimport`""" """Load USD to SOPs via `usdimport`"""
label = "Load USD to SOPs" label = "Load USD to SOPs"

View file

@ -1,14 +1,14 @@
import os import os
import re import re
from ayon_core.pipeline import ( from ayon_core.pipeline import get_representation_path
load, from ayon_houdini.api import (
get_representation_path, pipeline,
plugin
) )
from ayon_houdini.api import pipeline
class VdbLoader(load.LoaderPlugin): class VdbLoader(plugin.HoudiniLoader):
"""Load VDB""" """Load VDB"""
product_types = {"vdbcache"} product_types = {"vdbcache"}

View file

@ -3,10 +3,10 @@ import platform
import subprocess import subprocess
from ayon_core.lib.vendor_bin_utils import find_executable from ayon_core.lib.vendor_bin_utils import find_executable
from ayon_core.pipeline import load from ayon_houdini.api import plugin
class ShowInUsdview(load.LoaderPlugin): class ShowInUsdview(plugin.HoudiniLoader):
"""Open USD file in usdview""" """Open USD file in usdview"""
label = "Show in usdview" label = "Show in usdview"

View file

@ -1,8 +1,10 @@
import pyblish.api
import hou import hou
import pyblish.api
from ayon_houdini.api import plugin
class CollectInstanceActiveState(pyblish.api.InstancePlugin):
class CollectInstanceActiveState(plugin.HoudiniInstancePlugin):
"""Collect default active state for instance from its node bypass state. """Collect default active state for instance from its node bypass state.
This is done at the very end of the CollectorOrder so that any required This is done at the very end of the CollectorOrder so that any required
@ -14,7 +16,6 @@ class CollectInstanceActiveState(pyblish.api.InstancePlugin):
order = pyblish.api.CollectorOrder + 0.299 order = pyblish.api.CollectorOrder + 0.299
families = ["*"] families = ["*"]
hosts = ["houdini"]
label = "Instance Active State" label = "Instance Active State"
def process(self, instance): def process(self, instance):

View file

@ -4,12 +4,14 @@ import re
import hou import hou
import pyblish.api import pyblish.api
from ayon_houdini.api import colorspace from ayon_houdini.api import colorspace, plugin
from ayon_houdini.api.lib import ( from ayon_houdini.api.lib import (
evalParmNoFrame, get_color_management_preferences) get_color_management_preferences,
evalParmNoFrame
)
class CollectArnoldROPRenderProducts(pyblish.api.InstancePlugin): class CollectArnoldROPRenderProducts(plugin.HoudiniInstancePlugin):
"""Collect Arnold ROP Render Products """Collect Arnold ROP Render Products
Collects the instance.data["files"] for the render products. Collects the instance.data["files"] for the render products.
@ -23,7 +25,6 @@ class CollectArnoldROPRenderProducts(pyblish.api.InstancePlugin):
# This specific order value is used so that # This specific order value is used so that
# this plugin runs after CollectFrames # this plugin runs after CollectFrames
order = pyblish.api.CollectorOrder + 0.11 order = pyblish.api.CollectorOrder + 0.11
hosts = ["houdini"]
families = ["arnold_rop"] families = ["arnold_rop"]
def process(self, instance): def process(self, instance):

View file

@ -1,12 +1,12 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
"""Collector plugin for frames data on ROP instances.""" """Collector plugin for frames data on ROP instances."""
import hou # noqa
import pyblish.api import pyblish.api
from ayon_core.lib import BoolDef from ayon_core.lib import BoolDef
from ayon_core.pipeline import AYONPyblishPluginMixin from ayon_core.pipeline import AYONPyblishPluginMixin
from ayon_houdini.api import plugin
class CollectAssetHandles(pyblish.api.InstancePlugin, class CollectAssetHandles(plugin.HoudiniInstancePlugin,
AYONPyblishPluginMixin): AYONPyblishPluginMixin):
"""Apply folder handles. """Apply folder handles.
@ -23,8 +23,6 @@ class CollectAssetHandles(pyblish.api.InstancePlugin,
the exclusive frame range and actual handle ranges. the exclusive frame range and actual handle ranges.
""" """
hosts = ["houdini"]
# This specific order value is used so that # This specific order value is used so that
# this plugin runs after CollectAnatomyInstanceData # this plugin runs after CollectAnatomyInstanceData
order = pyblish.api.CollectorOrder + 0.499 order = pyblish.api.CollectorOrder + 0.499
@ -32,8 +30,6 @@ class CollectAssetHandles(pyblish.api.InstancePlugin,
label = "Collect Folder Handles" label = "Collect Folder Handles"
use_asset_handles = True use_asset_handles = True
settings_category = "houdini"
def process(self, instance): def process(self, instance):
# Only process instances without already existing handles data # Only process instances without already existing handles data
# but that do have frameStartHandle and frameEndHandle defined # but that do have frameStartHandle and frameEndHandle defined

View file

@ -1,10 +1,13 @@
import os import os
import pyblish.api
import hou import hou
from ayon_houdini.api import lib import pyblish.api
from ayon_houdini.api import (
lib,
plugin
)
class CollectDataforCache(pyblish.api.InstancePlugin): class CollectDataforCache(plugin.HoudiniInstancePlugin):
"""Collect data for caching to Deadline.""" """Collect data for caching to Deadline."""
# Run after Collect Frames # Run after Collect Frames
@ -12,7 +15,6 @@ class CollectDataforCache(pyblish.api.InstancePlugin):
families = ["ass", "pointcache", families = ["ass", "pointcache",
"mantraifd", "redshiftproxy", "mantraifd", "redshiftproxy",
"vdbcache", "model"] "vdbcache", "model"]
hosts = ["houdini"]
targets = ["local", "remote"] targets = ["local", "remote"]
label = "Collect Data for Cache" label = "Collect Data for Cache"

View file

@ -1,9 +1,10 @@
import pyblish.api import pyblish.api
from ayon_core.lib import NumberDef from ayon_core.lib import NumberDef
from ayon_core.pipeline import AYONPyblishPluginMixin from ayon_core.pipeline import AYONPyblishPluginMixin
from ayon_houdini.api import plugin
class CollectChunkSize(pyblish.api.InstancePlugin, class CollectChunkSize(plugin.HoudiniInstancePlugin,
AYONPyblishPluginMixin): AYONPyblishPluginMixin):
"""Collect chunk size for cache submission to Deadline.""" """Collect chunk size for cache submission to Deadline."""
@ -11,13 +12,10 @@ class CollectChunkSize(pyblish.api.InstancePlugin,
families = ["ass", "pointcache", families = ["ass", "pointcache",
"vdbcache", "mantraifd", "vdbcache", "mantraifd",
"redshiftproxy", "model"] "redshiftproxy", "model"]
hosts = ["houdini"]
targets = ["local", "remote"] targets = ["local", "remote"]
label = "Collect Chunk Size" label = "Collect Chunk Size"
chunk_size = 999999 chunk_size = 999999
settings_category = "houdini"
def process(self, instance): def process(self, instance):
# need to get the chunk size info from the setting # need to get the chunk size info from the setting
attr_values = self.get_attr_values_from_data(instance.data) attr_values = self.get_attr_values_from_data(instance.data)

View file

@ -2,14 +2,14 @@ import os
import hou import hou
import pyblish.api import pyblish.api
from ayon_houdini.api import plugin
class CollectHoudiniCurrentFile(pyblish.api.ContextPlugin): class CollectHoudiniCurrentFile(plugin.HoudiniContextPlugin):
"""Inject the current working file into context""" """Inject the current working file into context"""
order = pyblish.api.CollectorOrder - 0.1 order = pyblish.api.CollectorOrder - 0.1
label = "Houdini Current File" label = "Houdini Current File"
hosts = ["houdini"]
def process(self, context): def process(self, context):
"""Inject the current working file""" """Inject the current working file"""

View file

@ -1,7 +1,8 @@
import pyblish.api import pyblish.api
from ayon_houdini.api import plugin
class CollectFarmInstances(pyblish.api.InstancePlugin): class CollectFarmInstances(plugin.HoudiniInstancePlugin):
"""Collect instances for farm render.""" """Collect instances for farm render."""
order = pyblish.api.CollectorOrder order = pyblish.api.CollectorOrder
@ -11,7 +12,6 @@ class CollectFarmInstances(pyblish.api.InstancePlugin):
"arnold_rop", "arnold_rop",
"vray_rop"] "vray_rop"]
hosts = ["houdini"]
targets = ["local", "remote"] targets = ["local", "remote"]
label = "Collect farm instances" label = "Collect farm instances"

View file

@ -5,10 +5,10 @@ import re
import hou # noqa import hou # noqa
import pyblish.api import pyblish.api
from ayon_houdini.api import lib from ayon_houdini.api import lib, plugin
class CollectFrames(pyblish.api.InstancePlugin): class CollectFrames(plugin.HoudiniInstancePlugin):
"""Collect all frames which would be saved from the ROP nodes""" """Collect all frames which would be saved from the ROP nodes"""
# This specific order value is used so that # This specific order value is used so that

View file

@ -1,8 +1,8 @@
from collections import deque from collections import deque
import pyblish.api import pyblish.api
from ayon_core.pipeline import registered_host from ayon_core.pipeline import registered_host
from ayon_houdini.api import plugin
def get_container_members(container): def get_container_members(container):
@ -80,7 +80,7 @@ def iter_upstream(node):
collected.update(ancestors) collected.update(ancestors)
class CollectUpstreamInputs(pyblish.api.InstancePlugin): class CollectUpstreamInputs(plugin.HoudiniInstancePlugin):
"""Collect source input containers used for this publish. """Collect source input containers used for this publish.
This will include `inputs` data of which loaded publishes were used in the This will include `inputs` data of which loaded publishes were used in the
@ -91,7 +91,6 @@ class CollectUpstreamInputs(pyblish.api.InstancePlugin):
label = "Collect Inputs" label = "Collect Inputs"
order = pyblish.api.CollectorOrder + 0.4 order = pyblish.api.CollectorOrder + 0.4
hosts = ["houdini"]
def process(self, instance): def process(self, instance):
# We can't get the "inputAncestors" directly from the ROP # We can't get the "inputAncestors" directly from the ROP

View file

@ -10,7 +10,6 @@ class CollectPointcacheType(pyblish.api.InstancePlugin):
"""Collect data type for different instances.""" """Collect data type for different instances."""
order = pyblish.api.CollectorOrder order = pyblish.api.CollectorOrder
hosts = ["houdini"]
families = ["pointcache", "model"] families = ["pointcache", "model"]
label = "Collect instances types" label = "Collect instances types"

View file

@ -1,11 +1,11 @@
import hou import hou
import pyblish.api import pyblish.api
from ayon_houdini.api import lib
import ayon_houdini.api.usd as hou_usdlib
from ayon_core.pipeline import usdlib from ayon_core.pipeline import usdlib
from ayon_houdini.api import lib, plugin
import ayon_houdini.api.usd as hou_usdlib
class CollectInstancesUsdLayered(pyblish.api.ContextPlugin): class CollectInstancesUsdLayered(plugin.HoudiniContextPlugin):
"""Collect Instances from a ROP Network and its configured layer paths. """Collect Instances from a ROP Network and its configured layer paths.
The output nodes of the ROP node will only be published when *any* of the The output nodes of the ROP node will only be published when *any* of the
@ -32,7 +32,6 @@ class CollectInstancesUsdLayered(pyblish.api.ContextPlugin):
order = pyblish.api.CollectorOrder - 0.01 order = pyblish.api.CollectorOrder - 0.01
label = "Collect Instances (USD Configured Layers)" label = "Collect Instances (USD Configured Layers)"
hosts = ["houdini"]
def process(self, context): def process(self, context):

View file

@ -9,11 +9,12 @@ from ayon_houdini.api.lib import (
get_color_management_preferences get_color_management_preferences
) )
from ayon_houdini.api import ( from ayon_houdini.api import (
colorspace colorspace,
plugin
) )
class CollectKarmaROPRenderProducts(pyblish.api.InstancePlugin): class CollectKarmaROPRenderProducts(plugin.HoudiniInstancePlugin):
"""Collect Karma Render Products """Collect Karma Render Products
Collects the instance.data["files"] for the multipart render product. Collects the instance.data["files"] for the multipart render product.
@ -27,7 +28,6 @@ class CollectKarmaROPRenderProducts(pyblish.api.InstancePlugin):
# This specific order value is used so that # This specific order value is used so that
# this plugin runs after CollectFrames # this plugin runs after CollectFrames
order = pyblish.api.CollectorOrder + 0.11 order = pyblish.api.CollectorOrder + 0.11
hosts = ["houdini"]
families = ["karma_rop"] families = ["karma_rop"]
def process(self, instance): def process(self, instance):

View file

@ -6,9 +6,10 @@ from ayon_core.pipeline.publish import (
get_plugin_settings, get_plugin_settings,
apply_plugin_settings_automatically apply_plugin_settings_automatically
) )
from ayon_houdini.api import plugin
class CollectLocalRenderInstances(pyblish.api.InstancePlugin): class CollectLocalRenderInstances(plugin.HoudiniInstancePlugin):
"""Collect instances for local render. """Collect instances for local render.
Agnostic Local Render Collector. Agnostic Local Render Collector.
@ -22,11 +23,8 @@ class CollectLocalRenderInstances(pyblish.api.InstancePlugin):
"arnold_rop", "arnold_rop",
"vray_rop"] "vray_rop"]
hosts = ["houdini"]
label = "Collect local render instances" label = "Collect local render instances"
settings_category = "houdini"
use_deadline_aov_filter = False use_deadline_aov_filter = False
aov_filter = {"host_name": "houdini", aov_filter = {"host_name": "houdini",
"value": [".*([Bb]eauty).*"]} "value": [".*([Bb]eauty).*"]}

View file

@ -9,11 +9,12 @@ from ayon_houdini.api.lib import (
get_color_management_preferences get_color_management_preferences
) )
from ayon_houdini.api import ( from ayon_houdini.api import (
colorspace colorspace,
plugin
) )
class CollectMantraROPRenderProducts(pyblish.api.InstancePlugin): class CollectMantraROPRenderProducts(plugin.HoudiniInstancePlugin):
"""Collect Mantra Render Products """Collect Mantra Render Products
Collects the instance.data["files"] for the render products. Collects the instance.data["files"] for the render products.
@ -27,7 +28,6 @@ class CollectMantraROPRenderProducts(pyblish.api.InstancePlugin):
# This specific order value is used so that # This specific order value is used so that
# this plugin runs after CollectFrames # this plugin runs after CollectFrames
order = pyblish.api.CollectorOrder + 0.11 order = pyblish.api.CollectorOrder + 0.11
hosts = ["houdini"]
families = ["mantra_rop"] families = ["mantra_rop"]
def process(self, instance): def process(self, instance):

View file

@ -1,9 +1,9 @@
import pyblish.api import pyblish.api
from ayon_core.pipeline.publish import KnownPublishError from ayon_core.pipeline.publish import KnownPublishError
from ayon_houdini.api import plugin
class CollectOutputSOPPath(pyblish.api.InstancePlugin): class CollectOutputSOPPath(plugin.HoudiniInstancePlugin):
"""Collect the out node's SOP/COP Path value.""" """Collect the out node's SOP/COP Path value."""
order = pyblish.api.CollectorOrder order = pyblish.api.CollectorOrder
@ -19,7 +19,6 @@ class CollectOutputSOPPath(pyblish.api.InstancePlugin):
"model" "model"
] ]
hosts = ["houdini"]
label = "Collect Output Node Path" label = "Collect Output Node Path"
def process(self, instance): def process(self, instance):

View file

@ -9,11 +9,12 @@ from ayon_houdini.api.lib import (
get_color_management_preferences get_color_management_preferences
) )
from ayon_houdini.api import ( from ayon_houdini.api import (
colorspace colorspace,
plugin
) )
class CollectRedshiftROPRenderProducts(pyblish.api.InstancePlugin): class CollectRedshiftROPRenderProducts(plugin.HoudiniInstancePlugin):
"""Collect USD Render Products """Collect USD Render Products
Collects the instance.data["files"] for the render products. Collects the instance.data["files"] for the render products.
@ -27,7 +28,6 @@ class CollectRedshiftROPRenderProducts(pyblish.api.InstancePlugin):
# This specific order value is used so that # This specific order value is used so that
# this plugin runs after CollectFrames # this plugin runs after CollectFrames
order = pyblish.api.CollectorOrder + 0.11 order = pyblish.api.CollectorOrder + 0.11
hosts = ["houdini"]
families = ["redshift_rop"] families = ["redshift_rop"]
def process(self, instance): def process(self, instance):

View file

@ -1,16 +1,15 @@
import hou
import pyblish.api import pyblish.api
import hou
from ayon_core.pipeline.publish import RepairAction from ayon_core.pipeline.publish import RepairAction
from ayon_houdini.api import lib from ayon_houdini.api import lib, plugin
class CollectRemotePublishSettings(pyblish.api.ContextPlugin): class CollectRemotePublishSettings(plugin.HoudiniContextPlugin):
"""Collect custom settings of the Remote Publish node.""" """Collect custom settings of the Remote Publish node."""
order = pyblish.api.CollectorOrder order = pyblish.api.CollectorOrder
families = ["*"] families = ["*"]
hosts = ["houdini"]
targets = ["deadline"] targets = ["deadline"]
label = "Remote Publish Submission Settings" label = "Remote Publish Submission Settings"
actions = [RepairAction] actions = [RepairAction]

View file

@ -5,6 +5,7 @@ import hou
import pxr.UsdRender import pxr.UsdRender
import pyblish.api import pyblish.api
from ayon_houdini.api import plugin
def get_var_changed(variable=None): def get_var_changed(variable=None):
@ -41,12 +42,11 @@ def get_var_changed(variable=None):
return changed return changed
class CollectRenderProducts(pyblish.api.InstancePlugin): class CollectRenderProducts(plugin.HoudiniInstancePlugin):
"""Collect USD Render Products.""" """Collect USD Render Products."""
label = "Collect Render Products" label = "Collect Render Products"
order = pyblish.api.CollectorOrder + 0.4 order = pyblish.api.CollectorOrder + 0.4
hosts = ["houdini"]
families = ["usdrender"] families = ["usdrender"]
def process(self, instance): def process(self, instance):

View file

@ -1,8 +1,9 @@
import hou import hou
import pyblish.api import pyblish.api
from ayon_houdini.api import plugin
class CollectHoudiniReviewData(pyblish.api.InstancePlugin): class CollectHoudiniReviewData(plugin.HoudiniInstancePlugin):
"""Collect Review Data.""" """Collect Review Data."""
label = "Collect Review Data" label = "Collect Review Data"
@ -10,7 +11,6 @@ class CollectHoudiniReviewData(pyblish.api.InstancePlugin):
# this plugin runs after CollectRopFrameRange # this plugin runs after CollectRopFrameRange
# Also after CollectLocalRenderInstances # Also after CollectLocalRenderInstances
order = pyblish.api.CollectorOrder + 0.13 order = pyblish.api.CollectorOrder + 0.13
hosts = ["houdini"]
families = ["review"] families = ["review"]
def process(self, instance): def process(self, instance):

View file

@ -1,7 +1,8 @@
import pyblish.api import pyblish.api
from ayon_houdini.api import plugin
class CollectReviewableInstances(pyblish.api.InstancePlugin): class CollectReviewableInstances(plugin.HoudiniInstancePlugin):
"""Collect Reviewable Instances. """Collect Reviewable Instances.
Basically, all instances of the specified families Basically, all instances of the specified families

View file

@ -2,13 +2,12 @@
"""Collector plugin for frames data on ROP instances.""" """Collector plugin for frames data on ROP instances."""
import hou # noqa import hou # noqa
import pyblish.api import pyblish.api
from ayon_houdini.api import lib from ayon_houdini.api import lib, plugin
class CollectRopFrameRange(pyblish.api.InstancePlugin): class CollectRopFrameRange(plugin.HoudiniInstancePlugin):
"""Collect all frames which would be saved from the ROP nodes""" """Collect all frames which would be saved from the ROP nodes"""
hosts = ["houdini"]
order = pyblish.api.CollectorOrder order = pyblish.api.CollectorOrder
label = "Collect RopNode Frame Range" label = "Collect RopNode Frame Range"

View file

@ -2,12 +2,12 @@
"""Collector for staticMesh types. """ """Collector for staticMesh types. """
import pyblish.api import pyblish.api
from ayon_houdini.api import plugin
class CollectStaticMeshType(pyblish.api.InstancePlugin): class CollectStaticMeshType(plugin.HoudiniInstancePlugin):
"""Collect data type for fbx instance.""" """Collect data type for fbx instance."""
hosts = ["houdini"]
families = ["staticMesh"] families = ["staticMesh"]
label = "Collect type of staticMesh" label = "Collect type of staticMesh"

View file

@ -1,10 +1,10 @@
import pyblish.api import pyblish.api
import ayon_api import ayon_api
from ayon_core.pipeline import usdlib, KnownPublishError from ayon_core.pipeline import usdlib, KnownPublishError
from ayon_houdini.api import plugin
class CollectUsdBootstrap(pyblish.api.InstancePlugin): class CollectUsdBootstrap(plugin.HoudiniInstancePlugin):
"""Collect special Asset/Shot bootstrap instances if those are needed. """Collect special Asset/Shot bootstrap instances if those are needed.
Some specific products are intended to be part of the default structure Some specific products are intended to be part of the default structure
@ -21,7 +21,6 @@ class CollectUsdBootstrap(pyblish.api.InstancePlugin):
order = pyblish.api.CollectorOrder + 0.35 order = pyblish.api.CollectorOrder + 0.35
label = "Collect USD Bootstrap" label = "Collect USD Bootstrap"
hosts = ["houdini"]
families = ["usd", "usd.layered"] families = ["usd", "usd.layered"]
def process(self, instance): def process(self, instance):

View file

@ -1,17 +1,15 @@
import os import os
import hou
import pyblish.api import pyblish.api
from ayon_houdini.api import plugin
import ayon_houdini.api.usd as usdlib import ayon_houdini.api.usd as usdlib
import hou
class CollectUsdLayers(plugin.HoudiniInstancePlugin):
class CollectUsdLayers(pyblish.api.InstancePlugin):
"""Collect the USD Layers that have configured save paths.""" """Collect the USD Layers that have configured save paths."""
order = pyblish.api.CollectorOrder + 0.35 order = pyblish.api.CollectorOrder + 0.35
label = "Collect USD Layers" label = "Collect USD Layers"
hosts = ["houdini"]
families = ["usd"] families = ["usd"]
def process(self, instance): def process(self, instance):

View file

@ -9,11 +9,12 @@ from ayon_houdini.api.lib import (
get_color_management_preferences get_color_management_preferences
) )
from ayon_houdini.api import ( from ayon_houdini.api import (
colorspace colorspace,
plugin
) )
class CollectVrayROPRenderProducts(pyblish.api.InstancePlugin): class CollectVrayROPRenderProducts(plugin.HoudiniInstancePlugin):
"""Collect Vray Render Products """Collect Vray Render Products
Collects the instance.data["files"] for the render products. Collects the instance.data["files"] for the render products.
@ -27,7 +28,6 @@ class CollectVrayROPRenderProducts(pyblish.api.InstancePlugin):
# This specific order value is used so that # This specific order value is used so that
# this plugin runs after CollectFrames # this plugin runs after CollectFrames
order = pyblish.api.CollectorOrder + 0.11 order = pyblish.api.CollectorOrder + 0.11
hosts = ["houdini"]
families = ["vray_rop"] families = ["vray_rop"]
def process(self, instance): def process(self, instance):

View file

@ -1,14 +1,13 @@
import os import os
import pyblish.api import pyblish.api
from ayon_houdini.api import plugin
class CollectWorkfile(plugin.HoudiniInstancePlugin):
class CollectWorkfile(pyblish.api.InstancePlugin):
"""Inject workfile representation into instance""" """Inject workfile representation into instance"""
order = pyblish.api.CollectorOrder - 0.01 order = pyblish.api.CollectorOrder - 0.01
label = "Houdini Workfile Data" label = "Houdini Workfile Data"
hosts = ["houdini"]
families = ["workfile"] families = ["workfile"]
def process(self, instance): def process(self, instance):

View file

@ -1,13 +1,13 @@
import pyblish.api
import hou import hou
import pyblish.api
from ayon_houdini.api import plugin
class CollectWorksceneFPS(pyblish.api.ContextPlugin): class CollectWorksceneFPS(plugin.HoudiniContextPlugin):
"""Get the FPS of the work scene.""" """Get the FPS of the work scene."""
label = "Workscene FPS" label = "Workscene FPS"
order = pyblish.api.CollectorOrder order = pyblish.api.CollectorOrder
hosts = ["houdini"]
def process(self, context): def process(self, context):
fps = hou.fps() fps = hou.fps()

View file

@ -1,11 +1,10 @@
import pyblish.api
import tempfile import tempfile
from ayon_core.pipeline import publish import pyblish.api
from ayon_houdini.api import lib from ayon_houdini.api import lib, plugin
from ayon_houdini.api.pipeline import IS_HEADLESS from ayon_houdini.api.pipeline import IS_HEADLESS
class ExtractActiveViewThumbnail(publish.Extractor): class ExtractActiveViewThumbnail(plugin.HoudiniExtractorPlugin):
"""Set instance thumbnail to a screengrab of current active viewport. """Set instance thumbnail to a screengrab of current active viewport.
This makes it so that if an instance does not have a thumbnail set yet that This makes it so that if an instance does not have a thumbnail set yet that
@ -16,7 +15,6 @@ class ExtractActiveViewThumbnail(publish.Extractor):
order = pyblish.api.ExtractorOrder + 0.49 order = pyblish.api.ExtractorOrder + 0.49
label = "Extract Active View Thumbnail" label = "Extract Active View Thumbnail"
families = ["workfile"] families = ["workfile"]
hosts = ["houdini"]
def process(self, instance): def process(self, instance):
if IS_HEADLESS: if IS_HEADLESS:

View file

@ -1,18 +1,16 @@
import os import os
import hou
import pyblish.api import pyblish.api
from ayon_core.pipeline import publish from ayon_houdini.api import plugin
from ayon_houdini.api.lib import render_rop from ayon_houdini.api.lib import render_rop
import hou
class ExtractAlembic(plugin.HoudiniExtractorPlugin):
class ExtractAlembic(publish.Extractor):
order = pyblish.api.ExtractorOrder order = pyblish.api.ExtractorOrder
label = "Extract Alembic" label = "Extract Alembic"
hosts = ["houdini"]
families = ["abc", "camera"] families = ["abc", "camera"]
targets = ["local", "remote"] targets = ["local", "remote"]

View file

@ -1,19 +1,17 @@
import os import os
import hou
import pyblish.api import pyblish.api
from ayon_core.pipeline import publish from ayon_houdini.api import plugin
from ayon_houdini.api.lib import render_rop from ayon_houdini.api.lib import render_rop
import hou
class ExtractAss(plugin.HoudiniExtractorPlugin):
class ExtractAss(publish.Extractor):
order = pyblish.api.ExtractorOrder + 0.1 order = pyblish.api.ExtractorOrder + 0.1
label = "Extract Ass" label = "Extract Ass"
families = ["ass"] families = ["ass"]
hosts = ["houdini"]
targets = ["local", "remote"] targets = ["local", "remote"]
def process(self, instance): def process(self, instance):

View file

@ -1,19 +1,15 @@
import os import os
import hou
import pyblish.api import pyblish.api
from ayon_core.pipeline import publish from ayon_houdini.api import lib, plugin
from ayon_houdini.api.lib import render_rop
from ayon_houdini.api import lib
import hou
class ExtractBGEO(publish.Extractor): class ExtractBGEO(plugin.HoudiniExtractorPlugin):
order = pyblish.api.ExtractorOrder order = pyblish.api.ExtractorOrder
label = "Extract BGEO" label = "Extract BGEO"
hosts = ["houdini"]
families = ["bgeo"] families = ["bgeo"]
def process(self, instance): def process(self, instance):
@ -32,7 +28,7 @@ class ExtractBGEO(publish.Extractor):
file_name, staging_dir)) file_name, staging_dir))
# write files # write files
render_rop(ropnode) lib.render_rop(ropnode)
output = instance.data["frames"] output = instance.data["frames"]

View file

@ -1,18 +1,17 @@
import os import os
import hou
import pyblish.api import pyblish.api
from ayon_core.pipeline import publish from ayon_core.pipeline import publish
from ayon_houdini.api import plugin
from ayon_houdini.api.lib import render_rop, splitext from ayon_houdini.api.lib import render_rop, splitext
import hou
class ExtractComposite(plugin.HoudiniExtractorPlugin,
class ExtractComposite(publish.Extractor,
publish.ColormanagedPyblishPluginMixin): publish.ColormanagedPyblishPluginMixin):
order = pyblish.api.ExtractorOrder order = pyblish.api.ExtractorOrder
label = "Extract Composite (Image Sequence)" label = "Extract Composite (Image Sequence)"
hosts = ["houdini"]
families = ["imagesequence"] families = ["imagesequence"]
def process(self, instance): def process(self, instance):

View file

@ -2,18 +2,16 @@
"""Fbx Extractor for houdini. """ """Fbx Extractor for houdini. """
import os import os
import hou
import pyblish.api import pyblish.api
from ayon_core.pipeline import publish from ayon_houdini.api import plugin
from ayon_houdini.api.lib import render_rop from ayon_houdini.api.lib import render_rop
import hou
class ExtractFBX(plugin.HoudiniExtractorPlugin):
class ExtractFBX(publish.Extractor):
label = "Extract FBX" label = "Extract FBX"
families = ["fbx"] families = ["fbx"]
hosts = ["houdini"]
order = pyblish.api.ExtractorOrder + 0.1 order = pyblish.api.ExtractorOrder + 0.1

View file

@ -1,16 +1,15 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import os import os
from pprint import pformat from pprint import pformat
import pyblish.api
from ayon_core.pipeline import publish
import hou import hou
import pyblish.api
from ayon_houdini.api import plugin
class ExtractHDA(publish.Extractor): class ExtractHDA(plugin.HoudiniExtractorPlugin):
order = pyblish.api.ExtractorOrder order = pyblish.api.ExtractorOrder
label = "Extract HDA" label = "Extract HDA"
hosts = ["houdini"]
families = ["hda"] families = ["hda"]
def process(self, instance): def process(self, instance):

View file

@ -1,17 +1,15 @@
import os import os
import hou
import pyblish.api import pyblish.api
from ayon_core.pipeline import publish from ayon_houdini.api import plugin
import hou
class ExtractMantraIFD(publish.Extractor): class ExtractMantraIFD(plugin.HoudiniExtractorPlugin):
order = pyblish.api.ExtractorOrder order = pyblish.api.ExtractorOrder
label = "Extract Mantra ifd" label = "Extract Mantra ifd"
hosts = ["houdini"]
families = ["mantraifd"] families = ["mantraifd"]
targets = ["local", "remote"] targets = ["local", "remote"]

View file

@ -1,20 +1,19 @@
import os import os
import hou
import pyblish.api import pyblish.api
from ayon_core.pipeline import publish from ayon_core.pipeline import publish
from ayon_houdini.api import plugin
from ayon_houdini.api.lib import render_rop from ayon_houdini.api.lib import render_rop
import hou
class ExtractOpenGL(plugin.HoudiniExtractorPlugin,
class ExtractOpenGL(publish.Extractor,
publish.ColormanagedPyblishPluginMixin): publish.ColormanagedPyblishPluginMixin):
order = pyblish.api.ExtractorOrder - 0.01 order = pyblish.api.ExtractorOrder - 0.01
label = "Extract OpenGL" label = "Extract OpenGL"
families = ["review"] families = ["review"]
hosts = ["houdini"]
def process(self, instance): def process(self, instance):
ropnode = hou.node(instance.data.get("instance_node")) ropnode = hou.node(instance.data.get("instance_node"))

View file

@ -1,19 +1,17 @@
import os import os
import hou
import pyblish.api import pyblish.api
from ayon_core.pipeline import publish from ayon_houdini.api import plugin
from ayon_houdini.api.lib import render_rop from ayon_houdini.api.lib import render_rop
import hou
class ExtractRedshiftProxy(plugin.HoudiniExtractorPlugin):
class ExtractRedshiftProxy(publish.Extractor):
order = pyblish.api.ExtractorOrder + 0.1 order = pyblish.api.ExtractorOrder + 0.1
label = "Extract Redshift Proxy" label = "Extract Redshift Proxy"
families = ["redshiftproxy"] families = ["redshiftproxy"]
hosts = ["houdini"]
targets = ["local", "remote"] targets = ["local", "remote"]
def process(self, instance): def process(self, instance):

View file

@ -1,16 +1,16 @@
import os
import hou
import pyblish.api import pyblish.api
from ayon_core.pipeline import publish from ayon_houdini.api import plugin
from ayon_houdini.api.lib import render_rop from ayon_houdini.api.lib import render_rop
import hou
import os
class ExtractRender(publish.Extractor): class ExtractRender(plugin.HoudiniExtractorPlugin):
order = pyblish.api.ExtractorOrder order = pyblish.api.ExtractorOrder
label = "Extract Render" label = "Extract Render"
hosts = ["houdini"]
families = ["mantra_rop", families = ["mantra_rop",
"karma_rop", "karma_rop",
"redshift_rop", "redshift_rop",

View file

@ -1,18 +1,16 @@
import os import os
import hou
import pyblish.api import pyblish.api
from ayon_core.pipeline import publish from ayon_houdini.api import plugin
from ayon_houdini.api.lib import render_rop from ayon_houdini.api.lib import render_rop
import hou
class ExtractUSD(publish.Extractor): class ExtractUSD(plugin.HoudiniExtractorPlugin):
order = pyblish.api.ExtractorOrder order = pyblish.api.ExtractorOrder
label = "Extract USD" label = "Extract USD"
hosts = ["houdini"]
families = ["usd", families = ["usd",
"usdModel", "usdModel",
"usdSetDress"] "usdSetDress"]

View file

@ -7,10 +7,8 @@ import hou
import ayon_api import ayon_api
import pyblish.api import pyblish.api
from ayon_core.pipeline import ( from ayon_core.pipeline import get_representation_path
get_representation_path, from ayon_houdini.api import plugin
publish,
)
import ayon_houdini.api.usd as hou_usdlib import ayon_houdini.api.usd as hou_usdlib
from ayon_houdini.api.lib import render_rop from ayon_houdini.api.lib import render_rop
@ -154,11 +152,10 @@ def parm_values(overrides):
parm.set(value) parm.set(value)
class ExtractUSDLayered(publish.Extractor): class ExtractUSDLayered(plugin.HoudiniExtractorPlugin):
order = pyblish.api.ExtractorOrder order = pyblish.api.ExtractorOrder
label = "Extract Layered USD" label = "Extract Layered USD"
hosts = ["houdini"]
families = ["usdLayered", "usdShade"] families = ["usdLayered", "usdShade"]
# Force Output Processors so it will always save any file # Force Output Processors so it will always save any file
@ -312,3 +309,14 @@ class ExtractUSDLayered(publish.Extractor):
return False return False
return filecmp.cmp(old_file, new_file) return filecmp.cmp(old_file, new_file)
def staging_dir(self, instance):
"""Provide a temporary directory in which to store extracted files
Upon calling this method the staging directory is stored inside
the instance.data['stagingDir']
"""
from ayon_core.pipeline.publish import get_instance_staging_dir
return get_instance_staging_dir(instance)

View file

@ -1,19 +1,17 @@
import os import os
import hou
import pyblish.api import pyblish.api
from ayon_core.pipeline import publish from ayon_houdini.api import plugin
from ayon_houdini.api.lib import render_rop from ayon_houdini.api.lib import render_rop
import hou
class ExtractVDBCache(plugin.HoudiniExtractorPlugin):
class ExtractVDBCache(publish.Extractor):
order = pyblish.api.ExtractorOrder + 0.1 order = pyblish.api.ExtractorOrder + 0.1
label = "Extract VDB Cache" label = "Extract VDB Cache"
families = ["vdbcache"] families = ["vdbcache"]
hosts = ["houdini"]
def process(self, instance): def process(self, instance):
if instance.data.get("farm"): if instance.data.get("farm"):

View file

@ -2,11 +2,15 @@ import pyblish.api
from ayon_core.lib import version_up from ayon_core.lib import version_up
from ayon_core.pipeline import registered_host from ayon_core.pipeline import registered_host
from ayon_core.pipeline.publish import get_errored_plugins_from_context from ayon_core.pipeline.publish import (
from ayon_core.pipeline.publish import KnownPublishError get_errored_plugins_from_context,
KnownPublishError
)
from ayon_houdini.api import plugin
class IncrementCurrentFile(pyblish.api.ContextPlugin): class IncrementCurrentFile(plugin.HoudiniContextPlugin):
"""Increment the current file. """Increment the current file.
Saves the current scene with an increased version number. Saves the current scene with an increased version number.
@ -15,7 +19,6 @@ class IncrementCurrentFile(pyblish.api.ContextPlugin):
label = "Increment current file" label = "Increment current file"
order = pyblish.api.IntegratorOrder + 9.0 order = pyblish.api.IntegratorOrder + 9.0
hosts = ["houdini"]
families = ["workfile", families = ["workfile",
"usdrender", "usdrender",
"mantra_rop", "mantra_rop",

View file

@ -2,13 +2,14 @@ import pyblish.api
from ayon_core.pipeline import registered_host from ayon_core.pipeline import registered_host
from ayon_houdini.api import plugin
class SaveCurrentScene(pyblish.api.ContextPlugin):
class SaveCurrentScene(plugin.HoudiniContextPlugin):
"""Save current scene""" """Save current scene"""
label = "Save current file" label = "Save current file"
order = pyblish.api.ExtractorOrder - 0.49 order = pyblish.api.ExtractorOrder - 0.49
hosts = ["houdini"]
def process(self, context): def process(self, context):

View file

@ -1,11 +1,13 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import pyblish.api
from collections import defaultdict from collections import defaultdict
import pyblish.api
from ayon_core.pipeline import PublishValidationError from ayon_core.pipeline import PublishValidationError
from ayon_houdini.api import plugin
class ValidateAbcPrimitiveToDetail(pyblish.api.InstancePlugin):
class ValidateAbcPrimitiveToDetail(plugin.HoudiniInstancePlugin):
"""Validate Alembic ROP Primitive to Detail attribute is consistent. """Validate Alembic ROP Primitive to Detail attribute is consistent.
The Alembic ROP crashes Houdini whenever an attribute in the "Primitive to The Alembic ROP crashes Houdini whenever an attribute in the "Primitive to
@ -18,7 +20,6 @@ class ValidateAbcPrimitiveToDetail(pyblish.api.InstancePlugin):
order = pyblish.api.ValidatorOrder + 0.1 order = pyblish.api.ValidatorOrder + 0.1
families = ["abc"] families = ["abc"]
hosts = ["houdini"]
label = "Validate Primitive to Detail (Abc)" label = "Validate Primitive to Detail (Abc)"
def process(self, instance): def process(self, instance):

View file

@ -1,8 +1,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import pyblish.api
import hou import hou
import pyblish.api
from ayon_houdini.api import plugin
class ValidateAlembicROPFaceSets(pyblish.api.InstancePlugin):
class ValidateAlembicROPFaceSets(plugin.HoudiniInstancePlugin):
"""Validate Face Sets are disabled for extraction to pointcache. """Validate Face Sets are disabled for extraction to pointcache.
When groups are saved as Face Sets with the Alembic these show up When groups are saved as Face Sets with the Alembic these show up
@ -19,7 +21,6 @@ class ValidateAlembicROPFaceSets(pyblish.api.InstancePlugin):
order = pyblish.api.ValidatorOrder + 0.1 order = pyblish.api.ValidatorOrder + 0.1
families = ["abc"] families = ["abc"]
hosts = ["houdini"]
label = "Validate Alembic ROP Face Sets" label = "Validate Alembic ROP Face Sets"
def process(self, instance): def process(self, instance):

View file

@ -1,10 +1,12 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import hou
import pyblish.api import pyblish.api
from ayon_core.pipeline import PublishValidationError from ayon_core.pipeline import PublishValidationError
import hou
from ayon_houdini.api import plugin
class ValidateAlembicInputNode(pyblish.api.InstancePlugin): class ValidateAlembicInputNode(plugin.HoudiniInstancePlugin):
"""Validate that the node connected to the output is correct. """Validate that the node connected to the output is correct.
The connected node cannot be of the following types for Alembic: The connected node cannot be of the following types for Alembic:
@ -15,7 +17,6 @@ class ValidateAlembicInputNode(pyblish.api.InstancePlugin):
order = pyblish.api.ValidatorOrder + 0.1 order = pyblish.api.ValidatorOrder + 0.1
families = ["abc"] families = ["abc"]
hosts = ["houdini"]
label = "Validate Input Node (Abc)" label = "Validate Input Node (Abc)"
def process(self, instance): def process(self, instance):

View file

@ -1,11 +1,12 @@
import pyblish.api
from ayon_core.pipeline.publish import PublishValidationError
from ayon_houdini.api import lib
import hou import hou
import pyblish.api
from ayon_core.pipeline.publish import PublishValidationError
class ValidateAnimationSettings(pyblish.api.InstancePlugin): from ayon_houdini.api import lib, plugin
class ValidateAnimationSettings(plugin.HoudiniInstancePlugin):
"""Validate if the unexpanded string contains the frame ('$F') token """Validate if the unexpanded string contains the frame ('$F') token
This validator will only check the output parameter of the node if This validator will only check the output parameter of the node if

View file

@ -1,10 +1,13 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import hou
import pyblish.api import pyblish.api
from ayon_core.pipeline import PublishValidationError from ayon_core.pipeline import PublishValidationError
import hou from ayon_houdini.api import plugin
class ValidateBypassed(pyblish.api.InstancePlugin):
class ValidateBypassed(plugin.HoudiniInstancePlugin):
"""Validate all primitives build hierarchy from attribute when enabled. """Validate all primitives build hierarchy from attribute when enabled.
The name of the attribute must exist on the prims and have the same name The name of the attribute must exist on the prims and have the same name
@ -15,7 +18,6 @@ class ValidateBypassed(pyblish.api.InstancePlugin):
order = pyblish.api.ValidatorOrder - 0.1 order = pyblish.api.ValidatorOrder - 0.1
families = ["*"] families = ["*"]
hosts = ["houdini"]
label = "Validate ROP Bypass" label = "Validate ROP Bypass"
def process(self, instance): def process(self, instance):

View file

@ -3,13 +3,14 @@
import pyblish.api import pyblish.api
from ayon_core.pipeline import PublishValidationError from ayon_core.pipeline import PublishValidationError
from ayon_houdini.api import plugin
class ValidateCameraROP(pyblish.api.InstancePlugin):
class ValidateCameraROP(plugin.HoudiniInstancePlugin):
"""Validate Camera ROP settings.""" """Validate Camera ROP settings."""
order = pyblish.api.ValidatorOrder order = pyblish.api.ValidatorOrder
families = ["camera"] families = ["camera"]
hosts = ["houdini"]
label = "Camera ROP" label = "Camera ROP"
def process(self, instance): def process(self, instance):

View file

@ -1,11 +1,13 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import hou import hou
import pyblish.api
import pyblish.api
from ayon_core.pipeline import PublishValidationError from ayon_core.pipeline import PublishValidationError
from ayon_houdini.api import plugin
class ValidateCopOutputNode(pyblish.api.InstancePlugin):
class ValidateCopOutputNode(plugin.HoudiniInstancePlugin):
"""Validate the instance COP Output Node. """Validate the instance COP Output Node.
This will ensure: This will ensure:
@ -17,7 +19,6 @@ class ValidateCopOutputNode(pyblish.api.InstancePlugin):
order = pyblish.api.ValidatorOrder order = pyblish.api.ValidatorOrder
families = ["imagesequence"] families = ["imagesequence"]
hosts = ["houdini"]
label = "Validate COP Output Node" label = "Validate COP Output Node"
def process(self, instance): def process(self, instance):

View file

@ -18,7 +18,6 @@ class ValidateSingleFrame(pyblish.api.InstancePlugin,
""" """
families = ["model"] families = ["model"]
hosts = ["houdini"]
label = "Validate Single Frame" label = "Validate Single Frame"
order = ValidateContentsOrder + 0.1 order = ValidateContentsOrder + 0.1
actions = [SelectInvalidAction] actions = [SelectInvalidAction]

View file

@ -5,11 +5,12 @@ from ayon_houdini.api.action import (
SelectInvalidAction, SelectInvalidAction,
SelectROPAction, SelectROPAction,
) )
from ayon_houdini.api import plugin
from ayon_houdini.api.lib import get_obj_node_output from ayon_houdini.api.lib import get_obj_node_output
import hou import hou
class ValidateFBXOutputNode(pyblish.api.InstancePlugin): class ValidateFBXOutputNode(plugin.HoudiniInstancePlugin):
"""Validate the instance Output Node. """Validate the instance Output Node.
This will ensure: This will ensure:
@ -22,7 +23,6 @@ class ValidateFBXOutputNode(pyblish.api.InstancePlugin):
order = pyblish.api.ValidatorOrder order = pyblish.api.ValidatorOrder
families = ["fbx"] families = ["fbx"]
hosts = ["houdini"]
label = "Validate FBX Output Node" label = "Validate FBX Output Node"
actions = [SelectROPAction, SelectInvalidAction] actions = [SelectROPAction, SelectInvalidAction]

View file

@ -1,14 +1,14 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import os import os
import pyblish.api
from ayon_houdini.api import lib
from ayon_core.pipeline import PublishValidationError
import hou import hou
import pyblish.api
from ayon_core.pipeline import PublishValidationError
class ValidateFileExtension(pyblish.api.InstancePlugin): from ayon_houdini.api import lib, plugin
class ValidateFileExtension(plugin.HoudiniInstancePlugin):
"""Validate the output file extension fits the output family. """Validate the output file extension fits the output family.
File extensions: File extensions:
@ -20,7 +20,6 @@ class ValidateFileExtension(pyblish.api.InstancePlugin):
order = pyblish.api.ValidatorOrder order = pyblish.api.ValidatorOrder
families = ["camera", "vdbcache"] families = ["camera", "vdbcache"]
hosts = ["houdini"]
label = "Output File Extension" label = "Output File Extension"
family_extensions = { family_extensions = {

View file

@ -1,10 +1,13 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import hou
import pyblish.api import pyblish.api
from ayon_core.pipeline import PublishValidationError from ayon_core.pipeline import PublishValidationError
from ayon_core.pipeline.publish import RepairAction from ayon_core.pipeline.publish import RepairAction
from ayon_houdini.api.action import SelectInvalidAction
import hou from ayon_houdini.api.action import SelectInvalidAction
from ayon_houdini.api import plugin
class DisableUseFolderHandlesAction(RepairAction): class DisableUseFolderHandlesAction(RepairAction):
@ -12,7 +15,7 @@ class DisableUseFolderHandlesAction(RepairAction):
icon = "mdi.toggle-switch-off" icon = "mdi.toggle-switch-off"
class ValidateFrameRange(pyblish.api.InstancePlugin): class ValidateFrameRange(plugin.HoudiniInstancePlugin):
"""Validate Frame Range. """Validate Frame Range.
Due to the usage of start and end handles, Due to the usage of start and end handles,
@ -21,7 +24,6 @@ class ValidateFrameRange(pyblish.api.InstancePlugin):
""" """
order = pyblish.api.ValidatorOrder - 0.1 order = pyblish.api.ValidatorOrder - 0.1
hosts = ["houdini"]
label = "Validate Frame Range" label = "Validate Frame Range"
actions = [DisableUseFolderHandlesAction, SelectInvalidAction] actions = [DisableUseFolderHandlesAction, SelectInvalidAction]

View file

@ -1,10 +1,11 @@
import pyblish.api
from ayon_houdini.api import lib
import hou import hou
import pyblish.api
class ValidateFrameToken(pyblish.api.InstancePlugin): from ayon_houdini.api import lib, plugin
class ValidateFrameToken(plugin.HoudiniInstancePlugin):
"""Validate if the unexpanded string contains the frame ('$F') token. """Validate if the unexpanded string contains the frame ('$F') token.
This validator will *only* check the output parameter of the node if This validator will *only* check the output parameter of the node if

View file

@ -1,10 +1,13 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import pyblish.api
from ayon_core.pipeline import PublishValidationError
import hou import hou
import pyblish.api
from ayon_core.pipeline import PublishValidationError
class ValidateHoudiniNotApprenticeLicense(pyblish.api.InstancePlugin): from ayon_houdini.api import plugin
class ValidateHoudiniNotApprenticeLicense(plugin.HoudiniInstancePlugin):
"""Validate the Houdini instance runs a non Apprentice license. """Validate the Houdini instance runs a non Apprentice license.
USD ROPs: USD ROPs:
@ -21,7 +24,6 @@ class ValidateHoudiniNotApprenticeLicense(pyblish.api.InstancePlugin):
order = pyblish.api.ValidatorOrder order = pyblish.api.ValidatorOrder
families = ["usd", "abc", "fbx", "camera"] families = ["usd", "abc", "fbx", "camera"]
hosts = ["houdini"]
label = "Houdini Apprentice License" label = "Houdini Apprentice License"
def process(self, instance): def process(self, instance):

View file

@ -1,8 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
"""Validate if instance asset is the same as context asset.""" """Validate if instance asset is the same as context asset."""
import pyblish.api
from ayon_houdini.api.action import SelectROPAction
from ayon_core.pipeline.publish import ( from ayon_core.pipeline.publish import (
RepairAction, RepairAction,
ValidateContentsOrder, ValidateContentsOrder,
@ -10,8 +7,11 @@ from ayon_core.pipeline.publish import (
OptionalPyblishPluginMixin OptionalPyblishPluginMixin
) )
from ayon_houdini.api import plugin
from ayon_houdini.api.action import SelectROPAction
class ValidateInstanceInContextHoudini(pyblish.api.InstancePlugin,
class ValidateInstanceInContextHoudini(plugin.HoudiniInstancePlugin,
OptionalPyblishPluginMixin): OptionalPyblishPluginMixin):
"""Validator to check if instance asset match context asset. """Validator to check if instance asset match context asset.
@ -24,11 +24,8 @@ class ValidateInstanceInContextHoudini(pyblish.api.InstancePlugin,
order = ValidateContentsOrder order = ValidateContentsOrder
label = "Instance in same Context" label = "Instance in same Context"
optional = True optional = True
hosts = ["houdini"]
actions = [SelectROPAction, RepairAction] actions = [SelectROPAction, RepairAction]
settings_category = "houdini"
def process(self, instance): def process(self, instance):
if not self.is_active(instance.data): if not self.is_active(instance.data):
return return

View file

@ -1,17 +1,17 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
"""Validator for correct naming of Static Meshes.""" """Validator for correct naming of Static Meshes."""
import pyblish.api
from ayon_core.pipeline import ( from ayon_core.pipeline import (
PublishValidationError, PublishValidationError,
OptionalPyblishPluginMixin OptionalPyblishPluginMixin
) )
from ayon_core.pipeline.publish import ValidateContentsOrder from ayon_core.pipeline.publish import ValidateContentsOrder
from ayon_houdini.api import plugin
from ayon_houdini.api.action import SelectInvalidAction from ayon_houdini.api.action import SelectInvalidAction
from ayon_houdini.api.lib import get_output_children from ayon_houdini.api.lib import get_output_children
class ValidateMeshIsStatic(pyblish.api.InstancePlugin, class ValidateMeshIsStatic(plugin.HoudiniInstancePlugin,
OptionalPyblishPluginMixin): OptionalPyblishPluginMixin):
"""Validate mesh is static. """Validate mesh is static.
@ -23,13 +23,10 @@ class ValidateMeshIsStatic(pyblish.api.InstancePlugin,
families = ["staticMesh", families = ["staticMesh",
"model"] "model"]
hosts = ["houdini"]
label = "Validate Mesh is Static" label = "Validate Mesh is Static"
order = ValidateContentsOrder + 0.1 order = ValidateContentsOrder + 0.1
actions = [SelectInvalidAction] actions = [SelectInvalidAction]
settings_category = "houdini"
def process(self, instance): def process(self, instance):
invalid = self.get_invalid(instance) invalid = self.get_invalid(instance)

View file

@ -1,14 +1,16 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import pyblish.api import pyblish.api
from ayon_core.pipeline import PublishValidationError from ayon_core.pipeline import PublishValidationError
from ayon_houdini.api import plugin
class ValidateIntermediateDirectoriesChecked(pyblish.api.InstancePlugin):
class ValidateIntermediateDirectoriesChecked(plugin.HoudiniInstancePlugin):
"""Validate Create Intermediate Directories is enabled on ROP node.""" """Validate Create Intermediate Directories is enabled on ROP node."""
order = pyblish.api.ValidatorOrder order = pyblish.api.ValidatorOrder
families = ["pointcache", "camera", "vdbcache", "model"] families = ["pointcache", "camera", "vdbcache", "model"]
hosts = ["houdini"]
label = "Create Intermediate Directories Checked" label = "Create Intermediate Directories Checked"
def process(self, instance): def process(self, instance):

View file

@ -1,8 +1,11 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import pyblish.api
import hou import hou
import pyblish.api
from ayon_core.pipeline import PublishValidationError from ayon_core.pipeline import PublishValidationError
from ayon_houdini.api import plugin
def cook_in_range(node, start, end): def cook_in_range(node, start, end):
current = hou.intFrame() current = hou.intFrame()
@ -26,11 +29,10 @@ def get_errors(node):
return node.errors() return node.errors()
class ValidateNoErrors(pyblish.api.InstancePlugin): class ValidateNoErrors(plugin.HoudiniInstancePlugin):
"""Validate the Instance has no current cooking errors.""" """Validate the Instance has no current cooking errors."""
order = pyblish.api.ValidatorOrder order = pyblish.api.ValidatorOrder
hosts = ["houdini"]
label = "Validate no errors" label = "Validate no errors"
def process(self, instance): def process(self, instance):

View file

@ -1,20 +1,20 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import pyblish.api import hou
from ayon_houdini.api import plugin
from ayon_core.pipeline import PublishValidationError from ayon_core.pipeline import PublishValidationError
from ayon_core.pipeline.publish import ( from ayon_core.pipeline.publish import (
ValidateContentsOrder, ValidateContentsOrder,
RepairAction, RepairAction,
) )
import hou
class AddDefaultPathAction(RepairAction): class AddDefaultPathAction(RepairAction):
label = "Add a default path attribute" label = "Add a default path attribute"
icon = "mdi.pencil-plus-outline" icon = "mdi.pencil-plus-outline"
class ValidatePrimitiveHierarchyPaths(pyblish.api.InstancePlugin): class ValidatePrimitiveHierarchyPaths(plugin.HoudiniInstancePlugin):
"""Validate all primitives build hierarchy from attribute when enabled. """Validate all primitives build hierarchy from attribute when enabled.
The name of the attribute must exist on the prims and have the same name The name of the attribute must exist on the prims and have the same name
@ -25,7 +25,6 @@ class ValidatePrimitiveHierarchyPaths(pyblish.api.InstancePlugin):
order = ValidateContentsOrder + 0.1 order = ValidateContentsOrder + 0.1
families = ["abc"] families = ["abc"]
hosts = ["houdini"]
label = "Validate Prims Hierarchy Path" label = "Validate Prims Hierarchy Path"
actions = [AddDefaultPathAction] actions = [AddDefaultPathAction]

View file

@ -1,19 +1,18 @@
# -*-coding: utf-8 -*- # -*-coding: utf-8 -*-
import pyblish.api import hou
from ayon_houdini.api import lib import pyblish.api
from ayon_core.pipeline.publish import RepairContextAction from ayon_core.pipeline.publish import RepairContextAction
from ayon_core.pipeline import PublishValidationError from ayon_core.pipeline import PublishValidationError
import hou from ayon_houdini.api import lib, plugin
class ValidateRemotePublishOutNode(pyblish.api.ContextPlugin): class ValidateRemotePublishOutNode(plugin.HoudiniContextPlugin):
"""Validate the remote publish out node exists for Deadline to trigger.""" """Validate the remote publish out node exists for Deadline to trigger."""
order = pyblish.api.ValidatorOrder - 0.4 order = pyblish.api.ValidatorOrder - 0.4
families = ["*"] families = ["*"]
hosts = ["houdini"]
targets = ["deadline"] targets = ["deadline"]
label = "Remote Publish ROP node" label = "Remote Publish ROP node"
actions = [RepairContextAction] actions = [RepairContextAction]

View file

@ -1,17 +1,18 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import pyblish.api
import hou import hou
import pyblish.api
from ayon_core.pipeline.publish import RepairContextAction from ayon_core.pipeline.publish import RepairContextAction
from ayon_core.pipeline import PublishValidationError from ayon_core.pipeline import PublishValidationError
from ayon_houdini.api import plugin
class ValidateRemotePublishEnabled(pyblish.api.ContextPlugin):
class ValidateRemotePublishEnabled(plugin.HoudiniContextPlugin):
"""Validate the remote publish node is *not* bypassed.""" """Validate the remote publish node is *not* bypassed."""
order = pyblish.api.ValidatorOrder - 0.39 order = pyblish.api.ValidatorOrder - 0.39
families = ["*"] families = ["*"]
hosts = ["houdini"]
targets = ["deadline"] targets = ["deadline"]
label = "Remote Publish ROP enabled" label = "Remote Publish ROP enabled"
actions = [RepairContextAction] actions = [RepairContextAction]

View file

@ -1,4 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import os
import hou
import pyblish.api import pyblish.api
from ayon_core.pipeline import ( from ayon_core.pipeline import (
PublishValidationError, PublishValidationError,
@ -9,10 +12,9 @@ from ayon_core.pipeline.publish import (
get_plugin_settings, get_plugin_settings,
apply_plugin_settings_automatically apply_plugin_settings_automatically
) )
from ayon_houdini.api.action import SelectROPAction
import os from ayon_houdini.api import plugin
import hou from ayon_houdini.api.action import SelectROPAction
class ResetViewSpaceAction(RepairAction): class ResetViewSpaceAction(RepairAction):
@ -20,7 +22,7 @@ class ResetViewSpaceAction(RepairAction):
icon = "mdi.monitor" icon = "mdi.monitor"
class ValidateReviewColorspace(pyblish.api.InstancePlugin, class ValidateReviewColorspace(plugin.HoudiniInstancePlugin,
OptionalPyblishPluginMixin): OptionalPyblishPluginMixin):
"""Validate Review Colorspace parameters. """Validate Review Colorspace parameters.
@ -29,15 +31,12 @@ class ValidateReviewColorspace(pyblish.api.InstancePlugin,
order = pyblish.api.ValidatorOrder + 0.1 order = pyblish.api.ValidatorOrder + 0.1
families = ["review"] families = ["review"]
hosts = ["houdini"]
label = "Validate Review Colorspace" label = "Validate Review Colorspace"
actions = [ResetViewSpaceAction, SelectROPAction] actions = [ResetViewSpaceAction, SelectROPAction]
optional = True optional = True
review_color_space = "" review_color_space = ""
settings_category = "houdini"
@classmethod @classmethod
def apply_settings(cls, project_settings): def apply_settings(cls, project_settings):
# Preserve automatic settings applying logic # Preserve automatic settings applying logic

View file

@ -1,10 +1,13 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import pyblish.api
from ayon_core.pipeline import PublishValidationError
import hou import hou
import pyblish.api
from ayon_core.pipeline import PublishValidationError
class ValidateSceneReview(pyblish.api.InstancePlugin): from ayon_houdini.api import plugin
class ValidateSceneReview(plugin.HoudiniInstancePlugin):
"""Validator Some Scene Settings before publishing the review """Validator Some Scene Settings before publishing the review
1. Scene Path 1. Scene Path
2. Resolution 2. Resolution
@ -12,7 +15,6 @@ class ValidateSceneReview(pyblish.api.InstancePlugin):
order = pyblish.api.ValidatorOrder order = pyblish.api.ValidatorOrder
families = ["review"] families = ["review"]
hosts = ["houdini"]
label = "Scene Setting for review" label = "Scene Setting for review"
def process(self, instance): def process(self, instance):

View file

@ -1,15 +1,17 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import hou
import pyblish.api import pyblish.api
from ayon_core.pipeline import PublishValidationError from ayon_core.pipeline import PublishValidationError
from ayon_houdini.api import plugin
from ayon_houdini.api.action import ( from ayon_houdini.api.action import (
SelectInvalidAction, SelectInvalidAction,
SelectROPAction, SelectROPAction,
) )
import hou
class ValidateSopOutputNode(plugin.HoudiniInstancePlugin):
class ValidateSopOutputNode(pyblish.api.InstancePlugin):
"""Validate the instance SOP Output Node. """Validate the instance SOP Output Node.
This will ensure: This will ensure:
@ -23,7 +25,6 @@ class ValidateSopOutputNode(pyblish.api.InstancePlugin):
order = pyblish.api.ValidatorOrder order = pyblish.api.ValidatorOrder
families = ["pointcache", "vdbcache", "model"] families = ["pointcache", "vdbcache", "model"]
hosts = ["houdini"]
label = "Validate Output Node (SOP)" label = "Validate Output Node (SOP)"
actions = [SelectROPAction, SelectInvalidAction] actions = [SelectROPAction, SelectInvalidAction]

View file

@ -1,6 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
"""Validator for correct naming of Static Meshes.""" """Validator for correct naming of Static Meshes."""
import pyblish.api import hou
from ayon_core.pipeline import ( from ayon_core.pipeline import (
PublishValidationError, PublishValidationError,
OptionalPyblishPluginMixin OptionalPyblishPluginMixin
@ -9,30 +10,28 @@ from ayon_core.pipeline.publish import (
ValidateContentsOrder, ValidateContentsOrder,
RepairAction, RepairAction,
) )
from ayon_houdini.api import plugin
from ayon_houdini.api.action import SelectInvalidAction from ayon_houdini.api.action import SelectInvalidAction
from ayon_core.pipeline.create import get_product_name from ayon_core.pipeline.create import get_product_name
import hou
class FixProductNameAction(RepairAction): class FixProductNameAction(RepairAction):
label = "Fix Product Name" label = "Fix Product Name"
class ValidateSubsetName(pyblish.api.InstancePlugin, class ValidateSubsetName(plugin.HoudiniInstancePlugin,
OptionalPyblishPluginMixin): OptionalPyblishPluginMixin):
"""Validate Product name. """Validate Product name.
""" """
families = ["staticMesh"] families = ["staticMesh"]
hosts = ["houdini"]
label = "Validate Product Name" label = "Validate Product Name"
order = ValidateContentsOrder + 0.1 order = ValidateContentsOrder + 0.1
actions = [FixProductNameAction, SelectInvalidAction] actions = [FixProductNameAction, SelectInvalidAction]
optional = True optional = True
settings_category = "houdini"
def process(self, instance): def process(self, instance):

View file

@ -1,19 +1,19 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
"""Validator for correct naming of Static Meshes.""" """Validator for correct naming of Static Meshes."""
import pyblish.api import hou
from ayon_core.pipeline import ( from ayon_core.pipeline import (
PublishValidationError, PublishValidationError,
OptionalPyblishPluginMixin OptionalPyblishPluginMixin
) )
from ayon_core.pipeline.publish import ValidateContentsOrder from ayon_core.pipeline.publish import ValidateContentsOrder
from ayon_houdini.api import plugin
from ayon_houdini.api.action import SelectInvalidAction from ayon_houdini.api.action import SelectInvalidAction
from ayon_houdini.api.lib import get_output_children from ayon_houdini.api.lib import get_output_children
import hou
class ValidateUnrealStaticMeshName(plugin.HoudiniInstancePlugin,
class ValidateUnrealStaticMeshName(pyblish.api.InstancePlugin,
OptionalPyblishPluginMixin): OptionalPyblishPluginMixin):
"""Validate name of Unreal Static Mesh. """Validate name of Unreal Static Mesh.
@ -29,7 +29,6 @@ class ValidateUnrealStaticMeshName(pyblish.api.InstancePlugin,
""" """
families = ["staticMesh"] families = ["staticMesh"]
hosts = ["houdini"]
label = "Unreal Static Mesh Name (FBX)" label = "Unreal Static Mesh Name (FBX)"
order = ValidateContentsOrder + 0.1 order = ValidateContentsOrder + 0.1
actions = [SelectInvalidAction] actions = [SelectInvalidAction]
@ -38,8 +37,6 @@ class ValidateUnrealStaticMeshName(pyblish.api.InstancePlugin,
collision_prefixes = [] collision_prefixes = []
static_mesh_prefix = "" static_mesh_prefix = ""
settings_category = "houdini"
@classmethod @classmethod
def apply_settings(cls, project_settings): def apply_settings(cls, project_settings):

View file

@ -1,13 +1,14 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import pyblish.api
import ayon_houdini.api.usd as hou_usdlib
from ayon_core.pipeline import PublishValidationError
import hou import hou
import pyblish.api
from ayon_core.pipeline import PublishValidationError
class ValidateUSDLayerPathBackslashes(pyblish.api.InstancePlugin): from ayon_houdini.api import plugin
import ayon_houdini.api.usd as hou_usdlib
class ValidateUSDLayerPathBackslashes(plugin.HoudiniInstancePlugin):
"""Validate USD loaded paths have no backslashes. """Validate USD loaded paths have no backslashes.
This is a crucial validation for HUSK USD rendering as Houdini's This is a crucial validation for HUSK USD rendering as Houdini's
@ -22,7 +23,6 @@ class ValidateUSDLayerPathBackslashes(pyblish.api.InstancePlugin):
order = pyblish.api.ValidatorOrder order = pyblish.api.ValidatorOrder
families = ["usdSetDress", "usdShade", "usd", "usdrender"] families = ["usdSetDress", "usdShade", "usd", "usdrender"]
hosts = ["houdini"]
label = "USD Layer path backslashes" label = "USD Layer path backslashes"
optional = True optional = True

View file

@ -1,12 +1,12 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import pyblish.api import hou
import ayon_houdini.api.usd as hou_usdlib
from ayon_core.pipeline import PublishValidationError
from pxr import UsdShade, UsdRender, UsdLux from pxr import UsdShade, UsdRender, UsdLux
import hou import pyblish.api
from ayon_core.pipeline import PublishValidationError
from ayon_houdini.api import plugin
import ayon_houdini.api.usd as hou_usdlib
def fullname(o): def fullname(o):
@ -17,7 +17,7 @@ def fullname(o):
return module + "." + o.__name__ return module + "." + o.__name__
class ValidateUsdModel(pyblish.api.InstancePlugin): class ValidateUsdModel(plugin.HoudiniInstancePlugin):
"""Validate USD Model. """Validate USD Model.
Disallow Shaders, Render settings, products and vars and Lux lights. Disallow Shaders, Render settings, products and vars and Lux lights.
@ -26,7 +26,6 @@ class ValidateUsdModel(pyblish.api.InstancePlugin):
order = pyblish.api.ValidatorOrder order = pyblish.api.ValidatorOrder
families = ["usdModel"] families = ["usdModel"]
hosts = ["houdini"]
label = "Validate USD Model" label = "Validate USD Model"
optional = True optional = True

View file

@ -1,9 +1,12 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import pyblish.api import pyblish.api
from ayon_core.pipeline import PublishValidationError from ayon_core.pipeline import PublishValidationError
from ayon_houdini.api import plugin
class ValidateUSDOutputNode(pyblish.api.InstancePlugin):
class ValidateUSDOutputNode(plugin.HoudiniInstancePlugin):
"""Validate the instance USD LOPs Output Node. """Validate the instance USD LOPs Output Node.
This will ensure: This will ensure:
@ -15,7 +18,6 @@ class ValidateUSDOutputNode(pyblish.api.InstancePlugin):
order = pyblish.api.ValidatorOrder order = pyblish.api.ValidatorOrder
families = ["usd"] families = ["usd"]
hosts = ["houdini"]
label = "Validate Output Node (USD)" label = "Validate Output Node (USD)"
def process(self, instance): def process(self, instance):

View file

@ -1,16 +1,17 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import os import os
import pyblish.api
import pyblish.api
from ayon_core.pipeline import PublishValidationError from ayon_core.pipeline import PublishValidationError
from ayon_houdini.api import plugin
class ValidateUSDRenderProductNames(pyblish.api.InstancePlugin):
class ValidateUSDRenderProductNames(plugin.HoudiniInstancePlugin):
"""Validate USD Render Product names are correctly set absolute paths.""" """Validate USD Render Product names are correctly set absolute paths."""
order = pyblish.api.ValidatorOrder order = pyblish.api.ValidatorOrder
families = ["usdrender"] families = ["usdrender"]
hosts = ["houdini"]
label = "Validate USD Render Product Names" label = "Validate USD Render Product Names"
optional = True optional = True

View file

@ -1,11 +1,12 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import pyblish.api import pyblish.api
import ayon_houdini.api.usd as hou_usdlib
from ayon_core.pipeline import PublishValidationError from ayon_core.pipeline import PublishValidationError
from ayon_houdini.api import plugin
import ayon_houdini.api.usd as hou_usdlib
class ValidateUsdSetDress(pyblish.api.InstancePlugin):
class ValidateUsdSetDress(plugin.HoudiniInstancePlugin):
"""Validate USD Set Dress. """Validate USD Set Dress.
Must only have references or payloads. May not generate new mesh or Must only have references or payloads. May not generate new mesh or
@ -15,14 +16,13 @@ class ValidateUsdSetDress(pyblish.api.InstancePlugin):
order = pyblish.api.ValidatorOrder order = pyblish.api.ValidatorOrder
families = ["usdSetDress"] families = ["usdSetDress"]
hosts = ["houdini"]
label = "Validate USD Set Dress" label = "Validate USD Set Dress"
optional = True optional = True
def process(self, instance): def process(self, instance):
from pxr import UsdGeom
import hou import hou
from pxr import UsdGeom
rop = hou.node(instance.data.get("instance_node")) rop = hou.node(instance.data.get("instance_node"))
lop_path = hou_usdlib.get_usd_rop_loppath(rop) lop_path = hou_usdlib.get_usd_rop_loppath(rop)

View file

@ -2,20 +2,19 @@
import re import re
import ayon_api import ayon_api
import pyblish.api
from ayon_core.pipeline.publish import ( from ayon_core.pipeline.publish import (
ValidateContentsOrder, ValidateContentsOrder,
KnownPublishError, KnownPublishError,
PublishValidationError, PublishValidationError,
) )
from ayon_houdini.api import plugin
class ValidateUSDShadeModelExists(pyblish.api.InstancePlugin):
class ValidateUSDShadeModelExists(plugin.HoudiniInstancePlugin):
"""Validate the Instance has no current cooking errors.""" """Validate the Instance has no current cooking errors."""
order = ValidateContentsOrder order = ValidateContentsOrder
hosts = ["houdini"]
families = ["usdShade"] families = ["usdShade"]
label = "USD Shade model exists" label = "USD Shade model exists"

View file

@ -1,11 +1,13 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import hou
import pyblish.api import pyblish.api
from ayon_core.pipeline import PublishValidationError from ayon_core.pipeline import PublishValidationError
import hou from ayon_houdini.api import plugin
class ValidateUsdShadeWorkspace(pyblish.api.InstancePlugin): class ValidateUsdShadeWorkspace(plugin.HoudiniInstancePlugin):
"""Validate USD Shading Workspace is correct version. """Validate USD Shading Workspace is correct version.
There have been some issues with outdated/erroneous Shading Workspaces There have been some issues with outdated/erroneous Shading Workspaces
@ -14,7 +16,6 @@ class ValidateUsdShadeWorkspace(pyblish.api.InstancePlugin):
""" """
order = pyblish.api.ValidatorOrder order = pyblish.api.ValidatorOrder
hosts = ["houdini"]
families = ["usdShade"] families = ["usdShade"]
label = "USD Shade Workspace" label = "USD Shade Workspace"

View file

@ -1,10 +1,11 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import contextlib import contextlib
import pyblish.api
import hou import hou
import pyblish.api
from ayon_core.pipeline import PublishXmlValidationError from ayon_core.pipeline import PublishXmlValidationError
from ayon_houdini.api import plugin
from ayon_houdini.api.action import SelectInvalidAction from ayon_houdini.api.action import SelectInvalidAction
@ -60,7 +61,7 @@ def get_geometry_at_frame(sop_node, frame, force=True):
return sop_node.geometryAtFrame(frame) return sop_node.geometryAtFrame(frame)
class ValidateVDBOutputNode(pyblish.api.InstancePlugin): class ValidateVDBOutputNode(plugin.HoudiniInstancePlugin):
"""Validate that the node connected to the output node is of type VDB. """Validate that the node connected to the output node is of type VDB.
All primitives of the output geometry must be VDBs, no other primitive All primitives of the output geometry must be VDBs, no other primitive
@ -81,7 +82,6 @@ class ValidateVDBOutputNode(pyblish.api.InstancePlugin):
order = pyblish.api.ValidatorOrder + 0.1 order = pyblish.api.ValidatorOrder + 0.1
families = ["vdbcache"] families = ["vdbcache"]
hosts = ["houdini"]
label = "Validate Output Node (VDB)" label = "Validate Output Node (VDB)"
actions = [SelectInvalidAction] actions = [SelectInvalidAction]

View file

@ -1,20 +1,22 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import pyblish.api
import hou import hou
import pyblish.api
from ayon_core.pipeline import ( from ayon_core.pipeline import (
PublishValidationError, PublishValidationError,
OptionalPyblishPluginMixin OptionalPyblishPluginMixin
) )
from ayon_core.pipeline.publish import RepairAction from ayon_core.pipeline.publish import RepairAction
from ayon_houdini.api import plugin
class ValidateWorkfilePaths( class ValidateWorkfilePaths(
pyblish.api.InstancePlugin, OptionalPyblishPluginMixin): plugin.HoudiniInstancePlugin, OptionalPyblishPluginMixin):
"""Validate workfile paths so they are absolute.""" """Validate workfile paths so they are absolute."""
order = pyblish.api.ValidatorOrder order = pyblish.api.ValidatorOrder
families = ["workfile"] families = ["workfile"]
hosts = ["houdini"]
label = "Validate Workfile Paths" label = "Validate Workfile Paths"
actions = [RepairAction] actions = [RepairAction]
optional = True optional = True
@ -22,8 +24,6 @@ class ValidateWorkfilePaths(
node_types = ["file", "alembic"] node_types = ["file", "alembic"]
prohibited_vars = ["$HIP", "$JOB"] prohibited_vars = ["$HIP", "$JOB"]
settings_category = "houdini"
def process(self, instance): def process(self, instance):
if not self.is_active(instance.data): if not self.is_active(instance.data):
return return