Записи с меткой «Journal»

В жизни каждого ревитчика рано или поздно наступает момент обновления множества семейств и чаще всего наступает при переходе на новую версию или в случае внесения изменений, например, добавление параметров, обновление вложенных семейств… и это большая проблема. В связи с этим предлагаю Вам абсолютно доступное решение при помощи Журналов (Journals), о которых рассказывал в предыдущей публикации.

Создание файла путей семейств

Начнем из создания текстового файла путей семейств, требующих обновления, при помощи пакетных файлов CMD расположенных в корне Библиотеки (Libraries). Да, это «старые-добрые» и проверенные временем команды DOS. Откроем файл ASK 000 00000 Families.cmd:

  • @echo off
  • chcp 1251
  • cd .
  • attrib -R -H -S +A «*.rf?» /S
  • del «*.0???.r??» /S
  • dir /B /S «*.rf?» > «ASK 000 00000 Families.txt»
В нем изначально отключаем вывод результата @echo off и устанавливаем кириллическую кодировку chcp 1251. Далее указываем текущую директорию cd ., на всякий случай снимаем атрибуты скрытия, защиты от записи файлов семейств attrib -R -H -S +A «*.rf?» /S, удаляем их резервные копии del «*.0???.r??» /S и получаем их пути dir /B /S «*.rf?» с записью в текстовый файл > «ASK 000 00000 Families.txt». После выполнения файла ASK 000 00000 Families.cmd получаем текстовый файл с требуемыми строками путей и наименований файлов семейств. Обратите внимание, что для Autodesk Revit 2016 создаю библиотеки исключительно на латинице и только для англоязычной версии.

На случай получения списка путей семейств моделей есть отдельная команда ASK 000 00000 Families — Model.cmd, а соответственно для семейств оформлений – ASK 000 00000 Families — Annotation.cmd. Зачем? При внесении изменений в семейства моделей можно добавить Общие параметры (Shared parameter), а в семейства оформлений – нет. Тут же возникает логичный вопрос – как отделить «котлеты» от «мух», семейства моделей от семейств оформлений?

Лично это решаю при помощи собственной системы классификации данных, в которой все семейства моделей в численном коде имеют «0» на шестой позиции «??? ??? ??0??*.rf. В случае необходимости можно расширить условия поиска и, например, добавить составляющие семейства моделей «??? ??? ??5??*.rf с цифрой 5. В результате запуска команды получаем исключительный перечень семейств моделей, на примере которых и продемонстрирую работу журналов обновления. Естественно для этого потребуется только несколько файлов. Но прежде, еще посмотрим отличия условий выбора семейств оформлений, в которых маска «??? ??? 1?0??*.rf отвечает за обозначения, «??? ??? ??2??*.rf за аннотации и «??? ??? ??3??*.rf?» семейства детализации. Проверяем результат выполнения команды ASK 000 00000 Families — Annotation.cmd и еще раз убеждаемся в нем.

Обзор журнала обновления семейств

Таким образом мы закончили подготовку списка семейств для обновлений и перейдем к обзору журналов. С журналом созданий Рабочих наборов можно ознакомиться по ссылке. Сейчас же открываем журнал ASK 000 00000 Upgrade.txt, в начале которого обязательно указываются комментарии версии Autodesk Revit, а также переменная объявления Объекта CrsJournalScript для выполнения действий.

  • ‘ Build: 20150506_1715(x64)
  • ‘ Branch: RELEASE_2016_RTM
  • Dim Jrn
  • Set Jrn = CrsJournalScript

Далее следуют переменные получения текстового файла со списком путей семейств, его наименования, расположения и пути. После объявляется Объект работы с Файловой системой (File System):

  • Dim dirFile ‘File with Path of Families (RFT, RFA)
  • Dim dirFileName ‘ Set file name
  • dirFileName = «ASK 000 00000 Families.txt»
  • Dim dirFileLocation ‘ Set file location
  • dirFileLocation = «L:\01 Libraries\Autodesk\Revit\2016\ASK\»
  • Dim dirFilePath ‘ Get file path
  • dirFilePath = dirFileLocation & dirFileName
  • Dim fso ‘ Set file System Object
  • Set fso = CreateObject(«Scripting.FileSystemObject»)

Ознакомиться с его возможностями можно на сайте MSDN (Microsoft Developer Network) по ссылке, среди которых нам потребуется метод ReadLine для построчного чтения текстового файла. Соответственно можно скопировать готовый пример использования этого метода для записи и чтения. Вернемся к журналу, в котором после объявляю переменную хранения пути обновляемого семейства:

  • Dim upgFilePath ‘ Path of file to upgrade

