明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 19650|回复: 33

LISP调用DLL文件生成随机数

    [复制链接]
发表于 2007-1-5 22:04:00 | 显示全部楼层 |阅读模式

这是用LISP调用DLL文件生成随机数的程序示例。

在VB6中创建一个ActiveX DLL工程,在其中将类模块修改为RND,将工程名修改为RNDAPP。在其中添加下面的代码:
Public Function GetRND() As Double
  Dim i As Double
  i = RND
  GetRND = i
End Function
将其编译成DLL文件(“RND.dll”)。
在WINDOWS下注册这个DLL文件。
先将这个文件拷入C盘根目录下(注:也可放入相应文件夹下但文件夹名称中不能有空格)。
再在运行中加入运行如下命令:Regsvr32 c:\RND.dll

然后编LISP程序。
(defun c:testrnd( / rndobj rndnum)
  (setq rndobj (vlax-get-or-create-object "RNDAPP.RND"))
  (setq rndnum (vlax-invoke-method rndobj "GetRND"))
  (princ rndnum )
  (princ)
)
这里的rndnum就是相要的随机数。

这里是测试结果:
命令: testrnd
0.592458
命令:
命令: testrnd
0.4687
命令:
命令: testrnd
0.298165
命令:
命令: testrnd
0.622697
命令:
命令: testrnd
0.647821
命令:
命令: testrnd
0.263793
命令:
命令: testrnd
0.279342
命令:
命令: testrnd
0.829802
命令:
命令: testrnd
0.824602
命令:
命令: testrnd
0.589163
命令:
命令: testrnd
0.986093
命令:
命令: testrnd
0.910964

本帖子中包含更多资源

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

x

点评

大家编写DLL时最好再加一个randomize,我的没有加,计算出的第一个数字经常是7,加了之后就解决了  发表于 2012-6-15 17:02

评分

参与人数 2威望 +1 明经币 +3 金钱 +20 贡献 +5 激情 +5 收起 理由
革天明 + 1 还是DLL给力,
mccad + 1 + 2 + 20 + 5 + 5 【精华】好程序

查看全部评分

