## Добавление и удаление геометрических ограничений Для добавления большинства геометрических или размерных ограничений можно воспользоваться вызовом: ```cpp GCM_constraint GCM_AddConstraint(GCM_system gSys, const GCM_g_record & cRec) ``` который требует заполнения структуры данных **cRec**, несущей данные о типе ограничения **cRec.type**, и массив аргументов ограничения **cRec.args**. Функция вернет дескриптор нового ограничения, зарегистрированного в системе **gSys**. Сразу приведем пример добавления ограничения -- совпадение точки и плоскости: ```cpp 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_alignment_option.md). Значения 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. Для добавления любых **бинарных** ограничений, связывающих пару геометрических объектов, можно воспользоваться функцией: ```cpp 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](./GCM_alignment_option.md)); - **tVar** -- опция выбора касания, позволяющего выбирать способы исполнения ограничения с типом GCM_TANGENT. Результатом вызова является дескриптор бинарного ограничения, связывающего объекты **g1**, **g2**, с выбранными условиями выравнивания/касания **aVal**, **tVar**. Размерное ограничение типа GCM_DISTANCE, определяющее расстояние между объектами, создаётся вызовом: ```cpp 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.