多维子材质脚本加入了对于贴图名称的查找,去除了 logo


 
 ---**********************************************************************************************************************
 ---************************************************************************************************************************
 --(
       stand_mat = #()
        nostand_mat = #()
        map_preparation =#() --准备收集贴图的数组。
       material_map_map =#()
 
 --
 -- 清空第一个材质 并制定给选择物体第一个。
 --
  fn clmedit_add =
 (
 oop_array = selection as array 
  meditMaterials[1] =  oop_array[1].Material
 )
-- clmedit_add()
 
 
 --
 --判断是否是 多维材质,是的话就进行,不是 提示,显示一秒。
 --返回 数量
 --
 fn or_or num  =
 ( 
   
    if classof $.material   == Multimaterial then
    ( 
      clmedit_add()
     --
     -- 查询他的个数
     --
     --看来是要通过他的类表进行数量的查看,这个效果就好。
     --
   -- shu = meditMaterials[1].numsubs
    
     shu =  meditMaterials[num].materialIDList. count
    
     return  shu
     
    )else
    (
     return false 
    
    )
 )
 
 --
 --数量循环判断所有的通道是不是,标准材质, 如果不是打开材质自己看看
 --
 fn check_unm    =
 (
  unm = or_or 1
  --
  -- 我也学会用return
  --
 if unm == undefined then
 (
  return false
 )
 
  --
  --判断每个通道是不是标准材质,如果不是加入到一个数组,是的话加到另一个数组
  --
  list_mat = meditMaterials[1].materialIDList
  --
  --上面是材质id数组
  --
 stand_mat=#()
  for i in 1 to unm do
  ( 
   --
   --索引材质球要用id索引
   --
    if classof  meditMaterials[1][list_mat[i]] == Standardmaterial  then
    ( 
     --
     --收集的是物体的id
     --
     append  stand_mat list_mat[i]
    
    )
    else
    (
     --
     --也是收集的物体的id 号
     --
     append  nostand_mat  list_mat[i]
    
     if  nostand_mat.count >0 then
     (
     
     if AboutRollout != undefined then destroydialog AboutRollout
    rollout AboutRollout "About"
    (
    label lbl5  "选择物体的多维材质中" pos:[10,10]
    label lbl3 "有不是标准子材质的材质"
    timer tmclose "" interval:2000 active:true
    on AboutRollout rbuttonup press do destroydialog AboutRollout ------ 右键进行消除
    on tmclose tick do destroydialog AboutRollout  --时间按点到消除  给我提供了思路。
    )createdialog AboutRollout 200 100  modal:true style:#(#style_border,#style_sysmenu,#style_sunkenedge)
       --
    --不是的print出来、
    --
     clearListener()
                 setListenerSel #(0,-1)
      for i in nostand_mat do
      (
            format "不是标准材质的有: meditMaterials[1][%]\n" i    Listener()
      )
    )
    )
  )
 -- print stand_mat
    -- print nostand_mat     
 )
 --
 ----- 从上面的函数中我得到了是材质的标准材质。
 --
 ---
 --清除多维子材质中未使用贴图的子材质,提供选择未使用贴图的子材质的mesh/poly的面。
 --
 --就是清除没有贴图的材质,并且是选择没有贴图的面。
 --下面在加一个函数,这个数种完成了去除没有材质的球体。
 --
 --并收集了其id 。下面在做面的指定。 cle_mat_id_face_add
 --
 
 fn cle_mat_id_face =
 ( 
   --
  --材质内部的数组。面数的选择。
  --
  met_obj_face =#()
  --
  --没有材质的通道。
  --
  met_obj_face_id =#()
  --
  --一切的源都是选择材质的数组开始。  stand_mat
  --
  check_unm()
  comparison = stand_mat
 
  --
  --到这一步确定都是标准材质
  --收集当前的通道数量
  --
  for i in comparison  do
  (
   --
   --返回标准材质的通道数 其实这里面可以直接用24
   --应为我查找的都是标准材质。
   --
   --这里我改成24 2011.4.7
   --channel_num = getnumsubtexmaps MeditMaterials[1][i]
   channel_num = 24
   --
   --查看贴图通道。
   --
   for n in 1 to channel_num do 
   (
    --
    --贴图通道的是否指定。
    --
    the_prop = getSubTexmap MeditMaterials[1][i] n
    --
    --看来还要加入有贴图的
    --
    if the_prop != undefined then
    (
     --
     --这里面如果有多通道就会重复,所以要用数组来查找。
     --
    if  findItem  map_preparation i ==0 then
    (
     --
     -- 保证了数组的单一性
     --
    
     append  map_preparation i
    )
    
    )
   )
 
  )
  --
  -- 在上面收到了有材质的数值。
  --
  --进行设定 去除没有材质的。
  --去除了没有材质的材质通道。在去除的同时要选择没有材质的面。
  --
 --  meditMaterials[1].materialIDList = map_preparation
 
  --
  --在这里面首先是,通过数组查找形式,找到没有材质的材质球。在一次选择 物体的id
  --
  --注意:这里的这里的球体id也可能是多余的,做判断时要防止错误。
  --
  for each in comparison do
  (
   --
   --说明是没有材质的,收集到数组,然后我在在
   --
   --选择的物体上找到乡音的面,相加,并选择。
   --
  if  findItem  map_preparation  each ==0  then
  (
    append  met_obj_face_id  each
  )
 
  )
 
     return met_obj_face_id
 )
 
 --
 --
 -- 下面就是清除贴图函数。
 --
 --
 --
 
  fn cle_mat_id_face_add =
  (
   --
   --我利用返回功能执行完成去除材质球的命令。
   --在返回没有材质球的数值
   --
     clear_array_mat = cle_mat_id_face ()
    meditMaterials[1].materialIDList = map_preparation
      select_one = $selection [1]  
      max modify mode
   --
   -- 先判断  Editable_mesh 装ploy  是ploy在往下进行处理。
   --
    if classof select_one.baseobject== Editable_mesh then
    (
     -- 转多边行
     convertTo  select_one PolyMeshObject
    )
    --
    --多边形单独判断,效果更好。
    --
  if classof select_one.baseobject== Editable_Poly  then
 
      ( --
    --下面选择的总面数。
    --
    dat_num = #{}
    --
    --转到基层
    --
    modPanel.setCurrentObject $.baseObject
    --
    --转到4层
    --
     subobjectLevel = 4
    ---
    -- 要用到循环处理面数,相加问题,
    --
    for i in clear_array_mat do
    (
     --
     --测试下面对没有材质的不会有益处现象,所以我就可以这样写下来。
     --
     select_one.EditablePoly.selectByMaterial i
     dat_num += polyop.getfaceselection $
    
    
    
    )
    --
    --选择总的面数,并且是更新面数视图选择。
    --
     polyop.setfaceselection select_one  (dat_num )
     nodeInvalRect select_one
 
   )
  )
  --
  --
  ---上面就是清除贴图函数。
  --
  --
 
 --
 --修改子材质的材质名称函数。
 -- 
  fn mat_modifiers_mane  prefix name_n suffix =
  ( 
   --
   --这个函数单独进行所以也需要把选择物体的材质反倒第一栏
   -- 并且是针对于多维材质的一个表达。
   --
   --
     --其实这面就是返回的数据。
         or_or 1
   --
   --脚本的健壮性
   --
    if  or_or 1 ==false then return false
  
   list_mat  = meditMaterials[1].materialIDList
  
   for i in list_mat do
   (
    if name_n=="" then
    (
     meditMaterials[1][i].name =prefix +  meditMaterials[1][i].name +suffix
    )else
    (
     meditMaterials[1][i].name =prefix +  name_n+i as string +suffix
    )
   
   )
  
  
  )
  --
  --
  --
  --
  --
  --上面清除多维材质的脚本完成。
  --
  --
  --
  --
  --下面要做一个能改变一个材质贴图贴图的名称,还有就是 能改变多维材质所有的材质球的贴图的名称
  --
  --对当前材质改名字。也就是手动知道几24 材质的通道
  fn multimaterial_mat  nums   prefix name_n suffix   =
  (
             or_or 1
   --
   --脚本的健壮性
   --
    if  or_or 1 ==false then return false
  
    --
    -- 这个函数就是对一个多维材质的里的24 个通道进行改名字的处理,
    --
    if classof meditMaterials[1][nums] ==Standardmaterial then
    (
     --
     --返回材质的通道数 24
     --
     chenk = getnumsubtexmaps meditMaterials[1][nums]
        
        --
     --从24 中进行循环 查看24 个通道中不是undefined 的收集 并批量改名字。
     --
      for each in 1 to  chenk do
   ( 
    --
    --查看通道的返回情况,收集有贴图通道
    --
     the_prop = getSubTexmap MeditMaterials[1][nums] each
   
     if the_prop!= undefined then
     ( --
      --the_prop!= undefined  说明是有贴图名字的。
      --
      if  name_n== "" then
      (--
       --本身的名字不用改,只是加入前缀还有就是后缀的处理。
       --
       kl = (getSubTexmap MeditMaterials[1][nums] each )  .name
       --
       -- 名字群集的构造。
       --
        (getSubTexmap MeditMaterials[1][nums] each ) .name = prefix+ kl+suffix
      )else
      (
      
     (getSubTexmap MeditMaterials[1][nums] each ) .name= prefix+ name_n+ nums as string +suffix 
      
      )
     )
   
   )
   
   
    )
   
   
  )---end fn
  --
  --这个就是给所有的材质球的,贴图进行命名活动。
  --1 首先判断多维材质。
  --2 收集标准材质通道的id
  --3对每一个id进行内部的循环。
  --
  fn multimaterial_mat_all   prefix name_n suffix  =
  (
   --
   --允许上面的函数,我们得到。把是多维材质放到第一个球体之上。
   --并在其通道中进行查询
   --找到是标准材质通道的id 成数组
   --
   check_unm ()
   --
   --数组从上面集成下来。
   --
    mat_array = stand_mat
   --
   --如果数组是空的时候 返回
   --
   if mat_array.count ==  0 then  return false
   for i in  mat_array do
   (
    --
    --meditMaterials[1][1]
    --
    --for each in
    --
    --这里面也是要用循环
    --
     if  classof meditMaterials[1][i] == Standardmaterial then
     (   --
      --如果上面做了判断下面就是24 这里面是个动态判断,其实是浪费了时间。
      --
       chenk = getnumsubtexmaps meditMaterials[1][i]
     
       for each in 1 to  chenk do
       ( 
     --
     --查看通道的返回情况,收集有贴图通道
     --
      the_prop = getSubTexmap MeditMaterials[1][i] each
    
      if the_prop!= undefined then
      ( --
       --the_prop!= undefined  说明是有贴图名字的。
       --
       if  name_n== "" then
       (--
        --本身的名字不用改,只是加入前缀还有就是后缀的处理。
        --
        kl = (getSubTexmap MeditMaterials[1][i] each )  .name
        --
        -- 名字群集的构造。
        --
      (getSubTexmap MeditMaterials[1][i] each ) .name = prefix+ kl+suffix
       )else
       (
       (getSubTexmap MeditMaterials[1][i] each ) .name= prefix+ name_n +each as string  +suffix 
       )
      )---end  if the_prop!= undefined then
    
       )---end for each
         
     
     )---end if
   
   
   )---end for
   
  )---end fn
  --
  --
  -- 美白了。固有色的改法,从相应的id中索引得到
  --
  --
  fn Fixed_point_color   unm cloor_id   =
  (
 --
 --还是要调用第一个材质函数。还是用,收集的标准材质id 数组。
 --  
   check_unm ()
   --
   --数组从上面集成下来。
   --
    mat_array = stand_mat
   --
   --如果数组是空的时候 返回
   --
   if mat_array.count ==  0 then  return false
  
   --
   --循环处理他的颜色。
   --对了这里面不用统一颜色,要的是,不同的材质不同的颜色。
   --
   --for i in mat_array do
   --(
     if  classof meditMaterials[1][unm] == Standardmaterial then
     (
      meditMaterials[1][unm].diffuse =cloor_id
     
     )---end if
   
   
  -- )---end for
    
  )---end fn
  --
  --
  --
  --上面函数实现了子材质固有色的处理。
  --
  --
  --
  --根据id修改物体的顶点颜色。
  fn dingdianclor  objID  clort =
  (
   --
   --第一步还是要把,材质归到第一个材质操作,
   --这里面我在这里也收集下,他的id 其实在下面用处不是很多。
   --
  
    check_unm ()
   --
   --这里面的收集主要是用到类表中用处不大、
   --
  
   mat_array = stand_mat
   --
   --当然前提全都是在多维的范围中。
   --
   if  classof meditMaterials[1][objID] == Standardmaterial then  
   (
  --
  -- 其实是在收集之前最好要去掉没有的用到的材质。这样类表收集就不会出错。
  --
            --
   -- 就是去掉和物体的材质id 多的。数组中, 在和 mat_array 球出一样的。  加入到类表。通过颜色改正。
      -- 
      --不进行查找了对于设置空的也是不报错的。
   --  
    
    --
    --主要功能就是,
    --
     select_one = $selection [1]
     max modify mode
   
        if classof select_one.baseobject== Editable_mesh then
   (
    -- 转多边行
    convertTo  select_one PolyMeshObject
   )
   --
   --多边形单独判断,效果更好。
   --
    dat_num = #()
    if classof select_one.baseobject== Editable_Poly  then
 
     (  
      modPanel.setCurrentObject select_one.baseObject
  
               subobjectLevel = 4
  
              --选择id求出面数。
            select_one.EditablePoly.selectByMaterial objID
      --polyop.getfaceselection 这里用顶点选择、
      select_one.EditablePoly.ConvertSelection #Face #Vertex
      subobjectLevel = 1
             dat_num =  polyop.getVertSelection select_one
      
      --
      --设定顶点颜色。
      --
      polyop.setVertColor select_one  0  dat_num  clort
     
     )
   )----end if  
  
  )-----end fn
  --
  --
  --在上面的过程中,顶点颜色完成。是通过面到点的一个过渡效果。
  --
  --
 
  --
  --下面函数处理1.合并多维子材质中使用相同贴图的子材质,并清除mesh/poly下的多余材质ID号
  --
  tietushouji_map_id =#()
 fn  Map_collection  =
 (
  --
  -- 在写这个函数时 我只有大概的想法,知道只是个检索性的问题。 在做循环处理时,是个次方是的增长,
  --这里我是试探性的往下写的。
  --
  check_unm ()
  mat_array = stand_mat
  --
  --下面的工作就是找出没有贴图的。
  --收集与贴图的。
  --
    for i in  mat_array do
    (   --
     --动态收集数字。
     --
     --chenk = getnumsubtexmaps meditMaterials[1][i] ---这也是动态收集其实没有必要要。直接给24 常量就好了 2011.4.7
  --因为在我已经是收集的标准材质了所以这里肯定是24 我试验过了 所以这里改成: 2011.4.7
  --chenk = 24
    
      for each in 1 to  24 do  --这里其实直接就可以写成24 算法就更快了。 我把 这里的chenk 改成24 了 2011.4.7
     ( 
   --
   --查看通道的返回情况,收集有贴图通道
   --
    the_prop = getSubTexmap MeditMaterials[1][i] each
  
    if the_prop!= undefined then
    ( --
     --the_prop!= undefined  说明是有贴图名字的。
     -- 
     --
     --
     --
     if  findItem  tietushouji_map_id  i ==0  then
     append  tietushouji_map_id  i
    
    )---end if then_prop
  
     )---end for each
    )----end for
    return  tietushouji_map_id
 
 )----end fn
 --
 --
 --上面函数返回一个数组,就是有贴材质的数值。下面就是要处理比较的东西。
 --
 --
 
  bmp_zhuan_string =#()
 fn map_map_compared =
 (
  map_array_com =  Map_collection ()
  --
  --这里面为什么要用他的数量呢。因为是这样的,我想把收集的东西做成一个数组的加入。这样效果就会很好
  --数组的成员有一定的排列。
  --
  if map_array_com.count ==0 then return false
  --
  -- 在这里面,有等于0 时 在查找相同材质没有意义,函数返回不进行执行。
  --
 
  for i in 1 to  map_array_com.count do
  (  
    linshi_add_array =""
   try chenk = getnumsubtexmaps meditMaterials[1][(map_array_com[i])] catch()
   --其实上面这里也没有什么必要因为我在收集的过程当中只是在标准的材质中 有贴图的材质中进行循环的。所以肯定是24 其实这里也增加了计算量。2011.4.7
   --=======上面是在实际的工作中防止错误的。
   --
   --在24个中循环。
   --
   for each in 1 to chenk do
   (
    the_prop = getSubTexmap MeditMaterials[1][(map_array_com[i])] each
   
    if  classof  the_prop  == Bitmaptexture then
 (
  --把贴图名称摘出来进行相加比较。
  str = the_prop.fileName ---分出来要最后一个。
  
   oop = filterString   str "\\" --分组
  
   add_array = oop[(oop.count)]

 --
    --把各个通道的值,加入到数组中。
    --
    append  linshi_add_array add_array 
  
 )
   
   )
  
   --
   -- 存到固定的数组中
   --
   bmp_zhuan_string[i] = linshi_add_array as string
   --*********************************************************************************************
   --2011.4.7 经我擦看发现 我收集的是 每个通道的 信息 并转成字符串 再次把数组转成字符串 在加入到数组。 这次
   --如我这里表示一张贴图是这样的:
     --在 Diffuse Color 中有一张贴图是这样的。“Map#3(3.jpg)”
     -- 但是当我访问他是 他会显示 : Map #3 :Bitmap 如果我把它转成字符串 那显然是用到了他的名字。
     --而 在这次的脚本中要求 只看贴图在硬盘中的那个显示的名字,不看在max中的名字。
     -- 所以我的所有的问题只是改这里就好、2011.4.7
   --*****************************************************************************************
  )--end for
 
   return  bmp_zhuan_string
 
 )----end fn
 --
 --
 --上面的函数实现了收集有贴图通道 ,并且把把24 通道全都收集起来,转成字符串,加到数组的过程。
 --
 --


 
 
 
 --***************************************************************************
  zhuan_string =#()
 fn map_compared =
 (
  map_array_com =  Map_collection ()
  --
  --这里面为什么要用他的数量呢。因为是这样的,我想把收集的东西做成一个数组的加入。这样效果就会很好
  --数组的成员有一定的排列。
  --
  if map_array_com.count ==0 then return false
  --
  -- 在这里面,有等于0 时 在查找相同材质没有意义,函数返回不进行执行。
  --
 
  for i in 1 to  map_array_com.count do
  (  
    linshi_add_array =""
   try chenk = getnumsubtexmaps meditMaterials[1][(map_array_com[i])] catch()
   --其实上面这里也没有什么必要因为我在收集的过程当中只是在标准的材质中 有贴图的材质中进行循环的。所以肯定是24 其实这里也增加了计算量。2011.4.7
   --=======上面是在实际的工作中防止错误的。
   --
   --在24个中循环。
   --
   for each in 1 to chenk do
   (
    the_prop = getSubTexmap MeditMaterials[1][(map_array_com[i])] each
   
    the_prop =the_prop as string
    --
    --把各个通道的值,加入到数组中。
    --
    append  linshi_add_array the_prop
   
   )
   --
   -- 存到固定的数组中
   --
   zhuan_string[i] = linshi_add_array as string
   --*********************************************************************************************
   --2011.4.7 经我擦看发现 我收集的是 每个通道的 信息 并转成字符串 再次把数组转成字符串 在加入到数组。 这次
   --如我这里表示一张贴图是这样的:
     --在 Diffuse Color 中有一张贴图是这样的。“Map#3(3.jpg)”
     -- 但是当我访问他是 他会显示 : Map #3 :Bitmap 如果我把它转成字符串 那显然是用到了他的名字。
     --而 在这次的脚本中要求 只看贴图在硬盘中的那个显示的名字,不看在max中的名字。
     -- 所以我的所有的问题只是改这里就好、
  
  
  
   --*****************************************************************************************
  )--end for
 
   return  zhuan_string
 
 )----end fn
 --
 --
 --上面的函数实现了收集有贴图通道 ,并且把把24 通道全都收集起来,转成字符串,加到数组的过程。
 --
 --
 -- 下面的活动就是,对数组中找形同。
 global add_mat_num =#()
      add_mat_dao =#()
 
 fn array_mat_compared   hanshu  =
 (   
 
  art_map_ch =  hanshu     --map_compared()
  --
  --数组不为零的处理方法。
  if art_map_ch == false then return false
  --
  if ( art_map_ch.count==0 and  art_map_ch.count==1 ) then return false
   --
  --循环查找。
  --
    kl=0
      oop_oo =""
   global  gt_aryu =#()
   global aty_1 =#()
     xin=#()
  for i in 1 to (art_map_ch.count-1)  do
  ( 
   --
   --要比较的下一个、
   --
          each =i+1 ---自增的比较项。
    oop_oo=i as string
   for  m  in each to art_map_ch.count do
   (
    --  比较
    if art_map_ch[i] == art_map_ch[m] then
    ( oop_oo+= "-"+ m as string
    
    )else
    (
    --oop_oo+=""
    )
     -- (i as string +"-"+ m as string)
  -- )
     --
   ---这里面是使用的指定,所以就不要加入了。
  
 
   --
   if  (filterString  oop_oo "-" ).count  >1  then
   (
   -- if oop_oo ==undefined then oop_oo="undefined"
   
     add_mat_num[i] = oop_oo
   
   
    /*
    if kl == 0 then (
     add_mat_num[i] = oop_oo
     add_mat_dao =add_mat_num
     kl+=1
    )else
    (   if kl != 0  then
     (
     --strry = (filterString  oop_oo "-" ) ---进来后把它分开
    
      for na in  1 to add_mat_num.count do
      (
        --lingshi = filterString  i "-" ---把已经加入的进行分开,
        --for str in strry do
         --for ling in lingshi do 
       --
       -- 我要用findString "1-2-3" "2-3" 这样制作。
       --
        if add_mat_num [na] == undefined then  add_mat_num [na]  = undefined
        -- na == undefined then na = "undefined"
         --
        --由于有 undefined 的时候。
        --
       if( findString add_mat_num [na]  oop_oo == undefined )  then
       (      
           add_mat_dao[i] = oop_oo
       )
      
      )---end for
      )---end if
    
    
    ) ---end else
    */
   
   
   
   
   
   
   )
  )
     
  )---end for 
  
 --
 ---去掉undefined 如:#("1-2-4", undefined, "3-5")
 -- 
           add_mat_num
 
  if  add_mat_num.count <1 then return false
  for i in 1 to add_mat_num.count do
  (
   if add_mat_num [i] == undefined then
   ( 
    add_mat_num [i] = "undefined"
   
    append gt_aryu  (add_mat_num [i] )   

   )---end if     --deleteItem  add_mat_num  i
  )
  --
  --ary 就是储存undefind 的所有节点
  --
 -- print gt_aryu as string
 -- print  add_mat_num
   for i in add_mat_num  do
   (
    --
    --少的里面找多的、
    --
    if  findItem  gt_aryu   i ==0 then  append aty_1  i
   )
  
   add_mat_num = aty_1
  
   --****************************************************
   --上面的算法没有算干净,所以根据oop原则 行可多写几行不要无目的修改。呵呵
   --
   --*****************************************************
if  add_mat_num.count >1 then
(
 yytadd_mat_dao=#()
 map_ = add_mat_num.count-1
 map__= add_mat_num.count
 -- print  (add_mat_num as string )
 for m in 1 to  map_  do
 (
 ecct= m+1
 for each  in ecct to  map__ do
 (
    if( findString  add_mat_num[m]  add_mat_num[each] != undefined )  then
      (      
       --   yytadd_mat_dao[m] =  add_mat_num[each]
      
       append  yytadd_mat_dao  add_mat_num[each]
      )
   
   
 )

 )
  
  for nu in  add_mat_num  do
  (
   if  findItem  yytadd_mat_dao  nu ==0 then
    append   xin   nu
  
  ) ----上面是新算法,还是用的递归。
 
 
 
  add_mat_num = xin 
)
  
       return add_mat_num
 
 )---rnd fn
 
 
 
   fn gt_selctt    =
  (   
   kol =1
     if $selection.count >1 then
  (
        if AboutRollout != undefined then destroydialog AboutRollout
  rollout AboutRollout "About"
  (
  label lbl5  "选择数量大于1 将不执行," pos:[10,10]
  label lbl3 "以此提醒。"
  timer tmclose "" interval:1000 active:true
  on AboutRollout rbuttonup press do destroydialog AboutRollout ------ 右键进行消除
  on tmclose tick do destroydialog AboutRollout  --时间按点到消除  给我提供了思路。
  )createdialog AboutRollout 200 100  modal:true style:#(#style_border,#style_sysmenu,#style_sunkenedge)
  
  kol+=1
   return kol
  )else ( return kol )
 
  )
 --
 --并且是标准材质的id 。
 --
