Тема: отследить привязку

отслеживать движение мышки нет никаких проблем (monitorInputPoint).
а вот как узнать, клацнул пользователь левой кнопкой мышки или только водит ей по экрану?
может monitorInputPoint и не подходит для этой задачи?

для чего все это мне. пользователь должен из моей команды рисовать полилинию прямолинейными сегментами до тех пор, пока следующая точка не притянется к объектной привязке (последняя точка, которую он клацнет, будет с учетом привязки).

Re: отследить привязку

AcEdInputContextReactor::endGetPoint

Re: отследить привязку

спасибо, все получилось. оказалось даже проще, чем я думал сначала :)
ну и код, может кому пригодится
реакторы

//------------ 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 не нужны. оставил их для наглядности :)