Dynamo python revit api

Dynamo: работа с соединителями через Revit API. Часть 1

В этом цикле статей расскажу, как с помощью Dynamo, языка программирования Python и Revit API получать информацию с соединителей инженерных элементов. Пишу статью и для вас, и для себя, так как нерегулярно работаю в Динамо и могу что-то забывать. А так будет шпаргалка для всех.

Владение Питоном достаточно на новичковом уровне, как у меня. Ничего не бойтесь, ничего сложного тут нет. Я тоже когда-то думал, что это ужасные дебри и очень сложно. На деле — просто дебри и не очень сложно, как кажется.

Также для работы нам потребуется плагин Revit Lookup. О его возможностях несколько раз рассказывал в статьях с лайфхаками, очень полезный плагин, тут тоже пригодится. Именно ему посвящена первая статья цикла.

Оглавление цикла

По мере выхода статей будут добавлять сюда ссылки.

Свойства элементов в Ревит Лукап

Начнём с плагина. Объяснять буду по-простому, потому что тонкостей сам не знаю. Если вы опытный и разбираетесь, пишите в комментариях, как оно на самом деле, я почитаю.

С помощью Ревит Лукапа мы можем посмотреть на базу данных, которую из себя представляет наш проект в Ревите. Можно залезть во всю базу, а можно выделить отдельный элемент и посмотреть только его свойства. Будем смотреть на примере вентиляционного диффузора — это простой объект, а всё работает аналогично и для других элементов.

Читайте также:  Java util currency data

Выделяю диффузор, иду на вкладку «Надстройки», жму по кнопке плагина и выбираю Snoop Current Selection — «проинспектировать текущий выбор». Открывается окно плагина. В нём много всего, но сразу видно, что есть жирный текст, обычный и красный. Красный — это какая-то ошибка, то есть такого рода данных в элементе нет. Обычный — просто почитать информацию.

На жирный текст можно нажать и «провалиться» в новое окно с данными. Привычные нам параметры из окна свойств можно увидеть нажатием по строке «Parameters — ».

Тут всё на английском, но потыкаться и разобраться можно. Если вернуться в первое окно, которое выдал плагин, тут есть ещё два важных моментах. Всё делится на несколько групп с бирюзовыми заголовками, а внутри есть подзаголовки «Properties» и «Methods» — свойства и методы. В дальнейшем нам это пригодится, пока коротко скажу: свойства — вывести информацию, а методы — что-то сделать. Далее всё это разберём на примерах.

Соединители в Ревит Лукап

Теперь определим, где у нас соединители в Ревит Лукапе. Для системных и загружаемых категорий они отображаются по-разному.

Системные категории

Для жёстких и гибких труб, воздуховодов, изоляции, лотков, коробов доступ к соединителям можно получить через свойство «ConnectorManager». Оно находится в группе «MEPCurve». Посмотрим на примере кабельного лотка. Выделю его, нажму по Snoop Current Selection, прокручу почти в самый низ.

Коннектор Менеджер — это класс объектов в Ревите, которых хранит в себе все соединители конкретного экземпляра. Так как соединителей может быть несколько у одного элемента, то их надо куда-то «сложить». Вот в Коннектор Менеджер и складывают. У воздуховода, трубы или лотка всегда два соединителя, у тройника — обычно три, а у сложного котла может быть и десяток.

Коннектор Менеджер написан жирным шрифтом, значит, можно по нему нажать. Жмём и видим, что у него есть набор свойств, а методов нет. То есть с Коннектор Менеджером ничего сделать нельзя, но какие-то свойства у него есть, что-то посмотреть можно.

Разберём свойства Коннектор Менеджера со скриншота выше. Столбец слева называется «field», поле. Столбец справа — «value», значение.

Connectors (соединители). Это свойство Коннектор Менеджера со всеми соединителями, они не просто «валяются» в менеджере, они лежат в своей коробочке — < ConnectorSet >, наборе соединителей. Для нас в Питоне это будет списком соединителей у элемента.

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

Owner. Свойство, которое показывает, кто является владельцем данного Коннектор Менеджера. По сути это наш лоток.

UnusedConnectors (неиспользуемые соединители). Список, набор соединителей, которые никуда не подключены. Если такие есть, то свойство будет жирным, если нет, то обычным текстом. Мой лоток никуда не подключён, просто лоток в воздухе, поэтому оба его соединителя открыты, то есть не используются.

Так как статья про соединители, то здесь нам нужно свойство Connectors. Если провалиться в него, то увидим сбоку список и там все соединители элемента. Если нажимать по ним, что будет видеть в правой части окна различные их свойства и методы. Это уже будет разбирать дальше в своём разделе.

Загружаемые категории

Для загружаемых семейств вроде оборудования, сантехприборов или арматуры всё то же самое, но нельзя попасть в Коннектор Менеджер напрямую. Сначала нужно «зайти» в свойство «MEPModel», а уже оттуда попадём в Коннектор Менеджер. Покажу на примере всё того же диффузора.

Важность Ревит Лукапа

