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
)

Posted by Hwanggoon
,