找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3402|回复: 17

[分享]:vb方法生成"随机数"

[复制链接]

已领礼包: 488个

财富等级: 日进斗金

发表于 2004-9-15 22:54:45 | 显示全部楼层 |阅读模式

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

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

×
lisp本身没随机数的函数,(当然可以找到用lisp写的)
但vba不是带的吗!借来用用.
[php]
(defun rnd(rMin rMax)
    (vla-eval (vlax-get-acad-object)
               "ThisDrawing.setVariable \"USERR5\" ,CDbl((Rnd))"
    )
    (+ rMin(* (getvar "userr5")(- rMax rMin)))
)
[/php]
用法: 生成100~200的数 (rnd 100 200)

我这里主要讲的是lisp调用vb的方法.
比如前面eachy写的sendkeys,就是这方法

大家挖掘一下,实现点其他功能,省的再写宏了.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 488个

财富等级: 日进斗金

 楼主| 发表于 2004-9-15 23:01:35 | 显示全部楼层
vba里面不声明就是Variant
setVariable是不支持Variant的(交互信息,这个方法最直接)
搞了很长时间(没到vba里试一下:(  )后来恍然大悟.

写出来,大家不要象我一样不知道原因.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-9-16 07:33:55 | 显示全部楼层
Good! Now it's time to take those VB/VBA gurus to lunch :). We need your contribution.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-9-17 07:57:46 | 显示全部楼层
aeo演示很大的拓展了vlisp的功能,vlisp较之于alisp简直就是打通了任督二脉,变得无所不能了。 呵呵  好。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-9-17 09:45:47 | 显示全部楼层
偶最近也在研究这个东东,有时候VBA搞不定的就把程序分成几部分,用Lisp串起来
关注一下,:)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-9-17 21:21:02 | 显示全部楼层
厉害,能把LISP和VBA贯通起来了。学习ING。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-9-19 07:58:58 | 显示全部楼层
;;依样画葫芦也能在VLISP中调用vb/vba中功能强大的MsgBox函数,详细用法见VB帮助文件
[php]
;;;(setq ArgLst '("Do you want to continue ?" 50
;;;"MsgBox Demonstration" "DEMO.HLP" 1000))
;;;用法:(MsgBox Arglst)
(defun Msgbox(ArgLst / Msg Style Title Helpfn Ctxt)
  (mapcar 'set (list 'Msg 'Style 'Title 'Helpfn 'Ctxt) ArgLst)
    (vla-eval (vlax-get-acad-object)
              (strcat "ThisDrawing.setVariable \"USERI5\" ,CInt((MsgBox(\""
                      Msg "\""
                      (if Style (strcat "," (itoa Style)) "")
                      (if Title (strcat ",\"" Title "\"") "")
                      (if Helpfn (strcat ",\"" Helpfn "\"") "")
                      (if Ctxt (strcat "," (itoa Ctxt)) "")
                      ")))")
    )
    (getvar "useri5")
)
[/php]
还有strconv,比strcase功能要多,如把每个单词的首个字母大写( (conv设为3)
[php]
(defun StrConv(Str conv)
    (vla-eval (vlax-get-acad-object)
              (strcat "ThisDrawing.setVariable \"USERS5\" ,CStr((StrConv(\"" Str "\", " (itoa Conv) ")))")
    )
    (getvar "users5")
)
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-9-19 14:42:00 | 显示全部楼层
我也来一个:
[php]
;| (X-vbfun typ vbfun) = 运行简单的vb函数- v1.0 b ----------梦断江南.2004.9
参数: typ = 函数返回值的vb类型.
      vbfun = 简单的vb函数.
返回: 设置于 "USERR5"变量中的值.
实例:(x-vbfun 'variant '(rnd)) ;; 出错.显示设置系统变量出错.!!
     (x-vbfun 'double '(rnd))  ;;->0.533424 :取得随机数.ok
     (x-vbfun 'integer '(msgbox("hello,x-vbfun",3,"test"))) ;;-> 6.0 :显示信息框,参数详vb函数参考.ok.
     (x-vbfun 'single '(msgbox("test1",3))) ;;出错.显示设置系统变量出错.!!
要点: typ 必须于 vbfun 返回值类型相一致!!!
参考: http://www.xdcad.net/forum/showthread.php?s=&threadid=259492
|;
(DEFUN X-vbfun (typ vbfun / typlst)
  (setq typlst '(("BOOLEAN" . "CBOOL")("BYTE" . "CBYTE")("CURRENCY" . "CCUR")("DOUBLE" . "CDBL")("DECIMAL" . "CDEC")
               ("INTEGER" . "CINT")("LONG" . "CLNG")("SINGLE" . "CSNG")("STRING" . "CSTR")("VARIANT" . "CVAR")))
  (vla-eval (vlax-get-acad-object)
            (strcat "thisdrawing.setvariable \"USERR5\" ,"
                    (cdr(assoc (strcase (vl-symbol-name typ)) typlst))
                    "("
                    (vl-prin1-to-string vbfun)
                    ")"
            )
  )
  (getvar "USERR5")
)
[/php]
(x-vbfun 'double '(rnd))  ;;->0.533424 :取得随机数.ok
(x-vbfun 'integer '(msgbox("hello,x-vbfun",3,"test"))) ;;-> 6.0 :显示信息框,参数详vb函数参考.ok.
(x-vbfun 'variant '(Shell("CALC.EXE", 1))) ;;调出计算器并返回cad状态.  ok!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-9-19 14:51:57 | 显示全部楼层
提醒一点,好像都没有想过把User系列变量还原,?
好像用Users1~5要好些吧?
Msgbox用下面的代替,也可以
(vlax-invoke-method (vlax-create-object "WScript.Shell") "Popup" "why" 7 "Answer This Question:" 1)
实际上WScript.Shell的功能也很强大,:)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-9-19 19:01:27 | 显示全部楼层
发现一个办法,可以不用传递系统变量了
(setq a (vlax-create-Object "ScriptControl"))
(vlax-put-property a "language" "vbs")
(vla-eval a "Rnd()")
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-9-19 19:56:31 | 显示全部楼层
但是每次运行都是一样的“随机数”?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-9-19 20:00:05 | 显示全部楼层
前面的
(setq a (vla-GetInterfaceObject (vlax-get-acad-object) "ScriptControl"))
(vlax-put-property a "language" "vbs")
只运行一次

你应该只运行
(vla-eval a "Rnd()")
VB的随机数是“伪随机数”,:)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-9-19 20:13:16 | 显示全部楼层
我vb是门外汉,你能否说说为什么叫“伪随机数”?
最重要的是,怎么让它每次运行结果不一样?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-9-19 20:17:52 | 显示全部楼层
VB的随机数,也是通过一种算法进行运算的,每一次的数的顺序都一样
你可以把
(setq a (vla-GetInterfaceObject (vlax-get-acad-object) "ScriptControl"))
(vlax-put-property a "language" "vbs")

放在启动时加载
调用时运行(vla-eval a "Rnd()")即可

例,在Acad.lsp文件里加入
(setq Tls-VBScript (vlax-create-Object "ScriptControl"))
(vlax-put-property Tls-VBScript "language" "vbs")

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

使用道具 举报

发表于 2004-9-19 20:47:11 | 显示全部楼层
嗯,的确可以了:)
另外,"wscript.shell" 已经有实例。那么"wscript" 对象如何取得?
如果用 (setq a (vla-GetInterfaceObject (vlax-get-acad-object) "ScriptControl"))
(vla-eval a "Rnd()")可以,但是(vla-eval a "Randomize") 却又不行了,why?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-27 14:22 , Processed in 0.360141 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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