给图纸中的光栅对象、外部参照重命名

作者: admin 分类: C++,CAD,ObjectARX 发布时间: 2021-02-10 17:16

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

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表评论

标签云