спасибо, все получилось. оказалось даже проще, чем я думал сначала :)
ну и код, может кому пригодится
реакторы
//------------ h
class CInputPointMonitor : public AcEdInputPointMonitor
{
public:
bool * theEnd;
virtual Acad::ErrorStatus monitorInputPoint(const AcEdInputPoint& input, AcEdInputPointMonitorResult& output);
virtual bool excludeFromOsnapCalculation (const AcArray<AcDbObjectId>& nestedEntity, INT_PTR gsSelectionMark);
};
class CInputContextReactor : public AcEdInputContextReactor
{
public:
bool theEnd;
virtual void beginGetPoint(const AcGePoint3d* pointIn,const TCHAR* promptString,int initGetFlags,const TCHAR* pKeywords);
virtual void endGetPoint(Acad::PromptStatus returnStatus,const AcGePoint3d& pointOut,const TCHAR*& pKeyword);
};
//------------ cpp
Acad::ErrorStatus CInputPointMonitor::monitorInputPoint(const AcEdInputPoint& input, AcEdInputPointMonitorResult& output)
{
*theEnd = false;
if (input.history() & Acad::eOsnapped)
{
if ( 0 == input.osnapMask() )
{
for ( int i = 0; i < input.customOsnapModes().length(); i++ )
if (0 == _tcscmp(_T("_electro"), input.customOsnapModes()[i]->globalModeString()) )
{
*theEnd = true;
break;
}
}
}
return Acad::eOk;
}
bool CInputPointMonitor::excludeFromOsnapCalculation (const AcArray<AcDbObjectId>& nestedEntity, INT_PTR gsSelectionMark) {return false;}
void CInputContextReactor::beginGetPoint(const AcGePoint3d* pointIn,const TCHAR* promptString,int initGetFlags,const TCHAR* pKeywords){}
void CInputContextReactor::endGetPoint(Acad::PromptStatus returnStatus,const AcGePoint3d& pointOut,const TCHAR*& pKeyword){}
команда
CInputPointMonitor pointMonitor;
CInputContextReactor pointReactor;
...
curDoc()->inputPointManager()->addInputContextReactor( &pointReactor );
pointReactor.theEnd = false;
curDoc()->inputPointManager()->addPointMonitor( &pointMonitor );
pointMonitor.theEnd = &pointReactor.theEnd;
bool next = true;
ACHAR szBuffer[255];
ACHAR userstring[133];
while (next)
{
if (pointReactor.theEnd){
next = false;
break;
}
_tcsncpy(userstring,_T("\0"),133);
acutPrintf(_T("\n"));
_tcsncpy(szBuffer,_T("\0"),255);
_itot(i,szBuffer,10);
_tcscat(szBuffer, _T("-я точка или [Отменить]: "));
acedInitGet( RSG_NOZERO | RSG_DASH | RSG_NONEG | RSG_OTHER, _T("О"));
switch(acedGetPoint(asDblArray(ptBefore),szBuffer,asDblArray(pt)))
{
// тут обработка RTERROR,RTCAN,RTNONE,RTKWORD,RTNORM
// код не пишу, к делу не относится, да и просто тут всё
}
}
...
curDoc()->inputPointManager()->removePointMonitor( &pointMonitor );
curDoc()->inputPointManager()->removeInputContextReactor( &pointReactor);
короче говоря, достаточно сделать переменную в реакторе AcEdInputContextReactor, передать и обработать ее в AcEdInputPointMonitor. фактически сами функции endGetPoint и beginGetPoint не нужны. оставил их для наглядности :)