2015-10-29 8 views
0
macroScript Grouper category: "MaxScript==Shit" 
(
on isEnabled return 
selection.count > 0 

on execute do 
    (
     createDialog (
          rollout mf_main "LOD Grouper" 
          (


           button savebtn "Group Proper LODs" 
           on savebtn pressed do 
           (


            max_count = 2 
            lodlist = #() 




             for index in 1 to $.count do 
             (


              if($[1].name == $[index].name + "_lod1") 
              then(append lodlist $[1]) 
              else() 

              if($[1].name == $[index].name + "_lod1") 
              then(append lodlist $[index]) 
              else(reset) 


              print lodlist 

             ) 




             lodgroup = group lodlist 
             select lodgroup 


           ) 


          ) 
         ) 
    ) 




) 

Это мой сценарий он делает то, что я хочу, проверяя имена в выборе и сравнивая их, чтобы увидеть, которые соответствуют на основе префикса и суффикса, но его только делает это в один объекты в мой выбор вместо зацикливания через мой массив выбора3ds MAXScript объекты группы в соответствии с именем и именем + суффикс

пример того, что им пытаются сделать сценарий сделать

objects name box01, box01_lod1/box02, box02_lod1/box03 , box03_lod1 

       group-1    group-2   group-3 

любая помощь очень ценится

заранее спасибо

ответ

1

В вашем примере, точно такой же тест выполняется два раза подряд:

if($[1].name == $[index].name + "_lod1") 
then(append lodlist $[1]) 
else() 

if($[1].name == $[index].name + "_lod1") 
then(append lodlist $[index]) 
else(reset) 

Я подозреваю, что это опечатка, и вы хотите, чтобы проверить против префикса затем суффикс .. .

Приведенный выше код сравнивается с первым элементом массива выбора. Не зная, что вы выбираете, трудно понять, действительно ли это правильно.

Способ, которым я подходил к этому, - иметь массив имен для тестирования, чтобы сгруппировать выбранные узлы. Каждый раз, когда выбранный узел не «сопоставляется» в массиве имен, вы добавляете его как уникальный массив в lod_groups. Если он согласован, он просто добавляется к одному из существующих массивов lod_groups.

Обратите внимание, что предполагается, что вы всегда будете иметь узел с именем «Box001» в сцене. Например, «Lod1_Box001» и «Box001_Lod2» не будут сгруппированы, если у вас нет узла «Box001» в сцене.

local lod_groups = #() -- 2d array 
local _names = #() -- list of names to test against 
local selected_nodes = getCurrentSelection() -- get selected nodes 
for i = 1 to selected_nodes.count do 
(
    local found = False 
    local index = 0 
    local node_name = selected_nodes[i].name 
    -- test node_name against _names 
    for j = 1 to _names.count do 
    (
     local n = node_name 
     local pattern = "*" + _names[j] + "*" 
     -- if the name in the list is greater swap the pattern test, this will cover suffix and prefix 
     if _names[j].count > node_name.count then 
     (
      n = _names[j] 
      pattern = "*" + node_name + "*" 
     ) 
     -- if it matches the current name, then record the j-index 
     if (matchpattern n pattern:(pattern)) then 
     (
      found = True 
      index = j 
     ) 
    ) 
    -- append to lod_groups based on results 
    if found then 
    (
     append lod_groups[index] selected_nodes[i] 
    ) 
    else 
    (
     -- add this name to the _names list, it most likely is unique 
     append _names selected_nodes[i].name 
     append lod_groups #(selected_nodes[i]) 
    ) 
) 
-- do your grouping here 
for lod_group in lod_groups do 
(
    group lod_group 
)