RevitAPI.Соединение геометрии элементов
![]()
Частая проблема при создании больших моделей –это быстрое соединение геометрии.
Например, соединить все стены отделки с несущими стенами для вставки окон или отверстий. В пределах 30-этажного здания это простая операция может занять много времени.
Решить эту задачу можно с помощью Dynamo или C#. Рассмотрим пример кода на C#.
Первое, нам нужно отсеять стены с уже соединенной геометрией. Делаем это методом:
AreElementsJoined(Document document, Element firstElement, Element secondElement)
Второе, это непосредственно соединить геометрию.Делаем это методом:
JoinGeometry(Document document, Element firstElement, Element secondElement)
Рассмотрим пример:
Соединим стену отделки и несущие стены:
IListallWals = GetWalls(doc);
ListsortedWalls = SortedWalls(allWals);
using(Transaction tr = new Transaction(doc, "Join walls"))
{
try
{
tr.Start();
foreach(Wall w in allWals)
{
BoundingBoxXYZ = w.get_BoundingBox(null);
if(wBB != null) foreach(Wall f in sortedWalls)
{
BoundingBoxXYZ fBB = f.get_BoundingBox(null);
if(fBB != null) if(bbIntersect(wBB , fBB))
{
if(!JoinGeometryUtils.AreElementsJoined(doc,w,f))
{
try
{
JoinGeometryUtils.JoinGeometry(doc , w , f)
}
catch(Autodesk.Revit.Exceptions.ArgumentException a)
{
Debug.Print("Ошибка"+a.ToString());
}
}
}
}
}
tr.Commit();
}
catch(Autodesk.Revit.Exceptions.ArgumentException a)
{
Debug.Print("Ошибка"+a.ToString());
}
А теперь разберем сам код:
Получаем и сортируем стены. Эти методы занимают большой объем кода. В данном примере мы их не рассматриваем.
IList allWals = GetWalls(doc);
List sortedWalls = SortedWalls(allWals);
Далее запускаем транзакции. Без нее код не сработает.
using(Transaction tr = new Transaction(doc, "Join walls"))
Получаем границы стен:
BoundingBoxXYZ = w.get_BoundingBox(null);
И проверяем их на пересечение:
if(fBB != null) if(bbIntersect(wBB , fBB))
И соединяем геометрию:
if(!JoinGeometryUtils.AreElementsJoined(doc,w,f))
{
try
{
JoinGeometryUtils.JoinGeometry(doc , w , f)
}
catch(Autodesk.Revit.Exceptions.ArgumentException a)
{
Debug.Print("Ошибка"+a.ToString());
}
}