objectArx --- 数据库基础操作
// 拷贝 其他数据库 的块定义 到 本数据库:插入的文件名、插入 块表记录名字
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;
}