代码之家  ›  专栏  ›  技术社区  ›  Maarten -Monica for president

删除重复项(相同的多计数)Maxscript

  •  0
  • Maarten -Monica for president  · 技术社区  · 9 年前

    -- Remove object duplicates
    clearselection()
    select geometry
    deselect helpers
    objs = selection as array
    
    objS_info = #()
    objS_info2 = #()
    
    dups = #()
    for obj in objs do(
    
        obj_info = #()
        obj_dups = #()
    
        ConvertTo obj Editable_Poly
        PolyCount_src = polyop.getNumFaces obj
        --resetxform obj ; maxOps.CollapseNodeTo obj 1 true --reset Xform + collapse stack
        delta_x_src =  ((-1 * obj.min.x) + obj.max.x) 
        delta_z_src = ((-1 * obj.min.z) + obj.max.z)
        append obj_info PolyCount_src
        delta_ratio_src = delta_x_src/delta_z_src 
        for i in 1 to objs.count do(
    
            obj_dups = #()
    
            if objs[i] != obj do(
                ConvertTo obj Editable_Poly
                PolyCount = polyop.getNumFaces obj
                --resetxform obj ; maxOps.CollapseNodeTo obj 1 true --reset Xform + collapse stack
                delta_x =  ((-1 * obj.min.x) + obj.max.x) 
                delta_z = ((-1 * obj.min.z) + obj.max.z)
                delta_ratio = delta_x/delta_z 
                if(delta_ratio == delta_ratio_src and PolyCount == PolyCount_src) do(
                    append obj_dups objs[i]
                    )
    
                )
        )
    append dups obj_dups
    )
    
    format "dups = % \n " obj_dups
    

    1 回复  |  直到 9 年前
        1
  •  0
  •   Swordslayer    9 年前

    剥猫皮的方法很多。请注意,测试浮点是否相等(比较边界框大小比率时所做的操作相当危险(请参见示例) comparing float values 如果你想保留那张支票)。例如,可以按大小进行分组:

    objsByNumFaces = for obj in geometry where canConvertTo obj mesh collect
    (
        local snapshot = snapshotAsMesh obj
        local data = dataPair obj:obj numFaces:snapshot.numFaces
        delete snapshot
        data
    )
    
    qsort objsByNumFaces (fn _ x y = x.numFaces - y.numFaces)
    
    counter = 0
    prevCount = -1
    objsPartitioned = #()
    
    for pair in objsByNumFaces do
    (
        if pair.numFaces == prevCount then
            append objsPartitioned[objsPartitioned.count] pair.obj
        else
        (
            prevCount = pair.numFaces
            append objsPartitioned #(pair.obj)
        )
    )
    

    objsPartitioned 然后,阵列将包含按面数分组的对象。