C#ATIA

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

使用可能な 外観/マテリアル リストをエクスポート

Fusion360の 外観/マテリアル をAPIで扱ったことが無かったのですが、
作ってみました。

#Fusion360API_Python script
#Author-kantoku
#Description-外観/マテリアルのリストをエクスポート

import adsk.core, adsk.fusion, traceback

def run(context):
    ui = None
    try:
        app = adsk.core.Application.get()
        ui = app.userInterface
        des = adsk.fusion.Design.cast(app.activeProduct)

        ope = SelectOperation(ui)
        if len(ope) < 1: return

        path = Get_Filepath(ui)
        if len(path) < 1: return

        ids = []
        lst = []
        for matLib in app.materialLibraries:
            lst = matLib.appearances if ope == 'App' else matLib.materials
            ids.append('-- {} ({})| {} --'.format(matLib.name, len(lst), matLib.id))
            for itm in lst:
                ids.append('    {} | {}'.format(itm.name, itm.id))

        writeFile(path, ids)

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

def SelectOperation(ui):
    msgBtnTypes = adsk.core.MessageBoxButtonTypes
    dlgRess = adsk.core.DialogResults
    no = dlgRess.DialogNo
    
    msg = '出力するリストはどれですか?\n'
    msg += 'はい:外観\nいいえ:マテリアル\nキャンセル:中止'
    res = ui.messageBox(msg,'',msgBtnTypes.YesNoCancelButtonType)
    if res == dlgRess.DialogYes:
        return 'App'
    elif res == dlgRess.DialogNo:
        return 'Mate'
    else:
        return ''

def writeFile(path, lst):
    file = open(path, 'w')
    file.write('\n'.join(lst).encode("CP932", "ignore").decode("CP932"))
    file.close()

def Get_Filepath(ui):
    dlg = ui.createFileDialog()
    dlg.title = '保存'
    dlg.isMultiSelectEnabled = False
    dlg.filter = 'Text(*.txt)'
    if dlg.showSave() != adsk.core.DialogResults.DialogOK :
        return ''

    return dlg.filename

クラウドのファイルリストを取得するスプリクトより、遥かに早いです。

出力されるファイルは
ライブラリに関しては

-- <ライブラリ名> (<外観の数>)| <ライブラリID> --

各外観/マテリアルは

   <外観名> | <外観ID>

です。

手元に置いておいても損無さそうです。