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