Принцип работы флагов изменения топологических объектов
Флаги изменения имеются у всех топологических объектов (MbTopologyItem). Перед выполнением каждой операции они выставляются в состояние tct_Unchanged, что означает отсутствие изменений.
Для топологических объектов существуют следующие флаги изменений:
tct_Unchanged — объект в операции не изменялся;
tct_Modified — при любой модификации объекта устанавливается этот флаг;
tct_Created — объект был создан. В теле не было этого объекта, а затем он был добавлен (например, при создании элементарного тела функцией ElementarySolid);
tct_Transformed — объект был перемещён (например, при применении перемещения к геометрии тела (MbSolid::Move) все объекты тоже переместятся);
tct_Reoriented — грань создана как копия другой грани, у которой сменилось направление нормального вектора на противоположное, то есть грань «вывернулась». Пример: при булевой операции новая грань в исходном теле была создана из копии грани режущего тела, у которой было изменено направление нормали;
tct_Deleted — при удалении дочерних элементов объекта или пометке самого объекта на удаление (например, при удалении цикла рёбер (при его замене в операции) или поверхности грани);
tct_Truncated — объект (грань, ребро) был подрезан в операции;
tct_Merged — флаг актуален для рёбер (MbEdge) — ребро было объединено или сшито;
tct_Replaced — у грани в процессе операции была заменена поверхность или цикл рёбер грани;
tct_Added — добавлен дочерний элемент;
tct_Renamed — объект был переименован в процессе операции.
Рассмотрим применение флагов на примере выполнения операции SolidCutting (см. Рис. 1). Большой куб разрезается маленьким параллелепипедом:
Рис. 1
Рассмотрим нижнюю грань паза в полученном теле (выделена красным цветом).
После операции она имеет следующие флаги:
tct_Modified, tct_Created, tct_Reoriented, tct_Deleted, tct_Truncated, tct_Added
Это означает следующее:
Грань была модифицирована каким-либо образом в выполненной операции (tct_Modified).
Этой грани ранее не было в этом теле и она была создана (tct_Created).
На самом деле грань была создана из грани режущего тела (выделена зелёным цветом), но вектор нормали был развёрнут (tct_Reoriented). Полное имя у неё полностью совпадает с именем грани режущего тела.
Грань была обрезана (tct_Truncated), для чего у неё был удалён (tct_Deleted) и добавлен (tct_Added) цикл рёбер грани.
Далее выполним ещё одно разрезание тем же режущим телом. Перед операцией изменим положение режущего параллелепипеда (Рис. 2).
Рис. 2
Рассмотрим следующую грань в результате данного разрезания (выделена зелёным цветом на Рис. 3):
Рис. 3
После операции новая грань имеет следующие флаги:
tct_Modified, tct_Created, tct_Transformed, tct_Reoriented, tct_Deleted, tct_Truncated, tct_Added, tct_Replaced
Это означает следующее:
Грань была модифицирована каким-либо образом в выполненной операции (tct_Modified).
Этой грани ранее не было в этом теле и она была создана (tct_Created).
На самом деле грань была создана из грани режущего тела (Рис. 2), но вектор нормали был развёрнут (tct_Reoriented). Режущее тело было перемещено перед операцией (tct_Transformed).
Грань была обрезана (tct_Truncated), для чего у неё был удалён (tct_Deleted) и добавлен (tct_Added) цикл рёбер грани.
У грани в процессе операции была заменена поверхность или цикл рёбер грани (tct_Replaced).
В классе MbTopologyItem определены (в файле topology_item.h) следующие методы для чтения/записи флагов:
Метод
bool GetOwnChanged() const
получает флаг, свидетельствующий о том, что объект был (не был) изменён.
Метод
bool GetOwnChanged( MbeChangedType n ) const
получает флаг, свидетельствующий о том, что объект был (не был) изменён.
Метод
void SetOwnChanged( MbeChangedType )
устанавливает флаг, свидетельствующий о том, что объект был (не был) изменён.
Метод
void CopyOwnChanged( const MbTopologyItem & ti )
копирует флаг, свидетельствующий о том, что объект был (не был) изменён.
Метод
uint16 GetOwnChangedFlag() const
получает флаг, свидетельствующий о том, что объект был (не был) изменён.
Метод
template<class Uint> void SetOwnChangedFlag( Uint n )
устанавливает флаг, свидетельствующий о том, что объект был (не был) изменён.
Метод
bool IsOwnRenamedOnly() const
получает флаг, свидетельствующий о том, что объект был только переименован.
Метод
bool IsOwnTransformedOnly() const
получает флаг, свидетельствующий о том, что объект был только трансформирован.
Метод
bool IsOwnReorientedOnly() const
получает флаг, свидетельствующий о том, что объект был только переориентирован.
Метод
bool IsOwnChangedWeakly() const
получает флаг, свидетельствующий о том, что объект был только создан и/или к нему были применены только не изменяющие структуру геометрии объекта «слабые» изменения (переименование, трансформация, переориентация). При наличии любых других изменений метод возвращает false.