Skip to content

Commit

Permalink
Merge pull request #3572 from Autodesk/samuelliu-adsk/EMSUSD-767/set_…
Browse files Browse the repository at this point in the history
…default_prim_on_export

EMSUSD-767 - Set the default prim on export
  • Loading branch information
seando-adsk authored Jan 29, 2024
2 parents 2514864 + e246b8f commit 2fb0318
Show file tree
Hide file tree
Showing 15 changed files with 250 additions and 13 deletions.
1 change: 1 addition & 0 deletions lib/mayaUsd/commands/Readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -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: (`<chaser name>`, `<argument name>`, `<argument value>`). 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.|
Expand Down
5 changes: 4 additions & 1 deletion lib/mayaUsd/commands/baseExportCommand.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
1 change: 1 addition & 0 deletions lib/mayaUsd/commands/baseExportCommand.h
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down
3 changes: 2 additions & 1 deletion lib/mayaUsd/fileio/functorPrimWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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());

Expand Down
3 changes: 3 additions & 0 deletions lib/mayaUsd/fileio/jobs/jobArgs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<std::string>(userArgs, UsdMayaJobExportArgsTokens->chaser))
, allChaserArgs(_ChaserArgs(userArgs, UsdMayaJobExportArgsTokens->chaserArgs))
, customLayerData(_CustomLayerData(userArgs, UsdMayaJobExportArgsTokens->customLayerData))
Expand Down Expand Up @@ -1017,6 +1018,7 @@ const VtDictionary& UsdMayaJobExportArgs::GetDefaultDictionary()
d[UsdMayaJobExportArgsTokens->customLayerData] = std::vector<VtValue>();
d[UsdMayaJobExportArgsTokens->metersPerUnit] = 0.0;
d[UsdMayaJobExportArgsTokens->excludeExportTypes] = std::vector<VtValue>();
d[UsdMayaJobExportArgsTokens->defaultPrim] = std::string();

// plugInfo.json site defaults.
// The defaults dict should be correctly-typed, so enable
Expand Down Expand Up @@ -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;
Expand Down
2 changes: 2 additions & 0 deletions lib/mayaUsd/fileio/jobs/jobArgs.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ TF_DECLARE_PUBLIC_TOKENS(
(compatibility) \
(defaultCameras) \
(defaultMeshScheme) \
(defaultPrim) \
(defaultUSDFormat) \
(eulerFilter) \
(exportBlendShapes) \
Expand Down Expand Up @@ -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<std::string, std::string>;
const std::vector<std::string> chaserNames;
Expand Down
5 changes: 4 additions & 1 deletion lib/mayaUsd/fileio/jobs/writeJob.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
4 changes: 3 additions & 1 deletion lib/mayaUsd/fileio/primWriterArgs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
}

Expand Down
4 changes: 3 additions & 1 deletion lib/mayaUsd/fileio/primWriterArgs.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -70,6 +71,7 @@ class UsdMayaPrimWriterArgs
MDagPath _dagPath;
bool _exportRefsAsInstanceable;
TfToken::Set _excludeExportTypes;
std::string _defaultPrim;
};

PXR_NAMESPACE_CLOSE_SCOPE
Expand Down
1 change: 1 addition & 0 deletions plugin/adsk/scripts/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
list(APPEND scripts_src
mayaUsdTranslatorImport.mel
mayaUsdTranslatorExport.mel
mayaUsd_exportHelpers.py
mayaUSDRegisterStrings.mel
mayaUSDRegisterStrings.py
AEmayaUsdProxyShapeBaseTemplate.mel
Expand Down
3 changes: 3 additions & 0 deletions plugin/adsk/scripts/mayaUSDRegisterStrings.mel
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down
95 changes: 87 additions & 8 deletions plugin/adsk/scripts/mayaUsdTranslatorExport.mel
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
//

global string $gMayaUsdTranslatorExport_SectionNames[];
global int $exportAll;

proc string stringRemoveSuffix(string $object, string $suffix)
{
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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;
}
Expand Down Expand Up @@ -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") {
Expand All @@ -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;
Expand Down Expand Up @@ -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") {
Expand All @@ -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:
Expand All @@ -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) {
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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 ..;
}
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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)) {
Expand Down
66 changes: 66 additions & 0 deletions plugin/adsk/scripts/mayaUsd_exportHelpers.py
Original file line number Diff line number Diff line change
@@ -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
Loading

0 comments on commit 2fb0318

Please sign in to comment.