文档库 最新最全的文档下载
当前位置:文档库 › 利用Csharp进行AutoCAD的二次开发

利用Csharp进行AutoCAD的二次开发

利用Csharp进行AutoCAD的二次开发
利用Csharp进行AutoCAD的二次开发

利用C#进行AutoCAD的二次开发(一)转自明经通道

众所周知,对AutoCAD进行二次开发用到的主要工具有:ObjectArx,VBA,VLisp。但它们的优缺点是显而易见的:ObjectArx功能强大,编程效率高,但它的缺点是编程者必须掌握VC++,而这门语言非常的难学;VBA和VLisp虽然简单易上手,但它们对于开发大型的程序好象无能为力。那究竟有没有一种语言能结合它们的优点而尽量避免它们的缺点呢? 回答是肯定的,那就是微软新推出的21世纪编程语言C#。关于C#的详细介绍,大家可以参考有关的文章。

C#是通过AutoCAD ActiveX 这座桥梁来和AutoCAD之间进行通讯的。AutoCAD ActiveX 使用户能够从AutoCAD 的内部或外部以编程方式来操作AutoCAD。它是通过将AutoCAD 对象显示到“外部世界”来做到这一点的。一旦这些对象被显示,许多不同的编程语言和环境就可以访问它们。关于AutoCAD ActiveX 的情况,大家可以参考AutoCAD自带的帮助。

呵呵,说了这么多无聊的,还是让我们通过一个具体的例子来说明怎样利用C#进行AutoCAD的二次开发吧。在介绍例子之前先讲一下有关的配置:

(1)Visual Studio .net (2003和2002都可以,我用的是2002)(2)AutoCAD2000以上版本(我用的是2004)这个例子非常简单,就是通过C#建立的窗体来启动AutoCAD并画一条直线。下面是编程的具体步骤:

(1)通过Visual Studio .net 建立一C#的windows应用程序。

(2)在“解决方案资源管理器”中右击“引用”标签,在弹出的菜单中选择“添加引用”,在“添加引用”对话框中选择“com"选项卡下的下拉列表框中的“AutoCAD 2004 Type Library"项(注意:不同版本的CAD的数字不同),单击右边的“选择”按钮,最后单击下面的“确定”按钮。(3)在C#窗体中加入两个文本框和一个按钮,分别用于输入直线起点、终点的坐标和在CAD中画直线。下面主要解释一下添加的代码。(a)在程序的开头加入:using AutoCAD;//导入AutoCAD引用空间

(b)在窗体的变量声明部分加入: private AcadApplication a;//声明AutoCAD对象

(c)在窗体的构造函数部分加入:a=new AcadApplicationClass();//创建AutoCAD对象

a.Visible=true;//使AutoCAD可见

(d)在按钮的消息处理函数中加入:

double[] startPoint=new double[3]; //声明直线起点坐标

double[] endPoint=new double[3];//声明直线终点坐标

string[] str=textBox1.Text.Split(',');//取出直线起点坐标输入文本框的值,文本框的输入模式为"x,y,z"

for(int i=0;i<3;i++)

startPoint=Convert.ToDouble(str);//将str数组转为double型

str=textBox2.Text.Split(',');//取出直线终点坐标输入文本框的值

for(int i=0;i<3;i++)

endPoint=Convert.ToDouble(str);

a.ActiveDocument.ModelSpace.AddLine(startPoint,endPoint);//在AutoCAD中画直线

a.Application.Update();//更新显示

好了,简单吧,你可以试着编译一下。关于上面一些语句的用法,我会在下一讲中作详细介绍。

利用C#进行AutoCAD的二次开发(二)

大家好,今天我继续给各位介绍利用C#进行AutoCAD的二次开发。在这一讲中,主要介绍上一讲例子中存在的问题。

在上一次的例子中我是通过引用AutoCAD 2004 Type Library来进行C#与AutoCAD之间的通信,但这种方法存在两个致命的缺点。第一个缺点是每次调试程序的时候C#都要重新启动AutoCAD,如果调试的次数非常多(比如跟踪错误然后调试),那么编程的效率就很低,因为启动一次CAD还是需要较长的时间。相对于第一个缺点,第二个缺点则更要命。由于.NET本身的问题,Interop.AutoCAD.dll文件(就是通过它才实现了C#与AutoCAD之间的通信)存在着一些bug,因此虽然有时你的代码是完全正确的,但C#编译器还是抛出莫名其妙的错误。那不是完蛋了吗?我曾经有一阶段就因为这两个要命的东东差一点放弃了C#而想改学ObjectArx了,呵呵,不过还是运气好,我偶尔一次在网上看了一篇外国人写的文章,他专门介绍了这两个问题的解决办法。下面就来解决这两个问题。

首先来看第二个难题,按以下步骤来进行:

1. 随便用Visual Studio .NET建立一个C#应用程序,然后按照上一篇文章中的设置加入AutoCAD 2004 Type Library,然后不加入任何代码,编译你的程序。

2. 在Visual Studio .NET命令行工具下用ildasm.exe(这个工具可以在Visual Studio .NET安装光盘中找到)把Interop.AutoCAD.dll文件(这个文件在步骤1中生成的项目的Bin\Release文件夹中)编译成中间语言Interop. AutoCAD.il。注意:在步骤1中建立的项目的编译设置为Release模式。

ildasm.exe /source Interop.AutoCAD.dll /output=Interop. AutoCAD.il

又要注意了:把ildasm.exe,Interop.AutoCAD.dll放在同一目录下。

3.在记事本中打开Interop. AutoCAD.il文件,然后查找结尾是“SinkHelper”而开头为".class private auto ansi sealed _DAcad“的语句,把语句中的private 改为public,然后保存Interop. AutoCAD.il文件。

4.使用ilasm.exe把Interop. AutoCAD.il文件编译为Interop.AutoCAD.dll文件,同样是在Visual Studio .NET命令行工具下进行。ilasm.exe /resource=Interop.AutoCAD.res /dll Interop.AutoCAD.il /output=Interop. AutoCAD.dll

Interop.AutoCAD.res文件是在步骤1中生成的。

5.显然你不愿意每次编写应用程序时都通过上一篇文章中介绍的方法来加入Interop. AutoCAD.dll,那太麻烦了。你可以用下面的方法来让程序自动加入该文件:找到C:\Program Files\https://www.wendangku.net/doc/0b2788051.html,\ Primary Interop Assemblies 文件夹,然后把上面生成的

Interop.AutoCAD.dll文件拷贝进去。

好了,第二个问题解决了,接下来看第一个。

在VBA中,编程者可以使用GetObject函数来获得当前活动的AutoCAD对象,但在C#中却没有,为了这个函数我几乎把MSDN给翻遍了,然后去各种C#论坛问各位高手,结果都没得到解决,呵呵,可能国内使用C#的人比较少吧。还是在老外的论坛上看到了一篇就是讲这个问题的文章才把这个难题给解决了。使用下面的语句就可以获得当前活动的AutoCAD对象了:

(AcadApplication)Marshal.GetActiveObject("AutoCAD.Application.16")

(对于CAD2000和CAD2002,则把16改为15)

当然以上语句必须在AutoCAD打开的情况下才能使用,否则会发生错误,对于AutoCAD没打开的情况,可以使用上一篇文章的方法来处理。完整的连接AutoCAD与C#的源程序如下所示:

using System;

using AutoCAD;

using System.Runtime.InteropServices;

namespace AcadExample

{

public class AutoCADConnector : IDisposable

{

private AcadApplication _application;

private bool _initialized;

private bool _disposed;

public AutoCADConnector()

try

{

// Upon creation, attempt to retrieve running instance

_application = (AcadApplication)Marshal.GetActiveObject("AutoCAD.Application.16"); }

catch

{

try

{

// Create an instance and set flag to indicate this

_application = new AcadApplicationClass();

_initialized = true;

}

catch

{

throw;

}

}

}

// If the user doesn't call Dispose, the

// garbage collector will upon destruction

~AutoCADConnector()

{

Dispose(false);

}

public AcadApplication Application

{

get

{

// Return our internal instance of AutoCAD

return _application;

}

}

// This is the user-callable version of Dispose.

// It calls our internal version and removes the

// object from the garbage collector's queue.

public void Dispose()

{

Dispose(true);

GC.SuppressFinalize(this);

}

// This version of Dispose gets called by our

// destructor.

protected virtual void Dispose(bool disposing)

{

// If we created our AutoCAD instance, call its

// Quit method to avoid leaking memory.

if(!this._disposed && _initialized)

_application.Quit();

_disposed = true;

}

}

}

