用Autolisp对AutoCAD进行二次开发

用Autolisp对AutoCAD进行二次开发
用Autolisp对AutoCAD进行二次开发

用AutoLISP对AutoCAD进行二次开发

一、什么是CAD的二次开发?(为什么需要对CAD进行二次开发)

我们在设计、绘图时采用AutoCAD、ProE、Solidwork、UG等设计软件,在复杂问题或特殊用途的设计中,各种软件的原有功能往往难以解决问题,例如CAD里没有直接绘制正弦曲线和抛物线等曲线的命令。因此,只是会使用各软件的基本功能是不够的,根据我们的特殊用途进行软件的用户化定制和二次开发,往往能够大大提高工作效率和技术水平。

二、什么是AutoLisp?如何用其进行二次开发?

AutoLISP是由Autodesk公司开发的一种LISP程序语言,LISP是List Processor的缩写。通过autolisp 编程,可以节省工程师很多时间。AutoLISP语言作为嵌入在AutoCAD内部的具有智能特点的编程语言,是开发应用AutoCAD不可缺少的工具。

当前AutoCAD的二次开发工具主要有:VisualLisp(它是AutoLisp的集成开发环境)、VBA、ObjectARX和.NET API等,这里只介绍AutoLisp。

下面由浅入深地介绍一下如何应用AutolLisp进行二次开发。

最简单的应用是在命令行中编写和执行lisp语句,进行简单的计算、绘图、查询等操作。

稍复杂些的就要把语句(代码)放到扩展名为lsp的文件中,用的时候先加载到CAD中,然后输入自定义的函数名执行。

当开发的程序越来越多,就需要进行有效的管理,使我们能方便的找到和应用这些程序。到那个程度的时候就需要用到用户自定义的工具按钮、菜单和对话框了。

图1 根据程序数量选择二次开发形式

(1)在命令行中编写和执行程序

例1:(+ 2 3)

例2:(setq a 2)

(setq b 3)

(+ a b)

例3:(setq a 2)(setq b 3)(+ a b)

例4:(setq p1 (list 0 0))(setq p2 (list 200 200))(command “line” p1 p2 “”) ;;语句之间不空格

例5:(setq p1 (list 0 0)) (setq p2 (list 200 200)) (command “line” p1 p2 “”) ;;语句之间空格

;; 表示语句(程序代码)的注释

第一步:在文本中编写和保存AutoLISP程序,文件扩展名为.lsp

(defun c:sin(/ lp lpx lpy N x step) ;; c:和自定义函数名sin之间不能有空格

(initget 1)

(setq lp (getpoint "\n Left point:")

lpx (car lp) lpy (cadr lp))

(initget 7)

(setq N (getint "\Nnumber of cyles:"))

(setq x 0 step 0.02)

(command "pline" )

(While (< x (* 2 N pi))

(command (list (+ (car lp) x)

(+ (cadr lp)(sin x)))

)

(setq x (+ x step))

)

(command "line" lp (list (+ lpx (* 2 N pi)) lpy) "")

(command "line" lp (list lpx (+ lpy 2))(list lpx (- lpy 2)) "") ;;注意这里用的是空的双引号“”,中间不空格

(command)

)

第二步:AutoLISP程序的加载和运行

在命令行中输入appload(或ap),在弹出的“加载/卸载应用程序”对话框中选择第一步保存的*.lsp 文件。单击“加载” “关闭”。

执行自定义函数前先将“对象捕捉”功能关闭。运行自定义函数的过程和执行CAD标准函数(命令)是一样的,只要在命令行中输入函数名即可。

(3)添加用户工具按钮

工具按钮能够快速、高效启动AutoLisp的应用程序。为了更方便的管理和应用我们的lisp应用程序。我们要学会创建用户自定义工具栏,并向新工具栏中添加新的工具按钮,点击这些按钮便可以很方便地执行我们自己定义的应用程序。

第一步:创建新工具栏

将鼠标移动到任意一个工具按钮上,单击鼠标右键。

在弹出的菜单最下端找到“自定义(C)...”对话框,左键单击。弹出“自定义用户界面”对话框。右键单击工具栏图标新建一个用户自定义工具栏,命名这个新工具栏。

第二步:向新工具栏添加按钮

在“自定义用户界面”对话框的左下角的命令列表栏中单击“新建”按钮建立一个新命令。按住左键不放,将新的命令按钮拖到第一步新建的工具栏内。这样工具栏里便添加了第一个命令,用此方法可以给工具栏添加多个新按钮。

第三步:定制工具按钮属性

新的工具按钮刚添加到工具栏内的时候是不能执行命令的,需要给它添加属性。

在“自定义用户界面”对话框的右侧可以编辑按钮的图像和属性。其中最重要的是“特性”里的“宏”一栏。将上面pwx.lsp文件的路径和命令名输入到“宏”后面的文本框内,例如:^C^C^P(load"/F:/Autolisp Program/My Lisp/sin.lsp");sin;^P

单击确定退出“自定义用户界面”对话框。这时在CAD的工具栏中会多出一个用户刚才自定义的新

(4)添加用户自定义菜单

当我们开发出的程序越来越多的时候,用工具按钮的形式来执行它们会占用绘图的空间,而且也不便于管理。这种情况下就有必要将众多的程序分类,相同种类的程序写入同一个菜单文件中,便于将来查找和执行。具体的开发步骤为:

第一步:打开Visual LISP编辑器

图2 打开Visual LISP编辑器

第二步:创建用户自定义的菜单文件

