Вы можете использовать фильтр вместе с любой из опций выбора. Опция “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 () возвращается.

Образцы Подстановочных знаков в Списках Фильтра

Названия{*имена*} Символа, указанные в списках фильтра могут включать образцы подстановочных знаков. Образцы подстановочных знаков, признанные acedSSGet () - тот же самый как признанные функцией acutWcMatch ().

Следующий типовой код отыскивает анонимный блок, названный *U2.

eb2.restype = 2; // Block name

strcpy(sbuf1, "’*U2"); // Note the reverse quote.

eb2.resval. rstring = sbuf1; // Anonymous block name

eb2.rbnext = NULL;

// Select Block Inserts of the anonymous block *U2.

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

Фильтрация для Расширенных Данных

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

Размер расширенных данных - байты 16КБ.

Вы можете отыскивать расширенные данные для специфического приложения, определяя его имя в списке фильтра, используя -3 код группы. AcedSSGet () функциональные примитивы возвращений с расширенными данными, зарегистрированными к указанному имени; acedSSGet () не отыскивает индивидуума, расширил элементы данных (с кодами группы в диапазоне 1000-2000).

Следующий типовой кодовый фрагмент выбирает все круги, которые расширили данные, зарегистрированные на приложение, чей ИДЕНТИФИКАТОР - “APPNAME”.

eb1.restype = 0; // Entity type

strcpy(sbuf1, "CIRCLE");

eb1.resval. rstring = sbuf1; // Circle

eb1.rbnext = &eb2;

eb2.restype = -3; // Extended data

eb2.rbnext = &eb3;

eb3.restype = 1001;

strcpy(sbuf2, "APPNAME");

eb3.resval. rstring = sbuf2; // APPNAME application

eb3.rbnext = NULL;

// Select circles with XDATA registered to APPNAME.

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

Если больше чем одно прикладное имя включены в список, acedSSGet () включает примитив в выбор, устанавливают только, если это расширило{*продлило*} данные для всех указанных приложений. Например, следующий код выбирает круги расширенными{*продленными*} данными, зарегистрированными к “APP1” и “APP2”.

eb1.restype = 0; // Entity type

strcpy(sbuf1, "CIRCLE");

eb1.resval. rstring = sbuf1; // Circle

eb1.rbnext = &eb2;

eb2.restype = -3; // Extended data

eb2.rbnext = &eb3;

eb3.restype = 1001;

strcpy(sbuf2, "APP1");

eb2.resval. rstring = sbuf2; // APP1 application

eb2.rbnext = &eb4;

eb4.restype = 1001; // Extended data

strcpy(sbuf3, "APP2");

eb4.resval. rstring = sbuf3; // APP2 application

eb4.rbnext = NULL;

// Select circles with XDATA registered to APP1 & APP2.

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

Вы можете определить прикладные названия, использующие строки подстановочных знаков, так что Вы можете искать данные множественных приложений в одно время. Например, следующий код выбирает все круги расширенными данными, зарегистрированными к “APP1” или “APP2” (или оба).

eb1.restype = 0; // Entity type

strcpy(sbuf1, "CIRCLE");

eb1.resval. rstring = sbuf1; // Circle

eb1.rbnext = &eb2;

eb2.restype = -3; // Extended data

eb2.rbnext = &eb3;

eb3.restype = 1001; // Extended data

strcpy(sbuf2, "APP1,APP2");

eb3.resval. rstring = sbuf2; // Application names

eb3.rbnext = NULL;

// Select circles with XDATA registered to APP1 or APP2.

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

Следующая строка находит расширенные данные того же самого приложения.

strcpy(sbuf2, "APP[12]");

Относительные Испытания

Если Вы не определяете иначе, имеется подразумеваемый ", “равняется" испытанию между примитивом и каждым элементом{*пунктом*} в списке фильтра. Для числовых групп (целые числа, реальные значения, точки, и векторы), Вы можете определить другие отношения включением относительных операторов в списке фильтра. Относительные операторы пропускают как специальные -4 группа, чей значение - строка, которая указывает испытание, которое нужно применить к следующей группе в списке фильтра.

Следующий типовой код выбирает все круги, чей радиус больший чем или равняются 2.0:

eb3.restype = 40; // Radius

eb3.resval. rreal = 2.0;

eb3.rbnext = NULL;

eb2.restype = -4; // Filter operator

strcpy(sbuf1, ">=");

eb2.resval. rstring = sbuf1; // Greater than or equals

eb2.rbnext = &eb3;

eb1.restype = 0; // Entity type

strcpy(sbuf2, "CIRCLE");

eb1.resval. rstring = sbuf2; // Circle

eb1.rbnext = &eb2;

// Select circles whose radius is >= 2.0.

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

Условная Фильтрация

Относительные операторы, только описанные - двоичные операторы. Вы можете также проверять группы, создавая вложенные выражения Boolean те операторы условного выражения использования. Условные операторы также определены -4 группами, но они должны быть соединены.

Следующий типовой код выбирает все круги в рисунке к радиусу 1.0 и всем линиям на уровне “ABC”.

eb1 = acutBuildList(-4, "<or",-4, "<and", RTDXF0,

"CIRCLE", 40, 1.0, -4, "and>", -4, "<and", RTDXF0,

"LINE", 8, "ABC", -4, "and>", -4, "or>", 0);

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

Условные операторы не чувствительны к регистру; Вы можете использовать эквиваленты нижнего регистра.

ОБРАТИТЕ ВНИМАНИЕ на выражения Conditional, которые проверяют на расширенные данные, использующие -3 группа, может содержать только -3 группы. См. “ Фильтрующий для Расширенных Данных ” на странице 206.

К выделите всё кругам, которые расширили{*продлили*} данные, зарегистрированные или на “APP1” или “APP2”, но не оба, Вы могли использовать следующий код.

eb1 = acutBuildList(-4, "<xor", -3, "APP1", -3, "APP2", -4, "xor>", 0);

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