基于C#编程语言的CAD二次开发技术---展测量点坐标

一、引言

      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();
        }
    }
}
时间: 2024-10-06 06:58:03

基于C#编程语言的CAD二次开发技术---展测量点坐标的相关文章

基于PHP实战ThinkSNS V3二次开发

基于PHP实战ThinkSNS V3二次开发(系统架构.网站定制化开发.问答系统开发) 课程分类:PHP 适合人群:中级 课时数量:25课时 服务类型:C类(普通服务类课程) 用到技术:PHP.ThinkSNS V3二次开发 涉及项目:ThinkSNS V3二次开发.问答系统 咨询QQ:1840215592 课程内容简介: 由于ThinkSNS产品提供了完整的微博及系统功能,并提供了非常友好的二次开发规范.越多越多的企业和开发人员选择使用ThinkSNS构建成熟的SNS企业网站和商业项目.本课程

C#进行CAD二次开发环境配置

最近被公司分配到了做CAD二次开发.也是初次接触这方面的东西,其实是有些无从下手的感觉.因为公司这边也没有人有时间带我,只能是自己看书,然后再写一些Demo,再结合实际的应用来一点点的学习.废话不多说,推荐一本我入门的书籍,就是李冠亿先生的<深居浅出AutoCAD二次开发>,写的非常不错,把这本书中的Demo自己手写一遍大概就能知道CAD二次开发到底是个什么东西了. 开发环境配置 开发环境 Win10 x64 CAD 2010 Visual Studio 2012 环境配置 首先要安装CAD软

CAD二次开发中浮动面板不浮动的问题

CAD二次开发中创建了一个浮动面板,想让它创建出来后以浮动状态显示, 但是DockSides.None设置完后,面板还是不浮动.搞了很久,最后原来是 需要先设置Visible,再设置DockSides,这样就好了. ps = new PaletteSet("PSCollectPart"); ps.Style = PaletteSetStyles.NameEditable | PaletteSetStyles.ShowPropertiesMenu | PaletteSetStyles.S

CAD二次开发控件,dwg控件,网页DWG控件,手机浏览编辑DWG控件

梦想绘图插件5.2(MxDraw5.2) 是国内最强,最专业的CAD开发插件(控件),不需要AutoCAD就能独立运行. 控件使用VC 2010开发,具有30万行代码规模,最早从2007年第一个版本完成,经过多年的累积已经非常稳定可靠,功能完善.有关键的空间搜索算法,并使用汇编优化,可以处理50万级实体,图形的显示和处理效率比同类产品高出很多. 梦想绘图3d插件6.0(MxDraw6.03d),使用二维控件的显示核心,基于 OpenCASCADE 几何造型引擎, 创建锥.柱.环等基本几何体, 对

基于Java的Arc Engine二次开发的环境的配置

1.软件准备 ArcGIS for Desktop 10.2, Arc engine, jdk-7u60-windows-i586,Eclipse Mar2 2.软件的安装 2.1 ArcGIS for Desktop 10.2的安装 软件的下载:ArcGIS for Desktop 10.3全套的下载:http://pan.baidu.com/s/1o7F4yue,附带破解方法 本文使用的是10.2,其下载路径与安装破解方法如:http://jingyan.baidu.com/article/

运用Java对微信公众平台二次开发技术——开发者模式接入

当初我在这碰到了很多问题,市面上以及网络上的资料特别少,所以当初碰了很多壁,所以现在跟大家分享一下,如何用Java,对微信公众平台进行二次开发. 一.开发预备知识: 最基本的JavaSE与JavaWeb知识:JSP/Servlet/JDBC/EL 二.开发环境 Eclipse EE JDK 1.7(用JDK1.8会报错!用JDK1.8会报错!用JDK1.8会报错!用JDK1.8会报错!重要的事情说4遍,当初被坑了,愣是不知道错在哪,检查了无数遍代码,就是不知道哪里错了) 三.注册微信号 http

基于.NET的CAD二次开发学习笔记一:CAD开发入门

1.AutoCAD .NET API由不同的DLL文件组成,它们提供用于访问图形文件或AutoCAD应用程序的包含丰富的类.结构.方法和事件.每一个DLL文件都定义不同的使用基于功能的库组织组件的命名空间. 下面是你将频繁地要使用的AutoCAD .NET API 的三个主要的DLL文件: AcDbMgd.dll. 当使用图形文件中的对象时使用这个DLL文件. AcMgd.dll. 当使用AutoCAD应用程序时使用这个DLL文件. AcCui.dll. 当使用自定义文件时使用这个DLL文件.

基于.NET的CAD二次开发学习笔记二:AutoCAD .NET中的对象

1.CAD对象:一个CAD文件(DWG文件)即对应一个数据库,数据库中的所有组成部分,看的见(包括点.多段线.文字.圆等)和看不见(图层.线型.颜色等)的都是对象,数据库本身也是一个对象. 直线.圆弧.文字和标注等图形对象都是对象. 线型与标注样式等样式设置都是对象. 图层.编组和块等组织结构都是对象. 视图与视口等图形显示都是对象. 甚至图形和 AutoCAD 应用程序本身也是对象. 2.CAD中的容器:对于任何一个DWG文件,都会创建下列容器对像:九个固定的符号表(如下)和有名对像字典(包含

基于ambari2.4.0进行二次开发

目录 线上修改 源码结构 技术点 编译环境的搭建 安装samba 安装编译环境 开始编译 WEB内容修改 wiki:https://cwiki.apache.org/confluence/display/AMBARI/Ambari 线上修改 ambari的GUI部分分为两块: ①ambari-admin 页面 ②集群管理页面(ambari-web) 从发布结果来看 目录 /var/lib/ambari-server/resources/views/work/ 下面有好多组件的view,每一个目录