打开Visual LISP编辑器后,在文本框中输入生成用户自定义菜单的代码,写好后将文件保存,扩展名为.mnu。例如:

***MENUGROUP=MYLISP ;;用户自定义菜单组名MYLISP

***pop1 ;;第一个菜单

[中间包] ;;第一个菜单名称

[初等函数曲线绘制] ^C^C^P(load "curve of function")(load "csin")(load "ccos")(load "cparabola")(curve_of_function) ;;命令的名称、加载操作和执行操作

[->复合函数曲线绘制];;子菜单名称,->表示生成的是子菜单

[抛物线与正弦曲线的叠加] ^C^C^P(load "cpara_sine") (cparasine)

[抛物线与余弦曲线的叠加] ^C^C^P(load "cpara_cos") (cparacos)

[--] ;;各命令之间的横线

[<-圆环面积与内径的关系曲线(&C)] ^C^C^P(load "cirque") (cirque) ;;<-表示子菜单结束

[挡板内外面积比的计算] ^C^C^P(load "stotal")(load "sdio")(stotal)

[结晶器] ;;第二个菜单名称

[齿轮绘制] ^C^C^P(load "gear") (gear)

***pop3 ;;第三个菜单

[凝固计算] ;;第三个菜单名称

[计算凝固系数K] ^C^C^P(load "solidification_coefficient") (solidification_coefficient)

;;文件的末尾必须是一个空行(回车)

第三步:加载用户自定义的菜单程序

在cad绘图界面的命令行中输入命令:menuload,在弹出的对话框中浏览选择要加载的菜单文件,单击加载,这时可以看到绘图界面的菜单栏上出现了用户自定义的菜单名。如图3所示。

用户自定菜单出现在菜单栏

第二步,点击加载

第一步,选择菜单文件存储路径

图3 加载用户自定义的菜单文件

(5)绘制对话框――DCL语言

第一步:打开Visual LISP编辑器

操作同图2。

第二步:创建用户自定义对话框文件

打开Visual LISP编辑器后,在文本框中输入生成用户自定义对话框的代码,写好后将文件保存,扩展名为.dcl。例如:

solidification_coefficient:dialog {

label="计算凝固系数K";

:text{

label="说明:根据合金的热物理特性计算凝固系数K";

}

:boxed_row{

label="输入合金的热物性参数和凝固温度";

:row{

:column{

:row{

:edit_box{

label="导热率λ";

key="lambda";

fixed_width=true;

width=5;

}

:text{

label="W/(m·K)";

}

}

:row{

:edit_box{

label="结晶潜热L";

key="L";

fixed_width=true;

width=5;

}

:text{

label="J/kg";

}

}

:row{

:edit_box{

label="密度ρ"; key="rho";

fixed_width=true;

width=5;

:text{

label="kg/m3";

}

}

}

}

:row{

:column{

:row{

:edit_box{

label="热容c "; key="c";

fixed_width=true;

width=5;

alignment=centered;

}

:text{

label="J/(kg·K)";

}

}

:row{

:edit_box{

label="合金液相线温度T_L"; key="T_L";

fixed_width=true;

width=5;

alignment=centered;

}

:text{

label="K";

}

}

:edit_box{

label="凝固层表面温度T_0"; key="T_0";

fixed_width=true;

width=5;

alignment=centered;

}

:text{

label="K";

}

}

}

}

}

:boxed_column{

:row{

:edit_box{

label="凝固系数K—m/s(1/2)"; key="S";

fixed_width=true;

width=5;

alignment=left;

}

:edit_box{

label="即mm/s(1/2)";

key="K";

fixed_width=true;

width=5;

alignment=left;

}

}

:row{

label="计算";

key="begin";

fixed_width=true;

width=5;

}

ok_only;

}

}

}

重要的一步:工具菜单→选项→文件→支持文件搜索路径(要包含上述所建各类文件的路径)

(6)编译及维护AutoLISP程序,形成独立应用程序

在Visual LISP中,用户可以编译自己的程序,并创建一个单独的可供其他用户使用的可执行模块。Visual LISP可将AutoLISP程序文件编译成可执行的程序模块以提高程序运行效率和源代码的安全性。Visual LISP提供了一套编译器来解决这些问题。通过这个编译器,用户可以将源代码编译成可执行机器码文件,即FAS文件。源代码在编译后,可以直接在Auto CAD中加载运行,运行效率提高了,而且程序源代码是保密的,甚至于源代码中的字符串与符号也会被Visual LISP的编译器加密。

此外,Visual LISP还可以将更复杂的AutoLISP应用封装进Visual LISP可执行文件(VLX)中。VLX 文件中还可以包括其他的资源文件,例如VBA和DCL文件以及编译过的AutoLISP文件。

常用函数及其说明

1.函数名称:vl-load-com

Visual Lisp内置函数:语法:(vl-load-com) 直接调用,无需参数

