给图纸中的光栅对象、外部参照重命名
给图纸中的光栅对象重命名,使其名称中带有引用它的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(); } }