isicad.ru :: портал САПР, PLM и ERP :: версия для печати

Статьи

14 октября 2015

Автоматизация работы Autodesk Revit журналами действий

Александр Канивец

От редакции isicad.ru: Недавно мы обратились к читателям и писателям с предложением — размещать на isicad.ru больше технических публикаций, например, в жанре рационализаторских предложений, общезначимых советов и т.п. Сегодня мы предлагаем вам один из таких материалов, который на сайте компании BIM2B охарактеризован так: «Новая бомба от Александра Канивца — это использование журналов Revit... По факту, Александр открыл новую эру в автоматизации Revit, сравнимую только со стартом Dynamo.»

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

Александр Канивец Вот биографическая справка, предоставленная нам самим автором:

По образованию — бакалавр ПГС, но с детства мечтал стать архитектором. После окончания ВУЗа в 2003, год работал инженером ПТО Облагростроя, а после представилась возможность реализовать мечту в Киеве, где в 2004 году впервые и познакомился с системой Информационного моделирования зданий Autodesk Revit.

Спустя два года практического применения понял, что значительно интересней заниматься продвижением Revit и перешел к официальному дистрибьютору Autodesk в Украине компанию «Аркада», а после «Софтпром». За 7 лет работы в партнерской сети, провел более 50 обучений клиентов и партнеров, участвовал и выступал на региональных и международных мероприятиях Autodesk, разрабатывал официальные библиотеки Revit, собирал и передавал пожелания от Сообщества пользователей, а также сопровождал государственную программу внедрения BIM в Республике Беларусь результатом которой стал государственный BIM стандарт.

Последние два года занимаюсь сопровождением частных проектно-строительных компаний, продолжаю работу над стандартом и библиотеками на его основе.

В Autodesk Revit имеется функция записи всех действий пользователя в текстовый файл – журнал, который используется разработчиками в основном для выявления причин сбоя приложения. Самое интересное, что действия можно воспроизвести путем перетаскивания файла на значок Revit. Это позволяет восстановить часть работы после «вылета» Revit или же сэкономить время на некоторых часто повторяемых действиях. К примеру, рассмотрим случай создания нового проекта для коллективной работы на основе требуемого Шаблона (Template). Напомню, что для этого необходимо будет создать Рабочие наборы (Worksets), которые позволяют назначить Владельца (Owner) и Заемщика (Borrower) совокупности пользовательских элементов, семейств, видов и настроек. На первый взгляд процедура не сложная, но отнимающая время и требующая внимания.

1. Запись

Сначала запустим Autodesk Revit и создадим новый проект, с обязательным выбором Шаблона проекта (Template) из библиотеки для получения его пути и наименования. Далее приступим к созданию Рабочих наборов (Worksets) и сначала введем наименования основного набора для Уровней (Levels) и Осей (Grids), а также для всех остальных элементов проекта, например, Местности (Site). Соответственно составляю наименования согласно своему классификатору данных, в котором все элементы Разбивки (Layouts) имеют код 000 00240, а Местности (Site) – 100 00000. Естественно, можете ввести любые понятные Вам значения.
Revit журналы

Далее добавляю Рабочие наборы (Worksets), которые могут понадобиться для распределения элементов Концепции (Massing), Конструкций (Structure), Архитектуры (Architecture), Технологии (Technology), Инженерии (Services) и т.п. Таким образом, каждый проектировщик будет работать в наборе, соответствующем его разделу. Спросите – а как же быть в случае работы нескольких архитекторов? Ведь Revit не позволяет одновременно назначать нескольких владельцев одному набору, в то время как другие участники проекта смогут свободно занимать их элементы. Как вариант, можно создать дополнительные архитектурные наборы для более детального распределения элементов, например, Стены (Walls), Полы (Floors), Потолки (Ceilings), Проемы (Openings) и т.п., а можно разделить проект на отдельные модели и связать их между собой наложенными ссылками. Что лучше?

Revit журналы

