ADN Open CIS
Сообщество программистов Autodesk в СНГ

02/12/2016

Как определить избыточное помещение

Вопрос: Использую терминологию спецификации помещений, мне нужно определить все неразмещенные, избыточные и не окружённые помещения.

 

Я не могу полагаться на какую-либо конкретную спецификацию в модели.

Пока что я обнаружил следующее:

  • Во всех 3 случаях, площадь помещения равна 0
  • Свойство Locationу Неразмещенных помещений равно null

Остается понять, как определить различие между избыточными и не окруженными помещениями.

Есть ли идеи, как это можно сделать, используя свойства и параметры помещения?

Кстати, на сколько мне известно, есть альтернативный подход, используя Failure API. В перечислениях я вижу значение BuiltInFailures.RoomFailures.RoomNotEnclosed.

После прочтения документации и примеров, я думаю, что его возможно использовать, чтобы точно определить, является ли помещение избыточным или не окруженным.

Пока что мне удалость следующее:

Код - C#: [Выделить]
  1.   /// <summary>
  2.   /// Определение не размещенных, избыточных и не окруженных помещений
  3.   /// </summary>
  4.   void DistinguishRooms(
  5.     Document doc,
  6.     ref StringBuilder sb,
  7.     ref int numErr,
  8.     ref int numWarn )
  9.   {
  10.     sb = new StringBuilder();
  11.  
  12.     FilteredElementCollector rooms
  13.       = new FilteredElementCollector( doc );
  14.  
  15.     rooms.WherePasses( new RoomFilter() );
  16.  
  17.     foreach( Room r in rooms )
  18.     {
  19.       sb.AppendFormat( "\r\n  Помещение {0}:'{1}': ",
  20.         r.Id.ToString(), r.Name );
  21.  
  22.       if( r.Area > 0 ) // Если есть площадь, то все хорошо
  23.       {
  24.         sb.AppendFormat( "OK (A={0}[ft3])", r.Area );
  25.       }
  26.       else if( null == r.Location ) // Не размещено, если свойство равно null
  27.       {
  28.         sb.AppendFormat( "Не размещено (Location is null)" );
  29.       }
  30.       else
  31.       {
  32.         sb.AppendFormat( "Не окружено или избыточно "
  33.           + "- вот в чем вопрос" );
  34.       }
  35.     }
  36.   }

Ответ: Избыточные помещения все еще имею границы. Так что можно вызвать метод Room.GetBoundarySegments и протестировать. Список должен быть пустым для не размещенных и для не окруженных помещений.

Ответ: Спасибо!

Вот окончательная реализация:

Код - C#: [Выделить]
  1.   public enum RoomState
  2.   {
  3.     Unknown,
  4.     Placed,
  5.     NotPlaced,
  6.     NotEnclosed,
  7.     Redundant
  8.   }
  9.  
  10.   /// <summary>
  11.   /// Определение не размещенных, избыточных и не окруженных помещений
  12.   /// </summary>
  13.   RoomState DistinguishRoom( Room room )
  14.   {
  15.     RoomState res = RoomState.Unknown;
  16.  
  17.     if( room.Area > 0 )
  18.     {
  19.       // Если есть площадь, то помещение нормальное
  20.  
  21.       res = RoomState.Placed;
  22.     }
  23.     else if( null == room.Location )
  24.     {
  25.       //Нет площади и расположения – не размещено
  26.  
  27.       res = RoomState.NotPlaced;
  28.     }
  29.     else
  30.     {
  31.       // Если сюда попали, то либо избыточное, либо не окружено
  32.  
  33.       SpatialElementBoundaryOptions opt
  34.         = new SpatialElementBoundaryOptions();
  35.  
  36.       IList<IList<BoundarySegment>> segs
  37.         = room.GetBoundarySegments( opt );
  38.  
  39.       res = ( null == segs || segs.Count == 0 )
  40.         ? RoomState.NotEnclosed
  41.         : RoomState.Redundant;
  42.     }
  43.     return res;
  44.   }

Дополнение Джереми: Я добавил код в примеры The Building Coder в модуль CmdListAllRooms.cs. Перед публикацией, я немного подчистил код  в соответствии с рекомендациями производительности и обработки исключений.

Источник: http://thebuildingcoder.typepad.com/blog/2016/04/how-to-distinguish-redundant-rooms.html

Автор перевода: Виктор Чекалин

Обсуждение: http://adn-cis.org/forum/index.php?topic=

Опубликовано 02.12.2016