一、需求
有时候由于跨度大、数据量大,会将数据存储于多个dwg文件,比如一条铁路的设计图纸就存在几个甚至几十个dwg文件中。如果想合并为一个dwg文件,手动合并太麻烦,所以就可以采用代码合并(不同度带的dwg直接合并没有意义,请大家注意)。本文使用teigha库进行编码。
二、直接上代码
- /// <summary>
- /// dwg文件转换为dxf文件,多个dwg文件合并为一个dxf或dwg文件
- /// </summary>
- /// <param name="pDWGFiles"></param>
- /// <param name="pOutputFile">dxf或dwg保存路径</param>
- /// <returns></returns>
- public static bool MergeDWGFiles(List<string> pDWGFiles,string pOutputFile, DwgVersion pDWGVersion = DwgVersion.AC1024)
- {
- if (mRServices == null)
- {
- mRServices = new Services();
- }
- try
- {
- //需求:将多个dwg文件合并为一个dxf文件
- Database destDB = new Database(false, false);
- //打开一个dwg
- destDB.ReadDwgFile(pDWGFiles[0], FileOpenMode.OpenForReadAndAllShare, false, string.Empty);
- for (int i = 1; i < pDWGFiles.Count; i++)
- {
- string pdwgFile = pDWGFiles[i];
- ObjectIdCollection pObjIDsColl = new ObjectIdCollection();
- Database srcDB = new Database(false, false);
- srcDB.ReadDwgFile(pdwgFile, FileOpenMode.OpenForReadAndAllShare, false, string.Empty);
- TransactionManager srcTMgr = srcDB.TransactionManager;
- using (Transaction pTransac = srcTMgr.StartTransaction())
- {
- BlockTable srcBTable = srcTMgr.GetObject(srcDB.BlockTableId, OpenMode.ForRead) as BlockTable;
- ObjectId srcModelSpaceId = srcBTable[BlockTableRecord.ModelSpace];
- BlockTableRecord pBTRecord = srcTMgr.GetObject(srcModelSpaceId, OpenMode.ForRead) as BlockTableRecord;
- IEnumerator pIterator = pBTRecord.GetEnumerator();
- while (pIterator.MoveNext())
- {
- ObjectId objId = (ObjectId)pIterator.Current;
- pObjIDsColl.Add(objId);
- //Entity pEntity = pTMgr.GetObject(objId, OpenMode.ForRead) as Entity;
- }
- TransactionManager destTMgr = destDB.TransactionManager;
- using (Transaction destTransac = destTMgr.StartTransaction())
- {
- BlockTable destBTable = destTMgr.GetObject(destDB.BlockTableId, OpenMode.ForRead) as BlockTable;
- ObjectId destModelSpaceId = destBTable[BlockTableRecord.ModelSpace];
- IdMapping pIdMap = new IdMapping();
- //块深度克隆。第一个参数是源dwg中实体id集合,第二个参数是目的dwg文件模型空间表的id,第三个参数是id之间映射关系(是输出值)
- srcDB.WblockCloneObjects(pObjIDsColl, destModelSpaceId, pIdMap, DuplicateRecordCloning.Replace, false);
- destTransac.Commit();
- }
- pTransac.Commit();
- }
- }//for end
- //另存为DXF文件,Save13代表dxf文件,Save12代表存为dwg文件,AC1024是cad2010
- FileInfo pFInfo = new FileInfo(pOutputFile);
- if (pFInfo.Extension.ToLower() == ".dxf")
- {
- destDB.SaveAs(pOutputFile, SaveType.Save13, pDWGVersion, false, 16);
- }
- else if (pFInfo.Extension.ToLower() == ".dwg")
- {
- destDB.SaveAs(pOutputFile, SaveType.Save12, pDWGVersion, false, 16);
- }else
- {
- MessageBox.Show("转换输出文件格式不支持");
- return false;
- }
- }
- catch(Teigha.Runtime.Exception ex){
- MessageBox.Show("dwg转换dxf失败:"+ ex.Message);
- return false;
- }
- return true;
- }
- WblockCloneObjects是实现的关键