Wall Duct пересечение и добавление Opening

Автор Тема: Wall Duct пересечение и добавление Opening  (Прочитано 8081 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Доброго временни суток,
Есть на первый вгляд примитивная задача.
в месте пересечения трубы со стеной, в стене сделать отверстие.

Пересечения нашел без проблем.
Пытаюсь для начала вставить прямоугольное отверстие:
doc.Create.NewOpening(wall, interBox.Min, interBox.Max);

interBox - это BoundingBoxXYZ из результата:
BooleanOperationsUtils.ExecuteBooleanOperation(solid, wallSolid, BooleanOperationsType.Intersect)

но програма говорит что объекты не пересекаются.
как так то?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
begiz,
Придётся подождать до четверга, пока Александр Игнатович сможет помочь, если никто до того времени не поможет. В идеале нужен файл со стеной, в которой пытаешься сделать отверстие.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
фаилик прицепил.

https://yadi.sk/d/3zfWjvUEttIMTA

надеюсь меня по голове не по гладят что я его выложил :)

задача в полном объеме звучит так:
найти все пересечения труб и стен, и туда вставить семейство отверстия с круглым сечением.

но я для начала пытаюсь прямоугольное/встроенное отверстие вставить.

чувствую что с координатами беда, разные либо принимаются либо я получаю не те что надо


Отмечено как Решение begiz 21-09-2019, 12:29:00

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Про поиск пересечений гляньте, недавно тут тема была https://adn-cis.org/forum/index.php?topic=2872.msg38679#msg38679

По сути вопроса - для создания проема с помощью метода Document.NewOpening(Wall, XYZ, XYZ) нужно указывать координаты углов прямоугольного проема. Эти координаты должны быть в на поверхности стены, т.е., если Вы пользуйтесь BooleanOperationsUtils.ExecuteBooleanOperation, то нужно взять поверхность получившегося solid-а, являющуюся частью стены.

Но, вообще говоря, рекомендую пересмотреть алгоритм в пользу ReferenceIntersector-а, как в той теме. BooleanOperationsUtils.ExecuteBooleanOperation может выкидывать исключения в ряде случаев и, если оборачивать в try-catch, то сильно на производительность влияет.

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

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Цитировать
Про поиск пересечений гляньте, недавно тут тема была https://adn-cis.org/forum/index.php?topic=2872.msg38679#msg38679
используя данное предложение я могу получить обе точки пересечения трубы и стены.
далее мне нужно будет взять радиуц трубы и построить окружность (при пересечении под приамым углом) с радиусом трубы и центром в точке пересечения и потом повернуть эту окружность(плоскость) чтобы она была параллельна плоскости стены, так?

или даже так, построить окружность взять BoundingBox и уже его повернуть?

Цитировать
По сути вопроса - для создания проема с помощью метода Document.NewOpening(Wall, XYZ, XYZ) нужно указывать координаты углов прямоугольного проема. Эти координаты должны быть в на поверхности стены, т.е., если Вы пользуйтесь BooleanOperationsUtils.ExecuteBooleanOperation, то нужно взять поверхность получившегося solid-а, являющуюся частью стены.
а как получить из солида обшиую со стеной поверхность?
Цитировать
Но, вообще говоря, рекомендую пересмотреть алгоритм в пользу ReferenceIntersector-а, как в той теме. BooleanOperationsUtils.ExecuteBooleanOperation может выкидывать исключения в ряде случаев и, если оборачивать в try-catch, то сильно на производительность влияет.
да, я этот вариант тоже рассматриваю

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
используя данное предложение я могу получить обе точки пересечения трубы и стены.

Зачем обе? Одного пересечения будет достаточно.


далее мне нужно будет взять радиуц трубы и построить окружность (при пересечении под приамым углом) с радиусом трубы и центром в точке пересечения и потом повернуть эту окружность(плоскость) чтобы она была параллельна плоскости стены, так?

Не. Слишком сложно. Всё проще. Получаете поверхность (Face) стены, с которой пересекается труба. Точку пересечения уже нашли. Находим нормаль методом Face.ComputeNormal. Ну, собственно, этого достаточно для того, чтобы построить окружность.

а как получить из солида обшиую со стеной поверхность?

Origin поверхности solid-а лежит на поверхности стены. Нормаль поверхности solid-а совпадает с нормалью поверхности стены

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

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Цитировать
Зачем обе? Одного пересечения будет достаточно.

2 точки нужны на случай если пересечение не под прямым углом.
тады нужно будет дырку делать с учетом смещения.

точки пересечения есть, радиус есть, нормаль есть, окружность построил.
тер как получить BoundingBox окружности?
у солидов есть такой метод, а у 2D фигур?

можно просто 2 точки от центра под углом 45 и 225 градусов на расстоянии радиуса вычислить?

или можно/нужно как то проще делать?


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

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
Цитировать
можно просто 2 точки от центра под углом 45 и 225 градусов на расстоянии радиуса вычислить?

построил арку от 45 до 225 градусов и взял координаты концов

прямоугольное отверстие получилось!!!

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Ну, как бы описание метода предполагает:
Код - C# [Выбрать]
  1. public Opening NewOpening(
  2.         Wall wall,
  3.         XYZ pntStart,
  4.         XYZ pntEnd
  5. )

Цитировать
Creates a rectangular opening on a wall.

Да и в UI кнопка создания проема в стене позволяет только прямоугольные делать, это в перекрытиях и крышах проемы произвольной формы создаются, а в API очень и очень немного функционала, которого нет в UI, процентов так 5, наверное. Тут лучше, конечно, спросить инженеров, как они проемы делают, но, вероятнее всего у них есть своё семейство окон или дверей для создания круглых проемов.

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

  • ADN Club
  • ***
  • Сообщений: 161
  • Карма: 8
  • Skype: begiz_i
ну так я и хотел приемоугольное для начала :)
я эту арку строил чтобы размеры подобратьм которыэ в фукцию передаются.

Да, так в прицепленном фаиле есть семейство для круглых отверстий, но его через NewFamilyInstance надо вставлять.

Оффлайн Yusuf

  • ADN OPEN
  • ***
  • Сообщений: 117
  • Карма: 4
Re: Wall Duct пересечение и добавление Opening
« Ответ #10 : 05-02-2024, 15:38:43 »
прямоугольное отверстие получилось!!
Если можно подниму тему, у меня такой же вопрос стоит. Мне надо поставить семейство, но как вы тут упомянули не правильно вставляется если труба не под прямым углом или стена не под 90 градусов, тогда получается надо брать 2 точки пересечения. Но что дальше делать голова ломается.
Думал так:
1. Находим 2 точки, получается надо спроецировать диаметр трубы на эти точки.
2. Найти крайние отрезки с двух сторон это будет ширина семейства.
3. Найти середины между 2 проекциями и вставить семейство.
А проекции как получать, Вы как реализовывали если не секрет?