找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 8510|回复: 26

[教学] OpenDCL停靠窗口设计的演示-晓东工具箱快捷命令、常用命令

[复制链接]

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-4-19 00:13:01 | 显示全部楼层 |阅读模式

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

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

×


在这个帖子里面以晓东工具箱-快捷命令和常用命令为例,讲下OpenDCL停靠窗口的设计。

不多说,上演示







评分

参与人数 3威望 +6 D豆 +15 贡献 +6 收起 理由
tigcat + 5 很给力!经验;技术要点;资料分享奖!
Highflybird + 3 + 5 + 3
牢固 + 3 + 5 + 3 完美的对话框设计!完美的演示!

查看全部评分

本帖被以下淘专辑推荐:

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

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2013-4-19 00:32:25 | 显示全部楼层
1、Control Bar 设计的时候注意一个就是停靠的位置选择好,这里选的是Left+Right

QQ截图20130419002500.png         



2、事件里面勾选了"DocActivated" "EnteringNoDocState" "Initialize"


QQ截图20130419002622.png

      2.1) 事件"DocActivated" 处理代码:

[pcode=lisp,true]
  (defun c:FastMenu2_OnDocActivated (/)  ;;ACAD在多窗口运行下,新图形打开后回调此事件。
    (c:FastMenu2_OnInitialize)    ;新窗口打开后执行初始化,否则命令不能用。
    (princ)
  )
[/pcode]

      2.2) 事件"EnteringNoDocState" 处理代码:

[pcode=lisp,true]
   (defun c:FastMenu2_OnEnteringNoDocState (/) ;;ACAD在多窗口运行下,所有图形窗口关闭时回调此事件。
    (dcl_Form_Close FastMenu2) ;;销毁停靠窗口对话框
  )
[/pcode]

      2.3) 事件"Initialize" 处理代码:

    几乎所有的对话框设计都要响应Initialize事件,在对话框加载成功后初始化数据。

[pcode=lisp,true]
(defun c:FastMenu2_OnInitialize (/)
  (setq $XD_CCommandList ($XDLSP_CCOMMANDSLIST_DATA))
  (setq i 1
        h1 22
        h2 2
  )
  (foreach n $XD_CCommandList
    (setq cmdname (car n)
          func (strcase (cadr n))
    )
    (setq cname1 (strcat "CMD-" (itoa i)))
    (setq _FastMenu_Cname (eval (read cname1)));eval函数的用法
    (dcl_Control_SetEnabled _FastMenu_Cname t);;按钮设置可用
    (dcl_Control_SetVisible _FastMenu_Cname t);;按钮设置可见
    (dcl_Control_SetCaption _FastMenu_Cname cmdname) ;;给按钮设置Caption

    (dcl_Control_SetPos _FastMenu_Cname 24 (+ 24 (* (1- i) (+ h2 h1))) 80 h1)

    (dcl_Control_SetEventInvoke _FastMenu_Cname 1)
    (setq funcname (strcat "c:" cname1 "_OnClicked"));处理OnClicked事件的回调函数
    (setq i (1+ i))
    (dcl_Control_SetProperty _FastMenu_Cname "Clicked" funcname) ;设置点按钮执行命令时候,该按钮要执行的函数。
    (if (xdrx_string_find func "XDTB_")
      (setq func (strcase (substr func 6)))
      (setq func (strcase func))
    )
    (setq name (strcat "XD:" func "\n"))
    (setq name1 (strcat "(dcl_sendstring \"" name "\")\n"))  ;;dcl_sendstring 是常用的一个函数,向命令行窗口发送字符串命令执行。
    (setq func1 (strcat "(defun " funcname " () " name1 ")"))
    (eval (read func1))
  )
  (setq l (- 11 i)) ;从执行过的命令堆栈中取最多最近的10个命令,不够的按钮位置设置不可见、不可用。
  (repeat l
    (setq cname1 (strcat "CMD-" (itoa i)))
    (dcl_Control_SetEnabled (eval (read cname1)) nil)
    (dcl_Control_SetVisible (eval (read cname1)) nil)
    (setq i (1+ i))
  ) ;|
|;
  (setq i 1
        h1 22
        h2 2
  )
  (setq len (length $XD:LastCommandListStack)) ;;命令堆栈长度
  (setq _templ $XD:LastCommandListStack)
  (if (> len 10)  ;;取出堆栈最上面的10个命令。
    (progn
      (setq _templ (reverse (cdr (member (nth 10 $XD:LastCommandListStack)
                                         (reverse $XD:LastCommandListStack)
                                 )
                            )
                   )
      )
    )
  )
  (foreach n _templ
    (setq _CMD1 n
          V (assoc _CMD1 $XD:CCommandContrastList)
          cmdname (cadr v)
          func (strcase (caddr v))
    )
    (setq cname1 (strcat "LASTCMD-" (itoa i)))
    (setq _FastMenu_Cname (eval (read cname1)))
    (dcl_Control_SetEnabled _FastMenu_Cname t)
    (dcl_Control_SetVisible _FastMenu_Cname t)
    (dcl_Control_SetCaption _FastMenu_Cname cmdname)

    (dcl_Control_SetPos _FastMenu_Cname 24 (+ 350 (* (1- i) (+ h2 h1))) 80 h1)

    (dcl_Control_SetEventInvoke _FastMenu_Cname 1)
    (setq funcname (strcat "c:" cname1 "_OnClicked"))
    (dcl_Control_SetProperty _FastMenu_Cname "Clicked" funcname)
    (setq name _CMD1)
    (setq name1 (strcat "(dcl_sendstring \"" name "\n\")"))
    (setq func1 (strcat "(defun " funcname " () " name1 ")"))
    (eval (read func1))
    (setq i (1+ i))
  )
  (setq l (- 11 i))
  (repeat l
    (setq cname1 (strcat "LASTCMD-" (itoa i)))
    (dcl_Control_SetEnabled (eval (read cname1)) nil)
    (dcl_Control_SetVisible (eval (read cname1)) nil)
    (setq i (1+ i))
  )

  (princ)
)
[/pcode]



