ObjectARX, AutoCAD. Среда программирования библиотеки C++

       

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].


Содержание раздела