明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1861|回复: 5

[源码] 对话框实战之图层综合功能源码解析——(二)显示图层信息

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

对话框实战之图层综合功能源码解析——(二)显示图层信息

接前文,对话框使用流程简单的说,就是load——>new——>start——>done——>unload

一、显示图层信息对话框界面及dcl文件
界面如下

涉及的控件为text,list_box,各控件均应设置key属性,以便调用。
另外boxed_column和boxed_row等容器控件为布局和显示标签的作用。

  1. :column {
  2.             :row {
  3.                 :boxed_column {
  4.                     label = "颜色" ;
  5.                     width = 8 ;
  6.                     :text {
  7.                         key = "lay-color" ;
  8.                         
  9.                     }
  10.                 }
  11.                 :boxed_column {
  12.                     label = "线型" ;
  13.                     width = 16 ;
  14.                     :text {
  15.                         key = "lay-linet" ;
  16.                         
  17.                     }
  18.                 }
  19.                 :boxed_column {
  20.                     label = "线宽" ;
  21.                     width = 8 ;
  22.                     :text {
  23.                         key = "lay-linew" ;
  24.                         value = "-3" ;
  25.                     }
  26.                 }
  27.                 :boxed_column {
  28.                     label = "打印" ;
  29.                     width = 8 ;
  30.                     :text {
  31.           key = "lay-print" ;
  32.                         value = "P" ;
  33.                     }
  34.                 }
  35.             }
  36.             :boxed_row {
  37.                 label = "图层列表" ;
  38.                 :list_box {
  39.                     key = "lay-name" ;
  40.                 }
  41.             }
  42.         }



二、控件值的读取和设置

(一)text控件值的set
采用set_tile命令,传递控制key值和value值,注意value为字符串。如:
(set_tile "lay-color" (itoa (abs(cdr(assoc 62 ent)))))
注意到图层信息显示均采用text控件,故将其封装为函数,(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. ;……

  13. )

为了使得每次能取得实时的图层名,图层名通过get_tile命令从对话框中读取,而非作为参数传递。因为在使用(showlayinfo)函数的时候,对话框一定存在。

(二)list_box控件值的set/get

list_box的显示

填充一个list_box可定义如下函数
  1. (defun show_list(key newlist) ;调用显示选单数据子程序
  2. (start_list key)             ;开始处理选单对象
  3. (mapcar 'add_list newlist)   ;逐一加入信息至选单
  4. (end_list)                   ;结束处理选单
  5. )

故list_box的显示列表与一个list是一一对应的。可设置一个全局变量保存该list。
本例中,考虑到所有图层和当前图层列表显示的全部图层的关系,设置两个全局变量分开保存,hnu:layname-list,hnu:layname-list-c。
后者由前者通过函数处理(layname-fil)得出。
  1.   ;处理图层名称列表
  2.   (show_list "lay-name"  (layname-fil lay-fil-n lay-fil-n2)) ;在layname-fil里设置nil为0


list_box的get

取的值是是在列表中的序号,从0开始,与nth和vl_position函数相同。且注意到get_tile获得的值均以字符串方式显示,故需要使用atoi。

  1. (setq layname (nth (atoi (get_tile "lay-name")) hnu:layname-list-c))


list_box的set

也是通过set_tile设置序号,注意使用itoa。

三、对话框的控制流程
和顺序、选择、循环三大简单的执行流程相比,对话框的控制是通过action_tile命令设置回调函数。比如按钮的点击、列表的选择都会触发回调函数。
本例图层信息的显示即通过对图层列表的list_box设置一个回调函数即可。
  1. (action_tile "lay-name" "(showlayinfo)")


四、对话框使用流程
再次强调对话框的流程load——>new——>start——>done——>unload
前面所说的控件的显示、回调函数的设置,均在new初始化之后,start之前。要知道,start对话框后,对话框便显示出来,你便只有点击对话框的命了。
为了增强控制,done_dialog提供一个参数,该参数作为start_dialog的返回值,这便是对话框内容更新的原因,也使得对话框循环成为可能。







本帖子中包含更多资源

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

x

评分

参与人数 1金钱 +50 收起 理由
Kye + 50 用心了,赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2019-7-29 20:36 | 显示全部楼层
优质教学贴
发表于 2019-7-31 19:33 | 显示全部楼层
写的非常棒,学习了
发表于 2019-8-1 11:09 | 显示全部楼层
又一位lisp高手冉冉升起
发表于 2020-9-18 19:59 | 显示全部楼层
谢谢大神的分享,收下学习了
发表于 2021-1-19 22:30 | 显示全部楼层

谢谢大神的分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-19 02:37 , Processed in 0.252134 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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