明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2656|回复: 3

救命:问一个非常奇怪的问题!

[复制链接]
发表于 2002-7-12 09:52:00 | 显示全部楼层 |阅读模式
AutoCADR14下用Visual Lisp for R14开发,加载程序时老出现空函数的错误提示,在Cad2000下,该函数是正确的,以下面函数为例:
(defun 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)
)
在R14下错误提示如下:
(mytest1)
error: null function
(MYTEST1)
*Cancel*
请教大侠们这是怎么回事呀?(在2000下该段程序一点问题都没有!!!)
发表于 2002-7-12 13:36:00 | 显示全部楼层

那就用AutoCAD2000吧...

发表于 2002-7-13 07:51:00 | 显示全部楼层

注册机问题

autocad2002注册机哪里有下的,我快要急疯了!
发表于 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函数。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 15:28 , Processed in 0.251852 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表