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

       

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


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, чтобы выяснить, который команды являются активными. События контекста ввода могут использоваться, чтобы обратить внимание на переходы между состояниями ввода.
Пример событий контекста ввода
Следующий пример создает простой реактор контекста, который отвечает на разнообразие событий контекста ввода:
#include <adslib.h>
#include <aced.h>
#include <dbmain.h>
#include <rxregsvc.h>
#include <acedinpt.h>
#include <acdocman.h>
// The input context reactor class.
//
class MyContextReactor : public AcEdInputContextReactor
{
public:
void
beginGetPoint(
const AcGePoint3d* pointIn,
const char* promptString,
int initGetFlags,
const char* pKeywords);
void
endGetPoint(
Acad::PromptStatus returnStatus,
const AcGePoint3d& pointOut,
const char*& pKeyword);
void
beginGetOrientation(
const AcGePoint3d* pointIn,
const char* promptString,
int initGetFlags,
const char* pKeywords);
void
endGetOrientation(
Acad::PromptStatus returnStatus,
double& angle,
const char*& pKeyword);
void
beginGetCorner(
const AcGePoint3d* firstCorner,
const char* promptString,
int initGetFlags,
const char* pKeywords);
void
endGetCorner(
Acad::PromptStatus returnStatus,
AcGePoint3d& secondCorner,
const char*& pKeyword);
void
beginSSGet(
const char* pPrompt,
int initGetFlags,
const char* pKeywords,
const char* pSSControls,
const AcArray<AcGePoint3d>& points,
const resbuf* entMask);
void
endSSGet(
Acad::PromptStatus returnStatus,
const AcArray<AcDbObjectId>& ss);
};
void
MyContextReactor::beginGetPoint(
const AcGePoint3d* pointIn,
const char* promptString,
int initGetFlags,
const char* pKeywords)
{
acutPrintf("beginGetPoint: pointIn = %.2f,%.2f,%.2f\n",
(*pointIn)[0], (*pointIn)[1], (*pointIn)[2]);
if (NULL != promptString)
acutPrintf("%s", promptString);


acutPrintf("initGetFlags: %d\n", initGetFlags);
if (NULL != pKeywords)
acutPrintf("Keywords: %s\n", pKeywords);
}
void
MyContextReactor::endGetPoint(
Acad::PromptStatus returnStatus,
const AcGePoint3d& pointOut,
const char*& pKeyword)
{
acutPrintf("endGetPoint: %d\n", returnStatus);
acutPrintf("%.2f,%.2f,%.2f\n", pointOut[0], pointOut[1],
pointOut[2]);
if (NULL != pKeyword)
acutPrintf("Keyword: %s\n", pKeyword);
}
void
MyContextReactor::beginGetOrientation(
const AcGePoint3d* pointIn,
const char* promptString,
int initGetFlags,
const char* pKeywords)
{
acutPrintf("beginGetOrientation: %.2f, %.2f, %.2f\n",
(*pointIn)[0], (*pointIn)[1], (*pointIn)[2]);
}
void
MyContextReactor::endGetOrientation(
Acad::PromptStatus returnStatus,
double& angle,
const char*& pKeyword)
{
acutPrintf("endGetOrientation: %.2f\n", angle);
}
void
MyContextReactor::beginGetCorner(
const AcGePoint3d* firstCorner,
const char* promptString,
int initGetFlags,
const char* pKeywords)
{
if (NULL != firstCorner)
{
acutPrintf(
"beginGetCorner: %.2f, %.2f, %.2f\n",
(*firstCorner)[0],
(*firstCorner)[1],
(*firstCorner)[2]);
}
}
void
MyContextReactor::endGetCorner(
Acad::PromptStatus returnStatus,
AcGePoint3d& secondCorner,
const char*& pKeyword)
{
acutPrintf("endGetCorner\n");
}
void
MyContextReactor::beginSSGet(
const char* pPrompt,
int initGetFlags,
const char* pKeywords,
const char* pSSControls,
const AcArray<AcGePoint3d>& points,
const resbuf* entMask)
{
acutPrintf("beginSSGet:%s\n", NULL != pPrompt ? pPrompt : "");
for (int i = 0; i < points.length(); i++)
acutPrintf("%d: %.2f, %.2f, %.2f\n", i, points[i][X],
points[i][Y], points[i][Z]);
}
void
MyContextReactor::endSSGet(
Acad::PromptStatus returnStatus,
const AcArray<AcDbObjectId>& ss)


{
acutPrintf("endSSGet\n");
for (int i = 0; i < ss.length(); i++)
acutPrintf("Entity %d: <%x>\n", i, ss[i].asOldId());
}
// My context reactor object
MyContextReactor my_icr;
extern "C" __declspec(dllexport) AcRx::AppRetCode
acrxEntryPoint(
AcRx::AppMsgCode msg,
void *p)
{
switch (msg)
{
case AcRx::kInitAppMsg:
acrxUnlockApplication(p);
acrxRegisterAppMDIAware(p);
break;
case AcRx::kLoadDwgMsg:
// Attach a context reactor to the current document.
//
curDoc()->inputPointManager()->
addInputContextReactor(&my_icr);
break;
case AcRx::kUnloadAppMsg:
// Warning! This sample attaches a context reactor,
// but it never detaches it. A real-life application
// will need to monitor to which document it attached
// the reactor, and will need to detach it.
//
break;
}
return AcRx::kRetOK;
}

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