Следующий типовой кодовый фрагмент иллюстрирует, как acedSSAdd () может использоваться вместе с acdbEntNext () чтобы создать наборы выбора и добавлять членов к существующему набору.
Ads_name ss, e1, e2;
// Set e1 to the name of first entity.
if (acdbEntNext(NULL, e1) != RTNORM) {
acdbFail("No entities in drawing\n");
return BAD;
}
// Set ss to a null selection set.
acedSSAdd(NULL, NULL, ss);
// Return the selection set ss with entity name e1 added.
if (acedSSAdd(e1, ss, ss) != RTNORM) {
acdbFail("Unable to add entity to selection set\n");
return BAD;
}
// Get the entity following e1.
if (acdbEntNext(e1, e2) != RTNORM) {
acdbFail("Not enough entities in drawing\n");
return BAD;
}
// Add e2 to selection set ss
if (acedSSAdd(e2, ss, ss) != RTNORM) {
acdbFail("Unable to add entity to selection set\n");
return BAD;
}
Следующий типовой кодовый фрагмент использует acdbEntNext () чтобы “идти” через базу данных, один примитив одновременно.
ads_name ent0, ent1;
struct resbuf *entdata;
if (acdbEntNext(NULL, ent0) != RTNORM) {
acdbFail("Drawing is empty\n");
return BAD;
}
do {
// Get entity’s definition data.
entdata = acdbEntGet(ent0);
if (entdata == NULL) {
acdbFail("Failed to get entity\n");
return BAD;
}
.
. // Process new entity.
.
if (acedUsrBrk() == TRUE) {
acdbFail("User break\n");
return BAD;
}
acutRelRb(entdata); // Release the list.
ads_name_set(ent0, ent1); // Bump the name.
} while (acdbEntNext(ent1, ent0) == RTNORM);
ПРИМЕЧАНИЕ Вы можете также пройти базу данных, “наталкиваясь” одиночная переменная в acdbEntNext () запрос (типа acdbEntNext (ent0, ent0)), но если Вы делаете, значение переменной, больше не определено однажды цикл концы.
AcdbEntLast () функция отыскивает имя последнего примитива в базе данных. Последний примитив - наиболее недавно созданный основной примитив, так что acdbEntLast () может быть вызван, чтобы получить имя примитива, который только что был создан посредством запроса к acedCommand (), acedCmd (), или acdbEntMake ().
AcedEntSel () функция запрашивает пользователя AutoCAD выбирать примитив, определяя точку на графическом экране; acedEntSel () возвращает, и имя примитива и значение указанной точки. Некоторые операции примитива требуют знания точки, которой примитив был выбран. Примеры от набора существующих команд AutoCAD включают ПЕРЕРЫВ, ВЫРЕЗКУ, ПРОСТИРАЮТСЯ, и OSNAP.
Метки примитива и их использования
AcdbHandEnt () функция отыскивает имя примитива с определенной меткой. Подобно именам примитива, метки уникальны в пределах рисунка. В отличие от имен примитива, метка примитива постоянна повсюду его жизни. ObjectARX приложения, которые управляют определенной базой данных, могут использовать acdbHandEnt () чтобы получить текущее имя примитива, который они должны использовать.
Следующий типовой кодовый фрагмент использует acdbHandEnt () чтобы получить имя примитива и распечатывать это.
char handle[17];
ads_name e1;
strcpy(handle, "5a2");
if (acdbHandEnt(handle, e1) != RTNORM)
acdbFail("No entity with that handle exists\n");
else
acutPrintf("%ld", e1[0]);
В одном сеансе редактирования частности, этот код мог бы распечатывать 60004722. В другом сеансе редактирования с тем же самым рисунком, это могло бы печатать полностью отличный номер. Но в обоих случаях, код обращается к тому же самому примитиву.
AcdbHandEnt () функция имеет дополнительное использование: примитивы, удаленные из базы данных (с acdbEntDel ()) не очищены, пока Вы не оставляете текущий рисунок (выходя Из AutoCAD или переключая к другому рисунку). Это означает, что acdbHandEnt () может возвращать названия{*имена*} удаленных примитивов, которые могут тогда быть восстановлены к рисунку вторым запросом к acdbEntDel ().
Примитивы в рисунках перекрестно ссылались с внешних ССЫЛОК, присоединяются не фактически часть текущего рисунка; их метки неизменны, и нельзя обращаться acdbHandEnt (). Однако, когда рисунки объединены посредством ВСТАВКИ, ВСТАВЬТЕ *, XREF Связывает (XBIND), или частичный DXFIN, метки примитивов в рисунке прихода потеряны, и входящие примитивы назначены новые значения маркера{*дескриптора*} гарантировать, что каждый маркер{*дескриптор*} в рисунке оригинала остается уникальным.
ОБРАТИТЕ ВНИМАНИЕ, что расширенные данные могут включать метки примитива, чтобы сохранить относительные структуры в рисунке. В некоторых обстоятельствах, эти метки требуют трансляции или обслуживания. См. “ Использование метки в Расширенных Данных ” на странице 240.
Контекст примитива и координатное преобразовывание данных
AcedNEntSelP () функция подобна acedEntSel (), за исключением того, что это передает два дополнительных параметра результата, чтобы облегчить обработку примитивов, которые вложены в пределах блок-ссылок.
ОБРАТИТЕ ВНИМАНИЕ На другое различие между acedNEntSelP () и acedEntSel () - то, что, когда пользователь отвечает на acedNEntSelP () запрос, выбирая сложный примитив, acedNEntSelP () возвращает выбранный подпримитив а не, заголовок сложного примитива как acedEntSel () делает. Например, когда пользователь выбирает ломаную линию, acedNEntSelP () возвращает подпримитив вершины вместо заголовка ломаной линии. Чтобы восстановить{*отыскивать*} заголовок ломаной линии, приложение должно использовать acdbEntNext () чтобы идти вперед к Seqend подпримитиву и получать имя заголовка от -2 группы Seqend подпримитива. Это истинно также, когда пользователь выбирает атрибуты во вложенной блок-ссылке и когда точка указки определена в acedNEntSelP () запрос.
Координатное Преобразование
Первый из дополнительных параметров, возвращенных acedNEntSelP () - 4x4 матрица преобразования типа ads_matrix. Эта матрица известна как Модель к Мировой Матрице преобразования. Это дает возможность приложению преобразовать точки в данные определения примитива (и расширенные{*продленные*} данные, если это присутствует) от образцовой системы координат примитива (MCS) в Мировую систему координат (WCS). MCS применяется{*обращается*} только к вложенным примитивам. Начало координат MCS - точка вставки блока, и его ориентация - таковой ВЕРХНИХ РЕГИСТРОВ, который был в действительности, когда блок был создан.
Если выбранный примитив - не, вложенный примитив, матрица преобразования установлен в единичную матрицу. Преобразование выражено следующим матричным умножением:
Индивидуальные координаты преобразованной точки получены от уравнений, где М. mn - Модель к Мировой Матрице преобразования, координирует, (X, Y, Z) - точка данных определения примитива, выраженная в координатах MCS, и (X ’, Y ’, Z ’) - заканчивающаяся точка данных определения примитива, выраженная в координатах WCS. См. “ Матрицы Преобразования ” на странице 535.
ПРИМЕЧАНИЕ, чтобы преобразовать вектор скорее чем точка, не добавьте вектор сдвига [М. 03 М. 13 М. 23] (от четвертого столбца матрицы преобразования).
Следующий типовой код определяет функцию, mcs2wcs (), который исполняет преобразования, описанные предшествующими уравнениями. Требуется матрица преобразования, возвращенная acedNEntSelP () и одиночной точкой (возможно от данных определения вложенного примитива), и возвращает оттранслированную точку.
Если третий параметр к mcs2wcs (), is_pt, установлен в 0 (ЛЖИ), последний{*прошлый*} столбец матрицы преобразования — вектор сдвига, или смещение — не добавлено к результату. Это дает возможность функции транслировать вектор также как точку.
X ’ | М00 М01 М02 М03 | X | ||
Y ’ | = | М10 М11 М12 М13 | x | Y |
Z ’ | М20 М21 М22 М23 | Z | ||
1.0 | 0.0 0.0 0.0 1.0 | 1.0 |
X ' = М. 00 X + М. 01 Y + М. 02 Z + М. 03
Y ' = М. 10 X + М. 11 Y + М. 12 Z + М. 13
Z ' = М. 20 X + М. 21 Y + М. 22 Z + М. 23.
Индивидуальные координаты преобразованной точки получены от уравнений, где М. mn - Модель к Мировой Матрице преобразования, координирует, (X, Y, Z) - точка данных определения примитива, выраженная в координатах MCS, и (X ’, Y ’, Z ’) - заканчивающаяся точка данных определения примитива, выраженная в координатах WCS. См. “ Матрицы Преобразования ” на странице 535.
ПРИМЕЧАНИЕ, чтобы преобразовать вектор скорее чем точка, не добавьте вектор сдвига [М. 03 М. 13 М. 23] (от четвертого столбца матрицы преобразования).
Следующий типовой код определяет функцию, mcs2wcs (), который исполняет преобразования, описанные предшествующими уравнениями. Требуется матрица преобразования, возвращенная acedNEntSelP () и одиночной точкой (возможно от данных определения вложенного примитива), и возвращает оттранслированную точку.
Если третий параметр к mcs2wcs (), is_pt, установлен в 0 (ЛЖИ), последний столбец матрицы преобразования — вектор сдвига, или смещение — не добавлено к результату. Это дает возможность функции транслировать вектор также как точку.
void mcs2wcs(xform, entpt, is_pt, worldpt)
ads_matrix xform;
ads_point entpt, worldpt;
int is_pt;
{
int i, j;
worldpt[X] = worldpt[Y] = worldpt[Z] = 0.0;
for (i=X; i<=Z; i++)
for (j=X; j<=Z; j++)
worldpt[i] += xform[i][j] * entpt[j];
if (is_pt) // If it’s a point, add in the displacement
for (i=X; i<=Z; i++)
worldpt[i] += xform[i][T];
}
Следующий кодовый фрагмент показывает, как mcs2wcs () мог бы использоваться в конъюнкции с acedNEntSelP () чтобы транслировать значения точки в поток WCS.
ads_name usrent, containent;
ads_point usrpt, defpt, wcspt;
ads_matrix matrix;
struct resbuf *containers, *data, *rb, *prevrb;
status = acedNEntSelP(NULL, usrent, usrpt, FALSE, matrix,
&containers);
if ((status!= RTNORM) || (containers == NULL))
return BAD;
data = acdbEntGet(usrent);
// Extract a point (defpt) from the data obtained by calling
|
Из за большого объема этот материал размещен на нескольких страницах:
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 |


