![CAD开发:DWG合并 dwg转换为dxf](https://1500zi.500zi.com/uploadfile/img/15/396/f38e149f05b9979dd776080985a109dd.jpg)
一、需求
有时候由于跨度大、数据量大,会将数据存储于多个dwg文件,比如一条铁路的设计图纸就存在几个甚至几十个dwg文件中。如果想合并为一个dwg文件,手动合并太麻烦,所以就可以采用代码合并(不同度带的dwg直接合并没有意义,请大家注意)。本文使用teigha库进行编码。
二、直接上代码
[csharp]view plaincopy///<summary>///dwg文件转换为dxf文件,多个dwg文件合并为一个dxf或dwg文件///</summary>///<paramname="pDWGFiles"></param>///<paramname="pOutputFile">dxf或dwg保存路径</param>///<returns></returns>publicstaticboolMergeDWGFiles(List<string>pDWGFiles,stringpOutputFile,DwgVersionpDWGVersion=DwgVersion.AC1024){if(mRServices==null){mRServices=newServices();}try{//需求:将多个dwg文件合并为一个dxf文件DatabasedestDB=newDatabase(false,false);//打开一个dwgdestDB.ReadDwgFile(pDWGFiles[0],FileOpenMode.OpenForReadAndAllShare,false,string.Empty);for(inti=1;i<pDWGFiles.Count;i++){stringpdwgFile=pDWGFiles[i];ObjectIdCollectionpObjIDsColl=newObjectIdCollection();DatabasesrcDB=newDatabase(false,false);srcDB.ReadDwgFile(pdwgFile,FileOpenMode.OpenForReadAndAllShare,false,string.Empty);TransactionManagersrcTMgr=srcDB.TransactionManager;using(TransactionpTransac=srcTMgr.StartTransaction()){BlockTablesrcBTable=srcTMgr.GetObject(srcDB.BlockTableId,OpenMode.ForRead)asBlockTable;ObjectIdsrcModelSpaceId=srcBTable[BlockTableRecord.ModelSpace];BlockTableRecordpBTRecord=srcTMgr.GetObject(srcModelSpaceId,OpenMode.ForRead)asBlockTableRecord;IEnumeratorpIterator=pBTRecord.GetEnumerator();while(pIterator.MoveNext()){ObjectIdobjId=(ObjectId)pIterator.Current;pObjIDsColl.Add(objId);//EntitypEntity=pTMgr.GetObject(objId,OpenMode.ForRead)asEntity;}TransactionManagerdestTMgr=destDB.TransactionManager;using(TransactiondestTransac=destTMgr.StartTransaction()){BlockTabledestBTable=destTMgr.GetObject(destDB.BlockTableId,OpenMode.ForRead)asBlockTable;ObjectIddestModelSpaceId=destBTable[BlockTableRecord.ModelSpace];IdMappingpIdMap=newIdMapping();//块深度克隆。第一个参数是源dwg中实体id集合,第二个参数是目的dwg文件模型空间表的id,第三个参数是id之间映射关系(是输出值)srcDB.WblockCloneObjects(pObjIDsColl,destModelSpaceId,pIdMap,DuplicateRecordCloning.Replace,false);mit();}mit();}}//forend//另存为DXF文件,Save13代表dxf文件,Save12代表存为dwg文件,AC1024是cadFileInfopFInfo=newFileInfo(pOutputFile);if(pFInfo.Extension.ToLower()==".dxf"){destDB.SaveAs(pOutputFile,SaveType.Save13,pDWGVersion,false,16);}elseif(pFInfo.Extension.ToLower()==".dwg"){destDB.SaveAs(pOutputFile,SaveType.Save12,pDWGVersion,false,16);}else{MessageBox.Show("转换输出文件格式不支持");returnfalse;}}catch(Teigha.Runtime.Exceptionex){MessageBox.Show("dwg转换dxf失败:"+ex.Message);returnfalse;}returntrue;}
[csharp]view plaincopy
[csharp]view plaincopy
[csharp]view plaincopyWblockCloneObjects是实现的关键