##mox-motion presents #SplitRotation (Pyhton) #3軸の回転を、新規で作った親子Nullに振り分ける。親に1軸、子に2軸 #12/11/8 #使い方:3軸回転の入ったオブジェクトを選択して実行。主軸を選ぶダイアログが出る。 from win32com.client import constants as c app = Application oRoot = app.ActiveSceneRoot #カスタムプロパティーを作る oProp = XSIFactory.CreateObject("CustomProperty") oProp.name = "SplitRotation" #カスタムプロパティにパラメーター oProp.AddParameter2("Order",c.siInt4,0,0,3) #カスタムプロパティの表示 oLayout = oProp.PPGLayout aItems = ["X",0, "Y",1, "Z",2] oLayout.AddEnumControl("Order", aItems, "MainAxis", "Radio") oLayout.AddButton("Run","Run") #クリックしたときに実行 oLayout.Language = "Python" sLogic = u''' app = Application oRoot = app.ActiveSceneRoot def Run_OnClicked(): oAxis = PPG.order.value oSel = app.Selection oMainAxis = oRoot.AddNull("MainAxis") oAuxiliaryAxis = oMainAxis.AddNull("AuxiliaryAxis") oAuxiliaryAxis.primary_icon.value = 4 app.SaveKey("MainAxis.kine.local.{rotx,roty,rotz}",0) app.SaveKey("AuxiliaryAxis.kine.local.{rotx,roty,rotz}",0) oSel = app.Selection(0) oRotOrder = oSel.rotorder.value def ChengeOrderX():#Xを主軸に分割したいときはこの関数を使う。 oDummy = oRoot.AddNull("dummy") app.CopyAnimation(oSel) app.PasteAnimation(oDummy) intPlyin = app.getValue("PlayControl.in") intPlyout = app.getValue("PlayControl.out") app.PlotAndApplyActions(oSel.fullname + ".kine.global.{rotx,roty,rotz}","plot", intPlyin,intPlyout,) oSel.rotorder.value = 3 app.PlotAndApplyActions(oSel.fullname + ".kine.local.{rotx,roty,rotz}","plot", intPlyin,intPlyout,) app.CopyPaste(oSel.fullname +".kine.local.rotx", "", oMainAxis.rotx) app.CopyPaste(oSel.fullname +".kine.local.roty", "", oAuxiliaryAxis.roty) app.CopyPaste(oSel.fullname +".kine.local.rotz", "", oAuxiliaryAxis.rotz) app.RemoveAnimation(oSel.fullname + ".kine.global.{rotx,roty,rotz}") app.PasteAnimation(oSel) app.DeleteObj("dummy") def ChengeOrderY():#Yを主軸に分割したいときはこの関数を使う。 oDummy = oRoot.AddNull("dummy") app.CopyAnimation(oSel) app.PasteAnimation(oDummy) intPlyin = app.getValue("PlayControl.in") intPlyout = app.getValue("PlayControl.out") app.PlotAndApplyActions(oSel.fullname + ".kine.global.{rotx,roty,rotz}","plot", intPlyin,intPlyout,) oSel.rotorder.value = 1 app.PlotAndApplyActions(oSel.fullname + ".kine.local.{rotx,roty,rotz}","plot", intPlyin,intPlyout,) app.CopyPaste(oSel.fullname +".kine.local.roty", "", oMainAxis.roty) app.CopyPaste(oSel.fullname +".kine.local.rotx", "", oAuxiliaryAxis.rotx) app.CopyPaste(oSel.fullname +".kine.local.rotz", "", oAuxiliaryAxis.rotz) app.RemoveAnimation(oSel.fullname + ".kine.global.{rotx,roty,rotz}") app.PasteAnimation(oSel) app.DeleteObj("dummy") def ChengeOrderZ():#Zを主軸に分割したいときはこの関数を使う。 oDummy = oRoot.AddNull("dummy") app.CopyAnimation(oSel) app.PasteAnimation(oDummy) intPlyin = app.getValue("PlayControl.in") intPlyout = app.getValue("PlayControl.out") app.PlotAndApplyActions(oSel.fullname + ".kine.global.{rotx,roty,rotz}","plot", intPlyin,intPlyout,) oSel.rotorder.value = 0 app.PlotAndApplyActions(oSel.fullname + ".kine.local.{rotx,roty,rotz}","plot", intPlyin,intPlyout,) app.CopyPaste(oSel.fullname +".kine.local.rotZ", "", oMainAxis.rotZ) app.CopyPaste(oSel.fullname +".kine.local.rotX", "", oAuxiliaryAxis.rotX) app.CopyPaste(oSel.fullname +".kine.local.rotY", "", oAuxiliaryAxis.rotY) app.RemoveAnimation(oSel.fullname + ".kine.global.{rotx,roty,rotz}") app.PasteAnimation(oSel) app.DeleteObj("dummy") def ChengeOrderYXZ():#YXZからZを主軸に分割したいときは特別にこの関数を使う。 intPlyin = app.getValue("PlayControl.in") intPlyout = app.getValue("PlayControl.out") app.PlotAndApplyActions(oSel.fullname + ".kine.global.{rotx,roty,rotz}","plot", intPlyin,intPlyout,) app.CopyPaste(oSel.fullname +".kine.global.rotz", "", oMainAxis.rotz) app.CopyPaste(oSel.fullname +".kine.global.rotx", "", oAuxiliaryAxis.rotx) app.CopyPaste(oSel.fullname +".kine.global.roty", "", oAuxiliaryAxis.roty) app.RemoveAnimation(oSel.fullname + ".kine.global.{rotx,roty,rotz}") def ChengeOrderZXY():#ZXYからYを主軸に分割したいときは特別にこの関数を使う。 oDummy = oRoot.AddNull("dummy") app.CopyAnimation(oSel) app.PasteAnimation(oDummy) intPlyin = app.getValue("PlayControl.in") intPlyout = app.getValue("PlayControl.out") app.PlotAndApplyActions(oSel.fullname + ".kine.global.{rotx,roty,rotz}","plot", intPlyin,intPlyout,) oSel.rotorder.value = 1 app.PlotAndApplyActions(oSel.fullname + ".kine.local.{rotx,roty,rotz}","plot", intPlyin,intPlyout,) app.CopyPaste(oSel.fullname +".kine.local.roty", "", oMainAxis.roty) app.CopyPaste(oSel.fullname +".kine.local.rotx", "", oAuxiliaryAxis.rotx) app.CopyPaste(oSel.fullname +".kine.local.rotz", "", oAuxiliaryAxis.rotz) app.RemoveAnimation(oSel.fullname + ".kine.global.{rotx,roty,rotz}") app.PasteAnimation(oSel) app.DeleteObj("dummy") def ChengeOrderZYX():#ZYXからXを主軸に分割したいときは特別にこの関数を使う。 oDummy = oRoot.AddNull("dummy") app.CopyAnimation(oSel) app.PasteAnimation(oDummy) intPlyin = app.getValue("PlayControl.in") intPlyout = app.getValue("PlayControl.out") app.PlotAndApplyActions(oSel.fullname + ".kine.global.{rotx,roty,rotz}","plot", intPlyin,intPlyout,) oSel.rotorder.value = 3 app.PlotAndApplyActions(oSel.fullname + ".kine.local.{rotx,roty,rotz}","plot", intPlyin,intPlyout,) app.CopyPaste(oSel.fullname +".kine.local.rotX", "", oMainAxis.rotX) app.CopyPaste(oSel.fullname +".kine.local.rotY", "", oAuxiliaryAxis.rotY) app.CopyPaste(oSel.fullname +".kine.local.rotZ", "", oAuxiliaryAxis.rotZ) app.RemoveAnimation(oSel.fullname + ".kine.global.{rotx,roty,rotz}") app.PasteAnimation(oSel) app.DeleteObj("dummy") def SimpleChangeX(): app.CopyPaste(oSel.rotx, "", oMainAxis.rotx) app.CopyPaste(oSel.roty, "", oAuxiliaryAxis.roty) app.CopyPaste(oSel.rotz, "", oAuxiliaryAxis.rotz) def SimpleChangeY(): app.CopyPaste(oSel.roty, "", oMainAxis.roty) app.CopyPaste(oSel.rotx, "", oAuxiliaryAxis.rotx) app.CopyPaste(oSel.rotz, "", oAuxiliaryAxis.rotz) def SimpleChangeZ(): app.CopyPaste(oSel.rotz, "", oMainAxis.rotz) app.CopyPaste(oSel.rotx, "", oAuxiliaryAxis.rotx) app.CopyPaste(oSel.roty, "", oAuxiliaryAxis.roty) #=================================================== if oRotOrder == 0: app.LogMessage("XYZ") if oAxis == 0: #XYZをX主軸で分割 ChengeOrderX() elif oAxis == 1: #XYZをY主軸で分割 ChengeOrderY() elif oAxis == 2: #XYZをZ主軸で分割 SimpleChangeZ() oSel.rotorder.value = 0 elif oRotOrder == 1: app.LogMessage("XZY") if oAxis == 0: #XZYをX主軸で分割 ChengeOrderX() elif oAxis == 1: #XZYをY主軸で分割 SimpleChangeY() elif oAxis == 2: #XZYをZ主軸で分割 ChengeOrderZ() oSel.rotorder.value = 1 elif oRotOrder == 2: app.LogMessage("YXZ") if oAxis == 0: #YXZをX主軸で分割 ChengeOrderX() elif oAxis == 1: #YXZをY主軸で分割 ChengeOrderY() elif oAxis == 2: #YXZをZ主軸で分割 ChengeOrderYXZ() oSel.rotorder.value = 2 elif oRotOrder == 3: app.LogMessage("YZX") if oAxis == 0: #YZXをX主軸で分割 SimpleChangeX() elif oAxis == 1: #YZXをY主軸で分割 ChengeOrderY() elif oAxis == 2: #YZXをZ主軸で分割 ChengeOrderZ() oSel.rotorder.value = 3 elif oRotOrder == 4: app.LogMessage("ZXY") if oAxis == 0: #ZXYをX主軸で分割 ChengeOrderX() elif oAxis == 1: #ZXYをY主軸で分割 ChengeOrderZXY() elif oAxis == 2: #ZXYをZ主軸で分割 ChengeOrderZ() oSel.rotorder.value = 4 elif oRotOrder == 5: app.LogMessage("ZYX") if oAxis == 0: #ZYXをX主軸で分割 ChengeOrderZYX() elif oAxis == 1: #ZYXをY主軸で分割 ChengeOrderY() elif oAxis == 2: #ZYXをZ主軸で分割 ChengeOrderZ() oSel.rotorder.value = 5 ''' #ロジック設定 oLayout.Logic = sLogic #表示 app.InspectObj(oProp,"","",c.siLock)