sSegmentPoints[1].set(

mCurDCSLoc. x+halfGlyphSizeInDCS,

mCurDCSLoc. y, 0.0);

vportDrawContext->geometry().polylineDc( 2, &(sSegmentPoints[0]));

sSegmentPoints[0].set(

mCurDCSLoc. x,

mCurDCSLoc. y-halfGlyphSizeInDCS, 0.0);

sSegmentPoints[1].set(

mCurDCSLoc. x,

mCurDCSLoc. y+halfGlyphSizeInDCS, 0.0);

vportDrawContext->geometry().polylineDc( 2, &(sSegmentPoints[0]));

};

AcmeSocketGlyph* pSocketGlyph = NULL;

// Master object for the socket custom Osnap mode.

//

class AcmeSocketMode : public AcDbCustomOsnapMode {

public:

virtual const char*

localModeString() const {return "SOCket"};

virtual const char*

globalModeString() const {return "SOCket"};

virtual const AcRxClass*

entityOsnapClass() const {return AcmeSocketInfo::desc());

virtual AcGiGlyph*

glyph() const {return pSocketGlyph;);

virtual const char*

tooltipString() const {return "Socket to Me?" };

};

static AcmeSocketMode* pSocketMode = NULL;

/* ================ ObjectARX application interface ============ */

AcRx::AppRetCode

acrxEntryPoint(AcRx::AppMsgCode msg, void*)

{

switch(msg) {

case AcRx::kInitAppMsg:

// Register the class.

//

AcmeSocketInfo::rxInit();

acrxBuildClassHierarchy();

pDefaultSocketInfo = new AcmeSocketInfo;

AcDbEntity::desc()->addX(AcmeSocketInfo::desc(),

pDefaultSocketInfo);

pSocketForLine = new AcmeSocketForLine;

AcDbLine::desc()->addX(AcmeSocketInfo::desc(), pSocketForLine);

//-- };

// Create the glyph object to be returned by the socket

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

// mode object.

//

pSocketGlyph = new AcmeSocketGlyph;

// Create and register the custom Osnap Mode

pSocketMode = new AcmeSocketMode;

acdbCustomOsnapManager->addCustomOsnapMode(pSocketMode);

// The SOCket Osnap mode is now plugged in and ready to use.

//

break;

case AcRx::kUnloadAppMsg:

// Clean up.

acdbCustomOsnapManager->removeCustomOsnapMode(pSocketMode);

delete pSocketMode;

// Unregister, then delete the protocol extension object.

//

AcDbEntity::desc()->delX(AcmeSocketInfo::desc());

delete pDefaultSocketInfo;

AcDbLine::desc()->delX(AcmeSocketInfo::desc());

delete pSocketForLine;

// Remove the protocol extension class definition.

//

acrxClassDictionary->remove("AcmeSocketInfo");

break;

default:

// Between the initialization and termination of the

// application, all registered objects will be directly

// invoked as needed. No commands or AutoLISP

// expressions are necessary.

//

break;

}

return AcRx::kRetOK;

}

Управление точками ввода

Вводные точки приобретены, выполняя события ввода через ряд вычислений. Эти вычисления упомянуты как фильтры, и они могут быть настроены разработчиком. ObjectARX обеспечивает API, чтобы контролировать точки ввода, обрабатывать и изменять их. Следующие секции обсуждают эти темы.

Менеджер точки ввода

ObjectARX обеспечивает менеджера ввода точки классом, AcEdInputPointManager.

Один входной менеджер точки инициализирован для каждого активного документа в AutoCAD.

Следующая функция возвращает входного менеджера точки для документа:

virtual AcEdInputPointManager *

AcApDocument::inputPointManager() const;

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

AcEdInputPointManager обеспечивает функцию, disableSystemCursorGraphics(), который отключает курсор системы.

ObjectARX поддерживает индекс, вызывает, чтобы отключить курсор системы для каждого документа, так, если ваше приложение вызывает disableSystemCursorGraphics() множественные времена, это должно вызвать enableSystemCursorGraphics() то же самое число раз, чтобы восстановить курсор системы.

ПРЕДУПРЕЖДЕНИЕ! Отключение графики курсора системы должно быть сделано экономно, обычно только, когда определенная приложением команда запрашивает ввод пользователя.

Вы должны обеспечить заказную графику курсора, если Вы отключаете графику курсора системы.

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

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

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

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

§  в течение входного приобретения точки без активного режима объектной привязки

§  в течение выбора отдельного примитива точки

§  в течение неподвижности команды

Наконец, входной менеджер точки содержит функцию, mouseHasMoved(), те входные фильтры точки, и мониторы могут вызывать, чтобы определить, имеется ли другая задержка события цифрового преобразователя. Если имеется задержка события цифрового преобразователя, фильтр, или монитор должен возвратиться от его повторного вызова как можно скорее, без того, чтобы делать любые дальнейшие вычисления, избегать курсора задержки.

