Skip to content

Commit cab6e89

Browse files
author
RichardFrangenberg
committed
support for Maya 2022 and Nuke 13, fixed asset list - v1.3.0.80
1 parent dd34e8c commit cab6e89

File tree

17 files changed

+496
-426
lines changed

17 files changed

+496
-426
lines changed

Prism/Plugins/Apps/Houdini/Scripts/Prism_Houdini_Functions.py

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1532,6 +1532,9 @@ def getStateFromNode(self, kwargs):
15321532
if node and node.path() == knode.path():
15331533
return state
15341534

1535+
if getattr(sm, "stateInCreation", None):
1536+
return sm.stateInCreation
1537+
15351538
state = self.createStateForNode(kwargs)
15361539
return state
15371540

@@ -1559,16 +1562,24 @@ def openInExplorerFromNode(self, kwargs):
15591562
def onNodeCreated(self, kwargs):
15601563
pass
15611564

1565+
@err_catcher(name=__name__)
1566+
def getApiFromNode(self, node):
1567+
for api in self.nodeTypeAPIs:
1568+
validApi = self.isValidNodeApi(node, api)
1569+
1570+
if validApi:
1571+
return api
1572+
15621573
@err_catcher(name=__name__)
15631574
def onNodeDeleted(self, kwargs):
15641575
if hou.hipFile.isLoadingHipFile() or hou.hipFile.isShuttingDown():
15651576
return
15661577

15671578
state = self.getStateFromNode(kwargs)
15681579
parent = None
1569-
for api in self.nodeTypeAPIs:
1570-
if kwargs["node"].type().name().startswith(api.getTypeName()):
1571-
parent = api.getParentFolder(create=False, node=kwargs["node"])
1580+
api = self.getApiFromNode(kwargs["node"])
1581+
if api:
1582+
parent = api.getParentFolder(create=False, node=kwargs["node"])
15721583

15731584
sm = self.core.getStateManager()
15741585
sm.deleteState(state, silent=True)
@@ -1580,18 +1591,35 @@ def onNodeDeleted(self, kwargs):
15801591
else:
15811592
break
15821593

1594+
@err_catcher(name=__name__)
1595+
def isValidNodeApi(self, node, api):
1596+
validApi = False
1597+
typeName = api.getTypeName()
1598+
if isinstance(typeName, list):
1599+
typeNames = typeName
1600+
else:
1601+
typeNames = [typeName]
1602+
1603+
for name in typeNames:
1604+
validApi = node.type().name().startswith(name)
1605+
if validApi:
1606+
break
1607+
1608+
return validApi
1609+
15831610
@err_catcher(name=__name__)
15841611
def createStateForNode(self, kwargs):
15851612
sm = self.core.getStateManager()
15861613

1587-
for api in self.nodeTypeAPIs:
1588-
if kwargs["node"].type().name().startswith(api.getTypeName()):
1589-
parent = api.getParentFolder(create=False, node=kwargs["node"])
1590-
if parent:
1591-
parentExpanded = parent.isExpanded()
1592-
1593-
openBrowser = False if api.listType == "Import" else None
1594-
state = sm.createState(api.stateType, node=kwargs["node"], setActive=True, openProductsBrowser=openBrowser, parent=parent)
1614+
parent = None
1615+
api = self.getApiFromNode(kwargs["node"])
1616+
if api:
1617+
parent = api.getParentFolder(create=False, node=kwargs["node"])
1618+
if parent:
1619+
parentExpanded = parent.isExpanded()
1620+
1621+
openBrowser = False if api.listType == "Import" else None
1622+
state = sm.createState(api.stateType, node=kwargs["node"], setActive=True, openProductsBrowser=openBrowser, parent=parent)
15951623

15961624
if parent:
15971625
parent.setExpanded(parentExpanded)

Prism/Plugins/Apps/Houdini/Scripts/Prism_Houdini_Node_Filecache.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -379,14 +379,18 @@ def versionSelected(self, path, mode, kwargs):
379379

