Input Context Events Example

The following example creates a simple context reactor that responds to a variety of input context events:

#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;
}