События контекста ввода

AcEdInputContextReactor класс определяет повторные вызовы, которые посланы, чтобы указать начало и окончание различных операций подсказки. События контекста ввода могут использоваться, чтобы определить, когда добавлять и удалить фильтры точки входа и мониторы. Они могут использоваться независимо, или с другими повторными вызовами типа AcEditorReactor:: commandWillBegin () и AcEditorReactor:: commandEnded (), определять, которые команды происходят, который подсказка команды является в настоящее время активной, и как пользователь отвечал.

Следующая таблица описывает переходы между различной входной состоянией, которая может быть обнаружена, используя события контекста ввода:

События контекста ввода

Тип

Описание

Статический

Введенный, когда beginQuiescentState () повторный вызов сделан, и выходится, когда endQuiescentState () повторный вызов сделан в результате команды AutoCAD, функции AutoLISP, или инициализируемой функции ввода ActiveX. Это должно быть единственное состояние в стеке для документа, когда это введено; это не может быть помещено в стек на вершине другого состояния. CMDACT переменная системы нулевая когда в этом состоянии.

Геометрический объект, Точка

Введенный, если beginGetPoint () повторный вызов сделан без уже нахождения в Геометрическом объекте, Переходном процессе Неточки, Отбор Переходного процесса, или Перетаскивать состояние Последовательности. Всякий раз, когда это состояние введено, возвращенная точка - окончательная цель, не промежуточное значение. Фильтры ввода точки и мониторы запрашивают все события в этом состоянии.

Геометрический объект, Неточка

Введенный от Геометрического объекта, Ненаправляет Переходный процесс, когда beginGetPoint () повторный вызов сделан. От этого состояния, другой запрос направлять средства ввода, располагающие в стеке новое состояние. Любая точка - промежуточное значение и может быть перегружена непосредственно напечатанным значением. Из этого состояния выходят, когда любой из endGetAngle (), endGetDistance (), endGetOrientation (), endGetCorner (), или endGetScaleFactor () повторные вызовы сделан. Фильтры ввода точки и мониторы запрашивают все события в этом состоянии.

Выбирая

Введенный от Отбор, Переходный процесс, когда beginGetPoint () повторный вызов сделан. Фильтры ввода точки и мониторы запрашивают все события в этом состоянии.

Негеометрический объект, Невыбирая

Введенный, когда любой из beginGetString (), beginGetKeyword (), beginGetInteger (), beginGetColor (), или beginGetReal () повторные вызовы сделаны. Эти контексты непосредственно голосуют для ввода и не исполняют объектную привязку, Автопривязку, или фильтрацию точки входа, даже при том, что курсор активен, когда интерактивный трэкинг цифрового преобразователя выполнен. Принудительный выбор примитива нужно позволить для мониторов ввода точки получить повторные вызовы от этого состояния. Фильтры ввода точки не вызваны от этого состояния.

Перетащите Последовательность

Введенный, когда beginDragSequence () повторный вызов сделан, и выходится, когда endDragsequence () повторный вызов сделан. Вложенный вызывает к beginGetPoint (), beginGetAngle (), и beginGetDistance () сделаны в промежуточном режиме, так что никакой государственный переход не сделан. Фильтры ввода точки и мониторы запрашивают все события в этом состоянии.

Освободите Переходный процесс

Из наиболее удаленного входного состояния выходят, и новый собирается быть введенным.

Геометрический объект, Неточка Переходный процесс

Введенный, когда beginGetAngle(), beginGetDistance(), beginGetOrientation(), beginGetCorner(), или beginGetScaleFactor() повторные вызовы сделаны, кроме того, когда уже в Перетаскивают состояние Последовательности. Это означает, что вложил подсказки, возвратится, немедленно и изменение состояния сделано. Ввод этого состояния подразумевает добавление входного контекста к состоянию ввода стеку для документа. Это состояние всегда переходы к Геометрическому объекту, Неточка с beginGetPoint () повторный вызов.

Отбор Переходного процесса

Введенный, когда любой из beginEntsel (), beginNentsel (), или beginSSGet () повторные вызовы сделаны. Будет или в непосредственном{*немедленном*} выборе режима, заявляют, или будет переход в состояние Отбора с beginGetPoint () повторный вызов.

Перетащите Последовательность, Вложенную Действие, Переходный процесс

Введенным от Перетаскивают Последовательность, когда AcEditorReactor::commandWillBegin() или AcEditorReactor::LispWillStart() повторные вызовы сделаны. Они приостанавливают Перетащенную Последовательность и располагают в стеке новое состояние ввода на вершине этого. От этого состояния, это возможно к переходу к любому другому состоянию ввода. Это помещенное в стек состояние закончится, когда балансирование AcEditorReactor повторный вызов сделано, и состояние под высшим состоянием - Перетаскивают Последовательность.

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

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