2012年2月17日金曜日

Softimage Script : SeparateSelCluster

ツイッターで、クラスターを分離するスクリプトの話題が上がったので、
以前作った物をUPしてみたのですが、
人に見せるコードではないですね orz
自分ですらわかりません。

最近は、自スクリプトのメンテもするようになってきましたので
これは意識して修正をして行かねばなりませんね


SelarateSelCluster


選択したクラスターを分離して新しいオブジェクトにするスクリプト

#-----------------------------------------------------------------------
#SeparateSelCluster
#選択したクラスタを分離、マテリアルを適用

#使用法
#クラスタを選択実行

#履歴
# v1.0 完成

from win32com.client import constants as c
app = Application;log = app.Logmessage
import re
  
#-----------------------------------------------------------------------
# Main
#-----------------------------------------------------------------------
def main():

 #クラスターを確認
 oSel = app.Selection(0)
 if oSel.Type != "poly":
  log("Select Poly Cluster")
  return 0


 oCls = oSel
 oObj = oSel.Parent3DObject
 oGeo = oObj.ActivePrimitive.Geometry
 
 #ポリゴンのインデックスを-1で初期化[-1,-1,-1]
 aIndex = oGeo.Polygons.IndexArray  
 a = []
 for i in aIndex:
  a.append(-1)

 for i,v in enumerate(oCls.FindIndices(aIndex)):
  if v != -1:
   a[i] = 1
 extIndex = []

 for i,v in enumerate(a):
  if v == 1:
   extIndex.append(i)

 subset = extIndex
 oSub = oGeo.Polygons.SubComponent
 oSub.ElementArray = subset
 app.SelectObj(oSub)

 op = app.ExtractFromComponents("ExtractPolygonsOp", oSub, oObj.Name + "_" + oSel.Name, True, "siImmediateOperation", "siKeepGenOpInputs", "")
 newObj = op(0)(0)
 app.DeleteObj(oCls)

 oCls = newObj.ActivePrimitive.Geometry.Clusters
 for i in oCls:
  if i.Type == "polygon":
   newObj.SetMaterial(oCls.Material)
   app.DeleteObj(oCls)

 #親子付けをする
 #バグ報告アリガトウございますです。ちょっとOffっておきます〜
 #app.ParentObj(oObj.Parent3DObject,newObj)
 
 return 1

main()
#-----------------------------------------------------------------------


使用の際の不具合の責は負いませんぜ
バグ報告は歓迎します (≧▽≦)ゞ

0 件のコメント:

コメントを投稿