第6章AutoCAD二次开发 1.docx

上传人:b****4 文档编号:4461674 上传时间:2022-12-01 格式:DOCX 页数:17 大小:59.14KB
下载 相关 举报
第6章AutoCAD二次开发 1.docx_第1页
第1页 / 共17页
第6章AutoCAD二次开发 1.docx_第2页
第2页 / 共17页
第6章AutoCAD二次开发 1.docx_第3页
第3页 / 共17页
第6章AutoCAD二次开发 1.docx_第4页
第4页 / 共17页
第6章AutoCAD二次开发 1.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

第6章AutoCAD二次开发 1.docx

《第6章AutoCAD二次开发 1.docx》由会员分享,可在线阅读,更多相关《第6章AutoCAD二次开发 1.docx(17页珍藏版)》请在冰豆网上搜索。

第6章AutoCAD二次开发 1.docx

第6章AutoCAD二次开发1

AutoCAD二次开发基础讲义

AutoCAD荣登全球绘图软件的龙头宝座,主要是因为它具有开放的体系结构。

它允许用户和开发者采用高级编程语言对其进行扩充和修改,即二次开发,能最大限度地满足用户的特殊要求。

AutoCAD第一版于1982年11月由AutoDESK公司推出,目前大家广泛使用的是AutoCAD2000或2002,最新版本是AutoCAD2004,其二次开发语言及工具也在不断地涌现。

1AutoLISP

AutoLISP的全名是LISTProcessingLanguage,她出现于1985年推出的AutoCADR2.18中,是一种嵌入在AutoCAD内部的编程语言,是LISP原版的一个子集,她一直是低版本AutoCAD的首选编程语言。

它是一种表处理语言,是被解释执行的,任何一个语句键入后就能马上执行,它对于交互式的程序开发非常方便。

其缺点是继承了LISP语言的编程规则而导致繁多的括号。

3ADS

ADS的全名是AutoCADDevelopmentSystem,它是AutoCAD的C语言开发系统,ADS本质上是一组可以用C语言编写AutoCAD应用程序的头文件和目标库,它直接利用用户熟悉的各种流行的C语言编译器,将应用程序编译成可执行的文件在AutoCAD环境下运行,这种可以在AutoCAD环境中直接运行的可执行文件叫做ADS应用程序。

ADS由于其速度快,又采用结构化的编程体系,因而很适合于高强度的数据处理,如二次开发的机械设计CAD、工程分析CAD、建筑结构CAD、土木工程CAD、化学工程CAD、电气工程CAD等。

4ObjectARX

ObjectARX是一种崭新的开发AutoCAD应用程序的工具,她以C++为编程语言,采用先进的面向对象的编程原理,提供可与AutoCAD直接交互的开发环境,能使用户方便快捷地开发出高效简洁的AutoCAD应用程序。

ObjectARX并没有包含在AutoCAD中,可在AutoDESK公司网站中去下载,其最新版本是ObjectARXforAutoCAD2000,它能够对AutoCAD的所有事务进行完整的、先进的、面向对象的设计与开发,并且开发的应用程序速度更快、集成度更高、稳定性更强。

ObjectARX从本质上讲,是一种特定的C++编程环境,她包括一组动态链接库(DLL),这些库与AutoCAD在同一地址空间运行并能直接利用AutoCAD核心数据结构和代码,库中包含一组通用工具,使得二次开发者可以充分利用AutoCAD的开放结构,直接访问AutoCAD数据库结构、图形系统以及CAD几何造型核心,以便能在运行期间实时扩展AutoCAD的功能,创建能全面享受AutoCAD固有命令的新命令。

ObjectARX的核心是两组关键的API,即AcDb(AutoCAD数据库)和AcEd(AutoCAD编译器),另外还有其它的一些重要库组件,如AcRX(AutoCAD实时扩展)、AcGi(AutoCAD图形接口)、AcGe(AutoCAD几何库)、ADSRX(AutoCAD开发系统实时扩展)。

ObjectARX还可以按需要加载应用程序;使用ObjectARX进行应用开发还可以在同一水平上与Windows系统集成,并与其它Windows应用程序实现交互操作。

5VisualLISP

VisualLISP已经被完整地集成到AutoCAD2000中,她为开发者提供了崭新的、增强的集成开发环境,一改过去在AutoCAD中内嵌AtuoLISP运行引擎的机制,这样开发者可以直接使用AutoCAD中的对象和反应器,进行更底层的开发。

其特点为自身是AutoCAD2000中默认的代码编辑工具;用它开发AutoLISP程序的时间被大大地缩短,原始代码能被保密,以防盗版和被更改;能帮助大家使用ActiveX对象及其事件;使用了流行的有色代码编辑器和完善的调试工具,使大家很容易创建和分析LISP程序的运行情况。

