当前位置: 首页 > 编程日记 > 正文

用C#来开发CAD插件,含源代

CAD插件看起来很神秘,其实一个合格码农经过几天就能快速掌握。没什么秘密,开发CAD插件和winform一样简单,多学几个类库用法就是,在CAD里展现界面和winform略有不同。学习CAD插件开发的动机是为了薪水,由于公司是做显示屏和触摸屏的,养了一堆CAD的设计工程师拿着8K以上的薪水,当时我做为信息系统开发人员才拿4K,4个人要开发维护整个公司(2万人,几十个部门)的系统,感觉严重不平衡,便挑战一下设计工程师,借此提高自身价值。适用案例,公司做手机屏要放UV胶来贴合,用CAD画一个边框加一些线条。看着设计工程师们画画CAD也有那么多薪水,心里不平衡就搞出一个按照参数自动出图的东西。当然实际的项目比我放出的复杂得多,这里只是讲讲CAD插件技术,不涉及实际项目。总之无论多复杂,凡是根据参数生成固定图形的,CAD插件程序都可以胜任。可惜的是,后来公司让我给设计工程师搞了一个C#入门培训,再重点辅导几个“高工”来开发CAD插件。然后,然后就没我的事了。效果展示:1,命令行:2,右键菜单:3,工具条,CAD内嵌界面,和winform一样简单闲话少说,直接上原理和代码:0,
项目效果查看:
a:在CAD2006的命令行输入netload,加载Test.dll
b1:在命令行输入helloworld可以看到命令功能
b2:右键可以看到右键菜单,画一个红色的圆
b3:左边工具面板多了一个工具条,有个界面可以输入各种参数来画一个组合图形1,建一个xindows窗体程序项目,设置输出为类库
2,引用acdbmgd.dll和acmgd.dll
3,引用如下命名空间
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Windows.ToolPalette;
using Autodesk.AutoCAD.Windows;4,在Form1上规划界面和后台代码。重点看代码如何实现5,计划是CAD上增加一个面板按钮,点击按钮就打开Form1来自动画图。这里我们加一个用户控件,拖一个按钮,按钮方法写:
Form1 modalForm = new Form1();          
Autodesk.AutoCAD.ApplicationServices.Application.ShowModalDialog(modalForm);
注意这里仅仅是打开的窗体的方式选择了AutoCAD的方式。  
想建立一整套工具栏,就多拉几个按钮。按4的方法写好每个按钮执行的代码(可以要个Form1这样的界面,也可以不要,自由选择)6,把这个项目导出还需要一个类来辅助
先看初始化Initialize()和Terminate()方法。这里给CAD加了一个面板工具栏和右键菜单,以及一些命令行1,这个class1类分别演示了命令行、右键菜单、工具条的实现。注释得非常清楚了,就不做多解释。 1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Text;5 using Autodesk.AutoCAD.EditorInput;6 using Autodesk.AutoCAD.ApplicationServices;7 using Autodesk.AutoCAD.Runtime;8 using Autodesk.AutoCAD.DatabaseServices;9 using Autodesk.AutoCAD.Geometry;10 using Autodesk.AutoCAD.Windows.ToolPalette;11 using Autodesk.AutoCAD.Windows;12 13 namespace Test14 {15     public class Class1 : Autodesk.AutoCAD.Runtime.IExtensionApplication16     {17         ContextMenuExtension m_ContextMenu;//定义右键菜单 18         PaletteSet palSet;//定义工具栏按钮19 20         //初始化方法,这里加了一个面板工具栏和右键菜单。如果不要右键菜单,注释即可21         public void Initialize()22         {23             AddContextMenu();//添加面板工具栏24             AddPalette();//添加右键菜单25         }26 27         //卸载方法28         public void Terminate()29         {30             RemoveContextMenu();31         }32 33 34         //有CommandMethod标注,是提供给CAD使用的命令35         [CommandMethod("HelloWorld")]36         public void HelloWorld()37         {38             //这段代码的作用是弹出一个提示39             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;40             ed.WriteMessage("周孔平编写:第一个外部门程序CAD!");41         }42 43  44 45         #region 添加一个右键菜单,并实现画一个圆的功能46         /// <summary>点击响应事件,创建一个圆47         /// 48         /// </summary>49         /// <param name="o"></param>50         /// <param name="e"></param>51         private void MyMenuItem_OnClick(object o, EventArgs e)52         {53             using (DocumentLock doclock = Application.DocumentManager.MdiActiveDocument.LockDocument())54             {55                 //创建一个红色的圆56                 Database db = HostApplicationServices.WorkingDatabase;57                 using (Transaction trans = db.TransactionManager.StartTransaction())58                 {59                     BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;60                     BlockTableRecord btr = trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;61                     Circle cir = new Circle(new Point3d(10, 10, 0), Vector3d.ZAxis, 100);62                     cir.ColorIndex = 1;63                     btr.AppendEntity(cir);64                     trans.AddNewlyCreatedDBObject(cir, true);65                     trans.Commit();66                 }67             }68         }69 70         /// <summary>添加右键菜单项71         /// 72         /// </summary>73         private void AddContextMenu()74         {75             m_ContextMenu = new ContextMenuExtension();76             m_ContextMenu.Title = "周孔平的自定义菜单";77             Autodesk.AutoCAD.Windows.MenuItem mi;78             mi = new Autodesk.AutoCAD.Windows.MenuItem("创建圆");79             //关联菜单项的处理函数80             mi.Click += MyMenuItem_OnClick;81             m_ContextMenu.MenuItems.Add(mi);82 83             Application.AddDefaultContextMenuExtension(m_ContextMenu);84         }85         /// <summary>移除菜单项86         /// 87         /// </summary>88         private void RemoveContextMenu()89         {90             if (m_ContextMenu != null)91             {92 93                 Application.RemoveDefaultContextMenuExtension(m_ContextMenu);94                 m_ContextMenu = null;95             }96         }97         #endregion98 99 
100         [CommandMethod("ShowModalForm")]
101         public void ShowModalForm()
102         {
103             Form1 modalForm = new Form1();
104             Autodesk.AutoCAD.ApplicationServices.Application.ShowModalDialog(modalForm);
105         }
106 
107         [CommandMethod("AddPalette")]
108         public void AddPalette()
109         {
110             Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
111             try
112             {
113                 if (palSet == null)
114                 {
115                     palSet = new Autodesk.AutoCAD.Windows.PaletteSet("我的面板集");
116 
117                     palSet.Style = PaletteSetStyles.ShowTabForSingle;
118                     palSet.Style = PaletteSetStyles.NameEditable;
119                     palSet.Style = PaletteSetStyles.ShowPropertiesMenu;
120                     palSet.Style = PaletteSetStyles.ShowAutoHideButton;
121                     palSet.Style = PaletteSetStyles.ShowCloseButton;
122                     palSet.Opacity = 90;
123                     palSet.MinimumSize = new System.Drawing.Size(300, 300);
124                     System.Windows.Forms.UserControl myPageCtrl = new ModelessForm();//注意这里是加载自己写的用户控件
125                     //myPageCtrl.Dock = System.Windows.Forms.DockStyle.Fill; 
126                     palSet.Add("我的页面", myPageCtrl);
127                     palSet.Visible = true;
128                 }
129             }
130 
131             catch
132             {
133                 ed.WriteMessage("创建面板集错误");
134             }
135 
136 
137         }
138 
139 
140         
141     }
142 }
143 
144     2,CAD展现工具条,添加一个用户控件,取名为ModelessForm。两行代码显示Form1窗体而已。1 using System;2 using System.Collections.Generic;3 using System.ComponentModel;4 using System.Drawing;5 using System.Data;6 using System.Linq;7 using System.Text;8 using System.Windows.Forms;9 
10 namespace Test
11 {
12     public partial class ModelessForm : UserControl
13     {
14         public ModelessForm()
15         {
16             InitializeComponent();
17         }
18 
19         private void button1_Click(object sender, EventArgs e)
20         {
21             Form1 modalForm = new Form1();
22             Autodesk.AutoCAD.ApplicationServices.Application.ShowModalDialog(modalForm);
23         }
24     }
25 }3,Form1窗体的功能,是根据长宽画一个矩形,矩形的四个角分别画一个圆。因为在CAD里运行,所以使用的类库和正常C#的不同。这里是实现的重点,根据需要写自己的代码。class1类是一个框架,基本不用改。1 using System;2 using System.Collections.Generic;3 using System.ComponentModel;4 using System.Data;5 using System.Drawing;6 using System.Linq;7 using System.Text;8 using System.Windows.Forms;9 using Autodesk.AutoCAD.EditorInput;
10 using Autodesk.AutoCAD.ApplicationServices;
11 using Autodesk.AutoCAD.Runtime;
12 using Autodesk.AutoCAD.DatabaseServices;
13 using Autodesk.AutoCAD.Geometry;
14 using Autodesk.AutoCAD.Windows.ToolPalette;
15 using Autodesk.AutoCAD.Windows;
16 namespace Test
17 {
18     public partial class Form1 : Form
19     {
20         public Form1()
21         {
22             InitializeComponent();
23         }
24         float C;//
25         float K;//
26         /// <summary> 画CAD图,根据计算出的坐标
27         /// 
28         /// </summary>
29         void drawCAD()
30         {
31             Point3d p0 = new Point3d(0,0,0);
32             Point3d p1 = new Point3d(C,0,0);
33             Point3d p2 = new Point3d(C, K, 0);
34             Point3d p3 = new Point3d(0, K, 0);
35            
36             using (DocumentLock doclock = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument())
37             {
38                 //
39                 Database db = HostApplicationServices.WorkingDatabase;
40                 using (Transaction trans = db.TransactionManager.StartTransaction())
41                 {
42                     BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
43                     BlockTableRecord btr = trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
44 
45 
46                     //画4条直线的矩形
47                     List<Line> lins = new List<Line>();
48                     lins.Add(new Line(p0, p1));
49                     lins.Add(new Line(p1, p2));
50                     lins.Add(new Line(p2, p3));
51                     lins.Add(new Line(p3, p0));
52                     foreach (Line line in lins)
53                     {
54                         btr.AppendEntity(line);
55                         trans.AddNewlyCreatedDBObject(line, true);
56                     }
57 
58 
59                     //画圆,这里直接用矩形的四个点来画
60                     List<Point3d> points = new List<Point3d>();
61                     points.Add(p0);
62                     points.Add(p1);
63                     points.Add(p2);
64                     points.Add(p3);
65                     List<Circle> cirs = new List<Circle>();
66                     foreach (Point3d p3d in points)
67                     {
68                         int R = 20;
69                         cirs.Add(new Circle(p3d, Vector3d.ZAxis, R));
70                     }
71                     foreach (Circle cir in cirs)
72                     {
73                         cir.ColorIndex = 1;
74                         btr.AppendEntity(cir);
75                         trans.AddNewlyCreatedDBObject(cir, true);
76                     }
77 
78                     trans.Commit();
79                 }
80             }
81         }
82         private void button1_Click(object sender, EventArgs e)
83         {
84             this.C = Convert.ToInt32(this.textBox1.Text);//int转成float一定可以,所以可以把int的值直接赋给float
85             this.K = Convert.ToInt32(this.textBox2.Text);
86             this.drawCAD();
87             this.Close();
88         }
89     }
90 }整个工程打包上来,有兴趣的朋友跑起来玩玩。很少写博客,不知道哪里能上传,放个360网盘分享吧,http://yunpan.cn/Q5t2pTptiUm4b。
CAD插件技术真心不难,无非是画点线条,CAD内部能实现的,C#调用acdbmgd.dll和acmgd.dll也能实现。花几天时间让自己掌握多一件技术也是件开心的事,也可以拿去镇镇设计工程师,让他们知道码农的强大。

