明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 624|回复: 3

求助

[复制链接]
发表于 2019-12-21 00:11 | 显示全部楼层 |阅读模式
我在模型空间里选择了一些实体,然后在组成块参照,为什么我的块参照里什么都没有,只有名字,不见图形,在cad上操做的时候可以选择它并插入,不过插入到模型空间什么都没有。我确定实体不是空的,块表也打开正常,record和块表也都关闭了的
  1. AcDbBlockTable *pBlkTable;

  2.     if (acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlkTable, AcDb::OpenMode::kForWrite) != ErrorStatus::eOk)
  3.       return;

  4.     AcDbBlockTableRecord *record1 = new AcDbBlockTableRecord();


  5.     AcDbObjectId recId;
  6.     record1->setName(L"sssL");
  7.     pBlkTable->add(recId, record1);
  8.     AcDbObjectIdArray idArr;
  9.     AcDbObjectIdArray mirIdArr;

  10.     if (CSelectUtil::PromptSelectEnts(L"\n请选择要镜像的实体集\n", NULL, idArr)) {
  11.       for (int i = 0; i < idArr.length(); i++)
  12.       {

  13.         AcDbEntity* pEnt = NULL;
  14.         ErrorStatus es = acdbOpenObject(pEnt, idArr, AcDb::kForWrite);
  15.         if (es == ErrorStatus::eOk&&pEnt != NULL)
  16.         {
  17.           AcDbEntity * pCopyEnt = NULL;

  18.           pCopyEnt = AcDbEntity::cast(pEnt->clone());

  19.           if (record1->appendAcDbEntity(pCopyEnt) == ErrorStatus::eOk) {
  20.             AfxMessageBox(TEXT("InsertOK!"));
  21.           }
  22.           else {

  23.             AfxMessageBox(TEXT("InsertFail!"));
  24.           }
  25.           pEnt->close();

  26.         }
  27.       }
  28.       record1->close();
  29.       pBlkTable->close();
  30.     }

  1. bool CSelectUtil::PromptSelectEnts(const TCHAR * prompt, resbuf * rb,
  2.   AcDbObjectIdArray & entIds)
  3. {
  4.   ads_name selName;

  5.   acutPrintf(prompt);

  6.   int rc = acedSSGet(NULL, NULL, NULL, rb, selName);

  7.   if (rc == RTNORM) {

  8.     int length;

  9.     acedSSLength(selName, &length);

  10.     for (int i = 0; i < length; i++)
  11.     {
  12.       ads_name name;

  13.       acedSSName(selName, i, name);

  14.       AcDbObjectId oId;

  15.       if (acdbGetObjectId(oId, name) == ErrorStatus::eOk) {

  16.         entIds.append(oId);
  17.       }
  18.     }
  19.     acedSSFree(selName);
  20.     return true;
  21.   }
  22.   else {
  23.     acedSSFree(selName);
  24.     return false;
  25.   }

  26. }
复制代码


 楼主| 发表于 2019-12-24 17:29 | 显示全部楼层
我也不知道问题是怎么回事,但是我把 pBlkTable->add(recId, record1);这句放在record1->close();这句之前就解决了。
发表于 2020-1-13 18:53 | 显示全部楼层
objectarx中,要特别注意托管对象的关闭问题,这个是要按照过程次序限定原则的,要做到用完就关闭。
原帖子代码里面,最好也要按照伪代码的次序执行
获取选定的对象,将对象克隆(或者删除,利用程序开关)复制到内存空间,新建BTR,将克隆对象存入BTR,打开BT,将BTR存入BT,关闭BT,关闭BTR。

还有就是,一楼帖子中,要注意代码的静默性,就算是临时性的,也不能过多的来一个对话框,要用es来引导用户,或者开发者。
 楼主| 发表于 2020-1-13 20:14 | 显示全部楼层
luowy 发表于 2020-1-13 18:53
objectarx中,要特别注意托管对象的关闭问题,这个是要按照过程次序限定原则的,要做到用完就关闭。
原帖 ...

谢谢提醒,以后的开发中,我会注意的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-27 14:47 , Processed in 0.280812 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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