Формулы в ARCHICAD 22 26.04.2019
Продолжение общего обзора новых возможностей ARCHICAD 22-й версии. Подробнее об одном из главных нововведений – формулах, область применения которых оказалась намного шире, чем могло показаться на первый взгляд, рассказывает Егор Захаров - главный архитектор ЗАО «Институт ПИРС».
Формулы в ARCHICAD 22
Многие ждали формулы в интерактивных каталогах и функционал, схожий с Excel. Поначалу я (Егор Захаров, главный архитектор ЗАО «Институт ПИРС» (Пермь)) был удивлен появлению формул в свойствах отдельных элементов и расстроен ограничениями, которые в связи с этим бросаются в глаза. Но, рассмотрев новинку повнимательнее, я понял, что формулы по примеру Excel в интерактивных каталогах имели бы ряд существенных ограничений. Результат расчета был бы привязан к конкретному каталогу, а формулы как новый тип пользовательского свойства могут не только включаться в каталоги, но и использоваться для выносных надписей, графической замены и IFC-свойств. И ограничение в виде использования в формулах только свойств одного объекта и общих параметров проекта кажется мне приемлемой ценой за универсальность использования, тем более что функция новая и будет развиваться. Далее я подробнее остановлюсь на особенностях в работе формул с ARCHICAD. Для многих BIM-модель ассоциируется прежде всего с объемной моделью здания, но без наполнения информацией это по сути просто 3D-макет. И тут начинаются проблемы, потому что наполнение модели информацией вручную – довольно трудоемкий процесс; может показаться, что оно того не стоит и при оформлении документации проще всё подписывать и прописывать простым текстом. Но, во-первых, прошли времена, когда проект был прежде всего стопкой бумажной документации. Во-вторых, важно не единожды сформировать проект и сдать его заказчику, а получить его как базу взаимосвязанных данных, изменения любого фрагмента которой распространяются на весь объем проекта. В ARCHICAD давно существует возможность автоматизации наполнения модели информацией через параметры элементов. Формулы выводят этот инструментарий на новый уровень, позволяя комбинировать параметры и свойства элементов, задавая внутренние взаимосвязи между ними.

Общие особенности использования

Формулы появились как новое значение пользовательских Свойств, создаваемых в Менеджере Свойств. Свойства с формулами, как и обычные Свойства, привязываются к Классам элементов, о чем говорит нижняя панель в правой половине окна диалога (рис. 1).

1.jpg

Рис. 1

При нажатии кнопки Добавить появляется окно Редактора Формул. Кнопка Параметры и Свойства позволяет добавить свойства, находящиеся в панели Классификация и Свойства параметров каждого элемента. Функции и единицы измерения вы можете вводить с клавиатуры (если уже запомнили обозначения единиц измерения, функций и их синтаксис), но предусмотрены и специальные кнопки для выбора функций из списка. Функции удобно сгруппированы по типам, при наведении на функцию появляется всплывающая подсказка, а щелчком правой кнопки мыши можно вызвать более подробную справку о каждой функции. После выбора нужной функции в окне Редактора появляется правильный синтаксис данной функции и от пользователя требуется только подставить свои значения (строковые значения вписываются в кавычках, числовые – без кавычек). В нижней части окна Редактора в режиме реального времени выводятся подсказки по ходу ввода формулы. В целом интерфейс довольно дружелюбен, а синтаксис очевиден и подробно описан в руководстве пользователя. Пользовательские Свойства как с формулами, так и без них расположены внизу списка параметров для вставки в окно Редактора Формул, автотекста и Интерактивных Каталогов (рис. 2).

ac22_expressions_02.jpg
Рис. 2

Более подробное описание формул вы можете найти на сайте, а на официальном канале GRAPHISOFT Россия есть отдельный плейлист, посвященный формулам в значениях Свойств.

Для начала надо договориться об условных обозначениях, которые я буду использовать в дальнейшей части статьи.
1. Примеры формул будут выделяться курсивом.
2. Параметры и Свойства элементов, вставленные в формулы, будут иметь серый цвет – в соответствии с их отображением в окне Редактора Формул. Если, например, параметр Крыши Уклон скопировать из Редактора Формул и вставить в любой сторонний текстовый редактор, он будет иметь вид {Property:Крыша/Уклон}, то есть в названии закодирована также группа, в которой этот параметр расположен. Таким образом вы не сможете просто скопировать примеры формул, которые я разместил в статье: придется вручную подобрать либо создать нужные свойства для вставки в формулы. Процесс подбора нужного элемента позволит вам изучить набор стандартных параметров и Свойств элементов ARCHICAD, если вы не сделали этого ранее.
3. Пользовательские Свойства, которые создал я, будут иметь голубой фон.
4. {ФОРМУЛА} – так мы обозначим некую абстрактную формулу, суть которой не важна для рассматриваемого примера.

Одним из основных принципов BIM-проектирования в целом (и средствами ARCHICAD в частности) является создание унифицированного шаблона. Формулы позволяют устанавливать гораздо более сложные связи между параметрами элементов ARCHICAD и должны стать важной частью реквизитов шаблона вашей работы. Поскольку, начиная с 21-й версии, пользовательские Свойства привязаны не к инструментам, а к Классам элементов, вы должны четко понимать, как вы классифицируете различные элементы проекта:

1. Просмотреть и отредактировать стандартную классификацию или создать свою с нуля.
2. Назначить соответствующую классификацию элементам Избранного.
3. Необходимо не только понимать, но и иметь описание всех ваших реквизитов, их наименование и структуру хранения.
4. Создавая новые Свойства, вы также должны продуманно подходить к их наименованию и разделению по группам.

