找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2256|回复: 7

[求助] [求助]:CAD内部是如何存储LISP全局变量的?

[复制链接]
发表于 2002-10-27 19:44:59 | 显示全部楼层 |阅读模式

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

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

×
不知道谁在这方面有没有心得,如何能求得当前CAD内部的所有LISP全局变量。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-10-27 19:52:59 | 显示全部楼层

Re: [求助]:CAD内部是如何存储LISP全局变量的?

最初由 hothua 发布
[B]不知道谁在这方面有没有心得,如何能求得当前CAD内部的所有LISP全局变量。 [/B]


只要你的函数定义变量的时候,不在开拓用/

如:

  1. [FONT=courier new]
  2.   (defun abc(x / v1 v2)
  3.       (setq v1 1
  4.                v2 2
  5.                v3 3
  6.       )
  7.      ..............
  8.   )
  9. [/FONT]


上面的V1,V2是局部变量,离开函数就不存在了。而V3是全局变量。

关于所有的全局变量符号名可以用函数: atoms-family 获得


  1. [FONT=courier new]
  2. 返回由当前已定义的符号组成的一个表
  3. (atoms-family format [symlist])

  4. 参数

  5. format

  6. 值为 0 或 1 的整数,它用于指定 atoms-family 函数返回符号名的格式:
  7. 0  以表的形式返回符号名
  8. 1  以字符串表的形式返回符号名

  9. symlist

  10. 用于指定用户想搜索的符号名的字符串表。

  11. 返回值

  12. 符号表。如果指定了 symlist,atoms-family 返回当前定义的指定符号,对那些没有定义的符号返回 nil。

  13. 样例

  14. 命令:(atoms-family 0)
  15. (BNS_PRE_SEL FITSTR2LEN C:AI_SPHERE ALERT DEFUN C:BEXTEND REM_GROUP

  16. B_RESTORE_SYSVARS BNS_CMD_EXIT LISPED FNSPLITL...

  17. 下列代码检验符号 CAR、CDR 和 XYZ 是否已被定义并将其以字符串表形式返回:

  18. 命令:(atoms-family 1 '("CAR" "CDR" "XYZ"))

  19. ("CAR" "CDR" nil)

  20. 这个返回的字符串表表明符号 XYZ 没有被定义。
  21. [/FONT]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2002-10-28 01:46:27 | 显示全部楼层
如果你要不变量保存到DWG中去,有几个办法:

1、使用USER1`5等变量。
2、使用扩展数据
3、使用字典
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-10-28 16:38:27 | 显示全部楼层
我是想探讨一下CAD内部的LISP全局变量的存储(内存)和访问机制,想得到的是 所有变量 包括知道名称和不知道名称的;我也不是要保存什么数据,只是想知道LISP全局变量的存储机制。
按一般的想法思考,LISP程序交给CAD去解析执行,对于LISP全局变量,CAD应该在某内存区域保存了全局变量的名称与其相应数值的对应地址,如何对所有的LISP全局变量进行流览呢?
另外,希望大家记得我,对于我提出的问题请三思而后行,不要只是想增加帖数。
(看到这,你们有点冒火了吧,没办法,这就是我,有点狂放,要不是在XD这里,我要写的就更刺激了)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-10-28 16:41:29 | 显示全部楼层
最初由 hothua 发布
[B]我是想探讨一下CAD内部的LISP全局变量的存储(内存)和访问机制,想得到的是 所有变量 包括知道名称和不知道名称的;我也不是要保存什么数据,只是想知道LISP全局变量的存储机制。
按一般的想法思考,LISP程序交?.. [/B]


上面帖子已经说了:

atoms-family 函数

通过这个函数,在和 type 配合,可以得到所有的变量名,在用 eval 函数,可以得到变量的值。

大家可以探讨下具体实现。

欢迎你常来!人应该有个性,我推崇“狂而不羁",大家共同创造一个氛围好的交流空间!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-10-28 20:39:17 | 显示全部楼层
佩服佩服,真是艺高量大,我到过很多论坛,好多版主都没你的度量和技艺,包括如清华北大的BBS,那些BB都眼高于天。我算是找到地方了,谢谢。

再问,ARX编程时对全局变量又是如何处理的,如何实现两个ARX程序的全局变量共享,一个ARX程序能调用另一个ARX程序的函数吗,这个问题我真的不知道,望XD不吝赐教?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-10-28 21:09:51 | 显示全部楼层
最初由 hothua 发布
[B]佩服佩服,真是艺高量大,我到过很多论坛,好多版主都没你的度量和技艺,包括如清华北大的BBS,那些BB都眼高于天。我算是找到地方了,谢谢。

再问,ARX编程时对全局变量又是如何处理的,如何实现两个ARX程序的全?.. [/B]


找到地方了,以后就别流浪了:),谈赐教不敢,大家共同交流。

全局变量有几种情况:

1、同一个ARX程序,不同的函数共享全局变量,就把变量定义到函数外部,工程的其他文件用external 声明下就行了。

2、MDI多文档情况下,使用:


  1. [FONT=courier new]
  2. #include "adskdmgr.h"
  3. #include "docdata.h"
  4. extern AsdkDataManager<CDocData> DocVars;
  5. [/FONT]
复制代码


3、不同的ARX程序共享变量,可以把变量写到词典里面,由于变量非AcDbObject对象,不能直接保存到词典,可以先在“命名对象词典下见一个子词典,然后在这个子词典下添加AcDbXRecord,然后把变量用resbuf 链表保存到扩展记录里面。

当然也可以直接把AcDbXRecord 保存到命名对象词典下面。

另外,也可以自己建立个实体(自己应用程序读取的),把变量保存到实体扩展数据或者实体的扩展词典下的扩展记录里面。

4、不同的ARX间调用函数,一个方法,可以用ads_invoke,要求被调用的ADSRX定义的外部函数要用ads_regfunc注册。

    另外,在纯ARX程序,ads_invoke不起作用,可以用:


  1. [FONT=courier new]
  2. extern "C" int ads_queueexpr(const char*);

  3. 如:ads_queueexpr("(command "line" "0,0" "1,1" "")\n");
  4. [/FONT]

发送字符串让ACAD执行的方法,去执行另外ARX里面的函数或者命令。

还有用 AcApDocManager::sendStringToExecute 发送字符串执行。

还有可以直接发送WM_COPYDATA消息给ACAD,让ACAD执行:
  1. [FONT=courier new]
  2. void SendCmdToAcad(CString& cmd)
  3. {
  4.         COPYDATASTRUCT cmdMsg;
  5.         cmdMsg.dwData = (DWORD)1;
  6.         cmdMsg.cbData = (DWORD)_tcslen(cmd) + 1;
  7.         cmdMsg.lpData = cmd.GetBuffer(cmd.GetLength()+1) ;                     
  8.         SendMessage(HWND_ACAD, WM_COPYDATA, NULL, (LPARAM)&cmdMsg);
  9. }
  10. [/FONT]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-10-30 11:56:38 | 显示全部楼层
1、XD你所讲的全局变量共享的方法我也想过,其实还可以使用注册表、变量文件方法等,一来不是很环保,二来不安全,其他程序软件可能会修改相应存储值,三是有些特别情况不是特别适用,如软件加密,使用这些外部配置变量方法,使得没有如何解密知识的人都有可能破解软件。
2、现在大家向纯ARX发展了,用ADSRX不多了;我所所的函数调用是想把一些常用的写ARX程序的工具函数用象纯DLL那样封装起来,多个ARX程序在内存中共享代码段。
3、sendStringToExecute好像与ARX是异步执行的,不方便对程序流程控制,ads_queueexpr我没用过,不知道如何。SendMessage也存在信息反馈、流程控制问题吧。
当然很多事情根据实际应用可能会有较好的折衷办法。我在此提出问题也纯为探讨而以,希望在您得到较大的提高。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-1 05:21 , Processed in 0.467926 second(s), 45 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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