2017-07-29 43 views
0

我想從場景中刪除所有重複的對象,我想通過比較所有對象的polycount來找到重複項。刪除重複(相同的polycount)Maxscript

當我找到每個對象的polycount時,我想將所有具有相同polycount的對象組合在一起,並刪除其中一個對象。應該很簡單,我有麻煩建設一個數組與其中所有重複的對象,雖然...

我的代碼不會引發錯誤,但不會將任何對象添加到#(重複)數組。我的代碼確定所有對象的polycount並將其放入objs_info數組中。

-- 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 

任何幫助將不勝感激,謝謝!

回答

0

許多方法去皮膚貓。請注意,測試浮點數是否相等(您在比較邊界框大小比率時所做的操作相當危險)(例如,如果要保留該檢查,請參閱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陣列將包含面數組合的對象。

+0

非常感謝您的回答!我同意,比較彩車是相當危險的(我沒有去想它讀你的答案之前)。比較頂點count會是一個更好的選擇(因爲頂點數是一個整數值),會嘗試和修改你的腳本來比較objs的頂點數 – Maarten

+0

我設法修改該腳本以這種方式檢查是否polycount和vertcount是相等的:) – Maarten