给图纸中的光栅对象重命名,使其名称中带有引用它的dwg文件的名称,便于区分
例如: 【a.dwg】 使用【b.jpg】,使用函数后【b.jpg】文件名变为【a.dwg-b.jpg】,这样转移【a.dwg】到其他位置时,不用cad打开图纸也能知道【b.jpg】与【a.dwg】有关联,可以将【b.jpg】一并复制
void ReDefineRasterImg(AcDbDatabase *pDb)
{
CString s_OldFileName,s_NewFileName,s_ImgPath,s_Tmp,s_DwgPath,s_OldFilePath;
Acad::ErrorStatus es;
const TCHAR *pDwgFileName = NULL;
pDb->getFilename(pDwgFileName);
s_DwgPath = CHeXinFile::GetPathFromFileName(pDwgFileName);
AcDbObjectId objId = AcDbRasterImageDef::imageDictionary(pDb); //获取dwg中的光栅定义字典的对象ID
if (objId != AcDbObjectId::kNull)
{
AcDbDictionary *pDic=NULL;
AcDbRasterImageDef *pRasImgDef=NULL;
if(Acad::eOk == acdbOpenAcDbObject((AcDbObject*&)pDic,objId,AcDb::kForRead)) //打开定义光栅的字典对象
{
AcDbDictionaryIterator *pIt=pDic->newIterator();
for (;!pIt->done();pIt->next())
{
if(Acad::eOk ==pIt->getObject((AcDbObject*&)pRasImgDef,AcDb::kForWrite))
{
s_OldFilePath =pRasImgDef->sourceFileName();
s_ImgPath = CHeXinFile::GetPathFromFileName(s_OldFilePath);
s_OldFileName = CHeXinFile::GetNameFromFileName(s_OldFilePath);
s_Tmp = CHeXinFile::GetNameFromFileName(pDwgFileName)+_T("-")+ s_OldFileName;
s_NewFileName.Format(_T("%s%s"),s_ImgPath,s_Tmp);
SetCurrentDirectory(s_DwgPath); //设置工作路径,这样可以解析光栅对象中的相对路径
CopyFile(pRasImgDef->sourceFileName(),s_NewFileName,FALSE); //直接重命名文件被cad占用,不能实现 。 需要复制原有的光栅文件并重新设置光栅路径实现
pRasImgDef->setSourceFileName(s_NewFileName);
pRasImgDef->load();
pRasImgDef->close();
CFile::Remove(s_OldFilePath); //删除原有光栅文件
}
}
delete pIt;
pDic->close();
}
}
}
----------------------------------------------------------------------------------------------------------------
重命名外部参照对象的名称,功能与ReDefineRasterImg相同,给被引用的dwg文件名加上引用它的dwg文件的文件名
void ReDefineXref(AcDbDatabase *pDb)
{
CString s_OldFileName,s_NewFileName,s_XrefPath,s_Tmp,s_DwgPath;
Acad::ErrorStatus es;
const TCHAR *pDwgFileName = NULL;
pDb->getFilename(pDwgFileName);
s_DwgPath = CHeXinFile::GetPathFromFileName(pDwgFileName);
const TCHAR *pBuf = NULL;
AcDbBlockTable *pBlkTb=NULL;
if(Acad::eOk == pDb->getSymbolTable(pBlkTb,AcDb::kForRead))
{
AcDbBlockTableIterator *pIt=NULL;
pBlkTb->newIterator(pIt);
for (;!pIt->done();pIt->step())
{
AcDbBlockTableRecord *pTBRec=NULL;
pIt->getRecord(pTBRec,AcDb::kForWrite);
es = pTBRec->pathName(pBuf); //获取外部参照的路径
if(_tcsclen(pBuf) > 0 && (pTBRec->isFromExternalReference() || pTBRec->isFromOverlayReference()))
{
s_XrefPath = CHeXinFile::GetPathFromFileName(pBuf);
s_OldFileName = CHeXinFile::GetNameFromFileName(pBuf);
s_Tmp = CHeXinFile::GetNameFromFileName(pDwgFileName)+_T("-")+ s_OldFileName;
s_NewFileName.Format(_T("%s%s"),s_XrefPath,s_Tmp);
SetCurrentDirectory(s_DwgPath);
CFile::Rename(pBuf,s_NewFileName);
pTBRec->setPathName(s_NewFileName);
}
pTBRec->close();
}
delete pIt;
pBlkTb->close();
}
}