在VisualLISP中新增了一些函数:

如基于AutoLISP的ActiveX/COM自动化操作接口;用于执行基于AutoCAD内部事件的LISP程序的对象反应器;新增了能够对操作系统文件进行操作的函数。

6VBA

VBA即Mcrosoftoffice中的VisualBasicforApplications,它被集成到AutoCAD2000中。

VBA为开发者提供了一种新的选择,也为用户访问AutoCAD2000中丰富的技术框架打开一新的通道。

VBA和AutoCAD2000中强大的ActiveX自动化对象模型的结合,代表了一种新型的定制AutoCAD的模式构架。

通过VBA,我们可以操作AutoCAD,控制ActiveX和其它一些应用程序,使之相互之间发生互易活动

第一部分AutoLISP语法基础

一.AutoLISP的程序结构

1.程序结构

(函数参数……)

如:

(setqx25.0)

(setqy12.2)

(+(*xy)x)

 

AutoLISP程序由一个或一系列按顺序排列的标准表组成。

2.AutoLISP书写格式的特点:

(1)左右括号匹配;

(2)从左到右读程序;

(3)函数放在第一个元素的位置;

(4)一表可占多行,一行可写多表;

(5)用分号“;”作注释;

二.AutoLISP的变量与类型

1.整形常量Int

整数由数字组成,不包含小数点。

AutoLISP的整数是32位带符号的数,取值范围从+2,147,483,647到-2,147,483,648

2.实数常量Real

实数是带有小数点的数。

以双精度浮点格式存储的,可以提供至少14位精度。

可以用科学记数法表示。

如数字3.1、0.23、-56.123和21,000,000.0都是有效的AutoLISP实数

3.字符串常量Str

字符串是在双引号中的一组字符。

如“string1”和“\nEnterfirstpoint:

”都是有效的字符串。

4.表

ListAutoLISP的表是在括号中以空格分隔的一组相关值。

表提供了一种存储大量相关值的有效方法。

AutoCAD将三维点表示为三个实数组成的表。

(1.01.00.0)、("this""that""theother")和(1"ONE")都是有效的表

5.其它

Sym(符号和变量),Select(选择集),Entity(实体名),filepointer(文件描述符),VLA对像(VisualLISPActiveX)。

三.数值函数

1.计算函数

(1)+、-、*、/

AutoLISP中,所有运算符号均采用前缀方式。

一般格式为:

(运算符数字数字……)。

(+ab);(-ab);(*ab);(/ab);

如:

(*abc)即为a*b*c

(+a(-b(*cd)))即为a+(b-c*d)

command:

(+4.72)6.7

command:

(/85)1

command:

(*256)60

(2)最大数,最小数

(maxnum1num2……)

(minnum1num2……)

如:

command:

(max4.72)4.7

command:

(min3.2-1)-1

(3)平方根,绝对值

平方根:

(sqrtnum)

绝对值:

(absnum)

如:

command:

(sqrt4)2

command:

(abs-1)1

(4)三角函数

反正切(atana)或(atana1a2)

正弦(sinangle);

余弦(cosangle);

注:

angle用弧度制

如:

command:

(atan1.5)0.982794

command:

(atan3.02.0)0.982794

command:

(sin1)0.841471

command:

(cospi)1.0

2.逻辑运算

(andab);(orab);(nota);-----其中a,b为逻辑表达式。

如:

command:

(andnil10)nil

command:

(ornil1)T

command:

(not10)nil

3.关系运算

=ab)-----条件为真返回T,否则返回nil

如:

command:

(<35)T

command:

(<3542)nil

command:

(<2345)T

四.几何实用函数

1.angle函数

(anglept1pt2)

说明:

pt1、pt2为两点的坐标,计算这两点连线与x轴的夹角(按逆时针计算),返回弧度值。

如:

command:

(angle’(00)’(100100))0.785398

2.distance函数

(distancept1pt2)

如:

command:

(distance’(00)’(1000))100

3.polar函数

(polarptangledistance)

如:

command:

