yanxiaowiu 发表于 2005-4-11 11:16:00

插入块的问题,致命错误

//设置好文件名称                               插入点                               插入角度                       后调用此函数完成
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();
}
编译没有问题,运行时,只要到了要关闭当前的图纸时,就有问题,致命错误。
能保存能另存为。不能打开别的图纸,不能关闭当前图纸。
如果手动将插入的块删掉再关闭,还是有问题。
请高手帮忙

zpterrific 发表于 2009-7-15 20:26:00

用Release编译试试,不要用Debug
或者输入SDI0
不知道对不对

wj_job 发表于 2009-7-17 01:18:00

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();
给你串能正常执行的代码,自己瞧瞧看自己存在哪方面的问题。至于你的代码我实在没得时间看了。自己写省事儿……。

松竹 发表于 2009-7-19 20:50:00

如果在多文档环境下,使用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]
查看完整版本: 插入块的问题,致命错误