Архикад. Скрипт для оптимизации компановки напила пиломатериалов для силового каркаса.
Скрипт реализован на языке Python с использованием Archicad-Python Connection.
Работа с API
Взаимодействие с проектом происходит через создание соединения с помощью метода connect глобального объекта ACConnection:
from archicad import ACConnection
conn = ACConnection.connect()
Доступ к свойствам, специализациям и объектам предоставляется методами глобальных объектов:
- Commands
- Types
- Utilities
Получение соответствующих переменных:
acc = conn.commands
act = conn.types
acu = conn.utilities
Взаимодействие с проектом
Задача скрипта заключается в изменении значий, хранящихся в свойствах объектов проекта. Решение состоит из трех этапов:
- Получение данных
- Обработка
- Применение изменений
Получение данных.
Для получения значений свойств элементов проекта используется метод GetPropertyValuesOfElements объекта Commands , который принимает следующие аргументы:
- Массив со структурами id элементов
- Массив со структурами id свойств
Элементы определенного типа можно получить методом GetElementsByType(Type) объекта Commands, где Type - тип объекта в формате строки. Свойство elementId содержит в себе значение id. Для получения id свойств достаточно использовать метод GetBuiltInPropertyId(Name) объекта Utilities, передав в него название нужного свойства в виде строки.
Обработка данных
Зная параметры объектов, можно сгруппировать элементы таким образом, чтобы сумма длинн вписывалась в параметры, по которым будут закупаться доски. Во время группировки учитывается , что один элемент может являться перевернутой версией другого. Анализ производится на несколько положений в пространстве.
Группировка оптимизирована с помощью объединения большего с меньшим. По массиву объектов движется дву указателя: i с конца, j с начала. J-ий указатель передвигается до того момента, пока не получится в группу добавить объект c i-ым номером. Далее i-ый указатель движется пока в группе есть вакантные места и цикл повтаряется вновь, до того момента пока i и j указатели не займут одинаковую позицию.
Применение изменений
Для уставки значиний свойствам элементов используется метод SetPropertyValuesOfElements(Values) объекта Commands, где Values - это массив новых элементов типа ElementPropertyValue.
Правило наименованя элементов: a-1, где a - имя группы, 1 - номер элемента в группе.