Статьи

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());
   }
}