こちら、処理時間を短縮する方法を探されています。
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()))
個人的には、ループを回しながらファイルに書き出すの
好きじゃないんですけどね・・・。
試しに時間を測定したところ、再帰の方が早いじゃないのさ。
フォルダーが深かったりすると違う結果になるのかな?
ちょっと意外でした。