转载于:https://www.cnblogs.com/ruishuang208/archive/2013/05/26/3100143.html

相关文章:

动态内存管理和智能指针 2.0 -- shared_ptr

shared_ptr出现原因 通过第一章的学习&#xff0c;我们知道不管是auto_ptr合适scoped_ptr都是存在缺陷的&#xff0c;于是我们必须想出一个方法既能很好的管理我们的内存&#xff0c;而且在使用的时候&#xff0c;可以多个指针指向一个内存&#xff0c;这个时候就出现了shared…

汇总同一时间段的数据_数据集干货:一文读懂Mapsidejoin

我们知道数据分析的第一步是准备数据&#xff0c;所以在前面的课程里&#xff0c;我们介绍了元数据。今天这篇文章&#xff0c;主要介绍大数据量组合数据集在永洪中的应用实例&#xff1a;Mapsidejoin。什么是Mapsidejoin&#xff1f;按照字面意思&#xff0c;Mapsidejoin就是M…

【强烈推荐】国土档案管理信息系统产品使用说明书系列目录【附下载地址】...

<<国土档案管理信息系统>>产品使用说明书系列目录【附下载地址】——通过知识共享树立个人品牌。《国土档案管理信息系统》在线视频讲解一、记大型商业软件<<国土档案管理信息系统>>之系统简介记大型商业软件 > 之系统简介 ——通过知识共享树立个人…