380380
return version
381381

382+
@err_catcher(name=__name__)
383+
def getProductName(self, node):
384+
return node.parm("task").eval()
385+
382386
@err_catcher(name=__name__)
383387
def getImportPath(self):
384388
sm = self.core.getStateManager(create=False)
385389
if not sm or self.core.getCurrentFileName() != sm.scenename:
386390
return ""
387391

388392
node = hou.pwd()
389-
product = node.parm("task").eval()
393+
product = self.getProductName(node)
390394
version = self.getReadVersionFromNode(node)
391395
if version == "latest":
392396
path = self.core.products.getLatestVersionpathFromProduct(product)
@@ -410,6 +414,7 @@ def getProductNames(self):
410414
if data["entity"] == "invalid":
411415
return names
412416
names = self.core.products.getProductsFromEntity(data["entity"], data["fullEntityName"])
417+
names = sorted(names.keys())
413418
names = [name for name in names for _ in range(2)]
414419
return names
415420

@@ -427,6 +432,17 @@ def getFrameranges(self):
427432
ranges = [r for r in ranges for _ in range(2)]
428433
return ranges
429434

435+
@err_catcher(name=__name__)
436+
def getFrameRange(self, node):
437+
if node.parm("framerange").eval() == 0:
438+
startFrame = self.core.appPlugin.getCurrentFrame()
439+
endFrame = startFrame
440+
else:
441+
startFrame = node.parm("f1").eval()
442+
endFrame = node.parm("f2").eval()
443+
444+
return startFrame, endFrame
445+
430446
@err_catcher(name=__name__)
431447
def framerangeChanged(self, kwargs):
432448
state = self.getStateFromNode(kwargs)
@@ -438,7 +454,7 @@ def getNodeDescription(self):
438454
version = self.getWriteVersionFromNode(node)
439455
if version == "next":
440456
version += " (%s)" % (self.core.versionFormat % node.parm("writeVersion").eval())
441-
descr = node.parm("task").eval() + "\n" + version
457+
descr = self.getProductName(node) + "\n" + version
442458

443459
if not node.parm("latestVersionRead").eval():
444460
readv = self.core.versionFormat % node.parm("readVersion").eval()

Prism/Plugins/Apps/Houdini/Scripts/StateManagerNodes/hou_Export.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -630,12 +630,11 @@ def getFrameRange(self, rangeType):
630630
if frange:
631631
startFrame, endFrame = frange
632632
elif rangeType == "Node" and self.node:
633-
if self.isPrismFilecacheNode(self.node):
634-
if self.node.parm("framerange").eval() == 0:
635-
startFrame = self.core.appPlugin.getCurrentFrame()
636-
endFrame = startFrame
633+
api = self.core.appPlugin.getApiFromNode(self.node)
634+
if api:
635+
startFrame, endFrame = api.getFrameRange(self.node)
637636

638-
if not startFrame:
637+
if startFrame is None:
639638
try:
640639
startFrame = self.node.parm("f1").eval()
641640
endFrame = self.node.parm("f2").eval()
@@ -1309,22 +1308,22 @@ def executeState(self, parent, useVersion="next"):
13091308
if self.cb_outType.currentText() in [".abc", ".fbx", ".usd"]:
13101309
outputName = outputName.replace(".$F4", "")
13111310

1312-
fc = self.isPrismFilecacheNode(self.node)
1311+
api = self.core.appPlugin.getApiFromNode(self.node)
13131312
isStart = ropNode.parm("f1").eval() == startFrame
13141313
isEnd = ropNode.parm("f2").eval() == endFrame
13151314

1316-
if not fc:
1315+
if not api:
13171316
if not self.core.appPlugin.setNodeParm(ropNode, "trange", val=1):
13181317
return [self.state.text(0) + ": error - Publish canceled"]
13191318

