using GrxCAD.ApplicationServices; using GrxCAD.DatabaseServices; using GrxCAD.EditorInput; using GrxCAD.Geometry; using GrxCAD.Runtime; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Forms; namespace HCTools { public class InsertDOM { public static string dompath;//DOM文件所在位置 public static string dwgpath;//DWG文件所在位置 public void InsertDOMToCAD() { List dwgname = GetNameList(dwgpath, ".dwg");//获取dwg文件 if (dwgname.Count == 0) { MessageBox.Show("没有找到dwg文件!", "警告"); return; } List tifname = GetNameList(dompath, ".tif");//获取tif文件 tifname.AddRange(GetNameList(dompath, ".Tif")); if (tifname.Count == 0) { MessageBox.Show("没有找到dom文件!", "警告"); return; } List tfwname = new List();//tfw文件 List errolist = new List();//无法找到对应tif的dwg文件 foreach (String name in tifname) { if (name.Contains("tif")) tfwname.Add(name.Replace(".tif", ".tfw")); else tfwname.Add(name.Replace(".Tif", ".tfw")); } for (int filenum = 0; filenum < dwgname.Count; filenum++) { string dwg = dwgpath + "\\" + dwgname[filenum]; if(tifname.Contains(dwgname[filenum].Replace(".dwg", ".tif"))|| tifname.Contains(dwgname[filenum].Replace(".dwg", ".Tif"))) { Document doc = GrxCAD.ApplicationServices.Application.DocumentManager.Add(dwg);//将dwg添加到cad中 for (int i = 0; i < tifname.Count; i++) { //筛选与dwg同名的tif,并将tif插入到dwg中 if (tifname[i] == (dwgname[filenum].Replace(".dwg", ".tif"))|| tifname[i] == (dwgname[filenum].Replace(".dwg", ".Tif"))) { InsertDOMs(tifname[i], tfwname[i], doc); tifname.RemoveAt(i); tfwname.RemoveAt(i); break; } } } else { errolist.Add(dwgname[filenum]); } } if (errolist.Count == 0) MessageBox.Show("所有DOM插入成功","提示"); else { string erromsg=string.Empty; foreach(string dwg in errolist) { erromsg += dwg+"\n"; } MessageBox.Show(erromsg+"无法找到与之匹配的tif图,插入失败!","警告"); } } /// /// 获取文件夹中相应格式的所有文件 /// private static List GetNameList(String filespath, String filetype) { DirectoryInfo root = new DirectoryInfo(filespath); List filename = new List(); //文件名 FileInfo[] files = root.GetFiles(); foreach (FileInfo file in files) { if (file.Name.Substring(file.Name.Length - 4, 4) != filetype) continue; else filename.Add(file.Name); } return filename; } /// /// 插入DOM /// public void InsertDOMs(string tiffilename, string tfwfilename, Document doc) { Database db = doc.Database; Editor ed = GrxCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor; ObjectIdCollection obidcoll = new ObjectIdCollection(); string imageName = new FileInfo(tiffilename).Name; double scale = 0; double X = 0, Y = 0; try { StreamReader sr = new StreamReader(dompath + "\\" + tfwfilename); scale = Convert.ToDouble(sr.ReadLine()); sr.ReadLine(); sr.ReadLine(); sr.ReadLine(); X = Convert.ToDouble(sr.ReadLine()); Y = Convert.ToDouble(sr.ReadLine()); sr.Close(); sr.Dispose(); } catch (System.Exception ex) { MessageBox.Show("警告:" + tiffilename + "图像没有相应的.tfw文件或tfw文件出错,无法正确插入!\r\n\r\n"); } using (DocumentLock docLock = doc.LockDocument()) { using (Transaction tran = db.TransactionManager.StartTransaction()) { //建立名为DOM的图层 LayerTable lt = tran.GetObject(db.LayerTableId, OpenMode.ForWrite) as LayerTable; try { if (!lt.Has("DOM")) { LayerTableRecord ltrec = new LayerTableRecord(); ltrec.Name = "DOM"; ObjectId obid = lt.Add(ltrec); tran.AddNewlyCreatedDBObject(ltrec, true); } } catch (GrxCAD.Runtime.Exception ex) { MessageBox.Show(ex.ToString()); } tran.Commit(); } using (Transaction tran = db.TransactionManager.StartTransaction()) { //插入DOM BlockTable blktbl = tran.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; BlockTableRecord blktblrec = tran.GetObject(blktbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; DrawOrderTable dot = tran.GetObject(blktblrec.DrawOrderTableId, OpenMode.ForWrite) as DrawOrderTable; try { #region //RasterImageDef dom = new RasterImageDef(); ////domimage.TransformBy(); //dom.ActiveFileName = domfilename; ////dom.OpenImage(); //dom.Load(); //dom.ImageModified = true; //dom.OpenImage(); //dom.Embed(); //RasterImage domimage = new RasterImage(); ////Matrix3d.Mirroring();//将栅格图像坐标关于Y轴镜像还原 ////Matrix3d.Displacement();//在Y轴正方向上移动图像原始高度距离 ////domimage.TransformBy();//最后用6参数组织缩放、旋转、移动的变换矩阵 //tran.AddNewlyCreatedDBObject(dom, true); //tran.Commit(); /////////////////// //RasterImage domimage = new RasterImage(); //PromptEntityOptions prent = new PromptEntityOptions("\n请选择山歌图像"); //prent.SetRejectMessage("\n选择的不是栅格图像"); //prent.AddAllowedClass(typeof(RasterImage), true); //PromptEntityResult prentres = ed.GetEntity(prent); //if (prentres.Status != PromptStatus.OK) // return; //Matrix3d transform; //ObjectId imgid = prentres.ObjectId; //domimage = (RasterImage)tran.GetObject(imgid, OpenMode.ForRead); //transform = domimage.PixelToModelTransform; #endregion //////////////////////创建图像定义对象 ObjectId imgid = RasterImageDef.GetImageDictionary(db); if (imgid == ObjectId.Null) imgid = RasterImageDef.CreateImageDictionary(db); DBDictionary imgdict = tran.GetObject(imgid, OpenMode.ForWrite) as DBDictionary; RasterImageDef imgdef = new RasterImageDef(); imgdef.SourceFileName = dompath + "\\" + tiffilename; imgdef.Load(); ObjectId imgdefid = imgdict.SetAt(imageName, imgdef); tran.AddNewlyCreatedDBObject(imgdef, true); RasterImage image = new RasterImage(); image.ImageDefId = imgdefid; image.Layer = "DOM"; blktblrec.AppendEntity(image); tran.AddNewlyCreatedDBObject(image, true); double height = imgdef.Size.Y; Vector3d vt1 = scale * image.Orientation.Xaxis; Vector3d vt2 = scale * image.Orientation.Yaxis; image.AssociateRasterDef(imgdef); //image.Draw(); image.Orientation = new CoordinateSystem3d(new Point3d(X, Y - height * scale, 0), vt1, vt2); //影像后置 obidcoll.Add(image.ObjectId); dot.MoveToBottom(obidcoll); obidcoll = new ObjectIdCollection(); tran.Commit(); GrxCAD.ApplicationServices.Application.UpdateScreen(); } catch (GrxCAD.Runtime.Exception ex) { MessageBox.Show(ex.ToString()); } } } doc.CloseAndSave(db.Filename); } } }