-- )
    try ( destroydialog gt_unnamedRollout) catch ()
rollout gt_unnamedRollout "多维材质工具" width:208 height:568
 (
 
local bm = bitmap 192 48 color:red

 button name_but "清除没有材质的通道并选择面" pos:[8,60] width:192 height:24
 --imgTag  bmp1 "Bitmap" pos:[8,8] width:192 height:48 bitmap:bm
 
 edittext nameedt1 "前缀:" pos:[8,88] width:192 height:16
 edittext nameedt2 "名字:" pos:[8,112] width:192 height:16
 edittext nameedt3 "后缀:" pos:[8,136] width:192 height:16
 
 button matbtn2 "子材质命名" pos:[8,160] width:88 height:24
 button matbtn3 "子贴图命名" pos:[104,160] width:96 height:24
 
 
 dropdownList ddl1 "id" pos:[8,184] width:64 height:10
 checkbutton  metckb1 "收集子材质id" pos:[80,200] width:112 height:24 --checked:false
 
 colorPicker cp1 "" pos:[8,240] width:53 height:39
 dropdownList metddl4 "id" pos:[72,238] width:56 height:10
 
 checkbutton shoujibtn11 "颜色id" pos:[130,248] width:64 height:32
 
 button btn12 "子材质的固有色" pos:[8,288] width:88 height:24
 button btn13 "子材质的顶点色" pos:[104,288] width:96 height:24
 
 checkbox myCheckBox "同名贴图"  pos:[140,316]
 
 listBox lbx2 "子材质同贴图列表:" pos:[6,316] width:136 height:16
 
 
 button btn14 "收集顺序" pos:[148,335] width:56 height:24
 
 button btn15 "有map收集" pos:[148,368] width:56 height:24
 
 button btn16 "执行" pos:[148,398] width:56 height:50  toolTip:" 执行\n 贴图\n id\n合并"
 label lab1 "号数:--" pos:[148,450]

  on lbx2  selected  arg do  ---这里是临时不上,非常方便。
  (
   lab1.text = arg as string +"号"
  )
 
 

          -- gt_oo = gt_selctt()
  --if gt_oo ==2  then return false  ---看来我要到处用到这两句了。
  on name_but pressed do with undo on  
  (
   gt_oo = gt_selctt()
  if gt_oo ==2  then return false  ---看来我要到处用到这两句了。
  cle_mat_id_face_add ()
  )
 
  on matbtn2 pressed do with undo on    
  (
   gt_oo = gt_selctt()
  if gt_oo ==2  then return false  ---看来我要到处用到这两句了。
 
  mat_modifiers_mane  nameedt1.text nameedt2.text nameedt3.text
 
 
 
  )
 
-- stand_mat
 on metckb1 changed state do
 (
     gt_oo = gt_selctt()
  if gt_oo ==2  then return false  ---看来我要到处用到这两句了。
 check_unm()
  if state==true  then
  (  
        lingshi =#()
  if  stand_mat.count<1 then  return false
   for i in 1 to stand_mat.count  do
   (
     date_state =((stand_mat[i]) as string )
   append lingshi   date_state
   
   )
   gt_unnamedRollout.ddl1.items  = lingshi
  )
  else
(
  gt_unnamedRollout.ddl1.items =#()
)---end else 
  )---end on
  --
   on shoujibtn11 changed state do
 (
 
     gt_oo = gt_selctt()
  if gt_oo ==2  then return false  ---看来我要到处用到这两句了。
 check_unm()
  if state==true  then
  (  
        lingshi =#()
  if  stand_mat.count<1 then  return false
   for i in 1 to stand_mat.count  do
   (
     date_state =((stand_mat[i]) as string )
   append lingshi   date_state
   
   )
   gt_unnamedRollout.metddl4.items  = lingshi
  )
  else
(
  gt_unnamedRollout.metddl4.items =#()
)---end else 
  )---end on
  -- 下面就是多维材质的,单独指导与多选的操作。
  --
  on matbtn3 pressed do with undo on
  (
  
      gt_oo = gt_selctt()
  if gt_oo ==2  then return false  ---看来我要到处用到这两句了。
   if metckb1.checked ==true  and gt_unnamedRollout.ddl1.selected != undefined   then
   (
    date_h =gt_unnamedRollout.ddl1.selected as integer
    multimaterial_mat  date_h   nameedt1.text nameedt2.text nameedt3.text
    
   )---end if
   else
   (
    multimaterial_mat_all  nameedt1.text nameedt2.text nameedt3.text
   )---end else
  
  )---end pressed
 
 
  on btn12 pressed do with undo on
  (
  
      gt_oo = gt_selctt()
  if gt_oo ==2  then return false  ---看来我要到处用到这两句了。
   if shoujibtn11.checked ==true  and gt_unnamedRollout.metddl4.selected != undefined   then
   (
    clor = gt_unnamedRollout.cp1.color
    date_h =gt_unnamedRollout.metddl4.selected as integer
   
    Fixed_point_color date_h clor
   
   )---end if 
  )---end on
  on btn13 pressed do with undo on
  (
       --cle_mat_id_face()
      gt_oo = gt_selctt()
  if gt_oo ==2  then return false  ---看来我要到处用到这两句了。
  
 -- cle_mat_id_face()
 
   if shoujibtn11.checked ==true  and gt_unnamedRollout.metddl4.selected != undefined   then
   (
    clor = gt_unnamedRollout.cp1.color
    date_h =gt_unnamedRollout.metddl4.selected as integer
   
    dingdianclor date_h clor
   
   )---end if 
  )---end on

on btn14 pressed do with undo on
   (
     
       gt_oo = gt_selctt()
  if gt_oo ==2  then return false  ---看来我要到处用到这两句了。
   --我在2010.4.7 对脚本进行更改项。这次主要是收集贴图是否一样,不看名称。
  if gt_unnamedRollout.myCheckBox.checked ==false then
  (
 
 stand_mat = #()
 nostand_mat = #()
 map_preparation =#()
 material_map_map =#()
 tietushouji_map_id =#()
 zhuan_string =#()
 add_mat_num =#()
 add_mat_dao =#()
  bmp_zhuan_string=#()
--
--开始的组必须初始化要不对
-- 
     
      
      --check_unm () -- 这个其实没有必要要。 应为在下面的函数中我已经有了相关的操作。2011.4.7
      Map_collection()
     cle_mat_id_face()
 
 
     date_gt = array_mat_compared  (map_compared()) --其实在里面已经运行了   Map_collection() 上面不用也行 这样只会增加计算量
   --其实最节约时间的不是这些算多少遍 而是我们要用什么样的算法。
    if date_gt == false then
    gt_unnamedRollout.lbx2.items  = #()
    else
        (   
      gt_unnamedRollout.lbx2.items=#()---先叫他等于空,这个很是有用。
      gt_unnamedRollout.lbx2.items  = date_gt
   gt_unnamedRollout.lbx2.selection=1
  )
 
  ) else
  (
   ---这里面就是当check true 时做一个比较。到时候 在执行事件里也是根据他有响应的东西。
   stand_mat = #()
 nostand_mat = #()
 map_preparation =#()
 material_map_map =#()
 tietushouji_map_id =#()
 zhuan_string =#()
 add_mat_num =#()

      add_mat_dao =#()
     bmp_zhuan_string=#()
--
--开始的组必须初始化要不对
-- 
     
      
      check_unm () -- 这个其实没有必要要。 应为在下面的函数中我已经有了相关的操作。2011.4.7
      Map_collection()
     cle_mat_id_face()
 
    kkl = map_map_compared()
     date_gt = array_mat_compared (kkl) --其实在里面已经运行了   Map_collection() 上面不用也行 这样只会增加计算量
   --其实最节约时间的不是这些算多少遍 而是我们要用什么样的算法。
    if date_gt == false then
    gt_unnamedRollout.lbx2.items  = #()
    else
        (   
      gt_unnamedRollout.lbx2.items=#()---先叫他等于空,这个很是有用。
      gt_unnamedRollout.lbx2.items  = date_gt
   gt_unnamedRollout.lbx2.selection=1
  )
  
  
  
  
  )----end checks
 
   )---end pressed
 
 
   on btn15 pressed do with undo on
   (
       gt_oo = gt_selctt()
  if gt_oo ==2  then return false  ---看来我要到处用到这两句了。
  
 
 
stand_mat = #()
nostand_mat = #()
map_preparation =#()
material_map_map =#()
tietushouji_map_id =#()
zhuan_string =#()
add_mat_num =#()
--
--开始的组必须初始化要不对
-- 

      check_unm ()
      Map_collection()
   cle_mat_id_face()
    --
    --收集有贴图的map
    --
     lingshi =#()
     date_gt= Map_collection()
      if  date_gt.count<1 then  return false
   for i in 1 to date_gt.count  do
   (
     date_state =((date_gt[i]) as string )
   append lingshi   date_state
   
   )
       gt_unnamedRollout.lbx2.items=#()
      gt_unnamedRollout.lbx2.items =lingshi
   
   )---end on
  
    on btn16 pressed do  --with undo on  不知道为甚不能用undo
 (
   try (gt_oo = gt_selctt()
   if gt_oo ==2  then return false  ---看来我要到处用到这两句了。
   )catch ()
  
  -- if myCheckBox.checked ==false then
  
  
   obj_id =#()--把字符串转成 数组数组。
  date_gt=""
     gt_date=""
  if  (gt_unnamedRollout.lbx2.selected != undefined )then
  (  
   gt_date =gt_unnamedRollout.lbx2.selected
  
   --
   --能转开filterString ,这一点很重要。
   --
    if  (filterString  gt_date "-" ).count  >1  then
     (
   uiop =filterString  gt_date "-"
   --
   --把字符串数组转成数组数组。
   -- 这要进入数组中的必有两个或两个以上的元素。
   --
   for i in uiop  do
   (
    ui = i as integer -- 转成整数
   
    append  obj_id  ui
   
   )---end for
  
  )else
  (
   messageBox "请用**收集顺序**" title:"盖天编写"
                return false
           
  )
  
      --print obj_id

  ---end if
  ---------------上面得出整数数组。
  --
  --找到实际对应的id号。合并物体的id  合并材质的id 公进行三部分
  --
  --、
  --1.找到实际对应的id号
  --
    -- gt_oo = gt_selctt()
  --if gt_oo ==2  then return false  ---看来我要到处用到这两句了。
 
stand_mat = #()
nostand_mat = #()
map_preparation =#()
material_map_map =#()
tietushouji_map_id =#()
zhuan_string =#()
add_mat_num =#()
--
--开始的组必须初始化要不对
-- 
    list_matsrray =#()
    global  list_matsrrayone =#()
 
 check_unm ()
 Map_collection()
 cle_mat_id_face()
--
--收集有贴图的map
--
lingshi =#()
date_gt= Map_collection()
  --
  -- 通过上面的函数可以找到 带贴图的标准的 序号
     --
 
  --
  -- 通过循环特到真正的数值id 进行面数的合并。
 
   gt_zhenzheng_date =#()
  for i in obj_id do
  (
   append   gt_zhenzheng_date   date_gt [i]
  
  )
  --
  -- 找到了真正的id数组。
  --
    -- gt_zhenzheng_date  --从这个里面找到 为了材质id的指定。为了材质球的指定
   --
   gt_int_num =  gt_zhenzheng_date[1]
 
 
  ---**************************************************************
  select_one = selection as array
    select_one =select_one[1]  
      max modify mode
   --
   -- 先判断  Editable_mesh 装ploy  是ploy在往下进行处理。
   --
    if classof select_one.baseobject== Editable_mesh then
    (
     -- 转多边行
  macros.run "Modifier Stack" "Convert_to_Poly"
    -- convertTo  select_one PolyMeshObject
    )else (print "no ploy")
    --
    --多边形单独判断,效果更好。
    --
  if classof select_one.baseobject== Editable_Poly  then
 
      ( --
    --下面选择的总面数。
    --
    dat_num = #{}
    --
    --转到基层
    --
    modPanel.setCurrentObject $.baseObject
    --
    --转到4层
    --
     subobjectLevel = 4
    ---
    -- 要用到循环处理面数,相加问题,
    --  
    for i in gt_zhenzheng_date do
    (
     --
     --测试下面对没有材质的不会有益处现象,所以我就可以这样写下来。
     --
     select_one.EditablePoly.selectByMaterial i
     dat_num += polyop.getfaceselection $
    
    
    
    )
    --
    --选择总的面数,并且是更新面数视图选择。
    --
     polyop.setfaceselection select_one  (dat_num )
     nodeInvalRect select_one
 --
 --设置材质函数
 --
 try  (select_one.EditablePoly.setMaterialIndex  gt_zhenzheng_date[1]  1 )catch ()
 --
 --推出层级,完成材质设定,
 --
   subobjectLevel = 0

   )else (print "no execution ")
    --
 -- 下面要做的是合并材质球中东西 。 并跟新收集类表。
 --
   ---下来要用到虚拟 gt_unnamedRollout.btn14.pressed()
     --
   --- 先求它的类表。这里面肯定是用的是第一个材质。
   --
  
  list_mat  = meditMaterials[1].materialIDList 
  --gt_zhenzheng_date 在这个数组中我要从2 个开始循环,和现在收集的数值进行比较。如果相同 进行。。。
      for i in 2 to gt_zhenzheng_date.count do
   (
    if findItem  list_mat  gt_zhenzheng_date[i] != 0  then
    (
     append  list_matsrray  gt_zhenzheng_date[i]
    )
    -- print  list_matsrray
   )----end for
  
   --
   --list_matsrray 就有了少数。 在吧少数排除
   --
   print ( list_matsrray as string)
  for m in list_mat do
  (
    if findItem  list_matsrray  m ==0 then
    (
     append  list_matsrrayone  m
    )---end if
  
  
  )---end for
  --
  --明白了材质不会制动美。他会集成,所以,我们要进行行材质指定。
  --把要排除的加入到一个数组,
   paichuwannan =#()
   for ru in  list_mat  do
   (
    if findItem  list_matsrrayone  ru ==0 then
    (
       append  paichuwannan  ru
    )  
   )
    for i in  paichuwannan  do  
    (
      meditMaterials[1][i] =Standardmaterial ()
    )
   ---就是上面这个问题检查了我一天、
 
  
   meditMaterials[1].materialIDList =list_matsrrayone
  --
  --指定材质。 再次刷新类表。
  --
    gt_unnamedRollout.btn14.pressed()
 --这里不用这种办法了 我收集原来的贴图进行操作,这个应该注意。
 
 
 
 
 
 
 
 
  )else (print "")
 
 
 
 
  
 
 ) ----end pressed
 
 on gt_unnamedRollout open do
 ( 


 
  ------------------------------------------------------------
 
    for i in gt_unnamedRollout.controls  do
  (
   i.enabled =false
  )
  Callbacks.AddScript #SelectionSetChanged  "Fn_CallBack_duoweicazhi()"  ID:#gt_mat_met
 )---end on
 on gt_unnamedRollout close do
 (
  callbacks.removescripts #selectionSetChanged ID:#gt_mat_met
 )---end on
 
 
 )
 createDialog  gt_unnamedRollout
 
     
