明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5234|回复: 8

[【高飞鸟】] 【DynamicLisp的高级应用】-- 定时器事件

  [复制链接]
发表于 2013-8-2 18:40:20 | 显示全部楼层 |阅读模式
本帖最后由 highflybir 于 2013-8-2 21:11 编辑

定时器时间是利用API里面的timer,用来在CAD中设置定时器,使得某一事件在一定间隔时间内触发。

有很多用途: 譬如有些CAD的系统变量如果发生了变化,通过反应器不能监视,用定时器就可以达到目的。
另外,你也可以用来做做动画,或者模拟多线程,这都是可以的。

=====================================================================
相关的定时器函数有两个:                                                         
---------------------------------------------------------------------
名称:HFB_SetLispTimer                                              
功能:在CAD中增加定时器事件,可以间隔一定时间触发事件。            
方法:(HFB_SetLispTimer  Callback  Elapse  [hwnd])                  
参数:Callback-- 回调函数名称,为字符串                             
       elapse  -- 间隔时间,毫秒单位,为正整数                       
       hwnd    -- 窗口句柄。缺省时为当前文档。设置为0时是全局定时事件
返回:成功返回定时器ID, 否则返回nil.                                
---------------------------------------------------------------------
名称:HFB_KillLispTimer                                             
功能:关闭CAD中的定时器事件。                                       
方法:(HFB_KillLispTimer ID)                                       
参数:ID      -- 定时器ID,为正整数                                 
返回:成功返回T, 否则返回nil.                                       
---------------------------------------------------------------------
说明:定时器设置的回调函数里不应与CAD的交互,否则可能出现意外.      
       关闭文档或者程序,或者卸载程序之前别忘记关闭相关定时器事件。  
       定时器事件可以用来监视系统变量等,也可以达到反应器效果。
---------------------------------------------------------------------   
回调函数: 回调函数含有四个参数, 参数说明:                                  hwnd    -- 窗口句柄                                          
       nMsg    -- 窗口消息                                          
       nTimerID-- 定时器事件ID                                       
       dwTime  -- 事件时间                                          
=====================================================================

下面的例子在图中增加了4个定时器事件。
一个为监视视窗中心的变化,一个监视视窗高度的变化,一个使一个圆不断变大。
这三个都是文档级的定时器。另外还有一个全局定时器,10秒钟提醒一下,然后关闭。

代码如下:
  1. (defun C:SetTimer(/ oldsize oldctr obj ent cen rad t1 t2 t3 t4)
  2.   
  3.   ;;视高改变监视函数
  4.   (defun TimerCallback1 (hWnd nMsg nTimerid dwTime / newsize)
  5.     (setq newsize (getvar 'viewsize))
  6.     (if (not (equal newsize (vl-bb-ref 'oldsize) 1e-6))
  7.       (progn
  8.         (princ "\n视高发生改变,现在是: ")
  9.         (princ newsize)
  10.         (vl-bb-set 'oldsize newsize)
  11.       )
  12.     )
  13.   )
  14.   
  15.   ;;视中心改变监视函数
  16.   (defun TimerCallback2 (hWnd nMsg nTimerid dwTime / newctr)
  17.     (setq newctr (getvar 'viewctr))
  18.     (if (not (equal newctr (vl-bb-ref 'oldctr) 1e-6))
  19.       (progn
  20.         (princ "\n视中心发生改变,现在是: ")
  21.         (princ newctr)
  22.         (vl-bb-set 'oldctr newctr)
  23.       )
  24.     )
  25.   )

  26.   ;;改变圆的半径,圆不断变大。
  27.   (defun TimerCallback3 (hWnd nMsg nTimerid dwTime / obj)
  28.     (if (setq obj (vl-bb-ref 'obj))
  29.       (if (vlax-erased-p obj)
  30.         (hfb_killlisptimer (vl-bb-ref 't3))
  31.         (progn
  32.           (vla-put-radius obj (+ (vla-get-radius obj) 1))
  33.           (redraw (vlax-vla-object->ename obj))
  34.         )
  35.       )
  36.     )
  37.   )

  38.   ;;全局的监视事件
  39.   (defun TimerCallback4 (hWnd nMsg nTimerid dwTime)
  40.     (alert "10秒提醒一次")
  41.     (HFB_KillLispTimer (vl-bb-ref 't4))                                  ;提醒后就关闭定时器
  42.   )

  43.   ;;获得变量数值并存储
  44.   (setq oldsize (getvar 'viewsize))
  45.   (setq oldctr (getvar 'oldctr))
  46.   (vl-bb-set 'oldsize oldsize)
  47.   (vl-bb-set 'oldctr oldctr)
  48.   
  49.   (initget 1)
  50.   (setq cen (getpoint "\n输入圆心:"))
  51.   (initget 1)
  52.   (setq rad (getdist cen "\n输入半径:"))
  53.   (setq ent (Ent:make_circle cen rad))
  54.   (setq obj (vlax-ename->vla-object ent))
  55.   
  56.   (HFB_KillLispTimer)
  57.   (setq t1 (HFB_SetLispTimer "TimerCallback1" 50 ))                        ;50毫秒  
  58.   (setq t2 (HFB_SetLispTimer "TimerCallback2" 50 ))                          ;50毫秒  
  59.   (setq t3 (HFB_SetLispTimer "TimerCallback3" 50 ))                          ;50毫秒  
  60.   (setq t4 (HFB_SetLispTimer "TimerCallback4" 10000 0))                 ;10秒提醒一次
  61.   (vl-bb-set 'obj obj)
  62.   (vl-bb-set 't1 t1)
  63.   (vl-bb-set 't2 t2)
  64.   (vl-bb-set 't3 t3)
  65.   (vl-bb-set 't4 t4)
  66.   
  67.   (princ)
  68. )

  69. (defun Ent:make_circle (cen rad)
  70.   (entmakex (list '(0 . "CIRCLE") (cons 10 cen) (cons 40 rad)))
  71. )

  72. (defun C:killTimer()
  73.   (HFB_KillLispTimer)
  74.   (princ)
  75. )

"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

 楼主| 发表于 2013-8-2 18:42:06 | 显示全部楼层
设置定时器命令是:settimer
关闭定时器命令是:killtimer
关于DynamicLisp,请参见:
http://bbs.mjtd.com/forum.php?mo ... mp;extra=#pid604291
发表于 2013-8-2 23:45:38 | 显示全部楼层
LISP能做到这样,真的好强哦。
发表于 2013-8-3 12:44:07 | 显示全部楼层
highflybir 发表于 2013-8-2 18:42
设置定时器命令是:settimer
关闭定时器命令是:killtimer
关于DynamicLisp,请参见:

运行时说没有这个函数:HFB_KILLLISPTIMER

命令: SetTimer
输入圆心:
输入半径:; 错误: no function definition: HFB_KILLLISPTIMER

点评

请先加载DynamicLisp  发表于 2013-8-4 23:28
发表于 2013-8-4 22:21:51 | 显示全部楼层
学习了
发表于 2013-8-11 08:50:33 | 显示全部楼层
H版就是强,顶了!
发表于 2014-8-4 13:51:32 | 显示全部楼层
这个好强,学习了
发表于 2018-12-14 16:01:59 | 显示全部楼层
前几个月不知道这个什么东西
现在回过来看 不的不说  这东西霸道  
发表于 2024-6-15 15:17:30 | 显示全部楼层
DynamicLisp , 是不是出新版cad就用不了了, 得等你编译
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-13 14:43 , Processed in 0.190619 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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