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

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

Время чтения: ~ 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!

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



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