デュプリケイトシンメトリーフロムオブジェクトPythonソン

JunkiTheJunkieさんの「SIのシンメトリコピーってローカルが無いのか?」という呟きを元に、折角なのでPythonScriptの勉強をかねて作ってみました。
っていうかPython勉強用の備忘録ではじめたの忘れてたw
内容は対象複製したものをピックしたオブジェクトとの座標別の距離を測って反対側に持っていく・・・っていうだけですが、SIのPythonの癖が少し入っているので参考までに…。

import win32com.client
from win32com.client import constants

# Applicationを短縮
app = Application

# XSIDialogをPythonで使える形に
xsidial = win32com.client.Dispatch( "XSIDial.XSIDialog" )
res = xsidial.ComboEx( 'title', ["XY Plane (z=0)","XZ Plane (y=0)","YZ Plane (x=0)"], 2 )

# キャンセルだとresに-1が入るのでその際は終了
if res is not -1:
	oColl = app.GetValue("SelectionList")
	
	# DuplicateSymmetryの基点Planeの設定を決定
	cp = [0,0,1]
	if res == 1:
		cp = [0,1,0]
	elif res == 2:
		cp = [1,0,0]
		
	# Pythonでは出力引数をサポートしていないのでタプルを利用して変数を組む(クリックされたボタン、修飾キー、ピックオブジェクト)
	# 対象基点にするオブジェクトをピックで選択させる
	oBtn,oMod,oPicked = app.PickObject( 'Pick CenterObject...', 'Pick CenterObject...' )
	# 基点オブジェクトのGlobalのポジションを取得
	ctrgpos = [ app.GetValue(oPicked.Kinematics.Global.Parameters("posx")),
				app.GetValue(oPicked.Kinematics.Global.Parameters("posy")),
				app.GetValue(oPicked.Kinematics.Global.Parameters("posz"))]
	# app.Logmessage( 'Picked : ' + str(oPicked) )
	# app.Logmessage( 'Modify Key : ' + str(oMod) )
	# 基点オブジェクトをピック時にCtrlを押していたら親共有モード
	pmod = ""
	if oMod == 2:
		pmod = True
	
	# 選択オブジェクトを繰り返す
	for oSel in oColl:
		# 複製オブジェクトのGlobalのポジションを取得
		orggpos = [ app.GetValue(oSel.Kinematics.Global.Parameters("posx")),
					app.GetValue(oSel.Kinematics.Global.Parameters("posy")),
					app.GetValue(oSel.Kinematics.Global.Parameters("posz"))]
		# DuplicateSymmetryはそのまま使用
		oDup = app.DuplicateSymmetry(oSel, "", pmod, cp[0], cp[1], cp[2], 0, "")
		app.Logmessage( 'Picked : ' + str(oDup) )
		if cp[0] == 1:
			app.SetValue(str(oDup)+'.kine.global.posx',(ctrgpos[0] - (orggpos[0] - ctrgpos[0])))
		elif cp[1] == 1:
			app.SetValue(str(oDup)+'.kine.global.posy',(ctrgpos[1] - (orggpos[1] - ctrgpos[1])))
		elif cp[2] == 1:
			app.SetValue(str(oDup)+'.kine.global.posz',(ctrgpos[2] - (orggpos[2] - ctrgpos[2])))

・・とまぁ観てお分かりかとおもいますが、SIでのPythonはコマンドの出力引数をサポートしていないので、変わりにタプル変数を使うとか、XSIDialogを使うときはwin32com.clientをインポートしてDspatchするとかあたりがVBSやJAVAスクリプトとかと勝手が違うところかな??