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

Обработка Наборов Выбора


Функции ObjectARX, которые обрабатывают наборы выбора,  подобны тем в AutoLISP. AcedSSGet () функция обеспечивает большинство общих средств создания набора выборов. Это создает набор выборов способом из трех путей:

§

Подсказка пользователя, чтобы выбрать объекты.

§         Явно определяющий примитивы, чтобы выбрать,  используя набор PICKFIRST или Пересечение, Многоугольник Пересечения, Заграждающую метку, Последнюю{*прошлую*}, Предыдущую, Окно, или опции Window Polygon (как в интерактивном использовании AutoCAD), или,  определяя одиночную точку или заграждающую метку точек.

§         Фильтрация базы данных текущего рисунка,  определяя список атрибутов и условий, которым выбранные примитивы должны соответствовать. Вы можете использовать фильтры с любой из предыдущих опций.

int

acedSSGet (

const char *str,

const void *pt1,

const void *pt2,

const struct resbuf *entmask,

ads_name ss);

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



Selection options for acedSSGet

Selection

 Code Description

NULL

Single-point selection (if pt1 is specified) or user selection (if pt1 is also NULL)

#

 Nongeometric (all, last, previous)

:$

Prompts supplied

.

User p ick

:?

 Other callbacks

A

All

B

Box

C

Crossing

CP

Crossing Polygon

:D

 Duplicates OK

:E

 Everything in aperture

F

 Fence

G

 Groups

I

 Implied

:K

 Keyword callbacks

L

 Last

M

 Multiple

P

 Previous

:S

 Force single object selection only

W

Window

WP

 Window Polygon

X

 Extended search (search whole database)

Следующие два параметра определяют значения точки для уместных опций. (Они должны быть NULL, если они не применяются.) Если четвертый параметр, entmask, - не NULL, это указывает на список значений поля примитива, используемых в фильтрации. Пятый параметр, ss, идентифицирует имя набора выбора.


Следующий код показывает представителю, вызывает к acedSSGet (). Как acutBuildList () запрос иллюстрирует, для “CP” опций многоугольника, и “ПОДГОТОВКА ТЕКСТОВ” (но не для “F”), acedSSGet () автоматически закрывает список точек. Вы не должны формировать список, который определяет конечную точку, идентичную первому.

ads_point pt1, pt2, pt3, pt4;

struct resbuf *pointlist;

ads_name ssname;

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

pt2[X] = pt2[Y] = 5.0; pt2[Z] = 0.0;

// Get the current PICKFIRST set, if there is one;

// otherwise, ask the user for a general entity selection.

acedSSGet(NULL, NULL, NULL, NULL, ssname);

// Get the current PICKFIRST set, if there is one.

acedSSGet("I", NULL, NULL, NULL, ssname);

// Selects the most recently selected objects.

acedSSGet("P", NULL, NULL, NULL, ssname);

// Selects the last entity added to the database.

acedSSGet("L", NULL, NULL, NULL, ssname);

// Selects entity passing through point (5,5).

acedSSGet(NULL, pt2, NULL, NULL, ssname);

// Selects entities inside the window from (0,0) to (5,5).

acedSSGet("W", pt1, pt2, NULL, ssname);

// Selects entities enclosed by the specified polygon.

pt3[X] = 10.0; pt3[Y] = 5.0; pt3[Z] = 0.0;

pt4[X] = 5.0; pt4[Y] = pt4[Z] = 0.0;

pointlist = acutBuildList(RTPOINT, pt1, RTPOINT, pt2,

RTPOINT, pt3, RTPOINT, pt4, 0);

acedSSGet("WP", pointlist, NULL, NULL, ssname);

// Selects entities crossing the box from (0,0) to (5,5).

acedSSGet("C", pt1, pt2, NULL, ssname);

// Selects entities crossing the specified polygon.

acedSSGet("CP", pointlist, NULL, NULL, ssname);

acutRelRb(pointlist);

// Selects the entities crossed by the specified fence.

pt4[Y] = 15.0; pt4[Z] = 0.0;

pointlist = acutBuildList(RTPOINT, pt1, RTPOINT, pt2,

RTPOINT, pt3, RTPOINT, pt4, 0);

acedSSGet("F", pointlist, NULL, NULL, ssname);

acutRelRb(pointlist);



Дополнение acedSSGet () - acedSSFree (), который выпускает набор выборов, как только приложение закончило использовать это. Набор выборов определен по имени. Следующий кодовый фрагмент использует ads_name объявление от предыдущего примера.

acedSSFree(ssname);

ПРИМЕЧАНИЕ AutoCAD не может иметь больше чем 128 наборов выбора, открытые сразу. Этот предел включает наборы выбора, открытые всего одновременно выполняющиеся приложения ObjectARX и AutoLISP. Предел может быть отличен на вашей системе. Если предел достигнут, AutoCAD отказывается создавать большее количество наборов выбора. Одновременно управление большим количеством наборов выбора не рекомендуется. Вместо этого, сохраните разумное число наборов, открытых в любое данное время, и вызовите acedSSFree () чтобы освободить неиспользованные наборы выбора как можно скорее. В отличие от AutoLISP, ObjectARX среда не имеет никакой автоматической сборки "мусора", чтобы освободить наборы выбора после того, как они использовались. Приложение должно всегда освобождать его открытые наборы выбора, когда это получает kUnloadDwgMsg, kEndMsg, или kQuitMsg сообщение.


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