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

       

Списки Фильтра Набора Выбора


Когда entmask параметр определяет, что список значений поля примитива, acedSSGet () просматривает выбранные примитивы и создает набор выборов, содержащий названия{*имена*} всех основных примитивов, которые соответствуют{*согласовывают*} указанным критериям. Например, используя этот механизм, Вы можете получить набор выборов, который включает все примитивы данного типа, на данном уровне, или данного цвета.

Вы можете использовать фильтр вместе с любой из опций выбора. Опция “X” говорит, что создала набор выборов, используя только фильтрация; как в предыдущих версиях AutoCAD, если Вы используете,  опция “X”, acedSSGet () просматривает полную базу данных рисунка.

ОБРАТИТЕ ВНИМАНИЕ, определена ли только фильтрация (“X”) но entmask параметр - NULL, acedSSGet () выбирает все примитивы в базе данных.

Entmask параметр должен быть список буфера результата. Каждый буфер определяет свойство, чтобы проверить{*отметить*} и значение, которое составляет соответствие; restype поле буфера - код группы DXF, который указывает вид свойства, чтобы смотреть для, и его resval поле определяет значение, чтобы соответствовать{*согласовать*}.

Следующее - некоторые примеры.

struct resbuf eb1, eb2, eb3;

char sbuf1[10], sbuf2[10]; // Buffers to hold strings

ads_name ssname1, ssname2;

eb1.restype = 0;// Entity name

strcpy(sbuf1, "CIRCLE");

eb1.resval.rstring = sbuf1;

eb1.rbnext = NULL; // No other properties

// Retrieve all circles.

acedSSGet("X", NULL, NULL, &eb1, ssname1);

eb2.restype = 8; // Layer name

strcpy(sbuf2, "FLOOR3");

eb2.resval.rstring = sbuf2;

eb2.rbnext = NULL; // No other properties

// Retrieve all entities on layer FLOOR3.

acedSSGet("X", NULL, NULL, &eb2, ssname2);

ОБРАТИТЕ ВНИМАНИЕ resval, указанный в каждом буфере должен иметь соответствующий тип.

Например, типы имени - строки (resval.rstring); повышение и толщина - с двойной точностью с плавающей точкой значения (resval.rreal); цвет, признаки - следуйте, и пометьте значения - короткие целые числа (resval.rint); векторы вытеснения - трехмерные точки (resval.rpoint); и т.д.


Если entmask определяет больше чем одно свойство, примитив включен в выбор, устанавливают только, если это соответствует всем указанным условиям{*состояниям*}, как показано в следующем примере:

eb3.restype = 62; // Entity color

eb3.resval.rint = 1; // Request red entities.

eb3.rbnext = NULL; // Last property in list

eb1.rbnext = &eb2; // Add the two properties

eb2.rbnext = &eb3; // to form a list.

// Retrieve all red circles on layer FLOOR3.

acedSSGet("X", NULL, NULL, &eb1, ssname1);

Примитив проверен против всех полей, указанных в списке фильтрации, если список не содержит относительные или условные операторы, как описано в “ Относительные Испытания ” на странице 207 и “ Фильтрация Условного выражения ” на странице 208.

AcedSSGet () функциональные возвращения RTERROR, если никакие примитивы в базе данных не соответствуют{*согласовывают*} указанным критериям фильтрации.

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

Следующее - пример фильтрации выбранных пользователем примитивов.

eb1.restype = 0; // Entity type group

strcpy(sbuf1, "TEXT");

eb1.resval.rstring = sbuf1; // Entity type is text.

eb1.rbnext = NULL;

// Ask the user to generally select entities, but include

// only text entities in the selection set returned.

acedSSGet(NULL, NULL, NULL, &eb1, ssname1);

Следующий пример демонстрирует фильтрацию предыдущего набора выборов.

eb1.restype = 0; // Entity type group

strcpy(sbuf1, "LINE");

eb1.resval.rstring = sbuf1; // Entity type is line.

eb1.rbnext = NULL;

// Select all the lines in the previously created selection set.

acedSSGet("P", NULL, NULL, &eb1, ssname1);

eb1.restype = 8; // Layer

strcpy(sbuf1, "FLOOR9");

eb1.resval.rstring = sbuf1; // Layer name

eb1.rbnext = NULL;

// Select all the entities within the window that are also on the layer FLOOR9.

acedSSGet("W", pt1, pt2, &eb1, ssname1);

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

 


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