Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

EMSUSD-767 - Set the default prim on export #3572

Merged
merged 5 commits into from
Jan 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 @@ -207,6 +207,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
Loading