Эти функции не делают почти никакое сообщение ошибки и могут повреждать графическое экранное устройство отображения (см. пример для способа установить эту проблему).

Следующее повреждение при смене графического экранного устройства отображения вызвано неправильным обращением к acedGrText (), acedGrDraw (), или acedGrVecs ().

acedGrText (-3, NULL, 0);

acedRedraw (NULL, 0);

Параметры к acedGrText () имеют следующие значения: -3 восстановление стандартного текста, NULL == никакой новый текст, и 0 == никакое высвечивание. Параметры к acedRedraw() имеют следующие значения: NULL == все примитивы, и 0 == вся область просмотра.

Калибровка Таблетки

Пользователи AutoCAD с таблеткой отцифровывания могут калибровать таблетку, используя команду TABLET. С acedTablet () функция, приложения может управлять калибровками, устанавливая их непосредственно и сохраняя назначения калибровки для будущего использования. Функция берет два параметра, список и результат, каждый из которых - список буфера результата. Первый буфер результатов в первом списке - целочисленный код, который должен быть 0, чтобы отыскать текущую калибровку (в результате), или 1, чтобы установить калибровку согласно остающимся буферам в списке. Калибровки выражены как четыре трехмерных точки (в дополнение к коду). Первые три из них - направляющие — row1, row2, и row3 — три строки матрицы преобразования таблетки. Четвертая точка - вектор, направление, которое является нормальным на план поверхности таблетки (выраженное в WCS).

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

ОБРАТИТЕ ВНИМАНИЕ На TABMODE средство управления переменной системы, установлен ли режим Tablet в На (1) или От (0). Вы можете управлять это, используя acedSetVar().

Следующая последовательность кода отыскивает текущую калибровку таблетки, и сохраняет это в calibr2. В этом примере, пользователь использовал команду TABLET, чтобы калибровать матрицу, и режим Tablet включен.

struct resbuf *calibr1, *calibr2;

struct resbuf varbuf, rb;

// Retrieve the current calibration.

calibr1 = acutBuildList(RTSHORT, 0, RTNONE);

if (acedTablet(calibr1, &calibr2) != RTNORM) {

acdbFail("Calibration not obtainable\n");

return BAD;

}

Код, возвращенный в параметре результата, calibr2 в примере, автоматически установлен в 1. Чтобы сбрасывать калибровку к значениям, отысканным предшествующим примером, Вы могли использовать следующий код:

if (acedTablet(calibr2, &calibr1) != RTNORM) {

acdbFail("Couldn’t reset calibration\n");

return BAD;

}

rb. restype = RTSHORT;

rb. resval. rint = 1;

acedSetVar("TABMODE", &rb);

acedGetVar("TABMODE" &varbuf);

if (varbuf. resval. rint == 0) {

acdbFail("Couldn’t set TABMODE\n");

return BAD;

}

В этом примере, calibr1 теперь содержит результат калибровки. Поскольку это возможно идентично calibr2 (который был инициализирован acedTablet ()), Вы не обязательно нуждаетесь в этом результате. Когда Вы устанавливаете калибровку, Вы можете определить результат NULL, который заставляет acedTablet () устанавливать калибровку “ тихо. ”

if (acedTablet(calibr2, NULL) != RTNORM) { . . . }

Матрица преобразования прошла, поскольку row1, row2, и row3 - 3x3, матрица преобразования хотела преобразовать 2-ую точку. 2-ая точка выражена как вектор столбца в гомогенных координатах (добавляя 1.0 как третий элемент), так что преобразование напоминает это:

X'

M 00 M 01 M 02

X'

Y'

=

M 10 M 11 M 12

x

Y'

D'

M 20 M 21 1.0

1.0

Вычисление точки подобно трехмерному случаю. AutoCAD преобразовывает точку, используя следующие формулы:

X' = M 00 X + M 01 Y + M 02

Y' = M 10 X + M 11 Y + M 12

D' = M 20 X + M 21 Y + 1.0

Чтобы поворачивать заканчивающийся вектор назад в 2-ую точку, первые два компонента разделены третью, коэффициентом масштаба, выдавая точку D ' (X '/D ', Y '/D ').

Для проективного преобразования, которое является, большинство общего случая, acedTablet () делает полное вычисление. Но для афинных и ортогональных преобразований, и - оба 0, удет быть 1.0 - также.

Вычисление опущено; заканчивающаяся 2-ая точка - просто.

Афинное преобразование - специальный, однородный случай проективного преобразования. Ортогональное преобразование - специальный случай афинного преобразования: не только являются и 0, но и и.

М. 20 М. 21 D '

( X ', Y ')

М. 20 М. 21 М. 00 = М. 11

М. 10 = - М. 01

ОБРАТИТЕ ВНИМАНИЕ, когда Вы устанавливаете калибровку, результат не равняется параметру списка, если направление в списке не было нормализовано; AutoCAD нормализует вектор направления прежде, чем это возвращает это. Также, это гарантирует, что третий элемент в третьем столбце (row3 [Z]) равен 1. Эта ситуация не должна возникнуть, если Вы устанавливаете калибровку, используя значения, отысканные из AutoCAD посредством acedTablet (). Однако, это может случаться, если ваша программа вычисляет преобразование непосредственно.

