こちらの続きです。
APIでレンダリング2 - C#ATIA
酔わないgifアニメが出来ました。
60分割でレンダリングをしたので1コマ6°です。
1枚の画像が約2分なので、2時間です・・・。
もちろん1枚当たりの処理時間は、モデルやPCによって
大きく変わるはずです。
スクリプトはこの様な感じです。
# Fusion360API Python script import traceback import adsk import adsk.core as core import adsk.fusion as fusion import math import pathlib RENDER_QUALITY = 25 # 25-100 SPLITS_COUNT = 3 EXPORT_DIR = 'C:/temp' def run(context): ui: core.UserInterface = None try: # check export folder expDir: pathlib.Path = pathlib.Path(EXPORT_DIR) if not expDir.exists(): ui.messageBox(f'Folder not found: {EXPORT_DIR}') return # get RenderManager app: core.Application = core.Application.get() ui = app.userInterface des: fusion.Design = app.activeProduct renderMgr: fusion.RenderManager = des.renderManager renderMgr.activateRenderWorkspace() # get camera vp: core.Viewport = app.activeViewport camera: core.Camera = vp.camera target: core.Point3D = camera.target unit = math.radians(360 / SPLITS_COUNT) matLst = [] for idx in range(SPLITS_COUNT): mat: core.Matrix3D = core.Matrix3D.create() mat.setToRotation( unit * idx, core.Vector3D.create(0,0,1), target ) matLst.append(mat) cameraLst = [] for mat in matLst: camera: core.Camera = vp.camera eye: core.Point3D = camera.eye.copy() eye.transformBy(mat) camera.eye = eye upVec: core.Vector3D = camera.upVector.copy() upVec.transformBy(mat) upVec.normalize() camera.upVector = upVec cameraLst.append(camera) # preview motion backup: core.Camera = vp.camera for camera in cameraLst: vp.camera = camera vp.refresh() adsk.doEvents() vp.camera = backup # query res: core.DialogResults = ui.messageBox( 'OK?', "", core.MessageBoxButtonTypes.OKCancelButtonType, core.MessageBoxIconTypes.QuestionIconType ) if not res == core.DialogResults.DialogOK: return # execute rendering: fusion.Rendering = renderMgr.rendering rendering.renderQuality = RENDER_QUALITY name = app.activeDocument.name for idx, camera in enumerate(cameraLst): expPath = str(expDir / '{}{:003}.jpg'.format(name, idx)) renderFeat: fusion.RenderFuture = rendering.startLocalRender( expPath, camera, ) ui.messageBox('Done') except: if ui: ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
使い方は、事前にレンダリング環境を整えておきます。
処理に時間がかかる為、スクリプト実行後にレンダリング無しで
グルッと一周します。イメージを掴むためです。
その後、ダイアログが表示されるのでOKボタンで処理スタートです。
レンダリングはこちらのローカルレンダリングを行っているようです。
バックグラウンド(非同期)で処理されるため、”Done”が表示されても
処理をスタートし終わっただけで、画像は出来ないのでご注意を。
他の後は、Fusion360自体の操作は出来ますが、ローカルでレンダリング
してしまうと、バックグラウンドの処理が後回しになってしまうような
気がしました。その為、レンダリング以外の作業(モデリング作業等)は
OKだと思います。
レンダリングがシングルスレッドのなのですが、GUIのレンダリングが
優先されて処理されているっぽいです。
最大の難関は、レンダリングの作業スペースでスクリプトを実行する
方法が無い事です・・・。
(デザインでスクリプトの編集に入り、VSCodeで実行しました)
需要が有れば、アドインにしようかな?
最後になりますが、これはあくまでレンダリング画像をグルッと
一周取得するだけのスクリプトで、GIFアニメを作成するものではありません。
こちらのサイトにお世話になりました。
jpg -> gif
GIFメーカー (動画や画像からアニメーションを作ろう!)
jpg -> gif連結・調整(上記サイトがmax30枚だった為)
Online JPG to GIF converter
探せば他にも多くのWebサービスが見つかると思います。