(polar'(00)0.78100))

(71.091470.3279)

五.表处理函数

1.表长函数

(lengthlist)

如:

command:

(length’(abc))3

command:

(length’(a(bc)))2

2.表颠倒函数

(reverselist)

如:

command:

(reverse’(35))(53)

command:

(reverse’(3542))(2453)

3.返回表中元素

(cadlist)(cdrlist)(cadrlist)

如:

command:

(cad’(abc))a

command:

(cdr’(abc))b

command:

(cadr’(abc))c

command:

(cdr’(a(bc)))(bc)

六.赋值函数

(setqsym1expr1sym2expr2sym3expr3……)

如:

command:

(setqd’(abc))(ABC)

command:

(setqa10b12.5c23)23

command:

!

a10

command:

!

c23

七.用户输入函数

1.getint、getreal、getstring函数

(get×××

如:

command:

(setqd(getint“Enteranumber:

\n”))

Enteranumber:

1212

command:

(setqs(getstring“Enterastring:

”))

Enterastring:

autolispautolisp

2.getpoint函数

(getpoint

如:

command:

(setqd(getpoint“Enterapoint:

”))

Enteranumber:

鼠标点取(100,100)

八.command函数

(comment

如:

(command"circle"'(200200)20)

(command"circle""2p"'(100100)'(80150))

说明:

1.本函数用于执行一条AutoCAD命令,即向AutoCAD的“command:

”提示直接发送AutoCAD命令;

2.变元表示要求AutoCAD执行的命令及该命令所需的参数,这些参数必须与命令对应的参数需求相适应,且顺序一致;

3.空字符串(“”)等效于回车;

4.调用AutoCAD内部的参数要加“”,自定义的参数不加“”;

mand函数中需要的参数必需执行在command函数前定义,command函数中不能使用get×××等函数。

实例:

command:

(setqp1(getpoint))(300.572245.050.0)

command:

(setqr1(getint))50

command:

(command"circle"p1r1)

command:

(setqa(entlast))

command:

(command"hatch""u"4510""a"")

九.函数的定义

(defunsym(全局变量/局部变量))

如:

(defunplus(/ans)

(setqans(+23));令ans=2+3

运行:

加载→输入“(plus)”或在AutoCAD命令中输入“(plus)”

问题:

plus不是AutoCAD的内部函数,如何使得plus函数数能像AutoCAD内部函数那样被调用?

(defunc:

sym(全局变量/局部变量))

如:

(defunc:

plus(/ans)

(setqans(+23));令ans=2+3

运行:

加载→输入“(c:

plus)”或在AutoCAD命令中输入“(c:

plus)或“plus”

十.实例1

(defunc:

ring()

(setqr12.5r24.0r35.5r1.0)

(setqpc(getpoint"\n输入圆心"))

(command"circle"pcr1

"circle"pcr2

"circle"pcr3)

(command"circle"(polarpc0r2)r)

(command"array""L""""p"pc8360"N")

实例2

(defunc:

akey(/dhwbpagp1p2)

(setqd(/(getint"\nd=?

")2.0)

h(getint"\nh=?

")

w(/(getint"\nw=?

")2.0)

bp(getpoint"\ncenter=?

")

ag(atan(/w(sqrt(-(*dd)(*ww)))))

(command"pline"

(setqp1(polarbp(-ag)d))

(setqp2(list(+(carbp)(-dh))(cadrp1)))

(polarp2(/pi2.0)(*w2))

(polarbpagd)

"a""ce"bpp1""

(setqss(entlast))

(command"hatch""u"4510""ss"")

第二部分AutoCAD菜单开发

一.菜单文件

MNU原始菜单文件,文本格式。

MNS加载.MNU后产生,文本格式。

MNC将.MNS编译为二进制格式。

MNR二进制文件,包含由菜单使用的位图。

MNL与菜单配套的AutoLISP程序。

这些文件包含由菜单文式件使用的AutoLISP表达式。

当加载同名的菜单文件时,这些文件也载入内存。

二.菜单文件结构

1.段标题

常用段标题菜单区域

***POPN下拉/快捷菜单区域

***TOOLBARS工具栏定义

***IMAGE图像控件菜单区域

***SCREEN屏幕菜单区域

***MENUGROUP菜单文件组名

2.菜单项

菜单项由下列元素组成:

(名称标记)、标签和菜单宏。

3.菜单宏

^C^C可确保不存在尚未完成的命令。

这与在键盘上连续按两次ESC一样。

并从DIM命令返回命令提示。

说明:

(1)注释用//;

(2)程序最后要回车。

三.下拉菜单

1.段标题

***popN(N:

1~499)

2.子菜单标题

**+子菜单名(可省略)

3.菜单项

[菜单项名]—下拉菜单总标题

[菜单项1]

[菜单项2]

4.菜单宏

[菜单项n]^c^c(load“源程序文件名”)(函数名)

例:

***pop1

[关键零件]

[法兰]^c^c((load"ring.lsp")(c:

ring))

[键槽]^c^c(load"key.lsp")(c:

akey)

四.图像菜单

1.菜单组名

menugroup=菜单组名

2.下拉菜单段

***popN

[菜单项名]——下拉菜单总标题

[图像菜单项n]$I=菜单组名.图像菜单子菜单名$I=*

(其中,第一个$I为查找图像菜单。

第二个$I为了显示当前加载的图像菜单。

3.图像菜单项

***image

**+图像菜单子菜单名(不可省略)

[图像菜单标题]

[幻灯片1,菜单项1]^c^c(load“源程序文件名”)(函数名)

[幻灯片2,菜单项2]^c^c(load“源程序文件名”)(函数名)

例:

***menugroup=part

***pop1

[关键零件]

[主要零配件]$I=part.image_part$I=*

***image

**image_part

[主要零配件]

[ring,法兰]^c^c(load"ring.lsp")(c:

ring)

[key,键槽]^c^c(load"key.lsp")(c:

akey)

 

第三部分AutoCAD对话框设计

一.DCL基本语言

在VisualLISP中,对话框的格式以对话框控制语言(DCL)定义在.dcl文件中。

1.语法格式

对话框名称:

dialog

{label=标题名;

{:

组件1

key=value1;

label=value2;

attribute=value;}

{:

组件2

key=value1;

label=value2;

attribute2=value2;}

ok_cancel}

2.说明

(1)属性定义语句后用“;”结尾;

(2)注释符用“//”;

(3)对话框显示预览:

VisualLISP编辑器→工具→界面工具→预览编辑器中的DCL。

3.实例

dcl:

dialog

{label="我的对话框";

ok_cancel;

}

二.对话框常用组件的定义

1.编辑框(edit_box)

radia:

dialog

{label="半径值";

:

edit_box

{label="请输入圆的半径r1";

key="a1";}

:

edit_box

{label="请输入圆的半径r2";

key="a2";}

ok_cancel;

}

2.图像框(image)

ring:

dialog

{label="法兰幻灯片";

:

image

{key="ringslide";

height=20;

width=50;

color=-3;}

ok_cancel;

}

}

3.下拉列表框(popup_list)

season:

dialog

{label="季节";

:

popup_list

{key="season";

label="一年四季";

list="春\n夏\n秋\n冬";}

ok_cancel;

}

4.列表框(list_box)

season:

dialog

{label="季节";

:

list_box

{key="season";

label="一年四季";

list="春\n夏\n秋\n冬";}

ok_cancel;

}

5.对话框区域定义boxed_column(列);boxed_row(行)

:

boxed_row

{label="第一组半径值";

:

edit_box

{label="r1";

key="a1";}

:

edit_box

{label="r2";

key="a2";}

}

:

boxed_column

{label="第二组半径值";

:

edit_box

{label="r3";

key="a3";}

:

edit_box

{label="r";

key="a";}

}

ok_cancel;

}

三.对话框管理

1.调用load_dialog来加载DCL文件

格式:

(load_dialogdclfile)

为便于后面的管理,给对话框文件一个文件识别码,则格式改为:

(setqdcl_id(load_dialogdclfile))

注:

dcl_id文件识别码

2.调用new_dialog来显示特定的对话框。

格式:

(new_dialogdlgnamedcl_id)

如须检查new_dialog的返回值,则格式改为:

(if(not(new_dialog"dlgname"dcl_id))(exit))

3.通过设置控件值、列表和图像来初始化对话框。

(1)action_tile函数

格式:

(action_tilekeyaction-expression)

例:

(action_tile“edit1”“(setqa1$value)")

$value—引用控件的当前值

(2)图像框处理函数

a.获取图像框尺寸

(dimx_tilekey)如:

(setqwidth(dimx_tilekey)

(dimy_tilekey)如:

(setqheigth(dimy_tilekey)

b.激活图像框

(start_imagekey)

c.显示幻灯片图像

(slide_imagexywidthheigthsldname)

x,y—图像与图像框左上角偏移量

(3)done_dialog函数,用于结束对话框

格式:

(done_dialog[status])

status默认值:

1,表示用户按下“ok”按钮;

0,表示用户按下“cancel”按钮;

4.调用start_dialog将控制权转交给对话框,以便用户进行输入

格式:

(start_dialog)

5.调用unload_dialog来卸载该DCL文件。

格式:

(unload_dialogdcl_id)

第四部分AutoCAD二次开发综合实例

(defunc:

ring()

(setqdcl_id(load_dialog"ring.dcl"))

(if(not(new_dialog"ring"dcl_id))(exit))

(setqx(dimx_tile"ring_image"))

(setqy(dimy_tile"ring_image"))

(start_image"ring_image")

(slide_image00xy"ring")

(end_image)

(action_tile"a1""(setqr1$value)")

(action_ti

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1