工具箱相关
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

InsertDOM.cs 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. using GrxCAD.ApplicationServices;
  2. using GrxCAD.DatabaseServices;
  3. using GrxCAD.EditorInput;
  4. using GrxCAD.Geometry;
  5. using GrxCAD.Runtime;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.IO;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. using System.Windows;
  13. using System.Windows.Forms;
  14. namespace HCTools
  15. {
  16. public class InsertDOM
  17. {
  18. public static string dompath;//DOM文件所在位置
  19. public static string dwgpath;//DWG文件所在位置
  20. public void InsertDOMToCAD()
  21. {
  22. List<String> dwgname = GetNameList(dwgpath, ".dwg");//获取dwg文件
  23. if (dwgname.Count == 0)
  24. {
  25. MessageBox.Show("没有找到dwg文件!", "警告");
  26. return;
  27. }
  28. List<String> tifname = GetNameList(dompath, ".tif");//获取tif文件
  29. tifname.AddRange(GetNameList(dompath, ".Tif"));
  30. if (tifname.Count == 0)
  31. {
  32. MessageBox.Show("没有找到dom文件!", "警告");
  33. return;
  34. }
  35. List<String> tfwname = new List<string>();//tfw文件
  36. List<String> errolist = new List<string>();//无法找到对应tif的dwg文件
  37. foreach (String name in tifname)
  38. {
  39. if (name.Contains("tif"))
  40. tfwname.Add(name.Replace(".tif", ".tfw"));
  41. else
  42. tfwname.Add(name.Replace(".Tif", ".tfw"));
  43. }
  44. for (int filenum = 0; filenum < dwgname.Count; filenum++)
  45. {
  46. string dwg = dwgpath + "\\" + dwgname[filenum];
  47. if(tifname.Contains(dwgname[filenum].Replace(".dwg", ".tif"))||
  48. tifname.Contains(dwgname[filenum].Replace(".dwg", ".Tif")))
  49. {
  50. Document doc = GrxCAD.ApplicationServices.Application.DocumentManager.Add(dwg);//将dwg添加到cad中
  51. for (int i = 0; i < tifname.Count; i++)
  52. {
  53. //筛选与dwg同名的tif,并将tif插入到dwg中
  54. if (tifname[i] == (dwgname[filenum].Replace(".dwg", ".tif"))||
  55. tifname[i] == (dwgname[filenum].Replace(".dwg", ".Tif")))
  56. {
  57. InsertDOMs(tifname[i], tfwname[i], doc);
  58. tifname.RemoveAt(i);
  59. tfwname.RemoveAt(i);
  60. break;
  61. }
  62. }
  63. }
  64. else
  65. {
  66. errolist.Add(dwgname[filenum]);
  67. }
  68. }
  69. if (errolist.Count == 0)
  70. MessageBox.Show("所有DOM插入成功","提示");
  71. else
  72. {
  73. string erromsg=string.Empty;
  74. foreach(string dwg in errolist)
  75. {
  76. erromsg += dwg+"\n";
  77. }
  78. MessageBox.Show(erromsg+"无法找到与之匹配的tif图,插入失败!","警告");
  79. }
  80. }
  81. /// <summary>
  82. /// 获取文件夹中相应格式的所有文件
  83. /// </summary>
  84. private static List<String> GetNameList(String filespath, String filetype)
  85. {
  86. DirectoryInfo root = new DirectoryInfo(filespath);
  87. List<String> filename = new List<string>(); //文件名
  88. FileInfo[] files = root.GetFiles();
  89. foreach (FileInfo file in files)
  90. {
  91. if (file.Name.Substring(file.Name.Length - 4, 4) != filetype)
  92. continue;
  93. else
  94. filename.Add(file.Name);
  95. }
  96. return filename;
  97. }
  98. /// <summary>
  99. /// 插入DOM
  100. /// </summary>
  101. public void InsertDOMs(string tiffilename, string tfwfilename, Document doc)
  102. {
  103. Database db = doc.Database;
  104. Editor ed = GrxCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
  105. ObjectIdCollection obidcoll = new ObjectIdCollection();
  106. string imageName = new FileInfo(tiffilename).Name;
  107. double scale = 0;
  108. double X = 0, Y = 0;
  109. try
  110. {
  111. StreamReader sr = new StreamReader(dompath + "\\" + tfwfilename);
  112. scale = Convert.ToDouble(sr.ReadLine());
  113. sr.ReadLine();
  114. sr.ReadLine();
  115. sr.ReadLine();
  116. X = Convert.ToDouble(sr.ReadLine());
  117. Y = Convert.ToDouble(sr.ReadLine());
  118. sr.Close();
  119. sr.Dispose();
  120. }
  121. catch (System.Exception ex)
  122. {
  123. MessageBox.Show("警告:" + tiffilename + "图像没有相应的.tfw文件或tfw文件出错,无法正确插入!\r\n\r\n");
  124. }
  125. using (DocumentLock docLock = doc.LockDocument())
  126. {
  127. using (Transaction tran = db.TransactionManager.StartTransaction())
  128. {
  129. //建立名为DOM的图层
  130. LayerTable lt = tran.GetObject(db.LayerTableId, OpenMode.ForWrite) as LayerTable;
  131. try
  132. {
  133. if (!lt.Has("DOM"))
  134. {
  135. LayerTableRecord ltrec = new LayerTableRecord();
  136. ltrec.Name = "DOM";
  137. ObjectId obid = lt.Add(ltrec);
  138. tran.AddNewlyCreatedDBObject(ltrec, true);
  139. }
  140. }
  141. catch (GrxCAD.Runtime.Exception ex)
  142. {
  143. MessageBox.Show(ex.ToString());
  144. }
  145. tran.Commit();
  146. }
  147. using (Transaction tran = db.TransactionManager.StartTransaction())
  148. {
  149. //插入DOM
  150. BlockTable blktbl = tran.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
  151. BlockTableRecord blktblrec = tran.GetObject(blktbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
  152. DrawOrderTable dot = tran.GetObject(blktblrec.DrawOrderTableId, OpenMode.ForWrite) as DrawOrderTable;
  153. try
  154. {
  155. #region
  156. //RasterImageDef dom = new RasterImageDef();
  157. ////domimage.TransformBy();
  158. //dom.ActiveFileName = domfilename;
  159. ////dom.OpenImage();
  160. //dom.Load();
  161. //dom.ImageModified = true;
  162. //dom.OpenImage();
  163. //dom.Embed();
  164. //RasterImage domimage = new RasterImage();
  165. ////Matrix3d.Mirroring();//将栅格图像坐标关于Y轴镜像还原
  166. ////Matrix3d.Displacement();//在Y轴正方向上移动图像原始高度距离
  167. ////domimage.TransformBy();//最后用6参数组织缩放、旋转、移动的变换矩阵
  168. //tran.AddNewlyCreatedDBObject(dom, true);
  169. //tran.Commit();
  170. ///////////////////
  171. //RasterImage domimage = new RasterImage();
  172. //PromptEntityOptions prent = new PromptEntityOptions("\n请选择山歌图像");
  173. //prent.SetRejectMessage("\n选择的不是栅格图像");
  174. //prent.AddAllowedClass(typeof(RasterImage), true);
  175. //PromptEntityResult prentres = ed.GetEntity(prent);
  176. //if (prentres.Status != PromptStatus.OK)
  177. // return;
  178. //Matrix3d transform;
  179. //ObjectId imgid = prentres.ObjectId;
  180. //domimage = (RasterImage)tran.GetObject(imgid, OpenMode.ForRead);
  181. //transform = domimage.PixelToModelTransform;
  182. #endregion
  183. //////////////////////创建图像定义对象
  184. ObjectId imgid = RasterImageDef.GetImageDictionary(db);
  185. if (imgid == ObjectId.Null)
  186. imgid = RasterImageDef.CreateImageDictionary(db);
  187. DBDictionary imgdict = tran.GetObject(imgid, OpenMode.ForWrite) as DBDictionary;
  188. RasterImageDef imgdef = new RasterImageDef();
  189. imgdef.SourceFileName = dompath + "\\" + tiffilename;
  190. imgdef.Load();
  191. ObjectId imgdefid = imgdict.SetAt(imageName, imgdef);
  192. tran.AddNewlyCreatedDBObject(imgdef, true);
  193. RasterImage image = new RasterImage();
  194. image.ImageDefId = imgdefid;
  195. image.Layer = "DOM";
  196. blktblrec.AppendEntity(image);
  197. tran.AddNewlyCreatedDBObject(image, true);
  198. double height = imgdef.Size.Y;
  199. Vector3d vt1 = scale * image.Orientation.Xaxis;
  200. Vector3d vt2 = scale * image.Orientation.Yaxis;
  201. image.AssociateRasterDef(imgdef);
  202. //image.Draw();
  203. image.Orientation = new CoordinateSystem3d(new Point3d(X, Y - height * scale, 0), vt1, vt2);
  204. //影像后置
  205. obidcoll.Add(image.ObjectId);
  206. dot.MoveToBottom(obidcoll);
  207. obidcoll = new ObjectIdCollection();
  208. tran.Commit();
  209. GrxCAD.ApplicationServices.Application.UpdateScreen();
  210. }
  211. catch (GrxCAD.Runtime.Exception ex)
  212. {
  213. MessageBox.Show(ex.ToString());
  214. }
  215. }
  216. }
  217. doc.CloseAndSave(db.Filename);
  218. }
  219. }
  220. }