后起之秀 发表于 2005-8-17 13:59:00

[求助]如何正确调用数据库类的Insert()函数?

<FONT face=宋体 size=2>我想用一个dwg文件保存所有的预定义图块(图块较小),并且随时接受用户的定义,并插入到该文件中。我的思路如下:用户在当前文档中定义完形成图块的所有图形元素后,程序提示用户输入图块名,然后将其用AcDbDatabase::Insert(&amp;AcDbObjectId,char*,AcDbDatabase*)函数以图块的形式插入到预定义图形文件中,然而该函数的返回代码是16,即beNullObjectId,结果预定义图形文件中没有该图块,不知道这是什么原因。<BR>我将代码贴在下面(实际的实现情况稍有出入,请大家指正):<BR>CString prompt;<BR>prompt.Format("\n%s","请选择组成块的图形:");<BR>acutPrintf("%s",prompt);<BR>ads_name ssname;<BR>acedSSGet(NULL,NULL,NULL,NULL,ssname);<BR><BR>prompt.Format(_T("\n%s"),"请输入所要创建块的名称:");<BR>char input;<BR>int rc;<BR>rc=acedGetString(0,prompt,input);<BR>if (rc!=RTNORM) {<BR>return;<BR>}<BR><BR>AcDbDatabase* pCurDbDatabase;<BR>pCurDbDatabase=acdbHostApplicationServices()-&gt;workingDatabase();<BR>AcDbBlockTable *pDbBlockTable;<BR>pCurDbDatabase-&gt;getSymbolTable(pDbBlockTable,AcDb::kForWrite);<BR>AcDbBlockTableRecord *pDbBlockTableRecord;<BR>pDbBlockTableRecord=new AcDbBlockTableRecord;<BR>pDbBlockTableRecord-&gt;setName(input);<BR>AcDbObjectId BlockTableId;<BR>pDbBlockTable-&gt;add(BlockTableId,pDbBlockTableRecord);<BR>pDbBlockTable-&gt;close();<BR><BR>long length_Sel;<BR>acedSSLength(ssname,&amp;length_Sel);<BR>ads_name entres;<BR>AcDbObjectId OId;<BR>AcArray<ACDBOBJECTID> entitiesToMove;<BR>entitiesToMove.append(OId);<BR>for(long i=0;i<LENGTH_SEL;I++)<BR /> {<BR>acedSSName(ssname,i,entres);<BR>acdbGetObjectId(OId,entres);<BR>entitiesToMove=OId;<BR>pDbBlockTableRecord-&gt;assumeOwnershipOf(entitiesToMove);<BR><BR>}<BR>pDbBlockTableRecord-&gt;close();<BR>acedSSFree(ssname);<BR>AcDbBlockReference * pBlockReference;<BR>pBlockReference=new AcDbBlockReference;<BR>pBlockReference-&gt;setBlockTableRecord(BlockTableId);<BR><BR>pCurDbDatabase-&gt;getSymbolTable(pDbBlockTable,AcDb::kForRead);<BR><BR>pDbBlockTable-&gt;getAt(ACDB_MODEL_SPACE,pDbBlockTableRecord,AcDb::kForWrite);<BR>pDbBlockTable-&gt;close();<BR>AcDbObjectId BlockTableRecordId;<BR>pDbBlockTableRecord-&gt;appendAcDbEntity(BlockTableRecordId,pBlockReference);<BR>pDbBlockTableRecord-&gt;close();<BR>pBlockReference-&gt;close();//这里是为调试编写的,实际运行时,发现该图块的引用不能进行拖动操作<BR><BR><BR><BR>AcDbDatabase * newDb;<BR>newDb=new AcDbDatabase(Adesk::kFalse);<BR>CString strPath = appFullPath;//appFullPath 为预定义的应用程序路径<BR>strPath = strPath.Left(strPath.ReverseFind('\')) + "\\support\\temp.dwg";<BR>pCurDbDatabase-&gt;wblock(newDb,BlockTableId);<BR>newDb-&gt;saveAs(strPath);<BR><BR>strPath = strPath.Left(strPath.ReverseFind('\')) + "\\support\\test.dwg";<BR><BR>AcDbDatabase* pDbDatabase_BLOCK;<BR>pDbDatabase_BLOCK=new AcDbDatabase(Adesk::kFalse);<BR>pDbDatabase_BLOCK-&gt;readDwgFile(strPath,_SH_DENYRW);<BR>AcDbObjectId blockId;<BR>Acad::ErrorStatus es;<BR><BR>es=pDbDatabase_BLOCK-&gt;insert(blockId,input,newDb);<BR><BR><BR>if (es!=Acad::eOk) {<BR>acutPrintf("\n%s,%d","有错误!",es);<BR><BR>}<BR><BR>delete newDb;<BR>pDbDatabase_BLOCK-&gt;save();<BR>delete pDbDatabase_BLOCK;<BR><BR>真诚希望大家能指出问题所在</FONT>
页: [1]
查看完整版本: [求助]如何正确调用数据库类的Insert()函数?