diff --git a/lib/mayaUsd/commands/Readme.md b/lib/mayaUsd/commands/Readme.md index feb4234324..9f3b71e780 100644 --- a/lib/mayaUsd/commands/Readme.md +++ b/lib/mayaUsd/commands/Readme.md @@ -32,6 +32,7 @@ Each base command class is documented in the following sections. | `-apiSchema` | `-api` | string (multi) | none | Imports the given API schemas' attributes as Maya custom attributes. This only recognizes API schemas that have been applied to prims on the stage. The attributes will properly round-trip if you re-export back to USD. | | `-chaser` | `-chr` | string(multi) | none | Specify the import chasers to execute as part of the import. See "Import Chasers" below. | | `-chaserArgs` | `-cha` | string[3] multi| none | Pass argument names and values to import chasers. Each argument to `-chaserArgs` should be a triple of the form: (``, ``, ``). See "Import Chasers" below. | +| `-defaultPrim` | `-dp` | string | none | Set the default prim on export. | | `-excludePrimvar` | `-epv` | string (multi) | none | Excludes the named primvar(s) from being imported as color sets or UV sets. The primvar name should be the full name without the `primvars:` namespace prefix. | | `-excludePrimvarNamespace` | `-epv` | string (multi) | none | Excludes the named primvar namespace(s) from being imported as color sets or UV sets. The namespance should be the name without the `primvars:` namespace prefix. Ex: `primvars:excludeNamespace:excludeMe:excludeMetoo` can be excluded by specifying `excludeNamespace` or `excludeNamespace:excludeMe`| | `-excludeExportTypes` | `-eet` | string (multi) | none | Excludes the selected types of prims from being exported. The options are: Meshes, Cameras and Lights.| diff --git a/lib/mayaUsd/commands/baseExportCommand.cpp b/lib/mayaUsd/commands/baseExportCommand.cpp index b92523fca3..7a347e6b3b 100644 --- a/lib/mayaUsd/commands/baseExportCommand.cpp +++ b/lib/mayaUsd/commands/baseExportCommand.cpp @@ -226,7 +226,10 @@ MSyntax MayaUSDExportCommand::createSyntax() kExcludeExportTypesFlag, UsdMayaJobExportArgsTokens->excludeExportTypes.GetText(), MSyntax::kString); - syntax.makeFlagMultiUse((kExcludeExportTypesFlag)); + syntax.makeFlagMultiUse(kExcludeExportTypesFlag); + + syntax.addFlag( + kDefaultPrimFlag, UsdMayaJobExportArgsTokens->defaultPrim.GetText(), MSyntax::kString); // These are additional flags under our control. syntax.addFlag( diff --git a/lib/mayaUsd/commands/baseExportCommand.h b/lib/mayaUsd/commands/baseExportCommand.h index 5ae84ecaa8..308493012b 100644 --- a/lib/mayaUsd/commands/baseExportCommand.h +++ b/lib/mayaUsd/commands/baseExportCommand.h @@ -94,6 +94,7 @@ class MAYAUSD_CORE_PUBLIC MayaUSDExportCommand : public MPxCommand static constexpr auto kCustomLayerData = "cld"; static constexpr auto kMetersPerUnit = "mpu"; static constexpr auto kExcludeExportTypesFlag = "eet"; + static constexpr auto kDefaultPrimFlag = "dp"; // Short and Long forms of flags defined by this command itself: static constexpr auto kAppendFlag = "a"; diff --git a/lib/mayaUsd/fileio/functorPrimWriter.cpp b/lib/mayaUsd/fileio/functorPrimWriter.cpp index 47e72fbdc1..3eee232e52 100644 --- a/lib/mayaUsd/fileio/functorPrimWriter.cpp +++ b/lib/mayaUsd/fileio/functorPrimWriter.cpp @@ -56,7 +56,8 @@ void UsdMaya_FunctorPrimWriter::Write(const UsdTimeCode& usdTime) const UsdMayaPrimWriterArgs args( GetDagPath(), _GetExportArgs().exportRefsAsInstanceable, - _GetExportArgs().excludeExportTypes); + _GetExportArgs().excludeExportTypes, + _GetExportArgs().defaultPrim); UsdMayaPrimWriterContext ctx(usdTime, GetUsdPath(), GetUsdStage()); diff --git a/lib/mayaUsd/fileio/jobs/jobArgs.cpp b/lib/mayaUsd/fileio/jobs/jobArgs.cpp index 9bdf615fd8..3dc51e5750 100644 --- a/lib/mayaUsd/fileio/jobs/jobArgs.cpp +++ b/lib/mayaUsd/fileio/jobs/jobArgs.cpp @@ -666,6 +666,7 @@ UsdMayaJobExportArgs::UsdMayaJobExportArgs( , includeAPINames(extractTokenSet(userArgs, UsdMayaJobExportArgsTokens->apiSchema)) , jobContextNames(extractTokenSet(userArgs, UsdMayaJobExportArgsTokens->jobContext)) , excludeExportTypes(extractTokenSet(userArgs, UsdMayaJobExportArgsTokens->excludeExportTypes)) + , defaultPrim(extractString(userArgs, UsdMayaJobExportArgsTokens->defaultPrim)) , chaserNames(extractVector(userArgs, UsdMayaJobExportArgsTokens->chaser)) , allChaserArgs(_ChaserArgs(userArgs, UsdMayaJobExportArgsTokens->chaserArgs)) , customLayerData(_CustomLayerData(userArgs, UsdMayaJobExportArgsTokens->customLayerData)) @@ -1017,6 +1018,7 @@ const VtDictionary& UsdMayaJobExportArgs::GetDefaultDictionary() d[UsdMayaJobExportArgsTokens->customLayerData] = std::vector(); d[UsdMayaJobExportArgsTokens->metersPerUnit] = 0.0; d[UsdMayaJobExportArgsTokens->excludeExportTypes] = std::vector(); + d[UsdMayaJobExportArgsTokens->defaultPrim] = std::string(); // plugInfo.json site defaults. // The defaults dict should be correctly-typed, so enable @@ -1107,6 +1109,7 @@ const VtDictionary& UsdMayaJobExportArgs::GetGuideDictionary() d[UsdMayaJobExportArgsTokens->staticSingleSample] = _boolean; d[UsdMayaJobExportArgsTokens->geomSidedness] = _string; d[UsdMayaJobExportArgsTokens->excludeExportTypes] = _stringVector; + d[UsdMayaJobExportArgsTokens->defaultPrim] = _string; }); return d; diff --git a/lib/mayaUsd/fileio/jobs/jobArgs.h b/lib/mayaUsd/fileio/jobs/jobArgs.h index 20ade7dce4..fb6ff78101 100644 --- a/lib/mayaUsd/fileio/jobs/jobArgs.h +++ b/lib/mayaUsd/fileio/jobs/jobArgs.h @@ -64,6 +64,7 @@ TF_DECLARE_PUBLIC_TOKENS( (compatibility) \ (defaultCameras) \ (defaultMeshScheme) \ + (defaultPrim) \ (defaultUSDFormat) \ (eulerFilter) \ (exportBlendShapes) \ @@ -250,6 +251,7 @@ struct UsdMayaJobExportArgs const TfToken::Set includeAPINames; const TfToken::Set jobContextNames; const TfToken::Set excludeExportTypes; + const std::string defaultPrim; using ChaserArgs = std::map; const std::vector chaserNames; diff --git a/lib/mayaUsd/fileio/jobs/writeJob.cpp b/lib/mayaUsd/fileio/jobs/writeJob.cpp index 047f12a0f8..77250f10fe 100644 --- a/lib/mayaUsd/fileio/jobs/writeJob.cpp +++ b/lib/mayaUsd/fileio/jobs/writeJob.cpp @@ -556,7 +556,10 @@ bool UsdMaya_WriteJob::_FinishWriting() UsdGeomSetStageMetersPerUnit(mJobCtx.mStage, mJobCtx.mArgs.metersPerUnit); } - if (usdRootPrim) { + if (!mJobCtx.mArgs.defaultPrim.empty()) { + defaultPrim = TfToken(mJobCtx.mArgs.defaultPrim); + mJobCtx.mStage->GetRootLayer()->SetDefaultPrim(defaultPrim); + } else if (usdRootPrim) { // We have already decided above that 'usdRootPrim' is the important // prim for the export... usdVariantRootPrimPath mJobCtx.mStage->GetRootLayer()->SetDefaultPrim(defaultPrim); diff --git a/lib/mayaUsd/fileio/primWriterArgs.cpp b/lib/mayaUsd/fileio/primWriterArgs.cpp index c8464d2a1f..a3ec3d67b5 100644 --- a/lib/mayaUsd/fileio/primWriterArgs.cpp +++ b/lib/mayaUsd/fileio/primWriterArgs.cpp @@ -24,10 +24,12 @@ PXR_NAMESPACE_OPEN_SCOPE UsdMayaPrimWriterArgs::UsdMayaPrimWriterArgs( const MDagPath& dagPath, const bool exportRefsAsInstanceable, - const TfToken::Set& excludeExportTypes) + const TfToken::Set& excludeExportTypes, + const std::string& defaultPrim) : _dagPath(dagPath) , _exportRefsAsInstanceable(exportRefsAsInstanceable) , _excludeExportTypes(excludeExportTypes) + , _defaultPrim(defaultPrim) { } diff --git a/lib/mayaUsd/fileio/primWriterArgs.h b/lib/mayaUsd/fileio/primWriterArgs.h index a06b2c4710..54fa9ff627 100644 --- a/lib/mayaUsd/fileio/primWriterArgs.h +++ b/lib/mayaUsd/fileio/primWriterArgs.h @@ -41,7 +41,8 @@ class UsdMayaPrimWriterArgs UsdMayaPrimWriterArgs( const MDagPath& dagPath, const bool exportRefsAsInstanceable, - const TfToken::Set& excludeExportTypes); + const TfToken::Set& excludeExportTypes, + const std::string& defaultPrim); /// \brief returns the MObject that should be exported. MAYAUSD_CORE_PUBLIC @@ -70,6 +71,7 @@ class UsdMayaPrimWriterArgs MDagPath _dagPath; bool _exportRefsAsInstanceable; TfToken::Set _excludeExportTypes; + std::string _defaultPrim; }; PXR_NAMESPACE_CLOSE_SCOPE diff --git a/plugin/adsk/scripts/CMakeLists.txt b/plugin/adsk/scripts/CMakeLists.txt index 6eb152ec9e..c37c247beb 100644 --- a/plugin/adsk/scripts/CMakeLists.txt +++ b/plugin/adsk/scripts/CMakeLists.txt @@ -1,6 +1,7 @@ list(APPEND scripts_src mayaUsdTranslatorImport.mel mayaUsdTranslatorExport.mel + mayaUsd_exportHelpers.py mayaUSDRegisterStrings.mel mayaUSDRegisterStrings.py AEmayaUsdProxyShapeBaseTemplate.mel diff --git a/plugin/adsk/scripts/mayaUSDRegisterStrings.mel b/plugin/adsk/scripts/mayaUSDRegisterStrings.mel index 098e892e53..f87836a4d9 100644 --- a/plugin/adsk/scripts/mayaUSDRegisterStrings.mel +++ b/plugin/adsk/scripts/mayaUSDRegisterStrings.mel @@ -206,6 +206,9 @@ global proc mayaUSDRegisterStrings() register("kExportRelativeTexturesLbl", "Texture File Paths:"); register("kExportVisibilityAnn", "Exports Maya visibility attributes as USD metadata."); register("kExportVisibilityLbl", "Visibility"); + register("kExportDefaultPrimLbl", "Default Prim"); + register("kExportDefaultPrimNoneLbl", "None"); + register("kExportDefaultPrimAnn", "Default Prim"); // All strings for import dialog: register("kImportAnimationDataLbl", "Animation Data"); diff --git a/plugin/adsk/scripts/mayaUsdTranslatorExport.mel b/plugin/adsk/scripts/mayaUsdTranslatorExport.mel index e46dc6941a..d69efbaf20 100644 --- a/plugin/adsk/scripts/mayaUsdTranslatorExport.mel +++ b/plugin/adsk/scripts/mayaUsdTranslatorExport.mel @@ -16,6 +16,7 @@ // global string $gMayaUsdTranslatorExport_SectionNames[]; +global int $exportAll; proc string stringRemoveSuffix(string $object, string $suffix) { @@ -190,6 +191,14 @@ proc string mayaUsdTranslatorExport_AppendJobContexts(string $currentOptions, st return $currentOptions; } +proc string mayaUsdTranslatorExport_AppendDefaultPrim(string $currentOptions, string $arg) { + if (`optionMenuGrp -exists exportDefaultPrim` == 0) + return $currentOptions; + + string $defaultPrim = `optionMenuGrp -q -value exportDefaultPrim`; + return $currentOptions + ";" + $arg + "=" + $defaultPrim; +} + proc string mayaUsdTranslatorExport_AppendFromPopup(string $currentOptions, string $arg, string $widget) { if (`optionMenuGrp -exists $widget` == 0) return $currentOptions; @@ -242,6 +251,50 @@ proc string mayaUsdTranslatorExport_AppendFromTextField(string $currentOptions, return $currentOptions + ";" + $arg + "=" + $value; } +global proc mayaUsdTranslatorExport_updateDefaultPrimList() { + if ((`checkBoxGrp -exists exportMeshesCheckBox` == 0)||(`checkBoxGrp -exists exportLightsCheckBox` == 0)||(`checkBoxGrp -exists exportCamerasCheckBox` == 0)){ + return; + } + int $excludeMesh = (`checkBoxGrp -q -v1 exportMeshesCheckBox` == 0); + int $excludeLight = (`checkBoxGrp -q -v1 exportLightsCheckBox` == 0); + int $excludeCamera = (`checkBoxGrp -q -v1 exportCamerasCheckBox` == 0); + + string $allItems[]; + global int $exportAll; + if($exportAll){ + $allItems = `python("import mayaUsd_exportHelpers; mayaUsd_exportHelpers.updateDefaultPrimCandidates('" + $excludeMesh + "','" + $excludeLight + "', '" + $excludeCamera +"')")`; + + } else{ + $allItems = `python("import mayaUsd_exportHelpers; mayaUsd_exportHelpers.updateDefaultPrimCandidatesFromSelection('" + $excludeMesh + "','" + $excludeLight + "', '" + $excludeCamera +"')")`; + } + optionMenuGrp -edit -deleteAllItems exportDefaultPrim; + string $menuName = `optionMenuGrp -q -fullPathName exportDefaultPrim`; + menuItem -parent ($menuName + "|OptionMenu") -l `getMayaUsdString("kExportDefaultPrimNoneLbl")`; + for($item in $allItems){ + menuItem -parent ($menuName + "|OptionMenu") -l $item; + } + + // If there are default prim candidates, select the first prim + // Use index 2 here because the first one will always be None + if(size($allItems) > 0){ + optionMenuGrp -e -select 2 exportDefaultPrim; + } + +} + +global proc onExportParentScopeChanged() { + string $rootPrim = `textFieldGrp -q -text parentScopeField`; + optionMenuGrp -edit -deleteAllItems exportDefaultPrim; + string $menuName = `optionMenuGrp -q -fullPathName exportDefaultPrim`; + menuItem -parent ($menuName + "|OptionMenu") -l "None"; + menuItem -parent ($menuName + "|OptionMenu") -l $rootPrim; + if(size($rootPrim) > 0){ + optionMenuGrp -e -select 2 exportDefaultPrim; + } else { + mayaUsdTranslatorExport_updateDefaultPrimList(); + } +} + global proc mayaUsdTranslatorExport_AnimationCB() { if (`checkBoxGrp -exists animationCheckBox` == 0) return; @@ -252,7 +305,8 @@ global proc mayaUsdTranslatorExport_AnimationCB() { global proc mayaUsdTranslatorExport_MeshCB() { if (`checkBoxGrp -exists exportMeshesCheckBox` == 0) return; - + + mayaUsdTranslatorExport_updateDefaultPrimList(); columnLayout -e -enable (`checkBoxGrp -q -v1 exportMeshesCheckBox` == 1) meshExportOptsCol; columnLayout -e -enable (`checkBoxGrp -q -v1 exportMeshesCheckBox` == 1) materialOptsCol; } @@ -431,6 +485,8 @@ global proc mayaUsdTranslatorExport_SetFromOptions(string $currentOptions, int $ int $exportMeshes = 1; int $exportCameras = 1; int $exportLights = 1; + + string $excludeTypes; for ($index = 0; $index < size($optionList); $index++) { tokenize($optionList[$index], "=", $optionBreakDown); if ($optionBreakDown[0] == "exportUVs") { @@ -452,7 +508,7 @@ global proc mayaUsdTranslatorExport_SetFromOptions(string $currentOptions, int $ } else if($optionBreakDown[0] == "excludeExportTypes"){ $contextForcesExcludeTypes = 1; if(mayaUsdTranslatorExport_HasFilteredPrimitive($optionBreakDown[1], "Meshes")){ - $exportMeshes = 0; + $exportMeshes = 0; } if(mayaUsdTranslatorExport_HasFilteredPrimitive($optionBreakDown[1], "Cameras")){ $exportCameras = 0; @@ -489,8 +545,6 @@ global proc mayaUsdTranslatorExport_SetFromOptions(string $currentOptions, int $ floatFieldGrp -e -v1 $frameStride -en1 $enable frameStrideField; } else if ($optionBreakDown[0] == "frameSample") { mayaUsdTranslatorExport_SetTextField($optionBreakDown[1], $enable, "frameSampleField"); - } else if ($optionBreakDown[0] == "parentScope") { - mayaUsdTranslatorExport_SetTextField($optionBreakDown[1], $enable, "parentScopeField"); } else if ($optionBreakDown[0] == "convertMaterialsTo") { mayaUsdTranslatorExport_SetConvertMaterialsToCheckboxes($optionBreakDown[1], $enable, $processJobContext); } else if ($optionBreakDown[0] == "shadingMode" && $optionBreakDown[1] != "useRegistry") { @@ -508,6 +562,8 @@ global proc mayaUsdTranslatorExport_SetFromOptions(string $currentOptions, int $ } else if ($optionBreakDown[0] == "worldspace") { mayaUsdTranslatorExport_SetCheckbox($optionBreakDown[1], $enable, "worldspaceCheckBox"); } + // Removed parent scope because we don't need the parent scope name from last export. Also parent scope created at export + // will be the default default prim, which can be misleading when this field is filled with previous parent scope name. } // We now know if we export nurbs curves or not and if forced by the job context: @@ -516,9 +572,9 @@ global proc mayaUsdTranslatorExport_SetFromOptions(string $currentOptions, int $ } if($contextForcesExcludeTypes == 1){ checkBoxGrp -e -v1 $exportMeshes -en $enable exportMeshesCheckBox; - mayaUsdTranslatorExport_MeshCB(); checkBoxGrp -e -v1 $exportCameras -en $enable exportCamerasCheckBox; checkBoxGrp -e -v1 $exportLights -en $enable exportLightsCheckBox; + mayaUsdTranslatorExport_MeshCB(); } if ($jobContext != "" && $processJobContext == 1) { @@ -625,6 +681,26 @@ global proc int mayaUsdTranslatorExport (string $parent, // 0 otherwise. // { + // check for Export All or Export Selection + // check for export option box window first, if it doesn't exist means user opened the main export window + global string $gOptionBox; + global int $exportAll; + if (`window -exists $gOptionBox`) { + string $title = `window -query -title $gOptionBox`; + if ($title == `uiRes("m_fileOptions.kExportAllOptions")`) { + $exportAll = 1; + } else if ($title == `uiRes("m_fileOptions.kExportSelectionOptions")`) { + $exportAll = 0; + } + } else{ + global string $gOperationMode; + if ($gOperationMode == "ExportAll"){ + $exportAll = 1; + } else{ + $exportAll = 0; + } + } + int $bResult; string $currentOptions; @@ -679,9 +755,11 @@ global proc int mayaUsdTranslatorExport (string $parent, //separator -style "none"; textFieldGrp -l `getMayaUsdString("kExportParentScopeLbl")` -placeholderText `getMayaUsdString("kExportParentScopePht")` - -annotation `getMayaUsdString("kExportParentScopeAnn")` parentScopeField; + -annotation `getMayaUsdString("kExportParentScopeAnn")` -textChangedCommand "onExportParentScopeChanged" parentScopeField; } + optionMenuGrp -l `getMayaUsdString("kExportDefaultPrimLbl")` -annotation `getMayaUsdString("kExportDefaultPrimAnn")` exportDefaultPrim; + separator -style "none"; setParent ..; } @@ -795,8 +873,8 @@ global proc int mayaUsdTranslatorExport (string $parent, frameLayout -label `getMayaUsdString("kExportFrameAdvancedLbl")` -collapsable true -collapse $collapse advancedFrameLayout; separator -style "none"; - checkBoxGrp -label "" -label1 `getMayaUsdString("kExportCamerasLbl")` -annotation `getMayaUsdString("kExportCamerasAnn")` exportCamerasCheckBox; - checkBoxGrp -label "" -label1 `getMayaUsdString("kExportLightsLbl")` -annotation `getMayaUsdString("kExportLightsAnn")` exportLightsCheckBox; + checkBoxGrp -label "" -label1 `getMayaUsdString("kExportCamerasLbl")` -annotation `getMayaUsdString("kExportCamerasAnn")` -cc ("mayaUsdTranslatorExport_updateDefaultPrimList") exportCamerasCheckBox; + checkBoxGrp -label "" -label1 `getMayaUsdString("kExportLightsLbl")` -annotation `getMayaUsdString("kExportLightsAnn")` -cc ("mayaUsdTranslatorExport_updateDefaultPrimList") exportLightsCheckBox; checkBoxGrp -label "" -label1 `getMayaUsdString("kExportVisibilityLbl")` -annotation `getMayaUsdString("kExportVisibilityAnn")` exportVisibilityCheckBox; @@ -854,6 +932,7 @@ global proc int mayaUsdTranslatorExport (string $parent, if (stringArrayContains("output-parentscope", $sectionNames)) { $currentOptions = mayaUsdTranslatorExport_AppendFromTextField($currentOptions, "parentScope", "parentScopeField"); } + $currentOptions = mayaUsdTranslatorExport_AppendDefaultPrim($currentOptions, "defaultPrim"); } if (stringArrayContains("materials", $sectionNames)) { diff --git a/plugin/adsk/scripts/mayaUsd_exportHelpers.py b/plugin/adsk/scripts/mayaUsd_exportHelpers.py new file mode 100644 index 0000000000..caf69dcaa3 --- /dev/null +++ b/plugin/adsk/scripts/mayaUsd_exportHelpers.py @@ -0,0 +1,66 @@ +import maya.cmds as cmds +import re +from mayaUSDRegisterStrings import getMayaUsdString + + +__naturalOrderRE = re.compile(r'([0-9]+)') +def natural_key(item): + return [int(s) if s.isdigit() else s.lower() for s in __naturalOrderRE.split(item)] + +def updateDefaultPrimCandidates(excludeMesh, excludeLight, excludeCamera): + allItems = cmds.ls(assemblies=True) + excludeList = [] + if excludeMesh == "1": + meshes = cmds.ls(type=('mesh'), l=True) + for m in meshes: + excludeList.append(cmds.listRelatives(m, parent=True)[0]) + + if excludeLight == "1": + lights = cmds.ls(type=('light'), l=True) + for l in lights: + excludeList.append(cmds.listRelatives(l, parent=True)[0]) + + if excludeCamera == "1": + cameras = cmds.ls(type=('camera'), l=True) + for c in cameras: + excludeList.append(cmds.listRelatives(c, parent=True)[0]) + else: + cameras = cmds.ls(type=('camera'), l=True) + startup_cameras = [] + for c in cameras: + if cmds.camera(cmds.listRelatives(c, parent=True)[0], startupCamera=True, q=True): + startup_cameras.append(cmds.listRelatives(c, parent=True)[0]) + + allItems = list(set(allItems) - set(startup_cameras)) + + allItems = list(set(allItems) - set(excludeList)) + allItems.sort(key=natural_key) + return allItems + +def updateDefaultPrimCandidatesFromSelection(excludeMesh, excludeLight, excludeCamera): + allSelectedItems = cmds.ls(selection=True) + allItems = set() + for i in allSelectedItems: + path = cmds.listRelatives(i, fullPath=True)[0] + root = path.split("|")[1] + allItems.add(root) + + excludeSet = set() + if excludeMesh == "1": + meshes = cmds.ls(type=('mesh'), l=True) + for m in meshes: + excludeSet.add(cmds.listRelatives(m, parent=True)[0]) + + if excludeLight == "1": + lights = cmds.ls(type=('light'), l=True) + for l in lights: + excludeSet.add(cmds.listRelatives(l, parent=True)[0]) + + if excludeCamera == "1": + cameras = cmds.ls(type=('camera'), l=True) + for c in cameras: + excludeSet.add(cmds.listRelatives(c, parent=True)[0]) + + allItems = list(allItems - excludeSet) + allItems.sort(key=natural_key) + return allItems diff --git a/test/lib/usd/translators/CMakeLists.txt b/test/lib/usd/translators/CMakeLists.txt index e85be1a3ae..68d3d3a174 100644 --- a/test/lib/usd/translators/CMakeLists.txt +++ b/test/lib/usd/translators/CMakeLists.txt @@ -7,6 +7,7 @@ set(TEST_SCRIPT_FILES testUsdExportCamera.py testUsdExportColorSets.py testUsdExportConnected.py + testUsdExportDefaultPrim.py testUsdExportDisplayColor.py testUsdExportEulerFilter.py testUsdExportFileFormat.py diff --git a/test/lib/usd/translators/testUsdExportDefaultPrim.py b/test/lib/usd/translators/testUsdExportDefaultPrim.py new file mode 100644 index 0000000000..184c3c31bc --- /dev/null +++ b/test/lib/usd/translators/testUsdExportDefaultPrim.py @@ -0,0 +1,69 @@ +#!/usr/bin/env mayapy +# +# Copyright 2024 Autodesk +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import os +import unittest + +from maya import cmds +from maya import standalone + +from pxr import Usd +import fixturesUtils + +class testUsdExportMesh(unittest.TestCase): + + @classmethod + def setUpClass(cls): + cls.inputPath = fixturesUtils.setUpClass(__file__) + cls.temp_dir = os.path.abspath('.') + + cls.testFile = os.path.join(cls.inputPath, "UsdExportTypeTest", "UsdExportTypeTest.ma") + cmds.file(cls.testFile, force=True, open=True) + + @classmethod + def tearDownClass(cls): + standalone.uninitialize() + + def testExportDefaultPrim(self): + cmds.file(self.testFile, force=True, open=True) + usdFile = os.path.abspath('UsdExportDefaultPrim.usda') + + cmds.usdExport(mergeTransformAndShape=True, file=usdFile, + shadingMode='none', defaultPrim='pSphere1') + + stage = Usd.Stage.Open(usdFile) + self.assertEqual(stage.GetDefaultPrim().GetName(), 'pSphere1') + + cmds.file(self.testFile, force=True, open=True) + cmds.usdExport(mergeTransformAndShape=True, file=usdFile, + shadingMode='none', defaultPrim='pointLight1') + + stage = Usd.Stage.Open(usdFile) + self.assertEqual(stage.GetDefaultPrim().GetName(), 'pointLight1') + + # Test setting default prim with set parent scope on export + cmds.file(self.testFile, force=True, open=True) + usdFile = os.path.abspath('UsdExportDefaultPrim.usda') + cmds.usdExport(mergeTransformAndShape=True, file=usdFile, + shadingMode='none', parentScope='testScope', defaultPrim = 'testScope') + + stage = Usd.Stage.Open(usdFile) + self.assertEqual(stage.GetDefaultPrim().GetName(), 'testScope') + + +if __name__ == '__main__': + unittest.main(verbosity=2)