1/****************************************************************************** 2 NintendoWare for CTR Maya Plugin 3 4 File: NW4C_SetUserData.mel 5 Description: set user data 6 Date: 2010/10/14 7 8 Copyright (C)2009-2011 Nintendo/HAL Laboratory, Inc. All rights reserved. 9******************************************************************************/ 10 11// UpdateWindowT OpenInputWindow 12// InputApplyCB DeleteBtnCB MoveUpBtnCB 13 14/****************************************************************************** 15 user data size 16******************************************************************************/ 17global proc int nw4cSetUserData_Get_UserDataSize(string $node) 18{ 19 return (`attributeQuery -n $node -ex "nw4cUserDataSize"`) ? 20 `getAttr ($node + ".nw4cUserDataSize")` : 0; 21} 22 23global proc nw4cSetUserData_Add_UserDataSize(string $node) 24{ 25 if (!`attributeQuery -n $node -ex "nw4cUserDataSize"`) 26 { 27 addAttr -ln "nw4cUserDataSize" -at "short" -dv 0 -h 1 $node; 28 } 29} 30 31global proc nw4cSetUserData_Set_UserDataSize(string $node, int $val) 32{ 33 nw4cSetUserData_Add_UserDataSize($node); 34 setAttr ($node + ".nw4cUserDataSize") $val; 35} 36 37/****************************************************************************** 38 user data value 39******************************************************************************/ 40global proc string nw4cSetUserData_Get_UserDataValue(string $node, int $index) 41{ 42 if (!`attributeQuery -n $node -ex "nw4cUserData"` || 43 $index >= nw4cSetUserData_Get_UserDataSize($node)) 44 { 45 return ""; 46 } 47 string $val = `getAttr ($node + ".nw4cUserData[" + $index + "]")`; 48 return $val; 49} 50 51global proc nw4cSetUserData_Add_UserDataValue(string $node) 52{ 53 if (!`attributeQuery -n $node -ex "nw4cUserData"`) 54 { 55 addAttr -m -ln "nw4cUserData" -dt "string" -h 1 $node; 56 } 57} 58 59global proc nw4cSetUserData_Set_UserDataValue(string $node, int $index, string $val) 60{ 61 nw4cSetUserData_Add_UserDataValue($node); 62 setAttr -typ "string" ($node + ".nw4cUserData[" + $index + "]") $val; 63 //trace ("set: " + $node + ".data[" + $index + "] = " + $val); 64} 65 66global proc int nw4cSetUserData_Get_AllUserDataValue(string $values[], string $node) 67{ 68 clear($values); 69 int $size = nw4cSetUserData_Get_UserDataSize($node); 70 for ($index = 0; $index < $size; ++$index) 71 { 72 $values[$index] = nw4cSetUserData_Get_UserDataValue($node, $index); 73 } 74 return $size; // return user data size 75} 76 77/****************************************************************************** 78 is user data name is unique 79******************************************************************************/ 80proc int IsUserDataNameIsUnique(string $dataValues[], string $checkName, 81 int $editIndex) 82{ 83 int $dataSize = size($dataValues); 84 int $index; 85 for ($index = 0; $index < $dataSize; ++$index) 86 { 87 if ($index == $editIndex) 88 { 89 continue; 90 } 91 string $name = match("[^\"]*\"", $dataValues[$index]); 92 if (size($name) >= 2) 93 { 94 if (substring($name, 1, size($name) - 1) == $checkName) 95 { 96 return false; 97 } 98 } 99 } 100 return true; 101} 102 103/****************************************************************************** 104 decode user data value 105 106 $words[0]: name 107 $words[1]: type (0, 1, 2) 108 $words[2]: size 109 $words[3]: value 110******************************************************************************/ 111proc DecodeUserDataValue(string $words[], string $userData) 112{ 113 string $name = match("[^\"]*\"", $userData); 114 string $typeStr = "0"; 115 string $sizeStr = "0"; 116 string $valStr = ""; 117 118 int $nameSize = size($name); 119 if ($nameSize <= 1) 120 { 121 $name = "error"; 122 } 123 else 124 { 125 $name = substring($name, 1, $nameSize - 1); 126 $userData = substring($userData, $nameSize + 1, size($userData)); 127 if (size(match("^i", $userData)) > 0) 128 { 129 $typeStr = "1"; 130 } 131 else if (size(match("^f", $userData)) > 0) 132 { 133 $typeStr = "2"; 134 } 135 $userData = substring($userData, 3, size($userData)); 136 $sizeStr = match("[0-9]+", $userData); 137 $valStr = substring($userData, size($sizeStr) + 2, size($userData)); 138 } 139 140 $words[0] = $name; 141 $words[1] = $typeStr; 142 $words[2] = $sizeStr; 143 $words[3] = $valStr; 144} 145 146/****************************************************************************** 147 get list string from user data value 148******************************************************************************/ 149proc string GetListStringFromUserDataValue(string $userData) 150{ 151 //----------------------------------------------------------------------------- 152 // decode 153 string $words[4]; 154 DecodeUserDataValue($words, $userData); 155 string $name = $words[0]; 156 int $type = (int)$words[1]; 157 string $sizeStr = $words[2]; 158 string $valStr = $words[3]; 159 160 //----------------------------------------------------------------------------- 161 // format 162 int $nameSize = size($name); 163 if ($nameSize < 16) 164 { 165 $name += substring(" ", 1, 16 - $nameSize); 166 } 167 else if ($nameSize > 16) 168 { 169 $name = substring($name, 1, 16 - 3) + "..."; 170 } 171 172 if ($type == 0) 173 { 174 string $strs[]; 175 tokenize($valStr, "&", $strs); 176 $valStr = ""; 177 for ($str in $strs) 178 { 179 $str = strip($str); 180 //print ("[" + $str + "]\n"); 181 if (size($str) == 0) 182 { 183 continue; 184 } 185 186 if (size($valStr) != 0) $valStr += " "; 187 $valStr += $str; 188 } 189 } 190 191 if (size($sizeStr) < 4) 192 { 193 $sizeStr = substring(" ", 1, 4 - size($sizeStr)) + $sizeStr; 194 } 195 196 if (size($valStr) > 24) 197 { 198 $valStr = substring($valStr, 1, 24 - 3) + "..."; 199 } 200 201 string $typeNames[3] = { "(String) ", "(Integer)", "(Float) " }; 202 return ($name + " " + $typeNames[$type] + " [" + $sizeStr + "] \"" + $valStr + "\""); 203} 204 205/****************************************************************************** 206 get selected SG 207 208 return SG size 209******************************************************************************/ 210proc int GetSelectedSG(string $sgs[]) 211{ 212 $sgs = `ls -sl -typ shadingEngine`; 213 if (size($sgs) == 0) 214 { 215 // get SG from selected material 216 string $mats[] = `ls -sl -mat`; 217 for ($mat in $mats) 218 { 219 if (!`attributeQuery -n $mat -ex "oc"`) 220 { 221 continue; 222 } 223 string $connectedSgs[] = 224 `listConnections -s 0 -d 1 -type shadingEngine ($mat + ".oc")`; 225 for ($sg in $connectedSgs) 226 { 227 if ($sg != "initialParticleSE" && 228 $sg != "swatchShadingGroup") 229 { 230 $sgs[size($sgs)] = $sg; 231 } 232 } 233 } 234 } 235 return size($sgs); 236} 237 238/****************************************************************************** 239 is valid transform 240******************************************************************************/ 241proc int IsValidTransform(string $node) 242{ 243 string $childs[] = `listRelatives -pa -s $node`; 244 if (size(`ls 245 -typ ambientLight 246 -typ areaLight 247 -typ volumeLight 248 -typ environmentFog 249 $childs`) > 0) 250 { 251 return false; 252 } 253 else 254 { 255 return true; 256 } 257} 258 259/****************************************************************************** 260 get selected transform & SG 261 262 return node size 263******************************************************************************/ 264proc int GetSelectedXformAndSG(string $nodes[]) 265{ 266 clear($nodes); 267 268 //----------------------------------------------------------------------------- 269 // transform 270 string $xforms[] = `ls -sl -typ transform`; 271 for ($node in $xforms) 272 { 273 if (IsValidTransform($node)) 274 { 275 $nodes[size($nodes)] =$node; 276 } 277 } 278 279 //----------------------------------------------------------------------------- 280 // SG 281 string $sgs[]; 282 if (GetSelectedSG($sgs) > 0) 283 { 284 for ($node in $sgs) 285 { 286 $nodes[size($nodes)] =$node; 287 } 288 } 289 290 return size($nodes); 291} 292 293/****************************************************************************** 294 enable main window 295******************************************************************************/ 296global proc nw4cSetUserData_EnableMainWindow(int $enableFlag) 297{ 298 if (`window -ex nw4cSetUserData_Win`) 299 { 300 control -e -en $enableFlag nw4cSetUserData_MoveUpBtn; 301 control -e -en $enableFlag nw4cSetUserData_MoveDownBtn; 302 control -e -en $enableFlag nw4cSetUserData_AddBtn; 303 control -e -en $enableFlag nw4cSetUserData_DeleteBtn; 304 control -e -en $enableFlag nw4cSetUserData_EditBtn; 305 control -e -en $enableFlag nw4cSetUserData_List; 306 control -e -en $enableFlag nw4cSetUserData_CloseBtn; 307 } 308} 309 310/****************************************************************************** 311 input apply callback 312******************************************************************************/ 313global proc nw4cSetUserData_InputApplyCB(string $node, 314 int $curIndex, int $addFlag) 315{ 316 //----------------------------------------------------------------------------- 317 // check node exist 318 if (!`objExists $node`) 319 { 320 warning ("Node does not exist: " + $node); 321 return; 322 } 323 324 //----------------------------------------------------------------------------- 325 // get all data 326 string $dataValues[]; 327 int $dataSize = nw4cSetUserData_Get_AllUserDataValue($dataValues, $node); 328 329 //----------------------------------------------------------------------------- 330 // get control value 331 string $name = `textField -q -tx nw4cSetUserData_DataName`; 332 $name = strip($name); 333 int $type = `radioButtonGrp -q -sl nw4cSetUserData_DataType` - 1; 334 string $value = `scrollField -q -tx nw4cSetUserData_Value`; 335 336 //----------------------------------------------------------------------------- 337 // check name 338 string $strVals[]; 339 int $intNums[]; 340 float $floatNums[]; 341 if (size($name) == 0) 342 { 343 error "Name is empty"; 344 } 345 if (size(match("[^-_.0-9A-Za-z]", $name)) > 0) 346 { 347 error "Name is wrong (please use only [alphabetic/numeric character] [-] [_] [.])"; 348 } 349 int $editIndex = ($addFlag) ? -1 : $curIndex; 350 if (!IsUserDataNameIsUnique($dataValues, $name, $editIndex)) 351 { 352 error "Name is already used"; 353 } 354 355 //----------------------------------------------------------------------------- 356 // check value 357 if ($type == 0) // string 358 { 359 if (size($value) == 0) 360 { 361 error "String is empty"; 362 } 363 string $lines[]; 364 tokenize($value, "\n", $lines); 365 for ($line in $lines) 366 { 367 $line = strip($line); 368 //print ("[" + $line + "]\n"); 369 if (size($line) == 0) 370 { 371 continue; 372 } 373 374 if (size(match("[<>&'\"]", $line)) > 0) 375 { 376 error "String is wrong (please don't use [<] [>] [&] ['] [double quote])"; 377 } 378 379 $strVals[size($strVals)] = $line; 380 } 381 382 if (size($strVals) == 0) 383 { 384 error "Please input strings"; 385 } 386 } 387 else // int / float 388 { 389 if (size($value) == 0) 390 { 391 error "Number is empty"; 392 } 393 int $validFlag = 1; 394 string $lines[]; 395 tokenize($value, "\n", $lines); 396 for ($line in $lines) 397 { 398 $line = strip($line); 399 //print ("[" + $line + "]\n"); 400 if (size($line) == 0) 401 { 402 continue; 403 } 404 405 string $words[]; 406 if (tokenize($line, " ", $words) != 1 || // multi value per line 407 size(match("[^eE][+-]", $line)) > 0) // +/- is not at top or after E 408 { 409 $validFlag = 0; 410 break; 411 } 412 413 if ($type == 1) // int 414 { 415 if (size(match("[^+-0123456789]", $line)) > 0) 416 { 417 $validFlag = 0; 418 break; 419 } 420 $intNums[size($intNums)] = (int)$line; 421 } 422 else // float 423 { 424 if (size(match("[^+-0123456789eE.]", $line)) > 0) 425 { 426 $validFlag = 0; 427 break; 428 } 429 $floatNums[size($floatNums)] = (float)$line; 430 } 431 } 432 433 if ($type == 1) 434 { 435 if (!$validFlag || size($intNums) == 0) 436 { 437 error "Please input integer number"; 438 } 439 } 440 else 441 { 442 if (!$validFlag || size($floatNums) == 0) 443 { 444 error "Please input float number"; 445 } 446 } 447 } 448 449 //----------------------------------------------------------------------------- 450 // create data string 451 string $dataStr = $name + "\""; 452 if ($type == 0) 453 { 454 int $strLen = 0; 455 string $strData = ""; 456 string $strVal; 457 for ($strVal in $strVals) 458 { 459 if (size($strData) > 0) 460 { 461 $strData += "&"; 462 } 463 $strData += $strVal; 464 $strLen += size($strVal); 465 } 466 467 $dataStr += "s " + $strLen + " " + $strData; 468 } 469 else if ($type == 1) 470 { 471 $dataStr += "i " + size($intNums); 472 int $intVal; 473 for ($intVal in $intNums) 474 { 475 $dataStr += " " + $intVal; 476 } 477 } 478 else 479 { 480 $dataStr += "f " + size($floatNums); 481 float $floatVal; 482 for ($floatVal in $floatNums) 483 { 484 $dataStr += " " + $floatVal; 485 } 486 } 487 488 //----------------------------------------------------------------------------- 489 // add or edit 490 if ($addFlag) 491 { 492 //----------------------------------------------------------------------------- 493 // add 494 if ($curIndex > $dataSize) 495 { 496 $curIndex = $dataSize; 497 } 498 if ($dataSize > 0) 499 { 500 // shift 501 for ($idx = $dataSize; $idx > $curIndex; --$idx) 502 { 503 nw4cSetUserData_Set_UserDataValue($node, $idx, $dataValues[$idx - 1]); 504 } 505 } 506 nw4cSetUserData_Set_UserDataValue($node, $curIndex, $dataStr); 507 nw4cSetUserData_Set_UserDataSize($node, $dataSize + 1); 508 } 509 else 510 { 511 //----------------------------------------------------------------------------- 512 // edit 513 if ($dataSize == 0) 514 { 515 $curIndex = 0; 516 nw4cSetUserData_Set_UserDataSize($node, 1); 517 } 518 else if ($curIndex >= $dataSize) 519 { 520 $curIndex = $dataSize - 1; 521 } 522 nw4cSetUserData_Set_UserDataValue($node, $curIndex, $dataStr); 523 } 524} 525 526/****************************************************************************** 527 open input window 528******************************************************************************/ 529proc OpenInputWindow(string $node, int $curIndex, int $addFlag) 530{ 531 //----------------------------------------------------------------------------- 532 // get current value 533 string $name = ""; 534 int $type = 0; 535 string $values = ""; 536 int $dataSize = nw4cSetUserData_Get_UserDataSize($node); 537 if (!$addFlag) 538 { 539 string $userData = nw4cSetUserData_Get_UserDataValue($node, $curIndex); 540 string $words[4]; 541 DecodeUserDataValue($words, $userData); 542 $name = $words[0]; 543 $type = (int)$words[1]; 544 string $valStr = $words[3]; 545 if ($type == 0) 546 { 547 string $strs[]; 548 tokenize($valStr, "&", $strs); 549 for ($str in $strs) 550 { 551 $values += ("" + $str + "\r\n"); 552 } 553 } 554 else 555 { 556 string $nums[]; 557 tokenize($valStr, " ", $nums); 558 for ($num in $nums) 559 { 560 $values += ("" + $num + "\r\n"); 561 } 562 } 563 } 564 565 //----------------------------------------------------------------------------- 566 // set command 567 string $applyCmd = ("nw4cSetUserData_InputApplyCB " 568 + $node + " " + $curIndex + " " + $addFlag + ";"); 569 int $closeSelIndex = ($addFlag && $curIndex >= $dataSize) ? -1 : $curIndex; 570 int $closeShowIndex = ($addFlag && $curIndex >= $dataSize) ? $curIndex : -1; 571 string $closeCmd = "deleteUI nw4cSetUserData_InputWin; " 572 + "nw4cSetUserData_UpdateWindow " + $closeSelIndex + " " + $closeShowIndex + "; "; 573 574 //----------------------------------------------------------------------------- 575 // create window 576 int $wd = 320; 577 int $ht = 370; 578 if (`window -ex nw4cSetUserData_InputWin`) 579 { 580 deleteUI nw4cSetUserData_InputWin; 581 } 582 window -t ("Input User Data --- " + $node) -wh $wd $ht -mxb 0 -tbm 0 583 nw4cSetUserData_InputWin; 584 //columnLayout -adj 1 -cat "both" 8 -cal "center" -rs 8; 585 string $form = `formLayout -nd 100`; 586 587 //----------------------------------------------------------------------------- 588 // attr 589 string $nameLabel = `text -l "Name" -al "right"`; 590 textField -tx $name 591 -ec ($applyCmd + $closeCmd) 592 nw4cSetUserData_DataName; 593 594 radioButtonGrp -l "Type" -nrb 3 -cw4 60 70 70 70 595 -la3 "String" "Integer" "Float" 596 -sl ($type + 1) 597 nw4cSetUserData_DataType; 598 599 text -l "String or Number : (One value per line)" -al "left" -fn "boldLabelFont" 600 nw4cSetUserData_NumberLabel; 601 scrollField -ww 0 -tx $values 602 -ec "scrollField -e -it \"\\r\\n\" nw4cSetUserData_Value" 603 nw4cSetUserData_Value; 604 605 //----------------------------------------------------------------------------- 606 // OK & Cancel button 607 string $okBtn = `button -w 100 -h 26 -l "OK" 608 -c ($applyCmd + $closeCmd)`; 609 string $cancelBtn = `button -w 100 -h 26 -l "Cancel" 610 -c ($closeCmd)`; 611 612 formLayout -e 613 -af $nameLabel "top" 8 614 -an $nameLabel "left" 615 -an $nameLabel "bottom" 616 -ac $nameLabel "right" 10 nw4cSetUserData_DataName 617 618 -af nw4cSetUserData_DataName "top" 8 619 -af nw4cSetUserData_DataName "left" 68 620 -an nw4cSetUserData_DataName "bottom" 621 -af nw4cSetUserData_DataName "right" 8 622 623 -ac nw4cSetUserData_DataType "top" 16 $nameLabel 624 -af nw4cSetUserData_DataType "left" 8 625 -an nw4cSetUserData_DataType "bottom" 626 -an nw4cSetUserData_DataType "right" 627 628 -ac nw4cSetUserData_NumberLabel "top" 12 nw4cSetUserData_DataType 629 -af nw4cSetUserData_NumberLabel "left" 8 630 -an nw4cSetUserData_NumberLabel "bottom" 631 -af nw4cSetUserData_NumberLabel "right" 8 632 633 -ac nw4cSetUserData_Value "top" 0 nw4cSetUserData_NumberLabel 634 -af nw4cSetUserData_Value "left" 8 635 -af nw4cSetUserData_Value "bottom" 48 636 -af nw4cSetUserData_Value "right" 8 637 638 -an $okBtn "top" 639 -an $okBtn "left" 640 -af $okBtn "bottom" 8 641 -ac $okBtn "right" 8 $cancelBtn 642 643 -an $cancelBtn "top" 644 -an $cancelBtn "left" 645 -af $cancelBtn "bottom" 8 646 -af $cancelBtn "right" 16 647 $form; 648 649 setParent ..; // formLayout 650 651 //setParent ..; // columnLayout 652 653 if ($addFlag) 654 { 655 setFocus nw4cSetUserData_DataName; 656 } 657 else 658 { 659 setFocus nw4cSetUserData_Value; 660 } 661 662 if (`window -q -w nw4cSetUserData_InputWin` < $wd) 663 { 664 window -e -w $wd nw4cSetUserData_InputWin; 665 } 666 if (`window -q -h nw4cSetUserData_InputWin` < $ht) 667 { 668 window -e -h $ht nw4cSetUserData_InputWin; 669 } 670 //window -e -wh $wd $ht nw4cSetUserData_InputWin; 671 672 //----------------------------------------------------------------------------- 673 // show window 674 showWindow nw4cSetUserData_InputWin; 675 676 //----------------------------------------------------------------------------- 677 // disable main window 678 nw4cSetUserData_EnableMainWindow(0); 679} 680 681/****************************************************************************** 682 get selected item index 683 684 return -1 if not selected 685******************************************************************************/ 686proc int GetSelectedItemIndex() 687{ 688 int $selIndexes[] = `textScrollList -q -sii nw4cSetUserData_List`; 689 if (size($selIndexes) == 0) 690 { 691 return -1; 692 } 693 else 694 { 695 return ($selIndexes[0] - 1); 696 } 697} 698 699/****************************************************************************** 700 select list callback 701******************************************************************************/ 702global proc nw4cSetUserData_SelectListCB(string $node) 703{ 704 int $index = GetSelectedItemIndex(); 705 int $dataSize = nw4cSetUserData_Get_UserDataSize($node); 706 707 int $selOK = ($index >= 0 && $index < $dataSize); 708 709 if ($index >= $dataSize) 710 { 711 textScrollList -e -da nw4cSetUserData_List; 712 } 713 714 control -e -en ($selOK && $index > 0) 715 nw4cSetUserData_MoveUpBtn; 716 control -e -en ($selOK && $index < $dataSize - 1) 717 nw4cSetUserData_MoveDownBtn; 718 control -e -en 1 nw4cSetUserData_AddBtn; // always enable 719 control -e -en $selOK nw4cSetUserData_DeleteBtn; 720 control -e -en $selOK nw4cSetUserData_EditBtn; 721} 722 723/****************************************************************************** 724 move up button callback 725******************************************************************************/ 726global proc nw4cSetUserData_MoveUpBtnCB(string $node) 727{ 728 int $index = GetSelectedItemIndex(); 729 int $dataSize = nw4cSetUserData_Get_UserDataSize($node); 730 if ($index > 0 && $index < $dataSize) 731 { 732 string $selVal = nw4cSetUserData_Get_UserDataValue($node, $index); 733 string $upVal = nw4cSetUserData_Get_UserDataValue($node, $index - 1); 734 nw4cSetUserData_Set_UserDataValue($node, $index, $upVal); 735 nw4cSetUserData_Set_UserDataValue($node, $index - 1, $selVal); 736 nw4cSetUserData_UpdateWindow($index - 1, -1); 737 } 738} 739 740/****************************************************************************** 741 move down button callback 742******************************************************************************/ 743global proc nw4cSetUserData_MoveDownBtnCB(string $node) 744{ 745 int $index = GetSelectedItemIndex(); 746 int $dataSize = nw4cSetUserData_Get_UserDataSize($node); 747 if ($index >= 0 && $index < $dataSize - 1) 748 { 749 string $selVal = nw4cSetUserData_Get_UserDataValue($node, $index); 750 string $downVal = nw4cSetUserData_Get_UserDataValue($node, $index + 1); 751 nw4cSetUserData_Set_UserDataValue($node, $index, $downVal); 752 nw4cSetUserData_Set_UserDataValue($node, $index + 1, $selVal); 753 nw4cSetUserData_UpdateWindow($index + 1, -1); 754 } 755} 756 757/****************************************************************************** 758 add button callback 759******************************************************************************/ 760global proc nw4cSetUserData_AddBtnCB(string $node) 761{ 762 int $index = GetSelectedItemIndex(); 763 if ($index == -1) 764 { 765 $index = nw4cSetUserData_Get_UserDataSize($node); 766 } 767 OpenInputWindow($node, $index, 1); 768} 769 770/****************************************************************************** 771 edit button callback 772******************************************************************************/ 773global proc nw4cSetUserData_EditBtnCB(string $node) 774{ 775 int $index = GetSelectedItemIndex(); 776 if ($index == -1 || $index >= nw4cSetUserData_Get_UserDataSize($node)) 777 { 778 return; 779 } 780 OpenInputWindow($node, $index, 0); 781} 782 783/****************************************************************************** 784 delete button callback 785******************************************************************************/ 786global proc nw4cSetUserData_DeleteBtnCB(string $node) 787{ 788 //----------------------------------------------------------------------------- 789 // check node exist 790 if (!`objExists $node`) 791 { 792 warning ("Node does not exist: " + $node); 793 return; 794 } 795 796 //----------------------------------------------------------------------------- 797 // get all item 798 string $dataValues[]; 799 int $dataSize = nw4cSetUserData_Get_AllUserDataValue($dataValues, $node); 800 801 //----------------------------------------------------------------------------- 802 // check selected item 803 int $delIndex = GetSelectedItemIndex(); 804 if ($delIndex == -1 || $delIndex >= $dataSize) 805 { 806 return; 807 } 808 809 //----------------------------------------------------------------------------- 810 // delete 811 int $idx; 812 for ($idx = $delIndex; $idx < $dataSize - 1; ++$idx) 813 { 814 nw4cSetUserData_Set_UserDataValue($node, $idx, $dataValues[$idx + 1]); // shift 815 } 816 nw4cSetUserData_Set_UserDataValue($node, $dataSize - 1, ""); // set empty to deleted item 817 --$dataSize; 818 nw4cSetUserData_Set_UserDataSize($node, $dataSize); // decrement size 819 820 //----------------------------------------------------------------------------- 821 // update window 822 int $selIndex = -1; 823 if ($delIndex < $dataSize) 824 { 825 $selIndex = $delIndex; 826 } 827 else if ($dataSize > 0) 828 { 829 $selIndex = $dataSize - 1; 830 } 831 nw4cSetUserData_UpdateWindow($selIndex, -1); 832} 833 834/****************************************************************************** 835 get SG name with material 836******************************************************************************/ 837proc string GetSGNameWithMat(string $sg) 838{ 839 string $ins[] = `listConnections -s 1 -d 0 ($sg + ".ss")`; 840 if (size($ins)) 841 { 842 $sg += " ( " + $ins[0] + " )"; 843 } 844 return $sg; 845} 846 847/****************************************************************************** 848 update window (UpdateWindowT) 849******************************************************************************/ 850global proc nw4cSetUserData_UpdateWindow(int $selIndex, int $showIndex) 851{ 852 //----------------------------------------------------------------------------- 853 // get selection 854 string $nodes[]; 855 GetSelectedXformAndSG($nodes); 856 int $enableFlag = (size($nodes) == 1); 857 858 //----------------------------------------------------------------------------- 859 // set node name 860 string $nodeName; 861 if ($enableFlag) 862 { 863 if (nodeType($nodes[0]) == "shadingEngine") 864 { 865 $nodeName = GetSGNameWithMat($nodes[0]); 866 } 867 else 868 { 869 $nodeName = $nodes[0]; 870 } 871 } 872 else if (size($nodes) > 1) 873 { 874 $nodeName = "(Multi node is selected)"; 875 } 876 else 877 { 878 $nodeName = "(None)"; 879 } 880 text -e -l $nodeName nw4cSetUserData_NodeName; 881 882 //----------------------------------------------------------------------------- 883 // set current attr & change command 884 textScrollList -e -ra nw4cSetUserData_List; 885 if ($enableFlag) 886 { 887 string $node = $nodes[0]; 888 button -e -c ("nw4cSetUserData_MoveUpBtnCB " + $node) 889 nw4cSetUserData_MoveUpBtn; 890 button -e -c ("nw4cSetUserData_MoveDownBtnCB " + $node) 891 nw4cSetUserData_MoveDownBtn; 892 button -e -c ("nw4cSetUserData_AddBtnCB " + $node) 893 nw4cSetUserData_AddBtn; 894 button -e -c ("nw4cSetUserData_DeleteBtnCB " + $node) 895 nw4cSetUserData_DeleteBtn; 896 button -e -c ("nw4cSetUserData_EditBtnCB " + $node) 897 nw4cSetUserData_EditBtn; 898 899 string $dataValues[]; 900 int $dataSize = nw4cSetUserData_Get_AllUserDataValue($dataValues, $node); 901 for ($index = 0; $index < $dataSize; ++$index) 902 { 903 string $listStr = GetListStringFromUserDataValue($dataValues[$index]); 904 textScrollList -e -a $listStr nw4cSetUserData_List; 905 } 906 if ($selIndex != -1 && $selIndex < $dataSize) 907 { 908 textScrollList -e -sii ($selIndex + 1) nw4cSetUserData_List; 909 } 910 if ($showIndex != -1 && $showIndex < $dataSize) 911 { 912 textScrollList -e -shi ($showIndex + 1) nw4cSetUserData_List; 913 } 914 915 textScrollList -e 916 -sc ("nw4cSetUserData_SelectListCB " + $node) 917 -dcc ("nw4cSetUserData_EditBtnCB " + $node) 918 nw4cSetUserData_List; 919 920 nw4cSetUserData_SelectListCB($nodes[0]); 921 } 922 textScrollList -e -a "-----" nw4cSetUserData_List; // for add last 923 924 //----------------------------------------------------------------------------- 925 // set enable state 926 if (`window -ex nw4cSetUserData_InputWin`) 927 { 928 nw4cSetUserData_EnableMainWindow(0); 929 } 930 else 931 { 932 if (!$enableFlag) 933 { 934 control -e -en $enableFlag nw4cSetUserData_MoveUpBtn; 935 control -e -en $enableFlag nw4cSetUserData_MoveDownBtn; 936 control -e -en $enableFlag nw4cSetUserData_AddBtn; 937 control -e -en $enableFlag nw4cSetUserData_DeleteBtn; 938 control -e -en $enableFlag nw4cSetUserData_EditBtn; 939 } 940 control -e -en $enableFlag nw4cSetUserData_List; 941 control -e -en 1 nw4cSetUserData_CloseBtn; 942 } 943} 944 945/****************************************************************************** 946 main 947******************************************************************************/ 948global proc NW4C_SetUserData() 949{ 950 //----------------------------------------------------------------------------- 951 // create window 952 int $wd = 505; 953 int $ht = 420; 954 if (!`window -ex nw4cSetUserData_Win`) 955 { 956 window -t "NW4C Set User Data" -wh $wd $ht -mxb 0 -mb 1 957 nw4cSetUserData_Win; 958 menu -l "Help"; 959 menuItem -l ("Help on " + `window -q -t nw4cSetUserData_Win` + "...") 960 -c "NW4C_ShowHelp \"html/NW4C_SetUserData.html\" \"user_data\""; 961 962 string $form1 = `formLayout -nd 100`; 963 964 //----------------------------------------------------------------------------- 965 // node name 966 string $nameFrame = `frameLayout -l "Selected Transform Node or Shading Group" -cll 0 -cl 0 -bv 1 -bs "etchedIn"`; 967 columnLayout -adj 1 -cal "center" -rs 8; 968 969 text -l "" nw4cSetUserData_NodeName; 970 971 setParent ..; // columnLayout 972 setParent ..; // formLayout 973 974 //----------------------------------------------------------------------------- 975 // list 976 string $listFrame = `frameLayout -l "" -cll 0 -cl 0 -bv 1 -bs "etchedIn"`; 977 string $form2 = `formLayout -nd 100`; 978 979 // buttons 980 string $listBtnRow = `rowColumnLayout -nc 5 981 -cw 1 80 -cw 2 80 -cw 3 80 -cw 4 80 -cw 5 80 982 -cs 1 1 -cs 2 8 -cs 3 22 -cs 4 8 -cs 5 22`; 983 button -l "Move Up" -h 24 984 nw4cSetUserData_MoveUpBtn; 985 button -l "Move Down" -h 24 986 nw4cSetUserData_MoveDownBtn; 987 button -l "Add..." -h 24 988 nw4cSetUserData_AddBtn; 989 button -l "Delete" -h 24 990 nw4cSetUserData_DeleteBtn; 991 button -l "Edit..." -h 24 992 nw4cSetUserData_EditBtn; 993 setParent ..; // rowColumnLayout 994 995 // list 996 string $listText = `text -l "Name Type Size Value" 997 -al "left" -fn "smallFixedWidthFont"`; 998 textScrollList -nr 15 -ams 0 -fn "smallFixedWidthFont" 999 nw4cSetUserData_List; 1000 1001 setParent ..; // formLayout 1002 1003 formLayout -e 1004 -af $listBtnRow "top" 8 1005 -af $listBtnRow "left" 8 1006 -an $listBtnRow "bottom" 1007 -af $listBtnRow "right" 8 1008 1009 -ac $listText "top" 8 $listBtnRow 1010 -af $listText "left" 8 1011 -an $listText "bottom" 1012 -af $listText "right" 8 1013 1014 -ac nw4cSetUserData_List "top" 0 $listText 1015 -af nw4cSetUserData_List "left" 8 1016 -af nw4cSetUserData_List "bottom" 8 1017 -af nw4cSetUserData_List "right" 8 1018 $form2; 1019 1020 setParent ..; // frameLayout 1021 1022 //----------------------------------------------------------------------------- 1023 // close button 1024 string $closeCmd = "deleteUI nw4cSetUserData_Win; "; 1025 1026 button -h 26 -l "Close" -c $closeCmd 1027 nw4cSetUserData_CloseBtn; 1028 1029 formLayout -e 1030 -af $nameFrame "top" 4 1031 -af $nameFrame "left" 4 1032 -an $nameFrame "bottom" 1033 -af $nameFrame "right" 4 1034 1035 -ac $listFrame "top" 4 $nameFrame 1036 -af $listFrame "left" 4 1037 -ac $listFrame "bottom" 4 nw4cSetUserData_CloseBtn 1038 -af $listFrame "right" 4 1039 1040 -an nw4cSetUserData_CloseBtn "top" 1041 -af nw4cSetUserData_CloseBtn "left" 4 1042 -af nw4cSetUserData_CloseBtn "bottom" 8 1043 -af nw4cSetUserData_CloseBtn "right" 4 1044 $form1; 1045 1046 setParent ..; // formLayout 1047 1048 setFocus nw4cSetUserData_CloseBtn; 1049 1050 //----------------------------------------------------------------------------- 1051 // set selection change job 1052 scriptJob -p nw4cSetUserData_Win 1053 -e "SelectionChanged" "nw4cSetUserData_UpdateWindow -1 -1"; 1054 1055 //----------------------------------------------------------------------------- 1056 // set undo / redo job 1057 scriptJob -p nw4cSetUserData_Win 1058 -e "Undo" "nw4cSetUserData_UpdateWindow -1 -1"; 1059 scriptJob -p nw4cSetUserData_Win 1060 -e "Redo" "nw4cSetUserData_UpdateWindow -1 -1"; 1061 } 1062 if (`window -q -w nw4cSetUserData_Win` < $wd) 1063 { 1064 window -e -w $wd nw4cSetUserData_Win; 1065 } 1066 if (`window -q -h nw4cSetUserData_Win` < $ht) 1067 { 1068 window -e -h $ht nw4cSetUserData_Win; 1069 } 1070 //window -e -wh $wd $ht nw4cSetUserData_Win; 1071 1072 //----------------------------------------------------------------------------- 1073 // update window 1074 nw4cSetUserData_UpdateWindow(-1, -1); 1075 1076 //----------------------------------------------------------------------------- 1077 // show window 1078 showWindow nw4cSetUserData_Win; 1079 if (`window -ex nw4cSetUserData_InputWin`) 1080 { 1081 showWindow nw4cSetUserData_InputWin; 1082 } 1083} 1084