本帖最后由 林霄云 于 2019-7-28 16:54 编辑
对话框实战之图层综合功能源码解析——(二)显示图层信息
接前文,对话框使用流程简单的说,就是load——>new——>start——>done——>unload
一、显示图层信息对话框界面及dcl文件
界面如下
涉及的控件为text,list_box,各控件均应设置key属性,以便调用。
另外boxed_column和boxed_row等容器控件为布局和显示标签的作用。
- :column {
- :row {
- :boxed_column {
- label = "颜色" ;
- width = 8 ;
- :text {
- key = "lay-color" ;
-
- }
- }
- :boxed_column {
- label = "线型" ;
- width = 16 ;
- :text {
- key = "lay-linet" ;
-
- }
- }
- :boxed_column {
- label = "线宽" ;
- width = 8 ;
- :text {
- key = "lay-linew" ;
- value = "-3" ;
- }
- }
- :boxed_column {
- label = "打印" ;
- width = 8 ;
- :text {
- key = "lay-print" ;
- value = "P" ;
- }
- }
- }
- :boxed_row {
- label = "图层列表" ;
- :list_box {
- key = "lay-name" ;
- }
- }
- }
二、控件值的读取和设置
(一)text控件值的set
采用set_tile命令,传递控制key值和value值,注意value为字符串。如:
(set_tile "lay-color" (itoa (abs(cdr(assoc 62 ent)))))
注意到图层信息显示均采用text控件,故将其封装为函数,(showlayinfo)
- (defun showlayinfo( / layname ent temp strtemp )
- (setq layname (nth (atoi (get_tile "lay-name")) hnu:layname-list-c))
- (setq ent (entget(tblobjname "LAYER" layname)))
- ;
- (setq temp (cdr(assoc 62 ent)))
- (if (< temp 0) (setq strtemp "关闭") (setq strtemp "打开"))
- (set_tile "lay-color" (itoa (abs(cdr(assoc 62 ent)))))
- ;(set_tile "lay-color-choose" (itoa (cdr(assoc 62 ent))))
- (set_tile "lay-linet" (cdr(assoc 6 ent )))
- (set_tile "lay-linew" (itoa (cdr(assoc 370 ent))))
- (set_tile "lay-print" (nth (cdr(assoc 290 ent)) hnu:layprint-list))
- ;……
- )
为了使得每次能取得实时的图层名,图层名通过get_tile命令从对话框中读取,而非作为参数传递。因为在使用(showlayinfo)函数的时候,对话框一定存在。
(二)list_box控件值的set/get
list_box的显示
填充一个list_box可定义如下函数
- (defun show_list(key newlist) ;调用显示选单数据子程序
- (start_list key) ;开始处理选单对象
- (mapcar 'add_list newlist) ;逐一加入信息至选单
- (end_list) ;结束处理选单
- )
故list_box的显示列表与一个list是一一对应的。可设置一个全局变量保存该list。
本例中,考虑到所有图层和当前图层列表显示的全部图层的关系,设置两个全局变量分开保存,hnu:layname-list,hnu:layname-list-c。
后者由前者通过函数处理(layname-fil)得出。
- ;处理图层名称列表
- (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。
- (setq layname (nth (atoi (get_tile "lay-name")) hnu:layname-list-c))
list_box的set
也是通过set_tile设置序号,注意使用itoa。
三、对话框的控制流程
和顺序、选择、循环三大简单的执行流程相比,对话框的控制是通过action_tile命令设置回调函数。比如按钮的点击、列表的选择都会触发回调函数。
本例图层信息的显示即通过对图层列表的list_box设置一个回调函数即可。
- (action_tile "lay-name" "(showlayinfo)")
四、对话框使用流程
再次强调对话框的流程load——>new——>start——>done——>unload
前面所说的控件的显示、回调函数的设置,均在new初始化之后,start之前。要知道,start对话框后,对话框便显示出来,你便只有点击对话框的命了。
为了增强控制,done_dialog提供一个参数,该参数作为start_dialog的返回值,这便是对话框内容更新的原因,也使得对话框循环成为可能。
|