Дополнительная информация
К любому примитиву чертежа можно добавлять расширенные данные, т.е. текстовые или числовые данные, которые желательно хранить вместе с геометрией (например, марки материалов, наименования узлов, секций и т.п.). Обычно наличие такой информации позволяет разрабатывать программы связи с базами данных. Расширенные данные связываются с именем определенного приложения. У одного графического примитива могут быть данные нескольких приложений, которые располагаются последовательно в определенной структуре.
В том случае, когда расширенные данные присоединены к примитиву, то в базе чертежа они следуют за обычными данными. Для расширенных данных отведено пространство (нужно вспомнить DXF-коды) начиная с 1000 по 1071.
Строковые константы
1000. Строковые константы в расширенных данных могут быть длиной не более 255 знаков (256-й знак зарезервирован под символ с кодом 0).
Имя приложения
1001 (тоже строковая константа). Используется только для указания имени приложения, длиной не более 31 знака (если код 1001 попадает внутрь списка, организуемого с помощью DXF-кодов 1002, то он интерпретируется как обычная строковая константа, а не имя приложения). Имя приложения должно состоять только из латинских букв, цифр и символов $, -, _.
Название слоя
1003. Название слоя, с которым связываются расширенные данные.
Метка в базе чертежа
1005. Метка объекта в базе чертежа
3D точка
1010. Три вещественных числа, обозначающие координату точки в 3-х мерном пространстве.
Вещественное число
1040. Вещественное число.
Короткое целое число
1070. 16-битовое целое число (со знаком или без знака).
Длинное целое число
1071. 32-битовое целое число. Если присвоить значение в группе 1071 как короткое целое число или вещественное число, то оно будет преобразовано в длинное целое число. Если присвоит, например строковую константу, то оно преобразуется в 32-битный нуль (0L).
ObjectARX всегда трактует группы 1071 как длинные целые.
Существуют и другие группы специальных расширенных данных:
Управляющая строка
1002. Расширенными данными можно управлять используя скобки "{" и "}". С помощью группы 1002 можно формировать в расширенных данных списковые структуры. Они должны начинаться открывающей скобкой с кодом 1002, затем должны идти данные, включаемые в список, а закрывающая скобка с кодом 1002 завершает оформление списка.
Двоичные данные
1004. Двоичные данные длиной не более 127 байтов. Обрабатываются только в ObjectARX.
3-х мерная точка положения в МСК
1011. Трехмерная точка интерпретируется как положение в МСК. Такая точка перемещается, масштабируется, поворачивается, и симметрируется одновременно с родительским примитивом рисунка.
3-х мерная точка перемещения
1012. Такая точка не перемещается, не масштабируется и не растягивается одновременно с родительским примитивом, но участвует вместе с ним в операциях масштабирования, поворота и симметрирования.
3-х мерная точка направления
1013. Трехмерная точка интерпретируется как направление в МСК. Учувствует в операциях поворота и симметрирования. Вектор с координатами, взятыми из группы с кодом 1013, является нормализованным, т.е. единичной длинны.
Расстояние
1041. Вещественное число, интерпретируемое как расстояние. Оно масштабируется одновременно с родительским примитивом.
Коэффициент масштаба
1042. Вещественное число, интерпретируемое как коэффициент масштаба. Масштабируется одновременно с родительским примитивом.
Пример использования расширенных данных на Object Pascal (Delphi).
function AcPoint(x, y, z: double) : OleVariant;
begin
Result := VarArrayCreate([0, 2], varDouble);
Result[0] := x; Result[1] := y; Result[2] := z;
end;
procedure CadDev_XDataExample;
const
appid = 'MYAPPID';
var
AcadApplication, Objects, vaPoint, vaType, vaData: OleVariant;
i : integer;
begin
// Получаем ссылку на откытый AutoCAD
2004 или запускаем новый
AcadApplication := GetActiveOleObject('AutoCAD.Application.16');
// Получаем множество выбранных объектов
Objects := AcadApplication.ActiveDocument.SelectionSets.Add('XDATAEXAMPLE');
Objects.SelectOnScreen;
// Регестрируем приложение
AcadApplication.ActiveDocument.RegisteredApplications.Add(appid);
// Создаем гркппы кодов и массивы данных
vaType := VarArrayCreate([0, 4], varSmallInt);
vaData := VarArrayCreate([0, 4], varVariant);
// Создаем вариантый массив 3D точки
vaPoint := AcPoint(4.0, 6.0, 0.0);
// Заполняем массив
vaType[0] := 1001; // Название приложения должно быть вначале
vaData[0] := appid;
vaType[1] := 1070; // Целочисленное
vaData[1] := 99;
vaType[2] := 1040; // Вещественное
vaData[2] := 2.5;
vaType[3] := 1000; // Строка
vaData[3] := 'Здавствуй яблочко!';
vaType[4] := 1010; // 3D точка
vaData[4] := vaPoint;
// К каждому объекту в выбранных объктах
// присоеденим расширенные данные XData
For i := 0 to Objects.Count - 1 do
Objects.Item(i).SetXData(vaType, vaData);
Objects.Delete;
end;