插入块的问题,致命错误
//设置好文件名称 插入点 插入角度 后调用此函数完成void InsertTo_Demo(CString dwgFileName,AcGePoint3d ptInsert ,float fAngle)
{
AcDbObjectId id;
AcDbDatabase *pDatabase;
AcDbDatabase *pdb;
pDatabase=new AcDbDatabase(FALSE);
HRESULT hr = S_OK;
hr=pDatabase->readDwgFile(baseFunc->CStringToPChar(dwgFileName));
if (hr!=S_OK)
{
CString strError;
strError.Format("读取%s文件时出错!可能版本不匹配!",dwgFileName);
AfxMessageBox(strError);
return;
}
pdb=acdbHostApplicationServices()->workingDatabase();
pdb->insert(id,
baseFunc->CStringToPChar(dwgFileName),pDatabase);
//delete pDatabase;
pDatabase=NULL;
AcDbBlockTable *pTable=NULL;
acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pTable,
AcDb::kForRead);
ASSERT(pTable!=NULL);
AcDbBlockTableRecord *pModelSpace;
pTable->getAt(ACDB_MODEL_SPACE,pModelSpace,AcDb::kForWrite);
pTable->close();
AcDbBlockReference *pBlockRef;
pBlockRef=new AcDbBlockReference(ptInsert,id);
pBlockRef->setRotation(fAngle);
AcGeScale3d scale;
scale.sx=1;
scale.sy=1;
scale.sz=1;
pBlockRef->setScaleFactors (scale);
pModelSpace->appendAcDbEntity(pBlockRef);
pModelSpace->close();
pBlockRef->close();
}
编译没有问题,运行时,只要到了要关闭当前的图纸时,就有问题,致命错误。
能保存能另存为。不能打开别的图纸,不能关闭当前图纸。
如果手动将插入的块删掉再关闭,还是有问题。
请高手帮忙 用Release编译试试,不要用Debug
或者输入SDI0
不知道对不对 AcDbDatabase *pDb=new AcDbDatabase();
pDb->readDwgFile("d:\\test.dwg");
AcDbObjectId id;
acdbCurDwg()->insert(id,"测试",pDb);
delete pDb;
AcGePoint3d pos(0,0,0);
AcDbBlockReference *pRef=new AcDbBlockReference(pos,id);
AcDbBlockTable *pBlk=NULL;
AcDbBlockTableRecord *pBlkR=NULL;
acdbCurDwg()->getBlockTable(pBlk,OpenMode::kForRead);
pBlk->getAt(ACDB_MODEL_SPACE,pBlkR,OpenMode::kForWrite);
pBlk->close();
if (Acad::ErrorStatus::eOk!=pBlkR->appendAcDbEntity(pRef))
{
delete pRef;
}
else
{
pRef->close();
}
pBlkR->close();
给你串能正常执行的代码,自己瞧瞧看自己存在哪方面的问题。至于你的代码我实在没得时间看了。自己写省事儿……。
如果在多文档环境下,使用pDb->readDwgFile("d:\\test.dwg");函数需要锁定文档,可以使用如下代码来实现临时锁定文档,
class AFX_CLASS_EXPORT CTempDocLockOverride
{
public:
CTempDocLockOverride();
virtual ~CTempDocLockOverride();
private:
AcApDocument* m_pDoc;
};
CTempDocLockOverride::CTempDocLockOverride()
{
m_pDoc = acDocManager->curDocument();
if(m_pDoc)
acDocManager->lockDocument(m_pDoc);
}
CTempDocLockOverride::~CTempDocLockOverride()
{
acDocManager->unlockDocument(m_pDoc);
}
//暂时锁定当前文档
#defineTEMPDOCLOCK() CTempDocLockOverride tempDocLock;
使用 TEMPDOCLOCK();宏即可实现临时锁定文档的功能。
页:
[1]