C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

APIでレンダリング3

こちらの続きです。
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サービスが見つかると思います。