Добавление и удаление геометрических ограничений
Для добавления большинства геометрических или размерных ограничений можно воспользоваться вызовом:
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.