Распечатать дерево проекта в ArchiCAD 23 через Python

Ivan @ 13 / 11 / 2020 @ ArchiCAD / BIM / Медиа / Памятки / Программирование / Уроки
( / / )

Время чтения: ~ 7 мин.

Рассказываю про скрипт, который выводит список всех элементов из дерева проекта ArchiCAD 23 в текстовый файл — таблицу. После сохранения, его можно импортировать Excel как csv (разделители — знаки табуляции). Чтобы скрипт запустить, вам понадобится ArchiCAD 23 python API плагин, который можно скачать бесплатно с сайта Graphisoft. Справка о которой идёт речь в ролике — в архиве с плагином. Этот скрипт я написал на основе программы, которая идёт в примерах, но сделал вывод другого списка (в оригинале там выводится список макетов), и вывожу в файл, потому что это быстрее и мне нужно получить из этого таблицу, в результате.

Все сказано в ролике, текст программы ниже listtheproject.py.
Ещё про питон — см. в рубрике программирование.

import sys
# import os


# Этот скрипт выводит дерево проекта через AC23 PY API
# порядок вывода дерева проекта:

# This script saves the project tree as a CSV file via ArchiCAD23 PY API
# the order is this:
# uiId
# name
# autoTextedName
# floorNum
# intendedPlanConn
# isIndependent

# Посмотрите справку AC23 python API, там есть описание этих полей, и ещё пары возможных — в статье про вызов GetNavigatorTree. 
# Look into the AC23 python API reference for info on more available fields in GetNavigatorTree call article. 


# sys.stdout = sys.__stdout__  # reset the input to standard to avoid ac23 py using the last output in case of error
original_stdout = sys.stdout  # save the current output so to revert to it later
stringToWrite = ""
path = "D:\\ProjectTree.txt"
print('Starting saving the tree to file ' + path)


with open(path, "w+", encoding="utf-8") as f:
    sys.stdout = f  # Change the standard output to the file we created.

    def PrintTree(tree, level=0):
        try:    # here we do try-except, so that we don't ruin the closef in the end, otherwize the file won'be closed, and the output flow too, thus cousing errors on other runs.
            levelStr = "\t" * level
            for k in tree.keys():
                # print(levelStr + k.name)
                output = ""
                output += levelStr
                global stringToWrite
                if level > 1:
                    if k.uiId != "":
                        output += str(k.uiId) + "\t"
                    else:
                        output += "<empty>" + "\t"

                if k.name != "":
                    output += str(k.name) + "\t"
                else:
                    output += "<empty>" + "\t"

                if k.autoTextedName != "":
                    output += "/" + str(k.autoTextedName) + "/\t"
                else:
                    output += "<empty>" + "\t"

                if k.floorNum != "":
                    output += str(k.floorNum) + "\t"
                else:
                    output += "<empty>" + "\t"

                if k.intendedPlanConn != "":
                    output += str(k.intendedPlanConn) + "\t"
                else:
                    output += "<empty>" + "\t"

                if k.isIndependent != "":
                    output += str(k.isIndependent) + "\t"
                else:
                    output += "<empty>" + "\t"

                if k.guid != "":
                    output += str(k.guid)

                # stringToWrite += output + os.linesep // можно вот так, но мне удобнее \n
                stringToWrite += output + "\n"
                PrintTree(tree[k], level + 1)
        except:
            print("Couln't do.")

    PrintTree(GetNavigatorTree(API_ProjectMap))



    # PrintTree (GetNavigatorTree (API_LayoutMap))
    print(stringToWrite)  # write to file
    f.close()  # close file

sys.stdout = original_stdout  # Reset the standard output to its original value ! this is very important, as AC23 PY does not clear variables after the script execution
print('Output end.')

 


Может быть интересно:


Подпишитесь на нас в социальных сетях!

Instagram
VK
Facebook
YouTube!
Telegram!

Подпишитесь на обновления



* нажимая на кнопку «Подписаться», вы даете согласие на обработку своих персональных данных