Viewport에 Faces Index 보여주기
faces Index를 viewport 상에서 보여주기위한 스크립트입니다.
오브젝트의 영역을 표시해주는 기능은 덤~
(자세한 설명은 주석으로 대신한다~)
<예제코드>
(
global g_showjNameRollout
try(destroydialog g_showjNameRollout) catch()
rollout g_showjNameRollout "Show Name"
(
---------------------------------------------------------------------
-- UI
---------------------------------------------------------------------
checkbutton cbtn_Rect "Rectangle"width:150
checkbutton cbtn_FaceIndex "Faces Index"width:150
---------------------------------------------------------------------
-- Rect
---------------------------------------------------------------------
fn Rect =
(
gw.setTransform (Matrix3 1) -- 뷰를 기준 공간으로 만든다
for theNode in selection do
(
-- 공간변환 기준 --
-- hTransPoint : 화면 왼쪽 아래 기준
-- wTransPoint : 화면 왼쪽 위 기준
theMesh = try(snapShotasMesh theNode)catch() -- Poly이거나 Mesh가 아닌 Ojbect가 있을 수 있으니 Mesh를 떠서 확인한다.
-- Mesh를 못 만들면 이름만 표시 -----------------
if theMesh == undefined then
(
viewPos = gw.hTransPoint theNode.pos -- View 좌표계로 공간 변환 h 기준
namePos = [viewPos.x, viewPos.y, 0]
gw.hText namePos theNode.name color:orange
gw.hText (namePos + [0, 15, 0]) ("Size: [0, 0]") color:orange
continue
)
------------------------------------------------
-- lb(왼족아래), lt(왼쪽위), rb(오른쪽아래), rt(오른쪽위)
local rb, lt, lb, rt
-- 테두리 만들기 --------------------------------
-- Object 크기를 구하자 -----------
lb = [1e9,1e9,0] -- 크기를 비교해서 값을 받을려고 좀 크게 적용했다.
rt = [-1e9,-1e9,0] -- 화면 해상도가 클 수 있으니 수치를 많이 주자
for i = 1 to theMesh.numverts do
(
wPos = GetVert theMesh i -- World 좌표
vPos = gw.hTransPoint wPos -- View 좌표
if vPos.x < lb.x then lb.x = vPos.x
if vPos.x > rt.x then rt.x = vPos.x
if vPos.y < lb.y then lb.y = vPos.y
if vPos.y > rt.y then rt.y = vPos.y
)
rb = [rt.x, lb.y, 0]
lt = [lb.x, rt.y, 0]
----------------------------------
-- 사각 테두리 만들기 --
gw.hPolyline #(lb, rb, rt, lt) true rgb:#(orange,orange,orange,orange)
free theMesh -- 임시로 만든 Mesh는 이제 필요 없음(뷰에 생성되어 있지 않다면 delete 보다 속도가 빠름)
------------------------------------------------
-- 문자 출력 ------------------------------------
w = (rt.x - lb.x) as integer
h = (rt.y - lb.y) as integer
gw.hText (lb + [5, h, 0]) ("Name : " + theNode.name) color:orange
gw.hText (lb + [5, h + 15, 0]) ("Size: [" + (w as string) + ", " + (h as string) + "]") color:orange
------------------------------------------------
)
gw.updateScreen()
)
---------------------------------------------------------------------
-- FaceIndex
---------------------------------------------------------------------
fn FaceIndex =
(
obj = selection[1]
mody = modPanel.getCurrentObject()
if mody == undefined then
return 0
faces = case classOf mody of -- 선택된 faces 찾기
(
Edit_Poly : if subObjectLevel >= 4 then mody.GetSelection #Face else #{}
Editable_Poly : if subObjectLevel >= 4 then mody.GetSelection #Face else #{}
Edit_Mesh : if subObjectLevel >= 3 then getFaceSelection obj else #{}
Editable_Mesh : if subObjectLevel >= 3 then getFaceSelection obj else #{}
default : return 0
)
gw.setTransform (Matrix3 1) -- 뷰를 기준 공간으로 만든다
-- Face Index ------------
for f in faces do
(
fCenter
if isKindOf obj Edit_Mesh or isKindOf obj Editable_Mesh then
fCenter = meshop.getFaceCenter obj f
else
fCenter = polyop.getFaceCenter obj f
vPos = gw.hTransPoint fCenter -- viewport 상의 Vertex 위치
vPos *= 0.99
gw.htext vPos (f as string) color:yellow
)
--------------------------
gw.updateScreen()
)
---------------------------------------------------------------------
-- cbtn_Rect
---------------------------------------------------------------------
on cbtn_Rect changed state do
(
-- 한번 등록된 함수는 등록할 때마다 새로 추가되니, 등록 전에 빼고 다시 넣는 것이 좋다
-- fn a = print 1
-- registerRedrawViewsCallback a
-- fn a = print 2
-- registerRedrawViewsCallback a
-- 이렇게 하면 2개의 함수가 모두 등록된다 덮어쓰는 것이 아니라..
-- 그리고 첫번째 넣은 fn a = print 1 함수는 변수연결이 끊어져 unRegisterRedrawViewsCallback을 할 수도 없게된다.
-- 그래서 unRegisterRedrawViewsCallback를 먼저 호출한다.
-- 대상 함수가 없다면 무시되니 처음 호출해도 문제가 없다.
unRegisterRedrawViewsCallback Rect
if state then
registerRedrawViewsCallback Rect
completeRedraw()
)
---------------------------------------------------------------------
-- cbtn_FaceIndex
---------------------------------------------------------------------
on cbtn_FaceIndex changed state do
(
unRegisterRedrawViewsCallback FaceIndex
if state then
registerRedrawViewsCallback FaceIndex
completeRedraw()
)
---------------------------------------------------------------------
-- close
---------------------------------------------------------------------
on g_showjNameRollout close do
(
unRegisterRedrawViewsCallback Rect
unRegisterRedrawViewsCallback FaceIndex
completeRedraw()
)
)
createDialog g_showjNameRollout
)
'Max' 카테고리의 다른 글
Autocomplete Maxscript Editor(자동완성) (1) | 2014.10.29 |
---|---|
Maxscript Editor의 색상을 변경해보자 (1) | 2014.08.13 |
File & Folder Dialog 개량하기 (0) | 2014.07.17 |
Maxscript Editor의 Output Pane 활용하기 (0) | 2014.06.20 |
Maxscript 디렉토리 관리하기 (0) | 2014.06.17 |