C#ATIA

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

ツールライブラリをコピーする

タイトルが違いますが、こちらの続きです。
アクティブなドキュメントに工具を作る - C#ATIA

正直な所、工具を作るのは面倒です。
その為、既存のツールライブラリをゴッソリコピペしてしまう方が
楽です。
(数字や文字を追いかけて工具作るより、GUI画面で作った方が分かりやすい)


こちら、最初は勘違いしましたがアクティブなドキュメントに入っている
ツールライブラリを新規のドキュメントに丸ごとコピーするスクリプトです。
Re: Manufacturing (CAM) API Feedback - Autodesk Community
これはこれで機能はしますが、ちょっと使う場面が多いとは思えないです。


有難いことにツールライブラリをjsonとして変換出来るため、
アクティブなドキュメントのツールライブラリをjsonとして書き出す
スクリプトはこちらです。

# Fusion360API Python script

import traceback
import adsk.core as core
import adsk.cam as cam
import json


def run(context):
    ui: core.UserInterface = None
    try:
        app: core.Application = core.Application.get()
        ui = app.userInterface

        # アクティブドキュメントのツールライブラリ
        # https://help.autodesk.com/view/fusion360/ENU/?guid=GUID-C0A61669-1C70-4A68-8CAA-158108844FC7
        stateToolLib: cam.DocumentToolLibrary = get_cam_product().documentToolLibrary
        # ui.messageBox(f'Active DocumentToolLibrary Count:{stateToolLib.count}')
        if stateToolLib.count < 1:
            return

        # json化
        toolLibJson = stateToolLib.toJson()
        print(json.dumps(json.loads(toolLibJson), indent=2))

        write_file(
            r'C:\temp\ToolLib.json',
            json.dumps(json.loads(toolLibJson), indent=2),
        )

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


def get_cam_product() -> cam.CAM:
    '''
    CAMの取得
    '''
    app: core.Application = core.Application.get()
    activete_cam_env()

    return app.activeProduct


def activete_cam_env() -> None:
    '''
    CAMアクティブ
    '''
    app: core.Application = core.Application.get()
    ui: core.UserInterface = app.userInterface

    camWS: core.Workspace = ui.workspaces.itemById('CAMEnvironment') 
    camWS.activate()


def write_file(path: str, txt: str,) -> None:
    '''
    書き出し
    '''
    with open(path, 'w') as f:
        f.write(txt)

書き出したjsonを読み込み、アクティブなドキュメントのツールライブラリに
書き込むスクリプトはこんな感じです。

# Fusion360API Python script

import traceback
import adsk.core as core
import adsk.cam as cam

def run(context):
    ui: core.UserInterface = None
    try:
        app: core.Application = core.Application.get()
        ui = app.userInterface

        stateToolLib: cam.DocumentToolLibrary = get_cam_product().documentToolLibrary
        ui.messageBox(f'Before ToolLibrary Count:{stateToolLib.count}')

        importToolLib: cam.ToolLibrary = cam.ToolLibrary.createFromJson(
            load_file(
            r'C:\temp\ToolLib.json',
            )
        )

        [stateToolLib.add(t) for t in importToolLib]
        ui.messageBox(f'After ToolLibrary Count:{stateToolLib.count}')

        # camObj: cam.CAM = get_cam_product()
        # camObj.documentToolLibrary = importToolLib #<-これはダメっぽい

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


def get_cam_product() -> cam.CAM:
    '''
    CAMの取得
    '''
    app: core.Application = core.Application.get()
    activete_cam_env()

    return app.activeProduct


def activete_cam_env() -> None:
    '''
    CAMアクティブ
    '''
    app: core.Application = core.Application.get()
    ui: core.UserInterface = app.userInterface

    camWS: core.Workspace = ui.workspaces.itemById('CAMEnvironment') 
    camWS.activate()


def load_file(path: str) -> str:
    '''
    読み込み
    '''
    with open(path) as f:
        return f.read()


但し書き出したjsonが文字化けしているんですよね。

エンコード指定で書き出せば解決するかな?