zip函数的使用

s [[1, 10], [1.2, 11], [2, 5], [5, 15]] data zip(*s) x_list data[0] y_list data[1] x_min min(x_list) x_max max(x_list) y_min min(y_list) y_max max(y_list) box [x_min, x_max, y_min, y_max] print(box) # [1, 5, 5, 15] 转载于:https://www.cnblogs.com/…

计算机网络基础 1.0 -- 概述

概念理解 报文&#xff1a;在网络中发送的数据块成为报文在发送报文之前&#xff0c;通常会把数组分组&#xff0c;每个组都有个包头和数据组成&#xff0c;包头中包含了诸如目标地址和源地址等重要信息&#xff0c;这样才保证了数据能够有目的的在网络中的传输主机是用户用来…

字符串循环同构的最小表示法(转)

循环字符串的最小表示法的问题可以这样描述&#xff1a; 对于一个字符串S&#xff0c;求S的循环的同构字符串S’中字典序最小的一个。 由于语言能力有限&#xff0c;还是用实际例子来解释比较容易&#xff1a;设Sbcad&#xff0c;且S’是S的循环同构的串。S’可以是bcad或者cad…

周长相等的正方形面积一定相等_必考单元:三年级下册面积计算公式+知识点+测试卷(附答案),重点内容,收藏练习!...

