- 积分
- 15341
- 明经币
- 个
- 注册时间
- 2002-2-4
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
发表于 2002-7-13 08:19:00
|
显示全部楼层
但应该是这样,在vlide(R14)环境下:...
手上没有R14版供测试,但应该是这样,在vlide(R14)环境下:
(defun c:mytest1() ;修改
(setq angle1 (/ pi 3))
(DrawSpiral1 2290 1602 1 angle1 300 0 0)
)
(defun DrawSpiral1( Diameter Height StartAngle SpiralAngle PointsPerCircle tmpcanshu1 tmpcanshu2 )
(setq tmpangle 0)
)
or or or or or or or 不修改,但要先存盘--如:mytest1.lsp,再用(load “mytest1”)
以下转贴自xd论坛:
在AutoLISP, Visual LISP和ObjectARX 之间传递函数和变量
提要: 如何在Visual LISP, AutoLISP, ARX程序之间传递变量和函数
产品 版本 平台
AutoCAD R14/13 Win95中文版, WinNT中文版 ;;;;注意:不包括autocad 2000以上
关联文文件
文档编号: CTD1701 修订版本: A
文档创建日期:Sep.9,1998 最近修改日期:
我们知道,AutoLISP可定义两种函数,一种是C:函数,例如(defun C:mydefun( / )), 函数mydefun可直接在命令行下运行,另一种“无C:函数”,例如(defun mydefun( / )), 函数mydefun则必须在AutoLISP语句中调用才能运行。
当这两种函数,被 VLISP编译成ARX程序后,会产生不同的结果。C:函数一切正常,无C:函数则出现以下情况:
在AutoCAD中,用AutoLISP语句调用,出现无此函数的错误信息。
若作为外部引用函数被别的程序调用,也会出现无此函数的错误信息。
在当前程序内部调用该函数,完全正常。
另外,对于程序中涉及的全局变量,也只在该程序内部有效,而失去了“全局”的作用,这是为什么呢?如何在Visual LISP, AutoLISP, ARX程序之间传递变量和函数呢?这正是本文要讨论的话题。
三种程序,三个不同的IDE
对AutoCAD来说,AutoLISP,Visual LISP以及从Visual LISP编译成的ARX程序,是三种风格和执行效率完全不同的代码,它们各自占用独立的地址内存空间,当每个ARX程序(以下的ARX程序,均是指从Visual LISP编译成的ARX程序)被AutoCAD调用时,就创建了一个新的独立的内存空间。而Visual LISP本身就是一个ARX程序(Vlide.arx),Visual LISP的程序对AutoCAD来说,实际上也属于ARX环境,占用Vlide.arx程序的地址空间。内嵌于AutoCAD的AutoLISP程序当然只与AutoCAD本身相关。
因为三种程序分别属于不同的IDE,所以如果想让应用程序能够识别出不同环境下的变量和函数,必须把变量“拷贝”到目标环境中去,而对函数来讲,则要在目标环境下创建一个切入函数的入口点。
Visual LISP的扩展函数库提供了相应的函数,能够在应用程序之间传递函数和变量,AutoLISP本身则没有这样的功能。]
在AutoLISP和Visual LISP程序之间以及AutoLISP与ARX之间传递函数和变量的方法是完全一样的。
变数传递
Visual LISP中,与变量传递有关的函数有两个,一个是输入,一个是输出:
(Vlisp-import-symbol ‘myvar)
该函数在Visual LISP环境中创建一个变量myvar,并把变量的值设置为AutoLISP环境下同一变量myvar的值。该函数返回变量myvar的值。
(Vlisp-export-symbol ‘myvar)
该函数从Visual LISP环境复制一个变量myvar和它的值到AutoLISP环境。
需要注意的是:
这两个函数不能直接使变量在Visual LISP程序和ARX程序之间传递,必须通过AutoLISP 环境。例如,如果想把变量从ARX程序传递到Visaul LISP,就必须先在ARX程序中把该变量输出到AutoLISP,再在Visual LISP中从AutoLISP输入该变量。
这两个函数,一次只能传递一个变量,没有其它别的方法能够改变。
如果想使从AutoLISP传入的变量在Visual LISP中作为局部变量使用,Vlisp-import-symbol必须在一个函数内部引用,传递的变量则必须包含在函数的局部参数表内,例如:
(defun foo (/ *a*)
(Vlisp-import-symbol ‘*a*)
(princ *a*)
)
这两个函数,并没有在AutoLISP环境下和Visual LISP环境之间创建任何链接,如果已被传递的某一变量的值,在其中一个环境中发生了改变,另一环境中的该变量的拷贝,并不能跟着改变,只能重新输入或输出,才能得到更新的变量值。
函数传递和外部函数调用
Visual LISP环境中,调用外部函数,需要经过两步:
在外部程序中,对将被调用的函数做出声明,使之能够被别的程序调用。
在将要调用外部函数的程序中,注册该外部函数的入口点。例如,若要调用ARX程序中定义的函数,需要注册的入口点包括ARX的程序名,和程序中已被声明的外部函数列表。
AutoCAD调用任何一个ARX程序时,将自动在AutoCAD地址空间注册程序入口点,因此在AutoLISP中可以直接调用ARX程序中的函数,而不做任何处理。只有Visual LISP的应用程序或Visual LISP编译的ARX程序调用外部函数时,才需要在程序中注册外部函数的入口点。
注意:Visual LISP没有提供任何工具,能够把AutoLISP定义的函数传递到Visual LISP中,这和变量传递是不同的。
函数声明
Vlisp提供了两种声明外部函数的方式,一是直接在命令行运行的C:函数,第二种就是vl-acad-defun函数。
⑴ 命令行函数--隐式传递
Vlisp把C:函数直接传递到AutoCAD,这种方式可称之为隐式传递。在vlsip环境下,设置系统变量*C-Colon-Export*为空(nil),关闭隐式传递,这时所有的C:函数都无法自动传递到AutoCAD或AutoLISP,而与所有无C:函数一样,需要下面的方式声明才可。
⑵ vl-acad-defun函数-显示传递。
(vl-acad-defun ‘function)
vl-acad-defun带有一个参数,即所要声明的函数名,引用一次vl-acad-defun函数,只能声明一个函数。例如:
(defun c:foo ()
(vl-acad-defun ‘foo2)
)
(defun foo2 ()
(expr…)
(expr…)
)
如上例,函数foo2只有调用了函数C:foo才能被传递,这种方式实际上把一个函数做为变量处理,而给予用户更大的控制权。当然,还可以把声明函数放在定义函数(defun)之外,在程序调入时执行。
注意:声明函数只有在编译导航第七步时,打开“initialize in load time”开关才有效。
如果在Vlisp的编译导航第七步,打开“form the list automatically”开关,只有用函数(progma ‘((emport-to-ACAD函数名)))来声明,这是一个被Vlisp废弃的函数,下一版本将不再支持,因此Vlisp不推荐使用。
注册外部函数入口点
如上所说,在AutoLISP中可直接使用外部定义的函数,Vlisp环境才需要在当前程序中注册函数入口点。Vlisp提供了两种方式完成这个过程:Vlisp-import-exsubrs函数和外部XDF文件。这使得Vlisp程序不仅能够调用,Vlisp编译的ARX程序中的外部函数,还能调用其它Object ARX程序中的函数。
在Vlisp程序中使用Vlisp-import-exsubrs函数
(Vlisp-import-exsubrs ‘(“appname” “function1 name” “function2 name”…))
该函数返回应用程序名以及已被声明的函数表。
与XDF檔相比,Vlisp-import-exsurbs具有更大的灵活性,因为它是在调用外部函数的程序内部执行,便于调试。
外部定义函数文件(XDF文件)
XDF档是一个ASCII码文件,可以用文字处理器直接编写。与Vlisp-import-exsubs函数一样,XDF文件里记录了外部ARX程序名,及将被调用的外部函数名。它的格式与Vlisp根目录下arxload.xolf相同,具体如下:
( "14*" ;版本信息
("second" ;外部程序模块
from_second ;外部应用函数名
) )
这个文件要与当前Vlisp程序一同编译,以生成ARX程序。
Vlisp在安装根目录下,提供了一个程序:make-XDF.Lsp,选定所需的ARX档,能够自动生成标准的XDF檔。
将所需的ARX程序调入AutoCAD,又有了用于注册程序入口的XDF文件,在Vlisp中,就能调用外部ARX程序中的函数了。
只有在两种情况下,Vlisp才去解释执行XDF檔。
包含外部调用函数的ARX程序已经预先装入AutoCAD之后,启动Vlisp时
在Vlisp中,调用编译了XDF文件的ARX程序时
除此之外,Vlisp没有提供其它任何命令可以执行XDF檔。为保证Vlisp能够正确地识别XDF档,要注意以下几点:
XDF文件的文件名要与相关的ARX程序的文件名相同。
XDF文件的放置位置:
如果在Vlisp编译的ARX程序中调用外部函数,只需在编译导航第六步,包含相应的XDF档即可,对XDF文件的放置位置不做要求。
如果在Vlisp中调用外部函数,XDF文件或者与外部ARX程序所在路径相同,或者放置在Vlisp的根目录下。
注意:Vlisp编译ARX程序时,即使在编译导航中包含了XDF档,也需要手动把相关的外部ARX 程序调入AutoCAD,Vlisp并不会自动这么做。
外部定义的ADS函数
目前,Vlisp不能调用任何在ADS程序中定义的外部函数,ADS程序必须重编译为ADSRX程序,Vlisp才能为其中的外部函数创建必要的程序入口点,方法和上述一致, Vlisp才能调用外部ADS函数。 |
|