利用Visual https://www.wendangku.net/doc/0b2788051.html, 把上面的程序编译成一个类库,你就可以在以后的程序中使用它了,下面的这个例子说明了它的用法。(首先把AcadExample类库包含在项目中)

using System;

using AcadExample;

using AutoCAD;

namespace ConsoleApplication6

{

class Class1

{

[STAThread]

static void Main(string[] args)

{

using (AutoCADConnector connector = new AutoCADConnector())

{

Console.WriteLine(https://www.wendangku.net/doc/0b2788051.html,);

}

Console.ReadLine();

}

}

}

这个例子是在C#窗口中显示AutoCAD中当前文档的标题。

利用C#进行AutoCAD的二次开发(三)

C#才鸟

这一讲的主要内容是介绍AutoCAD对象模型,如果你对VBA开发AutoCAD了解的话,这部分内容应该是超简单的。

对象是AutoCAD ActiveX 接口的主要构造块,每一个显示的对象均精确代表一个AutoCAD 组件。AutoCAD ActiveX 接口的主要对象有:

? 直线、圆弧、文字和标注等图形对象。

? 线型与标注样式等样式设置对象

? 图层、编组和块等组织结构对象

? 视图与视口等图形显示对象。

? 图形、AutoCAD 应用程序本身也是对象

所有对象的根对象是AutoCAD 应用程序本身,它用AcadApplication类来表示。获得当前运行的AcadApplication对象可以使用上一讲中介绍的方法来得到。AcadApplication对象下有四个子对象构成,分别是:

υ AcadPreferences 对象,通过此对象可以访问和设置“选项”对话框中的相关选项

AcadDocuments对象,它表示AutoCADυ图形

AcadMenuBar 对象,它表示AutoCAD主菜单栏(注意不是AcadMenuBars,因为应用程序只有一个主菜单栏)υ

υ AcadMenuGroups对象, 它表示AutoCAD 菜单和工具栏

上面介绍了AutoCAD ActiveX 接口对象模型的大致组成,下面重点介绍AcadDocuments对象,因为大部分的编程都与它有关。首先大家看到它是复数的形式,因此它是当前打开的AutoCAD所有图形的集合,这种对象称为集合对象(呵呵,好像在讲废话)。集合对象有一些比较重要的方法和特性。其中最主要的是:Count特性用于获取集合中的对象个数(从零开始);Item 方法用于获取集合中的任何对象。关于它们的用法我会在下面的例子中介绍。而AcadDocuments的单数形式AcadDocument表示当前打开的一个AutoCAD图形。AcadDocument对象由以下几个主要对象组成:

υ AcadModelSpace 集合和AcadPaperSpace集合,提供对图形对象(直线、圆、圆弧等)的访问

υ AcadLayers、AcadLinetypes 和AcadTextStyles,则提供对非图形对象(图层、线型、文本样式等)的访问

υ AcadPlot 对象提供对“打印”对话框中设置的访问,并为应用过程提供了打印图形的各种方法

AcadUtilityυ对象提供用户输入和转换函数

图形对象的创建使用Add方法,比如要创建一个圆,就是用AddCircle方法,而非图形对象的创建使用Add方法。

下面通过一个简单的例子来说明上面介绍的内容。这个例子是在AutoCAD中建立一个新的层,然后在该层中画一个红色的圆和一条绿色的直线。这是程序的源代码:(请先把上一讲中生成的interop.AutoCAD.dll 和AutoCADExample.dll文件包含在工程中)

using System;

using AcadExample;

using AutoCAD;

namespace CircleLine

{

///

/// Class1 的摘要说明。

///

class Class1

{

///

/// 应用程序的主入口点。

///

[STAThread]

static void Main(string[] args)

{

//

// TODO: 在此处添加代码以启动应用程序

//

using(AutoCADConnector connector=new AutoCADConnector()) //连接AutoCAD

{

AcadDocument aDocument=connector.Application.ActiveDocument;

//取得当前AutoCAD活动图形对象

double[] center=new Double[3]{20,20,0};//设置圆心

double radius=20;//设置圆的半径

double[] startPoint=new Double[3]{0,0,0};//设置直线的起点

double[] endPoint=new Double[3]{40,40,0};//设置直线的终点

AcadLayer newLayer=https://www.wendangku.net/doc/0b2788051.html,yers.Add("CircleLine");

//创建一个名为CircleLine的新层

aDocument.ActiveLayer=newLayer;//把CircleLine层设置为当前层

AcadCircle circle=aDocument.ModelSpace.AddCircle(center,radius);//加入圆

AcadLine line=aDocument.ModelSpace.AddLine(startPoint,endPoint);//加入直线

circle.color=ACAD_COLOR.acRed;//把圆变为红色

line.color=ACAD_COLOR.acGreen;//把直线变为绿色

connector.Application.Update();//更新显示

for(int i=0;i Console.WriteLine("这是第{0}个对象:{1}",i+1,aDocument.ModelSpace.Item(i)); //遍历当前图形

}

Console.ReadLine();

}

}

}

好了,今天就到这里。

利用C#进行AutoCAD的二次开发(四)

---使用通用对话框看了本站出的“AutoCAD VBA 开发精彩实例教程”以后,深有启发。但书中用到通用对话框时,总是调用windows api函数,我一看就头大了。想到C#可以调用通用对话框,因此试验了一下,没想到在C#中可以非常容易地解决这个问题,下面就把我的做法给写出来。

本文的例子是调用颜色对话框,对于其他通用对话框做法是一样的。但由于要使用到AutoCAD2004新增加的TrueColor属性,因此,本文所举的例子只能用于AutoCAD2004,对于其他通用对话框(如文件对话框),则可以使用其他版本的AutoCAD。

要求:

会用C#编程

读过我写的“利用C#进行AutoCAD的二次开发“(在明经通道中有)

开始:

在visual https://www.wendangku.net/doc/0b2788051.html,中新建一C#控制台程序,在引用选项卡中添加下列类库:

interop.AutoCAD.dll

AcadExample.dll using System;

using System.Drawing;

using System.Collections;

using https://www.wendangku.net/doc/0b2788051.html,ponentModel;

using System.Windows.Forms;

using System.Data;

using AutoCAD;

using AcadExample;

namespace WindowsApplication3

{

///

/// Form1 的摘要说明。

///

public class Form1 : System.Windows.Forms.Form

{

private System.Windows.Forms.Button button1;

///

/// 必需的设计器变量。

///

private https://www.wendangku.net/doc/0b2788051.html,ponentModel.Container components = null; public Form1()

{

//

// Windows 窗体设计器支持所必需的

//

InitializeComponent(); //

// TODO: 在InitializeComponent 调用后添加任何构造函数代码

//

} ///

/// 清理所有正在使用的资源。

///

protected override void Dispose( bool disposing )

{

if( disposing )

{

if (components != null)

{

components.Dispose();

}

}

base.Dispose( disposing );

} #region Windows 窗体设计器生成的代码

///

/// 设计器支持所需的方法- 不要使用代码编辑器修改

/// 此方法的内容。

///

private void InitializeComponent()

{

this.button1 = new System.Windows.Forms.Button();

this.SuspendLayout();

//

// button1

//

this.button1.Location = new System.Drawing.Point(96, 112);

https://www.wendangku.net/doc/0b2788051.html, = "button1";

this.button1.Size = new System.Drawing.Size(64, 32);

this.button1.TabIndex = 0;

this.button1.Text = "确定";

this.button1.Click += new System.EventHandler(this.button1_Click); //

// Form1

//

this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);

this.ClientSize = new System.Drawing.Size(280, 213);

this.Controls.Add(this.button1);

https://www.wendangku.net/doc/0b2788051.html, = "Form1";

this.Text = "Form1";

this.ResumeLayout(false); }

#endregion ///

/// 应用程序的主入口点。

///

[STAThread]

static void Main()

{

Application.Run(new Form1());

} private void button1_Click(object sender, System.EventArgs e)

{

AutoCADConnector connector=new AutoCADConnector();

AcadDocument document=connector.Application.ActiveDocument;

AcadAcCmColor color=(AcadAcCmColor)document.Application.GetInterfaceObject("AutoCAD.AcCmColor.16");

//新建一AcadAcCmColor对象,该对象用来给直线的颜色属性赋值

AcadLine line=document.ModelSpace.AddLine(new double[]{0,0,0},new double[]{200,200,0});

//加入直线

ColorDialog dlg=new ColorDialog();//生成一颜色对话框

if(dlg.ShowDialog()==DialogResult.OK)//显示颜色对话框,并按确定按钮后

{

color.SetRGB(dlg.Color.R,dlg.Color.G,dlg.Color.B);//设置颜色为颜色对话框中选择的颜色

line.TrueColor=color;//设置直线的颜色

}

line.Update();//更新显示

}

}

}

给AutoCAD的对象设置颜色,注意不是使用Color属性,而是使用TrueColor属性。TrueColor属性是一个AcadAcCmColor对象,它必须使用GetInterfaceObject方法而不能用new AcadAcCmColor()方法声明。

给AcadAcCmColor对象设置颜色时,由于要使用.net颜色对话框中选择的值,因此可使用SetRGB的方法,它的三个参数分别是RGB颜色的红,绿,蓝的值。

在C#中使用ObjectDBX技术从未打开图形中获得图块的信息

C#才鸟(QQ:2491785)

从未打开图形中能获得图块的信息吗?明经通道的VBA版块已经介绍了VBA的实现方法,那在C#中能否做到呢?

回答是肯定的。下面就来说明具体的实现方法。

要求:

会用C#编程

读过我写的“利用C#进行AutoCAD的二次开发“(在明经通道中有)

开始:

在visual https://www.wendangku.net/doc/0b2788051.html,中新建一C#控制台程序

在引用选项卡中添加下列类库:

interop.AutoCAD.dll

AcadExample.dll

ObjectDBX16(在“解决方案资源管理器”中右击“引用”标签,在弹出的菜单中选择“添加引用”,在“添加引用”对话框中选择“com"选项卡下的下拉列表框中的“AutoCAD/ObjectDBX Common 16.0 Type Library"项)

然后键入以下代码:

1: using System;

2: using AutoCAD;

3: using dbx = AXDBLib;

4: using AcadExample;

5:

6: namespace ConsoleApplication1

7: {

8: ///

9: /// Summary description for Class1.

10: ///

11: class Class1

12: {

13: ///

14: /// The main entry point for the application.

15: ///

16: [STAThread]

17: static void Main(string[] args)

18: {

19: using (AutoCADConnector connector = new AutoCADConnector())

20: {

21: string progid = "ObjectDBX.AxDbDocument.16"//注意,这是AutoCAD2004的写法,

// 若是AutoCAD2002和AutoCAD2000i则是”ObjectDBX.AxDbDocument.1“

22: AcadApplication acadApp = connector.Application;

23: dbx.AxDbDocument dbxDoc;

24: dbxDoc = (dbx.AxDbDocument)acadApp.GetInterfaceObject(progid);

25: dbxDoc.Open(@"F:\Test.dwg");

26: foreach (dbx.AcadEntity entity in dbxDoc.ModelSpace)

27: {

28: if (entity.EntityName == "AcDbBlockReference")//判断实体是否是块参照

29: {

30: dbx.AcadBlockReference blkRef;

31: blkRef = (dbx.AcadBlockReference)entity; //将是块参照的实体强制转换为块参照类型

32: object[] atts = (object[])blkRef.GetAttributes();//获取块参照中的属性(为对象类型)

33: for (int i = 0; i < atts.Length; i++) //遍历块参照属性

34: {

35: dbx.AcadAttributeReference att;

36: att = (dbx.AcadAttributeReference)atts;//将块参照属性(对象类型)强制转换为块参照属性类型

37: Console.WriteLine("Tag: {0}\tValue: {1}\n",

38: att.TagString,

39: att.TextString);//显示块参照属性的Tag和Text的值

40: }

41: }

42: }

43: Console.ReadLine();

44: }

45: }

46: }

47: }

第一个要注意的是第三行,使用了一个别名。因为AutoCAD和ObjectDBX命名空间有许多相同的类名,因此,你必须使用全名,而不能使用简写的形式,但ObjectDBX写起来比较麻烦,所以用别名dbx来使输入方便一些。

程序前面部分的代码,你可以参考我写的“利用C#进行AutoCAD的二次开发“这篇文章。让我们来看第21行,程序定义了一个字符串progid,作为第24句的函数GetInterfaceObject的参数,该函数是用来产生一个AxDbDocument对象。但要注意,GetInterfaceObject函数返回的类型是object,所以你必须用强制转换把它变为AxDbDocument类。然后在第25行使用24行产生的AxDbDocument对象来”打开“一个.dwg文件(其实没有打开),需要注意的是这个文件的路径必须是正确的。这个文件就是我们要获得的块信息所在的文件。

由于ObjectDBX 没有选择集,所以只有通过遍历文件的模型空间来获得块的信息(26-28行)。

余下语句的说明我已经写在程序的注释中了。

你可以发现ObjectDBX的工作原理在C#中与VBA是类似的,只不过要进行必要的类型转换。

https://www.wendangku.net/doc/0b2788051.html,二次开发AutoCAD中画圆示例

Imports Autodesk

Imports Autodesk.AutoCAD.Interop

Imports https://www.wendangku.net/doc/0b2788051.html,mon

imports Autodesk.AutoCAD.ApplicationServices

Imports Autodesk.AutoCAD.DatabaseServices

Imports Autodesk.AutoCAD.Runtime

Imports Autodesk.AutoCAD.Geometry

Imports System

Private Sub btnCircle_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCircle.Click '定义圆的圆心

Dim center As Point3d = New Point3d(100, 100, 0)

'定义圆的半径

Dim radius As Double = 50

'定义一个Circle对象来表示你要生成的圆,传入的第二个参数为圆的法向,

'就是把圆生、//成在什么面上,因为AutoCAD程序一般都是平面问题,

'因此你一般都把这个法向量定义成//z轴方向。

Dim circle As Circle

circle = New Circle(center, New Vector3d(0, 0, 1), radius)

Dim bt As BlockTable

Dim btr As BlockTableRecord

Dim db As Database

'获得当前活动AutoCAD文档所在的数据库

db = Application.DocumentManager.MdiActiveDocument.Database

'获得事务处理管理器

Dim tm As Autodesk.AutoCAD.DatabaseServices.TransactionManager

tm = db.TransactionManager

'定义事务处理

Dim trans As Transaction

Try

'开始事务处理,也就是往CAD中加入东西

trans = tm.StartTransaction

bt = tm.GetObject(db.BlockTableId, OpenMode.ForRead, False)

'获得块表记录

btr = tm.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite, False)

