C#ATIA

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

あなたのアカウント上の全ファイルリストを取得

連日、探りながら色々と試してはいるのですが、成果が上がらない状況です。

少し前にこちらのトピの回答をしました。
Re: Is there a script to get a full list of my files - Autodesk Community

手元にあったものをそのままベタッと貼り付けたのですが、
よく見ると、String型の変数にひたすらファイル名を追加して
ファイルに書き出していると言う、情けないコード。

その辺りも遅さの原因かもしれないと思い、リストにファイル名を
取り込み、最後にflattenして書き出す様に修正してみました。

#FusionAPI_python GetDataList Ver0.0.2
#Author-kantoku
#Description-サインインしているID内の全ファイル名の取得・・・遅い!

import adsk.core, adsk.fusion, traceback
import time
from itertools import chain

def run(context):
    ui = None
    try:
        app = adsk.core.Application.get()
        ui  = app.userInterface
        
        #エクスポートファイルパス
        path = Get_Filepath(ui)
        if path is None:
            return
        
        #time
        t=time.time()
        
        #ファイル名の取得
        names = []
        pros = app.data.dataProjects#[3:5]

        for pro in pros:
            res = []
            names.append(GetFiles(pro.rootFolder, res, 0))
        
        if len(names) < 1:
            ui.messageBox('Data not found')
            return
        
        #ファイルに書き込み
        file = open(path, 'w') 
        file.write('\n'.join(list(chain.from_iterable(names))))
        file.close()
                
        ui.messageBox('Done:{}'.format(time.time() - t))
        
    except:
        if ui:
            print('Failed:\n{}'.format(traceback.format_exc()))
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))



def GetFiles(fld, res, depth):
    
    #folder
    res.append((' ' * (depth * 4)) + '[' + fld.name +']')

    #files
    fs = [(' ' * ((depth + 1) * 4)) + f.name for f in fld.dataFiles]
    if len(fs) != 0:
        res.extend(fs)
        
    #subfolder
    fls = fld.dataFolders
    for subFld in fls:
        res = GetFiles(subFld, res, depth + 1)
      
    return res

#ファイルパス
def Get_Filepath(ui):
    
    dlg = ui.createFileDialog()
    dlg.title = 'File name export'
    dlg.isMultiSelectEnabled = False
    dlg.filter = 'text(*.txt)'
    if dlg.showSave() != adsk.core.DialogResults.DialogOK :
        return
    
    return dlg.filename

プロジェクト・フォルダ名は " [ ] " で表現するようにしました。
結論としては・・・速くならないです。やっぱりクラウドサーバーとのやり取りが
遅すぎるのだろうと思います。(再帰も遅いのかな?)

時間がかかる事は割り切って、こちらのProgressDialogを利用しようと
思ったのですが駄目でした。
Help
UserInterfaceから作り出すので、Fusion360上の処理にだけ反応するのかな?
と思ってます。
でも、手軽に実装出来る様になっていたので、今後は利用するかも。