こちらの続きです。
画面を原寸大にする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()))
ちょっと不自然な動きなのですが、機能を殺すような事は出来ないですね。