Created
December 27, 2015 00:23
-
-
Save Hoikohroh/6589d617647d1c13ad0e to your computer and use it in GitHub Desktop.
Maxscript:Local_Transform_Type-In
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
3dsMax Script(.ms) | |
Local_Transform_Type-In_v20151227 | |
スクリプト概要 | |
選択中の頂点をの座標を ノード基点or作業基点の座標系で表示、変更する | |
Getで座標を取得、Setで変更 | |
注意点 | |
1:"編集可能ポリゴン"の"頂点"選択時のみ動作 | |
2:小数点以下4桁で四捨五入して動作 | |
3:エラーキャッチ処理は未実装 | |
changeLog | |
v20151227 | |
仕様変更 | |
1:Editable_Poly/サブオブジェクトレベル:頂点 がアクティブ時に動作するよう修正 | |
2:モディファイア使用時に動作するよう修正 | |
(ポリゴン編集モディファイアでは無い(メソッドが微妙に違う為後回し)) | |
v20151207 | |
初版 | |
*/ | |
try destroyDialog localPos catch() | |
--setVar | |
oldVertAvg = [0,0,0] | |
newVertAvg = [0,0,0] | |
vertFlag = #{1..3} | |
sel = undefined | |
target = undefined | |
tempVertPos = [0,0,0] | |
vertSel = #{} | |
---------------------------------------------- | |
--functions | |
---------------------------------------------- | |
fn changeW2L = ( | |
if localPos.axisMode.state == 2 then ( | |
tempVertPos = (tempVertPos) * (sel.transform) * (inverse (WorkingPivot.getTM())) | |
) | |
) | |
fn round_to val = | |
( | |
local mult = 10.0 ^ 4 | |
(floor ((val * mult) + 0.5)) / mult | |
) | |
fn resetVar =( | |
oldVertAvg = [0,0,0] | |
newVertAvg = [0,0,0] | |
vertFlag = #{1..3} | |
vertSel = #{} | |
) | |
--check obj | |
fn checksel =( | |
target = modPanel.getCurrentObject() | |
-- if target == undefined and ((classof target != Editable_Poly) or (classof target != Edit_Poly))then( | |
if target == undefined and classof target != Editable_Poly then( | |
sel = undefined | |
target = undefined | |
)else if (subObjectLevel != 1) then( | |
sel = undefined | |
target = undefined | |
)else( | |
sel = selection[1] | |
) | |
) | |
-- compare BitArrays | |
fn isEqualBitArrays ba1 ba2 = ( | |
ba1.numberSet == ba2.numberSet and (ba1 - ba2).isEmpty | |
) | |
--UpdateVar | |
fn updateVert = ( | |
resetVar() | |
vertSel = polyop.getVertSelection target | |
local doneFlag = 1 | |
for i = 1 to vertSel.count do( | |
if vertSel[i] do( | |
--notice-- get local position | |
tempVertPos = polyop.getVert target i | |
changeW2L() | |
oldVertAvg = oldVertAvg + tempVertPos | |
if doneFlag > 1 do( | |
--notice ! | |
oldVertAvg = oldVertAvg/2 | |
if (round_to oldVertAvg.x) != (round_to tempVertPos.x) then(vertFlag[1] = false) | |
if (round_to oldVertAvg.y) != (round_to tempVertPos.y) then(vertFlag[2] = false) | |
if (round_to oldVertAvg.z) != (round_to tempVertPos.z) then(vertFlag[3] = false) | |
) | |
doneFlag += 1 | |
) | |
) | |
) | |
--UpedateSpinner | |
fn setSpiner =( | |
localPos.spn_X.value = oldVertAvg[1] | |
localPos.spn_Y.value = oldVertAvg[2] | |
localPos.spn_Z.value = oldVertAvg[3] | |
localPos.spn_X.enabled = vertFlag[1] | |
localPos.spn_Y.enabled = vertFlag[2] | |
localPos.spn_Z.enabled = vertFlag[3] | |
) | |
Rollout localPos "Transform" | |
( | |
--UI | |
Group "coordsys"( | |
radiobuttons axisMode labels:#("Local","WorkingPivot") | |
) | |
Group "Position" ( | |
Spinner spn_X "X" type:#float range:[-10000000,10000000,0] fieldwidth:80 | |
Spinner spn_Y "Y" type:#float range:[-10000000,10000000,0] fieldwidth:80 | |
Spinner spn_Z "Z" type:#float range:[-10000000,10000000,0] fieldwidth:80 | |
) | |
button btn_get "Get" width:60 height:30 across:2 | |
button btn_set "Set" width:60 height:30 enabled:false | |
--Actions | |
on axisMode changed state do( | |
checksel() | |
if sel != undefined then( | |
updateVert() | |
btn_set.enabled = true | |
)else( | |
resetVar() | |
btn_set.enabled = false | |
) | |
setSpiner() | |
) | |
on btn_get Pressed do ( | |
checksel() | |
if sel != undefined then( | |
updateVert() | |
btn_set.enabled = true | |
)else( | |
resetVar() | |
btn_set.enabled = false | |
) | |
setSpiner() | |
) | |
on btn_set Pressed do( | |
checksel() | |
if sel != undefined then( | |
local temp = polyop.getVertSelection target | |
if (isEqualBitArrays vertSel temp) then( | |
newVertAvg = [spn_X.value,spn_Y.value,spn_Z.value] | |
local offsetVert = (newVertAvg - oldVertAvg) | |
for i = 1 to vertSel.count do( | |
if vertSel[i] do( | |
polyop.moveVert target i offsetVert | |
) | |
) | |
updateVert() | |
setSpiner() | |
)else( | |
resetVar() | |
setSpiner() | |
btn_set.enabled = false | |
) | |
)else( | |
resetVar() | |
setSpiner() | |
btn_set.enabled = false | |
) | |
) | |
) | |
createDialog localPos 150 220 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment