2011年11月8日火曜日

Softimage Script : Extract Plus

オブジェクトをエリアごとに分割する必要があって、
ポリゴンを分けてたんだけど、
標準だといろいろメンドクサイ

通常のExtract

・原点はワールドに移動し
・新しいオブジェクトはScene_Rootの子に

オブジェクト数が少ないうちはいいが
新規のオブジェクトの位置が遠い orz


Extract Plust

・オブジェクトの親を同じにする
・名前を同じにする
・SRTを同じにする


以下コード
#Extract Plus
#v0.1
#SRTを抽出したオブジェクトと同じにする
delete = True
from win32com.client import constants as c
app = Application; log = app.Logmessage
def extractPoly():
 oSel = app.Selection(0)
 oSub = oSel.Subcomponent
 oObj = oSub.Parent3DObject
 oName = oObj.Name
 op = app.ExtractFromComponents("ExtractPolygonsOp","",oName,delete,1)
 newObj = op(0)
 if oObj.Parent.Name !="Scene_Root":
  app.ParentObj(oObj.Parent,newObj)

 oTrans = oObj.Kinematics.Global.Transform

 for Obj in newObj:
  Obj.Kinematics.Global.Transform = oTrans
  oGeo = Obj.ActivePrimitive.Geometry
  oPnts = oGeo.Points
  aPos = oPnts.PositionArray
  aPosList = [list(aPos[0]),list(aPos[1]),list(aPos[2])]

  v = XSIMath.CreateVector3()
  m = XSIMath.CreateMatrix4()
  oTrans.GetMatrix4(m)
  m.InvertInPlace()

  for i in range(oPnts.Count):
   v.Set(aPosList[0][i],aPosList[1][i],aPosList[2][i])
   v.MulByMatrix4InPlace(m)
   aPosList[0][i] = v.X
   aPosList[1][i] = v.Y
   aPosList[2][i] = v.Z 

  oGeo.points.PositionArray = aPosList
 return True

def main():
 if app.Selection.Count == 0:
  return
 if app.Selection(0).Type == "polySubComponent":
  extractPoly()
 else:
  log("Plz SelectPolygon")
 return
main()

0 件のコメント:

コメントを投稿