Без всего вышеперечисленного формулы внесут в вашу работу хаос, и быстро ориентироваться в растущем объеме информации будет затруднительно (рис. 3).
ac22_expressions_03.jpg
Рис. 3

Когда шаблон сформирован и описан, классификация элементов вам понятна, вы должны сформулировать для себя задачу, которую хотите решить с помощью формулы. Первое, что мне пришло в голову, это назначить наконец такое свойство Крыши, как уклон в процентах. Создаю новое Свойство в группе «Основные конструкции», выбираю Классы, для которых это Свойство будет применяться (в моем случае Кровля и Марш пандуса), выбираю значение по умолчанию – Формула, набираю формулу:
100 * TAN ( Уклон )
и, наконец, меняю Тип данных (в моем случае Число). Все Свойства можно создавать в одной группе, но тогда со временем вы просто запутаетесь. Можно указывать для Свойств доступность всем Классам, но тогда список Свойств у каждого элемента (отображаемый в диалогах Параметров элементов) будет расширяться до бесконечности, причем для большей части Свойств даже не будет доступен расчет по формуле, так как параметр Уклон есть только у крыш.

Можно сразу задать формулу:
CONCAT ( "i="; STR (100 * TAN ( Уклон ); "%" ),

чтобы получить строку «i=1,50%» (только тип данных надо сменить на Строка), но тогда результат нельзя будет использовать для дальнейших расчетов, к тому же нужный текст можно дописать в выноске типа Текст/Автотекст и сохранить в Избранное, правда направление уклона в любом случае придется задавать вручную.

Формулы должны быть доступны только для тех Классов, для которых расчет по ним возможен и необходим. При этом пользовательское Свойство может быть создано и использоваться в формулах, и при этом вообще оставаться недоступным ни для одного Класса. Например, можно создать Свойство Степень огнестойкости с типом данных Набор Параметров и задать значения I, II, III, IV, V. Таким образом это Свойство становится как бы аналогом поля из Информации о Проекте, но с выбором из заранее установленных вариантов, без ручного ввода. Это может быть полезно, поскольку формулы чувствительны к точности значений и случайно поставленный пробел в конце значения параметра способен сбить расчет.

В одно Свойство может быть добавлено несколько формул, расчет ведется последовательно сверху вниз. Если первая формула не может быть рассчитана для элемента, то расчет переходит к следующей и так далее до тех пор, пока расчет не будет выполнен либо не кончатся формулы, при этом Тип данных у результата всех формул в одном Свойстве должен совпадать. Если формулы закончились, но ни одна из них не подошла элементу, то результатом будет <анализ формулы недоступен>, а в интерактивном каталоге отобразится «---». Поэтому я рекомендую последней формулой для Свойства с несколькими формулами и типом данных Строка делать формулу типа «!ОШИБКА!» (или какой-то аналог заметной надписи для визуального контроля). Таким образом эта заметная надпись будет выводиться в Выносках, Каталогах и Свойствах элемента, и вы будете понимать, что нужно откорректировать либо сами формулы, либо Классы, доступные для этого свойства. Также, сдвигая другие формулы ниже формулы с предупреждением, вы отделяете их от расчета, не удаляя их (рис. 4).
ac22_expressions_04.jpg
Рис. 4

В одно Свойство может быть добавлено несколько формул для разных типов элементов (стены/колонны/перекрытия и т.д.). Ограничить использование формулы каким-то одним типом элемента можно присутствием в ней хотя бы одного параметра, характерного только для одного типа элемента, даже если этот параметр не нужен для работы самой формулы. Например, в формуле
IF (Уклон <> Уклон; “!ОШИБКА!”; {ФОРМУЛА} ),
первое условие неравенства уклона кровли самому себе в принципе невыполнимо и установлено только для ограничения расчета формулы Крыш, а остальные типы элементов переходят к расчету по следующей формуле. На сегодня комментирование в теле формул не предусмотрено, и когда в одно Свойство добавлено много формул, становится сложно ориентироваться в том, для какого типа элементов какая формула создана. Для идентификации я придумал в начале также добавлять условие, ненужное для самого расчета (рис. 5).
Например:
IF (“Стена” =”-”; “!ОШИБКА!”; {ФОРМУЛА} )
ac22_expressions_05.jpg
Рис. 5

Очевидно, что строка «Стена» никогда не будет равна строке «-» и, соответственно, значение Свойства никогда не станет «!ОШИБКА!», но при этом в начале формулы появилась надпись, говорящая об элементе, для которого она создавалась.

Сложные формулы бывает удобно разбить на несколько Свойств с формулами предварительного расчета. Например, результат расчета формулы уклона крыши в процентах можно использовать самостоятельно для указания уклона кровли, а можно применять в других формулах – например для определения типа кровли (плоская/скатная):

IF (Уклон в % <= 5; “Плоская”; “Скатная”)

То есть если уклон меньше или равен 5%, то кровля считается плоской, а если больше – скатной. Нужно очень внимательно относиться к Типам данных Свойств с формулами и понимать логику определения Типа данных программой ARCHICAD. Так, в моем примере параметр Крыши Уклон – это Угловая величина, но после применения функции тангенса превращается в Число. Данную особенность можно использовать для своих целей. Например, если вам требуется посчитать длину каких-то элементов в метрах, а в качестве единиц измерения линейных величин приняты миллиметры и вам неудобно менять их ради одного параметра, вы можете создать Свойство для длины нужного типа элементов и вставить в него формулу:

3D-длина * 1 m

Таким образом изначальный Тип данных у параметра был Линейная величина, а после умножения на один метр само значение не изменилось, но тип данных сменился на Площадь, и его отображение меняется в соответствии с отображением площадей (в большинстве случаев это м2 с двумя знаками после запятой).

В ARCHICAD пока не предусмотрено форматирование формул: если вы перенесете часть формулы на новую строку, ошибки не будет, но после закрытия и повторного открытия окна формулы она вновь выстроится в одну строку. Для сложных формул можно либо составлять схемы, о которых я скажу ниже, либо использовать сторонний проприетарный текстовый редактор (например Sublime Text) для проверки соответствия открывающих и закрывающих скобок.

Стоит отметить, что формулы в ARCHICAD чувствительны к локализации программы, то есть тип элемента в RUS-версии будет иметь название «Стена», а в INT-версии – «Wall». Значения таких встроенных параметров, как Расположение и Конструктивная Функция, тоже различаются в зависимости от языка программы. При этом функции формул и значения Критерия Соответствия TRUE/FALSE (ПРАВДА/ЛОЖЬ) в обеих версиях на английском языке. Названия параметров и Свойств, вставленных в формулы, жестко привязываются к ним: при переименовании пользовательского Свойства оно автоматически изменится во всех формулах, где было применено. При этом значения всех Свойств вписываются в формулы вручную, даже значения свойств типа Набор Параметров и стандартные параметры элементов (Расположение, Конструктивная Функция и т.п.). Для большего удобства я рекомендую открыть вторую копию ARCHICAD для копирования значений Свойств.

Иногда бывает необходимо, чтобы значение Свойства могло вычисляться по формуле либо задаваться вручную. В Свойствах элемента можно «разорвать» цепь для ввода специального значения (рис. 6), но в таком случае, чтобы вернуть расчет Свойства по формуле, надо будет вручную вернуть значение По умолчанию, что неудобно. В таких случаях я делаю два свойства: свойство A с простым строковым значением (либо Набором Параметров) и значением по умолчанию «-», чтобы задавать значение вручную; и свойство B с формулой:

IF (A<>”-”; A; {ФОРМУЛА} )

То есть если для свойства A задано какое-то значение, то B=A, иначе выполняется {ФОРМУЛА}.

ac22_expressions_06.jpg
Рис. 6

Пример 1: назначение предела огнестойкости стены в соответствии с ФЗ-123

Если нужно сделать по-настоящему сложную многоуровневую формулу, то не обойтись без рисования схемы разветвленных условий, необходимой для понимания логики построения, подсчета количества и месторасположения закрывающих скобок. Сведение вычисления значения по некой таблице можно отнести именно к таким задачам и вообще выделить в отдельный класс задач при работе с формулами. Для примера хотел бы показать часть работы с таблицей (рис. 7) назначения предела огнестойкости строительных конструкций здания (таблица 21 из ФЗ-123).
ac22_expressions_07.jpg
Рис. 7

Изначально для меня было очевидно, что признак предела огнестойкости (R, RE, E и т.д.) и непосредственно предел огнестойкости необходимо разделить на два Свойства, поскольку это позволит значительно упростить формулы. Следует определиться с исходными данными: какие параметры уже есть в ARCHICAD, какие необходимо создать в качестве поля в Информации о Проекте или пользовательского Свойства, какие параметры задаются автоматически, а какие вручную. Естественно, в такой формуле будут использоваться стандартные параметры Расположение и Конструктивная Функция, и правильное их назначение приобретает большую важность. Я создал свойство Степень огнестойкости, которое может быть использовано и в формулах, и в общих данных проекта. Пришлось создать пользовательское Свойство принадлежности стены к лестничной клетке, так как стандартное Свойство Имя связанной зоны привязывает стену к первой созданной зоне, примыкающей к стене, а следить за этим не всегда удобно (было бы здорово иметь в значении данного параметра список всех зон, примыкающих к стене, а не только первую размещенную зону).

Также перед началом составления формул следует определить общие закономерности назначения параметров и не пытаться вычислять формулами каждую ячейку. Например, видно, что при V степени огнестойкости здания ни одна конструкция не нормируется – и эту строку можно отсечь глобально, а далее для наружных стен имеет значение только ответ на вопрос, I степень огнестойкости или нет. Я составил схему формулы – как она выглядит в черновом варианте, показано на рис. 8.

И, наконец, на рис. 9 представлена оформленная схема с пояснениями для данного материала.
ac22_expressions_08.jpg
Рис. 8
ac22_expressions_09.jpg
Рис. 9

Как видите, после чернового варианта схема немного изменилась – поначалу я забыл учесть, что иную огнестойкость имеют только внутренние стены лестничных клеток. Поэтому для выявления ошибок необходимо проверять работу формул во всех возможных вариантах. Желательно, чтобы это делал человек, не занимавшийся непосредственно составлением формулы.

Также обратите внимание, что после перебора всех возможных степеней огнестойкости стоит не просто ошибка, а указание на то, что степень огнестойкости задана неверно, то есть она не приведена совсем или имеет место ошибка (лишний пробел либо ненормативное значение). Подобным образом вы можете закладывать внутренние проверки в тело формулы, но, к сожалению, это возможно только для типа данных Строка.

В результате получается формула, которую практически невозможно создать без серьезной предварительной подготовки и продумывания структуры:

IF ( "Стена" = ""; "!ОШИБКА!";
IF ( Предел огнестойкости <> " "; Предел огнестойкости;
IF ( Длина Линии Привязки <> Длина Линии Привязки; "!ОШИБКА!";
IF ( Степень огнестойкости = "V"; "Не нормируется";
IF ( Конструктивная Функция = "Несущий Элемент";
IF ( Степень огнестойкости = "I"; "120";
IF ( Степень огнестойкости = "II"; "90";
IF ( Степень огнестойкости = "III";
IF ( AND (ЛК_Конструкции = TRUE; Расположение = "Внутри"); "60"; "45" );
IF ( Степень огнестойкости = "IV";
IF ( AND (ЛК_Конструкции = TRUE; Расположение = "Внутри"); "45"; "15" ); "!Степень огнестойкости задана неверно!" ) ) ) );
IF ( Расположение = "Снаружи";
IF ( Степень огнестойкости = "I"; "30"; "15" ); "Не нормируется" ) ) ) ) ) )

Я подписал формулу, так как данное свойство планируется расширить для всех необходимых типов элементов. Создано дублирующее свойство Предел огнестойкости на случай необходимости задать значение степени огнестойкости вручную. Задано свойство, ограничивающее применение формулы только для стен.

Конечно, хотелось бы, чтобы формирование формул происходило в графическом интерфейсе создания схемы, что соответствует веяниям времени и росту популярности программ параметризации с графическим интерфейсом – например Grasshopper. При этом создается ощущение, что подобные формулы выходят за пределы тех возможностей, которые предполагались разработчиками для данного инструмента, и в результате дальнейшего развития формулы будут становиться только удобнее.

После составления формулы появляется желание подключить графическую замену для визуального контроля результатов, но тут мы встречаем программное ограничение. Свойства со сложными формулами не могут участвовать в критериях графической замены, однако тут можно воспользоваться способом, который был продемонстрирован в выступлении Игоря Юрасова на конференции в Киеве. Создается Интерактивный Каталог с уникальными ID элементов, у которых Свойство предела огнестойкости, например, равно 90; далее данный каталог сохраняется в TXT-формат, и из этого текстового файла список GUID копируется в специально подготовленное поле в Информации о Проекте, которое выполняет роль буфера данных. Далее создается новое Свойство с простой формулой:

CONTAINS ( Уникальный ID;!ПБ 90!; FALSE ),

где !ПБ 90! – это созданное поле в Информации о Проекте, и формула проверяет, находится ли GUID элемента в этом списке. Поле в Информации о Проекте и Свойство с проверкой GUID необходимо будет создать для каждого возможного результата значения исходного Свойства предела огнестойкости. С помощью Юрия Цепова из Labpp я смог автоматизировать операцию записи GUID элементов в Информацию о Проекте. Посредством скрипта на C++ при нажатии одной кнопки в бесплатном расширении Goodwin GDL от Labpp (либо в любом платном решении от этой компании) я записываю списки GUID элементов по заданным характеристикам в предварительно созданные поля Информации о Проекте. В результате можно получить результат, показанный на рис. 10.

ac22_expressions_10.jpg
Рис. 10

Возможно, предложенная структура формулы будет мной дорабатываться либо вы найдете более изящное решение. Может показаться, что описанные мной действия невероятно сложны и сильно тормозят процесс создания модели, но на самом деле всё, о чем я пишу, в основном требует лишь однократной настройки в шаблоне и некоторого навыка в процессе создания модели, но в результате у вас будет появляться действительно интерактивная BIM-модель, а не 3D-макет.

Пример 2: наименование окон по ГОСТ 23166-99

Хочу сразу оговориться, что есть правило наименования в общем ГОСТе на окна и несколько отличающихся типов наименований в ГОСТах на оконные блоки из различных материалов. Я сформулировал для себя усредненный вариант.

В связи с тем что в формулах пока нельзя использовать параметры библиотечных элементов, пришлось создать несколько Свойств типа Набор Параметров для выбора материала окна и типа открывания. Также создан параметр сопротивления теплопередаче окна и набор Свойств типа Критерий Соответствия для дополнительных опций (фрамуга, клапаны и т.п.). Может показаться, что здесь присутствует слишком много исходных параметров, задаваемых вручную, но, во-первых, в ходе развития формул количество таких параметров будет сокращаться, а база, созданная сейчас, будет использоваться. Во-вторых, наиболее часто используемые типы окон можно сохранить в Избранном. К тому же раньше приходилось регулярно сверяться с нормами для определения ГОСТа на конкретный материал окна или кода той или иной опции окна (Фр – фрамуга, КК – климатический клапан и т.д.), а теперь можно просто выставить галочки напротив элементов, необходимых в окне (рис. 11).

ac22_expressions_11.jpg
Рис. 11

Свойство сопротивления теплопередаче установлено по умолчанию (и применяется для всех окон проекта) на минимально допустимом значении для проектируемого региона. В дальнейшем, если заказчик решит улучшить параметры дома и повысить эффективность окон, можно изменить значение по умолчанию в Менеджере Свойств, и это изменение распространится на весь проект. При этом какие-то отдельные окна (например, технических помещений), для которых вы задали специальное значение, останутся неизменными.

Для свойств данной группы необходимо задать доступность Классов – в моем случае «Окно» и «Балконная дверь».

В процессе присвоения наименований нам, по сути, надо заполнить два поля спецификации: «Обозначение» и «Наименование». Для первого значения используется несложная, но многоуровневая формула подбора номера ГОСТа в зависимости от материала окна:

IF ( OR ( "Признак предела огнестойкости <> " "; ОК_Материал = "Индивидуальный" ); "Индивидуальный";
IF ( ОК_Материал = "ПВХ"; "ГОСТ 30674-99"; IF ( ОК_Материал = "Алюминий"; "ГОСТ 21519-2003";
IF ( ОК_Материал = "Дерево + стеклопакет"; "ГОСТ 24700-99";
IF ( ОК_Материал = "Дерево + стекло"; "ГОСТ 11214-2003";
IF ( ОК_Материал = "Дерево мансарда"; "ГОСТ 30734-2000";
IF ( ОК_Материал = "Защитное"; "ГОСТ 31462-2011"; "!Материал задан неверно!" ) ) ) ) ) ) )

В своей работе я не задаю конкретного производителя противопожарных дверей, поэтому первым делом идет проверка на выполнение одного из условий: либо задано свойство Признак предела огнестойкости_Ф, либо параметр ОК_Материал имеет значение "Индивидуальный" и при выполнении одного из условий Обозначение тоже становится "Индивидуальный". В противном случае начинается подбор ГОСТа в зависимости от тех значений, которые я задал для свойства ОК_Материал. После перебора всех возможных значений ОК_Материал вставлено проверочное значение – на случай ошибочно заданного пользовательского свойства, о чем я говорил выше.

«Наименование» – более сложный параметр, и я решил разбить его на несколько составляющих свойств, которые также определяются по формулам.
Вначале определяется вид изделия (ОК_1_Вид):

IF ( OR ( Признак предела огнестойкости_Ф <> " "; ОК_Материал = "Индивидуальный" ); "Оконный блок";
CONCAT ( IF ( КЛАССИФИКАЦИЯ моя - 22 = "Балконная дверь"; "Б";
IF ( КЛАССИФИКАЦИЯ моя - 22 = "Окно"; "О"; “!Ошибка Классификации!” );
IF ( ОК_Материал = "ПВХ"; "П ";
IF ( ОК_Материал = "Алюминий"; "АК "; IF ( ОК_Материал = "Дерево + стеклопакет"; "Д";
IF ( ОК_Материал = "Дерево + стекло"; "Д"; IF ( ОК_Материал = "Дерево мансарда"; "Д МАНСАРДНОЕ";
IF ( ОК_Материал = "Защитное"; "П защитный"; "!Материал задан неверно!" ) ) ) ) ) ) ) )

Прежде всего я снова проверяю, задан ли предел огнестойкости окна либо материал – "Индивидуальный". Если первое условие не выполнено, то в зависимости от одной из двух возможных классификаций задается код вида изделия (опять с проверкой в конце). Функцией CONCAT код вида изделия объединяется с кодом материала изделия, подбираемым в зависимости от значения ОК_Материал. Далее описываем конструкцию окна (ОК_02_Конструкция общая):

IF ( OR ( Признак предела огнестойкости_Ф <> " "; ОК_Материал = "Индивидуальный" ); "";
IF ( ОК_06_Заполнение = ""; "О";
IF ( ОК_Материал = "Дерево мансарда"; "-1"; "ОСП" ) ) )

Снова начинаем с проверки окна на индивидуальность. В ином случае, если последующее Свойство заполнения окна не задано, вписываем код одинарного остекления. Далее выбираем между конструкцией со среднеповоротным открыванием мансардного окна (по ГОСТ 30734-2000) или одинарной конструкцией со стеклопакетом. В этой формуле наглядно видно, что я не стал перебирать все возможные конструкции окон, а ограничился только теми вариантами, которые встречаются в моей работе. Далее идет казалось бы простое Свойство размера (ОК_03_Размеры), но на случай, если по каким-то причинам мне понадобится классифицировать Библиотечный объект как Окно, в это свойство добавлены две формулы.

Первая для собственно окна:

IF ( "Окно" = ""; "!ОШИБКА!";
SUBSTITUTE ( CONCAT (STRCALCUNIT (Ширина); "-"; STRCALCUNIT (Высота);
IF ( КЛАССИФИКАЦИЯ моя - 22 = "Балконная дверь"; Ориентация; "" ) ); " "; "" ) )

Вначале подпись формулы. Далее функцией CONCAT объединяются Ширина, символ тире и Высота; в случае, если объект классифицирован как Балконная дверь, то к размерам добавляется обозначение ориентации открывания. Каждый параметр Линейного размера перед объединением необходимо перевести в Строку функцией STRCALCUNIT, так как объединяться могут только строковые значения. В ARCHICAD настройка отображения чисел (деление на группы по три цифры) задается через настройки Windows Панель управления > Региональные стандарты > Дополнительные параметры > Группировка цифр по разрядам. В формулах ARCHICAD 22 изменение данной настройки не меняет группировку цифр по разрядам, поэтому пришлось исключить пробелы между разрядами цифр, причем функция TRIM не удаляет эти пробелы и их пришлось копировать и вставлять в формулу для замены символа разделителя разрядов на ничто (пара кавычек, стоящих вплотную друг к другу) функцией SUBSTITUTE.

Вторая формула в этом свойстве – для Библиотечного элемента:

IF ( "Объект как Окно" = ""; "!ОШИБКА!";
SUBSTITUTE ( CONCAT ( STRCALCUNIT (Длина (A)); "-"; STRCALCUNIT (Высота) );
" "; "" ) )

Данная формула, по сути, повторяет предыдущую, но параметр Ширина заменен на параметр Библиотечного элемента Длина (A).

Затем под Свойством я прописываю коды дополнительных опций окна (ОК_04_Конструкция_Детали):

IF ( OR ( Признак предела огнестойкости_Ф <> " "; ОК_Материал = "Индивидуальный" ); "";
TEXTJOIN ( " "; TRUE; IF ( ОК_Форточка = TRUE; "Ф"; "" );
IF ( ОК_Фрамуга = TRUE; "Фр"; "" );
IF ( ОК_Клапан вентиляционный = TRUE; "ВК"; "" );
IF ( ОК_Клапан климатический = TRUE; "КК"; "" );
IF ( ОК_Система самовентиляции = TRUE; "СВ"; "" );
IF ( ОК_Система безопасности = TRUE; "СБ"; "" );
IF ( ОК_Открывание = "Поворотно-откидное"; "ПО";
IF ( ОК_Открывание = "Параллельно-выдвижное"; "ПВ"; "" ) ) ) )

Для начала идет уже привычная проверка на индивидуальное окно. В принципе можно было вынести эту проверку в отдельное подсвойство и вставлять его в каждую формулу, но я решил, что тут и так достаточно свойств. Далее коды опций окна (Фрамуга, Форточка и т.п.) объединяются в строку, если их значение соответствует TRUE. В конце идет перебор типа открывания, из тех что использую я. Объединение кодов выполнено функцией TEXTJOIN, которая позволяет задать символ-разделитель и игнорировать пустые значения объединяемых элементов.

Последние подсвойства (ОК_05_Класс и ОК_06_Заполнение) имеют одинаковую структуру и подпирают значение в зависимости от значения свойства ОК_R:

IF ( OR ( Признак предела огнестойкости_Ф <> " "; ОК_Материал = "Индивидуальный" ); "";
IF ( ОК_R = 0; "";
IF ( ОК_R >= 0,8; "А1";
IF ( ОК_R >= 0,75; "А2";
IF ( ОК_R >= 0,7; "Б1";
IF ( ОК_R >= 0,65; "Б2";
IF ( ОК_R >= 0,6; "В1";
IF ( ОК_R >= 0,55; "В2";
IF ( ОК_R >= 0,5; "Г1";
IF ( ОК_R >= 0,45; "Г2";
IF ( ОК_R >= 0,4; "Д1";
IF ( ОК_R >= 0,35; "Д2"; "" ) ) ) ) ) ) ) ) ) ) ) )

По очереди я отсекаю значения R (сопротивление теплопередаче) в соответствии с п. 4.7.1 ГОСТ 23166-99. Формула для подбора стеклопакета выглядит так же, только вместо значений класса указываются обозначения стеклопакетов, которые вы применяете, и их значение R.

И, наконец, Свойство ОК_НАИМЕНОВАНИЕ собирает вычисленные подсвойства в единое наименование:

TRIM ( TEXTJOIN ( " "; TRUE; ОК_01_Вид; ОК_02_Конструкция общая;
Д/ОК_01_Описание_Начало; ОК_03_Размеры; ОК_04_Конструкция_Детали; ОК_05_Класс; ОК_06_Заполнение;
Д/ОК_02_Описание_Конец;
CONCAT ( Признак передела огнестойкости_Ф; Предел огнестойкости_Ф ) ) )

Значения для Свойств просто объединяются функцией TEXTJOIN и дополнительно функцией TRIM убираются пробелы, на всякий случай. Свойства Д/ОК_01_Описание_Начало и Д/ОК_02_Описание_Конец – это просто строковые пользовательские Свойства, на случай, если мне надо добавить какое-то описание к окну или двери в начале или конце наименования.

В результате Интерактивный Каталог заполнения оконных проемов выглядит так, как показано на рис. 12.
ac22_expressions_12.jpg
Рис. 12

В левой части находится непосредственно спецификация, предназначенная для размещения на листе, а столбцы правой части с зачеркнутыми заголовками размещены для управления наименованием прямо из Интерактивного Каталога и обрезаются при размещении в Макете. Результат рассмотренной автоматизации можно включить в графическую замену без дополнительных ухищрений, посредством свойства ОК_Материал (рис. 13).
ac22_expressions_13.jpg
Рис. 13

В заключение еще раз повторюсь, что представленный материал дан для понимания принципов работы нового инструмента и не претендует на точное соответствие нормативным требованиям, хотя и вполне удовлетворяет моим потребностям при работе.

Пример 3: подбор площади сечения вентканала в квартире

В этом примере я хотел бы продемонстрировать автоматизацию выполнения задания отдела ОВ по подбору площади канала естественной вентиляции в квартирах – с использованием формул, расширения Labpp_Квартирография и новой функции ARCHICAD: пользовательская Выносная Надпись.

При выполнении многих объектов я подолгу ждал выдачи задания от раздела ОВ по требуемым площадям каналов естественной вентиляции в квартирах (наши заказчики не хотят использовать какие-то стандартные сборные вентканалы). И вот, наконец, смог получить некое универсальное задание (рис. 14).
ac22_expressions_14.jpg
Рис. 14

Увидев эти таблицы, я загрустил и сел думать, что мне с этим делать. Не хочу обсуждать правильность этих расчетов и саму суть задания, поскольку так и не сумел добиться ссылок на конкретные нормы, четко регламентирующие этот расчет.

По сути же мне нужно определить тип квартиры, исходя из расположения и количества санузлов; это я могу сделать только вручную. Количество жилых этажей в проектируемой секции и количество этажей с коммерческими площадями я тоже не придумал как автоматизировать – тем более что в одном проекте может быть несколько секций с разными показателями. Также вручную пришлось вводить количество зон (или групп) градаций площади вентканала по вертикали, так как иногда делаются две градации, иногда четыре, а иногда единая площадь на всю высоту. В результате у меня получился набор свойств, представленный на рис. 15.

ac22_expressions_15.jpg
Рис. 15

Все эти Свойства доступны для Класса «Аннотирование» – его я создал сам для маркеров квартир, которые поставляются в составе расширения Labpp_Квартирография. В целом это приложение расширяет возможности формул в ARCHICAD, поскольку формулы рассчитываются на уровне отдельного элемента, а приложение сводит площади множества зон в один объект, разбивает их по группам и позволяет производить расчеты с этими данными. Только необходимо перенести значение Свойств библиотечного объекта в пользовательские Свойства в Менеджере Свойств. Для таких целей в составе расширения поставляется специальный скрипт, который я, решая данную задачу, подкорректировал для переноса жилой площади квартиры в Пользовательское свойство. Рассмотрим последовательность подбора вентканала. Для начала моделируем квартиру, размещаем Зоны и привязываем их к Маркеру квартиры. Подробно работу расширения квартирографии я показывал в специализированном вебинаре. Запускаем скрипт и переносим жилую площадь квартиры в Пользовательское свойство S жилая (рис. 16).
ac22_expressions_16.jpg
Рис. 16

Далее нужно вручную выбрать Тип КВ для вентканала, задать Кол-во жилых этажей и № первого жилого этажа. И тут появляется проблема: я должен либо помнить наизусть типы квартиры, либо открывать какую-то справку. Помочь может новая функция создания пользовательской Выноски. Вы можете начертить с помощью линий, полилиний и штриховок то, что вам нужно вставить в требуемых местах в текст либо автотекст, а затем при помощи команды Документ > Аннотация > Выносная Надпись сохранить нарисованное и использовать его как Выносную Надпись. У меня получилась такая Выносная Надпись для помощи в подборе вентканала (рис. 17).
ac22_expressions_17.jpg
Рис. 17

В левой части показана подсказка по выбору типа квартиры. Дальше идет вертикальный текст выбранного типа и, наконец, три значения площадей вентканалов для разных помещений.

Если посмотреть на таблицы исходного задания, становится видно, что в зависимости от жилой площади подбирается не площадь канала, а его тип. Поэтому для каждой квартиры рассчитываются все типы каналов, а уже в зависимости от типа квартиры и жилой площади подбирается конкретный тип канала в свойства S канала Кухни, S канала С/у-L, S канала С/у-S.

Рассмотрим расчет площади канала на примере свойства для типа I (S канала I):

IF ( № этажа расположения > Кол-во жилых этажей; "!!!Этажность меньше текущего этажа!!!";
IF ( Кол-во жилых этажей <= 7; "0,067"; IF ( Кол-во жилых этажей <= 13;
IF ( Кол-во зон = "1"; "0,133"; IF (OR( Кол-во зон = "2";Кол-во зон = "3/4");
IF ( № этажа расположения <= 7; "0,067"; "0,133"); "!Ошибка количества зон!"));
IF ( Кол-во жилых этажей <= 21;
IF ( Кол-во зон = "1"; "0,222";
IF ( Кол-во зон = "2";
IF ( № этажа расположения <= 13; "0,133"; "0,222");
IF ( Кол-во зон <> "3/4"; "!Ошибка количества зон!";
IF ( № этажа расположения <= 7; "0,067";
IF ( № этажа расположения <= 13; "0,133"; "0,222")))));
IF ( Кол-во жилых этажей > 25; "!Количество этажей больше расчетных 25!";
IF ( Кол-во зон = "1"; "0,267";
IF ( Кол-во зон = "2"; IF ( № этажа расположения <= 13; "0,133"; "0,267");
IF ( Кол-во зон <> "3/4"; "!Ошибка количества зон!";
IF ( № этажа расположения <= 7; "0,067";
IF ( № этажа расположения <= 13; "0,133";
IF ( № этажа расположения <= 19; "0,222" ; "0,267" )))))))))))

Вначале идет проверка правильности ввода исходных данных, то есть чтобы количество этажей было больше, чем этаж расположения, который рассчитывается по формуле (№ этажа расположения):

Номер Собственного Этажа - ( № первого жилого этажа - 1 )
Я уменьшаю № первого жилого этажа на единицу: если квартиры начинаются с первого этажа, то и вычитать из собственного этажа ничего не надо. Параметр Количество нежилых этажей решил не использовать, поскольку при сложном рельефе и в случае дома, состоящего из нескольких секций, первый этаж отдельных секций может сместиться и на второй, и на минус первый.

Далее в формуле расчета площади вентканала идет перебор значений из таблицы в зависимости от количества жилых этажей в доме и этажа расположения квартиры. Если количество этажей в доме не превышает семи, то площадь канала минимальна и одинакова на всех этажах. Если этажей от 8 до 13, то уже возможны варианты единой зоны вентканалов и, соответственно, их одинаковой площади, либо градация площадей каналов по двум группам этажей (до 7 и выше). Для этажности от 14 до 21 этажа возможны уже три варианта градации площадей вентканалов (одна, две и три зоны). Для общего количества этажей 22-25 возможны градации площадей каналов на одну, две, четыре зоны. Поэтому последнее возможное значение Кол-во зон соответствует «3/4». Если общее количество этажей превышает 25, то либо это значение задано ошибочно, либо дом выходит за пределы расчетных параметров исходного задания и требует дополнительного расчета, о чем в формулу также помещено предупреждение. Так как у свойства Кол-во зон только три значения (1, 2 и 3/4), то на всякий случай добавлена проверка на правильность значения данного свойства, хотя оно и имеет тип Набор Параметров. Я стараюсь формировать формулы таким образом, чтобы в конце было как можно меньше чередующихся данных и закрывающих скобок – так мне удобнее ориентироваться в формуле. Аналогичным образом подбираются площади каналов типа II и III.

Подбор типа вентканала рассмотрю на примере канала кухни (S канала Кухни):
IF (S жилая = 0; "!!!НЕТ ЖИЛОЙ ПЛОЩАДИ!!!"; IF ( Тип КВ для вентканала = " "; "Выберете тип КВ для вентканала";
IF ( OR (Тип КВ для вентканала = "1"; Тип КВ для вентканала = "3"); IF ( S жилая <= 50; S канала I; S канала III );
IF ( Тип КВ для вентканала = "2"; IF ( S жилая <= 63; S канала I; S канала III ); "!Ошибка типа квартиры!" ) ) ) )

Вначале идет проверка переноса жилой площади из параметров объекта маркера в пользовательское Свойство. Затем проверка назначения типа квартиры. И, наконец, следует перебор значений из исходной таблицы в зависимости от жилой площади и типа квартиры.

Стоит отметить, что исходные данные (количество этажей и этаж расположения) можно вносить сразу для всех маркеров этажа. Скрипт также переносит значения жилой площади для всех маркеров в проекте. В итоге можно пакетно нанести подготовленные выноски для всех маркеров квартир на этаже (команда Документ > Аннотация > Нанести Выносные Надписи для выбранных Элементов) и заняться расстановкой вентканалов.

Вентканал у меня представляет собой группу элементов: стены с отверстиями, Библиотечный элемент разделения заборного канала, профилированной колонны из прозрачного материала с высоким приоритетом пересечения, и Выносная Надпись со свойством S КАНАЛА. Это Свойство надо сравнивать с минимальной площадью из задания ОВ, которая имеет три знака после запятой. Чтобы не переключаться между точностью отображения площадей, я решил попытаться реализовать это с помощью формул. Сначала я рассчитываю площадь колонны со сдвигом запятой на три знака вправо (S канала_черновая) (рис. 18).
ac22_expressions_18.jpg
Рис. 18

SPLIT ( STRCALCUNIT ( Толщина / Диаметр Ядра * Ширина Ядра * 1000 ) ); ","; 1 )

Перед переводом в строковое значение отсекаю дробную часть (запятая и всё что правее нее) площади функцией SPLIT. А затем уже меняю отображение получившегося значения как дробь с тремя знаками после запятой, используя то, что ARCHICAD 22 не убирает пробелы между разрядами чисел в формулах (о чем я говорил выше):

IF ( CONTAINS ( " "; S канала_черновая ); SUBSTITUTE ( S канала_черновая; " "; "," ); CONCAT ( "0,"; S канала_черновая ) )

В данной формуле применены только функции преобразования текста. Таким образом, если S канала_черновая имеет больше трех цифр, то в ней есть пробел, и я его заменяю на запятую, иначе ставлю в начало строки “0,”. Данное решение абсурдно, антинаучно и не универсально (например будет некорректно работать с площадями, имеющими больше шести знаков), но работает и показывает, что довольно нестандартные задачи можно решить, если мыслить шире.

Очевидно, что результат далек от полной автоматизации – по сути, я просто убрал из процесса проектирования работу с таблицами и уменьшил возможность ошибки при подборе минимальных значений площади вентканала. Опять же хочу уточнить: я не доказываю, что исходное задание абсолютно верно, и не призываю точно следовать моим формулам. Я хочу показать общие принципы того, как, если один раз хорошо подумать, можно автоматизировать рутинные задачи.

Заключение

Формулы – это серьезный шаг ARCHICAD на пути автоматизации насыщения модели информацией. То что раньше выполнялось только через неочевидные инструменты IFC-схем (объединение нескольких параметров в строку), теперь доступно напрямую из Менеджера Свойств. То что раньше требовало выгрузки в Excel с последующей обработкой (вычисление процента жилой площади от общей площади квартиры или квартир на этаже), теперь может вычисляться автоматически прямо в ARCHICAD и отображаться в Выносных Надписях или Интерактивном Каталоге. То что раньше могло назначаться только вручную (предел огнестойкости конструкций), теперь может рассчитываться автоматически.

Область применения формул уже сейчас довольно широка, особенно в комплексе со сторонними расширениями, а с развитием этого инструмента будет ограничена только воображением пользователя.

В заключение хотелось бы отметить следующее: кому-то может показаться, что всё изложенное мной мало похоже на то, чем привык заниматься архитектор. Но профессия архитектора всегда была сопряжена с необходимостью знаний во множестве смежных специальностей, и программирование – лишь еще одна из них. Язык программирования – это международный язык нового времени, наравне с английским, и, отказываясь от изучения хотя бы базовых принципов программирования, вы фактически отказываетесь от саморазвития. «...приходится бежать со всех ног, чтобы только остаться на том же месте, а чтобы попасть в другое место, нужно бежать вдвое быстрее» (Льюис Кэрролл «Алиса в Зазеркалье»).

Источник: https://www.graphisoft.ru/users/case_studies/ac22_expressions.html

Возврат к списку