3ds maxscript组对象根据名称和名称+后缀

时间:2015-10-29 22:01:47

标签: 3dsmax maxscript

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


                                )


                            )
                         )
    )




)

这是我的脚本,它通过检查选择中的名称并比较它们来查看基于前缀和后缀的匹配但是它的唯一,它正在做我想要的 对我选择的对象进行操作而不是遍历我的选择数组

我试图让脚本做的例子

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

               group-1              group-2           group-3

非常感谢任何帮助

提前致谢

1 个答案:

答案 0 :(得分:1)

在您的示例中,相同的确切测试连续执行两次:

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

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

我怀疑这是一个错字,你想测试一个前缀,然后是后缀...

上面的代码与选择数组的第一项进行比较。在不知道你选择什么的情况下,很难知道这是否确实是正确的方法。

我接近此方法的方法是使用名称数组进行测试,以便对所选节点进行分组。每次选定的节点没有匹配时#39;在名称数组中,将其作为唯一数组添加到lod_groups。如果它匹配,那么它只是附加到现有的lod_groups数组之一。

请注意,假设您将始终拥有一个名为' Box001'的节点。在场景中。例如,' Lod1_Box001'和' Box001_Lo​​d2'如果您没有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
)