Skip to content

Instantly share code, notes, and snippets.

@Hoikohroh
Created December 27, 2015 00:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Hoikohroh/6589d617647d1c13ad0e to your computer and use it in GitHub Desktop.
Save Hoikohroh/6589d617647d1c13ad0e to your computer and use it in GitHub Desktop.
Maxscript:Local_Transform_Type-In
/*
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