'向块表记录加入圆的相关信息

btr.AppendEntity(Circle)

'向AutoCAD加入圆

tm.AddNewlyCreatedDBObject(Circle, True)

https://www.wendangku.net/doc/0b2788051.html,mit()

Catch ex As Exception

Throw New ApplicationException(ex.Message)

End Try

end sub

(参照了明经通道里的二次开发相关内容)

2021年如何选择autocad二次开发的工具

如何选择autocad二次开发的工具AutoCAD提供了三种主要的开发工具,分别是:使用C/C++的ObjectARX,VB/VBA的ActiveX开发,以及AutoLISP/VisualLISP开发工具。每一个开发者都有自己的爱好,但是抛开所有的偏爱,人们经常想知道哪一种最好,我到底应该选择哪种工具?给这些人的答案是:“它取决于你要完成什么工作。”每一种开发工具都有不同的东西,在某谢情况下都有不可比拟的优点。当决定究竟使用什么开发工具时,你可以问自己四个问题:哪种语言让我感觉最顺手(舒服)?我有多少时间?谁是我的目标用户,他们有多少使用AutoCAD的经验?我到底需要对AutoCAD控制到什么程度,需要多少可能的窗口类型来尽快完成工作?当我介绍不同开发工具所具有的不同功能时,你可能会明白为什么这四个问题是重要的。在谈及这几种开发工具时,我仅仅将它们看作在AutoCAD中使用的功能,而不将它们看作独立的应用程序。 ObjectARX: 在三种开发工具中,这种工具拥有对AutoCAD最深入的控制能力,能够提供最多类型的窗体。使用ARX可以向AutoCAD注册自己的命令,用户运行你的程序时无需了解关于AutoCAD更多的知识。这种便利的代价就是编制ARX程序比VBA和LISP程序需要花费更多的时间,因此用来编制简单的绘图工具有点浪费了。要掌握ARX的前提是你对C和C++非常熟悉,从个人观点来说,我最喜欢这种工具,但那是因为我做的99%的程序都是用C和C++语言,选择ARX意味着我