Собственно, это тема следующих публикаций, а пока выберем Активный рабочий набор (Active Workset), установим Подавление графики неактивных наборов (Gray Inactive Workset Graphics) и завершим их создание. Далее можем еще раз открыть диалог наборов для проверки результата и закрыть Revit. Запись журнала завершена.

2. Редактирование

Для просмотра полученного журнала действий перейдем по следующему пути: C:\Users\%UserName%\AppData\Local\Autodesk\Revit\Autodesk Revit 2016\Journals.

При наличии нескольких файлов журналов, отсортируем их по дате создания, выделим самый новый и скопируем в другое месторасположение. Именно скопируем, а не перенесем, так как оригинал нам может понадобиться на случай восстановления чего-то нужного, которое можно случайно удалить в ходе редактирования. Скопированный файл лично сохраняю в своей библиотеке по пути L:/01 Libraries/Autodesk/Revit/2016/ASK/ASK 000 00000/JRN с обязательным переименованием.

Далее открываем файл журнала для редактирования в Блокноте (Notepad). Несмотря на то, что было совершено два десятка действий, строк записей оказалось значительно больше, но это обстоятельство не должно вас пугать, так как большинство из них – это комментарии помеченные символом апострофа в начале и не представляющие для нас никакой ценности. Соответственно по ходу редактирования все они удаляются, кроме комментариев в 3-4 строках, которые содержат информацию о сборке Revit и без которых выполнение может не произойти. К сожалению, официально журналы не поддерживаются и в справочной документации нет по ним описания, а также их синтаксис может изменяться от версии к версии, как и отличаться в зависимости от локализации.

Revit журналы

Поскольку я упомянул о синтаксисе, обратим внимание на следующие строки, в которых объявляется переменная Jrn в формате vbScript с последующим присвоением ей команд выполнения скриптов:

  • Dim Jrn
  • Set Jrn = CrsJournalScript

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

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

  • Jrn.AppButtonEvent 1 , “Application Menu is opening”

Теперь все лишнее можно смело удалить. Спустя несколько комментариев следует команда Закрытия главного меню приложения и сразу же искомая команда Создание нового проекта:

  • Jrn.AppButtonEvent 0 , “Application Menu is closing” Jrn.Command "Ribbon" , "Create a new project , ID_FILE_NEW_CHOOSE_TEMPLATE"

Вот как раз с этого места и начинаются исполняемые команды и следует быть очень осторожным, чтобы в ходе редактирования не удалить и не повредить нужные строки. Естественно комментарии между командами удаляем, а также можем удалить переносы строк исполняемых команд, которые обозначаются в конце символом нижнего подчеркивания. Обратите внимание на команды выбора шаблона проекта:

  • Jrn.PushButton "Modal , New Project , Dialog_Revit_NewProject" _
    , "Browse..., Control_Revit_BrowseTemplateName"
  • Jrn.Data "FileDialog" _
    , "IDOK" , "L:\01 Libraries\Autodesk\Revit\2016\ASK\ASK 000 00000 General.rte", "rte" _
    , "ASK 000 00000 General.rte", "ASK 000 00000 General.rte"
  • Jrn.Data "FileType" , "Template Files (*.rte)"

В них указаны значения пути и имени файла Шаблона проекта (Project Template), которые можно будет заменить, что позволит создавать Рабочие наборы (Worksets) на основе любых шаблонов. После команды подтверждения Создания нового проекта:

  • Jrn.PushButton "Modal , New Project , Dialog_Revit_NewProject" , "OK, IDOK"

следует множество комментариев его загрузки, подготовки активных видов, назначения переменных и т.п., которые также удаляем до момента открытия диалога Создания рабочих наборов:

  • Jrn.Command "StatusBar" , "Workset control , ID_SETTINGS_PARTITIONS"
  • Jrn.Edit "Modal , Worksharing , Dialog_Revit_PartitionsEnable" _
    , "Control_Revit_PartitionsEnableLevelsGridsViewsEdit" , "ReplaceContents" _
    , "000 00240 Layout"
  • Jrn.Edit "Modal , Worksharing , Dialog_Revit_PartitionsEnable" _
    , "Control_Revit_PartitionsEnableOthersEdit" , "ReplaceContents" _
    , "100 00000 Site"
  • Jrn.PushButton "Modal , Worksharing , Dialog_Revit_PartitionsEnable" , "OK, IDOK"