发表于 2007-1-23 00:02:00 | 显示全部楼层
本帖最后由 作者 于 2007-1-23 0:05:14 编辑

  1. (defun C:TT2 (/ ETIME LST N STIME X)
  2.   (setq N   0
  3. LST NIL
  4.   )
  5.   (repeat 10000
  6.     (setq LST (cons (setq N (1+ N)) LST))
  7.   )
  8.   (setq STIME (getvar "date"))
  9.   (setq LST (mapcar '(lambda (X) (nth X LST)) (rndsi (length lst))))
  10.   (setq ETIME (getvar "date"))
  11.   (prompt
  12.     (strcat
  13.       "\n程式共耗用時間: "
  14.       (rtos (* 86400.0 (- (- ETIME STIME) (fix (- ETIME STIME))))
  15.      2
  16.      3
  17.       )
  18.       "秒\n"
  19.     )
  20.   )
  21.   LST
  22. )
程式共耗用時間: 0.469秒
程序也用了cputicks
rndsi和tt2已经打包,下载解压后调入cad可直接运行tt2

回复 支持 1 反对 0

使用道具 举报

发表于 2023-10-7 23:14:05 | 显示全部楼层
以前都能正常支行的,但现在提示这个了
命令: testrnd 出错: 参数类型错误: VLA-OBJECT nil
不知道是不是因为用的64位系统和64位CAD的原因。怎么解决呢?

发表于 2018-7-4 11:11:52 来自手机 | 显示全部楼层
好贴,我要试试64位软件能不能调用32位的DLL
发表于 2007-1-5 22:37:00 | 显示全部楼层
顶!很好!学习
 楼主| 发表于 2007-1-5 22:56:00 | 显示全部楼层
原创,大家下载研究吧。功能需大家自已开发。LISP和VBA都可用DLL文件扩展,呵……将一些LISP或VBA做不了的工作交给VB生成的DLL好了。
发表于 2007-1-6 12:39:00 | 显示全部楼层

这个方法不错,但却需要人工输入Regsvr32 c:\RND.dll,这点不好

我本来想在lisp前加上一句 (STARTAPP "Regsvr32" "c:\\RND.dll"),但是会弹出“确定”按钮

不知道用vl-registry-write行不行?不过却不知道应该在注册表哪个位置?

望楼主指点

发表于 2007-1-6 13:11:00 | 显示全部楼层

自己解决了

在前面加上一句 (STARTAPP "Regsvr32" (strcat "/s \"" "c:\\RND.dll" "\""))就可以了

点评

还是你厉害,我使用的是BAT来注册DLL,但黑色窗口真让人不爽, 使用注册表来保存是否注册过这些DLL,若注册过就不必注册,具体程序使用时若发现出错了,则把注册表中的键值改为假  发表于 2013-1-4 08:44
 楼主| 发表于 2007-1-6 14:16:00 | 显示全部楼层
好自已研究的会记的深刻。
 楼主| 发表于 2007-1-17 19:47:00 | 显示全部楼层

顶回去。

发表于 2007-1-18 09:51:00 | 显示全部楼层
本帖最后由 作者 于 2007-1-18 10:40:29 编辑

这个方法很不错,把lisp完成不了的函数交给VB来做!
但是对于这个随机函数只能生成0-1之间的值,最好能生某个范围内的随机数.
  1. (defun rnd (rMin rMax / rndobj rndnum)
  2.   (setq rndobj (vlax-get-or-create-object "RNDAPP.RND"))
  3.   (setq rndnum (vlax-invoke-method rndobj "GetRND"));取得随机数
  4.   (if (and (= (type rmin) (type 1))(= (type rmax) (type 1)));如果是整数
  5.     (fix (+ rMin (* rndnum (- rMax rMin -1))))      ;则取整
  6.     (+ rMin (* rndnum (- rMax rMin)))               ;对此范围内求值
  7.   )  
  8. )
稍微改了一下lisp函数。
下面是对无痕那个函数的修改,能自动判断整数和实数。
  1. (defun rnd (rMin rMax / rndnum)
  2.   (vla-eval (vlax-get-acad-object) "ThisDrawing.setVariable "USERR5" ,CDbl((Rnd))")
  3.   (setq rndnum (getvar "userr5"))                            ;取得随机数
  4.   (if (and (= (type rmin) (type 1)) (= (type rmax) (type 1)));如果是整数
  5.     (fix (+ rMin (* rndnum (- rMax rMin -1))))               ;则取整
  6.     (+ rMin (* rndnum (- rMax rMin)))                        ;否则求此范围内随机值
  7.   )
  8. )
发表于 2007-1-18 10:10:00 | 显示全部楼层
本帖最后由 作者 于 2007-1-18 10:18:56 编辑

总感觉用DLL来生成一个随机数有些小题大作。
我来写一个,参考无痕的:
  1. ;生成随机数-by mccad:
  2. (defun rnd(rMin rMax)
  3.   (vla-eval (vlax-get-acad-object) "Randomize : ThisDrawing.setVariable "USERR5" ,CDbl((Rnd))" )
  4.   (+ rMin(* (getvar "userr5")(- rMax rMin)))
  5. )
发表于 2007-1-18 14:37:00 | 显示全部楼层
这个方法原先是在xdcad的aeo那里看到的,不是我的原创.特此说明
by the way,在mccad的基础上:
  1. (defun rnd(rMin rMax / e)
  2.    (vla-eval (vlax-get-acad-object) "Randomize : ThisDrawing.setVariable "USERR5" ,CDbl((Rnd))" )
  3.    (setq e (+ rMin (* (getvar "userr5")(- rMax rMin))) )
  4.    (if (= 'INT (type rmin)(type rmax))
  5.      (fix e)
  6.      e
  7.    )
  8. )
;;测试:
(repeat 20 (print(rnd 3 7)))
(repeat 20 (print(rnd 3. 7)))
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-23 22:46 , Processed in 0.216860 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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