无痕 发表于 2007-6-19 03:43:00

easydcl 用lisp编辑调试dcl文件

本帖最后由 作者 于 2007-6-19 14:15:23 编辑 <br /><br /> <p>说明一下:</p><p>其实很早就想写这个东西,因为我特别不喜欢dcl。所以想偷懒一点,一劳永逸,不过一来对dcl很心烦,懒得钻研,二来时间都忙其他的了。</p><p>前两日 看到 fsxm 在qq群上说起这个想法,自己也来了劲头。昨天写了生成对话框的。今天fsxm在群上上传了他的作品,不但实现了用lisp生成dcl,而且返回对话框key的返回值。后者我觉得比较好,我原来没有想到的。所以在自己先前的程序上又加了这个功能。</p><p>虽然我先发布了。但是fsxm应该算这个构想的创意者。另,我们两个是分别写自己的核心程序的。在群上交流仅限于想法和测试用的程序。看到别人的一个想法,就能自己写出程序来--于诸君共勉。</p><p>(不知为什么,老上传不了程序,所以给了个链接, <a href="http://dreamskylxx.ys168.com/">http://dreamskylxx.ys168.com/</a> <a href="http://briefcase.tom.com/folder.php?directory_id=5631446"></a><strong>&nbsp;</strong>)</p>

jxphklibin 发表于 2007-6-19 13:14:00

<p>刀兄,其实这个想法,早在去年上半年的时候我就想了,只是刚刚开始学,尚不会,也没有去研究,现在经过了一年多的刻苦学习,已经有眉目,不过还没去弄,望刀兄能公布源码,以供大伙学习!&nbsp; ------小李子</p>

无痕 发表于 2007-6-19 14:25:00

本帖最后由 作者 于 2007-6-20 21:22:32 编辑

试试这个下载链接  http://dreamskylxx.ys168.com/ easydcl= lisp下dcl编辑调试工具
      格式: (easydcl 列表 保存文件名 调试开关)
      实例: (easydcl '(mydcl(l \"选择\" :oc)) \"c:/tmp.dcl\" T)
      列表规则:
      1.对话框名:dialog{ 内容 }   对应'(对话框名 (内容))
      2.内容:   {:组件 {属性1=值1;属性2=值2;...}} 对应:
                  (:组件 (属性1 值1 属性2 值2))
      3.dcl函数简写命令(如不用简写,可全字输入):
          3.1 单词均可输入头3个字母,如: act 对应 action
          3.2 连词可输入连词的首字母,如: el 对应 edit_limit
          3.3 组件前面加\":\" 号,如::col 对应 :column
          3.4 特殊简写(同时支持3.1条)
            a = actionc = colorh = heightk = key
            l = label   v = valuew = width   :B=:botton
            :c=:column:i=:image:t=:text    :r=:row
            :s=spacer   t = true
            特别: mxv=max_value mnv=min_value
      --------------------by 狂刀.2007.6.18--------------------
            狂刀博客: http://dreamskylxx.woku.com/      
      ---------------------------------------------------------

cnks 发表于 2007-6-19 18:23:00

传说中的无痕刀

狂刀无痕 发表于 2007-6-20 18:42:00

简单实例:
(defun c:tt3 ( / lst)
(setq
    lst
   '(mydialog
(l "多选项实例"
:s
(:bc
(l "方块"
(:tog (l"多选项1" k "t1"))
(:tog (l"多选项2" k "t2"))
(:tog (l"多选项3" k "t3"))
))
:s
:oc
       )
      )
)
(easydcl lst "c:/tmp1.dcl" T)
)生成效果:

vken7az2p 发表于 2007-6-21 06:36:00

<p>真是利害的程序</p><p>不知道版主可以讲一下编写的过程吗</p><p>让大家也可以了解一下</p><p>谢谢<br/></p>

龙龙仔 发表于 2007-6-21 17:14:00

本帖最后由 作者 于 2007-6-26 7:52:40 编辑 <br /><br /> <p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><b>MMMMMM</b><b>網友在</b><b>N</b><b>年前就寫好了</b><b>!<p></p></b></p><p></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><b>http://www.atablex.com/<p></p></b></p><p></p><p></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt;"><b>KozMos VLDCL System V3.5.70531</b></p>

飞诗(fsxm) 发表于 2007-6-21 22:51:00

<p>vldcl与dcl基本上格式全变了~</p><p>根本上就算不上是cad中的dcl~</p><p>就像我们从来不将objectdcl与CAD的dcl看作同一个东东~</p><p>&nbsp;</p><p>我们现在研究的是在lisp中实现cad原dcl的list表结构化~</p><p>通过对表的各种递归处理成CAD认识的dcl,</p><p>再用函数封装调用过程,智能收集到用户想要的结果作为结果返回~</p><p>我的本意是将action_till用函数自动封装成为与vba相类的“事件”</p><p>&nbsp;这是我用这种方法处理后的一个自动收集C:**函数的例子:</p><p></p><p></p>

飞诗(fsxm) 发表于 2007-6-21 23:12:00

上面的那个已打包好了可独立运行,
下面再发几个例子:

;;;这是程序的帮助文档,如有什么疑问可以随时查看帮助
;;;或通过我的fsxm.bokee.com发布你的疑问,我会尽快给你回复
(defun c:fsxm-listdcl-help (/ dcl)
(setq dcl
'("listdcl"
    (:dialog
   "spacer;spacer;"
   (label "listdcl(表对话框控制语言)help:")
   (:text (label "表对话框控制语言是对原DCL对话框的扩充!"))
   (:text (label "listdcl格式与DCL几乎相同"))
   (:text (label "你只需通过简单的实验即可学会它"))
   (:text (label "你可以通过lisp语言强大而灵活的表处理"))
   (:text (label "来控制DCL对话框的动态生成!"))
   (:text (label "并改变原DCL烦杂的调用过程,与交互操作"))
   (:text (label "成功模似出交互操作时的事件触发机制"))
   (:text (label "从而有效简化了DCL的编程难度!"))
   (:text (label "并对accept,cancel增加了预设事件"))
   (:text (label "预设事件即可以满足大量常用对话框的需求"))
   "spacer;"
   (:text
      (label "系统主函数: (fsxm-listdcl lst_listdcl str_userapp)")
   )
   (:text (label "初始化函数格式: _show:Initialize"))
   (:text (label "事件函数格式: _action:"))
   "spacer;"
   (:text (label "作者:fsxm") "alignment = centered;")
   (:text
      (label "博客:fsxm.bokee.com")
      (alignment centered)
   )
   (:text
      (label "email:licemn@yahoo.com.cn")
      (alignment centered)
   )
   "spacer;"
   "ok_only;"
    )
   )
)
(fsxm-listdcl dcl nil)
(princ)
)
;;;这是一个"Hello, world."的范例
(defun c:hello (/ listdcl return)
(setq listdcl
'("hello"
    (:dialog
   (label "Sample Dialog Box")
   (:text (label "Hello, world."))
   "ok_only;"
    )
   )
)
(fsxm-listdcl listdcl nil)
(princ)
)
;;;这是一个"密码对话框"的范例
(defun password (/ listdcl return)
(setq listdcl
'("password"
    (:dialog
   (label "需要你的验证:")
   (:edit_box
      (key "password")
      (label "密码:")
      (password_char "*")
   )
   "ok_cancel;"
    )
   )
)
(setq return (fsxm-listdcl listdcl nil))
(cdr (assoc "password" return))
)
;;这是autolisp&dcl基础编上的一个"按钮测试范例"
;;现在我用listdcl改写了它
(defun c:test (/      data    key   khh
      kww      listdcl    tt_action:ltt_action:x
      tt_action:v   tt_show:initialize
       )
(setq listdcl
'("dia5b"
    (:dialog
   (label "按钮测试范例")
   (:boxed_row
      (label "图形尺寸")
      (:edit_box (key "kww") (label "宽度ww") (edit_width 8))
      (:edit_box (key "khh") (label "高度hh") (edit_width 8))
   )
   (:button (key "L") (LabeL "绘制 - > L   形"))
   (:button (key "X") (LabeL "绘制 - > X   形"))
   (:button (key "V") (LabeL "绘制 - > 漏斗形"))
   "spacer;"
   "cancel_button;"
    )
   )
)
(defun tt_show:initialize ();初始化事件函数
    (set_tile "kww" "200")
    (set_tile "khh" "100")
)
(defun tt_action:L ()   ;按扭L的事件函数
    (setq kww (distof (get_tiLe "kww")))
    (setq khh (distof (get_tiLe "khh")))
    (if (and (> kww 0) (> khh 0))
      (return (list key kww khh))
      (alert "数据不对请更改!")
    )
    ;;key是由主函数fsxm-listdcl预设变量,
    ;;你可以在所有[事件函数]中访问到它的值
    ;;return也是主函数中封装的方法用来结束对话框返回值
)
(setq tt_action:X tt_action:L;按扭X的事件函数
tt_action:V tt_action:L;按扭V的事件函数
)
(fsxm-listdcl listdcl "tt")
)
;;这是autolisp&dcl基础编上的一个"toggle开关应用范例"
;;现在我用listdcl改写了它
(defun c:test2 (/ listdcl data myapp_show:Initialize)
(setq listdcl
'("toggle_dlg"
    (:dialog
   (label "轻松掌握toggle开关应用范例")
   (:boxed_column
      (label "重要开关设定")
      (:toggle (label "属性对话框输入") (key "attdia"))
      (:toggle (label "仅显示轮廓线") (key "dispsilh"))
      (:toggle (label "文字填满控制") (key "textfill"))
      (:toggle (label "对像填满控制") (key "fillmode"))
   )
   (:boxed_column
      (label "命令记录控制")
      (:toggle
       (label "命令记录开关")
       (key "logfilemode")
      )
      (:edit_box
       (label "记录文件(唯读)")
       (key "logfilename")
       (edit_width 30)
      )
   )
   "spacer_1;"
   "ok_cancel;"
    )
   )
)
(defun myapp_show:Initialize () ;初始化事件函数
    (foreach a '("attdia"   "dispsilh"    "textfill"
   "fillmode"   "logfilemode"    "logfilename"
)
      (set_tile a (vl-princ-to-string (getvar a)))
    )
)
(setq data (fsxm-listdcl listdcl "myapp"))
(cond (data
(foreach a '("attdia" "dispsilh" "textfill" "fillmode"
      "logfilemode")
    (setvar a (atoi (cdr (assoc a data))))
)
)
)
(princ)
)
;;这是autolisp&dcl基础编上的一个"redio_button单选按扭"应用范例"
;;现在我用listdcl改写了它
(defun c:test3 (/ listdcl insert_action:ins_ok insert_show:initialize)
(setq listdcl
'("redio_button_dlg"
    (:dialog
   "spacer;"
   (label "轻松掌握redio_button单选按扭")
   (:text
      (label "[插入带有属性的图块]")
      (alignment centered)
   )
   (:row
      (:boxed_radio_column
       (width 20)
       (label "设计者")
       (:radio_button (label "忍者神龟") (key "r1"))
       (:radio_button (label "小叮当") (key "r2"))
       (:radio_button (label "钟楼怪人") (key "r3"))
       (:radio_button (label "无敌铁金刚") (key "r4"))
      )
      (:boxed_radio_column
       (width 20)
       (label "比例")
       (:radio_button (label "1/1") (key "sc1-1"))
       (:radio_button (label "1/30") (key "sc1-30"))
       (:radio_button (label "1/50") (key "sc1-50"))
      )
   )
   (:edit_box
      (label "图档编号:")
      (key "dwgname")
      (edit_width 10)
      (edit_limit 10)
      (fixed_width ture)
   )
   "spacer_1;"
   (:row
      (fixed_width ture)
      (alignment centered)
      (:button (label "插入图块") (key "ins_ok") (width 8))
      (:spacer (width 2))
      "cancel_button;"
   )
    )
   )
)
(defun insert_show:Initialize () ;初始化事件函数
    (set_tile "r1" "1")
    (set_tile "sc1-1" "1")
    (set_tile "sc1-1" "1")
    (set_tile "dwgname" "fsxm")
)
(defun insert_action:ins_ok () ;ins_ok事件函数
    (if (/= (get_tile "dwgname") "")
      (accept)
      ;;accept为主函数fsxm-listdcl中
      ;;原本为accept按扭的预设事件
      ;;现在交给了ins_ok按扭
      (alert "图档编号不能为空!")
    )
)
(fsxm-listdcl listdcl "insert")
)
这个是listdcl的驱动程序:
如不能下载请到http://fsxm.ys168.com/下载!

