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

ADN Club => Revit API => Тема начата: Антон Останин от 03-12-2015, 17:47:40

Название: Площадь стены с проемом в помещении
Отправлено: Антон Останин от 03-12-2015, 17:47:40
Еще интересный момент, когда один проем в стене на два помещения. Как определить какую часть от проема нужно вычесть из площади стены для конкретного помещения?
Название: Площадь стены с проемом в помещении
Отправлено: Александр Игнатович от 03-12-2015, 18:10:17
Антон Останин, subface.GetSubface() как раз таки в этом случае должен вести себя как надо
Название: Re: Площадь стены с проемом в помещении
Отправлено: Антон Останин от 04-12-2015, 15:03:22
Александр Игнатович, subface.GetSubface() возвращает площадь без вычета проема. Для этого я использовал:
 
Код - C# [Выбрать]
  1.                 Transaction t = new Transaction(doc);
  2.                 double wallAreaNet = wall.get_Parameter(BuiltInParameter.HOST_AREA_COMPUTED).AsDouble();
  3.                 t.Start("Delete opening");
  4.                 doc.Delete(openingElement);
  5.                 doc.Regenerate();
  6.                 double wallAreaGross = wall.get_Parameter(BuiltInParameter.HOST_AREA_COMPUTED).AsDouble();
  7.                 t.RollBack();
  8.                 double openingArea = wallAreaGross - wallAreaNet;
  9.  

Но когда один проем на несколько помещений этот алгоритм не подходит.
Название: Re: Площадь стены с проемом в помещении
Отправлено: Виктор Чекалин от 04-12-2015, 15:36:27
Антон, я не увидел связи между кодом и subface.GetSubface()
Вы демонстрируете значение параметра HOST_AREA_COMPUTED. Это совсем не тоже самое что и subface.GetSubface()
Название: Re: Площадь стены с проемом в помещении
Отправлено: Антон Останин от 04-12-2015, 15:39:08
Виктор, double openingArea = wallAreaGross - wallAreaNet - площадь проема на стене.
А  subface.GetSubface().Area -  openingArea и будет площадь поверхности стены с учетом проема.
Название: Re: Площадь стены с проемом в помещении
Отправлено: Виктор Чекалин от 04-12-2015, 15:40:47
subface.GetSubface().Area -  openingArea и будет площадь поверхности стены с учетом проема.
не должно такого быть. subface.GetSubface() уже должен возвращать корректную площадь с учетом проема.
Название: Re: Площадь стены с проемом в помещении
Отправлено: Антон Останин от 04-12-2015, 15:42:05
Виктор, я проверил. subface.GetSubface().Area возвращает одно и то же значение, с проемом стена или без.
Название: Re: Площадь стены с проемом в помещении
Отправлено: Виктор Чекалин от 04-12-2015, 15:55:43
Антон, создал тестовый проект. У меня все как положено посчиталось. Сейчас напишу подробней.
Название: Re: Площадь стены с проемом в помещении
Отправлено: Виктор Чекалин от 04-12-2015, 16:06:03
Создал тестовый проект. 5 стен, два помещения. На одной из стен сделал проем, который затрагивает 2 помещения.
Написал такой вот макрос. Как только нашли нашу стенку в выбранном помещении, отображаем сообщение с площадью.
Код - C# [Выбрать]
  1.                 public void CalcSubArea()
  2.                 {
  3.                         var doc = Document;
  4.                        
  5.                         var selectedRooms = Selection
  6.                                                 .GetElementIds()
  7.                                                 .OfType<ElementId>()
  8.                                                 .Select(x=>doc.GetElement(x))
  9.                                                 .OfType<Room>()
  10.                                                 .ToList();
  11.                                        
  12.                                                
  13.                         List<Room> rooms;
  14.                                        
  15.                         if (selectedRooms.Count ==0)
  16.                         {
  17.                        
  18.                                 rooms = new FilteredElementCollector(doc)
  19.                                 .WherePasses(new RoomFilter())
  20.                                         .OfType<Room>()
  21.                                 .ToList();
  22.                         }
  23.                         else
  24.                         {
  25.                                 rooms = selectedRooms;
  26.                         }
  27.                        
  28.                         using (var t = new Transaction(doc, "Create Room Solids"))
  29.                         {
  30.                                 t.Start();
  31.                                
  32.                                 SpatialElementGeometryCalculator calculator = new SpatialElementGeometryCalculator(doc);
  33.                                
  34.                                 foreach (Room room in rooms)
  35.                                 {
  36.                                         SpatialElementGeometryResults results ;
  37.                                        
  38.                                         results = calculator.CalculateSpatialElementGeometry(room);
  39.                                        
  40.                                        
  41.                                         var roomSolid = results.GetGeometry();
  42.                                        
  43.                                         foreach (Face face in roomSolid.Faces)
  44.                                         {
  45.                                                 var subfaces = results.GetBoundaryFaceInfo(face);
  46.                                                
  47.                                                 foreach (var subface in subfaces)
  48.                                                 {
  49.                                                         var elementId = subface.SpatialBoundaryElement.HostElementId;
  50.                                                        
  51.                                                         //wall with opening
  52.                                                         if (elementId.IntegerValue == 304732)
  53.                                                         {
  54.                                                                 TaskDialog.Show("Area", subface.GetSubface().Area.ToString());
  55.                                                         }
  56.                                                 }
  57.                                         }
  58.                                 }
  59.                                
  60.                                 t.Commit();
  61.                         }
  62.                 }
