CAD选择图元保存到新文件,使用wblockCloneObjects报错,错误代码eNotAllowedForThisProxy,错误信息“Not allowed for this proxy: <AcDgnLS - "AcDbLSDefinition"> (7CC9A)”。检查图纸所有图元类型,没有发现代理图元。定位到大概出错的几根线和文字,在尝试切换图层、修改线型名称(怀疑过名称中的特殊符号)、修改线型之后,确定线型有问题。打开图纸查看数据库,找到问题线型。
线型<A1墙身详图20140805>有extensionDictionary,这个extensionDictionary中含代理对象AcDbLSDefinition——自定义对象无法解析导致失败。
代码要修改的就是:考虑其对我的显示并无帮助,直接删除自定义对象。extensionDictionary是线型(OdDbLinetypeTableRecord)基类(OdDbObject)成员,判断一下是否为空后erase。
OdDbLinetypeTablePtr pLineTypes = pDb->getLinetypeTableId().safeOpenObject(OdDb::kForWrite);
for (OdDbSymbolTableIteratorPtr pIter = pLineTypes->newIterator(); !pIter->done(); pIter->step())
{
OdDbLinetypeTableRecordPtr pLineType = pIter->getRecordId().safeOpenObject(OdDb::kForWrite);
if (!pLineType.isNull())
{
try
{
OdString sName = pLineType->getName();
OdDbObjectId id = pLineType->extensionDictionary();
if(id.isNull())
continue;
OdDbDictionaryPtr pDict = id.safeOpenObject(OdDb::kForWrite);
OdResult rt = pDict->erase();
if (rt == OdResult::eOk)
;
}
catch (const OdError& e)
{
OdString sMsg = e.description();
OdResult err = e.code();
}
}
}
再调用wblockCloneObjects,成功!