mmmmmm 发表于 2007-6-22 09:39:00

<p>对于简单的对话框设计,这种方法是个好主意。但对于复杂的来说,就未必:</p><p>1: 除了在规划好DCL以外,还要认真处理复杂的层次列表,很容易LISP (Lost in Stupid Parenthesis)需要程序编制者来维护这一复杂的数据表。</p><p>2:事实上现在有许多直接辅助生成DCL的软件像ProtoBox等,已经很出色了。</p><p>3:VLX就能直接封装DCL源代码,程序在运行时临时生成文件,读取文件,再删除文件。实际上这些VLISP已经做了,而且相当不错。编程的重点应该在于操控DCL的代码而非DCL代码本身。而且DCL代码本身没有加密的必要,不存在按照VLISP标准封装后的泄密问题。当然,你要用动态变动的对话框,那另当别论。但事实是,你有多少机会会一定要用到动态变动的对话框呢?</p><p></p><p>VLDCL的DCL本身还是AutoCAD的标准DCL,同其他的没有差异,VLDCL提供的是高度集成化的控件操控函数,通过一个简单整齐的数据表来减少重复代码,事实上,在VLDCL的驱动下,程序代码中基本不会有一大堆的set_tile和action_tile,这些会由VLDCL在运行中自动执行,VLDCL是通过这样来简化代码的编程和维护。</p>
页: [1] 2
查看完整版本: easydcl 用lisp编辑调试dcl文件