// =========================================================================== // Copyright 2018 Autodesk, Inc. All rights reserved. // // Use of this software is subject to the terms of the Autodesk license // agreement provided at the time of installation or download, or which // otherwise accompanies this software in either electronic or hard copy form. // =========================================================================== // // Description: // // performPolyForceUV performs one of the many available // UV editing functions on the polys. // // Detailed description of the arguments for this function // are described at the definition of this function. (EOF) // proc string argArrayAsString (string $args[]) { string $result = "{"; string $cast = "(string)"; for ($arg in $args) { $result += ($cast + "\"" + $arg + "\""); $cast = ", "; } return ($result + "}"); } // // Procedure Name: // setOptionVars // // Description: // Initialize the option values. // // Input Arguments: // forceFactorySettings - whether to set the options to default values. // operation - operation to set option vars for: // 0 = Normalize // 1 = Flip // 2 = Camera // 3 = Unitize // // Return Value: // None. // proc setOptionVars(int $forceFactorySettings, int $operation) { switch ($operation) { case 0: // Normalize // CollectiveOrSeparate // if ($forceFactorySettings || !`optionVar -exists PolyForceUVNormalizeCollectiveOrSeparate`) { optionVar -intValue PolyForceUVNormalizeCollectiveOrSeparate 1; } // PreserveAspectRatio // if ($forceFactorySettings || !`optionVar -exists PolyForceUVPreserveAspectRatio`) { optionVar -intValue PolyForceUVPreserveAspectRatio 0; } // Center on closest tile // if ($forceFactorySettings || !`optionVar -exists PolyNormalizeCenterOnClosestTile`) { optionVar -intValue PolyNormalizeCenterOnClosestTile 1; } // Normalize direction // if ($forceFactorySettings || !`optionVar -exists PolyNormalizeDirection`) { optionVar -intValue PolyNormalizeDirection 0; } break; case 1: // Flip // Flip // ~~~~~ // Flip Direction // if ($forceFactorySettings || !`optionVar -exists PolyForceUVFlipDirection`) { optionVar -intValue PolyForceUVFlipDirection 1; } // Space (Pivot/Selection Center/Global) // Default: Pivot if ($forceFactorySettings || !`optionVar -exists PolyForceUVSpace`) { optionVar -intValue PolyForceUVSpace 1; } // Cut UV Perimeter (True/False) // if ($forceFactorySettings || !`optionVar -exists PolyForceUVFlipCutUVPerimeter`) { optionVar -intValue PolyForceUVFlipCutUVPerimeter 1; } break; case 2: // Camera // -cm/-createMap if ($forceFactorySettings || !`optionVar -exists PolyForceUVCreateMapcamera`) { optionVar -intValue PolyForceUVCreateMapcamera 0; } // -uvs/-uvSetName if ($forceFactorySettings || !`optionVar -exists PolyForceUVSetNamecamera`) { optionVar -stringValue PolyForceUVSetNamecamera "uvSet1"; } break; case 3: // Unitize // -cm/-createMap if ($forceFactorySettings || !`optionVar -exists PolyForceUVCreateMapunitize`) { optionVar -intValue PolyForceUVCreateMapunitize 0; } // -uvs/-uvSetName if ($forceFactorySettings || !`optionVar -exists PolyForceUVSetNameunitize`) { optionVar -stringValue PolyForceUVSetNameunitize "uvSet1"; } break; } } // // Procedure Name: // polyForceUVSetup // // Description: // Update the state of the option box UI to reflect the option values. // // Input Arguments: // parent - Top level parent layout of the option box UI. // Required so that UI object names can be // successfully resolved. // // forceFactorySettings - Whether the option values should be set to // default values. // // operation - The operation to setup for: // 0 = Normalize // 1 = Flip // 2 = Camera // 3 = Unitize // // Return Value: // None. // global proc polyForceUVSetup(string $parent, int $forceFactorySettings, int $operation) { // Retrieve the option settings // setOptionVars($forceFactorySettings, $operation); setParent $parent; // Query the optionVar's and set the values into the controls. switch ($operation) { case 0: // Normalize radioButtonGrp -edit -select `optionVar -query PolyForceUVNormalizeCollectiveOrSeparate` PolyForceUVNormalizeCollectiveOrSeparate; checkBoxGrp -edit -value1 `optionVar -query PolyForceUVPreserveAspectRatio` PolyForceUVPreserveAspectRatio; checkBoxGrp -edit -value1 `optionVar -query PolyNormalizeCenterOnClosestTile` CenterOnClosestTile; radioButtonGrp -edit -select (`optionVar -query PolyNormalizeDirection` + 1) PolyForceUVNormalizeDirection; break; case 1: // Flip radioButtonGrp -edit -select `optionVar -query PolyForceUVFlipDirection` PolyForceUVFlipDirection; radioButtonGrp -edit -select `optionVar -query PolyForceUVSpace` PolyForceUVSpace; $val = `optionVar -query PolyForceUVFlipCutUVPerimeter`; checkBoxGrp -edit -value1 $val PolyForceUVFlipCutUVPerimeter; break; case 2: // Camera $val = `optionVar -query PolyForceUVCreateMapcamera`; checkBoxGrp -edit -value1 $val PolyForceUVCreateMapcamera; if ($val == 1) disable -value false PolyForceUVSetNamecamera; else disable -value true PolyForceUVSetNamecamera; textFieldGrp -edit -text `optionVar -query PolyForceUVSetNamecamera` PolyForceUVSetNamecamera; break; case 3: // Unitize $val = `optionVar -query PolyForceUVCreateMapunitize`; checkBoxGrp -edit -value1 $val PolyForceUVCreateMapunitize; if ($val == 1) disable -value false PolyForceUVSetNameunitize; else disable -value true PolyForceUVSetNameunitize; textFieldGrp -edit -text `optionVar -query PolyForceUVSetNameunitize` PolyForceUVSetNameunitize; break; } } // // Procedure Name: // polyForceUVCallback // // Description: // Update the option values with the current state of the option box UI. // // Input Arguments: // parent - Top level parent layout of the option box UI. Required so // that UI object names can be successfully resolved. // // doIt - Whether the command should execute. // // operation - The operation: // 0 = Normalize // 1 = Flip // 2 = Camera // 3 = Unitize // // Return Value: // None. // global proc polyForceUVCallback(string $args[], string $uvSetName, string $parent, int $doIt, int $operation) { setParent $parent; string $function; // Set the optionVar's from the control values, and then // perform the command. switch ($operation) { case 0: // Normalize optionVar -intValue PolyForceUVNormalizeCollectiveOrSeparate `radioButtonGrp -query -select PolyForceUVNormalizeCollectiveOrSeparate`; optionVar -intValue PolyForceUVPreserveAspectRatio `checkBoxGrp -query -value1 PolyForceUVPreserveAspectRatio`; optionVar -intValue PolyNormalizeCenterOnClosestTile `checkBoxGrp -query -value1 CenterOnClosestTile`; optionVar -intValue PolyNormalizeDirection (`radioButtonGrp -query -select PolyForceUVNormalizeDirection` - 1); $function = "normalize"; break; case 1: // Flip optionVar -intValue PolyForceUVFlipDirection `radioButtonGrp -query -select PolyForceUVFlipDirection`; optionVar -intValue PolyForceUVSpace `radioButtonGrp -query -select PolyForceUVSpace`; optionVar -intValue PolyForceUVFlipCutUVPerimeter `checkBoxGrp -query -value1 PolyForceUVFlipCutUVPerimeter`; $function = "flip"; break; case 2: // Camera optionVar -intValue PolyForceUVCreateMapcamera `checkBoxGrp -query -value1 PolyForceUVCreateMapcamera`; optionVar -stringValue PolyForceUVSetNamecamera `textFieldGrp -query -tx PolyForceUVSetNamecamera`; $function = "camera"; break; case 3: // Unitize optionVar -intValue PolyForceUVCreateMapunitize `checkBoxGrp -query -value1 PolyForceUVCreateMapunitize`; optionVar -stringValue PolyForceUVSetNameunitize `textFieldGrp -query -tx PolyForceUVSetNameunitize`; $function = "unitize"; break; } if ($doIt) { $args[0] = "0"; $args[1] = $function; performPolyForceUVArgList 1 $args $uvSetName; string $tmpCmd = "performPolyForceUV \"" + $function + "\" 0"; string $tmpLabel = "UV " + $function; addToRecentCommandQueue $tmpCmd $tmpLabel; } } // // Procedure Name: // polyForceUVOptions // // Description: // Construct the option box UI. Involves accessing the standard option // box and customizing the UI accordingly. // // Input Arguments: // None. // // Return Value: // None. // proc polyForceUVOptions(string $args[], string $uvSetName, int $operation) { // Global template variables for form spacing global int $gOptionBoxTemplateFrameSpacing; global int $gOptionBoxTemplateDescriptionMarginWidth; string $commandName = "polyForceUV"; string $callback = ($commandName + "Callback " + argArrayAsString ($args) + " \"" + $uvSetName + "\""); string $setup = ($commandName + "Setup"); string $layout = getOptionBox(); setParent $layout; setOptionBoxCommandName($commandName); setUITemplate -pushTemplate OptionBoxTemplate; waitCursor -state 1; // Form layout string $parent = `formLayout`; // Settings frame string $settingsFrame = `frameLayout -label (uiRes("m_performPolyForceUVArgList.kSettingsFrame"))`; columnLayout; switch ($operation) { case 0: // Normalize radioButtonGrp -numberOfRadioButtons 3 -vertical -select 1 -label (uiRes("m_performPolyForceUVArgList.kNormalizeDirection")) -label1 (uiRes("m_performPolyForceUVArgList.kUV")) -label2 (uiRes("m_performPolyForceUVArgList.kU")) -label3 (uiRes("m_performPolyForceUVArgList.kV")) PolyForceUVNormalizeDirection; separator -style "none"; radioButtonGrp -label (uiRes("m_performPolyForceUVArgList.kNormalizeRadio")) -numberOfRadioButtons 2 -label1 (uiRes("m_performPolyForceUVArgList.kCollectively")) -label2 (uiRes("m_performPolyForceUVArgList.kEachFaceSeparately")) -vertical PolyForceUVNormalizeCollectiveOrSeparate; separator -style "none"; checkBoxGrp -label1 (uiRes("m_performPolyForceUVArgList.kPreserveAspectRatio")) -numberOfCheckBoxes 1 PolyForceUVPreserveAspectRatio; separator -style "none"; checkBoxGrp -label1 (uiRes("m_performPolyForceUVArgList.kClosestTile")) -numberOfCheckBoxes 1 CenterOnClosestTile; break; case 1: // Flip radioButtonGrp -label (uiRes("m_performPolyForceUVArgList.kDirection")) -numberOfRadioButtons 2 -label1 (uiRes("m_performPolyForceUVArgList.kHorizontal")) -label2 (uiRes("m_performPolyForceUVArgList.kVertical")) -vertical PolyForceUVFlipDirection; separator -style "none"; radioButtonGrp -label (uiRes("m_performPolyForceUVArgList.kCoordinate")) -numberOfRadioButtons 3 -label1 (uiRes("m_performPolyForceUVArgList.kPivot")) -label2 (uiRes("m_performPolyForceUVArgList.kSelectionCenter")) -label3 (uiRes("m_performPolyForceUVArgList.kGlobal")) -vertical PolyForceUVSpace; checkBoxGrp -label (uiRes("m_performPolyForceUVArgList.kCutUVPerimeter")) -numberOfCheckBoxes 1 PolyForceUVFlipCutUVPerimeter; break; case 2: // Camera checkBoxGrp -label1 (uiRes("m_performPolyForceUVArgList.kCreateNewUVSet")) -on1("disable -value false PolyForceUVSetNamecamera") -of1("disable -value true PolyForceUVSetNamecamera") PolyForceUVCreateMapcamera; textFieldGrp -label (uiRes("m_performPolyForceUVArgList.kUVSetName")) PolyForceUVSetNamecamera; break; case 3: // Unitize checkBoxGrp -label1 (uiRes("m_performPolyForceUVArgList.kCreateNewUVSetUnitize")) -on1 ("disable -value false PolyForceUVSetNameunitize") -of1 ("disable -value true PolyForceUVSetNameunitize") PolyForceUVCreateMapunitize; textFieldGrp -label (uiRes("m_performPolyForceUVArgList.kUVSetNameUnitize")) PolyForceUVSetNameunitize; break; } setParent $parent; // frameLayout setParent ..; // formLayout // Attach frame to form layout formLayout -edit -attachForm $settingsFrame "top" $gOptionBoxTemplateFrameSpacing -attachForm $settingsFrame "left" $gOptionBoxTemplateFrameSpacing -attachForm $settingsFrame "right" $gOptionBoxTemplateFrameSpacing -attachNone $settingsFrame "bottom" $parent; waitCursor -state 0; setUITemplate -popTemplate; string $applyBtn = getOptionBoxApplyBtn(); button -edit -label (uiRes("m_performPolyForceUVArgList.kApply")) -command ($callback + " " + $parent + " " + 1 + " " + $operation) $applyBtn; string $saveBtn = getOptionBoxSaveBtn(); button -edit -command ($callback + " " + $parent + " " + 0 + " " + $operation + "; hideOptionBox") $saveBtn; string $resetBtn = getOptionBoxResetBtn(); button -edit -command ($setup + " " + $parent + " " + 1 + " " + $operation) $resetBtn; string $optionsTitle; string $optionsHelpTag; switch ($operation) { case 0: $optionsTitle = (uiRes("m_performPolyForceUVArgList.kNormalizeUVsOptions")); $optionsHelpTag = "NormalizeUVs"; break; case 1: $optionsTitle = (uiRes("m_performPolyForceUVArgList.kFlipUVsOptions")); $optionsHelpTag = "FlipUVs"; break; case 2: $optionsTitle = (uiRes("m_performPolyForceUVArgList.kCameraMappingOptions")); $optionsHelpTag = "CreateUVsBasedonCamera"; break; case 3: $optionsTitle = (uiRes("m_performPolyForceUVArgList.kUnitizeUVsOptions")); $optionsHelpTag = "UnitizeUVs"; break; } setOptionBoxTitle( $optionsTitle ); setOptionBoxHelpTag( $optionsHelpTag ); eval (($setup + " " + $parent + " " + 0 + " " + $operation)); showOptionBox(); } // // Procedure Name: // polyForceUVHelp // // Description: // Return a short description about this command. // // Input Arguments: // None. // // Return Value: // string. // proc string polyForceUVHelp() { return " Command: polyForceUV - Edit/Create UVs on the faces\n" + "Selection: Polygon faces"; } proc string setCurrentCmd(int $forceCreate, string $uvSetName, int $operation) { string $setCurrent = ""; string $function; switch( $operation ){ case 2: // Camera $function = "camera"; break; case 3: // Unitize $function = "unitize"; break; } if (($function == "camera") || ($function == "unitize")) { int $createNewMap = `optionVar -query ("PolyForceUVCreateMap" + $function)`; string $mapname = `optionVar -query ("PolyForceUVSetName" + $function)`; if ($createNewMap || $forceCreate) { if ($forceCreate) $mapname = $uvSetName; if (size($mapname)) $setCurrent = "polyUVSet -luv;"; } } return $setCurrent; } // // Procedure Name: // assembleCmd // // Description: // Construct the command that will apply the option box values. // // Input Arguments: // None. // // Return Value: // None. // proc string assembleCmd(int $forceCreate, string $uvSetName, int $operation) { string $cmd = "polyForceUV "; setOptionVars(false, $operation); int $createNewMap; string $mapname; switch ($operation) { case 0: // Normalize $cmd = "polyNormalizeUV "; //******* <--- Note command change!! if (`optionVar -query PolyForceUVNormalizeCollectiveOrSeparate` == 1) $cmd += "-normalizeType 1 "; // collective else $cmd += "-normalizeType 0 "; // separate if (`optionVar -query PolyForceUVPreserveAspectRatio` == 1) $cmd += "-preserveAspectRatio on "; else $cmd += "-preserveAspectRatio off "; if (`optionVar -query PolyNormalizeCenterOnClosestTile` == 1) $cmd += "-centerOnTile on "; else $cmd += "-centerOnTile off "; int $normalizeDirection = `optionVar -query PolyNormalizeDirection`; $cmd += ("-normalizeDirection " + $normalizeDirection + " "); break; case 1: // Flip $cmd = "polyFlipUV "; //******* <--- Note command change!! if (`optionVar -query PolyForceUVFlipDirection` == 1) $cmd += "-flipType 0 "; // horizontal else $cmd += "-flipType 1 "; // vertical if (`optionVar -query PolyForceUVSpace` == 1 || `optionVar -query PolyForceUVSpace` == 2) { $cmd += "-local on "; if (`optionVar -query PolyForceUVSpace` == 1) { float $pivot[] = uvTkGetUVPivot(); $cmd += "-usePivot true -pivotU " + $pivot[0] + " -pivotV " + $pivot[1] + " "; } else $cmd += "-usePivot false "; } else $cmd += "-local off "; if (`optionVar -query PolyForceUVFlipCutUVPerimeter` == 1) $cmd += "-cutUV 1 "; else $cmd += "-cutUV 0 "; break; case 2: // Camera $cmd = "polyProjection -type Planar -md p "; $createNewMap = `optionVar -q PolyForceUVCreateMapcamera`; $mapname = `optionVar -q PolyForceUVSetNamecamera`; if ($createNewMap || $forceCreate) { if ($forceCreate) $mapname = $uvSetName; if (size($mapname)) { $cmd = $cmd + ("-cm on -uvSetName " + $mapname); } } break; case 3: // Unitize $cmd += "-unitize "; $createNewMap = `optionVar -q PolyForceUVCreateMapunitize`; $mapname = `optionVar -q PolyForceUVSetNameunitize`; if ($createNewMap || $forceCreate) { if ($forceCreate) $mapname = $uvSetName; if (size($mapname)) { $cmd = $cmd + ("-cm on -uvSetName " + $mapname); } } break; } return $cmd; } proc concatArray(string $res[], string $to_add[]) { for($i in $to_add) $res[size($res)] = $i; } global proc string performPolyForceUVArgList(string $version, string $args[], string $uvSetName) // // Input Arguments: // $version: The version of this option box. Used to know how to // interpret the $args array. // "1" : $action, $primitive, $selectCmd // // $args // Version 1 // [0] $action 0 : Execute the command. // 1 : Show the option box dialog. // 2 : Return the command. // [1] $function The type of primitive to create // [2] $selectCmd The command to issue to determine which objects // to affect // [3] $forceCreate Whether or not to force creation of a new UV set // // $uvSetName: The requested name for a new uv set // // Return Value: // The string to execute for this option box. // { int $versionNum = $version; int $action = $args[0]; string $function = $args[1]; string $selectCmd = $args[2]; int $forceCreate = $args[3]; int $operation; switch ($function){ case "normalize": $operation = 0; break; case "flip": $operation = 1; break; case "camera": $operation = 2; break; case "unitize": $operation = 3; break; } // Required for Camera projection. string $sel[], $preFilteredSel[]; string $objects[]; string $primitive = "Planar"; string $selObjects[], $selFaces[]; string $newCmd, $object; string $cmd = ""; switch ($action) { // Execute the command. // case 0: // Retrieve the option settings // setOptionVars(false, $operation); if ($operation != 2) // Not camera { string $originalSelection[] = `ls -sl`; float $origPivot[]; string $mesh = ""; if($operation == 1) { $origPivot = uvTkGetUVPivot(); // get mesh if (size($origPivot) == 2) { string $buffer[]; tokenize $originalSelection[0] "." $buffer; $mesh = $buffer[0]; // Set pivot for flip undo. setAttr ($mesh + ".uvPivot") $origPivot[0] $origPivot[1]; } } // Get the command. $cmd = `assembleCmd $forceCreate $uvSetName $operation`; $objects = `eval ($selectCmd)`; string $resultantSelection[] = rearrangeSelection($objects); int $i; for( $i = 0; $i < size($resultantSelection); $i++ ) { $newCmd = ""; $object = $resultantSelection[$i]; if ($operation == 3 && `optionVar -q polyAutoConvertAction`) // unitize { $selObjects = `eval("filterExpand -ex false -sm 12 " + $object)`; $selFaces = `eval("filterExpand -ex false -sm 34 " + $object)`; if (size($selObjects) == 0 && size($selFaces) == 0) { // Try to convert the selection to faces $selFaces = `eval("polyListComponentConversion -fv -fe -fuv -fvf -tf " + $object)`; if (size($selFaces) != 0) { $newCmd = $cmd; for ($j = 0; $j < size($selFaces); $j++) $newCmd += (" " + $selFaces[$j]); } } else { $newCmd = $cmd + $object; } } else { $newCmd = $cmd + $object; } if ($newCmd != "") evalEcho($newCmd); } // Set current string $setCurrent = `setCurrentCmd $forceCreate $uvSetName $operation`; evalEcho $setCurrent; // Restore original selection if (size($originalSelection[0]) > 0) { select -r $originalSelection; } else { select -clear; } if($operation == 1 && size($origPivot) == 2 && $mesh != "") { // Set pivot to original, since reselection will change pivot position to center. setAttr ($mesh + ".uvPivot") $origPivot[0] $origPivot[1]; } } else { // Camera/Perspective projection. // Get the selection and check if they are faces.. $objects = `eval ($selectCmd)`; $sel=`filterExpand -ex false -sm 34 $objects`; if (size($sel) > 0) { // If selection contains faces, use them $preFilteredSel=$sel; } else { // Try to convert the selection to faces (if the flag is turned on) $preFilteredSel=`polyCheckSelection ("poly"+$primitive+"Projection") f 0`; string $expSel[]; $expSel = `filterExpand -ex false -sm 34 `; if (size($expSel) <= 0) { // If the flag is turned off, suggest to turn it on, warning (uiRes("m_performPolyForceUVArgList.kTurnPolyProjectionOnWarn")); return $cmd; } } if (size($preFilteredSel) != 0) { setOptionVars(false, $operation); int $index=0; string $oldnodes[]=`ls -sl -dep`; if (size($oldnodes) > 0) select -d $oldnodes; string $totalSel[]; // what is selected ? concatArray($totalSel, `ls -sl`); // Get the command. // $cmd = `assembleCmd $forceCreate $uvSetName $operation`; for ($i = 0; $i < size($preFilteredSel); $i++) $cmd += (" " + $preFilteredSel[$i]); evalEcho($cmd); // Set current string $setCurrent = `setCurrentCmd $forceCreate $uvSetName $operation`; evalEcho $setCurrent; // Set selection evalEcho `select -r $totalSel`; // clear $sel; // global string $gPolyLastTool; // $gPolyLastTool=""; // setToolTo ShowManips; }else warning (uiRes("m_performPolyForceUVArgList.kInvokePolyProjectionCommand")); } break; // Show the option box. // case 1: polyForceUVOptions $args $uvSetName $operation; break; // Return the command string. // case 2: // Retrieve the option settings. // setOptionVars (false, $operation); // Get the command. // $cmd = `assembleCmd $forceCreate $uvSetName $operation`; // Set current $cmd += `setCurrentCmd $forceCreate $uvSetName $operation`; break; } return $cmd; }