objectArx --- 数据库基础操作

时间:2025-03-15 07:30:50
// 拷贝 其他数据库 的块定义 到 本数据库:插入的文件名、插入 块表记录名字 AcDbObjectId Block::CopyBlockFromOtherDwg(const ACHAR *fileName, const ACHAR *blkDefName) { // 内存中创建数据库,因为是为了存读取数据库,需要一个纯空数据库,所以false AcDbObjectId blkRcdId = AcDbObjectId::kNull; AcDbDatabase *pDb = new AcDbDatabase(false); Acad::ErrorStatus es = pDb->readDwgFile(fileName); // 纠错函数:打开文件失败,删除数据库指针指向的内存,清空指针 // 如果不需要操作,就用assert断言 if (es != Acad::eOk) { delete pDb; pDb = NULL; acutPrintf(_T("\n读取文件错误,文件名为:%s"), fileName); return blkRcdId; } // 获得 读入 的 数据库 的 块表指针 AcDbBlockTable *pBlkTbl = NULL; es = pDb->getBlockTable(pBlkTbl, AcDb::kForRead); // 断言获取正常,若为false则弹出警告框 assert(es == Acad::eOk); bool bRet = false; // 如果 读入的数据库块表 包含 名为 blkDefName 的块表记录 if (pBlkTbl->has(blkDefName)) { // 通过块表名查找块表记录ID AcDbObjectId destBlkDefId; es = pBlkTbl->getAt(blkDefName, destBlkDefId); // 创建临时数据库指针:wblock方法在内存中创建数据库,只需要一个指针指向这个数据库,所以为NULL AcDbDatabase *pTemp = NULL; // wblock写块操作:将块表记录destBlkDefId写入临时数据库pTemp中 es = pDb->wblock(pTemp, destBlkDefId); assert(es == Acad::eOk); // insert读块操作:定位 块表记录名blkDefName 及 数据库pTemp,读入块定义, // 返回块表记录ID blkRcdId es = acdbHostApplicationServices()->workingDatabase()-> insert(blkRcdId, blkDefName, pTemp); assert(es == Acad::eOk); // 清理临时数据库内存和指针 delete pTemp; pTemp = NULL; } // 若没有找到指定名字的块表记录 else { acutPrintf(_T("\n给定的文件中不存在指定的块名,块名为:%s"), blkDefName); } pBlkTbl->close(); delete pDb; pDb = NULL; return blkRcdId; } // 写块定义 到 dwg文件中:目标文件名、来源块表记录名(块定义)、是否覆盖同名、待读取数据库指针 AcDbObjectId Block::InsertDwgBlkDef(const ACHAR *dwgFileName, const ACHAR *blkName, bool bOverwriteIfExist, AcDbDatabase *pDb) { // 从pDb获得块参照id:块表记录名、数据库指针 AcDbObjectId blkDefId = GetBlkDefId(blkName, pDb); // 判断 未找到块定义 或者 允许覆盖同名块定义 if (blkDefId.isNull() || bOverwriteIfExist) { // waccess函数,C++文件判断函数 // 如果文件不存在或无指定的访问权限,返回-1 if (_taccess(dwgFileName, 0) != -1) { // 创建空的数据库对象指针,读取目标数据库用于输出 AcDbDatabase *pBlkDb = new AcDbDatabase(false); Acad::ErrorStatus es = pBlkDb->readDwgFile(dwgFileName); if (es == Acad::eOk) { // 插入块定义id到目标文件中:返回目标块定义id、源文件块定义名称、目标数据库对象指针 es = pDb->insert(blkDefId, blkName, pBlkDb); if (es != Acad::eOk) { CString strMsg; strMsg.Format(_T("插入图形失败,错误为:%s"), acadErrorStatusText(es)); AfxMessageBox(strMsg); } } else { CString strMsg; strMsg.Format(_T("读取图形失败,错误为:%s"), acadErrorStatusText(es)); AfxMessageBox(strMsg); } delete pBlkDb; } else { AfxMessageBox(_T("文件不存在!")); } } return blkDefId; }