2012年4月27日 星期五

MAXscript : constraints appendTarget

近日用MAXscript來做批次處理,其中有個步驟是先切biped的FigureMode為true,然後Merge物件並appendTarget $Bip01,但是發現取消FigureMode之後物件的座標點仍是merge時的座標,並未依據$Bip01的位移改變。後來發現在appendTarget後必需要取用物件的position(或者直接取用transform)資訊才會正常。不過若是一步一步手動執行,就沒有這個問題,也不是因為使用disableSceneRedraw、undo off、用fn進行addConstraint所導致。

2012年4月18日 星期三

MAXscript : Skin Copy/Paste

--
--選擇已Skin物件執行Copy, 自動記錄bones和存出env, 再選擇要套用Skin的物件執行Paste套回
--需要設定tempDir供存出env檔案用
--by JanusHaung
skinBonesArray = #()
tempDir = "D:/MaxProject/export/"
envFilename = ""

rollout skinCopyPaste "Skin Copy Paste" width:185 height:50
(
 button btn_copy "Copy" across:2
 button btn_paste "Paste"
 label lbl1 ""

 on btn_copy pressed do (
  -- 選擇已skin好的物件並執行
  if $.modifiers[#Skin] != undefined do (
   skinBonesArray = for i in 1 to skinops.getnumberbones $.skin collect skinops.getbonename $.skin i 0
   envFilename = tempDir + $.name + ".env"
   skinOps.saveEnvelope $.skin envFilename
   lbl1.caption = "Skin copied."
  )
 )
 
 on btn_paste pressed do (
  max modify mode
  if skinBonesArray.count > 0 do (
   -- 選擇尚未skin好的模型執行
   if $.modifiers[#Skin] == undefined do addmodifier $ (Skin())
   for i in 1 to skinBonesArray.count do skinOps.addbone $.skin ( getNodeByName skinBonesArray[i] ) 0
   --先執行completeRedraw()才可成功LoadEnvlope
   completeRedraw()
   skinOps.LoadEnvelope $.skin envFilename
   lbl1.caption = "Skin pasted."
  )
 )
)

createDialog skinCopyPaste

[MAXscript] 將所選擇物件轉為物件陣列形式

可將選擇中的物件名稱以#( $node1, $node2, ... )物件陣列的方式印出來

-- 將所選擇的物件名稱輸出成物件陣列形式 by Janus Huang

-- 紀錄下所有物件的名稱
tmp = for o in selection collect o.name

out = "#( "

--把物件名稱去除掉空白格
for i in 1 to tmp.count where matchpattern tmp[i] pattern:"* *" do (

    strNew = ""
    
    --留下space外的字串成array
    strTmp = filterString tmp[i] " "
    
    --將array結合成string後重新丟回
    for s in strTmp do strNew += s
    tmp[i] = strNew
)

for i in 1 to tmp.count do (
    --把物件名稱去除掉()
    if matchpattern tmp[i] pattern:"*(*)*" then
    (
        strNew = "getNodeByName \""+tmp[i]+"\""
        tmp[i] = strNew
    ) else (
        tmp[i]="$"+tmp[i]
    )

    if i != tmp.count then out += tmp[i]+", " else out += tmp[i]+" )"
)

print out