Autodesk Revit: Журналы

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

Запись

С начала запустим Autodesk Revit и создадим новый проект, с обязательным выбором Шаблона проекта (Template) из библиотеки для получения его пути и наименования. Далее приступим к созданию Рабочих наборов (Worksets) и сначала введем наименования основного набора для Уровней (Levels) и Осей (Grids), а также для всех остальных элементов проекта, например, Местности (Site). Соответственно составляю наименования согласно своему классификатору данных, в котором все элементы Разбивки (Layouts) имеют код 000 00240, а Местности (Site) – 100 00000. Естественно можете ввести любые понятные Вам значения. Далее добавляю Рабочие наборы (Worksets), которые могут понадобиться для распределения элементов Концепции (Massing), Конструкций (Structure), Архитектуры (Architecture), Технологии (Technology), Инженерии (Services) и т.п. Таким образом каждый проектировщик будет работать в наборе, соответствующий его разделу. Спросите – а как же быть в случае работы нескольких архитекторов? Ведь Revit не позволяет одновременно назначать нескольких владельцев одному набору, в то время как другие участники проекта смогут свободно занимать их элементы. Как вариант можно создать дополнительные архитектурные наборы для более детального распределения элементов, например, Стены (Walls), Полы (Floors), Потолки (Ceilings), Проемы (Openings) и т.п., а можно разделить проект на отдельные модели и связать их между собой наложенными ссылками. Что лучше? Собственно, это тема следующих публикаций, а пока выберем Активный рабочий набор (Active Workset), установим Подавление графики неактивных наборов (Gray Inactive Workset Graphics) и завершим их создание. Далее можем еще раз открыть диалог наборов для проверки результата и закрыть Revit. Запись журнала – завершена.

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

Для просмотра полученного журнала действий перейдем по следующему пути:
В случае наличия нескольких файлов журналов, отсортируем их по дате создания, выделим самый новый и скопируем в другое месторасположение. Именно скопируем, а не перенесем, так как оригинал нам может понадобиться на случай восстановления чего-то нужного, которое можно случайно удалить в ходе редактирования. Скопированный файл лично сохраняю в своей библиотеке по пути с обязательным переименованием:
Далее открываем файл журнала для редактирования в Блокноте (Notepad). Несмотря на то, что было с два десятка действий, строк записей значительно больше, но это обстоятельство не должно Вас пугать, так как большинство из них – это комментарии помеченные символом апострофа в начале и не представляющие для нас никакой ценности. Соответственно по ходу редактирования все они удаляются, кроме комментариев в 3-4 строках, которые содержат информацию о сборке 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». Все, сохраняем журнал и приступаем к проверке его работоспособности.

Выполнение

Откроем Проводник, перейдем в месторасположение файла нашего журнала и перетащим его на значок 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». Вновь сохраняем файл журнала, но прежде чем его воспроизвести, попробуем немного оптимизировать.

Оптимизация

В ходе редактирования упоминал, что журналы 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)
Прежде чем запустим журнал, избавимся от лишних закомментированных ранее строк, а также добавим несколько своих комментариев для ясности и улучшения читаемости. Сохраняем и выполняем журнал, в случае успеха – продолжаем оптимизацию, в ином случае – смотрим свежие журналы на предмет информации об ошибках и устраняем их. Попробуем применить цикл 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, сохранить и вновь запустить журнал.

Заключение

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

Пользуйтесь.

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s