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> </strong>)</p> <p>刀兄,其实这个想法,早在去年上半年的时候我就想了,只是刚刚开始学,尚不会,也没有去研究,现在经过了一年多的刻苦学习,已经有眉目,不过还没去弄,望刀兄能公布源码,以供大伙学习! ------小李子</p> 本帖最后由 作者 于 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/
---------------------------------------------------------
传说中的无痕刀 简单实例:
(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)
)生成效果:
<p>真是利害的程序</p><p>不知道版主可以讲一下编写的过程吗</p><p>让大家也可以了解一下</p><p>谢谢<br/></p> 本帖最后由 作者 于 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> <p>vldcl与dcl基本上格式全变了~</p><p>根本上就算不上是cad中的dcl~</p><p>就像我们从来不将objectdcl与CAD的dcl看作同一个东东~</p><p> </p><p>我们现在研究的是在lisp中实现cad原dcl的list表结构化~</p><p>通过对表的各种递归处理成CAD认识的dcl,</p><p>再用函数封装调用过程,智能收集到用户想要的结果作为结果返回~</p><p>我的本意是将action_till用函数自动封装成为与vba相类的“事件”</p><p> 这是我用这种方法处理后的一个自动收集C:**函数的例子:</p><p></p><p></p> 上面的那个已打包好了可独立运行,
下面再发几个例子:
;;;这是程序的帮助文档,如有什么疑问可以随时查看帮助
;;;或通过我的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/下载!
<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