{
// Set the dialog name for registry lookup and storage
//
SetDialogName("AsdkAcUiSample:AsdkAcUiDialog");
CAcUiDialog::OnInitDialog();
DLGCTLINFOdlgSizeInfo[]= {
{ IDC_STATIC_GROUP1, ELASTICX, 20 },
{ IDC_STATIC_GROUP1, ELASTICY, 100 },
{ IDC_EDIT_XPT, ELASTICX, 20 },
{ IDC_EDIT_YPT, ELASTICX, 20 },
{ IDC_EDIT_ZPT, ELASTICX, 20 },
{ IDC_EDIT_ANGLE, ELASTICX, 20 },
{ IDC_STATIC_GROUP2, MOVEX, 20 },
{ IDC_STATIC_GROUP2, ELASTICY, 100 },
{ IDC_STATIC_GROUP2, ELASTICX, 80 },
{ IDC_LIST_BLOCKS, MOVEX, 20 },
{ IDC_LIST_BLOCKS, ELASTICY, 100 },
{ IDC_STATIC_TEXT2,MOVEX, 20 },
{ IDC_STATIC_TEXT2,MOVEY, 100 },
{ IDC_LIST_BLOCKS, ELASTICX, 80 },
{ IDC_STATIC_TEXT2,ELASTICX, 80 },
{ IDC_STATIC_GROUP3, MOVEY, 100 },
{ IDC_STATIC_GROUP3, ELASTICX, 20 },
{ IDC_COMBO_REGAPPS, MOVEY, 100 },
{ IDC_COMBO_REGAPPS, ELASTICX, 20 },
{ IDC_STATIC_TEXT3,MOVEY, 100 },
{ IDC_STATIC_TEXT3,ELASTICX, 20 },
{ IDOK, MOVEX, 100 },
{ IDCANCEL, MOVEX, 100 },
};
const DWORD numberofentries =
sizeof dlgSizeInfo / sizeof DLGCTLINFO;
SetControlProperty(dlgSizeInfo, numberofentries);
// Must be within a 100-unit cube centered about 0,0,0.
//
m_ctrlXPtEdit. SetRange(-50.0, 50.0);
m_ctrlYPtEdit. SetRange(-50.0, 50.0);
m_ctrlZPtEdit. SetRange(-50.0, 50.0);
// Must be between 0 and 90 degrees.
//
m_ctrlAngleEdit. SetRange(0.0, 90.0 /*(PI/2.0)*/);
// Assign a title for the dialog.
//
SetWindowText("AcUiDialog Sample");
// Load the default bitmaps.
//
m_ctrlPickButton. AutoLoad();
m_ctrlAngleButton. AutoLoad();
// Get and display the preserved data from the registry.
//
if (!GetDialogData("ANGLE", m_strAngle))
m_strAngle = "0.0";
if (!GetDialogData("POINTX", m_strXPt))
m_strXPt = "0.0";
if (!GetDialogData("POINTY", m_strYPt))
m_strYPt = "0.0";
if (!GetDialogData("POINTZ", m_strZPt))
m_strZPt = "0.0";
DisplayPoint();
DisplayAngle();
DisplayBlocks();
DisplayRegApps();
return TRUE; // return TRUE unless you set the focus to a control
}
Глава 9. Наборы выборов, примитивы и функции таблиц идентификаторов
Глобальные функции, описанные в этой главе обрабатывают наборы выбора, рисуют примитивы и таблицы идентификаторов. См. Руководство Настройки AutoCAD для основной информации на этих темах.
§ Набор выборов и имена примитивов
§ Обработка Наборов Выбора
§ Имя Примитива и Функции Данных
§ Доступ Таблицы идентификаторов
Набор Выборов и имена Примитива
Большинство функций ObjectARX, которые обрабатывают наборы выбора и примитивы, идентифицирует{*выделяет*} набор или примитив его именем, которое является парой longs, назначенного и поддерживаемого AutoCAD. В ObjectARX, названия{*имена*} наборов выбора и примитивов имеют соответствующий тип ads_name.
Прежде, чем это может управлять набором выборов или примитивом, приложение ObjectARX должно получить текущее имя набора или примитива, вызывая одну из библиотечных функций, который возвращает набор выборов или имя примитива.
ОБРАТИТЕ ВНИМАНИЕ на набор Выборов, и названия{*имена*} примитива энергозависимы; они применяются только, в то время как Вы работаете над рисунком к AutoCAD, и они потеряны при выходе от AutoCAD или переключения к другому рисунку.
Для наборов выбора, которые также применяются только к текущему сеансу, энергозависимость названий{*имен*} не излагает никакую проблему, но для примитивов, которые сохранены в базе данных рисунка, это делает. Приложение, которое должно обратиться{*отнестись*} в разное время к тем же самым примитивам в том же самом рисунке (или рисунки), может использовать маркеры{*дескрипторы*} примитива, описанные в “ Маркеры{*дескрипторы*} Примитива и Их Использования ” на странице 216.
Обработка Наборов Выбора
Функции 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 сообщение.
Списки Фильтра Набора Выбора
Когда entmask параметр определяет, что список значений поля примитива, acedSSGet () просматривает выбранные примитивы и создает набор выборов, содержащий названия{*имена*} всех основных примитивов, которые соответствуют{*согласовывают*} указанным критериям. Например, используя этот механизм, Вы можете получить набор выборов, который включает все примитивы данного типа, на данном уровне, или данного цвета.
|
Из за большого объема этот материал размещен на нескольких страницах:
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 |


