CAD开发:DWG合并,dwg转换为dxf

一、需求

有时候由于跨度大、数据量大,会将数据存储于多个dwg文件,比如一条铁路的设计图纸就存在几个甚至几十个dwg文件中。如果想合并为一个dwg文件,手动合并太麻烦,所以就可以采用代码合并(不同度带的dwg直接合并没有意义,请大家注意)。本文使用teigha库进行编码。

二、直接上代码

[csharp]  view plain  copy
  1. /// <summary>  
  2. /// dwg文件转换为dxf文件,多个dwg文件合并为一个dxf或dwg文件  
  3. /// </summary>  
  4. /// <param name="pDWGFiles"></param>  
  5. /// <param name="pOutputFile">dxf或dwg保存路径</param>  
  6. /// <returns></returns>  
  7. public static bool MergeDWGFiles(List<string> pDWGFiles,string pOutputFile, DwgVersion pDWGVersion = DwgVersion.AC1024)  
  8. {  
  9.     if (mRServices == null)  
  10.     {  
  11.         mRServices = new Services();  
  12.     }  
  13.     try  
  14.     {  
  15.         //需求:将多个dwg文件合并为一个dxf文件  
  16.         Database destDB = new Database(falsefalse);  
  17.         //打开一个dwg  
  18.         destDB.ReadDwgFile(pDWGFiles[0], FileOpenMode.OpenForReadAndAllShare, falsestring.Empty);  
  19.   
  20.         for (int i = 1; i < pDWGFiles.Count; i++)  
  21.         {  
  22.             string pdwgFile = pDWGFiles[i];  
  23.             ObjectIdCollection pObjIDsColl = new ObjectIdCollection();  
  24.             Database srcDB = new Database(falsefalse);  
  25.             srcDB.ReadDwgFile(pdwgFile, FileOpenMode.OpenForReadAndAllShare, falsestring.Empty);  
  26.   
  27.             TransactionManager srcTMgr = srcDB.TransactionManager;             
  28.             using (Transaction pTransac = srcTMgr.StartTransaction())  
  29.             {  
  30.                 BlockTable srcBTable = srcTMgr.GetObject(srcDB.BlockTableId, OpenMode.ForRead) as BlockTable;  
  31.                 ObjectId srcModelSpaceId = srcBTable[BlockTableRecord.ModelSpace];  
  32.                 BlockTableRecord pBTRecord = srcTMgr.GetObject(srcModelSpaceId, OpenMode.ForRead) as BlockTableRecord;  
  33.                 IEnumerator pIterator = pBTRecord.GetEnumerator();  
  34.                 while (pIterator.MoveNext())  
  35.                 {  
  36.                     ObjectId objId = (ObjectId)pIterator.Current;  
  37.                     pObjIDsColl.Add(objId);  
  38.                     //Entity pEntity = pTMgr.GetObject(objId, OpenMode.ForRead) as Entity;  
  39.                 }  
  40.   
  41.                 TransactionManager destTMgr = destDB.TransactionManager;  
  42.                 using (Transaction destTransac = destTMgr.StartTransaction())   
  43.                 {  
  44.                     BlockTable destBTable = destTMgr.GetObject(destDB.BlockTableId, OpenMode.ForRead) as BlockTable;  
  45.                     ObjectId destModelSpaceId = destBTable[BlockTableRecord.ModelSpace];  
  46.                     IdMapping pIdMap = new IdMapping();  
  47.                     //块深度克隆。第一个参数是源dwg中实体id集合,第二个参数是目的dwg文件模型空间表的id,第三个参数是id之间映射关系(是输出值)  
  48.                     srcDB.WblockCloneObjects(pObjIDsColl, destModelSpaceId, pIdMap, DuplicateRecordCloning.Replace, false);  
  49.                     destTransac.Commit();  
  50.                 }  
  51.                 pTransac.Commit();  
  52.             }  
  53.             
  54.         }//for end  
  55.          //另存为DXF文件,Save13代表dxf文件,Save12代表存为dwg文件,AC1024是cad2010  
  56.         FileInfo pFInfo = new FileInfo(pOutputFile);  
  57.         if (pFInfo.Extension.ToLower() == ".dxf")  
  58.         {  
  59.             destDB.SaveAs(pOutputFile, SaveType.Save13, pDWGVersion, false, 16);  
  60.         }  
  61.         else if (pFInfo.Extension.ToLower() == ".dwg")  
  62.         {  
  63.             destDB.SaveAs(pOutputFile, SaveType.Save12, pDWGVersion, false, 16);  
  64.         }else  
  65.         {  
  66.             MessageBox.Show("转换输出文件格式不支持");  
  67.             return false;  
  68.         }  
  69.   
  70.     }  
  71.     catch(Teigha.Runtime.Exception ex){  
  72.         MessageBox.Show("dwg转换dxf失败:"+ ex.Message);  
  73.         return false;  
  74.     }  
  75.     return true;  
  76. }  
[csharp]  view plain  copy
  1.   
[csharp]  view plain  copy
  1.   
[csharp]  view plain  copy
  1. WblockCloneObjects是实现的关键  

猜你喜欢

转载自blog.csdn.net/hailiannanhai/article/details/79987143
dwg