Формирование файла SGF
Это точка входа в импорт геометрии — момент, когда управление передаётся Дополнению извне. Возможны два сценария (см. Сценарии взаимодействия):
- нажатие кнопки Панели инструментов в CAD-системе — пользователь экспортирует открытую модель (Импорт из CAD-системы в CAM-систему);
- вызов транслятором или CAM-системой при импорте CAD-файла — Дополнение запускается на уже загруженной модели (Импорт CAD-файла в CAM-систему).
В обоих случаях на вход поступает одно и то же: текущая модель CAD-системы (что сохранять) и путь к выходному файлу (куда). Дальше Дополнение формирует SGF-файл по единой схеме:
- подключиться к библиотеке импорта (см. Подключение STGeomFile.dll);
- обойти модель CAD сверху вниз и записать её геометрию через
sgr(см. разделы «Кривые и точки»–«PMI»); - освободить интерфейсы и выгрузить библиотеку (
FreeLibrary).
Глобальные настройки импорта
Сразу после StartFile, до записи геометрии, задаются глобальные настройки импорта. Они применяются ко всему файлу и устанавливаются один раз через интерфейс ISTGeomReceiver (sgr, см. Интерфейсы импорта):
| Метод | Описание |
|---|---|
SetModelUnits(Units: TST_LinearMeasure; MultScale: STFloat) |
Установить единицы измерения модели (lm_Millimetre, lm_Centimetre, lm_Decimetre, lm_Metre, lm_Inch, lm_Foot). MultScale — масштабный коэффициент. По умолчанию lm_Millimetre и MultScale = 1. |
SetArcToler(Value: STFloat) |
Установить допуск аппроксимации дуг. По умолчанию 0.001 (в единицах модели). |
SetImportOption(OptionType: TSTImportOption; OptionValue: boolean) |
Включить/выключить опцию импорта OptionType (значение OptionValue). Значения TSTImportOption и их назначение — в таблице ниже. |
Опции TSTImportOption управляют импортом контуров граней — прежде всего для инвертированных (с обратной нормалью) и циклических (замкнутых по параметру) поверхностей. Обычно менять их не требуется: значения по умолчанию подходят для большинства случаев, и опции трогают только при специфических проблемах с ориентацией или достраиванием контуров. Возможные значения:
TSTImportOption |
Назначение | По умолчанию |
|---|---|---|
ioCreateRectLoops |
Достраивать внешний контур для циклической грани, если он не задан явно: по параметрической области поверхности добавляется прямоугольная (внешняя) петля. | выкл. |
ioInverse3dLoopsForInversedFaces |
Инвертировать направление обхода 3D-контуров (петель из пространственных рёбер) у граней с инвертированной поверхностью — чтобы сохранялось правило «тело грани слева». | вкл. |
ioInverse2dLoopsForInversedFaces |
То же, но для 2D-контуров, заданных в UV-параметрах поверхности. | выкл. |
Метаданные заголовка SGF
SGF-файл начинается с заголовка: сигнатура, версия формата и JSON-блок метаданных. Заголовок целиком формирует библиотека при CloseFile; Дополнение только дополняет JSON-блок сведениями об источнике — из какого файла, какой CAD-системой и какой версией Дополнения сформирован SGF. CAM-система показывает эти сведения пользователю — например, имя исходной модели. Ключи originalFileName и hostName обязательны, остальные заполняются по возможности.
Метаданные записываются через sgr.Header.MetaWriter (интерфейс ISGFMetaWriter) строго между StartFile и CloseFile — вне этого окна sgr.Header возвращает null. Корневым JSON-объектом владеет библиотека: пары добавляются сразу, без открытия корня, а каждый BeginObject/BeginArray закрывается парным EndObject/EndArray (как и геометрические Start…/Close…). Методы возвращают boolean — статус успешности:
| Метод | Описание |
|---|---|
AddStrPair(AKey, AValue: string) |
Добавить пару «ключ — строковое значение». Аналогично AddIntPair (integer), AddFltPair (STFloat), AddBolPair (boolean). |
BeginObject(ObjectID: string) / EndObject() |
Открыть / закрыть вложенный объект с указанным ключом. |
BeginArray(ArrayID: string) / EndArray() |
Открыть / закрыть вложенный массив с указанным ключом. |
AddStrValue(AValue: string) |
Добавить значение в открытый массив. Аналогично AddIntValue, AddFltValue, AddBolValue. |
Стандартный набор ключей приведён в таблице. Имена в таблице — это ключи: CAM-система читает значения именно по ним, поэтому записывать их нужно в точности как указано, не переименовывая. Собственные ключи добавлять можно — версия формата от этого не меняется, незнакомые ключи при чтении игнорируются.
| Ключ | Содержимое | Обязательность |
|---|---|---|
originalFileName |
Полный путь к файлу проекта CAD-системы (см. Панель инструментов). | обязательный |
hostName |
Значение тега HostApplication — строковый идентификатор CAD-системы, по которому CAM-система находит Дополнение (см. Файл XML дополнения и Глоссарий). |
обязательный |
sourceApp |
Вложенный объект: name — имя исполняемого файла CAD-системы, processFileName — его полный путь, version — версия CAD-системы. |
необязательный |
toolbarLibrary |
Вложенный объект: name, path, version — имя, путь и версия модуля Дополнения. |
необязательный |
Ключ _generated зарезервирован: эту секцию (timeUTC — время формирования файла, library — версия библиотеки импорта, processFileName — путь процесса, сформировавшего файл) библиотека дописывает сама при CloseFile.
Пример записи (вызов метода — в примере точки входа импорта) и итоговый JSON-блок:
// Метаданные заголовка: исходный файл, CAD-система, модуль Дополнения
void WriteHeaderMeta(CADDocument doc)
{
var mw = sgr.Header.MetaWriter;
mw.AddStrPair("originalFileName", doc.FileName);
mw.AddStrPair("hostName", fHost); // тег HostApplication из Файла XML дополнения
mw.BeginObject("sourceApp");
mw.AddStrPair("name", "mycad.exe");
mw.AddStrPair("processFileName", cadExePath);
mw.AddStrPair("version", cadVersion);
mw.EndObject();
mw.BeginObject("toolbarLibrary");
mw.AddStrPair("name", "MyCADToolbar.dll");
mw.AddStrPair("path", toolbarPath);
mw.AddStrPair("version", toolbarVersion);
mw.EndObject();
}
{
"originalFileName": "C:\\Models\\part.mcad",
"hostName": "MyCAD",
"sourceApp": { "name": "mycad.exe", "processFileName": "C:\\MyCAD\\mycad.exe", "version": "3.2.1" },
"toolbarLibrary": { "name": "MyCADToolbar.dll", "path": "C:\\MyCAD\\Addins\\MyCADToolbar.dll", "version": "1.4.0.12" },
"_generated": { "timeUTC": "2026-07-15T10:30:00Z", "library": "STGeomFile 1.0.0.0", "processFileName": "C:\\MyCAD\\mycad.exe" }
}
Пример: точка входа импорта
// Точка входа импорта. На вход — текущая модель CAD-системы и путь к выходному SGF-файлу.
bool ExportToSGF(CADDocument doc, string outFilePath)
{
if (!ConnectToGeomFiler(GetLibraryPath()))
return false;
bool ok = false;
try
{
sgf.StartFile(outFilePath);
try
{
// метаданные заголовка (см. «Метаданные заголовка SGF»)
WriteHeaderMeta(doc);
// sgr.SetModelUnits(TST_LinearMeasure.lm_Metre, 1.0);
// sgr.SetArcToler(0.005);
// sgr.SetImportOption(TSTImportOption.ioCreateRectLoops, true);
// UnitMatrix3D — единичная матрица (корень без смещения)
if (!doc.IsDetail)
SaveAssembly(doc.Assembly, UnitMatrix3D);
else
SavePart(doc.Part, UnitMatrix3D);
}
finally
{
sgf.CloseFile();
}
ok = true;
}
catch
{
ok = false;
}
finally
{
sgr = null;
sgf = null;
if (hDLL != IntPtr.Zero) { FreeLibrary(hDLL); hDLL = IntPtr.Zero; }
}
return ok;
}