不用学习一门新语言。对我来说,回答“哪种语言让我感觉最顺手?”就足够了。ARX能够访问很多的AutoCAD底层工具(这些东西可能VBA和LISP并不能访问),这是大多数开发者选择ARX的主要原因,他们需要作一些用其他两种开发工具不能完成的工作。此外,这也是唯一一种能够确保你的代码安全(不被别人阅读或非法复制)的开发工具。如果你需要开发自定义实体,使用空间过滤,扩展一个使用其他开发工具的应用程序的功能,正在开发用于销售的第三方工具,或者用到一大堆用VBA和LISP不能访问的东西(或者费很大力气去实现的东西),那么ObjectARX是你的最佳选择。 VBA: 如果你是第一次开发AutoCAD应用程序,那么这就是最适合你的工具!这种工具对初学者来说非常友好,Visual Basic的代码阅读起来非常容易,很多初学者仅读了函数的名称就能理解一个问题。无论如何创建或者执行LISP命令来扩充你的访问手段,这种开发工具没有ARX和LISP那么多对AutoCAD访问的方式(译者注:这也有情可原,毕竟VBA和另外两种开发工具比起来年轻得多!)如果你对VBA非常精通,可以通过再对AutoCAD命令行进行仔细研究和分类(这句话可能不太通顺,原文是:you can subclass the AutoCAD command line),这样你就能实现LISP所能完成的所有功能!对VBA来说,最大的遗憾就是不能向AutoCAD注册命令,必须先用各种加在应用程序的方法将其对应的dvb文件加载,然后通过“工具/宏/宏”菜单项执行,或者在菜单项和自定义的工具栏按钮中执行,如果你的用户的基础知

AutoCAD二次开发实验一

实验一 ObjectARX .NET托管开发包的使用 一,主要内容 1、下载安装ObjectARX .NET托管开发包 2、创建AutoCAD命令 3、创建自定义用户菜单 4、创建自定义用户工具条 5、创建用户自定义窗体 二,主要步骤 1,下载安装ObjectARX 不同的ACAD版本用不同的开发包及开发环境 ACAD2000~ACAD2002 : VC++ 6.0 ACAD2004~ACAD2006 : https://www.wendangku.net/doc/0b2788051.html, 2002 ACAD2007~ACAD2009 : https://www.wendangku.net/doc/0b2788051.html, 2005 ACAD2010~ACAD2011 : https://www.wendangku.net/doc/0b2788051.html, 2008 ACAD2012~ : https://www.wendangku.net/doc/0b2788051.html, 2010 下载ObjectARX 在打开打开默认网页浏览器并浏览网站. 的网页上,点击License & Download(许可&下载). 填写必填字段并选择ObjectARX for AutoCAD 2012. 点击Submit(提交)按扭. 在下载页, 点击Download Now(现在下载)使用下载管理器或点击Standard Download Method(标准下载方法)使用你的网页浏览器的默认下载方法下载. 点击Save(保存)或用于保存文件到你的本地驱动器的选项。指定下载ObjectARX SDK安装包文件存放的位置。一旦安装包文件下载完成,就浏览你保存在本地的安装并双击它,安装向导将显示在ObjectARX <释放>对话框中, 指定一个新的安装位置或接受默认的安装位置。点击Install(安装)按扭. 如果没有遇到问题,安装向导完成后关闭它 安装ObjectARX向导和托管项目模板 一旦 ObjectARX SDK被安装,请使用默认目录c:\ObjectARX 浏览它的安装文件夹。 (1)AtuoCAD的类库都在此库。 2,Hello World程序创建 1)在https://www.wendangku.net/doc/0b2788051.html, 2012中建项目HelloWorld 采用.NET托管API →从“项目类型”列表中选择第二个“Visual C#”,从模板中选择“类库”,输入项目名称“HelloWorld” →.单击“确定”按钮 如果弹出如下对话框说明没安装正确,可以手动加载托管DLL →从ObjectARX安装目录下加载acmgd.dll和acdbmgd.dll →使用.NET对象浏览器查看 AcMgd.dll--AutoCAD .NET托管类

基于VBA的AutoCAD二次开发及应用实例

基于VBA的AutoCAD二次开发及应用实例 时间:2011-10-03 18:25:09 来源:作者: 1引言 AutOCAD2005是AutOdesk公司的系列产品,该软件从其使用和设计思路上都秉承了工程制图人员的绘图习惯,能够非常轻松地绘制出带有平面视图和三维渲染效果的工程图纸,是绘图人员的一个理想工具。随着CAD基础理论和应用技术的不断发展,对CAD系统的功能要求也越来越高。因而AutoCAD 不可能完全满足每个用户的具体而特定的要求。设计人员希望它能从本质上减轻大量简单烦琐的工作量,使他们能集中精力于那些富有创造性的高层次思维活动中。 AutoCAD提供的开放式体系结构允许用户和开发者采用高级编程语言对其进行扩充和修改,即二次开发,能最大限度地满足用户的特殊要求,更方便、更规范、更专业的实现设计和绘图中的应用。VBA最早是建立在0ffice97中的标准宏语言,由于它在开发方面的易用性及具有的强大功能,许多软件开发商都将其嵌入自己的应用程序中,作为一种开发工具提供给用户使用。AutOdeSk公司自从Aut0CADRl4.0l版开始,内置了VBA开发工具。 新一代程序开发工具ViSual BaSic,不仅继承了面向对象方法的特性,同时具备可视化程序语言及程序产生器的概念。 VBA(visual Basic For Apphcation)是AutoCAD R12以后推出的一种新的编程环境,提供了以Visual Basic为基础的面向对象的开发特征及程序接口,能真正快速地访问AutOCAD图形数据库,能明显提高软件开发和维护的效率。 2 VBA的技术特性 2.1 VBA开发AUTOCAD的技术特点 VBA是微软开发出来的应用程序共享一种通用的自动化语言,它可以使常用的程序自动化,并可以创建自定义的解决方案。 VBA被集成到AutoCAD中,VBA和AutoCAD中强大的Activex自动化对象模型的结合,代表了一种新型的定制AutoCAD的模式构架。通过VBA,我们可以操作AutoCAD2004,控制ActiveX和其它一些应用程序,使之相互之间发生互易活动下面就是VBA的主要功能: (1)VBA提供强大的窗体创建功能,为应用程序建立对话框及其他屏幕界面。 (2)可以创建自己的工具条。 (3)可以创建功能强大的模块级宏指令,宏名实质上就是模块的过程名。 (4)提供建立类模块的功能,这对开发大型工程非常有用,因此类可以提供重用组。 (5)具备完善的数据访问和管理能力,通过ADO(ActivexData Objects),可以对Access数据库或其他外部数据库(像dBase,FoxPro等)实现访问和管理。此功能比直接使用AutoCAD的数据库管理系统要方便,且功能强大。 2.2 VBA AutoCAD ActiveX Automation对象模型 VBA是通过AutoCAD ActiveX Automation接口来建立和AutoCAD对象问的联系。ActiveX是建立在COM对象模型之上的一个标准通信协议,它允许对象之间通过一定的接口相互通信。

如何维护老客户与开拓新增客户

如何维护老客户与开拓新增客户 导读: 准客户开发只有两种途径,一是自己开发,一是客户帮你开发,所以请你每天去回访你的客户。 “建立影响力中心,充分运用转介绍,促使你的寿险事业如日中天。因为: 第一,推荐你的同事或街坊拥有保险保障,你们单位你们小区就能成为保险公司的"大户"; 第二,帮助你的亲朋好友拥有保险的利益,其实就是帮助你自己,因为他们的问题同样会成为你的困扰。如果他不向保险公司投保,就等于向你投保,而且完全免费!请问你愿意这种情况发生吗?” 保险服务包括售前服务、售中服务和售后服务,也就是说,客户服务工作贯穿我们从事保险工作的始终。如何才能做到、做好客户服务工作?我们必须首先从心态和行为上做——保险生活化,生活保险化。 显然,售后服务是维护老客户的必备方式和有效手段,维护好老客户其实正是增添新客户的高效前提!售后服务的另一种说法叫做“客户回访”,准客户开发只有两种途径,一是自己开发,一是客户帮你开发,所以请你每天去回访你的客户。

