明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1289|回复: 0

【求助】鼠标双击块时进行块删除操作,程序崩溃

[复制链接]
发表于 2012-10-18 15:41:35 | 显示全部楼层 |阅读模式
写了一个arx,其中需要在鼠标双击中特定名为SIGN的块时将该块删除掉。写了一个类ESEditor继承自AcEditorReactor,并重载鼠标双击事件函数,在该函数中进行块的判断和删除操作。开发的版本是AutoCAD2007 + VS2005,  加载插件测试时发现大部分时候都会导致程序崩溃。但是插件在AutoCAD2010中测试时没问题。跟踪不到原因。代码如下,麻烦大家帮我看看有啥问题?
void ESEditor::beginDoubleClick(const AcGePoint3d& clickPoint)
{
       int index= ptInBlock(clickPoint);
       if(index >= 0)
              deleteBlock(index);        
}

void ESEditor::deleteBlock(int blockIndex)
{
      ErrorStatus  es;
      AcDbDatabase* pDataBase;
      AcDbBlockTable* pBlkTbl;
      AcDbBlockReference* pBlkRef;
      AcDbBlockTableRecord* pBlkTblRec;
      AcRxClass* rcClass;
      AcDbEntity* pEntity;
      AcDbObjectIdArray ids;
      AcDbObjectId objId, objRecId;
      long len;
      ACHAR sel[10], signName[30];

      if((es = acDocManager->lockDocument( acDocManager->curDocument(), AcAp::kWrite,NULL,NULL,true)) == Acad::eOk)
      {
        if((pDataBase = acdbHostApplicationServices()->workingDatabase()) != NULL)
        {
                        if((es = pDataBase->getBlockTable(pBlkTbl, kForWrite)) == Acad::eOk)
                {
                         wsprintf(signName, _T("%s"), _T("HanvonHandWritten_"));
                         wsprintf(sel, _T("%d"), blockIndex);
                                         wcscat(signName, sel);

                         if((es = pBlkTbl->getAt(signName, pBlkTblRec, kForWrite)) == Acad::eOk)
                        {
                        if((es = pBlkTblRec->getBlockReferenceIds(ids)) == Acad::eOk)
                        {
                                 len = ids.length();
                                 for (int k = 0; k < len; k++)
                                 {
                                if ((es = acdbOpenAcDbEntity(pEntity, ids[k], kForWrite))== Acad::eOk)
                                {
                                        rcClass = pEntity->isA();
                                        if (rcClass == NULL)
                                                continue;
                                        if((pBlkRef = AcDbBlockReference::cast(pEntity)) != NULL)
                                        {
                                                pBlkRef->erase();
                                                pBlkRef->close();
                                        }
                                        pEntity->close();
                                   }      
                                            }
                                                    }
                                     pBlkTblRec->erase();
                                     pBlkTblRec->close();
                                }                                       
                                      pBlkTbl->close();
                                        }
          }
                  acDocManager->unlockDocument( acDocManager->curDocument());
        }
}

还有就是,我测试了下,如果鼠标双击的位置不在名为SIGN的块上,此时执行删除操作插件可以正常运行。
我也试着写了个HOOK来截获鼠标双击消息并进行删除块操作,现象同上。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 10:00 , Processed in 0.232174 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表