Тема: Выполнение стандартных действий на Double Click (AcDbDoubleClickEdit)

Есть блок с именем "test", при DoubleClick на нем появляется MessageBox. Как сделать так, чтобы MessageBox появлялся при DoubleClick только на блоке с именем "test", а  на остальных блоках отрабатывалась стандартная команда eattedit или открывалось окно Properties?
Читал https://www.caduser.ru/forum/topic21416.html – на хуках делать не нравится, хочется сделать на AcDbDoubleClickEdit.
Пишу для Autocad 2006.

void AcDbDoubleClickBlock::startEdit(AcDbEntity *pEnt, AcGePoint3d pt)
{
    // Get the Current Document
    AcApDocument *pDoc=acDocManager->curDocument();
    AcDbBlockReference* pBlock;
        
    // Cast the AcDbEntity pointer to AcDbPolyline    
    if(pEnt->isKindOf(AcDbBlockReference::desc()) == Adesk::kTrue)
        pBlock=AcDbBlockReference::cast(pEnt);
    else
    {
        acutPrintf("Error: Invalid AcDbBlockReference Object");
        return;
    }
    
    acDocManager->lockDocument(pDoc, AcAp::kWrite);
    
    // Get the ObjectId of the BlockTableRecord where the reference is defined
    AcDbObjectId blockId = pBlock->blockTableRecord();
    AcDbBlockTableRecord* pBlockTableRecord;
    if (acdbOpenAcDbObject((AcDbObject *&)pBlockTableRecord, blockId, AcDb::kForRead) != Acad::eOk) {
        acutPrintf("\nFailed to open block-table.");
        return;
    }
    const char* blockName;
    pBlockTableRecord->getName(blockName);
    pBlockTableRecord->close();
    
    pBlock->close();
    if (!strcmp(blockName, "test")) {
        AfxMessageBox("Test passed!");
    }
    else
    {
        //
        //execute standard Autocad command
        //
    };
    // clear the pickfirst selection set.
    acedSSSetFirst(NULL, NULL);
    acDocManager->unlockDocument(pDoc);
}

В InitApplication()

    // Intialize for BlockReference...
    AcDbDoubleClickBlock *pBlockEdit = new AcDbDoubleClickBlock;
    AcDbBlockReference::desc()->addX(AcDbDoubleClickEdit::desc(), pBlockEdit);

В UnloadApplication():

    // Uninitialize the double-click editing feature
    // for each entity type
    AcDbBlockReference::desc()->delX(AcDbDoubleClickEdit::desc());

Re: Выполнение стандартных действий на Double Click (AcDbDoubleClickEdit)

Как вариант:

  if (!stricmp(blockName, "test")) {
    AfxMessageBox("Test passed!");
  }
  else
  {
    //
    //execute standard Autocad command
acDocManager->sendStringToExecute(curDoc(), "_.eattedit ");
    // или как вариант
// acDocManager->sendStringToExecute(curDoc(), "_.properties ");
    //
  };

Только не нужно чистить набор.

Re: Выполнение стандартных действий на Double Click (AcDbDoubleClickEdit)

Я в итоге сделал хук, так как были пробемы с акадом 2002. До этого было примерно так:
1. В InitApplication() запоминал "предыдущий"  обработчик дблклика

pPrevEdit = AcDbBlockReference::desc()->getX(AcDbDoubleClickEdit::desc());

2.В startEdit перенаправлял, если блок не мой

pPrevEdit->startEdit(pEnt, pt);

Что-то вроде этого, детали уже не помню, но идея понятна думаю. Не знаю насколько это правильно, но работало вроде без глюков...

Re: Выполнение стандартных действий на Double Click (AcDbDoubleClickEdit)

Александр Ривилис - спасибо, такой вариант был, но  хотелось вызывать стандартный обработчик DoubleClick'а, как это делал bkrug, так мне кажется красивее, да вот с приведением типов что-то никак не разберусь: в строке

pPrevEdit = AcDbBlockReference::desc()->getX(AcDbDoubleClickEdit::desc());

pPrevEdit является AcRxObject*, а в

pPrevEdit->startEdit(pEnt, pt);

pPrevEdit должен быть AcDbDoubleClickEdit*, на сколько я понимаю. Вот я и запарился.

Re: Выполнение стандартных действий на Double Click (AcDbDoubleClickEdit)

AcDbDoubleClickEdit pPrevDBLK = AcDbDoubleClickEdit::cast(pPrevEdit);
if (pPrevDBLK) pPrevDBLK->startEdit(pEnt,pt);

Re: Выполнение стандартных действий на Double Click (AcDbDoubleClickEdit)

> Александр Ривилис
Упс! Ошибочка.

AcDbDoubleClickEdit [b]*[/b]pPrevDBLK = AcDbDoubleClickEdit::cast(pPrevEdit);
if (pPrevDBLK) pPrevDBLK->startEdit(pEnt,pt);

Re: Выполнение стандартных действий на Double Click (AcDbDoubleClickEdit)

Спасибо за помощь, разобрался.