В нем указываем наименования наборов для хранения элементов Уровней (Levels) и Осей (Grids), а также Остальных (Others) элементов. После нажатия подтверждения создания, снова последует много комментариев, после которых важно не пропустить команду завершения Транзакции (Transaction). Что она собой представляет? Это фактическое завершение режима ожидания значений для переменных с передачей их следующим процессам в случае подтверждения или же возврат предыдущих значений в случае отмены.

  • Jrn.Data "Transaction Successful" , "Worksets"

Далее последуют команды создания дополнительных рабочих наборов:

  • Jrn.PushButton "Modal , Worksets , Dialog_Revit_Partitions" , "New, Control_Revit_New"
  • Jrn.Edit "Modal , New Workset , Dialog_Revit_NewPartition" _
    , "Control_Revit_NewPartitionName" , "ReplaceContents" , "200 00000 Massing"
  • Jrn.PushButton "Modal , New Workset , Dialog_Revit_NewPartition" , "OK, IDOK"

Как видно из скрипта, на создание каждого набора требуется три строки – нажатие кнопки Нового набора, введение значения его имени и подтверждение, при этом завершение Транзакции (Transaction) после каждого создания не требуется. Разница в строках заключается только в наименовании Наборов, и чтобы не терять время на долгое форматирование строк и удаление комментариев, достаточно скопировать уже готовые три строки команд и указать только требуемые имена, а нижеследующие строки – удалить. Итого получаем:

  • Jrn.PushButton "Modal , Worksets , Dialog_Revit_Partitions" , "New, Control_Revit_New"
  • Jrn.Edit "Modal , New Workset , Dialog_Revit_NewPartition" _
    , "Control_Revit_NewPartitionName" , "ReplaceContents" , "300 00000 Structure"
  • Jrn.PushButton "Modal , New Workset , Dialog_Revit_NewPartition" , "OK, IDOK"
  • Jrn.PushButton "Modal , Worksets , Dialog_Revit_Partitions" , "New, Control_Revit_New"
  • Jrn.Edit "Modal , New Workset , Dialog_Revit_NewPartition" _
    , "Control_Revit_NewPartitionName" , "ReplaceContents" , "400 00000 Architecture"
  • Jrn.PushButton "Modal , New Workset , Dialog_Revit_NewPartition" , "OK, IDOK"
  • Jrn.PushButton "Modal , Worksets , Dialog_Revit_Partitions" , "New, Control_Revit_New"
  • Jrn.Edit "Modal , New Workset , Dialog_Revit_NewPartition" _
    , "Control_Revit_NewPartitionName" , "ReplaceContents" , "500 00000 Technology"
  • Jrn.PushButton "Modal , New Workset , Dialog_Revit_NewPartition" , "OK, IDOK
  • Jrn.PushButton "Modal , Worksets , Dialog_Revit_Partitions" , "New, Control_Revit_New"
  • Jrn.Edit "Modal , New Workset , Dialog_Revit_NewPartition" _
    , "Control_Revit_NewPartitionName" , "ReplaceContents" , "600 00000 Services"
  • Jrn.PushButton "Modal , New Workset , Dialog_Revit_NewPartition" , "OK, IDOK

Вероятно, можно будет оптимизировать строки Создания наборов путем применения цикла и массива значений наборов. Остается всего несколько команд до завершения редактирования – это Сортировка наборов по имени, выбор Активного набора (Active Workset) и установка Подавления графики неактивных наборов (Gray Inactive Workset Graphics).

  • Jrn.Gris “Control; Modal , Worksets , Dialog_Revit_Partitions; Control_Revit_Partition" _
    , "MoveCurrentCell" , "HeaderRow" , "Name"
  • Jrn.ComboBox "Modal , Worksets , Dialog_Revit_Partitions" _
    , "Control_Revit_ActivePartitionCombo" , "SelEndOk" , "000 00240 Layout"
  • Jrn.ComboBox "Modal , Worksets , Dialog_Revit_Partitions" _
    , "Control_Revit_ActivePartitionCombo" , "Select" , "000 00240 Layout"
  • Jrn.CheckBox "Modal , Worksets , Dialog_Revit_Partitions" , "Gray Inactive Workset Graphics _
    , Control_Revit_GrayInactiveWorksetGraphics" , True

