// acdbEntGet() for the selected kind of entity.

.

.

.

mcs2wcs(matrix, defpt, TRUE, wcspt);

AcedNEntSelP () функция также позволяет программе определять точку указки. Pickflag параметр определяет, действительно ли acedNEntSelP () называется в интерактивном режиме.

В следующем примере, acedNEntSelP () запрос определяет его собственную точку для выбора примитива и не запрашивает пользователя. Pickflag параметр ИСТИНЕН, чтобы указать, что запрос поставляет{*снабжает*} его собственному значению точки (также, подсказка - NULL).

ads_point ownpoint;

ownpoint[X] = 2.7; ownpoint[Y] = 1.5; ownpoint[Z] = 0.0;

status = acedNEntSelP(NULL, usrent, ownpt, TRUE, matrix, &containers);

AcedNEntSel () функция обеспечивается для совместимости с существующими ObjectARX-приложениями. Новые приложения должны быть написаны, используя acedNEntSelP ().

Модель к Мировой Матрице преобразования, возвращенной запросом к acedNEntSel () имеет ту же самую цель как возвращенное acedNEntSelP (), но это - 4x3, матрица — прошла как массив четырех точек —, который использует соглашение, что точка - строка скорее чем столбец. Преобразование описано следующим матричным умножением:

М00 М01 М02 М03

X' Y' Z' 1.0 = X Y Z 1.0 x

М10 М11 М12 М13

М20 М21 М22 М23

0.0 0.0 0.0 1.0

Хотя матричный формат различен, формулы эквивалентны, те для типа ads_matrix, и единственного изменения{*замены*}, требуемого, чтобы приспособить mcs2wcs () для использования с acedNEntSel () должны объявить матричный параметр как массив четырех точек.

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

void mcs2wcs(xform, entpt, is_pt, worldpt);

ads_point xform[4]; // 4x3 version

ads_point entpt, worldpt;

int is_pt;

Форма тождества 4x3 матрица следующие:

1 0 0

0 1 0

0 0 1

0 0 0

В дополнение к использованию различного матричного соглашения, acedNEntSel () не позволяет программе определять точку указки.

Контекстные Данные

Функция acedNEntSelP () обеспечивает параметр для контекстных данных, refstkres. (Это - другая особенность, не обеспеченная acedEntSel ()). Refstkres параметр - указатель на список связей буферов результатов, который содержит названия{*имена*} контейнерных блоков примитива. Список заказывается{*упорядочивает*} от самого низкого до самого высокого. Другими словами, имя в списке - имя блока, содержащего выбранный примитив, и фамилия в списке - имя блока, который был непосредственно вставлен в рисунок. Следующий рисунок показывает формат этого списка.

Если выбранный примитив entres - не, вложенный примитив, refstkres - указатель NULL. Это - удобный способ проверить, действительно ли координаты примитива должны быть оттранслированы. (Поскольку xformres возвращен как единичная матрица для примитивов, которые не вложены, применяя это к координатам таких примитивов не никакой вред, но стоит некоторое бесполезное время выполнения.)

Используя объявления от предыдущего acedNEntSelP () пример, имя блока, который немедленно содержит выбранный пользователем примитив, может быть найден следующим кодом (в acedNEntSelP () запрос, pickflag параметр - FALSE для интерактивного выбора).

status = acedNEntSelP(NULL, usrent, usrpt, FALSE, matrix,

&containers);

if ((status!= RTNORM) || (containers == NULL))

return BAD;

containent[0] = containers->resval. rlname[0];

containent[1] = containers->resval. rlname[1];

Имя наиболее удаленного контейнера (то есть примитив, первоначально вставленный в рисунок) может быть найдено последовательностью типа следующего:

// Проверить это, контейнеры не уже NULL.

rb = containers;

while (rb!= NULL) {

prevrb = rb;

rb = containers->rbnext;

}

// Буфер результатов, указанный prevrb теперь содержит имя наиболее удаленного блока.

В следующем примере, текущая система координат - WCS. Использование AutoCAD, создайте блок по имени КВАДРАТ, состоящий из четырех линий.

Command: line

From point: 1,1

To point: 3,1

To point: 3,3

To point: 1,3

To point: c

Command: block

Block name (or?): square

Insertion base point: 2,2

Select objects: Select the four lines you just drew

Select objects: ENTER

Тогда вставьте блок в UCS, вращал 45 градусов относительно Z оси.

Command: ucs

Origin/ZAxis/3point/Entity/View/X/Y/Z/Prev/Restore/Save/Del/?/

<World>: z

Rotation angle about Z axis <0>: 45

Command: insert

Block name (or?): square

Insertion point: 7,0

X scale factor <1> / Corner / XYZ: ENTER

Y scale factor (default=X): ENTER

Rotation angle: ENTER

