C#ATIA

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

非再帰

こちら、処理時間を短縮する方法を探されています。
Re: Fusion 360 : Show all the Files in a Project. Takes too much time ? any alternate way to enumera... - Autodesk Community
根本的に解決する方法は無いのですが、asArrayメソッドを
利用するのが、単純で効果的だとは思います。

もう一つ思い付いたのが非再帰です。
あちらのコードですが、再帰させている関数があります。
確か過去に非再帰で処理しようと思ったのですが、
出来なかった部分です。 ・・・がちょっと取り組んで
みたところ非再帰で書き換えることが出来ました。

# Fusion360API Python script

import traceback
import adsk.fusion
import adsk.core
import platform
import os
import time

if platform.system() == 'Windows':
    desktopPath = os.path.join(os.getenv('USERPROFILE'), 'Desktop')
else:
    desktopPath = os.path.join(os.path.expanduser('~'), 'Desktop')

txtFile = os.path.join(desktopPath, 'DataFusion360.txt')


def getDataInfos(
    folder: adsk.core.DataFolder) -> list:

    def getInfo(data, lv):
        tab = "\t" * lv
        return f'{tab}{data.name} | {data.id}'

    infos = []
    level = 1
    stack = [(folder, level)]

    while len(stack) > 0:
        dFolder, lv = stack.pop(0)
        if not dFolder.isRoot:
            infos.append(getInfo(dFolder, lv))

        infos.extend([getInfo(dFile, lv + 1) for dFile in dFolder.dataFiles.asArray()])

        level += 1
        stack.extend([(df, level) for df in dFolder.dataFolders.asArray()])

    return infos

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

        t = time.time()
        with open(txtFile, 'w') as f:
            for dataHub in app.data.dataHubs.asArray():
                f.write(dataHub.name)
                for dataProject in dataHub.dataProjects.asArray():
                    if(dataProject.name == "API"):
                        f.write('\n\t' + dataProject.name + ' | ' + dataProject.id)
                        f.write('\n')
                        f.write('\n'.join(getDataInfos(dataProject.rootFolder)))
                f.write('\n')
        app.log(f'{time.time() - t}s')

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

個人的には、ループを回しながらファイルに書き出すの
好きじゃないんですけどね・・・。

試しに時間を測定したところ、再帰の方が早いじゃないのさ。
フォルダーが深かったりすると違う結果になるのかな?
ちょっと意外でした。