Обратите внимание на то, что команда выбора активного набора (Active Workset) дублируется с различными операторами "SelEndOk" и "Select", соответственно одна из них может быть лишней, в чем убедимся позже. После закрытия диалога Рабочих наборов (Worksets), обязательно должна следовать команда успешного завершения Транзакции (Transaction) для подтверждения действий:

  • Jrn.PushButton "Modal , Worksets , Dialog_Revit_Partitions" , "OK, IDOK"
  • Jrn.Data "Transaction Successful" , "Worksets"

В заключении работы скрипта, осуществляется повторное открытие диалога Рабочих наборов (Worksets) для проверки результата:

  • Jrn.Command "StatusBar" , "Workset control , ID_SETTINGS_PARTITIONS"

Оставшиеся строки закрытия проекта без сохранения и все комментарии можно смело удалить, а также закомментировать лишнюю строку выбора активного набора, например, с оператором "SelEndOk". Все, сохраняем журнал и приступаем к проверке его работоспособности.

3. Выполнение

Откроем Проводник, перейдем в месторасположение файла нашего журнала и перетащим его на значок Autodesk Revit на Рабочем столе. Как результат, будет запущенное приложение и выполнение команд создания Рабочих наборов (Worksets). В случае возникновения неполадок, появится окно Ошибки журнала (Journal Error) с предложением перейти в Интерактивный режим (Enter interactive mode). Соответственно закрываем Revit без сохранения, возвращаемся в Проводник и открываем новый файл журнала, например, journal.0001.txt, который появился в ходе выполнения нашего в той же директории. В нем будет запись всех действий в ходе выполнения журнала до момента сбоя, потому листаем почти в самый конец, ищем строку с комментарием причины ошибки и ссылки на строку ее расположения, например:
  • ‘ 1:< Execution did not correspond to recorded journal sequence.
  • ‘ At line number 31 of source journal.

В данном случае сообщается, что выполнение не соответствует требуемой последовательности. Открываем наш журнал для редактирования, находим в нем строку 31 и способом «научного тыка» устраняем причину ошибки, в моем случае отсутствует третья строка подтверждения создания рабочего набора "600 00000 Services". Вновь сохраняем файл журнала, но, прежде чем его воспроизвести, попробуем немного оптимизировать.

4. Оптимизация

Описывая редактирование, я упоминал, что журналы Autodesk Revit записываются в формате vbScript, соответственно можно произвести его оптимизацию. Начнем с создания переменных Наименования и Расположения Шаблона проекта (Project Template) для создания Рабочих наборов (Worksets). Для этого после строк объявления и назначения переменной Jrn, запишем свои:
  • Dim askFileName
  • askFileName = "ASK 000 00000 General.rte"
  • Dim askFileLocation
  • askFileLocation = "L:\01 Libraries\Autodesk\Revit\2016\ASK\"

Так как в скрипте требуются отдельные значения имени Шаблона проекта и его Полного пути, создадим переменную askFilePath составляемую из значений askFileLocation и askFileName:

  • Dim askFilePath
  • askFilePath = askFileLocation & askFileName

Очень советую перед подстановкой переменных в соответствующую строку команды, сделать ее исходную копию и закомментировать на всякий случай:

  • ‘ Jrn.Data "FileDialog" _
    , "IDOK" , "L:\01 Libraries\Autodesk\Revit\2016\ASK\ASK 000 00000 General.rte", "rte" _
    , "ASK 000 00000 General.rte", "ASK 000 00000 General.rte"
  • Jrn.Data "FileDialog" , "IDOK", askFilePath, "rte" , askFileName, askFileName