《面积》公式 知识点面积和面积单位&#xff1a;1.常用的面积单位有&#xff1a;(平方厘米)、(平方分米)、(平方米)。2.理解面积的意义和面积单位的意义。面积&#xff1a;物体表面或封闭图形的大小&#xff0c;叫做它们的面积。1平方米&#xff1a;边长是1米的正方形&#xff…

sql server 2000 版本查询

确定已安装的 SQL Server 2000 Database Components 版本 使用 isql、osql 或查询分析器&#xff0c;对数据库引擎实例执行以下查询之一。 SELECT SERVERPROPERTY(ProductLevel) SELECT VERSION SELECT SERVERPROPERTY(Produc…

ubuntu16创建开机启动服务

1、cd /etc/init.d/ 2、sudo touch zookeeper&#xff08;举例&#xff09; 3、给服务赋权限&#xff1a;sudo chmod x zookeeper 4、执行sudo vim zookeeper 命令写入执行脚本&#xff08;启动脚本中的启动命令对应服务的启动命令&#xff09; #! /bin/sh### BEGIN INIT INFO …

Effective C++ 1.0 -- 概述

声明 对象声明&#xff0c;函数声明&#xff0c;类型声明&#xff0c;是告诉编译器某个东西的 名称和类型&#xff0c;但是略去了实现 细节&#xff0c;因为定义在其他的地方。 external int x; //对象&#xff08;object&#xff09;声明 std:size_t numDigits(int num…