callbacks.removescripts #selectionSetChanged ID:#gt_mat_met        
fn   Fn_CallBack_duoweicazhi =
(
 
 TheSelection = Selection as array
 
 if $== undefined then
 (
  for i in gt_unnamedRollout.controls  do
  (
   i.enabled =false
  )
 )else
 (
 
 if  (classof TheSelection[1].Material) == Multimaterial then
 (  
  for i in gt_unnamedRollout.controls  do
  (
   i.enabled =true
  )
 
 )else
 (
  for i in gt_unnamedRollout.controls  do
  (
   i.enabled =false
  )
 
 ) --end else
)---end else


Callbacks.AddScript #SelectionSetChanged  "Fn_CallBack_duoweicazhi()"  ID:#gt_mat_met
 
--我还要做个保好的,就是在执行的时候,检查的数量大于1 弹出提醒 不执行。
 
 

 -----函数解释。


-- check_unm
--对于上面函数的解释 也是为了更好以后应用
--里面包含了好几个函数:
--clmedit_add --第一个材质就是选择物体的第一个材质。这个是为了保证材质的唯一性。
--or_or num 这个函数输入的数值是一, 当选择的第一个是多维时 就返回他的多维的数量。如果不是就返回 false

--check_unm 最后用他进行一个包含处理, 如果 or_or 1 返回的不是undifind 那么就往下处理。
--再次判定是否是标准材质,这次判定的标准材质是这样的:
 -- 由于在判定的时候是索引的材质第一个槽位 的材质id 号,我是收集它的 材质数量 还有就是id 的数组。
 --用到了 list_mat = meditMaterials[1].materialIDList  数组
 --还用到了 check_unm 的返回值是材质的数量这两个数肯定是一样的。
 
 --stand_mat 就是过滤后的最后的材质数组序列号。
 
 ---如果有不是多维材质的就把它加到令一个数组 并且把不是的输出来。在之歌处理上我还是觉的很好的。
 /*(
     --
     --也是收集的物体的id 号
     --
     append  nostand_mat  list_mat[i]
    
     if  nostand_mat.count >0 then
     (
     
     if AboutRollout != undefined then destroydialog AboutRollout
    rollout AboutRollout "About"
    (
    label lbl5  "选择物体的多维材质中" pos:[10,10]
    label lbl3 "有不是标准子材质的材质"
    timer tmclose "" interval:2000 active:true
    on AboutRollout rbuttonup press do destroydialog AboutRollout ------ 右键进行消除
    on tmclose tick do destroydialog AboutRollout  --时间按点到消除  给我提供了思路。
    )createdialog AboutRollout 200 100  modal:true style:#(#style_border,#style_sysmenu,#style_sunkenedge)
       --
    --不是的print出来、
    --
     clearListener()
                 setListenerSel #(0,-1)
      for i in nostand_mat do
      (
            format "不是标准材质的有: meditMaterials[1][%]\n" i    Listener()
      )
    )
    )*/
 
 --就是上面那些
 --check_unm ()事件到这一步其实就是过滤掉了在多维材质中不是标准的材质球 得到了“很干净”的数组
 --
 --在下一事件中就是Map_collection 贴图收集的东东
 --下面我要做一个解释:
 --在这里其实我做的不是很好。我是先执行了一下   check_unm ()  因为上面有了 我在这里只是为了收集数组。
 --我下面用到了mat_array = stand_mat  把数组进行了转接
 --
 --Map_collection 函数就是返回 符合上面所有,并且是有贴图的 头道 在进行收集到
 --tietushouji_map_id 这里面。
 
 
 --cle_mat_id_face 函数 就是对之上的东西操作 我将在下面进行解释。
 --我总觉得cle_mat_id_face 和Map_collection 差不多 在处理这样的函数时候 我这里写的有点乱了
 --
 --cle_mat_id_face  --z终于明白了 这个函数其实就是返回没有材质的 材质球是第几个。用到了这样一种思路。
 
 
  -- date_gt = array_mat_compared () 在单击事件中这是最后一个函数。 其实我觉得就是他了。 我要大部分在这个函数里面做手脚
  -- 就是写一个和上面类似的函数这次我只是收集 判定他的贴图 看来我又要用字符串进行比交了。
  --
  --下面我将做一个解释:
 

posted on 2011-04-08 09:02  盖天00  阅读(1578)  评论(0编辑  收藏  举报

导航