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