(-1 . <Entity name: 60000014>)

(0 . "LINE")

(8 . "0")

(10 1.0 2.0 0.0)

(11 6.0 6.0 0.0)

(210 0.0 0.0 1.0)

ОБРАТИТЕ ВНИМАНИЕ На printdxf () функция печатает вывод в формате ассоциативного списка AutoLISP, но элементы сохранены в списке связей буферов результатов.

Буфер результатов в начале списка (с -1 кодом стража) содержит имя примитива, который этот список представляет. AcdbEntMod () функциональные использования это, чтобы идентифицировать примитив, который нужно изменить.

Коды для компонентов примитива (сохраненный в restype поле) - используемые DXF. Как с DXF, элементы заголовка примитива возвращены только, если они имеют значения другие чем значение по умолчанию. В отличие от DXF, необязательные поля определения примитива возвращены независимо от того, равняются ли они их значениям по умолчанию. Это упрощает обработку; приложение может всегда предполагать, что эти поля присутствуют. Также в отличие от DXF, связанного X, Y, и координат Z возвращены как одиночная переменная точки (resval. rpoint), не как отдельный X (10), Y (20), и Z (30) групп. Значение restype содержит номер группы координаты X (в диапазоне 10-19).

Чтобы находить группу с определенным кодом, приложение может пересекать список. Entitem () функция, показанная здесь ищет список буфера результата группу указанного типа.

static struct resbuf *entitem(rchain, gcode)

struct resbuf *rchain;

int gcode;

{

while ((rchain!= NULL) && (rchain->restype!= gcode))

rchain = rchain->rbnext;

НЕ нашли? Не то? Что вы ищете?

return rchain;

}

Если код группы DXF, указанный gcode параметром - не подарок{*настоящее*} в списке (или если gcode - не, правильная{*допустимая*} группа DXF), entitem () “ уменьшается конец ” и возвращает NULL. Обратите внимание, что entitem () эквивалентен функции AutoLISP (assoc).

AcdbEntMod () функция изменяет примитив. Это передает список, который имеет тот же самый формат как список, возвращенный acdbEntGet (), но с некоторыми из значений группы примитива (возможно) изменяемых приложением. Эти функциональные дополнения acdbEntGet (); первичные средства, которыми ObjectARX-приложение модифицирует базу данных - восстанавливая{*отыскивая*} примитив с acdbEntGet (), изменяя его список примитива, и затем пропуская список назад к базе данных с acdbEntMod ().

ОБРАТИТЕ ВНИМАНИЕ, чтобы восстановить значение по умолчанию цвета примитива или linetype, использовать acdbEntMod () чтобы установить цвет в 256, который является BYLAYER, или linetype к BYLAYER.

Следующий кодовый фрагмент отыскивает данные определения первого примитива в рисунке, и изменяет его свойство уровня к MYLAYER.

ads_name en;

struct resbuf *ed, *cb;

char *nl = "MYLAYER";

if (acdbEntNext(NULL, en) != RTNORM)

return BAD; // Error status

ed = acdbEntGet(en); // Retrieve entity data.

for (cb = ed; cb!= NULL; cb = cb->rbnext)

if (cb->restype == 8) { // DXF code for Layer

// Check to make sure string buffer is long enough.

if (strlen(cb->resval. rstring) < (strlen(nl)))

// Allocate a new string buffer.

cb->resval. rstring = realloc(cb->resval. rstring,

strlen(nl) + 1);

strcpy(cb->resval. rstring, nl);

if (acdbEntMod(ed) != RTNORM) {

acutRelRb(ed);

return BAD; // Error

}

break; // From the for loop

}

acutRelRb(ed); // Release result buffer.

Управление памятью - ответственность ObjectARX-приложения.

Код в примере гарантирует, что строковый буфер - правильный размер, и это выпускает буфер результатов, возвращенный acdbEntGet () (и прошло к acdbEntMod ()) как только операция закончена, действительно ли запрос к acdbEntMod () преуспевает.

ОБРАТИТЕ ВНИМАНИЕ, используете ли Вы acdbEntMod () чтобы изменить примитив на блочном определении, это воздействует на всю ВСТАВКУ или XREF к тому блоку; также, примитивы на блочных определениях не могут быть удалены acdbEntDel ().

Приложение может также добавлять примитив к базе данных рисунка, вызывая acdbEntMake () функция. Подобно acdbEntMod (), параметр к acdbEntMake () - список буфера результата, чей формат подобен таковому списка, возвращенного acdbEntGet (). (AcdbEntMake () запрос игнорирует поле имени примитива [-1], если это присутствует.) новый примитив добавлен в конец к базе данных рисунка (это становится последним{*прошлым*} примитивом в рисунке). Если примитив - сложный примитив (ломаная линия или блок), это не добавлено в конец к базе данных, пока это не закончено.

Следующий типовой кодовый фрагмент создает круг на уровне MYLAYER.

int status;

struct resbuf *entlist;

ads_point center = {5.0, 7.0, 0.0};

char *layer = "MYLAYER";

entlist = acutBuildList(RTDXF0, "CIRCLE",// Entity type

8, layer, // Layer name

10, center, // Center point

40, 1.0, // Radius

0 );

if (entlist == NULL) {

acdbFail("Unable to create result buffer list\n");

return BAD;

}

status = acdbEntMake(entlist);

acutRelRb(entlist); // Release acdbEntMake buffer.