Выбрал левое помещение, выполнил макрос. Затем удалил проем и выполнил его еще раз. Площадь изменилась.
Проект с макросом во вложении.
Название: Re: Площадь стены с проемом в помещении
Отправлено: Антон Останин от 04-12-2015, 18:27:13
Спасибо за отличный пример.
Но я у себя проверил ваш код, даже разместив проем в отдельном помещении. Все равно выдает площадь без проема.
Название: Re: Площадь стены с проемом в помещении
Отправлено: Виктор Чекалин от 07-12-2015, 11:01:05
Спасибо за отличный пример.
Но я у себя проверил ваш код
Т.е. даже запуская мой пример без изменений, в обоих вариантах выводится одна и та же площадь? o_O
Название: Re: Площадь стены с проемом в помещении
Отправлено: Антон Останин от 07-12-2015, 11:02:06
Виктор, именно так.
Название: Re: Площадь стены с проемом в помещении
Отправлено: Виктор Чекалин от 07-12-2015, 11:12:35
Антон, а можно видео? ;) На на всякий случай, у меня Revit 2015 Build 20140606_1530(x64)
Название: Re: Площадь стены с проемом в помещении
Отправлено: Антон Останин от 07-12-2015, 12:02:25
Виктор, хорошо, сделаю.
Название: Re: Площадь стены с проемом в помещении
Отправлено: Антон Останин от 07-12-2015, 12:28:08
Видео с примером

