Как определить избыточное помещение
Вопрос: Использую терминологию спецификации помещений, мне нужно определить все неразмещенные, избыточные и не окружённые помещения.
Я не могу полагаться на какую-либо конкретную спецификацию в модели.
Пока что я обнаружил следующее:
- Во всех 3 случаях, площадь помещения равна 0
- Свойство Locationу Неразмещенных помещений равно null
Остается понять, как определить различие между избыточными и не окруженными помещениями.
Есть ли идеи, как это можно сделать, используя свойства и параметры помещения?
Кстати, на сколько мне известно, есть альтернативный подход, используя Failure API. В перечислениях я вижу значение BuiltInFailures.RoomFailures.RoomNotEnclosed.
После прочтения документации и примеров, я думаю, что его возможно использовать, чтобы точно определить, является ли помещение избыточным или не окруженным.
Пока что мне удалость следующее:
- /// <summary>
- /// Определение не размещенных, избыточных и не окруженных помещений
- /// </summary>
- void DistinguishRooms(
- Document doc,
- ref StringBuilder sb,
- ref int numErr,
- ref int numWarn )
- {
- sb = new StringBuilder();
- FilteredElementCollector rooms
- = new FilteredElementCollector( doc );
- rooms.WherePasses( new RoomFilter() );
- foreach( Room r in rooms )
- {
- sb.AppendFormat( "\r\n Помещение {0}:'{1}': ",
- r.Id.ToString(), r.Name );
- if( r.Area > 0 ) // Если есть площадь, то все хорошо
- {
- sb.AppendFormat( "OK (A={0}[ft3])", r.Area );
- }
- else if( null == r.Location ) // Не размещено, если свойство равно null
- {
- sb.AppendFormat( "Не размещено (Location is null)" );
- }
- else
- {
- sb.AppendFormat( "Не окружено или избыточно "
- + "- вот в чем вопрос" );
- }
- }
- }
Ответ: Избыточные помещения все еще имею границы. Так что можно вызвать метод Room.GetBoundarySegments и протестировать. Список должен быть пустым для не размещенных и для не окруженных помещений.
Ответ: Спасибо!
Вот окончательная реализация:
- public enum RoomState
- {
- Unknown,
- Placed,
- NotPlaced,
- NotEnclosed,
- Redundant
- }
- /// <summary>
- /// Определение не размещенных, избыточных и не окруженных помещений
- /// </summary>
- RoomState DistinguishRoom( Room room )
- {
- RoomState res = RoomState.Unknown;
- if( room.Area > 0 )
- {
- // Если есть площадь, то помещение нормальное
- res = RoomState.Placed;
- }
- else if( null == room.Location )
- {
- //Нет площади и расположения – не размещено
- res = RoomState.NotPlaced;
- }
- else
- {
- // Если сюда попали, то либо избыточное, либо не окружено
- SpatialElementBoundaryOptions opt
- = new SpatialElementBoundaryOptions();
- IList<IList<BoundarySegment>> segs
- = room.GetBoundarySegments( opt );
- res = ( null == segs || segs.Count == 0 )
- ? RoomState.NotEnclosed
- : RoomState.Redundant;
- }
- return res;
- }
Дополнение Джереми: Я добавил код в примеры 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