Далее начинается основной код, в котором изначально делаю проверку наличия текстового файла и в случае его отсутствия вывожу Сведенья о Autodesk Revit (About) в качестве предупреждения, так как пока не получается вывести текстовое сообщение:

  • If fso.FileExists (dirFilePath) Then
  • Set dirFile = fso.OpenTextFile(dirFilePath, 1)
  • Do While dirFile.AtEndOfStream <> True
  • upgFilePath = dirFile.ReadLine
  • askUpgrade(upgFilePath)
  • Loop
  • Else
  • Jrn.Command «Ribbon» , «Display program information… , ID_APP_ABOUT»
  • End If

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

  • Sub askUpgrade(askFilePath)
  • Jrn.Command «Ribbon» , «Open an existing project , ID_REVIT_FILE_OPEN»
  • Jrn.Data «File Name» , «IDOK», askFilePath
  • Jrn.Command «Ribbon» , «Save the active project , ID_REVIT_FILE_SAVE»
  • Jrn.Command «Ribbon» , «Close the active project , ID_REVIT_FILE_CLOSE»
  • End Sub

Которая выполняет открытие требуемого семейства по указанному пути, его сохранение и закрытие. Вот собственно и все решение, которые сэкономит массу Вашего времени и главное нервов).

Обзор журнала модификации семейств

Лень однозначно – двигатель прогресса, и почему бы не сэкономить еще больше времени, например, на изменениях файлов семейств? Посмотрим журнал обновления семейств ASK 000 00000 Upgrade — Model.txt, в котором после открытия семейства в процедуре обновления askUpgrade, вызываются процедуры добавления нового параметра askAddParameter и обновления семейств обозначений askUpdateSymbols:

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

  • Sub askAddParameter(askParameter , askParameterGroup , askParameterValue)
  • Jrn.PushButton «Modal , Family Types , Dialog_Family_FamilyType» _
    , «Add…, Control_Family_NewFamParam»
  • Jrn.RadioButton «Modal , Parameter Properties , Dialog_Revit_ParamPropertiesFamily» _
    , «Shared parameter, Control_Revit_ExternalParam»
  • Jrn.PushButton «Modal , Parameter Properties , Dialog_Revit_ParamPropertiesFamily» _
    , «Select…, Control_Revit_ExternalParamSelect»
  • Jrn.ListBox «Modal , Shared Parameters , Dialog_Revit_ExternalParamImport» _
    , «Control_Revit_Parameters» , «DblClick» , askParameter
  • Jrn.ComboBox «Modal , Parameter Properties , Dialog_Revit_ParamPropertiesFamily» _
    , «Control_Revit_ParamGroup» , «Select» , askParameterGroup
  • Jrn.PushButton «Modal , Parameter Properties , Dialog_Revit_ParamPropertiesFamily» _
    , «OK, IDOK»
  • Jrn.Data «Transaction Successful» , «New parameter»
  • Jrn.Grid «Control; Modal , Family Types , Dialog_Family_FamilyType; _
    Control_Family_TypeGrid» , «PartialEdit» , «Developer» , «ValueCol» , askParameterValue
  • Jrn.PushButton «Modal , Family Types , Dialog_Family_FamilyType» , «OK, IDOK»
  • Jrn.Data «Transaction Successful» , «Family Types»
  • End Sub

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

Процедура askUpdateSymbols осуществляет обновление обозначения Уровней (Levels) и Разрезов (Section) из библиотеки по исходным путям их загрузки:

  • Sub askUpdateSymbols()
  • Jrn.Browser «Activate» , » «
  • Jrn.Browser «ToggleExpandedState» , «>>Families>>»
  • Jrn.Browser «ToggleExpandedState» , «>>Families>>Annotation Symbols>>»
  • Jrn.Browser «SelChange» , «>>Families>>Annotation Symbols>>ASK 000 00140 Level>>»
  • Jrn.Command «Internal» , «Reload Family , ID_RELOAD_FAMILY»
  • Jrn.Data «File Name» , «IDOK», «L:\01 Libraries\Autodesk\Revit\2016\ASK _
    \ASK 000 00100 Symbols\ASK 000 00140 Layouts\ASK 000 00140 Level.rfa»
  • Jrn.Data «FileExternalTypes» , «»
  • Jrn.Data «TaskDialogResult» , «You are trying to load the family ASK 000 00140 Level _
    , which already exists in this project. What do you want to do?» _
    , «Overwrite the existing version», «1001»
  • Jrn.Data «Transaction Successful» , «Reload Family»
  • Jrn.Browser «Activate» , » «
  • Jrn.Browser «SelChange» , «>>Families>>Annotation Symbols>>ASK 000 00150 Section>>»
  • Jrn.Command «Internal» , «Reload Family , ID_RELOAD_FAMILY»
  • Jrn.Data «File Name» , «IDOK», «L:\01 Libraries\Autodesk\Revit\2016\ASK _
    \ASK 000 00100 Symbols\ASK 000 00150 Views\ASK 000 00150 Section.rfa»
  • Jrn.Data «FileExternalTypes» , «»
  • Jrn.Data «TaskDialogResult» , «You are trying to load the family ASK 000 00150 Section _
    , which already exists in this project. What do you want to do?» _
    , «Overwrite the existing version», «1001»
  • Jrn.Data «Transaction Successful» , «Reload Family»
  • Jrn.Browser «Activate» , » «
  • Jrn.Browser «ToggleExpandedState» , «>>Families>>Annotation Symbols>>»
  • Jrn.Browser «ToggleExpandedState» , «>>Families>>»
  • End Sub

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

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

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