Добавление и удаление геометрических ограничений

Для добавления большинства геометрических или размерных ограничений можно воспользоваться вызовом:

GCM_constraint GCM_AddConstraint(GCM_system gSys, const GCM_g_record & cRec)    

который требует заполнения структуры данных cRec, несущей данные о типе ограничения cRec.type, и массив аргументов ограничения cRec.args. Функция вернет дескриптор нового ограничения, зарегистрированного в системе gSys.

Сразу приведем пример добавления ограничения – совпадение точки и плоскости:

GCM_system gSys = GCM_CreateSystem();
GCM_c_record cRec; // The record of point and plane coincidence.
cRec.type = GCM_COINCIDENT;
/*
Some point and plane as arguments of the coincidence.
*/
cRec.args[0] = GCM_AddPoint(gSys, MbCartPoint3D::origin);
cRec.args[1] = GCM_AddGeom(gSys, GCM_Plane(MbCartPoint3D(0,0,1), MbVector3D::zAxis));
cRec.args[2] = GCM_NO_ALIGNMENT; // The alignment option does't matter in point-plane case.
/*
Add coincidence to the system.
*/
GCM_constraint cItem = GCM_AddConstraint(gSys, cRec);       
/*
Finalize the constraint system.
*/
GCM_RemoveConstraint(gSys, cItem);
GCM_RemoveSystem(gSys); 

Для каждого типа ограничения принята определенная последовательность заполнения аргументов args в структуре GCM_c_record. В примере выше показано, что для ограничения GCM_COINCIDENT первые два элемента cRec.args[0] и cRec.args[1] – это дескрипторы аргументов ограничения Совпадение, а третий элемент cRec.args[2] задает опцию выравнивания.

Устройство структуры GCM_c_record. В таблице ниже приведена схема заполнения структуры GCM_c_record, передаваемой в метод GCM_AddConstraint, для различных типов ограничений.

Таблица 1 - Типы данных аргументов для различных ограничений (заполнение GCM_c_record)

Тип ограничения

Типы аргументов

type

args[0]

args[1]

args[2]

args[3]

args[4]

GCM_COINCIDENT

GCM_geom

GCM_geom

GCM_alignment

GCM_CONCENTRIC

GCM_geom

GCM_geom

GCM_alignment

GCM_PARALLEL

GCM_geom

GCM_geom

GCM_alignment

GCM_PERPENDICULAR

GCM_geom

GCM_geom

GCM_alignment

GCM_TANGENT

GCM_geom

GCM_geom

GCM_alignment

GCM_tan_choice

GCM_SYMMETRIC

GCM_geom

GCM_geom

CM_geom

GCM_alignment

GCM_DISTANCE

GCM_geom

GCM_geom

double

GCM_alignment

GCM_ANGLE (планарный угол)

GCM_geom

GCM_geom

GCM_geom (ось вращения)

double

GCM_alignment

GCM_ANGLE (3D угол)

GCM_geom

GCM_geom

GCM_NULL (без оси)

double

GCM_alignment

GCM_RADIUS

GCM_geom

GCM_geom

Значение опции выравнивания GCM_alignment рассматривается в параграфе Опция выравнивания GCM_alignment. Значения GCM_tan_choice будут рассмотрены в разделах, где обсуждается ограничение касание (GCM_TANGENT). В таблице 31.10.1. приведены только правила интерпретации типов данных, который принимает элемент типа GCM_c_arg из массива GCM_c_record::args для того или иного типа ограничения.

Таким образом структура данных GCM_c_record представляет собой унифицированный способ задания разного типа ограничений, имея только один метод GCM_AddConstraint. Однако для удобства разработчика в API GCM имеются альтернативные методы добавления ограничений, не требующие заполнения структуры GCM_c_record.

Для добавления любых бинарных ограничений, связывающих пару геометрических объектов, можно воспользоваться функцией:

GCM_constraint GCM_AddBinConstraint(GCM_system gSys, GCM_c_type cType
                                   , GCM_geom g1
                                   , GCM_geom g2
                                   , GCM_alignment aVal
                                   , GCM_tan_choice tVar)

Входные параметры функции:

  • gSys – дескриптор системы ограничений;

  • cType – значение типа из следующего списка: GCM_COINCIDENT, GCM_PARALLEL, GCM_PERPENDICULAR, GCM_TANGENT, GCM_CONCENTRIC;

  • g1, g2 – пара дескрипторов геометрических объектов, аргументы бинарного ограничения;

  • aVal – опция выравнивания, позволяющая выбрать взаимную ориентацию для ориентируемых объектов (подробнее см. параграф Опция выравнивания GCM_alignment);

  • tVar – опция выбора касания, позволяющего выбирать способы исполнения ограничения с типом GCM_TANGENT.

Результатом вызова является дескриптор бинарного ограничения, связывающего объекты g1, g2, с выбранными условиями выравнивания/касания aVal, tVar.

Размерное ограничение типа GCM_DISTANCE, определяющее расстояние между объектами, создаётся вызовом:

GCM_constraint GCM_AddDistance(GCM_system gSys, GCM_geom g1
                                , GCM_geom g2
                                , double dVal
                                , GCM_alignment aVal)

который принимает входные данные g1, g2, aVal, такие же, как у функции GCM_AddBinConstraint, числовое значение dVal – задает значение размера.

Аналогично работают вызовы, задающие угловой размер, зеркальную симметрию и радиусный размер: GCM_AddAngle, GCM_AddSymmeric,GCM_FixRadius. Они также не требуют заполнения транзитной структуры GCM_c_record.