寻找连通域算法_【车牌识别算法】

车牌识别技术要求能够将运动中的汽车牌照从复杂背景中提取并识别出来&#xff0c;通过车牌提取、图像预处理、特征提取、车牌字符识别等技术&#xff0c;识别车辆牌号、颜色等信息。目前车牌识别技术主要分为端到端识别与车牌分割识别两种识别算法。端对端识别技术端到端车牌识…

SQL 2005 删除带有默认值约束的列

在sqlserver 2005中要删除某一列: alter table [表名] drop column [列名] 但是如果该列被创建了默认值约束&#xff0c;我们就只能先删除默认值约束&#xff0c;然后才能删除该列。 第一种方法&#xff1a; 1、删除默认值约束: DECLARE name varchar(100) SELECT nameb.name F…

apple hosts

2019独角兽企业重金招聘Python工程师标准>>> #Apple #125.56.202.7 swcnd.apple.com 203.69.138.34 a1.phobos.apple.com 203.69.138.34 a2.phobos.apple.com 203.69.138.34 a3.phobos.apple.com 203.69.138.34 a4.phobos.apple.com 203.69.138.34 a5.phobos.apple.…

thymeleaf 的常见属性

转载于:https://www.cnblogs.com/hwgok/p/9637723.html

继承和多态 1.0 -- 继承概念(is-a、has-a,赋值兼容规则,隐藏重定义)

普通继承和访问权限 当一个继承没有虚拟继承或者是多重继承时&#xff0c;就是一个简单的继承的时候&#xff0c;这个时候就是一个普通的继承。 普通继承的内存空间是&#xff1a;子类的对象中&#xff0c;包含了父类的成员变量&#xff0c;同时也可以调用父类的成员函数&…

c++标准库 及 命名空间std

1、命名空间std  C标准中引入命名空间的概念&#xff0c;是为了解决不同模块或者函数库中相同标识符冲突的问题。有了命名空间的概念&#xff0c;标识符就被限制在特定的范围(函数)内&#xff0c;不会引起命名冲突。最典型的例子就是std命名空间&#xff0c;C标准库中所有标识…

aop point 只能获取到map嘛_面试被问了几百遍的 IoC 和 AOP ,还在傻傻搞不清楚?...

这篇文章会从下面从以下几个问题展开对 IoC & AOP 的解释什么是 IoC&#xff1f;IoC 解决了什么问题&#xff1f;IoC 和 DI 的区别&#xff1f;什么是 AOP&#xff1f;AOP 解决了什么问题&#xff1f;AOP 为什么叫做切面编程&#xff1f;首先声明&#xff1a;IoC & AOP…

HTML学习笔记_002_如何学习HTML

.htm 还是 .html 文件后缀&#xff1f; 当您保存 HTML 文件时&#xff0c;既可以使用 .htm 也可以使用 .html 文件后缀。我们在实例中使用 .htm。这只是长久以来形成的习惯而已&#xff0c;因为过去的很多软件只允许三个字母的文件后缀。 不过对于新的软件&#xff0c;使用 .ht…

设计1.0 -- iterator 和const_iterator底层的模拟实现

本文概要&#xff1a; 本文主要是模拟实现STL中迭代器和const迭代器的&#xff0c;主要阐述的一个问题就是&#xff0c;为什么我们在设计迭代器的时候需要使用三个模板参数呢 在设计迭代器的时候&#xff0c;我们有下面的代码 #include<iostream> using namespace std…

关于python缩进的描述中_关于Python程序中与“缩进”有关的说法中,以下选项中正确的是()...