Резонный вопрос — почему столько времени потратили на Ревит Лукап? Дело в том, что все эти строки и тыки мышкой дают нам понимание того, где вообще искать соединители, как к ним обращаться через программный код. Путь, который мы проходим в Ревит Лукапе, — это своего рода адрес соединителей, он нам будет нужен в Питоне.

В большинстве случаев, когда хотите сделать что-то в Питоне с помощью Ревит АПИ, сначала вы можете в Ревит Лукапе посмотреть, как обратиться к нужному элементу, где взять нужные свойства, а уже потом реализуете в программу в Питоне. Это сильно упрощает работу.

В следующей статье посмотрим, как обратиться к соединителям через Динамо и Питон.

Источник

Revit API using Python — Example

Let’s extract the Wall location. We can get find the method using dir(walls[0]) or the Revit Lookup:

locCrvs = [] #Create an empty list to store the curves for w in walls: locCrvs.append(w.Location) #Assign your output to the OUT variable. OUT = locCrvs 

If we try to convert the output to a Dynamo line using ToProtoType() we get an error. That’s because we need to extract the Curve from the LocationCurve first. This can be seen both from Revit Lookup and the dir(locCrvs[0]) output (there isn’t a ToProtoType() method and there is a Curve method). So if we run:

locCrvs = [] #Create an empty list to store the curves for w in walls: locCrvs.append(w.Location.Curve) #Assign your output to the OUT variable. OUT = locCrvs 

The output is finally a Revit line:

We can use the ToProtoType() method to it into a Dynamo line:

locCrvs.append(w.Location.Curve.ToProtoType()) 

5. Create a line load

Let’s now see how can we create a line load at the bottom of the wall. First of all let’s check on revitapidocs which method should we use.

  • The method is available from Revit 2016 and it has not been modified since, this can be seen at the top of the page.
  • The class is LineLoad and it has 3 different ways to create a line load. We want to create a line load from a line so we pick the third one.
  • This class is part of the Autodesk.Revit.DB.Structure namespace so we need to load that in our python script.

We can find a description of each parameter at the bottom of the page:

public static LineLoad Create( Document aDoc, XYZ startPoint, XYZ endPoint, XYZ forceVector, XYZ momentVector, LineLoadType symbol, SketchPlane plane ) 

We already have the Document so we can get the start and end point of our LineLoad. Let’s assume that we want them to be the same as the wall location curve. We can use RevitLookup to find a method that gives us the start and end points:

or we can use the dir() method inside the python script. This will show us that there is a method called GetEndPoint that we can use:

This will give us the start and end points:

for w in walls: locCrvs = w.Location.Curve stPt = locCrvs.GetEndPoint(0) endPt = locCrvs.GetEndPoint(1) 

forceVector and momentVector are just points. We can create them using XYZ()

LineLoadType and Sketchplane can be set to null (None in python) to use the default values. Because we are modifying the Revit project we need to create a transaction. We can use the Dynamo Transaction framework:

TransactionManager.Instance.EnsureInTransaction(doc) for w in walls: . TransactionManager.Instance.TransactionTaskDone() 

or the Revit API one, which allows us to give a name to the transaction (which will be shown in the undo list):

transaction = Transaction(doc) transaction.Start("Create Line Loads") for w in walls: . transaction.Commit() 

Last thing, the LineLoad Class is part of the Autodesk.Revit.DB.Structure namespace (shown at the top of the revitapidocs page). Therefore we need to add that to our script:

clr.AddReference("RevitAPI") from Autodesk.Revit.DB import * from Autodesk.Revit.DB.Structure import LineLoad 

The completed script will be:

import clr clr.AddReference("ProtoGeometry") from Autodesk.DesignScript.Geometry import * # Import RevitAPI clr.AddReference("RevitAPI") from Autodesk.Revit.DB import * from Autodesk.Revit.DB.Structure import LineLoad clr.AddReference("RevitAPIUI") from Autodesk.Revit.UI import TaskDialog # Import DocumentManager and TransactionManager clr.AddReference("RevitServices") from RevitServices.Persistence import DocumentManager from RevitServices.Transactions import TransactionManager # Import ToProtoType, ToRevitType geometry conversion extension methods clr.AddReference("RevitNodes") import Revit clr.ImportExtensions(Revit.GeometryConversion) doc = DocumentManager.Instance.CurrentDBDocument uiapp = DocumentManager.Instance.CurrentUIApplication app = uiapp.Application walls = FilteredElementCollector(doc).OfClass(Wall).ToElements() locCrvs = [] #Create an empty list to store the curves lLoad = [] transaction = Transaction(doc) transaction.Start("Create Line Loads") #TransactionManager.Instance.EnsureInTransaction(doc,"Create Line Loads") for w in walls: locCrvs = w.Location.Curve stPt = locCrvs.GetEndPoint(0) endPt = locCrvs.GetEndPoint(1) lLoad.append(LineLoad.Create(doc, stPt, endPt, XYZ(0,0,-10000), XYZ(0,5000,0), None, None)) #TransactionManager.Instance.TransactionTaskDone() transaction.Commit() #Assign your output to the OUT variable. OUT = lLoad 

Источник

Оцените статью