Max Viewport에 Object 이름 표시하기
Maxscript로 View안에 직접 이름과 Line을 표현 할 수 있습니다.
이미지를 보면 이해하기 쉬울 겁니다.
각 물체마다 이름과 Vertex가 있는 Object의 경우는 영역을 표현 해줬습니다.
Viewport Drawing에 관한 Methods를 활용하면 되는데요.
바로 코드를 보면서 이해하는게 편할 겁니다.
주석으로 설명을 대신 합니다.
예제코드
(
global g_showNameRollout
try(destroydialog g_showNameRollout) catch()
rollout g_showNameRollout "Show Name"
(
--------------------------------------------------
-- UI
--------------------------------------------------
checkbutton cbtn_ShowName "Show"width:150
--------------------------------------------------
-- ShowName
--------------------------------------------------
fn ShowName =
(
gw.setTransform (Matrix3 1) -- 뷰를 기준 공간으로 만든다
for theNode in selection do
(
-- 공간변환 기준 --
-- h : 화면 왼쪽 아래 기준
-- w : 화면 왼쪽 위 기준
-- 문자 출력 ------------------------------------
viewPos = gw.hTransPoint theNode.pos -- View 좌표계로 공간 변환 h 기준
namePos = [viewPos.x, viewPos.y, 0]
gw.hText namePos theNode.name color:orange
------------------------------------------------
-- 테두리 만들기 --------------------------------
theMesh = try(snapShotasMesh theNode)catch() -- Poly이거나 Mesh가 아닌 Ojbect가 있을 수 있으니 Mesh를 떠서 확인한다.
if theMesh != undefined then
(
-- 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
)
free theMesh -- 임시로 만든 Mesh는 이제 필요 없음(뷰에 생성되어 있지 않다면 delete 보다 속다가 빠름)
------------------------------------------------
-- 갱신쪽에 문제가 있을 경우를 대비해서 --
gw.enlargeUpdateRect #whole
gw.updateScreen()
)
)
--------------------------------------------------
-- cbtn_ShowName
--------------------------------------------------
on cbtn_ShowName changed state do
(
-- 한번 등록된 함수는 등록할 때마다 새로 추가되니, 등록 전에 빼고 다시 넣는 것이 좋다
-- fn a = print 1
-- registerRedrawViewsCallback a
-- fn a = print 2
-- registerRedrawViewsCallback a
-- 이렇게 하면 2개의 함수가 모두 등록된다 덮어쓰는 것이 아니라..
-- 그리고 첫번째 넣은 fn a = print 1 함수는 변수연결이 끊어져 unRegisterRedrawViewsCallback을 할 수도 없게된다.
-- 그래서 unRegisterRedrawViewsCallback를 먼저 호출한다.
-- 대상 함수가 없다면 무시되니 처음 호출해도 문제가 없다.
unRegisterRedrawViewsCallback ShowName
if state then
registerRedrawViewsCallback ShowName
completeRedraw() -- 등록시점과 삭제 시점에는 redraw를 따로 해줘야 함
)
--------------------------------------------------
-- close
--------------------------------------------------
on g_showNameRollout close do
(
unRegisterRedrawViewsCallback ShowName
completeRedraw()
)
)
createDialog g_showNameRollout
)
'Max' 카테고리의 다른 글
Maxscript 디렉토리 관리하기 (0) | 2014.06.17 |
---|---|
Maxscript 스레드 함수에 파라미터 받기 (0) | 2014.06.09 |
손목 Twist Bone의 Flip현상 최소화 하기(LookAt 2개 사용) (0) | 2014.05.28 |
Maxscript 스레드를 분리해서 만들기(Multi Thread) (0) | 2014.05.21 |
Maxscript로 DB에 접근하기 (0) | 2014.05.15 |