воскресенье, 1 ноября 2015 г.

Скрипт для печати по форматам

С своё время я облегчал печать разных форматов из Revit при помощи Dynamo, но после этого уважаемый Wrath выложил макрос на C#, сразу формирующий наборы листов по форматам.
Я немного модифицировал код - теперь он дополнительно разделяет листы по комплектам чертежей:

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

UPD: была обнаружена проблема с определением размеров листа (все листы сваливаются в Unknown format даже с корректным семейство основной надписи). Подробности в конце статьи.


Для корректной работы макроса нужны правильно созданные семейства форматов листов. Параметры "Высота" и "Ширина", определяемые в семействе, должны совпадать с системными параметрами "Ширина листа" и "Высота листа":


У меня больше на 0.3мм - не так страшно, если различие больше - нужно проверить семейство штампа на элементы, выступающие за его границу. Если семейство некорректное - все листы свалятся в "Unknown format":

Для установки макроса распакуйте архив в папку:
%PROGRAMDATA%\Autodesk\Revit\Macros\2015\Revit\AppHookup

Перезапустите Ревит и перейдите Управление - Диспетчер макросов:
В окне на вкладке "Приложение" найдите наш макрос:
В окне ничего нет - где-то косяк :)
Но можно код вставить принудительно. Также это пригодится, если у вас на рабочем компьютере нет прав доступа к папке "ProgramData". Нажмите в окне "Создать - Модуль":

Укажите имя "PrintList" - Ok.  Наш язык - C#. Через несколько секунд будет открыто окно SharpDevelop с заготовкой кода макроса.
Откройте из архива папку "Исходный код.txt", скопируйте из него весь код. Перейдите обратно в SharpDevelop. Установите курсор после строки "Revit Macros Generated Code":
И вставьте скопированный текст:

Вверху на панели инструментов выберите "Собрать текущее решение". Если всё было сделано правильно - в нижней части окна появится "Сборка успешно завершена". Либо появятся ошибки (здесь я не скопировал первую строчку с объявлением класса):



Кстати, вот мой добавленный участок кода:

Два вложенных цикла - еще больше индусского кода! Ну, работает - и ладно :)

"Орг.РазделПроекта" - замените на параметр, который у вас используется для группирования листов в комплекты.

Закрываем SharpDevelop. В окне выбираем добавленный макрос и нажимаем "Выполнить" - запуск формирования наборов листов,

Несмотря на тяжеловесность кода, работает быстро -  10 секунд на 1200 листов.
Как обычно - небольшое кино:



Ну собственно и всё. Удачи!

UPD: в случае, если семейство основной надписи корректное, но листы все равно сваливаются в "Unknown format" - отредактируйте код макроса, замените строчку 33:

string s_format =  s_complect + ": " + GetSheetFormat(s_height.AsValueString(), s_width.AsValueString());

На вот такой код:

int d_height = (int)Math.Round(304.799472 * s_height.AsDouble());
int d_width = (int)Math.Round(304.799472 *s_width.AsDouble());
string s_format =  s_complect + ": " + GetSheetFormat(d_height.ToString(), d_width.ToString());

Далее нужно "Собрать текущее решение", закрыть окно Sharp Develop и запустить макрос заново.
Проблема была в методе "AsValueString()", который мог выдавать не "594", а "594,0" - и "GetSheetFormat" выполнялся некорректно. Теперь код получает число, округляет до целого, и только после этого превращает в строку.
Спасибо Данилу Медведеву за указание на проблему.

22 комментария:

  1. Александр, огромное спасибо!
    Одним больным местом в Revit меньше: печать побороли!

    ОтветитьУдалить
  2. Спасибо, мне как то друг делал макрос, перенести на другой комп тоже без танцев с бубном не получилось.

    ОтветитьУдалить
  3. Этот комментарий был удален автором.

    ОтветитьУдалить
    Ответы
    1. Да я почти ничего не сделал, только готовый код подправил и сюда выложил.
      На видео я как раз показываю неправильное определение формата, двигаю обозначение формата и показываю корректную работу.

      Удалить
    2. Этот комментарий был удален автором.

      Удалить
  4. Александр, разъясните, пожалуйста поподробнее, что это за параметр для группирования листов и как его создать:
    "GP_ОбозначениеТома(Комплекта)" - замените на параметр, который у вас используется для группирования листов в комплекты.

    ОтветитьУдалить
    Ответы
    1. Хорошо, надо бы еще статью подготовить по организации видов и листов.
      Вкратце - создаете общий параметр "ШифрКомплекта", добавляете его через параметр проекта к категории "Листы". В семействе основной надписи устанавливаете "Метку" и выводите в нее этот параметр.
      В диспетчере проекта щелкаем правой кнопкой по "Листы", выбираем "Организация браузера". Создаем там новый стиль, в окне на вкладке "Группировка" указываем: "сначала" - по "ШифрКомплекта", "Затем по" - "Семейство".

      Удалить
  5. Попробуйте печать через dwfx с последующим переводом в pdf. Очень быстро получается

    ОтветитьУдалить
    Ответы
    1. Ничерта подобного. Ручное забивание номеров листов в Design Review - тоже задачка не сахар. И уж совсем весело получается, когда dwf просто не открывается: http://weandrevit.blogspot.ru/2015/03/dwf-was-problem-displaying-file.html

      Удалить
  6. Здравствуйте, Александр. Подскажите, почему при запуске макроса программа выдает следующую ошибку:

    https://yadi.sk/i/L4yOSjEonpocV

    ОтветитьУдалить
    Ответы
    1. Замените строчку 66 на
      s_complect = sh.GetParameters("Орг.РазделПроекта")[0].AsString();
      В этой строке указывается имя параметра, который используется для сортировки листов по комплектам.

      Удалить
    2. Спасибо, заработало.

      Удалить
  7. мощная штука. И нужная. Автоматизация - няма-няма ;).

    ОтветитьУдалить
  8. Revit 2016. При попытке собрать макрос из исходника выдает ошибку:""Print.ThisDocument" не содержит определение для "ActiveUIDocument". Не удалось найти метод расширения "ActiveUIDocument", принимающий первый аргумент типа "Print.ThisDocument" (пропущена директива using или ссылка на сборку?)".

    Сборка не создается.

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

      Удалить
  9. Александр, приветствую тебя). В библиотеке SpringNodes для Dynamo есть нод ViewSet.ByViewsName для создания наборов видов/листов. Так что можно обойтись без макросов.

    ОтветитьУдалить
    Ответы
    1. Привет.
      На самом деле, у нас сейчас уже полноценное приложение для пакетной печати есть, так что и без Динамы можно обойтись :)
      А плюс макроса в том - что его можно установить и использовать даже без прав администратора на данной машине.

      Удалить
  10. Приложение это гуд, но вы ведь его небесплатно раздаете). Поэтому я за Динамо, как наиболее простой и гибкий инструмент для решения оперативных проблем

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

      Удалить
  11. Александр, есть очень актуальная проблема. Нет ли каких новостей в вопросе разграничения прав доступа к Revit серверу?

    ОтветитьУдалить
    Ответы
    1. Нет, штатными средствами у нас не получилось решить. Вообще, если кто-то из архитекторов изменит конструктивную модель, это будет видно в консоли Ревит-сервера, и достаточно будет пару раз применить административные меры к нарушителям.
      Мы сейчас придумываем свое приложение для администрирования совместной работы (в том числе разграничения прав доступа), но пока еще это всё в сыром виде.

      Удалить
  12. Этот комментарий был удален автором.

    ОтветитьУдалить