Принцип работы флагов изменения топологических объектов

Флаги изменения имеются у всех топологических объектов (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). Большой куб разрезается маленьким параллелепипедом:

../../../../_images/O.7.11.1.png

Рис. 1

Рассмотрим нижнюю грань паза в полученном теле (выделена красным цветом).

После операции она имеет следующие флаги:

tct_Modified, tct_Created, tct_Reoriented, tct_Deleted, tct_Truncated, tct_Added

Это означает следующее:

  1. Грань была модифицирована каким-либо образом в выполненной операции (tct_Modified).

  2. Этой грани ранее не было в этом теле и она была создана (tct_Created).

  3. На самом деле грань была создана из грани режущего тела (выделена зелёным цветом), но вектор нормали был развёрнут (tct_Reoriented). Полное имя у неё полностью совпадает с именем грани режущего тела.

  4. Грань была обрезана (tct_Truncated), для чего у неё был удалён (tct_Deleted) и добавлен (tct_Added) цикл рёбер грани.

Далее выполним ещё одно разрезание тем же режущим телом. Перед операцией изменим положение режущего параллелепипеда (Рис. 2).

../../../../_images/O.7.11.2.png

Рис. 2

Рассмотрим следующую грань в результате данного разрезания (выделена зелёным цветом на Рис. 3):

../../../../_images/O.7.11.3.png

Рис. 3

После операции новая грань имеет следующие флаги:

tct_Modified, tct_Created, tct_Transformed, tct_Reoriented, tct_Deleted, tct_Truncated, tct_Added, tct_Replaced

Это означает следующее:

  1. Грань была модифицирована каким-либо образом в выполненной операции (tct_Modified).

  2. Этой грани ранее не было в этом теле и она была создана (tct_Created).

  3. На самом деле грань была создана из грани режущего тела (Рис. 2), но вектор нормали был развёрнут (tct_Reoriented). Режущее тело было перемещено перед операцией (tct_Transformed).

  4. Грань была обрезана (tct_Truncated), для чего у неё был удалён (tct_Deleted) и добавлен (tct_Added) цикл рёбер грани.

  5. У грани в процессе операции была заменена поверхность или цикл рёбер грани (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.