C#ATIA

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

3DCADファイルをアクティブなドキュメントにインポート

やっと業務が落ち着いてきたのですが、ブログを書くネタがありません。

久々にFusion360のスプリクトを作ってみました。
解決済み: Re: 複数のSTEPファイルを読み込む - Autodesk Community

スプリクトで可能かどうか自信無かったので。

#FusionAPI_python Import3DCadFiles ver0.0.1
#Author-kantoku
#Description-.f3d .igs .stp .sat .smt ファイルをアクティブなファイルにインポート

import adsk.core, adsk.fusion, traceback
import os.path

def run(context):
    ui = None
    try:
        #準備
        app = adsk.core.Application.get()
        ui  = app.userInterface
        importManager = app.importManager
        
        #ファイル選択
        paths = SelectFile(ui)
        if paths is None:
            return
        
        #インポートオプション
        opts = GetOptions(paths,importManager)
        if opts is None:
            return
        
        #インポート
        ExecImport(opts, importManager, app)
        
        ui.messageBox('Done')
        
    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

#インポート
def ExecImport(opts, iptMng, app):
    des = adsk.fusion.Design.cast(app.activeProduct)        
    root = des.rootComponent
    
    for opt in opts:
        try:
            iptMng.importToTarget(opt, root)    
        except:
            pass
    
#拡張子別インポートオプション取得
def GetOptions(paths, iptMng):
    opts = []
    for path in paths:
        if not os.path.exists(path):
            continue
        
        _, ext = os.path.splitext(path)
        if '.F3D' == ext.upper():
            opt = iptMng.createFusionArchiveImportOptions(path)
            
        if '.IGES' == ext.upper() or '.IGS' == ext.upper():
            opt = iptMng.createIGESImportOptions(path)
            
        if '.STEP' == ext.upper() or '.STP' == ext.upper():
            opt = iptMng.createSTEPImportOptions(path)
            
        if '.SAT' == ext.upper():
            opt = iptMng.createSATImportOptions(path)
            
        if '.SMT' == ext.upper():
            opt = iptMng.createSMTImportOptions(path)
        
        if opt is None:
            continue
            
        opt.isViewFit = False
        opts.append(opt)
        
    if len(opts) < 1:
        return None
    
    return opts
    
#ファイルの選択
def SelectFile(ui):
    fileDlg = ui.createFileDialog()
    fileDlg.isMultiSelectEnabled = True
    fileDlg.title = 'Inport File'
    fileDlg.filter = '*.f3d;*.ig*s;*.st*p;*.sat;*.smt'

    dlgResult = fileDlg.showOpen()
    if dlgResult != adsk.core.DialogResults.DialogOK:
        return None
    
    print(len(fileDlg.filenames))
    if len(fileDlg.filenames) < 1:
        return None
    
    return [path for path in fileDlg.filenames]