找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4255|回复: 12

[讨论]:Lisp 中使用Small VBA Script

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2006-10-20 12:05:53 | 显示全部楼层 |阅读模式

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

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

×
在 ActiveX 中提供了 Eval 方法来运行 Small VBA Script,而且 CAD 提供了 VBASTMT 命令行方式运行 VBA 语句。

利用 Vla-eval 可以在 Lisp 编程的一些特定应用中可以极大的提高运行效率,也可以减少很多代码。

在网上用 Google 搜索 Vla-eval 或者 VBASTMT 可以找到一些资料,但比较少且雷同的多。下面是本人写的比较简单的几个,抛砖引玉。

1 全角转半角
[iframe h=600 w=100%]http://eachy.bokee.com/5743661.html[/iframe]

2 清除 ActiveSelectionset 选择集

  1. (defun ybvl-clearcset ()
  2.    (vla-eval (vlax-get-acad-object) "Thisdrawing.ActiveSelectionset.delete")
  3. )

3 打开/关闭 捕捉
  1. (vla-eval (vlax-get-acad-object) "SendKeys "{F3}"")
复制代码


4 以前的帖子中有 Sendkey 函数以及一个随机数也是关于这个内容

5 刚刚发布的隐藏/显示选择集也是用了VBA Script 语句

  1. For Each obj In ThisDrawing.ActiveSelectionSet
  2.   obj.Visible = False
  3. Next
复制代码

6 选层锁定

  1. 选层锁定(Lisp与VBA Script结合)
  2.                                       

  3. ;;Author: eachy 2006.10.20
  4. (defun c:lyrlk (/ *acad* doc)
  5.   (setq *acad* (vlax-get-acad-object)
  6.         doc    (vla-get-activedocument *acad*)
  7.   )
  8.   (vla-startundomark doc)
  9.   (vl-catch-all-apply
  10.     '(lambda (/ lyr e)
  11.        (while (setq e (car (entsel "\nSelect Lock Layer: ")))
  12.          (setq lyr (cdr (assoc 8 (entget e))))
  13.          (vla-eval
  14.            *acad*
  15.            (strcat "Thisdrawing.layers.Item("" lyr "").Lock = True")
  16.          )
  17.        )
  18.      )
  19.   )
  20.   (vla-endundomark doc)
  21.   (princ)
  22. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 6个

财富等级: 恭喜发财

发表于 2006-10-21 08:06:55 | 显示全部楼层
如果可以很好解决VBS与lisp的非同步问题这将是多语言混合开发的福音!!
比如在lisp程序开头时发出(vla-eval (vlax-get-acad-object) "SendKeys \"{F3}\"")
却要等到lisp程序结束才会被执行~!晕倒~
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2006-10-21 14:08:01 | 显示全部楼层
最初由 fsxm 发布
[B]如果可以很好解决VBS与lisp的非同步问题这将是多语言混合开发的福音!!
比如在lisp程序开头时发出(vla-eval (vlax-get-acad-object) "SendKeys \"{F3}\"")
却要等到lisp程序结束才会被执行~!晕倒~ [/B]

不明白你的意思
;; Test ok In AutoCAD 2007cn

  1. (defun c:tst (/ p1)
  2.   (while (and (progn
  3.                 (vla-eval (vlax-get-acad-object) "Sendkeys "{F3}"")
  4.                 t
  5.               )
  6.               (setq p1 (getpoint "\nPoint: "))
  7.          )
  8.     (vla-eval (vlax-get-acad-object) "Sendkeys "{F3}"")
  9.     (getpoint p1 "\nPoint: ")
  10.   )
  11. )

