找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4892|回复: 17

[LISP程序]:lisp自动转成arx,全局变量怎么没了??

[复制链接]
发表于 2002-7-2 22:26:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
例如lisp源程序:
(defun aa()
(setq ab 123)
)
用vlide转成arx后
command:aa返回123
但command:!aa返回nil,究竟是为什么??
对于arx我一窍不通,而我编的许多lisp不想公开源码,我
选择编译成arx就因为对于别人使用是没有“附加条件”

请各位高手、高手、高高手help

谢谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2002-7-3 15:42:01 | 显示全部楼层
LISP 能转成ARX吗,是VLX吧。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8个

财富等级: 恭喜发财

发表于 2002-7-3 20:02:53 | 显示全部楼层
R14的可以~不过是假的而已
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-7-4 00:18:33 | 显示全部楼层
为什么说是假的??
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-7-4 00:59:08 | 显示全部楼层
最初由 tjyly 发布
[B]为什么说是假的?? [/B]


LISP编译不管扩展名ARX,VLX他们都仅仅是可执行的二进制代码,我们说的ARX开发,不在于扩展名,而是开发的环境,使用ACAD对象数据库的效率,这些使用ARX SDK库可以直接操作ACAD对象数据库的底层,或者可以说ACAD自身也是用ARX SDK开发的。

所以大家不要把眼光看在扩展名上。不管VLISP如何编译,它对ACAD对象数据库的操作都仅仅是表面上,最终都要通过ARX库来实现对对象数据库的操作。

编译后仅仅是执行速度、保密性提高了而已。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-7-4 12:43:16 | 显示全部楼层
为什么xd不回答我真正的问题,全局变量怎么是nil???????????
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-7-6 00:35:58 | 显示全部楼层
why!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!why!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-7-6 11:54:24 | 显示全部楼层

Re: [LISP程序]:lisp自动转成arx,全局变量怎么没了??

最初由 tjyly 发布
[B]例如lisp源程序:
(defun aa()
(setq ab 123)
)
用vlide转成arx后
command:aa返回123
但command:!aa返回nil,究竟是为什么??
对于arx我一窍不通,而我编的许多lisp不想公开源码,我
选择编译成arx就因为对?.. [/B]


变量是ab ,查询的是 !aa  ,当然是 nil 了.
但愿问题不是这么简单.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-7-6 11:59:14 | 显示全部楼层
刚才忘写了,请问怎么转成 arx 啊,这个不用保密吧,呵呵!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-7-6 23:06:10 | 显示全部楼层
先回答maxbug的问题,你得先安装vlisp,在command:vlide或加载vilde.arx,在新窗口中
file--->make....---->new...一共八个步骤。ok

是我笔误不是!aa而是!ab,这个问题困扰我许久了,希望xd告诉我!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-7-8 14:48:02 | 显示全部楼层

全局变量的限制

用VL编译的ARX,可以这样说:基本上是ARX的一个子集。在ARX里,作为一个标准的C++程序,它的全局变量同样受到该程序内存空间的限制,所谓的全局,也就是在本程序内部各函数之间实现全局,无法直接在各个ARX程序之间实现“全局”目标的。VL14为了解决这个问题,通过2个变量输出函数来实现:AUTOLISP环境中转。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-7-8 19:30:35 | 显示全部楼层
在VLISP中,对于每个打开的文档,都有唯一对应的“变量空间”,在一个文档下的变量只在该文档的变量空间下可见。还有一种变量空间是独立变量空间,在编译VLX时候,如果设置,那么即使在同一个文档下,变量的可见性也仅仅是属于这个程序范围。

所以,对于编译的VLX,你在LISP环境里面查询变量,肯定是不可见的啊。

如果在一个文档下,你需要全局变量,那么一个方法是不要编译成“独立的变量空间”,那么在该文档下的所有VLX程序都可以共享全局变量。

如果编译成独立变量空间的话,那么即使在同一个文档下,不同的VLX程序要共享全局变量,那么需要在定义变量的VLX内,用VLX-DOC-Import 函数,把全局变量定义成在其他独立变量空间有效。

在引用全局变量的VLX程序中,使用函数VL-DOC-Export,把变量传送给其他图档变量空间。

详细情况,看看VLISP的联机帮助关于这两个函数的用法和变量空间的概念。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-7-8 22:15:15 | 显示全部楼层
终于回答了,但有一点明白,又有许多不明白,能不能具体怎么“不要编译成《独立的
变量空间》”
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 814个

财富等级: 财运亨通

发表于 2002-7-8 22:19:31 | 显示全部楼层
在AutoLISP, Visual LISP和ObjectARX 之间传递函数和变量
提要: 如何在Visual LISP, AutoLISP, ARX程序之间传递变量和函数
   
  产品 版本 平台
AutoCAD R14/13 Win95中文版, WinNT中文版
     
关联文档  
文档编号: 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函数。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-7-9 21:51:54 | 显示全部楼层
哈哈!!一切OK,一百二十万分得感谢Casd的精彩回答!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-5-29 15:45 , Processed in 0.215010 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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