C#ATIA

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

カメラの操作1

ちょっと思う事があって、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

深く考えず、思いつくまま書いたのでコメントも無しな上、もうベタベタに
書いてます。続きは書きたいな。