一个成功的代理人每天都会拨出专门的时间去拜访他的客户,让客户帮助自己开发准客户,所以他会越做越轻松,越做越有成就感。一个失败的代理人每天都会拨出全部的时间去拜访他的准客户,只能依赖自己开发准客户,所以他会越做越辛苦,越做越有挫折感。 做好客户回访的关键其实并非在如何回访?因为人的不同,方式方法亦不一而同,关键在于“去”回访,在于行动,在于走出去,走进客户。保险营销员在其职业生涯当中,常常会出现三大致命伤,首先是”懒”,这其实就是失败的开始;其次是“傲”,这是保险业务员职业生涯中的第一大病,其实,每个代理人,在发展的过程中,要学会谦逊,在获得成绩时,掌声愈大、腰要愈软;三是“伪”,这是人际关系的致命伤。 作为一个成功的寿险营销员,要做到“人生三勤”。即勤能补拙、勤能补运、勤能补情。 勤能补拙。笨鸟先飞,成事靠准备,不是靠智慧。勤能补运(时)。客户被拜访99次,第100次被你访到,幸运成交。勤能补情。多与顾客接触,能增近感情。 加强客户回访,要成为我们日常工作的好习惯。成功的人都有好习惯,好习惯是勉强来的,勉强成习惯,习惯成自然。因此,加强客户回访,不断给客户以保险的观念与理财分析,你的诚心,必将能打动客户。我们要让客户明白,买保险不仅要买单一的保险产品,更要买组合型的产品,买全方位的保障。我们要让客户明白,不仅自己要买保险,自己身边的关系人也必须要购买保险。保险应当成为人们生活当中的必须品,人人都该拥有足够的保险保障,从而获得自立、自尊的尊贵生活。保险从业人员应充分运用保险的这一独特功用,为更多的客户提供保险保障服务,从而使我们自己的寿险从业生涯走向良性循环。

客户的维护与开发

读《怎样做好客户保持》后感 -------胡玉彬 客户是一个公司的根本,也是企业赖以发展的源泉,一个企业的持续发展,除了正常的管理,经营;客户的开发和维护显然是重中之重。 开发一个客户和维护一个客户,大家都知道,从经济学角度来讲,很明显,维护客户能够大大的节约成本,正如文中所讲“开发一个新客户所需要花费的成本是维护一个老客户的5-10倍,客户保持比吸引新客户更能够降低成本”。 我们只需要花开发新客户1/3的精力,1/5的成本,不仅能维护好客户,还能在现有客户的基础上越做越大,因为,客户也要发展。一个一点不图发展的客户,不是一个好客户。我们要在有限的资源和精力情况下,最大效益的保持最有价值的客户。 根据已经成交的客户使用情况,整理归纳,有一个清晰明了的客户信息数据库,知道哪些是现有最大客户利益化,哪些是最有潜力,哪些是长期维护的客户,根据不同客户的情况,有自己的一套维护体系,有限的资源,有效的时间,效果最好。 中国的社会,归根到底,是人情的社会,所以要重视与客户情感的建立,正如文中所言“把客户感情的维护与企业提供的产品和服务紧密的联系在一起”,这样才能大大提高客户对公司,对产品的认可度和依赖度。 客户的维护,没有客户开发那样有难度,有刺激,和成就感,相

比而言,维护客户相对比较平淡和持久。这就更要求我们自己要注意细节,注意自己内心对客户的理解和尊敬,客户是自己的衣食父母,只有在日久的维护中,始终能保持一颗关心,帮助客户的心态,才能真正让客户感觉到,我们是在和他们共成长,才会有牢靠的客情关系。 用真心和耐心去维护客户,用信心和激情去开发客户,在维护中学习,从开发中反思,做出属于自己的品牌营销!

AutoCAD二次开发教程复习总结

CAD复习题及答案1、AutoLISP 2、VisualLISP 3、VBA 4、ADS 5、ObjectARX

6、.NET 托管API 7、ActiveX Automation

8、Visual Java 1、 AutoCAD二次开发方式有哪些?各自优缺点? 2、 AutoCAD 中实现ObjectARX .NET API 的有哪些优点? 3、 AutoCAD .NET API 的三个主要的DLL文件是? 4、简述ObjectARX .NET API所对应的https://www.wendangku.net/doc/0b2788051.html,版本。 5、简述AutoCAD数据库的组成。 AutoCAD数据库是用来管理当前图形中的图元实体和其他非几何信息的容器对象,一个AutoCAD数据库包含一套固定的符号表和命名的对象词典,每一个符号表包含一个特定符号

表记录类的实例,例如层表(AcDbLayerTable)中包含层表的记录,块表(AcDbBlockTable)中包含块表记录,所有的AutoCAD实体均包含于块表记录中。词典提供了一种通用容器来存储对象,它可以保存AcDbObject对象以及其它对象,也可以创建新的对象词典,将新的数据库元素加入其中。 AutoCAD数据库的组成如图所示,从图中我们可以看出数据库主要由一下内容组成:1)层表AcDbLayerTable和层表记录AcDbLayerTableRecord,。 2)块表AcDbBlockTable和块表记录AcDbBlockTableRecord。AutoCAD中所有可见实体均存储在块表记录。块表中包含有两条特殊的记录*MODEL_SPACE(模型空间)和*PAPER_SPACE (图纸空间)。 3)其他符号表和符号表记录。 4)命名对象词典。缺省情况下当AutoCAD数据库被建立以后,词典中就包括了组词典以及MILINE样式词典。 5)符号表和命名对象词典都是存储数据库对象的容器,用于组织和管理数据库对象。AutoCAD数据库通常有9个固定类型的符号表,开发者不能向数据库中新增或者删除任何一种类型符号表,能实现的是向符号表中添加对应的符号表记录。 6、 Application 对象是AutoCAD .NET API 对象模型的根对象,它包括哪些部分? Application 对象是层次结构的根,而且它提供对AutoCAD 的主窗口的访问。

AutoCAD的二次开发

浅谈AutoCAD的二次开发 林学与园林学院 06园林傅欣蕾 摘要:通过对AutoCAD软件发展史的概述,从中归纳出CAD的总体发展趋势。从当今各行业所需的CAD专业化功能,提出对其进行二次开发的意义及具体实施步骤。 关键词:AutoCAD 发展史二次开发专业化功能 1.AutoCAD的发展简史: 1.1、第一次CAD技术革命—曲面造型系统 60年代出现的三维CAD系统只是极为简单的线框式系统。这种初期的线框造型系统不能有效表达几体数据间的拓扑关系。进入70年代,随着贝赛尔算法促使人们用计算机处理由线及曲面问题变得可行。 1.2、第二次CAD技术革命—实体造型技术 1979年世界上第一个完全基于实体造型技术的大型CAD软件发布。由于实体造型技术能够精确表达零件的全部属性,在理论上有助于统一CAD、CAE、CAM的模型表达,给设计带来了惊人的方便性。 1.3、第三次CAD技术革命—参数化技术 1.4、第四次CAD技术革命—变量化技术 成功运用参数化技术之后,开发人员发现了参数化技术尚有许多不足之外。首先,“全尺寸约束”这一硬性规定就干忧和制约着设计者创造力及想象力的发挥。再者,如在设计中关键形体的拓扑关系发生改变,失去了某些约束特征也会造成系统数据混乱。 1993年全新体系结构的I-DEAS Master Series软件问世,它第一次将变量化付诸实践。变量化技术既保持了参数化技术的原有优点,同时又克服了它的不足之处。无疑,变量化技术成就了SDRC,也驱动了CAD发展的第四次技术革命。 1.5、CAD的发展方向 任何一种软件都是有缺陷而非完美无瑕的。AutoCAD这一软件也是一样,只有在不断的发展中,找到自己的不足力求弥补,才能趋向臻化,达到一种完美。 纵观CAD的发展史,我们可以大略地看出该软件是朝着“人工智能化”、“专业应用化”等方向发展的。 而实现这样的发展方向的最佳手段就是通过对CAD的二次开发。将各类专业设计技术研制成CAD系统的各类设计工具和知识,从而使使用者能按照专业设计的方向进行,可以大大提高CAD的设计效率。

