找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 412|回复: 0

[求助]:谁有handOverTo()函数使用经验

[复制链接]
发表于 2003-11-26 01:27:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
谁有handOverTo()函数使用经验
下面代码使用handOverTo()的地方导致ACAD崩溃

  1. AcDbObjectId oxaInsteadBlockRef(ads_name entname, CString

  2. strNewBlkName,CString strFile)
  3. {
  4.         AcDbObjectId idNewBlk;
  5.         AcDbObjectId idBlk;
  6.         if (oxaFindInsertRef(strNewBlkName,idBlk)==false)
  7.         {
  8.                 return idNewBlk;
  9.         }

  10.    AcDbObjectId idOldBlk;
  11.    if (acdbGetObjectId(idOldBlk,entname)!=Acad::eOk)
  12.    {
  13.            return idNewBlk;
  14.    }

  15.    AcDbEntity*  pEnt;
  16.    if(Acad::eOk!=acdbOpenAcDbEntity(pEnt, idOldBlk, AcDb::kForRead))
  17.    {
  18.            return idNewBlk;
  19.    }
  20.    ///////块 获取块的各个特性转移到新的块上。
  21.    AcDbBlockReference *blkRef=AcDbBlockReference::cast(pEnt);
  22.    AcGePoint3d aptPos;
  23.    double dRota;
  24.    CString strLayer;
  25.    if (blkRef!=NULL)
  26.    {
  27.            aptPos=blkRef->position();
  28.            dRota=blkRef->rotation();
  29.            strLayer=blkRef->layer();
  30.            blkRef->close();
  31.    }
  32.    pEnt->close();
  33.    
  34.           //生成新的块
  35.       AcDbObject*  pNewObj=NULL;
  36.           AcDbBlockReference blkNew(aptPos,idBlk);
  37.           blkNew.setLayer(strLayer);
  38.           blkNew.setRotation(dRota);
  39.           blkNew.close();
  40.           acdbOpenAcDbObject(pNewObj,blkNew.objectId(),AcDb::kForRead);
  41.           
  42.           AcDbObject*  pOldObj=NULL;  //打开原来的块 准备替换
  43.           if (acdbOpenAcDbObject(pOldObj,idOldBlk,AcDb::kForWrite)!

  44. =Acad::eOk)
  45.           {          //AfxMessageBox("not open");         
  46.                   return idNewBlk;
  47.           }
  48.           
  49.           //AfxMessageBox(" openx");       
  50.           CString str=oxaGetErrorStatusWord(pOldObj->handOverTo

  51. (pNewObj));   //主要是这里出错
  52.           
  53.           AfxMessageBox(str);
  54.           pOldObj->close();
  55.           pNewObj->close();
  56. }

  57. //////////////////////////////////////////////////////
  58. //////////////////////////////////////////////////////

  59. bool oxaFindInsertRef(CString strRefName,AcDbObjectId &idBlk, CString

  60. strFile)
  61. {
  62.         CString strTempRefName="tmtemp-A$C5F1E06FE";
  63.         Acad :: ErrorStatus es;
  64.         AcDbDatabase *pCurDb = NULL;
  65.         pCurDb = acdbHostApplicationServices()->workingDatabase();//获取

  66. 当前图形数据库       
  67.         AcDbBlockTable *pBltTb=NULL;
  68.         pCurDb->getSymbolTable(pBltTb,AcDb::kForRead);
  69.        
  70.     if (pBltTb->has(strRefName)==true) //acutPrintf(" 图形中存在块 ");
  71.         {               
  72.                 if (Acad::eOk==pBltTb->getAt(strRefName,idBlk))
  73.                 {
  74.                         pBltTb->close();       
  75.                         return true;
  76.                 }               
  77.     }
  78.         pBltTb->close();
  79.        
  80.         //当前图形数据库不存在指定块,就从指定文件里查找。
  81.         if (strFile!="")
  82.         {
  83.                 AcDbDatabase *pDb=new AcDbDatabase(Adesk::kFalse);
  84.                 es=pDb->readDwgFile(strFile);
  85.                 if (es!=Acad::eOk)
  86.                 {
  87.                         //acutPrintf(oxaGetErrorStatusWord(es));
  88.                         delete pDb;
  89.                         return false;
  90.                 }   
  91.                 //  
  92.                 AcDbObjectId idBlock;
  93.                
  94.                 //es=pCurDb->insert(idBlock, "XXXXX" , pDb);
  95.                 es=pCurDb->insert(idBlock, strRefName ,strTempRefName,

  96. pDb);
  97.                 delete pDb;
  98.                 if ((es==Acad::eOk)&&(pBltTb->has(strRefName)==true))

  99. //acutPrintf(" 图形中存在块 ");
  100.                 {               
  101.                         AcDbBlockTableRecord *pBltTbRcd;  
  102.                         pBltTb->getAt

  103. (strTempRefName,pBltTbRcd,AcDb::kForWrite);
  104.                         pBltTbRcd->erase();  //删除临时块定义。不可用

  105. erase(false)
  106.                         if (Acad::eOk==pBltTb->getAt(strRefName,idBlk))
  107.                         {
  108.                                 pBltTb->close();
  109.                                 pBltTbRcd->close();
  110.                                 return true;
  111.                         }
  112.                         pBltTb->close();
  113.                         pBltTbRcd->close();
  114.                 }
  115.                
  116.         }
  117.         return false;
  118. }
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-21 08:41 , Processed in 0.177825 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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