Перед сохранением можем еще закомментировать строки Открытия и Закрытия главного меню для проверки их полезности. Если все сделано правильно, выполнение журнала должно пройти без ошибок и можно попробовать применить функцию vbScript, например, Массив (Array) с целью хранения всех наименований Рабочих наборов (Worksets) в одной строке.

Для начала сделаем поиск в сети Интернет доступной справочной документации по vbScript, лично советую Language Reference на сайте MSDN (Microsoft Developer Network). В разделе Функции (Functions) найдем информацию по Массиву (Array), скопируем пример кода и вставим в журнал после строк предыдущих переменных. Впишем название переменной askWorksetArray, которой после присвоим функцию Массива (Array) со значениями наименований всех Рабочих наборов (Worksets):

  • Dim askWorksetArray
  • askWorksetArray = Array("000 00240 Layout","100 00000 Site","200 00000 Massing" _
    ,"300 00000 Structure","400 00000 Architecture","500 00000 Technology" _
    ,"600 00000 Services")

Далее сделаем замену значений наименований наборов во всех строках журнала, где они используются, на переменную askWorksetArray(n) с указанием в скобках позиции соответствующего значения в массиве, начиная с нуля. Например:

  • Jrn.Edit "Modal , Worksharing , Dialog_Revit_PartitionsEnable" _
    , "Control_Revit_PartitionsEnableLevelsGridsViewsEdit" , "ReplaceContents" _
    , askWorksetArray(0)
  • Jrn.Edit "Modal , Worksharing , Dialog_Revit_PartitionsEnable" _
    , "Control_Revit_PartitionsEnableOthersEdit" , "ReplaceContents" , askWorksetArray(1)
  • Jrn.Edit "Modal , New Workset , Dialog_Revit_NewPartition" _
    , "Control_Revit_NewPartitionName" , "ReplaceContents" , askWorksetArray(2)
  • Jrn.ComboBox "Modal , Worksets , Dialog_Revit_Partitions" _
    , "Control_Revit_ActivePartitionCombo" , "Select" , askWorksetArray(0)

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

Revit журналы

Попробуем применить цикл For…Next для возможности создания любого количества наборов из массива, но пока не менее трех. Для этого потребует функция определения длинны массива uBound() и переменная для ее хранения:
  • Dim askWorksetCount
  • askWorksetCount = uBound(askWorksetArray)

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

  • For i = 0 to askWorksetCount - 2
  • Jrn.PushButton "Modal , Worksets , Dialog_Revit_Partitions" , "New, Control_Revit_New"
  • Jrn.Edit "Modal , New Workset , Dialog_Revit_NewPartition" _
    , "Control_Revit_NewPartitionName" , "ReplaceContents" , askWorksetArray(i +2)
  • Jrn.PushButton "Modal , New Workset , Dialog_Revit_NewPartition" , "OK, IDOK"
  • Next

Естественно можно сразу начать цикл с требуемой позиции и не заниматься дополнительными вычислениями:

  • For i = 2 to askWorksetCount

Сохраняем и проверяем работоспособность оптимизации циклом путем выполнения журнала. После можем попробовать добавить несколько новых Рабочих наборов (Worksets) к переменной askWorksetArray, сохранить и вновь запустить журнал.

5. Заключение

Таким образом мы получили простейшую автоматизацию по созданию наборов в новых проектах, которую можно еще оптимизировать условиями If…Else для создания уже минимум двух Рабочих наборов (Worksets) вместо трех, процедурами Sub с целью вынесения повторяемых действий за пределы основного кода для удобства их редактирования. Также журнал можно дополнить командами загрузки требуемых семейств, осуществления настроек и создания видов, что позволит использовать его еще более эффективно.

Готовый журнал можете загрузить по ссылке, а также просмотреть видеоуроки (см. ниже, длительность —23 минуты). Пользуйтесь и реализуйтесь!



Все права защищены. © 2004-2024 Группа компаний «ЛЕДАС»

Перепечатка материалов сайта допускается с согласия редакции, ссылка на isicad.ru обязательна.
Вы можете обратиться к нам по адресу info@isicad.ru.