Накопление результата вычитания геометрии

Автор Тема: Накопление результата вычитания геометрии  (Прочитано 2376 раз)

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

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
вычитание геометрии можно осуществить для двух элементов через
http://www.revitapidocs.com/2018/89cb7975-cc76-65ba-b996-bcb78d12161a.htm

есть исходный элемент
Код - C# [Выбрать]
  1. Solid first_geometry ;
и список элементов
Код - C# [Выбрать]
  1. List<Solid> lst_solids = new List<Solid>();
  2. lst_solids.Add(solid_1);
  3. lst_solids.Add(solid_2);
  4. lst_solids.Add(solid_3);
  5.  

Вопрос:

Как осуществить вычитание из исходного элемента список элементов (накопление результата вычитания)?

Код - C# [Выбрать]
  1. Solid result = BooleanOperationsUtils.ExecuteBooleanOperation(first_geometry , lst_solids, BooleanOperationsType.Difference);
???

Отмечено как Решение Александр Ривилис 29-10-2018, 01:25:58

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Что-то типа того. Писал "на коленке"
Код - C# [Выбрать]
  1. List<Solid> lst_solids = new List<Solid>();
  2. lst_solids.Add(solid_1);
  3. lst_solids.Add(solid_2);
  4. lst_solids.Add(solid_3);
  5.  
  6. Solid result = null;
  7. for (int i = 1; i < lst_solids.Count; i++)
  8. {
  9.     if (result == null)
  10.         result = BooleanOperationsUtils.ExecuteBooleanOperation(lst_solids[i - 1], lst_solids[i], BooleanOperationsType.Difference);
  11.     else
  12.         result = BooleanOperationsUtils.ExecuteBooleanOperation(result, lst_solids[i], BooleanOperationsType.Difference);
  13. }

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
что-то не выходит
Код - C# [Выбрать]
  1. MessageBox.Show( result.SurfaceArea.ToString());
дает ноль

мне нужно от first_geometry  отнимать элементы списка lst_solids

Пошагово так:
s1 = first_geometry - solid_1
s2 = s1 - solid_2
s3 = s2 - solid_3

result =s_3

Проблема в том, что количество солидов в lst_solids заранее неизвестно , нужно что то универсальное



Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Проблема в том, что количество солидов в lst_solids заранее неизвестно , нужно что то универсальное
Ну и что? Из исходного по очереди вычитаешь все элементы из списка. Не понимаю в чем проблема.
Код - C# [Выбрать]
  1.     List<Solid> lst_solids = new List<Solid>();
  2.     lst_solids.Add(solid_1);
  3.     lst_solids.Add(solid_2);
  4.     lst_solids.Add(solid_3);
  5.      
  6.     Solid result = first_geometry;
  7.     for (int i = 0; i < lst_solids.Count; i++)
  8.     {
  9.           result = BooleanOperationsUtils.ExecuteBooleanOperation(result, lst_solids[i], BooleanOperationsType.Difference);
  10.     }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
 Александр Ривилис, Спасибо)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Александр Ривилис, Спасибо)
Это не мне спасибо, а Александру Пекшеву aka Modis. Я просто чуть-чуть подправил его код "в связи с вновь открывшимися обстоятельствами". Можно было бы использовать и его код, если бы в список сначала добавить first_geometry, а затем уже solid_1, solid_2, solid_3...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Александр Ривилис
да, вы правы.
Рабочий ответ был ранее от  Александр Пекшев aka Modis