Сопоставление подстановочных знаков

AcutWcMatch() функция позволяет приложениям сравнить строку с образцом подстановочных знаков. Это средство может использоваться при формировании набора выборов (в конъюнкции с acedSSGet ()) и при поиске расширенных данных примитива прикладным именем (в конъюнкции с acdbEntGetX ()).

AcutWcMatch () функция сравнивает отдельную строку с образцом, и возвращает RTNORM, если строка соответствует образцу, и RTERROR, если это делает нет.

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

В следующих примерах, строковая переменная вызвала matchme, был объявлен и инициализирован. Следующий запрос проверяет, начинается ли matchme с этих пяти символов “allof”.

if (acutWcMatch(matchme, "allof*") == RTNORM) {

.

.

.

}

Следующий запрос иллюстрирует использование скобок в образце. В этом случае, acutWcMatch () возвращает RTNORM, если matchme равняется “STR1”, “STR2”, “STR3”, или “STR8”.

if (acutWcMatch(matchme, "STR[1-38]") == RTNORM) {

.

.

.

}

Строка образца может определить множественные образцы, отделенные запятыми. Следующий запрос возвращает RTNORM, если matchme равняется “ABC”, если это начинается с “XYZ”, или если это заканчивается “123”.

if (acutWcMatch(matchme, "ABC, XYZ*,*123") == RTNORM) {

.

.

.

}

AcutWcMatchEx () функция подобна acutWcMatch (), но это имеет дополнительный параметр, чтобы позволить этому игнорировать регистр.

bool

acutWcMatchEx(

const char * string,

const char * pattern,

bool ignoreCase);

Часть 3. Определение новых классов

Глава 11. Получение заказного класса ObjectARX

Эта глава описывает, как использовать макрокоманды ObjectARX, чтобы упростить задачу получения заказного ObjectARX класса. Эти макрокоманды позволяют заказному классу участвовать в AcRxObject механизме идентификации типа во время выполнения. Если Вы не должны отличить ваш заказной класс во время выполнения, Вы можете использовать стандартный стиль образования C++, чтобы создать новый класс.

·  Заказное Образование Класса

·  Идентификация Класса Во время выполнения

·  Макрокоманда Объявления Класса

·  Макрокоманды Выполнения Класса

·  Функция Инициализации Класса

Образование класса пользователя

ObjectARX обеспечивает набор макрокоманд, объявленных в rxboiler. h файле, который помогает Вам создать новые классы, полученные из AcRxObject. Вы можете получать новые классы из большинства классов в ObjectARX иерархии кроме Выпуска AutoCAD 12 набора объектов (перечисленный в главе 6, “ примитивы, ”) и таблица идентификаторов классифицирует. Если Вы не используете макрокоманды ObjectARX, чтобы определить ваш новый класс, класс наследует тождество во время выполнения его наиболее непосредственного{*немедленного*} ObjectARX-зарегистрированного родительского класса.

Приложения могут наиболее эффективно получать новые классы из следующих классов:

§  AcRxObject

§  AcRxService

§  AcDbObject

§  AcDbEntity

§  AcDbCurve

§  AcDbObjectReactor

§  AcDbDatabaseReactor

§  AcDbEntityReactor

§  AcTransactionReactor

§  AcEdJig

§  AcEditorReactor

§  Приложения не должны получить классы из следующего:

§  AcDbAttribute

§  AcDbAttributeDefinition

§  AcDbArc

§  AcDbBlockReference

§  AcDbCircle

§  AcDbFace

§  AcDbLine

§  AcDbMInsertBlock

§  AcDbPoint

§  AcDbShape

§  AcDbSolid

§  AcDbText

§  AcDbTrace

§  Все классы AcDbXxxDimension

§  AcDbViewport

§  AcDbGroup

§  Все классы, полученные из AcDbSymbolTable

§  Все классы, полученные из AcDbSymbolTableRecord

§  AcDbBlockBegin

    AcDbBlockEnd AcDbSequenceEnd AcDb2dPolyline AcDb2dPolylineVertex AcDb3dPolyline AcDb3dPolylineVertex AcDbPolygonMesh AcDbPolygonMeshVertex AcDbPolyFaceMesh AcDbPolyFaceMeshVertex AcDbFaceRecord

Класс из предшествующего списка теоретически может быть получен, но при выполнении явно не поддерживается.

Идентификация Класса Во время выполнения

Каждый класс в ObjectARX иерархии, которая получена из AcRxObject, имеет соответствующий объект описателя класса, который является образцом AcRxClass, который держит информацию для идентификации типа во время выполнения. Объект описателя класса, gpDesc, является статическим компонентом данных класса — например, AcDbEllipse:: gpDesc. Объекты описателя Класса созданы при инициализации, когда классы зарегистрированы с ObjectARX и добавлены к словарю с системным уровнем, acrxClassDictionary. Макрокоманды, описанные здесь облегчают объявление и выполнение некоторых функций, связанных с идентификацией во время выполнения и функциями инициализации. Они включают подпрограмму инициализации класса также как desc (), cast (), isKindOf (), и isA () функции для заказного класса.

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