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
)

Posted by Hwanggoon
,