zoukankan      html  css  js  c++  java
  • 用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 Test
     14 {
     15     public class Class1 : Autodesk.AutoCAD.Runtime.IExtensionApplication
     16     {
     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         #endregion
     98 
     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也能实现。
    
    花几天时间让自己掌握多一件技术也是件开心的事,也可以拿去镇镇设计工程师,让他们知道码农的强大。
  • 相关阅读:
    CS001496 Gather data from web page with JavaScript, WebKit, and Qt
    中文 英特尔® 软件网络 blog
    CS001496 Gather data from web page with JavaScript, WebKit, and Qt
    Qt Port of WebKit ¶
    Category:Qt WebKit Nokia Developer Wiki
    Qt webKit可以做什么(四)——实现本地QObject和JavaScript交互
    看了潘爱民老师的关于smartcache for webkit的paper
    Qt 4.7: QWebInspector Class Reference
    CS001497 Add data to a web page with JavaScript, WebKit, and Qt
    geventcurl
  • 原文地址:https://www.cnblogs.com/ruishuang208/p/3100143.html
Copyright © 2011-2022 走看看