找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 7424|回复: 14

[教学] 和晓东一起学OpenDCL系列教学之--图层过滤对话框

[复制链接]

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-5-15 23:51:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×


用OPENDCL制作一个对话框,返回需要的层表给后续LISP调用。


演示:

Lyr_GetSel.gif


很简单的一个对话框,使用了最基本的ListBox,CheckBox,Image Button,程序能很方便快捷的根据你的需要返回需要的层表。

1、程序开始,常规的调用Oninitialize ,由于我们程序中有关闭对话框拾取图层的需要,所以对话框恢复显示后,要初始化一些数据。


[pcode=lisp,true]
  (defun c:LayerListForm_OnInitialize ( / a all b n pos)
    (dcl_Control_SetValue SelAllCheck 0)    ;; 全选的checkbox 清空
    (setq all ($xdob_layer_GetAllLayer))     ;;lisp函数,获得所有的层表
    (setq all (vl-sort all '(lambda (a b)         ;; 图层排序
                              (< (ascii a) (ascii b))
                            )
              )
    )
    (dcl_ListBox_Clear LayerList)                ;;清空列表框
    (dcl_ListBox_AddList LayerList all)        ;;图层字符串表添加到listbox显示
    (if $xdob_layer_hadlayerlist
       (progn
          (foreach n $xdob_layer_hadlayerlist ;;保存我们选择项的表
             (setq pos (- (length (dcl_control_getlist LayerList))(length (member n (dcl_control_getlist LayerList)))))
             (if (>= pos 0)
                (dcl_ListBox_SelectItem LayerList pos t) ;;根据选择的项目,亮显
             )
          )
       )
    )
    (if (= (length (dcl_control_getlist LayerList))(length (dcl_ListBox_GetSelectedItems LayerList))) ;;当LISTBOX的所有项目数量和量显的选择项目相同时候,全选框勾选。
      (dcl_Control_SetValue SelAllCheck 1)
    )
  )

[/pcode]

2、当listbox里面选项变化的时候,因为我们设计LISTBOX时候是可以多选的,如果全选上了,那么就要变换 全选 checkbox的状态,代码如下:


[pcode=lisp,true]
  (defun c:LayerList_OnSelChanged (ItemIndexOrCount Value /)
    (if (= ItemIndexOrCount (length (dcl_Control_GetList LayerList)))
      (dcl_Control_SetValue SelAllCheck 1)
      (dcl_Control_SetValue SelAllCheck 0)
    )
    (dcl_Control_SetValue UnSelCheck 0)
  )

[/pcode]

3、当我们勾选全选checkbox的时候要相应的事件,如果全选勾上,则listbox框里面的所有图层亮显选择。同时设置 反选 checkbox。

[pcode=lisp,true]
  (defun c:SelAllCheck_OnClicked (Value /)
    (if (= 1 value)
      (dcl_ListBox_SelItemRange LayerList 0 (1- (length (dcl_Control_GetList LayerList))) T)
      (dcl_ListBox_SelItemRange LayerList 0 (1- (length (dcl_Control_GetList LayerList))) nil)
    )
    (dcl_Control_SetValue UnSelCheck 0)
  )

[/pcode]

4、下面是 反选 checkbox 相应的事件处理函数

[pcode=lisp,true]
  (defun c:UnSelCheck_OnClicked (Value / n selindexlist)
    (setq selIndexList (dcl_ListBox_GetSelectedNths LayerList))
    (dcl_ListBox_SelItemRange LayerList 0 (1- (length (dcl_Control_GetList LayerList))) T)
    (foreach n selIndexList
      (dcl_ListBox_SelectItem LayerList n nil)
    )
    (setq selIndexList (dcl_ListBox_GetSelectedNths LayerList))   
    (cond
      ((= 0 (length selIndexList))
        (dcl_Control_SetValue SelAllCheck 0)
      )
      ((= (length (dcl_Control_GetList LayerList)) (length selIndexList))
        (dcl_Control_SetValue SelAllCheck 0)
      )
    )
  )

[/pcode]

5、拾取按钮选择的时候的响应事件处理函数。因为要到图中选择实体确定图层,所以要关闭模式对话框。
[pcode=lisp,true]
  (defun c:PickSel_OnClicked (/)
     (setq $xdob_layer_hadlayerlist (dcl_ListBox_GetSelectedItems LayerList)) ;;保存当前我们已经选好的图层
     (dcl_Control_SetValue UnSelCheck 0)
     (dcl_form_close LayerListForm 5)   ;; 关闭对话框,带参数5,下面介绍。
  )

[/pcode]

6、按下OK按钮和退出按钮时候的事件处理函数

[pcode=lisp,true]
  (defun c:CQuit_OnClicked (/)
    (dcl_Form_Close LayerListForm 4) ;;关闭对话框,带参数4
  )
  (defun c:ok_OnClicked (/)
    (if (> (dcl_ListBox_GetSelCount LayerList) 0)
      (progn
        (dcl_Form_Close LayerListForm 3)   ;;关闭对话框,带参数3
        (setq lyrl (dcl_ListBox_GetSelectedItems LayerList))
      )
      (dcl_MessageBox "请选择图层。" "晓东温馨提示" 2 3)
    )
  )

[/pcode]

7、主程序,因为我们要关闭对话框拾取实体确定图层,确定后,还要返回对话框,所以用了一个循环结构不断的循环,直到关闭对话框参数是3或者4的时候才结束循环,退出程序。

      下面代码是典型的处理临时关闭对话框,操作后再返回对话框的结构循环。