功能:将Visual LISP 扩展函数功能进行加载,以便使用其强大的扩展功能(类似c语言中的#include )。

说明:

(1) 加载后即可以使用,Vl- vla- vlax- vlr-等各类VisualLisp扩展函数,否则这几类函数将不可使用。

(2) 如果已经加载了,则再次调用本函数,不会有任何作用

2.函数名称:open

一. 功能

打开一个文件,供其它的AutoLISP I/O函数记访问。

二. 格式

(open filename mode)

三. 说明

filename变元是一个字符串,它指定要打开的文件名和扩展名。mode变元是一个读/写标志。它必须是包含了单个小写字符的一个字符串。下表列出了mode变元的有效取值。

Open函数的mode变元的有效取值

_______________________________

mode变元的取值说明

_______________________________

"r" 打开的文件用于读操作,若filename不存在,open返回nil

__________________________________________________________

"w" 打开的文件用于写操作;若filename不存在,则建立一个

新文件,并打开读文件;若filename存在,它的已有数据

会被覆盖。

_______________________________

"a" 打开的文件用于追加数据操作,若filename不存在,则建立

一个新文件,并打开该文件。若filename已经存在,则打开

该文件,打把并件指针移到现有数据的尾部。这样,用户

写入文件的所有数据都将追加到现有数据的后面。

_______________________________

在DOS平台上,某些程序和文本编辑器在写入文本文件时会在文本尾部加上一个文件结束标记(Ctrl+Z,十进制ASCII码26)。在读入文件时,当碰到Ctrl+Z标记时,DOS便返回文件结束状态,而不管其后是否还有其它数据。如果想用Open函数的"a"(追加)方式在其它程序所建立的后面追加数据,则必须保证这些程序没有在其文本文件尾部插入Ctrl+Z结束标记。

Open函数返回一个可由其它的AutoLISP I/O函数所用的文本描述符。文本描述符必须使用setq赋给一变量,如:

(setq a (open "file.ext "r"))

假定在下面实例中所使用的文件不存在,则:

(setq f (open "new.tst" "w")) ;;;返回

(setq f (open "nosuch.filt" "f"));;;返回nil

(setq f (open "logfile" "a")) ;;;返回

filename变元中可以包含一个目录前缀,例如:/test/func3即为一例。在DOS平台上,file-name变元中还允许使用驱动器字符,并且还可以使用右下斜杠(\)来代替左下斜杠(/)作为目录的分隔符,但是应该记住的是使用右下斜杠作为目录的分隔符时必须将该右下斜杠双写(即写成"\\"),这样在字符串中才可以获得一个右下斜杠。如:

(setq f (open "/x/new.tst" "w")) ;;;返回

(setq f (open "nosuch.fil" "r")) ;;;返回nil

四.实例

例1.下面的程序从一个文件读取数据,并将读入的内容构成一个表后返回。

(defun readlist (filnam / tmplst x)

(setq tmplst nil)

(setq fn (open filna "r"))

(while (setq x (read-line fn))

(setq tmplst (append tmplst (list x)))

)

(close fn)

(setq tmplst temlst)

)

例2.下面的程序将一个四边形的四个角点坐标写入到一个文件中,并画出该四边形。

(defun C:remember()

(setq fi (getstring "\nEnter file name:"))

(setq f (open fi "w"))

(prompt "Now draw 4 points of a rectangel:")

(setq p1 (getpoint "nFirst point:"))

(princ p1 f)

(set p2 (getpoint "nSecond point:"))

(princ p2 f)

(setq p3 (getpoint "\nThird point:"))

(princ p3 f)

(setq p4 (getpoint "\nFouth point:"))

(princ p4 f)

(close f)

(command "line" p1 p2 p3 p4 "c")

)

3.函数名称:read-line

一. 功能

从键盘或从一个已打开的文件中读取一个字符串。

二. 格式

(read-line [file_desc]))

三. 说明

如果read-line函数遇到了文件结束标志,它就返回nil;否则,它返回它所读取到的那个字符串。

例如,假设f是一个有效的已打开文件的批针,那么,

(read-line f)

将返回文件中的下一个输入行,而如果已经到达文件结束处则返回nil。

四. 实例

在下面的程序实例中,程序从用户指定的文件中完成数据的读取。我们假定用户指定的文件中存储的是坐标点,且假定这个数据文件是由print函数输出数据而产生的。我们先将程序清单列出如下:

(defun C:replay ()

(setq fi (getstring "\nEnter file to replay:"))

(setq f (open fi "r"))

(read-line f)

(setq p1 (read-line f))

(setq p2 (read-line f))

(setq p3 (read-line f))

(setq p4 (read-line f))

(close f)

(setq p1 (read p1))

(setq p2 (read p2))

(setq p3 (read p3))

(setq p4 (read P4))

(command "line" p1 p2 p3 p4 "c")

)

下面我们对这一程序进行简单分析,程序中为什么要安排下面这样一条语名呢?即:

(read-line f)

这是因为我们已经假定数据文件是由print函数形成的,而print函数在输出数据之前,首先要输出一空行,因此,执行这一语名就可以使数据文件中的第一个空行跳过去。接下去才可以开始读取实际的数据。

再分析一下程序中的如下代码行:

(setq p1 (read p1))

(setq p2 (read p2))

(setq p3 (read p3))

(setq p4 (read p4))

安排这样几个语名的目的是显而易见的,因为由read-line函数从文件中读取的数据所返回的是字符串形式,事实上,存储在文件中的数据,它们总是以字符串的形式被读入。因此,在这些数据能使用之前,要将它们从字符串形式转换成数值形式,read函数正好具有这样的功能,这就是在程序中我们要安排四个read函数调用的目的。

4.函数名称:print

一. 功能

打印一个表达式到命令行,或写一个表达式到一个已打开的文件中。

二. 格式

(print [expr [file-desc]])

三. 说明

这个函数除了在打印<表达式>之前先换行和在打印<表达式>之后打印空格之外,其它和prin1相同四.实例

下面的程序代码将用户在图形屏幕上拾取的四个点从打印机输出,并在图形屏幕上画出由这四个点连接而成的一个四边形。

(defun C:remember2()

(setq fi "prn")

(setq f (open fi "w"))

(prompt \Now draw 4 points of a rectangle:")

(setq p1 (getpoint "\nFirst point:"))

(prin1 p1 f)

(setq p2 (getpoint "\nSecond point:"))

(prin1 p2 f)

(setq p3 (getpoint "\nThird point:"))

(prin1 p3 f)

(setq p4 (getpoint "\nFouth point:"))

(prin1 p4 f)

(close f)

(command "line" p1 p3 p3 p4 "c") )

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文件加载,然后通过“工具/宏/宏”菜单项执行,或者在菜单项和自定义的工具栏按钮中执行,如果你的用户的基础知

AutoLISP-程序创建过程

AutoCAD开发VisualLISP程序 本节通过一个简单的实例来讲述LISP程序的创建过程,介绍编制LISP程序的一些基本步骤,以及LISP程序在AutoCAD中的加载和运行的方法。 首先来创建一个最简单的LISP程序—-“Hello.lsp”,在AutoCAD2002中加载并运行该程序,将会在命令行出现-“Hello,VisualLISP!”。 VisualLISP与AutoCAD的通信 用户可以直接在AutoCAD命令行中键入AutoLISP表达式。AutoCAD通过括号来确认AutoLISP表达式。AutoCAD每当发现一个左括号,就确认为AutoLISP表达式,并由AutoLISP求表达式的值后返回AutoCAD,AutoCAD使用返回结果并继续进行其他工作。 注意在AutoLISP表达式中,左、右括号必须配对,否则AutoCAD将给出提示符n>,n表示右括号丢失数目。 此外,在AutoCAD中调用并执行AutoLISP程序。在AutoLISP程序中采用COMMAND函数来与AutoCAD命令程序处理器通信,COMMAND从AutoLISP获得命令并将其传给AutoCAD。 实例:最简单的LISP程序——“Hello.lsp” Step1创建新文件 (1)运行AutoCAD2002系统,以“acadiso.dwt”为样板创建图形文件,并调用“vlisp”命令进入VisualLISP环境。

(2)单击“Standard(标准)”工具栏中的按钮,新建一个LISP文件。Step2输入代码并保存文件 (1)在编辑窗口中输入源文件“Hello.lsp”的代码。程序清单如下:;;;* Hello.lsp – Visual LISP文件实例 (prompt "Pick point:") ;指定运行时的提示信息 (setq ipt (getpoint)) ;在屏幕上指定一点并将其坐标值赋予变量“ipt” (setq hgt 15) ;给变量“hgt”赋值 (Command "_.TEXT" "_S" "STANDARD" ipt hgt 0 "Hello, Visual LISP!"); 调用“Commnad”函数与AutoCAD进行通信 (2)单击“Standard(标准)”工具栏中的按钮,以“Hello.lsp”为名保存该文件。 Step3运行LISP程序 (1)确认编辑窗口处于前台状态,选择菜单【Tools(工具)】→【LoadTextinEditor(加载编辑器中的文字)】,则该程序被加载并运行。系统将返回AutoCAD窗口,并提示用户选择一点,并以指定点为基点来绘制文字。结果如图36-4所示。 (2)如果用户退出VisualLISP环境并返回AutoCAD系统窗口,则需要对该程序进行加载后,才能运行。选择菜单【Tools(工具)】→【LoadAppcation…(加载应用程序)】,弹出“Load/UnloadApplications(加载/卸载应用程序)”对话框,如图

AutoCAD二次开发实验一

实验一 ObjectARX .NET托管开发包的使用 一,主要内容 1、下载安装ObjectARX .NET托管开发包 2、创建AutoCAD命令 3、创建自定义用户菜单 4、创建自定义用户工具条 5、创建用户自定义窗体 二,主要步骤 1,下载安装ObjectARX 不同的ACAD版本用不同的开发包及开发环境 ACAD2000~ACAD2002 : VC++ 6.0 ACAD2004~ACAD2006 : https://www.360docs.net/doc/d715307953.html, 2002 ACAD2007~ACAD2009 : https://www.360docs.net/doc/d715307953.html, 2005 ACAD2010~ACAD2011 : https://www.360docs.net/doc/d715307953.html, 2008 ACAD2012~ : https://www.360docs.net/doc/d715307953.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.360docs.net/doc/d715307953.html, 2012中建项目HelloWorld 采用.NET托管API →从“项目类型”列表中选择第二个“Visual C#”,从模板中选择“类库”,输入项目名称“HelloWorld” →.单击“确定”按钮 如果弹出如下对话框说明没安装正确,可以手动加载托管DLL →从ObjectARX安装目录下加载acmgd.dll和acdbmgd.dll →使用.NET对象浏览器查看 AcMgd.dll--AutoCAD .NET托管类

LISP函数大全

AutoLisp函数 一、数学运算功能函数 1.l(十数值数值…)返回:累计实数或整数数值 1.2(一数值数值…)返回:差值 1.3(* 数值数值…)返回:所有数值乘积 1.4(/ 数值数值…)返回:第一个数值除以第二个以后数值的商 1.5(l十数值)返回:数值十l l、 6(1—数值)返回:数值一l l.7(abs 数值)返回:数值的绝对值 1.8(atan 数值)返回:反正切值 1.9(cos 角度)返回:角度的余弦值,角度值为弧度 1.10(exp 数值)返回:数值的指数 1.11(expt 底数指数)返回:底数的指数值 1.12(fix 数值)返回:将数值转换为整数值 1.14(gcd 数值1 数值2)返回:两数值的最大公因数 1.15(log 数值)返回:数值的自然对数值 1.16(max 数值数值…)返回:数值中的最大值 1.17(min 数值数值…)返回:数值中的最小值 1.18 pi 常数∏,其值约为3.1415926 1.19(rem 数值 1数值 2)返回:M数值的相除的余数 l.20(sin 角度)返回:角度的正旋值,角度值为弧度 1.21(sqrt 数值)返回:数值的平方根 二、检验与逻辑运算功能函数 2.l(= 表达式1 表达式2)比较表达式1就是否等于式2,适用数值及字符串 2.2 (/= 表达式1 表达式2)比较表达式1就是否大于等于表达式2 2.3(<表达式1 表达式2) 比较表达式1就是否<小于表达式2 2.4(<= 表达式1 表达式2)比较表达式1就是否<一小于等于表达式2 2.5(>表达式1 表达式2) 比较表达式1就是否>大于表达式2 2.6(>= 表达式1 表达式2) 比较表达式1就是否大于等于表达式2 2.7 (~数值)返回:数值的位 not值,(1的补码) 2.8 (and 表达式1 表达式2…)返回:逻辑and的结果 2.9(boole 函数整数整数…)返回:位式布尔运算AutoLisp函数2/8 2.10(eq 表达式1 表达式2)比较表达式1与表达式2就是否相同,适用列表比较(实际 相同) 2.11(equal 表达式 1表达式 2[差量])比较表达式 1与表达式 2就是否相同,差量可省 略(内容相同) 三、转换运算功能函数 3.l(angtof 字符串[模式])返回:角度值的字符串转成实数 3.2(angtos 角度[模式[精度]])返回:角度转成的字符串值 3.3(atof 字符串)返回:字符串转成实数值 3.4 (atoi 字符串)返回:字符串转成整数值

基于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对象模型之上的一个标准通信协议,它允许对象之间通过一定的接口相互通信。

Autolisp基础教程

Autolisp基础教程 单元一:AutoLISP主角潇洒登场 一. AutoLISP 是何方神圣? 1、AutoLISP是AutoCAD的最佳拍檔! 2、AutoLISP内含于AutoCAD软件内,不用另外花钱买! 3、AutoLISP是强化AutoCAD最好、最直接的『程序语言』! 4、AutoLISP易学、易用,即使不会程序设计的AutoCAD使用者,都能在最短的时间内,写出令人惊讶、赞叹的功能! 若说AutoLISP的出现,是替AutoCAD 创造一片天的『最大功臣』,实不为过一点也不夸张! 5、AutoLISP希望您去学习它、改善它、发挥它、享受它.真的!它的威力、魅力无穷! 二. AutoLISP 程序语言的特质分析: 学习AutoLISP是非常容易的,对初学者而言,即使没有学习过任何的程序语言,都能很快的上手,写出精彩漂亮的AutoLISP程序! 语法简单:不用特殊的变量宣告,非常富有弹性,比起其它的程序语言,它的语法可说是非常简单而有其独特的风格! 功能函数强大:除一般性的功能函数外,又拥有为数不少控制配合AutoCAD的特殊函数,再加上AutoLISP可直接呼叫执行所有AutoCAD的指令,以及掌握运用所有的AutoCAD系统变量,功能之强大令人欣喜不已! 撰写的环境不挑剔:只要是一般的文书编辑软件都适用! 如:Windows的记事本、PE2、PE3、DW3、书中仙、汉书、EDIT....等 直译式程序:不用再作编译,『即写即测、即测即用』,马上可以在AutoCAD中响应效果,马上就有成就感! 横跨各作业平台:悠然自得,虽然AutoCAD有DOS、Windows版本之分但是AutoLISP却可在不改写的原貌下,加载与执行! 三.撰写AutoLISP 的动机? 1、欲强化AutoCAD 原有指令时. 2、欲创造更有用的AutoCAD 新指令. 3、欲简化繁琐的环境设定或绘图步骤时. 4、欲处理参数式绘图时. 5、欲做图面资料读文件、写文件. 6、欲做AutoCAD 演示文稿展示时. 7、欲达到真正灵活掌控AutoCAD 时. 8、欲提升自己跨上AutoCAD 高手列车时. 四.AutoLISP 的效益评估? 1. 对公司负责人或设计主管而言: A. 也许某员工或干部花了20个小时撰写一个AutoLISP程序,表面上,这将近三天的时间,他连一张图都没有画,甚至可能偶有发呆、沉思,若此程序一天可以替公司绘图部门节省1小时绘图时间,那算一算,只要20天就抵销开发成本,而20天以后都是赚的,『用的愈久,省的愈多』! B. 若员工皆有此动力,在不影响正常工作,『鼓励』都来不及,那有『压抑』的道理,甚至还要派遣优秀人员出去受训,学习更好的设计技巧与创意呢?! C. 千万不要因为您的不懂或压抑,SHOW您的权威与POWER,如此,不但对员工造成打击,甚至您可能成为阻碍了公司计算机化进步的罪魁祸首 D. 当然,若要撰写的程序很多,内部设计人员的程序功力距离太远,达成需求的时间反而变得遥遥无期,那倒不如求助于市面上已有的相关AutoCAD 支持软件。

AUTO LISP函数参考5

AUTO LISP函数参考 4实体数据函数 下列函数可让用户检索和修改定义实体的数据,所有函数都用实体名指定要操作的实体. 4.1(entdel<实体名>) 如果由<实体名>指定的实体在当前图中,它就被删掉,如果在这次编辑中该实体已被删除,那么它将被重新恢复出来(从当前图中).退出图形编辑程序时,被删除的实体便从图中 彻底清除掉了,所以ENTDEL只能在删除实体的那次编辑过程中使实体再恢复.ENTDEL只对 主实体进行操作.对属性和多义线的顶点是不能脱离其双亲实体而予删除的(可使用COMM AND函数执行ATTEDIT或PEDIT命令来达到这一目的). 例如: (setq e1(entnext));置E1为图中第一个实体的名 (entdel e1);删去实体E1 (entdel e1);不删除(恢复)已被删去的实体E1 4.2(entget<实体名>) 从数据库中检索到名为<实体名>的实体,并以表形式返回,此表包含实体的定义数据表的结果以LISP的关联表形式编制,用ASSOC函数可以容易地从中检索每一项.表中的对象是用AutoCAD的DXF组码形式定义的,它们是为实体数据的每个部分准备的.例如,用下列命令序列画线,然后再检索此线: 对下面的例子,我们假定: .当前层是"0", .当前线型是"CONTINUOUS"(缺省值), .当前Z向高度是零(缺省值), .实体标号功能被关闭,而且 .FLATLAND系统变量值为零. 假设用下列命令画一条线: Command:LINE From point:1,2 To point:6,6 To point:RETURN 然后可以用下述命令为线检索实体数据: Command:(setq a(entget(entlast))) 假定系统变量FLATLAND为零(即要求3D点).这样,将把A置为下表(为了可读,作了缩进排列): ((-1.) (0."LINE");Entity type (8."0");Layer (101.02.00.0);Start point (116.06.00.0);End point ) 表的开头-1项包含这个所代表的实体名.下面描述的ENTMOD函数将用这种表来识别要修改的实体. 表示某一值的点对表可以很容易地用ASSOC提取,再用CDR分离出它们的值.实体中各部分的编码是DXF所用的那些编码,在AutoCAD参考手册的附录C中有描述.和DXF一样,实体题头项(实体的颜色和线型,属性跟随标志,厚度,及实体标号)只有在不为缺省值时才被输出. 和DXF不同的是,任选的实体定义字段不管是否和它们的缺省值相等都将被输出.这样做的

autocad lisp教程

Lisp教程 一.Lisp基础知识 二.对话框基础 一.基本知识 第1节 -------------------------------------------------------------------------------- 基本知识 AutoLISP是一种针对扩充及自订AutoCAD函数机能而产生,以LISP为基础的程序设计语言.LISP本身于50

目的是令使用者充份利用AutoCAD进行开发,直接增加及修改AutoCAD指令. AutoLisp语言建基于普通的LISP语言上,并扩充了许多适用于CAD的特殊功能而形成. 是一种能以直译方式(不须先行编译)亦可于AutoCAD内部执行的直译性程序语言. 程序容易学习及撰写,程序即使出错亦不会对操作系统(如DOS,WINDOWS)有不良影响. 数据及程序均统一以串行(List)结构表示. 可直接调用几乎全部的AutoCAD命令. 既具备一般高级语言的基本结构和功能,亦有一般高级语言没有的强大图形处理能力. 内建于AutoCAD应用程序,不须另行购买;亦不须使用特定的编辑器或开发环境. 可配合AutoCAD提供的PDB,建立DCL(Dialog Control Language)文件创建对话框. 缺点: 执行速度较ObjectArx(旧称ARX,以C或C++程序开发,取代以前的ADS)程序慢;原程序不易保护;对低阶的硬件数据不易存取. 第2节 -------------------------------------------------------------------------------- 函数(Function) 在AutoLISP程序语言中所有的成份都是以函数的形式出现,AutoLISP程序就是顺序执行连串的函数.函数的运行过程就是对函数的求值(结果)过程;函数的基本语法如下: (函数名称参数1 参数2....) e.g. (PRINC "AutoLISP Programming") 每一个完整的函数必须包在一对小括号( )内,左边为开括号,右边为关括号;如有若干数量的开括号,则一定有同等数量的关括号对应. 左边开括号后紧随函数名称. 函数名称与参数之间,或参数与参数之间须最少留一个空格. 函数可有一个或多个参数(也可能没有参数),视该函数而定. 函数名称不分大小写,即大小写字母视为相同. 第3节 -------------------------------------------------------------------------------- 数据型态(Data Type) 整数(INT) 没有小数字的数值,32位有号数,范围从+2,147,483,647到-2,147,483,648 实数(REAL) 带小数字的数值,以倍精度浮点格式储存(最少14位小数) e.g. 12.5 当数值在1与-1之间时,必须加上前导零 e.g. 0.05 可以科学记号表示: 在E或e后加上次方值 e.g. 4.1e-6 字符串(STR) 一般文字,其前后必须加上双引号" e.g. "AutoCAD" 控制字符或脱逸码必须为小写,且须在字符前加上反斜线\ e.g. "\AutoCAD" 像素名称(ENAME) 是指定给图文件内对象的指针(Pointer,为16进位的数字卷标) e.g. 像素名称在图文件内是唯一的,不会重复 对象的像素名称只在目前作业中有效,再开启图档时,会指定新的像素名称予该对象 档案(FILE) 以OPEN函数所开启档案的指针,作为其它函数(读写该档案)的自变量 选集(PICKSET)

用AutoLISP程序提高绘图效率的几个实例

2007.12 科技广场 254

工程中经常要绘制各种弹簧和螺纹连接件,在AutoCAD中没有专门绘制弹簧和螺纹的命令,弹簧和螺纹在AutoCAD中都可用平面图形通过相应螺旋线拉伸而成,所以绘制螺旋线就是解决问题的关键。如果用常规的3dpoly命令绘制三维螺旋线,需要输入大量精确数据,才能一点一点地画出螺旋线,做法非常麻烦。现在提供AutoLISP程序,即可解决绘制螺旋线的问题。然后通过相应平面图形的拉伸,就可以完成弹簧、螺纹等零件的绘制。 根据圆台螺旋线的形成原理(一动点M绕圆台的母线AB作等速直线运动,而该母线AB又绕圆台的轴线O1O2作等角速旋转时,点M的运动轨迹即为圆台的螺旋线,如图二所示。圆柱螺旋线是圆台螺旋线的特例,故可通过圆台螺旋线程序做相应的变动,即可得到),动点M(x,y,z)的参数方程如下: 图二园台螺旋线 X=[r0+hg *α/(2π)]*cosα Y=[r0+hg *α/(2π)] *sinα Z=±vg *α/(2π) 其中,r0为圆台下面的半径,α为螺旋线角,vg为导程(单线螺旋线螺距(弹簧的节距)等于导程),hg为点M沿水平半径方向上增加的距离(hg=|(r1-r0)m|求得,m为螺旋线的圈数)。 下面提供圆台螺旋线的AutoLISP程序清单: (defun c:luoxc(/) (setq b1 (getpoint" 指定基点:")) (setq r1 (getreal "指定初始半径:")) (setq disp (getreal "指定节距:")) (setq angtg (getreal "输入锥形角:")) (setq m (getint"输入圈数:")) (setq n (getint"输入每圈细化段数<36>:")) (cond ((null n )(setq n 36))) (setq delta (/ (* 2.0 pi ) n)) (setq j (/ disp n)) (setq bb (caddr b1)) (setq tg (*(/ angtg 180) pi)) (setq ang 0) (setq k 0) (command "ucs" "o" b1) (command "3dpoly" (list r1 0 0)) (repeat (* m n) (setq k(+ k 1)) (setq ang(+ delta ang)) (setq r (- r1 (* (+ 0(* j k))(/ (sin tg )(costg))))) (setq pt2 (list (* r(cos ang))(* r(sin ang))(+ 0(* j k)))) (command pt2) ) (command "") ) 根据圆台螺旋线的形成原理,如果圆锥角为0度时,即可形成圆柱螺旋线。圆柱螺旋线程序清单如下: (defun c:luoxc(/) (setq b1 (getpoint" 指定基点:")) (setq r (getreal "指定初始半径:")) (setq vg (getreal "指定节距:")) (setq m (getint"输入圈数:")) (setq n (getint"输入每圈细化段数<36>:")) (cond ((null n )(setq n 36))) (setq delta (/ (* 2.0 pi ) n)) (setq j (/ disp n)) (setq bb (caddr b1)) (setq ang 0) (setq k 0) (command "ucs" "o" b1) (command "3dpoly" (list r 0 0)) 255

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.360docs.net/doc/d715307953.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 的主窗口的访问。

AutoLISP 基础——认识自定义函数

AutoLISP基础——认识自定义函数 (本文由LL_J?认识自定义函数?和?Autolisp编程心得?两篇巨著合成,并融入了其他人的一些经验,以快速打通你的任督二脉——自贡黄明儒注) 一、初识Lisp 在AutoCad命令输入(+ 1 2 3),回车返回6,如下 命令: (+ 1 2 3) 6 恭喜你,你已经会写Lisp程序了。这里,我们用到了一个系统定义的函数+,这个函数的作用就是对后面的数字求和。 上式一对英文括号组成的表达式,称之为表,Lisp语言也称为表的语言。表有两种形式,一种是?口袋式?表;一种是?函数式?表。前者如’(0 0)表示一个2维点,前面加’表示此表不求值。如果不加‘,则通常是认为是?函数式?表。?函数式?表如下: ①结构特点:左括号(紧跟函数,函数所需要的参数,右括号)结束。 ②函数是指:系统定义的函数、自定义的函数、匿名函数lambda。如 ((lambda(x y z) (* x y z)) 3 4 5)是合理的。 ③参数可以是:数字(整数、实数)、字符串、T、nil、表(如果此 表是表、函数,就构成了复杂表,这就是lisp程序)、函数。 ④表可以作为函数的参数。如(+ 1 (- 5 2) 3)中,表(- 5 2)就作为+函数 的参数。 ⑤表的返回值也可以传递给其它变量,如(setq x (+ 1 2 3)) ⑥接受输入参数,如(- 5 2)中,-函数接受5和2两个参数。 二、什么是函数 函数一词最早来源于数学,维基百科这样说:函数是将唯一的输出值赋予每一输入的"法则"以及该输出值与对应输入值的集合。 在计算机领域,对函数并没有一个完整的定义,百度百科有这样一句话:"许多程序设计语言中,可以将一段经常需要使用的代码封装起来,在需要使用时可以直接调用,所以,函数也可以说是许多代码的集合,这就是程序中的函数。 综合以上描述,我们可以看到"函数"的基本组成: 输入值:一般称为参数; 表达式:函数体,是代码的集合,共同组成上面所说的"法则";

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的设计效率。

AUTOLISP详细讲解

AutoLISP详细讲解 关于AutoLISP AutoLISP是由Autodesk公司开发的一种LISP程序语言(LISP是List Processor的缩写)。第一篇关于LISP的参考文献是由John McCarthy在1960年4月的《ACM通讯》中发表的。 除了FORTRAN和COBOL,大多数在六十年代早期开发出来的语言都过时了,可是LISP 却生下来,并且已经成为人工智能(AI)的首选程序序言。AutoLISP解释程序位于AutoCAD 软件包中,然而AutoCAD R2.17及更低版本中并不包含AutoLISP解释程序,这样,只有通过AutoCADR2.18及更高版本才可以使用AutoLISP语言。 AutoCAD软件包中包含大多数用于产生图形的命令,但仍有某些命令末被提供。例如,AutoCAD中没有在图形文本对象内绘制矩形及作全局改变的命令。通过AutoLISP,你可以使用AutoLISP程序语言编制能够在图形文本对象内绘制矩形或作全局选择性改变的程序。事实上,可以用AutoLISP编制任何程序,或把它嵌入到菜单中,这样定制你的系统会取得更高的效率。 现在,已经有数以百计的第三方软件开发人员使用AutoLISP语言编制各种应用程序软件包,例如,本文作者开发了一个名为SMLayout的软件包,用它可以产生各种复杂几何图形的平面布局图,这些几何图形包括管道的交叉部、过渡都、圆柱、弯管接头、圆锥以及罐顶。目前社会上非常需要AutoLISP程序员为应用软件及客户菜单的开发提供顾问。 在本章中,我们假定读者已经熟悉了AutoCAD命令及AutoCAD的系统变量。但是,在开始学习AutoLISP时,却并不需要你是一位AutoCAD或编程专家。同时,本章还假定读者并无编程方面的知识。如果你熟悉任何一种编程语言,那么学习AutoLISP就会很容易。对各种函数的评细探讨以及对例题的逐步讲解会使你学起来很有兴趣。本章讨论常用的AutoLISP函数以及它们S程序编制中的应用。对于本章中未涉及的函数,请参阅Autodesk 公司的《AutoLISP程序员参考手册》。AutoLISP对硬件没有任何特殊要求。如果系统能够运行AutoCAD,那么同样也可以运行AutoLISP。AutoLISP程序可以使用任何文本编辑器进行编制。 数学运算 任何编程语言都提供数学函数。在AutoLISP中,同样提供了编程以及数学计算所需的大部分数学函数,你可以使用AutoLISP对数字进行加、减、乘、除运算,还可以得到以弧度表示的角度的正弦值、余弦值及反正切值等。使用AutoLISP还可以进行许多其他计算。这一节主要讨论AutoLISP程序语言支持的常用数学函数。 1.加法 格式(+num1num2num3…) 此函数(+)计算加号(+)右边所有数字的和(+num1num2num3…)。这些数字可以是整数或实数。如果均为整数,则和为整数;如果均为实数,则和为实数。但是如果既有整数又有实数,则和为实数。如下所示,在前两个例子中,所有数字均为整数,所以结果是

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];

autolisp多段线处理函数集

;;164.1 [功能] 曲线是否封闭 ;;164.2 [功能]使多段线封闭 ;;164.3 [功能] 多段线端点列表 ;;164.4 [功能] 矩形中点坐标 ;;164.5 [功能] 参数param处的切线方向的角度;;164.6 [功能] 参数param处的法线方向的角度;;164.7 [功能] 曲线一点的切线方向的角度;;164.8 [功能] 曲线一点的法线方向的角度;;164.9 [功能] 去除多段线重点 ;;164.10 [功能] 判断点是否在曲线上 ;;164.11 [功能] 曲线长度 ;;164.12 [功能] 多段线子段数量 ;;164.13 [功能] 曲线中点 ;;164.14 [功能] 曲线一点的参数param ;;164.15 [功能] 参数param处的坐标 ;;164.16 [功能] 多段线第n子段的起点坐标;;164.17 [功能] 多段线第n子段的终点坐标;;164.18 [功能] 多段线所点击子段的两端点列表;;164.19 [功能] 多段线所点击点最近的一个顶点;;164.20 [功能] 多段线所点击子段param(索引) ;;164.21 [功能] 多段线所点击子段的起点坐标;;164.22 [功能] 多段线所点击子段的终点坐标

;;164.23 [功能] 多段线所击点离起点近 ;;164.24 [功能] 多段线所点击子段否是直线(返回nil是弧) ;;164.25 [功能] 求多段线上的弧段(圆或圆弧也有效)的圆心by caoyin ;;164.26 [功能] 求多段线上的弧段(圆或圆弧也有效)的圆心 ;;164.27 [功能] 判断多段线是否有圆弧(凸度/=0)的子段 ;;164.28 [功能] 判断多段线是否有圆弧(凸度/=0)的子段 ;;164.29 [功能] 连接线、弧成多段线 ;;164.30 [功能] 构造矩形by highflybird ;;164.31 [功能] 点表生成多段线 ;;164.32 [功能] 3D多段线 ;;164.33 [功能] 多段线反向(起点反成终点) byzml84 ;;164.34 [功能] 多段线删除顶点 ;;164.35 [功能] 多段线增加顶点 ;;164.36 [功能] 多段线修改顶点 ;;164.37 [功能] 多段线拷贝子段 ;;164.38 [功能] 修改多段线子段 ;;164.39 [功能] 修改多段线子段为直线 ;;164.40 [功能] 点在封闭多段线内返回T,其余nil By 狂刀 ;;164.41 [功能] 点在封闭多段线内返回T,其余nil By SmcTools ;;164.42 [功能] 判断点在封闭曲线内外,自交曲线不适用By Gu_xl ;;164.43 [功能] 点在封闭多段线内返回T;线上0;外nil ;;164.44 [功能] 多段线弧段全改为直线段

相关文档
最新文档