Если ObjectARX-приложение вызывает acedNEntSelP () (или acedNEntSel ()) и пользователь выбирает левую нижнюю сторону квадрата, эти функции заставляют entres параметр равняться имени выбранной линии. Они устанавливают точку указки (ptres) в (6.46616, -1.0606,0.0) или близлежащее значение точки. Они возвращают матрицу преобразования (xformres) как показано в следующем рисунке.

Наконец, они заставляют список контейнерных примитивов (refstkres) направлять на одиночный буфер результатов содержащий имени примитива блока SQUARE.

0.707107

-0.707107

0.0

4.94975

0.707107

0.707107

0.0

0.707107

0.707107

-0.0

4.94975

-0.707107

0.707107

0.0

0.0

0.0

1.0

0.0

0.0

-0.0

1.0

0.0

0.0

0.0

1.0

4.94975

4.94975

0.0

ads_nentselp() result ads_nentsel() result

Функции Данных Примитива

Некоторые функции работают на данных примитива и могут использоваться, чтобы изменить базу данных текущего рисунка. AcdbEntDel () функция удаляет указанный примитив. Примитив не очищен от базы данных, пока Вы не оставляете текущий рисунок.

Так, если приложение вызывает acdbEntDel () второй раз в течение того сеанса и определяет тот же самый примитив, примитив восстановлен. (Вы можете использовать acdbHandEnt () чтобы восстановить{*отыскать*} названия{*имена*} удаленных примитивов.)

ОБРАТИТЕ ВНИМАНИЕ На использование acdbEntDel (), атрибуты, и вершина ломаной линии не может быть удалена независимо от их родительских примитивов; acdbEntDel () работает только на основных примитивах. Чтобы удалять атрибут или вершину, используйте acedCommand () или acedCmd () чтобы вызвать AutoCAD ATTEDIT или команды PEDIT, используйте acdbEntMod () чтобы переопределить примитив без нежелательных подпримитивов, или откройте вершину, или припишите, и используйте ее стирание () метод стереть это.

AcdbEntGet () функция возвращает данные определения указанного примитива.

Данные возвращены как список связей буферов результатов. Тип каждого элемента (буфер) в списке определен кодом группы DXF. Первый элемент в списке содержит текущее имя примитива (restype == -1).

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

void getlast()

{

struct resbuf *ebuf, *eb;

ads_name ent1;

acdbEntLast(ent1);

ebuf = acdbEntGet(ent1);

eb = ebuf;

acutPrintf("\nResults of entgetting last entity\n");

// Print items in the list.

for (eb = ebuf; eb!= NULL; eb = eb->rbnext)

printdxf(eb);

// Release the acdbEntGet() list.

acutRelRb(ebuf);

}

int printdxf(eb)

struct resbuf *eb;

{

int rt;

if (eb == NULL)

return RTNONE;

if ((eb->restype >= 0) && (eb->restype <= 9))

rt = RTSTR ;

else if ((eb->restype >= 10) && (eb->restype <= 19))

rt = RT3DPOINT;

else if ((eb->restype >= 38) && (eb->restype <= 59))

rt = RTREAL ;

else if ((eb->restype >= 60) && (eb->restype <= 79))

rt = RTSHORT ;

else if ((eb->restype >= 210) && (eb->restype <= 239))

rt = RT3DPOINT ;

else if (eb->restype < 0)

// Entity name (or other sentinel)

rt = eb->restype;

else

rt = RTNONE;

switch (rt) {

case RTSHORT:

acutPrintf("(%d . %d)\n", eb->restype,

eb->resval. rint);

break;

case RTREAL:

acutPrintf("(%d . %0.3f)\n", eb->restype,

eb->resval. rreal);

break;

case RTSTR:

acutPrintf("(%d . \"%s\")\n", eb->restype,

eb->resval. rstring);

break;

case RT3DPOINT:

acutPrintf("(%d . %0.3f %0.3f %0.3f)\n",

eb->restype,

eb->resval. rpoint[X], eb->resval. rpoint[Y],

eb->resval. rpoint[Z]);

break;

case RTNONE:

acutPrintf("(%d . Unknown type)\n", eb->restype);

break;

case -1:

case -2:

// First block entity

acutPrintf("(%d . <Entity name: %8lx>)\n", eb->restype, eb->resval. rlname[0]);

}

return eb->restype;

}

В следующем примере, следующие (заданные по умолчанию) условия{*состояния*} обращаются к текущему рисунку.

§  текущий уровень - 0

§  linetype - НЕПРЕРЫВЕН

§  текущее повышение - 0

§  маркеры примитива заблокированы

Также, пользователь рисовал линию со следующей последовательностью команд:

Command: line

From point: 1,2

To point: 6,6

To point: ENTER

Тогда запрос к getlast () печатал бы следующий (значение имени изменится).

Результат выполнения acdbEntGet () для последнего примитива:

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