QQ截图20130515235035.png


[pcode=lisp,true]
  (setq lxd (dcl_Project_Load (*ODCL:Samples:FindFile "XDOB_DCL.odcl") t ))

    (setq doContinue T)
    (while doContinue
        ;; However, to avoid an endless loop, the condition for repeating the loop, must negate at first
        ;; The condition will be "activated" again after dcl_form_show for some cases.
        (setq doContinue nil)

        ;; if the dialog get closed, the function returns a value
        ;; This is 1 for OK (reserved value), 2 for ESC or Cancel (reserved value)
        ;; or the value, which was given to dcl_form_close
        (setq intResult (dcl_form_show LayerListForm))

        ;; This is a modal form, so (dcl_Form_Show) does not return until
        ;; the modal form is closed. In the meantime, the event handlers
        ;; manage the form.

        ;; Now the return value can be interpreted
        (cond

            ;; close-button
            ;; Here something can be done with the selected points ans objects
            ((= intResult 1) (setq doContinue nil))

            ;; ESC key
            ((= intResult 2) (setq doContinue nil))

            ;; point selection
            ((= intResult 3) (setq doContinue nil)  ;;结束循环
            )
            ((= intResult 4) (setq doContinue nil)  ;; 结束循环
            )
            ((= intResult 5)
               (setq $xdob_layer_hadlayerlist (xdrx_string_tok (point_selection) ","))  ;;拾取按钮时候进入这里处理,处理完因为条件不满足继续返回对话框
           )
        ); cond
    ); while

[/pcode]



程序的主要代码就上面那些了,通过这个程序可以学会如何处理临时关闭对话框,再打开的技巧和一些LISTBOX基本操作的技巧。


评分

参与人数 1威望 +1 D豆 +5 贡献 +1 收起 理由
牢固 + 1 + 5 + 1 很给力!经验;技术要点;资料分享奖!

查看全部评分

本帖被以下淘专辑推荐:

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 218个

财富等级: 日进斗金

发表于 2013-5-16 08:44:22 | 显示全部楼层
XD大哥 如果对xd工具箱不是很了解,这样是不是会麻烦一点
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2013-5-16 08:51:58 | 显示全部楼层
fkyourmather 发表于 2013-5-16 08:44
XD大哥 如果对xd工具箱不是很了解,这样是不是会麻烦一点

这个是OPENDCL,和晓东工具箱没关系。

另外,晓东工具箱只是你使用过的工具箱中的一个,你用它下面的工具只要知道菜单位置调用就得了,不需要你了解太多。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 218个

财富等级: 日进斗金

发表于 2013-5-16 11:44:55 | 显示全部楼层
XDSoft 发表于 2013-5-16 08:51
这个是OPENDCL,和晓东工具箱没关系。

另外,晓东工具箱只是你使用过的工具箱中的一个,你用它下面的 ...

因为我看到函数 好像都是用了内置的一些函数,所以理解会困难点
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2013-5-16 16:00:56 | 显示全部楼层
fkyourmather 发表于 2013-5-16 11:44
因为我看到函数 好像都是用了内置的一些函数,所以理解会困难点

因为是在用OPENDCL写对话框啊,就和你当初不会DCL一样,新东西要掌握需要学习啊。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3255个

财富等级: 富可敌国

发表于 2013-6-24 21:36:08 | 显示全部楼层
请问您  opendcl的函数在哪里可以查询到,我知道关于控件的属性、方法、事件等函数在哪里查询,但是 比如dcl_getversionex   这样的函数在哪里查询呀?

点评

OPENDCL STUDIO 里面,F1看帮助,都有。  详情 回复 发表于 2013-7-11 14:37
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2007个

财富等级: 金玉满堂

发表于 2013-6-25 20:54:41 | 显示全部楼层
wow nice thx for sharing
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-7-11 14:37:08 | 显示全部楼层
pengfei2010 发表于 2013-6-24 21:36
请问您  opendcl的函数在哪里可以查询到,我知道关于控件的属性、方法、事件等函数在哪里查询,但是 比如dc ...

OPENDCL STUDIO 里面,F1看帮助,都有。

点评

嗯 知道了 谢谢指点  详情 回复 发表于 2013-7-14 09:57
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3255个

财富等级: 富可敌国

发表于 2013-7-14 09:57:27 | 显示全部楼层
newer 发表于 2013-7-11 14:37
OPENDCL STUDIO 里面,F1看帮助,都有。

嗯 知道了  谢谢指点
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-2-18 15:29:28 | 显示全部楼层
感謝分享,謝謝~~~!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 55个

财富等级: 招财进宝

发表于 2014-3-9 16:39:52 | 显示全部楼层
还不会 先学习下。。多谢老大
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 117个

财富等级: 日进斗金

发表于 2014-4-27 10:03:20 | 显示全部楼层
感謝分享,謝謝~~~!
  
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-12-24 17:18:40 | 显示全部楼层
:L学习了,不错的东西。要好好学习,天天向上!:lol
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2015-1-21 16:55:14 | 显示全部楼层
不错不错,对学习很有帮助
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1026个

财富等级: 财源广进

发表于 2015-6-22 12:19:29 | 显示全部楼层
谢谢分享                 
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-5-15 14:43 , Processed in 0.481628 second(s), 70 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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