// =========================================================================== // 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. // =========================================================================== // // Procedure Name: // contextNurbsCurveToolsMM // // Description: // This procedure creates the popup/marking menu // for NURBS curve tools. See ModelEdMenu. // // Input Arguments: // The parent item to parent the popup menu to. // // Return Value: // None. // /////////////////////////////////////////////////////////////////////////////// // // Utility Methods // /////////////////////////////////////////////////////////////////////////////// proc string shapeFromTransform( string $obj ) { string $shape = $obj; string $type = `nodeType $obj`; if( $type == "transform" ) { string $children[] = `listRelatives -c -s $obj`; if( size($children) ) { $type = `nodeType $children[0]`; $shape = $children[0]; } } return $shape; } proc string shapeFromComponent( string $comp ) { string $buffer[]; tokenize $comp "." $buffer; string $obj = shapeFromTransform( $buffer[0] ); return $obj; } proc int idFromComponent( string $comp ) { int $ret = -1; string $buffer1[]; string $buffer2[]; tokenize $comp "[" $buffer1; if( size($buffer1) > 1 ) { tokenize $buffer1[1] "]" $buffer2; $ret = $buffer2[0]; } return $ret; } proc int componentIsBezier( string $compList[] ) { // Assume Bezier. If any nodeTypes are nurbsCurve, // set false. Only process as Bezier if all components // are Bezier. // int $isBezier = 1; int $nComps = size($compList); int $i; for( $i = 0; $i < $nComps; $i++ ) { string $obj = shapeFromComponent( $compList[$i] ); string $type = `nodeType $obj`; if( $type == "nurbsCurve" ) { $isBezier = 0; break; } } return $isBezier; } proc int objectIsBezier( string $objList[] ) { // Assume Bezier. If any nodeTypes are nurbsCurve, // set false. Only process as Bezier if all objects // are Bezier. // int $isBezier = 1; int $nObjs = size($objList); int $i; for( $i = 0; $i < $nObjs; $i++ ) { string $obj = shapeFromTransform( $objList[$i] ); string $type = `nodeType $obj`; if( $type == "nurbsCurve" ) { $isBezier = 0; break; } } return $isBezier; } /////////////////////////////////////////////////////////////////////////////// // // NURBS Menu Methods // /////////////////////////////////////////////////////////////////////////////// global proc contextNurbsCVToolsMM() { // TODO } global proc contextNurbsEPToolsMM() { // TODO } global proc contextNurbsCurvePointToolsMM() { // Insert Knot // menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kInsertKnot")) -c "InsertKnot" -i "insertKnot.png" -enableCommandRepeat 1 -radialPosition "N" ; menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kInsertKnotOptions")) -optionBox 1 -c "InsertKnotOptions" -i "insertKnot.png" -radialPosition "N" -enableCommandRepeat 1 ; // Detach Curve // menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kDetachCurve")) -c "DetachCurve" -i "detachCurve.png" -radialPosition "S" -enableCommandRepeat 1 ; menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kDetachCurveOptions")) -optionBox true -c "DetachCurveOptions" -i "detachCurve.png" -radialPosition "S" -enableCommandRepeat 1 ; } global proc contextNurbsCurveObjectToolsMM() { // Add Points Tool // string $cmd = "AddPointsTool"; menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kAddPointsLabel")) -annotation (getRunTimeCommandAnnotation($cmd)) -image "curveAddPt.png" -c $cmd -radialPosition "N" ; // Open/Close Curves // menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kOpenCloseCurves")) -c "OpenCloseCurve" -i "closeGeom.png" -radialPosition "NE" -enableCommandRepeat 1 ; menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kOpenCloseCurvesOptions")) -optionBox true -c "OpenCloseCurveOptions" -i "closeGeom.png" -radialPosition "NE" -enableCommandRepeat 1 ; // Reverse Curve // menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kReverseCurve")) -c "ReverseCurve" -i "reverse.png" -radialPosition "E" -enableCommandRepeat 1 ; menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kReverseCurveOptions")) -optionBox true -c "ReverseCurveOptions" -i "reverse.png" -radialPosition "E" -enableCommandRepeat 1 ; // NURBS to Bezier // menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kNurbsToBezier")) -c "nurbsCurveToBezier" -radialPosition "S" -enableCommandRepeat 1 ; } /////////////////////////////////////////////////////////////////////////////// // // Bezier Menu Methods // /////////////////////////////////////////////////////////////////////////////// global proc setBezierAnchorSmoothness( int $smooth ) { bezierAnchorState -sm $smooth; } global proc setBezierAnchorWeighting( int $even ) { bezierAnchorState -ev $even; } global proc contextBezierTangentOptionsMenu() { string $cmdSmooth = "bezierAnchorState -sm 1"; string $cmdBroken = "bezierAnchorState -sm 0"; string $cmdEven = "bezierAnchorState -ev 1"; string $cmdUneven = "bezierAnchorState -ev 0"; menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kBezierTangentOptions")) //-subMenu 1 -tearOff 0 -allowOptionBoxes 0 -postMenuCommandOnce 0 ; menuItem -divider 1; menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kBezierSetAnchorSmooth")) -command $cmdSmooth -enableCommandRepeat 1 ; menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kBezierSetAnchorBroken")) -command $cmdBroken -enableCommandRepeat 1 ; menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kBezierSetAnchorEven")) -command $cmdEven -enableCommandRepeat 1 ; menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kBezierSetAnchorUneven")) -command $cmdUneven -enableCommandRepeat 1 ; setParent -menu ..; } global proc contextBezierAnchorPresetsMenu() { string $cmdBez = "bezierAnchorPreset -p 0;"; string $cmdBezCorner = "bezierAnchorPreset -p 1;"; string $cmdCorner = "bezierAnchorPreset -p 2;"; menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kBezierAnchorPresets")) //-subMenu 1 -tearOff 0 -allowOptionBoxes 0 -postMenuCommandOnce 0 ; menuItem -divider 1; menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kBezierPresetBezier")) -command $cmdBez -enableCommandRepeat 1 ; menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kBezierPresetBezierCorner")) -command $cmdBezCorner -enableCommandRepeat 1 ; menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kBezierPresetCorner")) -command $cmdCorner -enableCommandRepeat 1 ; setParent -menu ..; } global proc contextBezierCVToolsMM() { // Anchor MM // if( `bezierInfo -ias` ) { string $cmdBez = "bezierAnchorPreset -p 0;"; string $cmdBezCorner = "bezierAnchorPreset -p 1;"; string $cmdCorner = "bezierAnchorPreset -p 2;"; // Anchor presets // menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kBezierPresetBezier")) -c $cmdBez -radialPosition "N" ; menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kBezierPresetBezierCorner")) -c $cmdBezCorner -radialPosition "W" ; menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kBezierPresetCorner")) -c $cmdCorner -radialPosition "E" ; // Tangent states // contextBezierTangentOptionsMenu(); } // Tangent MM // else // ( `bezierInfo -its` ) { string $cmdSmooth = "bezierAnchorState -sm 1"; string $cmdBroken = "bezierAnchorState -sm 0"; string $cmdEven = "bezierAnchorState -ev 1"; string $cmdUneven = "bezierAnchorState -ev 0"; // Smooth/Broken Anchor Tangents // menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kBezierSetAnchorSmooth")) -c $cmdSmooth -radialPosition "N" ; menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kBezierSetAnchorBroken")) -c $cmdBroken -radialPosition "S" ; // Even/Uneven Anchor Tangents // menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kBezierSetAnchorEven")) -c $cmdEven -radialPosition "W" ; menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kBezierSetAnchorUneven")) -c $cmdUneven -radialPosition "E" ; } } global proc contextBezierEPToolsMM() { // No Bezier override // contextNurbsEPToolsMM; } global proc contextBezierCurvePointToolsMM() { // No Bezier override // contextNurbsCurvePointToolsMM; } global proc contextBezierCurveObjectToolsMM() { // Bezier Curve Tool // menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kBezierCurveTool")) -c "curveBezierToolScript 4" -radialPosition "N" ; menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kBezierCurveToolSettings")) -optionBox true -c "curveBezierToolScript 3" -radialPosition "N" ; // Open/Close Curves // menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kOpenCloseCurves")) -c "OpenCloseCurve" -i "closeGeom.png" -radialPosition "NE" -enableCommandRepeat 1 ; menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kOpenCloseCurvesOptions")) -optionBox true -c "OpenCloseCurveOptions" -i "closeGeom.png" -radialPosition "NE" -enableCommandRepeat 1 ; // Reverse Curve // menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kReverseCurve")) -c "ReverseCurve" -i "reverse.png" -radialPosition "E" -enableCommandRepeat 1 ; menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kReverseCurveOptions")) -optionBox true -c "ReverseCurveOptions" -i "reverse.png" -radialPosition "E" -enableCommandRepeat 1 ; // Bezier to NURBS // menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kBezierToNurbs")) -c "bezierCurveToNurbs" -radialPosition "S" -enableCommandRepeat 1 ; } global proc contextCreateBezierCurveToolMM() { string $cmdBez = "bezierAnchorPreset -p 0;"; string $cmdBezCorner = "bezierAnchorPreset -p 1;"; string $cmdCorner = "bezierAnchorPreset -p 2;"; // Anchor presets // menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kBezierPresetBezier")) -c $cmdBez -radialPosition "N" ; menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kBezierPresetBezierCorner")) -c $cmdBezCorner -radialPosition "W" ; menuItem -label (uiRes("m_contextNurbsCurveToolsMM.kBezierPresetCorner")) -c $cmdCorner -radialPosition "E" ; } /////////////////////////////////////////////////////////////////////////////// // // Entry point // /////////////////////////////////////////////////////////////////////////////// global proc int contextNurbsCurveToolsMM(string $parent) { if (`popupMenu -query -exists $parent`) { popupMenu -edit -deleteAllItems $parent; setParent -menu $parent; global string $gBezierCurveTool; if( `currentCtx` == $gBezierCurveTool ) { contextCreateBezierCurveToolMM; return 1; } string $selection[] = `ls -long -selection`; // // CV is selected // string $cvList[] = `filterExpand -fullPath true -expand false -selectionMask 28 $selection`; if( size($cvList) ) { int $isBezier = componentIsBezier( $cvList ); if( $isBezier ) { contextBezierCVToolsMM; } else { contextNurbsCVToolsMM; } return 1; } // // Curve Edit Point is selected // string $editList[] = `filterExpand -fullPath true -expand false -selectionMask 30 $selection`; if( size($editList) ) { int $isBezier = componentIsBezier( $editList ); if( $isBezier ) { contextBezierEPToolsMM; } else { contextNurbsEPToolsMM; } return 1; } // // Curve Parm Point is selected // string $parmList[] = `filterExpand -fullPath true -expand false -selectionMask 39 $selection`; if( size($parmList) ) { int $isBezier = componentIsBezier( $parmList ); if( $isBezier ) { contextBezierCurvePointToolsMM; } else { contextNurbsCurvePointToolsMM; } return 1; } // // Curve object is selected. // string $curveObjectList[] = `filterExpand -fullPath true -expand false -selectionMask 9 $selection`; if( size($curveObjectList) ) { int $isBezier = objectIsBezier( $curveObjectList ); if( $isBezier ) { contextBezierCurveObjectToolsMM; } else { contextNurbsCurveObjectToolsMM; } return 1; } } return 0; }