关于Python程序中与“缩进”有关的说法中,以下选项中正确的是()答&#xff1a;缩进在程序中长度统一且强制使用同文学或同音乐主题的民歌&#xff0c;《_______》是其中之一。此曲经民间艺人丁喜才改编后&#xff0c;由上海音乐学院鞠秀芳于50年代在国际上唱红答&#xff1a;五…

使用Newtonsoft.Json

首先是前一段某博友对于循环引用的问题的解决&#xff1a;http://www.cnblogs.com/Gryzor/archive/2013/05/06/3062373.html 其次是时间到底是UTC还是Local的问题&#xff1a;http://www.cnblogs.com/leonwang/archive/2013/05/29/javascript-datetime.html 对于第二条&#xf…

回击质疑 HP StoreOnce用高性能说话

四五年以前&#xff0c;记者曾经两次参观过惠普位于英国西南部港口城市布里斯托尔的存储研究中心&#xff0c;那里是惠普数据备份和保护产品的大本营&#xff0c;同时也是惠普磁带产品与HP StoreOnce产品家族的诞生地。就在惠普刚刚发布升级版的HP StoreOnce B6200以及Catalyst…

windows10配置jenkins

1、下载pscp.exe并拷贝到c:\window\system32&#xff0c;此工具用于上传文件至linux服务器 下载地址&#xff1a;https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html 2、下载jenkins.war 下载地下&#xff1a;https://jenkins.io/download/ 3、设置环境变量JENKI…

STL模拟实现1.0 -- list和iterator模拟实现和简单分析

引言 C 标准模本库《STL》中有很多优秀的代码实现&#xff0c;不然怎么能叫做C标准模板库呢&#xff0c;其中一个实现就是有一个容器&#xff0c;叫做list。所谓容器其实就是存储相同类型数据的一个存储集合&#xff0c;list的底层实现其实就是一个链表。 我们的普通数组在使…

hdc mfc 画扇形图_使用echarts绘制条形图和扇形图

使用echarts绘制条形图和扇形图简单举例说明下echarts如何绘制条形图和扇形图代码示例echarts绘制条形图和扇形图var mychart1echarts.init(document.getElementById(chart1),light);// 指定图表的配置项和数据var option {title: {text: ECharts 入门示例},tooltip: {},legen…

Java学习笔记45:Java 线程与主线程之间的变量关系

运行下面的代码&#xff1a; package com.test.www;public class Test {public static int count 0;public static void inc() {//这里延迟1毫秒&#xff0c;使得结果明显try {Thread.sleep(1);} catch (InterruptedException e) {}count;}public static void main(String[] a…

会计的思考(36):会计--企业运营的数码相机

新浪网上看到一张图片&#xff0c;拍的是2009年12月3日的武汉市&#xff0c;整个城市在笼罩在一片污浊空气当中&#xff0c;让人震惊。虽然我在深圳&#xff0c;但也清楚好不到哪去。 震惊之余&#xff0c;感谢新浪&#xff0c;更感谢某位摄影师&#xff0c;让我们了解到生活的…

spring cloud连载第二篇之Spring Cloud Config

Spring Cloud Config Spring Cloud Config为分布式服务提供了服务侧和客户侧的外部配置支持。通过Spring Cloud Config你可以有一个统一的地方来管理所有应用的外部配置。 默认服务端存储实现用的是git&#xff0c;因此&#xff0c;它很容易支持配置环境的标签版本&#xff0c;…

CodeOnly

关于设置[Key]标志 要先添加 程序集的引用 在添加 using System.ComponentModel.DataAnnotations; 命名控件转载于:https://www.cnblogs.com/since87/archive/2013/06/09/3129399.html

继承和多态 2.0 -- 继承的六个默认成员函数

本文重要介绍普通继承中如何写派生类的六个默认成员函数&#xff0c;主要是针对在派生类中&#xff0c;如何调用基类的六个默认成员函数 需要说明的一点就是&#xff0c;如果子类中没有调用父类的函数时&#xff0c;系统会自动生成一个。 构造函数 子类中有父类的成员&#…