LL_Zz 发表于 2019-12-21 00:11:43

求助

我在模型空间里选择了一些实体,然后在组成块参照,为什么我的块参照里什么都没有,只有名字,不见图形,在cad上操做的时候可以选择它并插入,不过插入到模型空间什么都没有。我确定实体不是空的,块表也打开正常,record和块表也都关闭了的
AcDbBlockTable *pBlkTable;

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

    AcDbBlockTableRecord *record1 = new AcDbBlockTableRecord();


    AcDbObjectId recId;
    record1->setName(L"sssL");
    pBlkTable->add(recId, record1);
    AcDbObjectIdArray idArr;
    AcDbObjectIdArray mirIdArr;

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

      AcDbEntity* pEnt = NULL;
      ErrorStatus es = acdbOpenObject(pEnt, idArr, AcDb::kForWrite);
      if (es == ErrorStatus::eOk&&pEnt != NULL)
      {
          AcDbEntity * pCopyEnt = NULL;

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

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

            AfxMessageBox(TEXT("InsertFail!"));
          }
          pEnt->close();

      }
      }
      record1->close();
      pBlkTable->close();
    }
bool CSelectUtil::PromptSelectEnts(const TCHAR * prompt, resbuf * rb,
AcDbObjectIdArray & entIds)
{
ads_name selName;

acutPrintf(prompt);

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

if (rc == RTNORM) {

    int length;

    acedSSLength(selName, &length);

    for (int i = 0; i < length; i++)
    {
      ads_name name;

      acedSSName(selName, i, name);

      AcDbObjectId oId;

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

      entIds.append(oId);
      }
    }
    acedSSFree(selName);
    return true;
}
else {
    acedSSFree(selName);
    return false;
}

}

LL_Zz 发表于 2019-12-24 17:29:14

我也不知道问题是怎么回事,但是我把 pBlkTable->add(recId, record1);这句放在record1->close();这句之前就解决了。

luowy 发表于 2020-1-13 18:53:41

objectarx中,要特别注意托管对象的关闭问题,这个是要按照过程次序限定原则的,要做到用完就关闭。
原帖子代码里面,最好也要按照伪代码的次序执行
获取选定的对象,将对象克隆(或者删除,利用程序开关)复制到内存空间,新建BTR,将克隆对象存入BTR,打开BT,将BTR存入BT,关闭BT,关闭BTR。

还有就是,一楼帖子中,要注意代码的静默性,就算是临时性的,也不能过多的来一个对话框,要用es来引导用户,或者开发者。

LL_Zz 发表于 2020-1-13 20:14:58

luowy 发表于 2020-1-13 18:53
objectarx中,要特别注意托管对象的关闭问题,这个是要按照过程次序限定原则的,要做到用完就关闭。
原帖 ...

谢谢提醒,以后的开发中,我会注意的。
页: [1]
查看完整版本: 求助