1320-
if not (fc and isStart):
1319+
if not (api and isStart):
13211320
if not self.core.appPlugin.setNodeParm(ropNode, "f1", clear=True):
13221321
return [self.state.text(0) + ": error - Publish canceled"]
13231322

13241323
if not self.core.appPlugin.setNodeParm(ropNode, "f1", val=startFrame):
13251324
return [self.state.text(0) + ": error - Publish canceled"]
13261325

1327-
if not (fc and isEnd):
1326+
if not (api and isEnd):
13281327
if not self.core.appPlugin.setNodeParm(ropNode, "f2", clear=True):
13291328
return [self.state.text(0) + ": error - Publish canceled"]
13301329

Prism/Plugins/Apps/Maya/Scripts/Prism_Maya_Functions.py

Lines changed: 54 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ class Prism_Maya_Functions(object):
6767
def __init__(self, core, plugin):
6868
self.core = core
6969
self.plugin = plugin
70+
self.importHandlers = {}
7071

7172
@err_catcher(name=__name__)
7273
def startup(self, origin):
@@ -452,11 +453,11 @@ def sm_export_addObjects(self, origin, objects=None):
452453
if objects:
453454
cmds.select(objects)
454455

455-
setName = self.validate(origin.l_taskName.text())
456+
setName = self.validate(origin.getTaskname())
456457
if not setName:
457458
setName = self.sm_export_setTaskText(origin, None, "Export")
458459

459-
setName = self.validate(origin.l_taskName.text())
460+
setName = self.validate(origin.getTaskname())
460461
for i in cmds.ls(selection=True, long=True):
461462
if i not in origin.nodes:
462463
try:
@@ -525,7 +526,8 @@ def sm_export_startup(self, origin):
525526
origin.f_objectList.setStyleSheet(
526527
"QFrame { border: 0px solid rgb(150,150,150); }"
527528
)
528-
origin.w_additionalOptions.setVisible(False)
529+
if hasattr(origin, "w_additionalOptions"):
530+
origin.w_additionalOptions.setVisible(False)
529531

530532
origin.w_exportNamespaces = QWidget()
531533
origin.lo_exportNamespaces = QHBoxLayout()
@@ -634,19 +636,19 @@ def sm_export_setTaskText(self, origin, prevTaskName, newTaskName):
634636

635637
@err_catcher(name=__name__)
636638
def sm_export_removeSetItem(self, origin, node):
637-
setName = self.validate(origin.l_taskName.text())
639+
setName = self.validate(origin.getTaskname())
638640
cmds.sets(node, remove=setName)
639641

640642
@err_catcher(name=__name__)
641643
def sm_export_clearSet(self, origin):
642-
setName = origin.l_taskName.text()
644+
setName = origin.getTaskname()
643645
if self.isNodeValid(origin, setName):
644646
cmds.sets(clear=setName)
645647

646648
@err_catcher(name=__name__)
647649
def sm_export_updateObjects(self, origin):
648650
prevSel = cmds.ls(selection=True, long=True)
649-
setName = self.validate(origin.l_taskName.text())
651+
setName = self.validate(origin.getTaskname())
650652
if not setName:
651653
setName = self.sm_export_setTaskText(origin, None, "Export")
652654

