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

ADN Club => Revit API => Тема начата: begiz от 15-09-2019, 18:36:41

Название: Wall Duct пересечение и добавление Opening
Отправлено: begiz от 15-09-2019, 18:36:41
Доброго временни суток,
Есть на первый вгляд примитивная задача.
в месте пересечения трубы со стеной, в стене сделать отверстие.

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

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

но програма говорит что объекты не пересекаются.
как так то?
Название: Re: Wall Duct пересечение и добавление Opening
Отправлено: Александр Ривилис от 16-09-2019, 13:51:42
begiz,
Придётся подождать до четверга, пока Александр Игнатович сможет помочь, если никто до того времени не поможет. В идеале нужен файл со стеной, в которой пытаешься сделать отверстие.
Название: Re: Wall Duct пересечение и добавление Opening
Отправлено: begiz от 16-09-2019, 14:02:50
фаилик прицепил.

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

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

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

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

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

Название: Re: Wall Duct пересечение и добавление Opening
Отправлено: Александр Игнатович от 20-09-2019, 10:50:26
Про поиск пересечений гляньте, недавно тут тема была https://adn-cis.org/forum/index.php?topic=2872.msg38679#msg38679

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

Но, вообще говоря, рекомендую пересмотреть алгоритм в пользу ReferenceIntersector-а, как в той теме. BooleanOperationsUtils.ExecuteBooleanOperation может выкидывать исключения в ряде случаев и, если оборачивать в try-catch, то сильно на производительность влияет.
Название: Re: Wall Duct пересечение и добавление Opening
Отправлено: begiz от 20-09-2019, 11:54:13
Цитировать
Про поиск пересечений гляньте, недавно тут тема была 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, то сильно на производительность влияет.
да, я этот вариант тоже рассматриваю
Название: Re: Wall Duct пересечение и добавление Opening
Отправлено: Александр Игнатович от 20-09-2019, 12:17:11
используя данное предложение я могу получить обе точки пересечения трубы и стены.

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


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

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

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

Origin поверхности solid-а лежит на поверхности стены. Нормаль поверхности solid-а совпадает с нормалью поверхности стены
Название: Re: Wall Duct пересечение и добавление Opening
Отправлено: begiz от 20-09-2019, 13:42:50
Цитировать
Зачем обе? Одного пересечения будет достаточно.

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

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

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

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

Название: Re: Wall Duct пересечение и добавление Opening
Отправлено: begiz от 20-09-2019, 14:48:22
Цитировать
можно просто 2 точки от центра под углом 45 и 225 градусов на расстоянии радиуса вычислить?

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

прямоугольное отверстие получилось!!!
Название: Re: Wall Duct пересечение и добавление Opening
Отправлено: Александр Игнатович от 20-09-2019, 16:39:06
Ну, как бы описание метода предполагает:
Код - 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, наверное. Тут лучше, конечно, спросить инженеров, как они проемы делают, но, вероятнее всего у них есть своё семейство окон или дверей для создания круглых проемов.
Название: Re: Wall Duct пересечение и добавление Opening
Отправлено: begiz от 21-09-2019, 12:28:40
ну так я и хотел приемоугольное для начала :)
я эту арку строил чтобы размеры подобратьм которыэ в фукцию передаются.

Да, так в прицепленном фаиле есть семейство для круглых отверстий, но его через NewFamilyInstance надо вставлять.
Название: Re: Wall Duct пересечение и добавление Opening
Отправлено: Yusuf от 05-02-2024, 15:38:43
прямоугольное отверстие получилось!!
Если можно подниму тему, у меня такой же вопрос стоит. Мне надо поставить семейство, но как вы тут упомянули не правильно вставляется если труба не под прямым углом или стена не под 90 градусов, тогда получается надо брать 2 точки пересечения. Но что дальше делать голова ломается.
Думал так:
1. Находим 2 точки, получается надо спроецировать диаметр трубы на эти точки.
2. Найти крайние отрезки с двух сторон это будет ширина семейства.
3. Найти середины между 2 проекциями и вставить семейство.
А проекции как получать, Вы как реализовывали если не секрет?