среда, 2 декабря 2015 г.

Revit и Python. Работа с арматурой. Чать 1

            Настало время и для этой сложной темы. Эта тема наверное одна из немногих на просторах интернета, а может быть и ................Если вам все из прочитанного станет ясным то в принципе вам море по колено, нерешаемых задач теперь для вас нету. Я покажу как используя синтаксис Python-а добиться ощутимых результатов.


           Я не использую в работе Dynamo , почему ? эта широкая тема которую я когда нибудь освещу.
          Python является языком ООП- объектно ориентированным языком программирования. То есть код нацелен на объекты, которые в свою очередь образуют классы. Любой параметр в Revit , созданный вами или системный является объектом API. Совокупность данных параметров образуют классы - семейства (типы или экземпляры типов). Например:
 ЧислоСтержнейАраматуры = 3 
             Это объект класса и он же параметр семейства. Но не все семейства могут быть классами. Класс может включать в себя совокупность классов, например семейство с вложенными семействами.
            API позволяет работать с большим количеством семейств (классов) , некоторые семейства и их параметры доступны только через API. Возможности конечно не бесконечные но все же намного шире чем просто при работе с панелью инструментов.
           В первую очередь необходимо ознакомиться с самим Python. Основные преимущества:
- простой синтаксис
- логика языка близка к человеческой, а не машинной (но все равно машинная)
- не нужно описывать много лишних внутренних конструкторов переменных языка
- огромная бесплатная библиотека функций
- поддержка ведущими корпорациями мира
- ну и просто это будущее в программировании
            Во вторую очередь необходимо ознакомиться с документацией разработчика RevitSDK. Вся информация доступна на ресурсе Autodesk, хоть тут компания уделяет пристальное внимание и пишут довольно детальный мануал как по самой документации API так и разрабатывают наглядные примеры работы плагинов.
            Для начала работы нам необходимо скачать и установить среду программирования. Скачать ее можно с официального сайта www.python.org. Эта стандартная среда разработчика. Есть среды программирования  более продвинутые с поддержкой различных подключаемых библиотек но об этом позже.
            Для того что бы видеть результат нашего кодинга необходимо установить ядро Python для Revit. Качаем и устанавливаем RevitPythonShell от Daren Thomas. Это плагин позволяет вводить код в консоли Python вызываемой прямо в Revit. Когда код будет собран его так же можно будет скомпилировать в библиотеку (.dll) и запускать как обычный плагин в Revit.
           Если вам не интересно программирование так таковое то далее читать будет бессмысленно.
           Для начала в нашем коде нам необходимо подключиться к библиотекам Revit:


           Что есть что, я думаю все смогут посмотреть в SDK документации. Данная запись можно сказать универсальная почти для любой задачи.
           Далее нам необходимо подключить сам Revi и активный проект:

             По негласному правилу программисты оставляют доступ к закрытым переменным, __revit__ одно из них.
          Теперь объявим транзакцию кода , таких транзакций в коде может быть бесчисленное множество:
       
             Название транзакции может быть каким угодно. Когда мы обозвали нашу транзакцию нам необходимо начать ее, это выполняется путем ввода t.start().
            Ну и теперь самое интересное, у нас есть ссылка на программу , есть ссылка на активный проект , но нету задачи что делать программе , у нас пока что пустое поле. Начнем с того что отфильтруем то что нам необходимо для дальнейших манипуляций:
            

            Тут в принципе я уже все закомментировал в строках. Единственное что нужно пояснить, это то , что я создал коллектор для класса OST_DetailComponents. В этот класс и будем заносить нужную нам информацию и в нужные места. А переменная typefilter объявлена собственно для того что бы отфильтровать откуда нам нужно взять нужную информацию.
           По работе с многими фильтрами (по типу работы фильтров в самом Revit) будет отдельная статья.
          Допустим нам теперь нужно вытянуть из OST_Rebar (несущая арматура) все экземпляры с параметром "АА", у меня этот параметр равен стандартному параметру "А", и составить список данных. Для этого нужно применить цикл команды синтаксиса Python + переменные API Revit:
          

           Мы создали цикл из элементов "elems" и задали команду (.LookupParameter("АА")). В данном случае мы взяли все значения "АА" из "elems" и внесли их в список "b1". Но так как лично у меня существует 10 семейств несущей арматуры в документе (но не на чертеже) то мне необходимо было как то отсеять параметры арматуры который физически нету на чертеже. Я создал новый список и отрезал первых 10 значений:

                                    е1=b1[10:] 
            Тут конечно для более менее солидной программы , а не конкретного шаблона нужно ввести правило фильтров, но об этом я расскажу позже.
           Ну а теперь самое интересное :). Овладев драгоценной информацией мы может теперь строить космос ! Для начала попробуем один из методов использования данной информации. Данный метод будет использовать силу программирования и силу семейств Revit. Перенесем данные из списка значений параметра "АА" "несущей арматуры" в параметр "АА" "элементов узлов":
          Теперь мы можем переписывать значения из одного семейства в другое ,но есть одно НО, мы по прежнему не можем сделать полную копию всей арматуры в чертежах только другим семейством потому как мы переписываем значения из списка только столько экземплярам "элементов узлов" сколько у нас существует их в документе. То есть если у нас допустим различных экземпляров несущей арматуры около 10 типов и каждого тип содержит 10 экземпляров типа то у нас должно быть и столько же различных типов элементов узлов для ведомости деталей и 10 экземпляров каждого типа. Но это невозможно предугадать, эти числа всегда будут разными и разное количество типов и разное количество экземпляров каждого типа ! как выйти из этой ситуации ? не просто но можно ! Для этого объявим новый коллектор и фильтр :
           Самое главное в этой строке , это отслеживание и возможность сортировки экземпляров класса "элементы узлов" (OST_DetailComponents)
           Далее приведу код для вычисления количества экземпляров несущей арматуры и построения новых экземпляров нужного нам класса (семейства) например элементов узлов:

           А теперь кто вкурил все сказанное начинает фантазировать по поводу параметра "количество". Этот параметр , а точнее весь код  и его логика могут творить чудеса в Revit. Это всего лишь некая часть идеи полного кода. 
           P.S. Совсем забыл ,нужно закрыть транзакцию :) :
t.Commit()

7 комментариев:

  1. А в чем смысл подобного кода:
    x = blabla1
    x = blabla2
    Почему не сразу
    x = blabla2
    ?

    ОтветитьУдалить
    Ответы
    1. подскажите лучше вариант

      Удалить
    2. Писать сразу второе присваивание - в первом смысла нет - вы одну и туже переменную инициализируете сначала одним значением, потом вторым

      Удалить
  2. Очень интересно. Жду продолжения.

    ОтветитьУдалить
  3. Михаил, очень интересные статьи. Подскажите пожалуйста... Раньше для Ревита не программировал. Все делал как написано, но при выполнении ругается "Программе Revit не удалось выполнить внешнюю команду. Для решения проблемы обратитесь в соответствующую службу...." Что может быть не так, и надо ли подгружать какие то дополнительные библиотеки Autodeska, вы об этом ничего не пишете....

    ОтветитьУдалить
  4. НУ если честно этот код я не проверял на работоспособность , тут в основном немного логики что и как ... для начала все же нужно изучить базовый синтаксис Python и понимать что из себя представляет API Revit,я тоже когда то брал чужие коды и они не работали но потом начинал разбирать каждую строчку и что она делает и все потихоньку начало получатся. Я в ближайшее время разберу более приземленный вариант работы с арматурой по каждой строчке , но когда появится время , у меня очень много работы основной а это просто хобби :)

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

Поиск по этому блогу