命令: tst
Point:  <对象捕捉 开>
Point:  <对象捕捉 关>
Point:  <对象捕捉 开>
Point:  <对象捕捉 关>
Point:  <对象捕捉 开>  (1213.16 473.591 0.0)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2006-10-21 14:35:35 | 显示全部楼层
显示/隐藏选择集

  1. (defun c:Hidess        ()
  2.   (if (ssget)
  3.     (vla-eval
  4.       (vlax-get-acad-object)
  5.       "For Each Obj In Thisdrawing.ActiveSelectionset:Obj.Visible = False:Next"
  6.     )
  7.   )
  8.   (princ)
  9. )
  10. (defun c:Showall ()
  11.   (if (ssget "x" '((60 . 1)))
  12.     (vla-eval
  13.       (vlax-get-acad-object)
  14.       "For Each Obj In Thisdrawing.ActiveSelectionset:Obj.Visible = True:Next"
  15.     )
  16.   )
  17.   (princ)
  18. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-10-21 19:26:51 | 显示全部楼层
过瘾,VLA-EVAL还有这种特殊用途.
楼主zhen强.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-10-23 10:01:20 | 显示全部楼层
在Vlisp和CAD帮助里面没有找到相应的内容,版主能不能详解一下 VLA-EVAL 的使用规则。谢谢了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-10-23 20:26:26 | 显示全部楼层
看来还是很吸引人啊,虽然一时没有想明白

eachy版主,根据你三楼的例子,应该是可以在一个程序里面实现按"TAB"键就能实现“F3”的功能了吧,那能否建立一个关于TAB键的反应器,每次一按TAB键就自动调用这个程序让TAB键变成F3键,最好是透明的,这个问题虽然用AUTOHOOK或者其他ARX程序能够解决,但我一直希望能通过LISP解决,似乎看到希望,不过不大确切可行否。

另,前段时间学习WSCRIPT,拷贝了这样一段代码


  1. (defun c:runwsh ()
  2. (startapp "wscript" "makedir.vbs")
  3. (princ)
  4. )

  5. ;Makedir.vbs
  6. ;Set fs = CreateObject("Scripting.FileSystemObject")
  7. ;fs.createfolder("c:\_gordontest")
  8. ;;注意,把这个vbs放到cad的搜索路径里,比如cad的


那么LISP中就可以很简单的实现一些VB的脚本功能,是不是和VLA-EVAL原理有点类似呢,谢谢。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2006-10-23 21:52:11 | 显示全部楼层
[iframe h=420 w=100%]http://www.mjtd.com/object/acad2004/idh_eval.htm[/iframe]
[iframe h=400 w=100%]http://www.mjtd.com/object/acad2004/ex_eval.htm[/iframe]

在 AutoCAD 命令行中执行 VBA 语句

命令输入 vbastmt

表达式: 输入要执行的 VBA 语句

一条 Visual Basic 语句是一个完整指令,可以包含关键字、运算符、变量、常量和表达式。 通常,一行只写一条语句。如果用户希望在一行中写多条语句,可用冒号 (:) 分隔各条语句。

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

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

发表于 2006-10-24 21:24:14 | 显示全部楼层
sendkeys,sendcommand等等这类是要等到程序出现暂停or结束才会运行的啦!~!
你上面列出的例子不是出现了暂停如:get类的交互函数吗???不信你试试:
(defun  c:test ()
(vla-eval (vlax-get-acad-object) "Sendkeys \"{F3}\"")
(command "delay"  10000)
)
看看~F3是在10s后发出的还是在test运行后就发出了~
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2006-11-16 06:48:53 | 显示全部楼层
标注恢复原值

  1. (vla-eval (vlax-get-acad-object)
  2.            “For Each Obj In Thisdrawing.ActiveSelectionset:Obj.TextOverride="":Next"
  3. )
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-11-20 06:07:21 | 显示全部楼层
用这种语法可以获得cpu序列号及磁碟id吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-1-30 13:41:53 | 显示全部楼层
能否提供个类似与delay函数?
不是那种折腾CPU的delay,我需要挂起的delay,能否做到?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-7-11 11:22:41 | 显示全部楼层
下载你那个 cadkit 里面的程序 很好用 但是刚刚出现提示   命令:命令: cts 错误 : 参数类型错误: stringp nil   
不知怎么解决!请教,谢谢。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 08:41 , Processed in 0.226709 second(s), 55 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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