Пример событий контекста ввода
Следующий пример создает простой реактор контекста, который отвечает на разнообразие событий контекста ввода:
#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;
}
Фильтры точки ввода и мониторы
Фильтры точки ввода и мониторы позволяют Вам рассматривать и изменять входные данные, поскольку точки приобретаются в AutoCAD. Фильтры Точки ввода и мониторы контекстно-зависимы и если только быть зарегистрированными для уместных контекстов ввода.
Следующая диаграмма показывает, как фильтрация точки ввода и контроль вписываются в ввод ObjectARX обработка модели:

Фильтрация Точки ввода
Фильтры Точки ввода вызваны для всей строки и событий цифрового преобразователя, когда точка приобретается. Они могут изменять конечную позицию точки, возвращенную вызывающей программе в соответствии с AutoCAD и ToolTip строкой, отображенной в соответствии с AutoCAD.
Фильтры Точки ввода обработаны перед любыми мониторами точки ввода, но в конце концов другие вычисления точки ввода выполнены в соответствии с AutoCAD. Точки вывода все еще подчиненны к AutoCAD XYZ фильтрация точки.
ОБРАТИТЕ ВНИМАНИЕ Только на один фильтр точки ввода, может быть активен одновременно.
Контроль Точки ввода
Мониторы Точки ввода вызваны для всей строки и событий цифрового преобразователя, когда точка приобретается, или когда принудительный выбор примитива позволяется. Мониторы Точки ввода могут рассматривать конечную точку, позиционируются и может отображать ToolTip строку.
ToolTip строка может быть установлена, используя appendToTooltipStr и additionalTooltipString параметры при создании монитора точки ввода.
Мониторы Точки ввода обработаны, в конце концов другие вычисления точки ввода выполнены в соответствии с AutoCAD, включая заказную фильтрацию точки ввода, если фильтр существует. Точки вывода все еще подчиненны к AutoCAD XYZ фильтрация точки.
Может иметься любое число мониторов точки ввода, активных в данное время, так как они только позволяют рассматривать точек ввода.
Руководящие принципы для Использования Фильтрации Точки ввода и Контроля
Чтобы гарантировать хорошее выполнение{ работу*}, сохраните следующие руководящие принципы в памяти при кодировании фильтров точки ввода и мониторов:
§ Будут внимательным относительно выполнения существенного вычисления изнутри фильтров точки ввода и мониторов.
§ Минимизируют число окон вызова разделов, сделанных от фильтров и мониторов.
§ Воспользуются преимуществом доступной работы, которая уже была сделана в соответствии с AutoCAD, типа списка всех примитивов под курсором объектной привязки и всеми промежуточными вычислениями точки.
§ Убеждаются, что освободил память для строк, которые Вы передаете в additionalTooltipString параметр при создании фильтра точки ввода или монитора.
ПРИМЕЧАНИЕ, которое рекомендует, чтобы Вы отключили вашу точку, просачивается все контексты выбора примитива. Режим объектной привязки и Автопривязка всегда отключаются в этом контексте.
Формирование цепочки Фильтра
AcEdInputPointFilter класс обеспечивает функцию члена, чтобы поддержать последовательные фильтры точки ввода. Так как только один фильтр может быть активен одновременно, эта функция позволяет Вам сделать запрос текущего фильтра, внедрять, который просачивается ваш заказной фильтр, и затем отменяет текущий фильтр и регистрируется ваш собственный. Следующая функция обеспечивает последовательные функциональные возможности:
AcEdInputFilter *
AcEdInputPointFilter::revokeFilter(AcEdInputPointFilter *);
Повторение
Фильтры Точки ввода и мониторы могут быть вызваны множественные времена для единственной точки ввода при следующих условиях:
§ когда КЛАВИША ТАБУЛЯЦИИ нажата после события движения цифрового преобразователя, объектный поспешный кандидат на позицию курсора циклически повторяется. Как только движение курсора обнаружено, объектный поспешный кандидат, циклически повторяющий индекс сброшен.
§ когда зарегистрированный фильтр точки ввода возвращает индикацию Булевой переменной, чтобы повторить для точки, системные подсказки для нового события, не возвращение точка от события которое будет повторено.
Фильтр Точки ввода и Пример Монитора
Следующий пример демонстрирует использование фильтров точки ввода и мониторов.
#include "adslib. h"
#include "aced. h’
#include "dbmain. h"
#include "acdbabb. h"
#include "adeskabb. h"
#include "rxregsvc. h"
#include "acgi. h"
#include "acdocman. h"
#include "acedinpt. h"
#include "dbapserv. h"
class IPM : public AcEdInputPointMonitor
{
public:
virtual Acad::ErrorStatus
monitorInputPoint(
// Output. If changedTooltipStr is kTrue, newTooltipString
// has the new ToolTip string in it.
//
bool& appendToTooltipStr,
char*& additionalTooltipString,
// Input/Output
//
AcGiViewportDraw* drawContext,
// Input parameters:
//
AcApDocument* document,
bool pointComputed,
int history,
const AcGePoint3d& lastPoint,
const AcGePoint3d& rawPoint,
const AcGePoint3d& grippedPoint,
const AcGePoint3d& cartesianSnappedPoint,
const AcGePoint3d& osnappedPoint,
AcDb::OsnapMask osnapMasks,
|
Из за большого объема этот материал размещен на нескольких страницах:
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 |


