DXF Коды Группы
Много функций ObjectARX возвращают коды типа, определенные в предшествующей таблице. Однако, в результатах от функций, которые обрабатывают, примитивы, restype поле содержат коды группы DXF, которые описаны в Руководстве Настройки AutoCAD. Например, в списке примитива, restype поле 10 указывает точку, в то время как restype 41 указывает реальное значение.
Рисунки AutoCAD состоят из структурных контейнеров для объектов базы данных, имеющих следующие компоненты:
§
уникальная метка, которая всегда позволяется и это сохраняется продолжении жизни рисунка
§ необязательный список xdata
§ необязательный набор постоянных реакторов
§ необязательный указатель монопольного использования на словарь расширения, который имеет другие объекты базы данных, помещенные в это приложением
Объекты Базы данных - объекты без уровня, linetype, цвета, или любых других геометрических или графических свойств, и примитивы получены из объектов и имеют геометрические и графические свойства.
Поскольку коды DXF - всегда меньше чем 2,000, и коды типа результата всегда большие, приложение может легко определять, когда список буфера результата содержит значения результата (как возвращено acedGetArgs (), например) или содержит данные определения примитива (как возвращено acdbEntGet () и другими функциями примитива).
Следующий рисунок показывает формат буфера результата круга, отысканного acdbEntGet ():
Следующий типовой кодовый фрагмент показывает функцию, dxftype (), который пропускают код группы DXF и связанный примитив, и возвращает соответствующий код типа. Код типа указывает то, что тип данных может представлять данные: RTREAL указывает, с двойной точностью с плавающей точкой значение, RT3DPOINT указывает ads_point, и так далее. Вид примитива (например, нормальный примитив типа круга, блочного определения, или входа таблицы типа области просмотра) обозначен определениями типов, которые сопровождают эту функцию:
#define ET_NORM 1 // Normal entity
#define ET_TBL 2 // Table
#define ET_VPORT 3 // Table numbers
#define ET_LTYPE 4
#define ET_LAYER 5
#define ET_STYLE 6
#define ET_VIEW 7
#define ET_UCS 8
#define ET_BLOCK 9
// Get basic C- language type from AutoCAD DXF group code (RTREAL,
// RTANG are doubles, RTPOINT double[2], RT3DPOINT double[3],
// RTENAME long[2]). The etype argument is one of the ET_
// definitions.
//
// Returns RTNONE if grpcode isn’t one of the known group codes.
// Also, sets "inxdata" argument to TRUE if DXF group is in XDATA.
short dxftype(short grpcode, short etype, int *inxdata)
{
short rbtype = RTNONE;
*inxdata = FALSE;
if (grpcode >= 1000) { // Extended data (XDATA) groups
*inxdata = TRUE;
if (grpcode == 1071)
rbtype = RTLONG; // Special XDATA case
else
grpcode %= 1000; // All other XDATA groups match.
} // regular DXF code ranges
if (grpcode <= 49) {
if (grpcode >= 20) // 20 to 49
rbtype = RTREAL;
else if (grpcode >= 10) { // 10 to 19
if (etype == ET_VIEW) // Special table cases
rbtype = RTPOINT;
else if (etype == ET_VPORT && grpcode <= 15)
rbtype = RTPOINT;
else // Normal point
rbtype = RT3DPOINT; // 10: start point, 11: endpoint
}
else if (grpcode >= 0) // 0 to 9
rbtype = RTSTR; // Group 1004 in XDATA is binary
else if (grpcode >= -2)
// -1 = start of normal entity -2 = sequence end, etc.
rbtype = RTENAME;
else if (grpcode == -3)
rbtype = RTSHORT; // Extended data (XDATA) sentinel
}
else {
if (grpcode <= 59) // 50 to 59
rbtype = RTANG; // double
else if (grpcode <= 79) // 60 to 79
rbtype = RTSHORT;
else if (grpcode < 210)
;
else if (grpcode <= 239) // 210 to 239
rbtype = RT3DPOINT;
else if (grpcode == 999) // Comment
rbtype = RTSTR;
}
return rbtype;
}
Приложение получает список буфера результата (вызвал rb), представляя вход в таблице идентификаторов области просмотра, и следующая инструкция C вызывает dxftype ():
Ctype = dxftype (rb-
> restype, ET_VPORT, &inxdata);
Предположим, что rb- >restype равняется 10. Тогда dxftype() возвращает RTPOINT, указывая, что примитив является двумерной точкой, чьи координаты (типа ads_real) находятся в rb->resval.rpoint [X] и rb->resval.rpoint [Y].