--这个工具首先是对uv进行操作的。首先是要 hold 住在进行操作。

--******************************************************************************************************
-- Created:   05-05-2011
-- Last Updated: 05-05-2011
-- Version:   1.0
--
-- Author :  Kostadin Kotev / miau_u@yahoo.com /
-- Version:  3ds max 2009 (should work in older versions too!)
--
-- Discription:
--   Randomly rotate the selected UV islands.
-- 
-- Usage:
--  UVW_Unwrap modifier must be applyed to object and the "Edit UVWs" rollout must be open.
--  Select some UV islands or select some verts,edges or faces of each UV islands and press the "Hold Selection" button.
--  Press the "Random Rotate" button several times.
--
--******************************************************************************************************
-- MODIFY THIS AT YOUR OWN RISK
/*
macroscript UVRandomRotate_v1
category:"miauu"
tooltip:"UV Random Rotate v1.0"
buttonText:"UV Random Rotate"
*/
---2011.9.02 盖天解释
--这个工具首先是对uv进行操作的。首先是要 hold 住在进行操作。
--这个好。
--通过使用和粗看我觉得是 随即的旋转uv 并且 hold 是旋转部分见整体。
--我现在觉得思路是记录所有点的位置, 加上移动位置 在设定旋转后的位置,
--2011.9.10 延迟了8 天进行操作。

(
 global rol_UVRandomRotate
 try(destroyDialog rol_UVRandomRotate)catch()
 rollout rol_UVRandomRotate "UV Rotate"
 (
  local uvIslands = #()
  local uv = undefined
  local subObjLevel = undefined
  
  checkbutton chkbtn_holdSelection "Hold Selection"
  button btn_rotateRandom "Random Rotate"
  
  function RandomRotateInVertSOL =  ---这个函数就是把部分因素转到全部因素进行处理,--这个函数是对于点的操作,这个很好 有用。
  (
   -- get all selected vertices
   allVerts = uv.getSelectedVertices() ---收积选择的点
   if not allVerts.isEmpty then ---not allVerts.isEmpty  判断他是否有效的 我一搬都是转数组。
   (
    -- find and separate selected elements
    while not allVerts.isEmpty do --这里真由必要吗、?
    (    
     -- set the first vertex as selected
     uv.selectVertices #{(allVerts as array)[1]}
     -- select the element of that vertex
     uv.SelectElement()-----选择因素的函数。
     -- select all vertices of this element
     elem01verts = uv.getSelectedVertices()
     append uvIslands elem01verts ------------在一次收集选择的加入到数组。是把整个点的位组加入到了数组, 好在下面引用。
     -- remove this vertices from original selection
     allVerts = allVerts-elem01verts ---然后又清空了 难道这个能释放内存,不是max 自己收集吗,我从来没有注意过这个。
    )
   )
   else
   (
    messagebox "Select some UV islands!" title:"miauu Script Error!!!"
    chkbtn_holdSelection.state = false
   )
  )
  
  --下面的操作和上面是一样的,也可以放到一个函数中进行判断。
  
  function RandomRotateInEdgeSOL =
  (
   allEdges = uv.getSelectedEdges()
   if not allEdges.isEmpty then
   (
    while not allEdges.isEmpty do
    (
     uv.selectEdges #{(allEdges as array)[1]}
     uv.SelectElement()
     elem01verts = uv.getSelectedEdges()
     append uvIslands elem01verts  --------设计方法是用一个数字 加入三个位 我一般都是用3 个数组 分别操作 这个办法很好。
     allEdges = allEdges-elem01verts
    )
   )
   else
   (
    messagebox "Select some UV islands!" title:"miauu Script Error!!!"
    chkbtn_holdSelection.state = false
   )
  )
  function RandomRotateInFaceSOL =
  (
   allFaces = uv.getSelectedFaces()
   if not allFaces.isEmpty then
   (
    while not allFaces.isEmpty do
    (
     uv.selectFaces #{(allFaces as array)[1]}
     uv.SelectElement()
     elem01faces = uv.getSelectedFaces()
     append uvIslands elem01faces
     allFaces = allFaces-elem01faces
    )
   )
   else
   (
    messagebox "Select some UV islands!" title:"miauu Script Error!!!"
    chkbtn_holdSelection.state = false
   )
  )
   
  on chkbtn_holdSelection changed theState do  ---这个可以在123 层级进行活动
  (
   if theState then
   (
    uv = modpanel.getcurrentobject() ---确定当前选择的层级,这个很重要,在skin插件中就是用这个做判断。
    if classof (uv) == Unwrap_UVW then
    (
     uvIslands = #()
     case uv.getTVsubobjectMode() of --uv.getTVsubobjectMode() 判断uv使用的层级,通过这个确定使用不同的方法。
     (
      1: (RandomRotateInVertSOL(); subObjLevel = 1) --subObjLevel 这里是一个全局变量 这里要往外输出信息。
      2: (RandomRotateInEdgeSOL(); subObjLevel = 2)
      3: (RandomRotateInFaceSOL(); subObjLevel = 3)
     )     
    )
    else
    (
     --没有选择层级的用法,这个应该是很重要。
     messagebox "Open the \"Edit UVWs\" window!" title:"miauu Script Error!!!"
     chkbtn_holdSelection.state = false
    )
   )
   else
   (
    uvIslands = #()
   )
  )
  
  on btn_rotateRandom pressed do
  ( 
   case subObjLevel of ---subObjLevel 这个就是上面输出的单位里,这个就是决定是边的操作 线的操作 还是面的操作/
   (
    1:
    (
     for i=1 to uvIslands.count do ---我觉得这里设计不是很合理。
     (
      uv.selectVertices uvIslands[i] --其实想想也合理; 如果点边都有选择 那么这里就是我在那个层级选择哪一个了
      uv.rotateSelectedCenter (random -3.14159 3.14159)
      --<void><Unwrap_UVW>.moveSelected <point3>offset
      --<void><Unwrap_UVW>.rotateSelected <float>angle <point3>axis
      --上面都有他的语法。
      -- 这样就到到了操作/
     )
    )
    2:
    (
     for i=1 to uvIslands.count do
     (
      uv.selectEdges uvIslands[i]
      uv.rotateSelectedCenter (random -3.14159 3.14159)
     )
    )
    3:
    (
     for i=1 to uvIslands.count do
     (
      uv.selectFaces uvIslands[i]
      uv.rotateSelectedCenter (random -3.14159 3.14159)
     )
    )
   )   
  )
 )
 createdialog rol_UVRandomRotate 84 54 style:#(#style_titlebar, #style_sysmenu,#style_toolwindow)
)

posted on 2011-09-10 10:07  盖天00  阅读(231)  评论(0编辑  收藏  举报

导航