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

27/09/2015

О геометрии в Revit и грани цилиндров

Вопрос: При обходе по граням, представляющим границы цилиндра, я обнаружил, что цилиндр имеет 2 плоских грани (верх и низ цилиндра) и две цилиндрических грани (два полуцилиндра). Я проверил еще несколько различных закругленных поверхностей в Revit и заметил, что все они поделены на 2 или 4 полу- или четверть-цилиндра. Почему так?

Я просмотрел на граничные представления объектов в других САПР программ, например, в Inventor и AutoCAD, и там подобные типы твердотельных объектов имеют одну единственную цилиндрическую поверхность.

Есть ли способ с помощью Revit API создать полностью цилиндрическую грань? Если нет, может быть возможно каким-либо образом объединить две полуцилиндрических грани в одну?

Ответ: Да, простые геометрические дуги можно использовать для демонстрации похожего поведения, т.е. для построения полного круга нужно две дуги в 180 градусов.

Я уверен, что двумерной дугой действительно можно создать полный круг.

Однако, в случае с трехмерными твердотельными объектами, нужно разделять цилиндр на две части.

Мне не известны какие-либо способы изменить это поведение.

Revit API имеет очень ограниченный набор методов для работы с геометрией.  Все что есть – это лишь получить свойства геометрии, в том виде, как они есть в базе данных Revit.

Пожалуйста, забудьте о каком-либо сравнении Revit и САПР-системах. Revit используют совершенно другие подходы, где должны и поддерживаются параметрические данные BIM.

Дополнение: John Mitchel из команды разработчиков Revit дополнил мой первоначальный короткий и бесполезный ответ следующим:

При проектировании ядра работы с геометрией Revit необходимо было сделать выбор между удобством и дальнейшим обслуживанием. Разрешать создавать замкнутые или периодические грани, например, такие, как цилиндрические, было одним из таких выборов.

В Revit используются параметрические кривые и поверхности, для представления ребер и граней соответственно. Например, сферическая поверхность преимущественно использует широту и долготу в качестве координат. Предположим, мы разрешили полностью сферическую грань, которая строится вокруг оси между севером и югом и встречает саму себя в Гринвичском меридиане, и, предположим, нам нужно определить долготу находясь на Гринвичском меридиане. Ответ будет неоднозначным – 0 градусов, или 360 градусов, или -360 или еще что-то? Даже если мы ограничим долготу интервалом от 0 до 360, то все равно ответ неоднозначный – 0 или 360?

С другой стороны, если мы запрещаем закрытые грани и ребра, мы можем представить сферу в виде двух полусфер. Одна из которых имеет долготу от 0 до 180 и другая 0 от 180 до 360 градусов (что сейчас фактически Revit и делает). Для любой из граней, если нам нужно определить широту и долготу 3D-точки, то не будет никакой двусмысленности. Например, если точка лежит на Гринвичском меридиане, то для первой грани долгота будет равняться 0, а для другой – 360 градусов. Факт в том, что две грани используют различные координаты, и поэтому координаты граней не смешиваются.

На самом деле, вы могли заметить, что, если даже мы используем две полусферы для отображения сферы, все еще есть неопределенность между северным и южным полюсами, так как долгота там не определена. Это, однако, уже другая проблема – проблема сингулярности.

Вы также могли заметить, что может быть неоднозначность в широте. Это проблема обычно решается путем установки ограничения интервала от -90 до 90 градусов.

Этот выбор по запрещению создания замкнутых граней в ядре геометрии Revit был сделано довольно давно и имеет свои преимущества и недостатки, точно так же, как и противоположный вариант. В действительности практически не осуществимо значительно поменять ядро геометрии, так как это затронет целиком всю систему.

В принципе, в теории возможно создать интерфейс, для преобразования публичного вида отображения, где замкнутые грани разрешены и внутренним представлением, где они запрещены. Но Revit API это не позволяет. В природе существует внутренний код, который это делает, разрешая пользователям создавать замкнутые кривые в некоторых ситуациях. Но это довольно сложная задача в целом. Тем более в пользовательском интерфейсе это отображается лишь частично. Например, стык между полусферами не отображается.

Я уверен, это объяснение более полезное, чем мое, хотя смысл примерно один и тот жеJ

Источник: http://thebuildingcoder.typepad.com/blog/2015/08/revit-geometry-kernel-cylinder-faces.html

Автор перевода: Виктор Чекалин

Обсуждение: http://adn-cis.org/forum/index.php?topic=3054

Опубликовано 27.09.2015