明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1731|回复: 2

[源码] 对话框实战之图层综合功能源码解析——(三)控制图层状态

[复制链接]
发表于 2019-8-3 11:28 | 显示全部楼层 |阅读模式
本帖最后由 林霄云 于 2019-8-3 11:25 编辑

对话框实战之图层综合功能源码解析——(三)控制图层状态

接前文,对话框实战之图层综合功能源码解析——(二)显示图层信息
http://bbs.mjtd.com/forum.php?mo ... 988&fromuid=7303580


一、显示及控制图层状态及dcl文件
界面如下

状态显示的控件是text,并用button控件进行控制。
  1.         :column {
  2.             :boxed_column {
  3.                 label = "状态" ;
  4.                 width = 8 ;
  5.                 :text {
  6.                     key = "lay-state" ;
  7.                     value = "打开" ;
  8.                 }
  9.                 spacer;
  10.                 :button {
  11.                     key = "lay-onoff" ;
  12.                     label = "开|关(&O)" ;
  13.                 }
  14.                 :button {
  15.                     key = "lay-lock" ;
  16.                     label = "锁|解(&L)" ;
  17.                 }
  18.                 :button {
  19.                     key = "lay-frozon" ;
  20.                     label = "冻|解(&R)" ;
  21.                 }
  22.                 :button {
  23.                     key = "lay-clayer" ;
  24.                     label = "置前层(&V)" ;
  25.                 }
  26.             }
  27.         }



二、控件值的读取和设置

(一)text控件值的set
如前文所述,图层状态亦封装在图层信息的函数里,完整的(showlayinfo)函数如下:
  1. (defun showlayinfo( / layname ent temp strtemp )
  2. (setq layname (nth (atoi (get_tile "lay-name")) hnu:layname-list-c))
  3. (setq ent (entget(tblobjname  "LAYER" layname)))
  4. ;
  5. (setq temp (cdr(assoc 62 ent)))
  6. (if (< temp 0) (setq strtemp "关闭") (setq strtemp "打开"))
  7. (set_tile "lay-color" (itoa (abs(cdr(assoc 62 ent)))))
  8. ;(set_tile "lay-color-choose" (itoa (cdr(assoc 62 ent))))

  9. (set_tile "lay-linet"  (cdr(assoc 6 ent )))
  10. (set_tile "lay-linew" (itoa (cdr(assoc 370 ent))))
  11. (set_tile "lay-print" (nth (cdr(assoc 290 ent)) hnu:layprint-list))
  12. (setq temp (cdr(assoc 70  ent)))
  13. (if  
  14. (=  (boole 1 temp 1) 1) (setq strtemp (strcat strtemp "&冻结")))

  15. (if
  16. (=  (boole 1 temp 2) 2) (setq strtemp (strcat strtemp "&视口冻结")))

  17. (if
  18. (=  (boole 1 temp 4) 4) (setq strtemp (strcat strtemp "&锁定")))

  19. (set_tile "lay-state" strtemp)


  20. )


注意到,"打开和关闭"和"锁定冻结"由不同的组码控制。用boole函数取特定位的值,是用"and"操作。冻结、锁定相互独立,用if语句并列。其他事项详见前文所述。

(二)button控件的使用
button控件略微不同的是,它无需set、get操作,只需要利用action_tile命令设定回调函数(或语句)。鉴于锁定、冻结操作过程类似,设置一个处理函数(modifystate i),通过传递不同参数i进行处理。
  1.   ;处理状态
  2.   (action_tile "lay-onoff" "(modifystate 1)")
  3.   (action_tile "lay-lock" "(modifystate 2)")
  4.   (action_tile "lay-frozon" "(modifystate 3)")
  5.   (action_tile "lay-clayer" "(modifystate 4)")

如前文所述,此段代码是初始化,在对话框流程load——>new——>start——>done——>unload 中应在new之后,start之前。

其中处理函数(modifystate i) 如下:
  1. (defun modifystate( n / temp layname en)
  2. (setq layname (nth (atoi (get_tile "lay-name")) hnu:layname-list-c))
  3. (setq en (tblobjname  "LAYER" layname))
  4. (cond
  5. ((= n 1)  (set-dxf en 62 (- (get-dxf  62 en))) (showlayinfo) )
  6. ((= n 2)  (set-dxf en 70 (xor_i (get-dxf  70 en)  4 )) (showlayinfo) ) ;锁定
  7. ((= n 3)  (set-dxf en 70 (xor_i (get-dxf  70 en)  1 )) (showlayinfo) ) ;冻结
  8. ((= n 4)  (set-dxf en 70 0)(setvar 'clayer layname))
  9. );cond

  10. )

layname即图层名,如前文所述,实时获取。图层状态改变后应更新图层信息,即调用(showlayinfo)。根据操作习惯,置当前层操作,先取消图层的冻结和锁定。

上述定义一个xor_i函数,进行特定位的0<-->1的反转操作。定义如下:
  1. (defun xor_i(num i)
  2. ;指定位,进行xor操作。i的取值限于1 2 4 8 等,否则结果不可靠。
  3. ;取指定位的值,如果是1,则减之,是0,则加之。
  4. (if (= (boole 1 num  i) i)
  5. (- num i) (+ num i))
  6. )


注意到,图层状态控制的button,并不调用done_dialog。即对话框将一直显示。

三、对话框的退出
不断强调对话框的流程
load——>new——>start——>done——>unload

定义一个退出按钮,设置它的回调动作为done_dialog,即可。
  1. (action_tile "cancel" "(done_dialog 0)" )

注意,此条仍为初始化语句,设置在start之前。这是对话框编程的最大的特点,执行过程不受语句顺序的影响(也是回调的意义所在)。
其dcl文件如下:
  1. :button {
  2.             alignment = centered ;
  3.             fixed_width = true ;
  4.             is_cancel = true ;
  5.             key = "cancel" ;
  6.             label = "退出(&E)" ;
  7.         }

label上的&E是定义一个对话框热键。方便左手操作。




本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2019-8-4 11:00 | 显示全部楼层
楼主大大,能否把这个程序的完整源码发下呢,学习,多谢
发表于 2019-8-20 00:31 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-19 03:13 , Processed in 0.170898 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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