一、引言
AutoCAD 是目前世界上功能最强大的绘图软件。在测绘行业,使用 AutoCAD 直接绘图,或用以 AutoCAD 为平台开发出的各种绘图软件来绘图,大大提高了绘图的精度、准度和速度。今天介绍一下如何用C#编写将野外测量点坐标展入到 AutoCAD 的.NET程序集。
二、知识准备
1、了解dat坐标文件的格式,本次以常用格式 “ 点名,编码,东坐标,北坐标,高程 ” 为例。
2、文件读取,字符串处理
3、AutoCAD .NET 开发基础
三、需要注意的几点
1、测图比例尺(本代码没有设置绘图比例尺功能)。
2、测量坐标系与 AutoCAD 坐标系的区别:坐标轴向、角度旋转方向。
3、顺便提一下,在计算机编程中,角度都是弧度制的,然而测量常用的是角度制,遇上角度时,就不可避免会出现角度与弧度的互换。写转换代码时,务必要注意编程语言的精度,避免出现精度损失。
四、效果图
五、附源代码,希望大家多多给予指点!!!
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Geometry; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.Internal; using System.Windows.Forms; using System.IO; namespace CAD展点 { public class Class1 { [CommandMethod("InsertPoint")] public void InsertPoint() { //选择点文件.dat OpenFileDialog OpenDlg = new OpenFileDialog(); OpenDlg.Title = "点文件.dat"; OpenDlg.Filter = "点文件(*.dat)|*.dat"; ReadDatFile datFile; if (OpenDlg.ShowDialog() == DialogResult.OK) { datFile = new ReadDatFile(OpenDlg.FileName.ToString()); } else { return; } //获取当前文档和数据库 Document acDoc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument; Database acCurDb = acDoc.Database; //启动事务 using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) { //以读模式打开块表 BlockTable acBlkTbl; acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable; //以写模式打开 Block 表记录 Model 空间 BlockTableRecord acBlkTblRec; acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; //创建点 try { foreach (var item in datFile.Result) { //点位 using (DBPoint pt = new DBPoint(new Point3d(item.X, item.Y, item.H))) { pt.ColorIndex = 1; //将新对象添加到块表记录和事务 acBlkTblRec.AppendEntity(pt); acTrans.AddNewlyCreatedDBObject(pt, true); //释放DBObject对象 } //点名 using (DBText acText = new DBText()) { acText.Position = new Point3d(item.X+0.25, item.Y-0.375, item.H); acText.ColorIndex = 1; acText.Height = 1; acText.WidthFactor = 0.8; acText.TextString = item.Name; acBlkTblRec.AppendEntity(acText); acTrans.AddNewlyCreatedDBObject(acText, true); //释放DBObject对象 } } MessageBox.Show("展点完成,共展"+datFile.Result.Count +"个点!"); } catch { MessageBox.Show("展点失败!"); return; } //清空集合 datFile.Result.Clear(); //更改点样式 acCurDb.Pdmode = 35; acCurDb.Pdsize = 0.5; //将新对象保存到数据库 acTrans.Commit(); } } } class 坐标 { public string Name { get; set; } public double X { get; set; } public double Y { get; set; } public double H { get; set; } public 坐标(string name, double x, double y, double h) { Name = name; X = x; Y = y; H = h; } } class ReadDatFile { public List<坐标> Result { get; set; } public ReadDatFile(string file) { Result = new List<坐标>(); FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); StreamReader m_streamReader = new StreamReader(fs); m_streamReader.BaseStream.Seek(0, SeekOrigin.Begin); string strLine = m_streamReader.ReadLine(); int a1 = strLine.Split(',').Length - 1; // 从数据流中读取每一行,直到文件的最后一行 坐标 pt; while (strLine != null) { string[] s = strLine.Split(',');//注意此处假设dat中分隔号是半角的逗号 try { pt = new 坐标(s[0], Convert.ToDouble(s[2]), Convert.ToDouble(s[3]), Convert.ToDouble(s[4])); Result.Add(pt); strLine = m_streamReader.ReadLine(); } catch { MessageBox.Show("请检查dat坐标格式是否为:点名,编码,东坐标,北坐标,高程"); return; } } fs.Close(); m_streamReader.Close(); } } }