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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

  • Administrator
  • *****
  • Сообщений: 613
  • Карма: 210
  • 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
  • ***
  • Сообщений: 127
  • Карма: 5
  • 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
  • *****
  • Сообщений: 613
  • Карма: 210
  • Skype: alexandr.ignatovich.itc
используя данное предложение я могу получить обе точки пересечения трубы и стены.

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


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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

  • Administrator
  • *****
  • Сообщений: 613
  • Карма: 210
  • 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
  • ***
  • Сообщений: 127
  • Карма: 5
  • Skype: begiz_i
ну так я и хотел приемоугольное для начала :)
я эту арку строил чтобы размеры подобратьм которыэ в фукцию передаются.

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