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