[вложение удалено администратором]
Название: Re: Площадь стены с проемом в помещении
Отправлено: Антон Останин от 08-12-2015, 10:20:59
http://adn-cis.org/vyichislenie-brutto-i-netto-ploshhadej-pverxnosti-sten.html
Виктор, насколько я понял, по выше указанной ссылке обсуждали точно такую же проблему. Проем для одного помещения решили вычитанием.
Вывод: там тоже subface.GetSubface().Area возвращает поверхность без учета проема.
Название: Re: Площадь стены с проемом в помещении
Отправлено: Виктор Чекалин от 09-12-2015, 10:06:26
Антон, да, действительно. Тоже нашел вчера эту статью. В дополнение к ней, есть еще  одна (http://adn-cis.org/uluchshenie-algoritma-po-vyichisleniyu-obshhej-i-poleznoj-ploshhadi-sten.html).

Кстати я понял почему у вас на видео результат не такой как у меня. Дело в том, что я для теста использовал объект Opening - Проем. И с ним результат тот, который нужно. Но вот почему для окон/дверей поведение GetSubface().Area другое - непонятно.
Название: Re: Площадь стены с проемом в помещении
Отправлено: Антон Останин от 09-12-2015, 15:08:39
Виктор, а балку можно как-то посчитать в помещении?
Принцип такой же, нужна только плоскость пересечения.
Не могу вообще найти  балку в помещении. Она не отображается в BoundarySegment и BoundingBoxIntersectsFilter, чтобы ее хоть как-то отнести к нужному помещению.
Название: Re: Площадь стены с проемом в помещении
Отправлено: Виктор Чекалин от 11-12-2015, 13:38:37
Она не отображается в BoundarySegment
Балка скорей всего не является границей помещения, поэтому и не видно ее.
Метод расчета площади и объема помещений какой выставлен?
Название: Re: Площадь стены с проемом в помещении
Отправлено: Антон Останин от 11-12-2015, 14:12:43
Вот так установлено
Название: Re: Площадь стены с проемом в помещении
Отправлено: Антон Останин от 14-12-2015, 10:24:51
Такие типы проемов решил обойти вставкой временных стен. На место проема вставляю стену, которая прекрасно считается и потом удаляю.
Название: Re: Площадь стены с проемом в помещении
Отправлено: Антон Останин от 28-01-2016, 11:58:32
Виктор, здравствуйте!

По поводу этой темы: "...Кстати я понял почему у вас на видео результат не такой как у меня. Дело в том, что я для теста использовал объект Opening - Проем. И с ним результат тот, который нужно. Но вот почему для окон/дверей поведение GetSubface().Area другое - непонятно."

Есть ли какое-то решение получить GetSubface() стены, который пересекается с помещением, включая дверь или окно?



Название: Re: Площадь стены с проемом в помещении
Отправлено: Виктор Чекалин от 03-02-2016, 13:23:10
Есть ли какое-то решение получить GetSubface() стены, который пересекается с помещением, включая дверь или окно?
Антон, прошу прощения за поздний ответ.
Так ведь GetSubface() как раз и возвращает часть стены, включая дверные проем и окна. Или что то другое имелось ввиду?
Название: Re: Площадь стены с проемом в помещении
Отправлено: Антон Останин от 03-02-2016, 13:25:09
Виктор, в данном случае GetSubface() возвращает часть стены, но без учета проема в виде двери или окна...
Название: Re: Площадь стены с проемом в помещении
Отправлено: Виктор Чекалин от 03-02-2016, 13:30:59
Подождите. Так ведь когда я проверял, у меня получилось, что если вставлен объект Opening, то он не учитывается (по крайней мере по площади). Если вставлена дверь или окно, то площадь Subface не меняется и остается такой же, что с дверью, что без нее.
Название: Re: Площадь стены с проемом в помещении
Отправлено: Антон Останин от 03-02-2016, 13:33:00
Виктор, то есть так и должно быть: По факту площадь стены с дверью должна совпадать с площадью этой же стены, но уже без двери?
Название: Re: Площадь стены с проемом в помещении
Отправлено: Виктор Чекалин от 08-02-2016, 11:32:56
то есть так и должно быть
Антон, я считаю что так не должно быть. Но Revit API возвращает площадь стены не взирая на то, что там есть окна или двери. Решение есть в статьях, ссылки на которые я давал ранее.
Название: Re: Площадь стены с проемом в помещении
Отправлено: Антон Останин от 08-02-2016, 11:35:31
Виктор, в статьях нет решения, в случае, когда проем стены, граничит с двумя помещениями - способ с вычитанием площади проема не подходит сюда...
Название: Re: Площадь стены с проемом в помещении
Отправлено: Виктор Чекалин от 08-02-2016, 12:06:15
Антон, а в реальности это что за проем, который с двумя помещениями граничит?
Название: Re: Площадь стены с проемом в помещении
Отправлено: Антон Останин от 08-02-2016, 12:11:54
Виктор, в реальности -  это дверь в квартире-студии. Дверь граничит с кухней и комнатой.