The following example demonstrates the use of input point filters and monitors.
#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, // const AcArray<AcDbCustomOsnapMode>& customOsnapModes const AcArray<AcDbObjectId>& apertureEntities, const AcArray< AcDbObjectIdArray, AcArrayObjectCopyReallocator< AcDbObjectIdArray > >& nestedPickedEntities, int gsSelectionMark, const AcArray<AcDbObjectId>& keyPointEntities, const AcArray<AcGeCurve3d*>& alignmentPaths, const AcGePoint3d& computedPoint, const char* tooltipString); }; Acad::ErrorStatus IPM::monitorInputPoint( // Output. If changedTooltipStr is kTrue, then newTooltipString // has the new ToolTip string in it. // bool& appendToTooltipStr, char*& additionalTooltipString, // Input/Output // AcGiViewportDraw* pDrawContext, // 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, // const AcArray<AcDbCustomOsnapMode>& customOsnapModes const AcArray<AcDbObjectId>& apertureEntities, const AcArray< AcDbObjectIdArray, AcArrayObjectCopyReallocator< AcDbObjectIdArray > >& nestedPickedEntities, int gsSelectionMark, const AcArray<AcDbObjectId>& keyPointEntities, const AcArray<AcGeCurve3d*>& alignmentPaths, const AcGePoint3d& computedPoint, const char* tooltipString) { acutPrintf("\nhistory: %d\n", history); if (pointComputed) { acutPrintf( "rawPoint: %.2f, %.2f, %.2f\n", rawPoint[0], rawPoint[1], rawPoint[2]); if (history & Acad::eGripped) acutPrintf( "grippedPoint: %.2f, %.2f, %.2f\n", grippedPoint[0], grippedPoint[1], grippedPoint[2]); if (history & Acad::eCartSnapped) acutPrintf( "cartesianSnappedPoint: %.2f, %.2f, %.2f\n", cartesianSnappedPoint[0], cartesianSnappedPoint[1], cartesianSnappedPoint[2]); if (history & Acad::eOsnapped) { acutPrintf( "osnappedPoint: %.2f, %.2f, %.2f\n", osnappedPoint[0], osnappedPoint[1], osnappedPoint[2]); #define OSMASK_CHECK(x) if (osnapMasks & AcDb:: ## x) acutPrintf("%s ", #x) OSMASK_CHECK(kOsMaskEnd); OSMASK_CHECK(kOsMaskMid); OSMASK_CHECK(kOsMaskCen); OSMASK_CHECK(kOsMaskNode); OSMASK_CHECK(kOsMaskQuad); OSMASK_CHECK(kOsMaskInt); OSMASK_CHECK(kOsMaskIns); OSMASK_CHECK(kOsMaskPerp); OSMASK_CHECK(kOsMaskTan); OSMASK_CHECK(kOsMaskNear); OSMASK_CHECK(kOsMaskQuick); OSMASK_CHECK(kOsMaskApint); OSMASK_CHECK(kOsMaskImmediate); OSMASK_CHECK(kOsMaskAllowTan); OSMASK_CHECK(kOsMaskDisablePerp); OSMASK_CHECK(kOsMaskRelCartesian); OSMASK_CHECK(kOsMaskRelPolar); #undef OSMASK_CHECK acutPrintf("\n"); } acutPrintf("%d apertureEntities: ", apertureEntities.length()); for (int i = 0; i < apertureEntities.length(); i++) acutPrintf("<%x> ", apertureEntities[i].asOldId()); acutPrintf("\n"); } else { acutPrintf("No point computed"); if (history & Acad::eCyclingPt) acutPrintf(", but new cycling osnap: %.2f, %.2f, %.2f\n", osnappedPoint[0], osnappedPoint[1], osnappedPoint[2]); else acutPrintf(".\n"); } if (NULL != pDrawContext) { pDrawContext->subEntityTraits().setColor(2); pDrawContext->geometry().circle(rawPoint, 1.0, AcGeVector3d::kZAxis); } else acutPrintf("ViewportDraw is NULL!\n"); if (history & Acad::eNotDigitizer) acutPrintf("PICK!\n"); if (NULL != tooltipString) { acutPrintf("TooltipString: %s\n", tooltipString); additionalTooltipString = ", anotherString!"; appendToTooltipStr = true; } if (history & Acad::eOrtho) { acutPrintf("Ortho found at %.2f, %.2f, %.2f\n", computedPoint[0], computedPoint[1], computedPoint[2]); } return Acad::eOk; } class IPF : public AcEdInputPointFilter { public: Acad::ErrorStatus processInputPoint( bool& changedPoint, AcGePoint3d& newPoint, bool& changedTooltipStr, char*& newTooltipString, bool& retry, AcGiViewportDraw* pDrawContext, AcApDocument* document, bool pointComputed, int history, const AcGePoint3d& lastPoint, const AcGePoint3d& rawPoint, const AcGePoint3d& grippedPoint, const AcGePoint3d& cartesianSnappedPoint, const AcGePoint3d& osnappedPoint, AcDb::OsnapMask osnapMasks, // const AcArray<AcDbCustomOsnapMode>& customOsnapModes const AcArray<AcDbObjectId>& pickedEntities, const AcArray< AcDbObjectIdArray, AcArrayObjectCopyReallocator< AcDbObjectIdArray > >& nestedPickedEntities, // Of 0th element in pickedEntities. int gsSelectionMark, // AutoSnap Info: const AcArray<AcDbObjectId>& keyPointEntities, const AcArray<AcGeCurve3d*>& alignmentPaths, const AcGePoint3d& computedPoint, const char* tooltipString); }; Acad::ErrorStatus IPF::processInputPoint( bool& changedPoint, AcGePoint3d& newPoint, bool& changedTooltipStr, char*& newTooltipString, bool& retry, AcGiViewportDraw* pDrawContext, AcApDocument* document, bool pointComputed, int history, const AcGePoint3d& lastPoint, const AcGePoint3d& rawPoint, const AcGePoint3d& grippedPoint, const AcGePoint3d& cartesianSnappedPoint, const AcGePoint3d& osnappedPoint, // const AcArray<AcDbCustomOsnapMode>& customOsnapModes const AcArray<AcDbObjectId>& pickedEntities, const AcArray< AcDbObjectIdArray, AcArrayObjectCopyReallocator< AcDbObjectIdArray > >& nestedPickedEntities, // Of 0th element in pickedEntities. int gsSelectionMark, // AutoSnap Info: const AcArray<AcDbObjectId>& keyPointEntities, const AcArray<AcGeCurve3d*>& alignmentPaths, const AcGePoint3d& computedPoint, const char* tooltipString) { // Change the computed point to an offset of (0.2, 0.2, 0.2) // if the current computed point is an object snap point. // if (pointComputed && history & Acad::eOsnapped) { changedPoint = true; newPoint = osnappedPoint + AcGeVector3d(0.2,0.2,0.0); pDrawContext->geometry().circle(newPoint, 0.1, AcGeVector3d::kZAxis); } return Acad::eOk; } // Input point monitor IPM my_ipm; // Input point filter IPF my_ipf; // Installs an input point monitor. // void testipm() { curDoc()->inputPointManager()->addPointMonitor(&my_ipm); } // Installs an input point filter. // void testipf() { curDoc()->inputPointManager()->registerPointFilter(&my_ipf); } // Turns on forced entity picking. // void testfp() { curDoc()->inputPointManager()->turnOnForcedPick(); } // Disables the system cursor graphics. // void testcursor() { curDoc()->inputPointManager()->disableSystemCursorGraphics(); } extern "C" __declspec(dllexport) AcRx::AppRetCode acrxEntryPoint(AcRx::AppMsgCode msg, void *p) { switch (msg) { case AcRx::kInitAppMsg: acrxRegisterAppMDIAware(p); acrxUnlockApplication(p); acedRegCmds->addCommand("mkr", "testipm", "ipm", ACRX_CMD_TRANSPARENT, testipm); acedRegCmds->addCommand("mkr", "testipf", "ipf", ACRX_CMD_TRANSPARENT, testipf); acedRegCmds->addCommand("mkr", "testfp", "fp", ACRX_CMD_TRANSPARENT, testfp); acedRegCmds->addCommand("mkr", "testcursor", "cursor", ACRX_CMD_TRANSPARENT, testcursor); break; case AcRx::kUnloadAppMsg: acedRegCmds->removeGroup("mkr"); break; } return AcRx::kRetOK; }