3、预先分别设计好10个按钮,设置不可见状态。



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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2013-4-19 01:23:42 | 显示全部楼层
主程序就下面几行,ODCL的程序非常结构化,主程序里面就是几个事件的处理,代码量都在事件处理的具体函数中。

[pcode=lisp,true]
(defun c:XDTB_FASTMENU ()
  (defun c:FastMenu2_OnDocActivated (/)
    (c:FastMenu2_OnInitialize)
    (princ)
  )
  (defun c:FastMenu2_OnEnteringNoDocState (/)
    (dcl_Form_Close FastMenu2)
  )
  (defun c:Update_OnClicked (/)
    (c:FastMenu2_OnInitialize)
    (princ)
  )
  (defun c:CCommandSetup_OnClicked (/)    ;;这个就是那个“设置”按钮点下要执行的命令。
    (dcl_sendstring "XD:CommandMenu\n")
  )
  (Xdrx_Begin)
  (Command "_Opendcl")  ;;保证ODCL核心加载。
  ($XDOB_DCL_KO_DockedBar "FastMenu2")  ;; 这个函数是一个技巧,不能让停靠窗口无限多的都显示,该函数销毁其他所有当前激活的停靠窗口,在下面贴这个函数。
  (Setq Lxd (Dcl_Project_Load (*Odcl:Samples:Findfile "Xdob_Layerassistant.Odcl")))
;|Dcl_Project_Load 函数有参数,加T强制重新加载对话框设计数据,否则只加载一次。在设计调试时候一般都带T参数,实时看到变化,很多初学者忘记这个参数,一直找不到为什么调整后对话框的不更新的原因。\;
  (Dcl_Form_Show FastMenu2)
  (Xdrx_End)
  (Xdrx_Sysvar_Pop)
  (Gc)
  (Gc)
  (Princ)
)[/pcode]

Dcl_Project_Load 函数用法(点图片放大):

QQ截图20130419013110.png

KO不希望继续运行的停靠对话框。

[pcode=lisp,true]
(defun $XDOB_DCL_KO_DockedBar (str / n $XDTB_GLOBAL_DCL_DockedBarList ctrn)
  (setq $XDTB_GLOBAL_DCL_DockedBarList '("LayerBar" "FastMenu2"
         "SUNA1"
        )
  );;这个表里面是你想销毁的停靠对话框。
  (foreach n $XDTB_GLOBAL_DCL_DockedBarList
    (setq ctrn (eval (read n)))
    (if (and
          (/= (strcase n) (strcase str))
          (dcl_Form_IsActive ctrn);;判断对话框当前是否激活。
        )
      (dcl_Form_Close ctrn);;KO它们。
    )
  )
  (princ)
)[/pcode]




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

使用道具 举报

已领礼包: 1742个

财富等级: 堆金积玉

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

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-4-19 11:00:48 | 显示全部楼层
老大,这真实用LISP写的吗?{:soso_e179:}叹为观止,颠覆了我对DCL的印象啊。另外,快捷命令添加那个地方,是程序执行完就自动加到菜单里面的吗?用的啥技术?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-4-19 11:49:46 | 显示全部楼层

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2013-4-19 12:12:04 | 显示全部楼层
牢固 发表于 2013-4-19 11:49
快捷命令可以存储在文件里,也可以储存在注册表里!

他问的应该是下面的“最近命令”, 这个不是, 最近命令 是根据 自己运行的命令,实时加入到菜单里面的。要不也不能符合每个人的需要了。

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2013-4-19 12:13:09 | 显示全部楼层
Lispboy 发表于 2013-4-19 11:00
老大,这真实用LISP写的吗?叹为观止,颠覆了我对DCL的印象啊。另外,快捷命令添加那个地方, ...

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

使用道具 举报

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2013-4-21 01:15:49 | 显示全部楼层
arken 发表于 2013-4-21 01:09
奇怪,怎么我看不到视频?

你用的IE高版本吧,看看安全设置。或者换个其他的浏览器试试,比如360,我用的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2688个

财富等级: 家财万贯

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

使用道具 举报

已领礼包: 1975个

财富等级: 堆金积玉

发表于 2013-5-7 20:32:49 | 显示全部楼层
dear sir,

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

使用道具 举报

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

使用道具 举报

已领礼包: 74个

财富等级: 招财进宝

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 17:47 , Processed in 0.399718 second(s), 65 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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