C#ATIA

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

画面を原寸大にする8

こちらの続きです。
画面を原寸大にする7 - C#ATIA

結局、補正を入れる事で誤魔化しました。

折角なので、ズームのロック機能を付けようと思ったのですが、
ズーム自体はコマンドとして実行されていない事が分かりました。

ズームがコマンドで行われているだろうと思っていたので、
ロックさせてしまうのは簡単だろうと思っていたのですが、
予想外でした。ん~トランザクションに含まれない事も納得。

他にも方法が無い事も無いのですが、無難そうなcameraChanged
イベントを利用する事にします。
Fusion 360 Help
Changedイベントなので、ズームを行う直前では防ぐことが
出来ない為、ズームが行われた直後に元に戻しています。

# Fusion360API Python script

import traceback
import adsk.fusion
import adsk.core

_app: adsk.core.Application = None
_ui: adsk.core.UserInterface = None
_handlers = []
_viewExtents = 0
_txtIpt: adsk.core.TextBoxCommandInput = None

class MyCommandCreatedHandler(adsk.core.CommandCreatedEventHandler):
    def __init__(self):
        super().__init__()

    def notify(self, args: adsk.core.CommandCreatedEventArgs):
        adsk.core.Application.get().log(args.firingEvent.name)
        try:
            global _handlers
            cmd: adsk.core.Command = adsk.core.Command.cast(args.command)
            inputs: adsk.core.CommandInputs = cmd.commandInputs

            onDestroy = MyCommandDestroyHandler()
            cmd.destroy.add(onDestroy)
            _handlers.append(onDestroy)

            onExecute = MyExecuteHandler()
            cmd.execute.add(onExecute)
            _handlers.append(onExecute)

            onCameraChanged = MyCameraChangedHandler()
            _app.cameraChanged.add(onCameraChanged)
            _handlers.append(onCameraChanged)

            global _viewExtents, _txtIpt
            vp: adsk.core.Viewport = _app.activeViewport
            _viewExtents = vp.camera.viewExtents

            _txtIpt = inputs.addTextBoxCommandInput(
                'txtIpt',
                'viewExtents',
                f'{_viewExtents}',
                2,
                True
            )

        except:
            _ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))


class MyCameraChangedHandler(adsk.core.CameraEventHandler):
    def __init__(self):
        super().__init__()
    def notify(self, args: adsk.core.CameraEventArgs):
        adsk.core.Application.get().log(args.firingEvent.name)

        global _viewExtents, _txtIpt
        if _viewExtents != args.viewport.camera.viewExtents:
            cam: adsk.core.Camera = args.viewport.camera
            _txtIpt.text = f'{_viewExtents}\n{cam.viewExtents}'
            cam.viewExtents = _viewExtents
            args.viewport.camera = cam


class MyExecuteHandler(adsk.core.CommandEventHandler):
    def __init__(self):
        super().__init__()

    def notify(self, args: adsk.core.CommandEventArgs):
        adsk.core.Application.get().log(args.firingEvent.name)


class MyCommandDestroyHandler(adsk.core.CommandEventHandler):
    def __init__(self):
        super().__init__()

    def notify(self, args: adsk.core.CommandEventArgs):
        adsk.core.Application.get().log(args.firingEvent.name)
        adsk.terminate()


def run(context):
    try:
        global _app, _ui
        _app = adsk.core.Application.get()
        _ui = _app.userInterface

        cmdDef: adsk.core.CommandDefinition = _ui.commandDefinitions.itemById(
            'test_cmd'
        )

        if not cmdDef:
            cmdDef = _ui.commandDefinitions.addButtonDefinition(
                'test_cmd',
                'Test',
                'Test'
            )

        global _handlers
        onCommandCreated = MyCommandCreatedHandler()
        cmdDef.commandCreated.add(onCommandCreated)
        _handlers.append(onCommandCreated)

        cmdDef.execute()

        adsk.autoTerminate(False)

    except:
        if _ui:
            _ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

ちょっと不自然な動きなのですが、機能を殺すような事は出来ないですね。