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

       

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


Вы можете создавать анонимные блоки,  вызывая 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);

entlist = acutBuildList(

RTDXF0, "BLOCK",

2, "*ANON", // Only the ’*’ matters.

10, "1", // No other flags are set.

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 start anonymous block\n");

return BAD;

}

// Add entities to the block by more acdbEntMake calls.

.

.

.

entlist = acutBuildList(RTDXF0, "ENDBLK", 0 );

if (entlist == NULL) {

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

return BAD;

}

status = acdbEntMake(entlist);

acutRelRb(entlist); // Release acdbEntMake buffer.

if (status != RTKWORD) {

acdbFail("Unable to close anonymous block\n");

return BAD;

}

status = acedGetInput(newblkname);

if (status != RTNORM) {

acdbFail("Anonymous block not created\n");

return BAD;

}

К ссылке анонимный блок, создайте примитив вставки с acdbEntMake() (Вы не можете передавать анонимный блок к команде INSERT.)

Продолжая предыдущий пример, следующий кодовый фрагмент вставляет анонимный блок в (0,0).

basept[X] = basept[Y] = basept[Z] = 0.0;


entlist = acutBuildList(

RTDXF0, "INSERT",

2, newblkname, // From acedGetInput

10, basept,

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 insert anonymous block\n");

return BAD;

}

Функции Данных Примитива и Графический Экран

Изменяется к рисунку, сделанному функциями данных примитива,  отражен на графическом экране, при условии, что удаляемый примитив, восстановлен, изменяется, или сделан, находится в области и находится на уровне, который является в настоящее время видимым. Имеется одно исключение: когда acdbEntMod() изменяет подпримитив, это не модифицирует изображение сложного примитива. Причина должна быть ясна. Если, например, приложение должно было изменить 100 вершин сложной ломаной линии с 100 выполняемый с помощью итераций, вызывает acdbEntMod(), время, требуемое, чтобы повторно вычислять и восстановить изображение полной ломаной линии, поскольку каждая вершина была изменена, будет неприемлемо медленно. Вместо этого, приложение может исполнять ряд модификаций подпримитива и затем восстанавливать изображение полного примитива с одиночным запросом к acdbEntUpd () функция.

В следующем примере, первый примитив в текущем рисунке - ломаная линия с несколькими вершиной. Следующий код изменяет вторую вершину ломаной линии и затем восстанавливает его отображаемое изображение.

ads_name e1, e2;

struct resbuf *ed, *cb;

if (acdbEntNext(NULL, e1) != RTNORM) {

acutPrintf("\nNo entities found. Empty drawing.");

return BAD;

}

acdbEntNext(e1, e2);

if ((ed = acdbEntGet(e2)) != NULL) {

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

if (cb->restype == 10) { // Start point DXF code

cb->resval.rpoint[X] = 1.0;// Change coordinates.

cb->resval.rpoint[Y] = 2.0;

if (acdbEntMod(ed) != RTNORM) { // Move vertex.

acutPrintf("\nBad vertex modification.");

acutRelRb(ed);

return BAD;

} else {

acdbEntUpd(e1); // Regen the polyline.

acutRelRb(ed);

return GOOD; // Indicate success.

}

}

acutRelRb(ed);

}

return BAD; // Indicate failure.

Параметр acdbEntUpd() может определить или основной примитив или - tity; в любом случае, acdbEntUpd() восстанавливает полный примитив. Хотя его первичное использование - для сложных примитивов, acdbEntUpd() может восстанавливать любой примитив в текущем рисунке.

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


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