## Система геометрических ограничений Система геометрических ограничений это набор геометрических объектов, взаимосвязанных друг с другом через ограничения и размеры. Типы поддерживаемых геометрических объектов и ограничений приведены соответственно в параграфах [Типы поддерживаемой геометрии](./Supported_geometry_types.md), [Типы поддерживаемых ограничений](./Supported_constraint_types.md). Предполагается, что геометрическая модель, которая создается в приложении, имеет свою систему ограничений. С программной точки зрения это означает, что каждая модель ассоциируется с системой ограничений через дескриптор типа GCM_system, а каждый его геометрические объект и ограничение представлены своими уникальными дескрипторами типов GCM_geom и GCM_constraint. Перед тем как начать работать с геометрическими ограничениями необходимо объявить для модели систему ограничений с помощью вызова: ```cpp GCM_system GCM_CreateSystem() ``` Функция вернет пустую систему ограничений в виде дескриптора GCM_system, который представляет собой указатель на экземпляр внутренней структуры данных геометрического решателя. Все дальнейшие манипуляции с системой ограничений будут осуществляться через данный дескриптор. Например, если мы хотим объявить точку, необходимо для созданной системы ограничений вызвать функцию: ```cpp GCM_geom GCM_AddPoint(GCM_system gSys, MbCartPoint3D pVal) ``` Результатом функции является дескриптор геометрической точки, принадлежащей системе ограничений **gSys**. Параметр **pVal** задает начальные координаты \ точки. При завершении работы с геометрической моделью, обязательно следует вызвать функцию удаления ее системы ограничений: ```cpp void GCM_RemoveSystem(GCM_system gSys) ``` которая полностью освободит память, занимаемую системой ограничений со всеми данными объектов и ограничений. После вызова **GCM_RemoveSystem** дескриптор системы ограничений становится недействительным, т.е. дальнейшее использование такого дескриптора может привести к аварийному прекращению работы приложения. Функция ```cpp void GCM_ClearSystem(GCM_system gSys) ``` делает систему ограничений пустой, освобождая память только от объектов и ограничений, но оставляет систему ограничений действительной для дальнейшей работы. Также с помощью вызова ```cpp bool GCM_ReadSystem(GCM_system gSys, reader & in) ``` можно сохранить систему ограничений в поток, а вызовом ```cpp bool GCM_WriteSystem(GCM_system gSys, writer & out) ``` полностью восстановить состоянии системы. Функции сохранения и воспроизведения из потока гарантируют сохранность значений дескрипторов всех ограничений и объектов. **Внимание!** Функции чтения/записи системы ограничений сохраняют только те данные об объектах и ограничениях, которые загружены в C3D Solver. Все исходные данные об объектах и ограничениях модели хранятся на стороне приложения, сохранность которых -- забота разработчика приложения. Функции **GCM_ReadSystem**, **GCM_WriteSystem** могут оказаться полезными в следующих случаях: - передача данных от разработчика приложения разработчику C3D Solver для отладки, в целях технической поддержки. См. также параграф [Журналирование вызовов API решателя GCM](./Journalling_API_calls_of_the_GCM_solver.md), где рассмотрено журналирование вызовов GCM в целях отладки и техподдержки; - конвертирование нативных форматов в C3D-файл, с некоторой потерей данных; - временное сохранение состояния системы ограничений в различных целях (возможна частичная потеря данных для таких ограничений, как механические передачи и зависимости GCM_DEPENDENT).