Сообщество программистов 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 надо вставлять.