求助
我在模型空间里选择了一些实体,然后在组成块参照,为什么我的块参照里什么都没有,只有名字,不见图形,在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;
}
}
我也不知道问题是怎么回事,但是我把 pBlkTable->add(recId, record1);这句放在record1->close();这句之前就解决了。 objectarx中,要特别注意托管对象的关闭问题,这个是要按照过程次序限定原则的,要做到用完就关闭。
原帖子代码里面,最好也要按照伪代码的次序执行
获取选定的对象,将对象克隆(或者删除,利用程序开关)复制到内存空间,新建BTR,将克隆对象存入BTR,打开BT,将BTR存入BT,关闭BT,关闭BTR。
还有就是,一楼帖子中,要注意代码的静默性,就算是临时性的,也不能过多的来一个对话框,要用es来引导用户,或者开发者。 luowy 发表于 2020-1-13 18:53
objectarx中,要特别注意托管对象的关闭问题,这个是要按照过程次序限定原则的,要做到用完就关闭。
原帖 ...
谢谢提醒,以后的开发中,我会注意的。
页:
[1]