if (status == RTERROR) {

acdbFail("Unable to make circle entity\n");

return BAD;

}

И acdbEntMod () и acdbEntMake () исполняют, те же самые проверки последовательности на данных примитива прошли к ним, поскольку команда DXFIN AutoCAD исполняет при чтении DXF файлы. Они терпят неудачу, если они не могут создавать правильные{*допустимые*} примитивы рисунка.

Сложные примитивы

Сложный примитив (ломаная линия или блок) должен быть создан множителем, вызывает к acdbEntMake(), используя отдельный запрос каждый подпримитив. Когда acdbEntMake() сначала получает начальный компонент для сложного примитива, это создает временный файл, чтобы собрать данные определения (и расширенные данные, если есть). Каждый последующий acdbEntMake() запрос добавляет новый подпримитив к файлу. Когда определение сложного примитива закончено (то есть когда acdbEntMake() получает соответствующий Seqend или Endblk подпримитив), примитив проверен для последовательности, и если допустимо, это добавлено к рисунку.

Файл удален, когда сложный примитив закончен или когда его создание отменено.

Следующий пример содержит пять, вызывает acdbEntMake () которые создают одиночный сложный примитив, ломаную линию. Ломаная линия имеет linetype ПОДЧЕРКНУТОГО ШТРИХОВОЙ ЛИНИЕЙ и цвет СИНИХ. Это имеет три вершина, расположенные в (1,1,0) координатах, (4,6,0), и (3,2,0). Все другие необязательные данные определения принимают значения по умолчанию.

int status;

struct resbuf *entlist, result;

ads_point newpt;

entlist = acutBuildList(

RTDXF0, "POLYLINE",// Entity type

62, 5, // Color (blue)

6, "dashed",// Linetype

66, 1, // Vertices follow.

0);

if (entlist == NULL) {

acdbFail("Unable to create result buffer list\n");

return BAD;

}

status = acdbEntMake(entlist);

acutRelRb(entlist); // Release acdbEntMake() buffer.

if (status!= RTNORM) {

acutPrintf ("%d",status);

acedGetVar ("ERRNO", &result);

acutPrintf ("ERRNO == %d, result. resval. rint);

acdbFail("Unable to start polyline\n");

return BAD;

}

newpt[X] = 1.0;

newpt[Y] = 1.0;

newpt[Z] = 0.0; // The polyline is planar

entlist = acutBuildList(

RTDXF0, "VERTEX", // Entity type

62, 5, // Color (blue)

6, "dashed", // Linetype

10, newpt, // Start point

0);

if (entlist == NULL) {

acdbFail("Unable to create result buffer list\n");

return BAD;

}

status = acdbEntMake(entlist);

acutRelRb(entlist); // Release acdbEntMake() buffer.

if (status!= RTNORM) {

acdbFail("Unable to add polyline vertex\n");

return BAD;

}

newpt[X] = 4.0;

newpt[Y] = 6.0;

entlist = acutBuildList(

RTDXF0, "VERTEX", // Entity type

62, 5, // Color (blue)

6, "dashed", // Linetype

10, newpt, // Second point

0);

if (entlist == NULL) {

acdbFail("Unable to create result buffer list\n");

return BAD;

}

status = acdbEntMake(entlist);

acutRelRb(entlist); // Release acdbEntMake() buffer.

if (status!= RTNORM) {

acdbFail("Unable to add polyline vertex\n");

return BAD;

}

newpt[X] = 3.0;

newpt[Y] = 2.0;

entlist = acutBuildList(

RTDXF0, "VERTEX", // Entity type

62, 5, // Color (blue)

6, "dashed", // Linetype

10, newpt, // Third point

0);

if (entlist == NULL) {

acdbFail("Unable to create result buffer list\n");

return BAD;

}

status = acdbEntMake(entlist);

acutRelRb(entlist); // Release acdbEntMake() buffer.

if (status!= RTNORM) {

acdbFail("Unable to add polyline vertex\n");

return BAD;

}

entlist = acutBuildList(

RTDXF0, "SEQEND", // Sequence end

62, 5, // Color (blue)

6, "dashed", // Linetype

0);

if (entlist == NULL) {

acdbFail("Unable to create result buffer list\n");

return BAD;

}

status = acdbEntMake(entlist);

acutRelRb(entlist); // Release acdbEntMake() buffer.

if (status!= RTNORM) {

acdbFail("Unable to complete polyline\n");

return BAD;

}

Создание блока подобно, за исключением того, что, когда acdbEntMake () успешно создает Endblk примитив, это возвращает значение RTKWORD. Вы можете проверять имя нового блока запросом к acedGetInput ().

Анонимные Блоки

Вы можете создавать анонимные блоки, вызывая acdbEntMake (). Чтобы делать так, Вы должны открыть блок с именем, чей первый символ - * и блочный флажок типа (группа 70) чей младший бит установлен в 1. AutoCAD назначает новый анонимный блок имя; символы в строке имени, которые следуют за *, часто игнорируются. Вы тогда создаете анонимный блок, путем Вы создали бы регулярный блок, за исключением того, что это более важно вызвать acedGetInput ().

Поскольку имя сгенерировано в соответствии с AutoCAD, ваша программа не имеет никакого другого пути знания имени нового блока.

Следующий код начинает анонимный блок, заканчивает его, и возвращает его имя.

int status;

struct resbuf *entlist;

ads_point basept;

char newblkname[20];

ads_point pnt1 = ( 0.0, 0.0, 0.0);

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132