AutoCAD的二次开发

AutoCAD的二次开发主要涉及以下内容: (1)编写各种用户自定义函数并形成若干LISP、ARX、VLX或ADS文件,以及一些DCL文件。 (2)建立符合自己要求的菜单文件,一般可在AutoCAD原菜单文件内添加自己的内容,对于AutoCAD2000版本还可增加部分菜单文件,然后经交互方式加入到系统中去。 (3)在系统的ACAD.LSP或类似文件中加入某些内容以便进行各种初始化操作,如在启动时立即装入一些文件等。 (4)通过系统对话框设置某些路径。这些操作在程序开发成功后向其它AutoCAD系统上安装应用,特别是需要大批安装时,需要进行很多文件检索、内容增删、子目录创建、文件拷贝、系统设置等繁琐工作,如能令上述工作全部自动进行,使整个二次开发程序在无人干预的情况下嵌入系统,将大大提高工作效率。为此笔者用VC++开发了一套自动安装程序,使原本需要五、六分钟的人工操作在十几秒内即可自动完成。 一、基本思路 整个安装程序遵循以下思路: 1)首先获得所在机器AutoCAD2000系统的安装路径; 2)寻找菜单文件AutoCAD2000\\support\\acad.mnu,打开文件并将要添加的内容加至末尾; 3)寻找LISP文件AutoCAD2000\\support\\acad2000doc.lsp,打开文件并将要添加的内容加至末尾; 4)创建一个预先命名的子目录,将所有二次开发形成的各类文件拷入;

5)给出信息框,告知安装成功,如有问题则告知安装失败。 需要指出的是,在添入acad2000doc.lsp的内容中须有如下语句:(command“_menu”(strcat (getvar "menuname") ".mnu")),目的是为了强制执行菜单文件装入命令,将改动后的acad.mnu文件编译后装入。另外,在添入acad2000doc.lsp的内容中还有一赋值语句,将准备创建的包含所有二次开发生成文件的子目录全路径名赋予一全局变量,以供二次开发程序在需要时调用,从而避免了在AutoCAD环境下交互设定路径的麻烦。 二、实现方式及关键函数 为获得AutoCAD2000的安装路径,需要利用WINDOWS系统注册表的有关功能。 首先通过RegOpenKey函数打开注册表: HKEY hKey; LONGret=RegOpenKey( HKEY_LOCAL_MACHINE, "Software\\Autodesk\\AutoCAD\\R14.0\\ACAD-1:804", &hKey); 其中第一参数HKEY_LOCAL-MACHINE为注册表中预定义的主键句柄,第二参数为注册表中HKEY_LOCAL_MACHINE下的子键内容,第三参数hKey将返回一子键句柄,用于接下来的键值查询。若该函数运行成功,将返回一长整型数ERROR_SUCCESS。 接下来利用RegQueryValueEx函数进行键值查询: DWORD dwType=REG_SZ; BYTE szData[100];

Autocad-VBA二次开发简易教程

第一课:入门 1.为什么要写这个教程 市面上ACAD VBA的书不多,它的帮助是英文版的,很多人看不懂。其实我转行已经好几年了,而且手艺也慢慢生疏了,写个教程对自己来说也是一次复习。 2.什么是Autocad VBA? VBA是Visual Basic for Applications的英文缩写,它是一个功能强大的开发工具,学好VBA可以成倍甚至成百、成万倍提高工作效率,在工作中,有很多任务仅用ACAD命令不可能完成的,只要学好VBA就可以做到,相信到时候您一定会得到同事的佩服、老板的器重。 3、VBA有多难? 相信大家都知道Basic是的含义。应该承认,我的水平还不高,错误之处在所难免,如果大家发现错误一定要提出批评,以便及时更正。 4、怎样学习VBA? 介绍大家一个学习公式:信心+恒心=开心。仔细阅读本教程,完成例题,在学习的过程中一定要多思考,多想一些是什么、为什么。本教程将陆续发布在CAD世界论坛上,您不需要付费就可以学习。本作者在此郑重承诺:关于本教程中有任何疑问,可以跟贴提问,只要有时间,本人一定会耐心解答。我不会发到任何人的邮箱中,您自己在论坛上找就可以了,请不要再向我索要这份教程。 5、现在我们开始编写第一个程序:画一百个同心圆 第一步:复制下面的红色代码 第二步:在模型空间按快捷键Alt+F8,出现宏窗口 第三步:在宏名称中填写C100,点“创建”、“确定” 第四步:在Sub c100()和End Sub之间粘贴代码 第五步:回到模型空间,再次按Alt+F8,点击“运行” Sub c100() Dim cc(0 To 2) As Double '声明坐标变量 cc(0) = 1000 '定义圆心座标 cc(1) = 1000 cc(2) = 0 For i = 1 To 1000 Step 10 '开始循环 Call ThisDrawing.ModelSpace.AddCircle(cc, i * 10) '画圆 Next i End Sub 也许您还看不懂上面的代码,这没有关系,只要能把同心画出来就可以了,祝您成功。 第二课编程基础 本课主要任务是对上一课的例程进行详细分析 下面是源码: Sub c100() Dim cc(0 To 2) As Double '声明坐标变量 cc(0) = 1000 '定义圆心座标 cc(1) = 1000 cc(2) = 0 For i = 1 To 1000 Step 10 '开始循环 Call ThisDrawing.ModelSpace.AddCircle(cc, i * 10) '画圆

AutoCAD二次开发教程

第 1章 Hello World: 工程的创建 在这一章中,我们将不使用ObjectARX向导来创建一个新的工程。我们将使用Visual Studio .NET来创建一个新的类库工程。通过这个工程,你可以创建一个能被AutoCAD装载的.NET dll文件。这个dll文件会向AutoCAD加入一个名为“HelloWorld”的新命令。当用户运行这个命令后,在AutoCAD 命令行上将显示“Hello World”文本。 1) 启动Visual https://www.wendangku.net/doc/0b2788051.html,,选择”文件>新建>工程”(File> New> Project)。在新建工程对话框中选择工程类型为”Visual Basic 工程”,然后选择”类库”模板,在工程名字框中输入”Lab1”,然后选择工程存放的位置。点击确定按钮来创建工程。 2) 在工程的Class1.vb文件中,一个公有类“Class1”已经被系统自动创建了。接下来向这个类加入命令。要加入命令,你必须使用AutoCAD .NET托管封装类。这些托管封装类包含在两个托管模块中。要加入对这两个托管模块的引用,请用鼠标右键单击”引用”然后选择”添加引用”。在弹出的”添加引用”对话框中选择”浏览”。在”选择组件”对话框中,选择AutoCAD 2006的安装目录(这里假定为C:\Program Files\AutoCAD 2006\),在这个目录下找到“acdbmgd.dll”然后选择并打开它。再一次选择”浏览”,在AutoCAD 2006 的安装目录下找到“acmgd.dll”并打开它。当这两个组件被加入后,请单击”添加引用” 对话框中的”确定”按钮。正如它们的名字所表示的,acdbmgd.dll包含ObjectDBX托管类,而acmgd.dll包含AutoCAD托管类。 3) 使用对象浏览器(Visual https://www.wendangku.net/doc/0b2788051.html,的”查看>其它窗口>对象浏览器”菜单项)来浏览加入的两个托管模块所提供的类。请展开“AutoCAD .NET Managed Wrapper”对象(在对象浏览器中显示为acmgd),在整个教程中我们将使用这个对象中的类。在本章中,我们将使用“Autodesk.AutoCAD.EditorInput.Editor”类的一个实例来在AutoCAD命令行中显示文本。请再展开“ObjectDBX .NET Managed Wrapper” 对象(在对象浏览器中显示为acdbmgd),这个对象中的类将被用来访问和编辑AutoCAD图形中的实体(这部分内容将在以后的章节中介绍)。 4) 引用了ObjectARX .NET 封装类后,我们就可以导入它们。在Class1类的声明语句(位于Class1.vb文件的顶部的)之前,导入ApplicationServices, EditorInput 和 Runtime 命名空间。 Imports Autodesk.AutoCAD.ApplicationServices Imports Autodesk.AutoCAD.EditorInput Imports Autodesk.AutoCAD.Runtime 5) 接下来在类Class1中加入命令。要加入能在AutoCAD 中调用的命令,你必须使用“CommandMethod”属性。这个属性由Runtime命名空间提供。在类Class1中加入下列属性和子程序。注意续行符” _”的使用。 Public Class Class1 _ Public Sub HelloWorld() End Sub End Class 6) 当“HelloWorld”命令在AutoCAD中运行的时候,上面定义的HelloWorld子程序就会被调用。在这个子程序中,一个Editor类的实例将被创建。Editor类拥有访问AutoCAD命令行的相关方法,它还包括选择对象和其它一些重要的功能。AutoCAD当前活动文档的Editor 对象可以使用Application类来访问。当Editor对象被创建后,你可以使用它的

