Площадь стены с проемом в помещении

Автор Тема: Площадь стены с проемом в помещении  (Прочитано 15428 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Антон ОстанинАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 6
Еще интересный момент, когда один проем в стене на два помещения. Как определить какую часть от проема нужно вычесть из площади стены для конкретного помещения?

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Площадь стены с проемом в помещении
« Ответ #1 : 03-12-2015, 18:10:17 »
Антон Останин, subface.GetSubface() как раз таки в этом случае должен вести себя как надо

Оффлайн Антон ОстанинАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 6
Александр Игнатович, 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.  

Но когда один проем на несколько помещений этот алгоритм не подходит.

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Антон, я не увидел связи между кодом и subface.GetSubface()
Вы демонстрируете значение параметра HOST_AREA_COMPUTED. Это совсем не тоже самое что и subface.GetSubface()

Оффлайн Антон ОстанинАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 6
Виктор, double openingArea = wallAreaGross - wallAreaNet - площадь проема на стене.
А  subface.GetSubface().Area -  openingArea и будет площадь поверхности стены с учетом проема.

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
subface.GetSubface().Area -  openingArea и будет площадь поверхности стены с учетом проема.
не должно такого быть. subface.GetSubface() уже должен возвращать корректную площадь с учетом проема.

Оффлайн Антон ОстанинАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 6
Виктор, я проверил. subface.GetSubface().Area возвращает одно и то же значение, с проемом стена или без.

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Антон, создал тестовый проект. У меня все как положено посчиталось. Сейчас напишу подробней.

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Создал тестовый проект. 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.                 }
Выбрал левое помещение, выполнил макрос. Затем удалил проем и выполнил его еще раз. Площадь изменилась.
Проект с макросом во вложении.

Оффлайн Антон ОстанинАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 6
Спасибо за отличный пример.
Но я у себя проверил ваш код, даже разместив проем в отдельном помещении. Все равно выдает площадь без проема.

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Площадь стены с проемом в помещении
« Ответ #10 : 07-12-2015, 11:01:05 »
Спасибо за отличный пример.
Но я у себя проверил ваш код
Т.е. даже запуская мой пример без изменений, в обоих вариантах выводится одна и та же площадь? o_O

Оффлайн Антон ОстанинАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 6
Re: Площадь стены с проемом в помещении
« Ответ #11 : 07-12-2015, 11:02:06 »
Виктор, именно так.

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Площадь стены с проемом в помещении
« Ответ #12 : 07-12-2015, 11:12:35 »
Антон, а можно видео? ;) На на всякий случай, у меня Revit 2015 Build 20140606_1530(x64)

Оффлайн Антон ОстанинАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 6
Re: Площадь стены с проемом в помещении
« Ответ #13 : 07-12-2015, 12:02:25 »
Виктор, хорошо, сделаю.

Оффлайн Антон ОстанинАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 6
Re: Площадь стены с проемом в помещении
« Ответ #14 : 07-12-2015, 12:28:08 »
Видео с примером

[вложение удалено администратором]