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()) чтобы гарантировать, что все образцы блок-ссылок модифицированы.

Примечания относительно Расширенных Данных

Несколько функций ObjectARX обеспечиваются, чтобы обработать расширенные данные. Расширенные данные примитива следуют за нормальными данными определения примитива. Это иллюстрировано следующим рисунком, которое показывает схеме списка буфера результата для примитива, содержащего расширенные данные.

Расширенные данные примитива могут быть отысканы, вызывая acdbEntGetX (), который является подобным acdbEntGet (). AcdbEntGetX () функция отыскивает нормальные данные определения примитива и расширенные данные для приложений, указанных в acdbEntGetX () запрос.

ОБРАТИТЕ ВНИМАНИЕ, когда расширенные данные отысканы acdbEntGetX (), начало расширенных данных обозначено -3 кодом стража; -3 страж находится в буфере результатов, который предшествует первой 1001 группе. 1001 группа содержит прикладное имя первого отысканного приложения, как показано в рисунке.

Организация Расширенных Данных

Расширенные данные состоят из одного или большее количество 1001 групп, каждая из которых начинается с уникального прикладного имени. Прикладные названия - строковые значения. Расширенные группы данных возвратились acdbEntGetX () следуют за данными определения в порядке, в котором они сохранены в базе данных.

В пределах группы каждого приложения, содержания, значение, и организация данных определено приложением; AutoCAD поддерживает информацию, но не использует это. Коды Группы для расширенных данных находятся в 1000-1071 диапазоне, следующим образом:

Строка

1000. Строки в расширенных данных могут быть до длиной 255 байтов (с 256-ым байтом, зарезервированным для нулевого символа).

Прикладное имя

1001 (также строковое значение). Прикладные названия могут быть до длиной 31 байтов (32-ой байт зарезервирован для нулевого символа) и должен твердо придержаться правил для названий таблицы идентификаторов (типа названий уровня). Прикладное имя может содержать символы, цифры, и специальные символы $ (долларовый признак), - (дефис), и _ (символ подчеркивания). Это не может содержать пробелы. Символы на имя преобразованы к верхнему регистру.

Группа расширенных данных не может состоять из прикладного имени с noother данными.

Удалять расширенные данные

1 Запрос acdbEntGet () чтобы отыскать примитив.

2 Добавляют к концу списка, возвращенного acdbEntGet () resbuf с restype -3.

3 Добавляют к концу списка другой resbuf с restype 1001 и набором resval. rstring к <appname>.

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

Имя Уровня

1003. Имя уровня, связанного с расширенными данными.

Маркер Базы данных

1005. Маркеры примитивов в базе данных рисунка. При некоторых условиях AutoCAD транслирует их.

Трехмерная точка

1010.Три реальных значения, содержащиеся в точке.

Real

1040. Реальное значение.

Integer

1070.16-разрядное целое число (подписал или без знака).

Long

1071.32-разрядное подписанное (длинное) целое число. Если значение, которое появляется в 1071 группе - короткое целое число или реальное значение, это преобразовано к длинному целому числу; если это недопустимо (например, строка), это преобразовано к длинному нулю (0L).

Control String

1002. Расширенные данные управляют строкой, может быть или “{” или “}”. Эти фигурные скобки дают возможность приложению организовать его данные, подразделяя это в списки. Левая фигурная скобка начинает список, и правая фигурная скобка заканчивает самый современный список. (Списки могут быть вложены.) Когда это читает расширенные данные, проверки AutoCAD, чтобы гарантировать что фигурные скобки сбалансированы правильно.

Двоичные данные

1004. Двоичные данные организованы в куски переменной длины, которые могут быть обработаны в ObjectARX со структурой ads_binary. Максимальная длина каждого куска - 127 байтов.

Позиция в мировых координатах

1011. В отличие от простой трехмерной точки, мировые пространственные координаты перемещены, масштабируются, вращаются, и отражены наряду с родительским примитивом, которому расширенные данные принадлежат. Мировая пространственная позиция также протянута, когда команда STRETCH применяется к родительскому примитиву и этой лжи точки в пределах окна выбора.

Мировое пространственное смещение

1012. Трехмерная точка, которая масштабируется, вращается, или отражена наряду с родителем, но не протянута или перемещена.

Мировое направление

1013. Также трехмерная точка, которая вращается, или отражена наряду с родителем, но не масштабируется, протянута, или перемещена. Мировое направление - нормализованное смещение, которое всегда имеет длину модуля.

Расстояние

1041. Реальное значение, которое масштабируется наряду с родительским примитивом.

Коэффициент Масштаба

1042. Также реальное значение, которое масштабируется наряду с родителем.

ОБРАТИТЕ ВНИМАНИЕ, появляется ли 1001 группа в пределах списка, это обработано как строка и не начинает новую прикладную группу.

Регистрация Приложения

Прикладные названия сохранены с расширенными данными каждого примитива, который использует их и в APPID таблице. Приложение должно регистрировать имя или называть, это использует. В ObjectARX, это сделано запросом к acdbRegApp (). AcdbRegApp () функция определяет строку, чтобы использовать как прикладное имя. Это возвращает RTNORM, если это может успешно добавлять имя к APPID; иначе, это возвращает RTERROR. Результат RTERROR обычно указывает, что имя - уже в таблице идентификаторов. Это - не фактическое состояние ошибки, а обычно ожидаемое возвращаемое значение, потому что прикладное имя должно быть зарегистрировано только однажды в рисунок.

Из за большого объема этот материал размещен на нескольких страницах:
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