AutoCAD二次开发

第一课:入门 1.为什么要写这个教程市面上ACAD VBA的书不多,它的帮助是英文版的,很多人看不懂。其实我转行已经好几年了,而且手艺也慢慢生疏了,写个教程对自己来说也是一次复习。 2.什么是Autocad VBA? VBA是Visual Basic for Applications的英文缩写,它是一个功能强大的开发工具,学好VBA可以成倍甚至成百、成万倍提高工作效率,在工作中,有很多任务仅用ACAD命令不可能完成的,只要学好VBA就可以做到,相信到时候您一定会得到同事的佩服、老板的器重。 3、VBA有多难?相信大家都知道Basic是的含义。应该承认,我的水平还不高,错误之处在所难免,如果大家发现错误一定要提出批评,以便及时更正。 4、怎样学习VBA?介绍大家一个学习公式:信心+恒心=开心。仔细阅读本教程,完成例题,在学习的过程中一定要多思考,多想一些是什么、为什么。本教程将陆续发布在CAD世界论坛上,您不需要付费就可以学习。本作者在此郑重承诺:关于本教程中有任何疑问,可以跟贴提问,只要有时间,本人一定会耐心解答。我不会发到任何人的邮箱中,您自己在论坛上找就可以了,请不要再向我索要这份教程。 5、现在我们开始编写第一个程序:画一百个同心圆第一步:复制下面的红色代码第二步:在模型空间按快捷键Alt+F8,出现宏窗口第三步:在宏名称中填写C100,点“创建”、“确定” 第四步:在Sub c100(和End Sub之间粘贴代码第五步:回到模型空间,再次按Alt+F8,点击“运行” Sub c100( Dim cc(0 To 2 As Double '声明坐标变量 cc(0 = 1000 '定义圆心座标 cc(1 = 1000 cc(2 = 0 For i = 1 To 1000 Step 10 '开始循环 Call ThisDrawing.ModelSpace.AddCircle(cc, i * 10 '画圆 Next i End Sub 也许您还看不懂上面的代码,这没有关系,只要能把同心画出来就可以了,祝您成功。第二课编程基础本课主要任务是对上一课的例程进行详细分析下面是源码: Sub c100( Dim cc(0 To 2 As Double '声明坐标变量 cc(0 = 1000 '定义圆心座标 cc(1 = 1000 cc(2 = 0 For i = 1 To 1000 Step 10 '开始循环 Call ThisDrawing.ModelSpace.AddCircle(cc, i * 10 '画圆 Next i End Sub 先看第一行和最 后一行:Sub C100( …… End Sub C100是宏的名称,也叫过程名称,当用户执行 C100时程序将运行sub和end sub之间的所有指令。第二行: Dim cc(0 To 2 As Double '声明坐标变量后半段“'声明坐标变量”自动变为绿色字体,它是代码语句的注释,它不会影响程序运行,它的作用是告诉阅读者程序员的想法。对于简单的程

AutoCAD二次开发工具的比较

AutoCAD二次开发工具的比较 AutoCAD是美国Autodesk公司的产品,是当今世界最为流行的计算机辅助设计软件之一,广泛应用于机械、建筑、电子、工程等许多领域。它如此风靡的原因除了具有各种强大的绘图及编辑功能、友好的用户界面、易于操作等特性之外,还在于它所具有的开放式结构(Open Architecture,即允许用户开发自己的命令、标准库文件和各种应用程序)使得通过对AutoCAD进行二次开发来完成各类设计工作变得更加容易。 现在对AutoCAD二次开发工具的几种方法作一个介绍,对比各自的优势及不足,给出各自的适用条件。 1.AutoLISP AutoLISP是AutoCAD最早的一种二次开发语言。它是一种嵌入在AutoCAD内部的CommonLisp程序设计语言子集,并扩充了极强的图形处理功能。此外还可为AutoCAD添加某些特殊的函数功能,如制作幻灯片、菜单等。 AutoLISP应用程序既可完成通常的科学计算和数学分析,又能直接调用几乎全部AutoCAD命令。这两者的有机结合,使它成为专业CAD开发者强有力的理想工具。而Lisp是目前研究和开发人工智能与专家系统CAD的主要编程语言。 AutoLISP有如下优点:(1)语言规则十分简单,易学易用。对计算机了解不太深入的工程专业人员,仅需经短期的学习,就可以熟练掌握这门语言。该语言的简洁性是其它许多计算机语言所无法相比

的。(2)直接针对AutoCAD,解释执行,易于交互。AutoLISP提供的大多数函数都是直接针对AutoCAD操作的,用AutoLISP可编写访问AutoCAD图形数据库(DWG)的操作。(3)解释执行立竿见影。程序员既可以一次运行一段AutoLISP代码,也可以在AutoCAD 的”Command:”下逐条键入AutoLISP指令,立即得到结果。 随着计算机技术的发展,CAD编程逐渐复杂,代码越来越庞大,AutoLISP的缺点也越来越明显。如,综合处理能力差、程序运行速度慢、软件质量不易保证、开发环境集成度低和与人的思维方式不太一致等。由于AutoLISP的这些特点,它仅适合于有能力的终端用户作些自己的开发任务,如今AutoLISP的使用已经逐渐被其它几种开发工具所取代。 2.ADS 它是AutoCAD开发系统(AutoCAD Development)的简称。ADS 的编程界面可使用户用C语言来实现AutoCAD的用户化,既可运行第三方开发的ADS应用程序,也可以编写自己的ADS应用程序。 与AutoLISP相比,ADS程序的优越性如下:(1)具备错综复杂的综合大规模处理能力;(2)由于是编译开发环境,可以检查程序设计语言的逻辑错误,且执行速度快;(3)程序源代码的可读性好于LISP;(4)引入C++高级语言后,ADS也同样具有面向对象的功能,程序层次分明,清晰可读,从而使软件的可维护性得到提高;(5)经过良好封装,ADS C++的程序代码比ADS C程序简洁得多,许多时候比AutoLISP更简洁;(6)ADS C++的程序能够减少程序出错的概率。

利用C#进行AutoCAD的二次开发

利用C#进行AutoCAD的二次开发(一)转自明经通道 众所周知,对AutoCAD进行二次开发用到的主要工具有:ObjectArx,VBA,VLisp。但它们的优缺点是显而易见的:ObjectArx功能强大,编程效率高,但它的缺点是编程者必须掌握VC++,而这门语言非常的难学;VBA和VLisp虽然简单易上手,但它们对于开发大型的程序好象无能为力。那究竟有没有一种语言能结合它们的优点而尽量避免它们的缺点呢? 回答是肯定的,那就是微软新推出的21世纪编程语言C#。关于C#的详细介绍,大家可以参考有关的文章。 C#是通过AutoCAD ActiveX 这座桥梁来和AutoCAD之间进行通讯的。AutoCAD ActiveX 使用户能够从AutoCAD 的内部或外部以编程方式来操作AutoCAD。它是通过将AutoCAD 对象显示到“外部世界”来做到这一点的。一旦这些对象被显示,许多不同的编程语言和环境就可以访问它们。关于AutoCAD ActiveX 的情况,大家可以参考AutoCAD自带的帮助。 呵呵,说了这么多无聊的,还是让我们通过一个具体的例子来说明怎样利用C#进行AutoCAD的二次开发吧。在介绍例子之前先讲一下有关的配置: (1)Visual Studio .net (2003和2002都可以,我用的是2002)(2)AutoCAD2000以上版本(我用的是2004)这个例子非常简单,就是通过C#建立的窗体来启动AutoCAD并画一条直线。下面是编程的具体步骤: (1)通过Visual Studio .net 建立一C#的windows应用程序。 (2)在“解决方案资源管理器”中右击“引用”标签,在弹出的菜单中选择“添加引用”,在“添加引用”对话框中选择“com"选项卡下的下拉列表框中的“AutoCAD 2004 Type Library"项(注意:不同版本的CAD的数字不同),单击右边的“选择”按钮,最后单击下面的“确定”按钮。(3)在C#窗体中加入两个文本框和一个按钮,分别用于输入直线起点、终点的坐标和在CAD中画直线。下面主要解释一下添加的代码。(a)在程序的开头加入:using AutoCAD;//导入AutoCAD引用空间 (b)在窗体的变量声明部分加入: private AcadApplication a;//声明AutoCAD对象 (c)在窗体的构造函数部分加入:a=new AcadApplicationClass();//创建AutoCAD对象 a.Visible=true;//使AutoCAD可见 (d)在按钮的消息处理函数中加入: double[] startPoint=new double[3]; //声明直线起点坐标 double[] endPoint=new double[3];//声明直线终点坐标 string[] str=textBox1.Text.Split(',');//取出直线起点坐标输入文本框的值,文本框的输入模式为"x,y,z" for(int i=0;i<3;i++) startPoint=Convert.ToDouble(str);//将str数组转为double型 str=textBox2.Text.Split(',');//取出直线终点坐标输入文本框的值 for(int i=0;i<3;i++) endPoint=Convert.ToDouble(str); a.ActiveDocument.ModelSpace.AddLine(startPoint,endPoint);//在AutoCAD中画直线 a.Application.Update();//更新显示 好了,简单吧,你可以试着编译一下。关于上面一些语句的用法,我会在下一讲中作详细介绍。

客户二次开发技巧

学习导航 通过学习本课程,你将能够: ●学会让顾客记住并信任自己; ●了解顾客二次开发的步骤; ●掌握顾客二次开发的方法。 客户二次开发技巧 一、如何让顾客记住并信任你 客户二次开发最基本的前提是信任,只有当顾客信任并记住自己时,顾客才有可能继续进行交流、接触。 导购要想使顾客记住自己及自己店面的产品,并得到顾客的信任,需要做好以下方面的工作: 第一,建立完备的客户档案,这是工作人员向顾客进行回访、举办惊喜活动和提供优惠产品的依据; 第二,要保证送货及时、安装优质; 第三,要及时、有效地对顾客进行事后电话反馈; 第四,需要定时做回访,回访过程中的活动与奖品可以有效地使顾客记住并信任自己; 第五,在顾客较多的情况下,工作人员可以利用短信平台,给顾客适时地送去祝福和问候,需要注意的是,短信的发送频率不要太高,以免给顾客带来不便; 第六,偶尔进行电话回访,询问顾客对本店产品的满意度与近期需求,此外,这种回访还可以利用短信系统的群发功能,虽然费用较高,但却有利于产品的二次介绍与店面的口碑宣传,可以为公司带来极大的效益。 二、二次开发的方法 家居建材是一种耐用消费品,顾客对于同一类产品的重复购买率较低。 因此,对于家居建材行业而言,在顾客二次开发过程中需要运用一定的方式: 1.给出顾客整体性建议 顾客购买产品时,工作人员可以根据其所购买的产品以及自己的专业知识取得顾客的信任,然后以专业人员或朋友的身份向其介绍周边的其他配套产品,并提出整体性建议。 提出建议时,导购一定要得到顾客的信任,使他相信自己不是让他向外掏钱,否则会引起顾客的反感。一般来说,可以在向顾客进行一次比较完整的服务后,适时提出建议。 【案例】 驯兽员的故事

关于VB对AutoCAD二次开发学习笔记

关于VB对AutoCAD二次开发学习笔记 □By OYLS 基于VB对AutoCAD的二次开发,主要是通过运用VB编程对AutoCAD软件中的基本绘图操作进行控制,了解AutoCAD软件中的常用命令。在编程过程中我们要借助AutoCAD软件中的“帮助文件”,即“AutoCAD开发人员帮助”文档。 一、获取VB对AutoCAD的控制权: 先定义变量acadApp,acadDoc: Public acadApp As AcadApplication Public acadDoc As AcadDocument Function boot_CAD() As Boolean On Error Resume Next Set acadApp = GetObject(, "AutoCAD.Application") If Err Then Err.Clear Set acadApp = CreateObject("AutoCAD.Application") If Err Then MsgBox "您没有安装AutoCAD ,或安装版本错误!", vbOKOnly + vbInformation, "CAD简易绘图系统" boot_CAD = False BtOK = False Exit Function End If End If Set acadDoc = acadApp.ActiveDocument acadApp.Visible = True boot_CAD = True End Function 需要说明的是,我们只有先对CAD获取了控制权以后才能有效地运用VB编程方式进行CAD的基本绘图操作。不然,以后的各种对CAD的操作将无法得以实现。 二、基本绘图思路: 先了解所绘对象的基本属性,可以说,也正是由于对象的各种属性才构成了一个特性为一而标准的实体。对象的属性特点我们可以事先通过CAD帮助文件查找得出。接下来我们就应了解创建方法,同样,我们也是通过CAD帮助文件进行查找。可以看出,在整个绘图编程过程中我们都离不开CAD帮助文件,所

用VB对AutoCAD进行二次开发

用VB对AutoCAD进行二次开发|用VB对AutoCAD进行二次开发 A utoCAD一直是CAD市场中的主流产品。随着AutoCAD的日益普及,在其上进行二次开发的工具也不断更新。从早期的Auto Lisp、ADS、 DCL到现在流行的 Object ARX、ActiveX Automation、Visual Lisp,均可十分方便地对AutoCAD进行二次开发。本文主要讨论关于运用Visual Basic对AutoCAD基于ActiveX Automation的二次开发技术。选用ActiveX有两个原因,一是因为Visual Basic的普及性与易用性,二是采用这种方法进行二次开发可方便地实现与其它图形软件的接口,如与Solid Works实现实体造型与二维绘图的结合,以及根据用户的特殊需要开发出一定功能的软件。 二、ActiveX Automation技术 AutoCAD中的ActiveX Automation是微软公司ActiveX规范的具体应用。它通过基于ActiveX的自动化对象,为其他应用程序提供了访问AutoCAD内部功能的方法,是AutoCAD最新的开发接口。在运行时,AutoCAD与其他应用程序之间的关系是服务器与客户的关系,开发人员使用支持ActiveX规范的编程语言(如VB、Dephi等)能通过访问AutoCAD的对象模型,把AutoCAD的强大功能集成到应用程序中.AutoCAD的对象模型是一种树型结构模型,根为"AutoCAD Application",AutoCAD中的所有对象都是AutoCAD Application的子对象。图1所示为AutoCAD对象模型的层次结构树,其中父对象与子对象之间的关系并不是对象继承关系,而是包含关系。 图1 AutoCAD中ActiveX对象的总结构图 三、ActiveX Automation的使用方法 1. Application对象 如果在计算机系统上安装了AutoCAD,则Windows会自动将其所有的信息注册到系统注册表里。那么在启动Visual Basic后,用户可以象调用VB自己的对象一样调用AutoCAD所提供的ActiveX。 在编程、调试或运行时至少应该有一个AutoCAD副本在运行。可以通过以下的代码创建AutoCAD对象。 Dim AcadApp as Object ’定义一个对象 On Error Resume Next Set AcadApp =GetObject(,"AutoCAD.Application") If Err Then ’如果没有一个AutoCAD副本在运行 Err.Clear Set AcadApp =CreateObject("AutoCAD.Application") AcadApp.Visable =True ’启动一个AutoCAD副本并设为可见 If Err Then MsgBox Err.Description ’如果失败,给出错误提示 Exit Sub End If End If 2. Preferences与Document对象 与AutoCAD中的Preferences对话框的作用相同,通过Preferences对象可以读取或设置AutoCAD的一些基本设置。Preferences对象通过Application的Preferences 属性返回。 Dim AcadPref as Object

相关文档