@@ -695,7 +697,7 @@ def sm_export_exportAppObjects(
695697
):
696698
cmds.select(clear=True)
697699
if nodes is None:
698-
setName = self.validate(origin.l_taskName.text())
700+
setName = self.validate(origin.getTaskname())
699701
if not self.isNodeValid(origin, setName):
700702
return (
701703
'Canceled: The selection set "%s" is invalid.'
@@ -711,7 +713,7 @@ def sm_export_exportAppObjects(
711713
]
712714

713715
if expType is None:
714-
expType = origin.cb_outType.currentText()
716+
expType = origin.getOutputType()
715717

716718
if expType == ".obj":
717719
cmds.loadPlugin("objExport", quiet=True)
@@ -948,7 +950,7 @@ def sm_export_exportAppObjects(
948950

949951
if scaledExport:
950952
cmds.delete(nodes)
951-
elif origin.chb_convertExport.isChecked():
953+
elif origin.getUnitConvert():
952954
if expType == ".obj":
953955
QMessageBox.warning(
954956
self.core.messageParent,
@@ -1058,7 +1060,7 @@ def sm_export_exportAppObjects(
10581060

10591061
@err_catcher(name=__name__)
10601062
def sm_export_preDelete(self, origin):
1061-
setName = self.validate(origin.l_taskName.text())
1063+
setName = self.validate(origin.getTaskname())
10621064
try:
10631065
cmds.delete(setName)
10641066
except:
@@ -1085,10 +1087,10 @@ def sm_export_typeChanged(self, origin, idx):
10851087
def sm_export_preExecute(self, origin, startFrame, endFrame):
10861088
warnings = []
10871089

1088-
if origin.cb_outType.currentText() != "ShotCam":
1090+
if origin.getOutputType() != "ShotCam":
10891091
if (
1090-
origin.cb_outType.currentText() == ".obj"
1091-
and origin.chb_convertExport.isChecked()
1092+
origin.getOutputType() == ".obj"
1093+
and origin.getUnitConvert()
10921094
):
10931095
warnings.append(
10941096
[
@@ -2302,13 +2304,32 @@ def sm_import_importToApp(self, origin, doImport, update, impFileName):
23022304
mel.eval("FBXImportMode -v merge")
23032305
mel.eval("FBXImportConvertUnitString -v cm")
23042306

2305-
try:
2306-
importedNodes = cmds.file(impFileName, i=True, returnNewNodes=True)
2307-
except Exception as e:
2307+
kwargs = {
2308+
"i": True,
2309+
"returnNewNodes": True,
2310+
"importFunction": self.basicImport
2311+
}
2312+
2313+
if fileName[1] in self.importHandlers:
2314+
kwargs.update(self.importHandlers[fileName[1]])
2315+
2316+
result = kwargs["importFunction"](impFileName, kwargs)
2317+
2318+
if result and result["result"]:
2319+
importedNodes = result["nodes"]
2320+
else:
23082321
importedNodes = []
2322+
if result:
2323+
if "error" not in result:
2324+
return
2325+
2326+
error = str(result["error"])
2327+
else:
2328+
error = ""
2329+
23092330
msg = "An error occured while importing the file:\n\n%s\n\n%s" % (
23102331
impFileName,
2311-
str(e),
2332+
error,
23122333
)
23132334
self.core.popup(msg, title="Import error")
23142335

@@ -2339,6 +2360,18 @@ def sm_import_importToApp(self, origin, doImport, update, impFileName):
23392360

23402361
return rDict
23412362

2363+
@err_catcher(name=__name__)
2364+
def basicImport(self, filepath, kwargs):
2365+
del kwargs["importFunction"]
2366+
try:
2367+
importedNodes = cmds.file(filepath, **kwargs)
2368+
except Exception as e:
2369+
result = {"result": False, "error": e}
2370+
return result
2371+
2372+
result = {"result": True, "nodes": importedNodes}
2373+
return result
2374+
23422375
@err_catcher(name=__name__)
23432376
def createGpuCache(self, filepath, geoPath="|", name=None):
23442377
cmds.loadPlugin("gpuCache.mll", quiet=True)
@@ -2750,7 +2783,10 @@ def sm_saveImports(self, origin, importPaths):
27502783
def sm_readStates(self, origin):
27512784
val = cmds.fileInfo("PrismStates", query=True)
27522785
if len(val) != 0:
2753-
stateStr = val[0].decode('string_escape')
2786+
if sys.version[0] == "2":
2787+
stateStr = val[0].decode('string_escape')
2788+
else:
2789+
stateStr = str.encode(val[0]).decode('unicode_escape')
27542790

27552791
# for backwards compatibility with scenes created before v1.3.0
27562792
jsonData = self.core.configs.readJson(data=stateStr)

0 commit comments

Comments
 (0)