ちょっと思う事があって、Fusion360のカメラをテストしました。
スクリプトを実行後、2回ボディをクリックします。
ボディをクリックするものの、カメラの位置を取得するための
アクションの為、深い意味はございません。
最初のクリックのカメラの状態を保存し、2回目のクリックで
再びカメラの状態を保存しています。
その後問い合わせがありOKを押すと、最初と2回目のカメラの状態を
等分割した状態で再生します。・・・パラパラ漫画です。
# Fusion360API Python script import traceback import adsk import adsk.core as core import adsk.fusion as fusion import time def run(context): ui: core.UserInterface = None try: app: core.Application = core.Application.get() ui = app.userInterface des: fusion.Design = app.activeProduct root: fusion.Component = des.rootComponent vp: core.Viewport = app.activeViewport msg: str = "Select 1" selFilter: str = "Bodies" sel: core.Selection = select_ent(msg, selFilter) if not sel: return camSt: core.Camera = vp.camera msg: str = "Select 2" sel: core.Selection = select_ent(msg, selFilter) if not sel: return camEd: core.Camera = vp.camera ui.activeSelections.clear() res: core.DialogResults = ui.messageBox( "OK?", "test", core.MessageBoxButtonTypes.YesNoButtonType) if res == core.DialogResults.DialogNo: return count = 250 vecEye: core.Vector3D = camSt.eye.vectorTo(camEd.eye) unitEye = vecEye.length / count vecEye.normalize() vecEye.scaleBy(unitEye) vecTarget: core.Vector3D = camSt.target.vectorTo(camEd.target) unitTarget = vecTarget.length / count vecTarget.normalize() vecTarget.scaleBy(unitTarget) _, stW, stH = camSt.getExtents() _, edW, edH = camEd.getExtents() unitW = (edW - stW) / count unitH = (edH - stH) / count baseUp = camSt.upVector.copy() stUp: core.Vector3D = camSt.upVector.copy() stUp.scaleBy(-1) unitUp: core.Vector3D = camEd.upVector.copy() unitUp.add(stUp) unitUp.scaleBy(1 / count) eye: core.Point3D = camSt.eye.copy() target: core.Point3D = camSt.target.copy() camSt.isSmoothTransition = False for i in range(count): vecE = vecEye.copy() eye.translateBy(vecE) camSt.eye = eye vecT = vecTarget.copy() target.translateBy(vecT) camSt.target = target camSt.setExtents( stW + unitW * i, stH + unitH * i ) baseUp.add(unitUp) camSt.upVector = baseUp vp.camera = camSt adsk.doEvents() app.log(f"Idx:{i}") time.sleep(0.01) except: if ui: ui.messageBox("Failed:\n{}".format(traceback.format_exc())) def select_ent( msg: str, filter: str ) -> core.Selection: try: app: core.Application = core.Application.get() ui: core.UserInterface = app.userInterface sel = ui.selectEntity(msg, filter) return sel except: return None
深く考えず、思いつくまま書いたのでコメントも無しな上、もうベタベタに
書いてます。続きは書きたいな。