明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6124|回复: 17

easydcl 用lisp编辑调试dcl文件

  [复制链接]
发表于 2007-6-19 03:43:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2007-6-19 14:15:23 编辑

说明一下:

其实很早就想写这个东西,因为我特别不喜欢dcl。所以想偷懒一点,一劳永逸,不过一来对dcl很心烦,懒得钻研,二来时间都忙其他的了。

前两日 看到 fsxm 在qq群上说起这个想法,自己也来了劲头。昨天写了生成对话框的。今天fsxm在群上上传了他的作品,不但实现了用lisp生成dcl,而且返回对话框key的返回值。后者我觉得比较好,我原来没有想到的。所以在自己先前的程序上又加了这个功能。

虽然我先发布了。但是fsxm应该算这个构想的创意者。另,我们两个是分别写自己的核心程序的。在群上交流仅限于想法和测试用的程序。看到别人的一个想法,就能自己写出程序来--于诸君共勉。

(不知为什么,老上传不了程序,所以给了个链接, http://dreamskylxx.ys168.com/  

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2007-6-19 13:14:00 | 显示全部楼层

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

 楼主| 发表于 2007-6-19 14:25:00 | 显示全部楼层
本帖最后由 作者 于 2007-6-20 21:22:32 编辑

试试这个下载链接  http://dreamskylxx.ys168.com/
  1. easydcl= lisp下dcl编辑调试工具
  2.       格式: (easydcl 列表 保存文件名 调试开关)
  3.       实例: (easydcl '(mydcl(l "选择" :oc)) "c:/tmp.dcl" T)
  4.       列表规则:
  5.         1.对话框名:dialog{ 内容 }   对应  '(对话框名 (内容))
  6.         2.内容:   {:组件 {属性1=值1;属性2=值2;...}} 对应:
  7.                   (:组件 (属性1 值1 属性2 值2))
  8.         3.dcl函数简写命令(如不用简写,可全字输入):
  9.           3.1 单词均可输入头3个字母,如: act 对应 action
  10.           3.2 连词可输入连词的首字母,如: el 对应 edit_limit
  11.           3.3 组件前面加":" 号,如:  :col 对应 :column
  12.           3.4 特殊简写(同时支持3.1条)
  13.               a = action  c = color  h = height  k = key
  14.               l = label   v = value  w = width   :B=:botton
  15.               :c=:column  :i=:image  :t=:text    :r=:row
  16.               :s=spacer   t = true
  17.               特别: mxv=max_value mnv=min_value
  18.         --------------------by 狂刀.2007.6.18--------------------
  19.             狂刀博客: http://dreamskylxx.woku.com/      
  20.         ---------------------------------------------------------
发表于 2007-6-19 18:23:00 | 显示全部楼层
传说中的无痕刀
发表于 2007-6-20 18:42:00 | 显示全部楼层
简单实例:
  1. (defun c:tt3 ( / lst)
  2.   (setq
  3.     lst
  4.      '(mydialog
  5. (l "多选项实例"
  6. :s
  7. (:bc
  8.   (l "方块"
  9.   (:tog (l"多选项1" k "t1"))
  10.   (:tog (l"多选项2" k "t2"))
  11.   (:tog (l"多选项3" k "t3"))
  12.   ))
  13. :s
  14. :oc
  15.        )
  16.       )
  17.   )
  18.   (easydcl lst "c:/tmp1.dcl" T)
  19. )
生成效果:

本帖子中包含更多资源

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

x
发表于 2007-6-21 06:36:00 | 显示全部楼层

真是利害的程序

不知道版主可以讲一下编写的过程吗

让大家也可以了解一下

谢谢

发表于 2007-6-21 17:14:00 | 显示全部楼层
本帖最后由 作者 于 2007-6-26 7:52:40 编辑

MMMMMM網友在N年前就寫好了!

http://www.atablex.com/

KozMos VLDCL System V3.5.70531

发表于 2007-6-21 22:51:00 | 显示全部楼层

vldcl与dcl基本上格式全变了~

根本上就算不上是cad中的dcl~

就像我们从来不将objectdcl与CAD的dcl看作同一个东东~

 

我们现在研究的是在lisp中实现cad原dcl的list表结构化~

通过对表的各种递归处理成CAD认识的dcl,

再用函数封装调用过程,智能收集到用户想要的结果作为结果返回~

我的本意是将action_till用函数自动封装成为与vba相类的“事件”

 这是我用这种方法处理后的一个自动收集C:**函数的例子:

本帖子中包含更多资源

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

x
发表于 2007-6-21 23:12:00 | 显示全部楼层
上面的那个已打包好了可独立运行,
下面再发几个例子:
  1. ;;;这是程序的帮助文档,如有什么疑问可以随时查看帮助
  2. ;;;或通过我的fsxm.bokee.com发布你的疑问,我会尽快给你回复
  3. (defun c:fsxm-listdcl-help (/ dcl)
  4.   (setq dcl
  5.   '("listdcl"
  6.     (:dialog
  7.      "spacer;spacer;"
  8.      (label "listdcl(表对话框控制语言)help:")
  9.      (:text (label "表对话框控制语言是对原DCL对话框的扩充!"))
  10.      (:text (label "listdcl格式与DCL几乎相同"))
  11.      (:text (label "你只需通过简单的实验即可学会它"))
  12.      (:text (label "你可以通过lisp语言强大而灵活的表处理"))
  13.      (:text (label "来控制DCL对话框的动态生成!"))
  14.      (:text (label "并改变原DCL烦杂的调用过程,与交互操作"))
  15.      (:text (label "成功模似出交互操作时的事件触发机制"))
  16.      (:text (label "从而有效简化了DCL的编程难度!"))
  17.      (:text (label "并对accept,cancel增加了预设事件"))
  18.      (:text (label "预设事件即可以满足大量常用对话框的需求"))
  19.      "spacer;"
  20.      (:text
  21.       (label "系统主函数: (fsxm-listdcl lst_listdcl str_userapp)")
  22.      )
  23.      (:text (label "初始化函数格式: [userapp]_show:Initialize"))
  24.      (:text (label "事件函数格式: [userapp]_action:[key]"))
  25.      "spacer;"
  26.      (:text (label "作者:fsxm") "alignment = centered;")
  27.      (:text
  28.       (label "博客:fsxm.bokee.com")
  29.       (alignment centered)
  30.      )
  31.      (:text
  32.       (label "email:licemn@yahoo.com.cn")
  33.       (alignment centered)
  34.      )
  35.      "spacer;"
  36.      "ok_only;"
  37.     )
  38.    )
  39.   )
  40.   (fsxm-listdcl dcl nil)
  41.   (princ)
  42. )
  43. ;;;这是一个"Hello, world."的范例
  44. (defun c:hello (/ listdcl return)
  45.   (setq listdcl
  46.   '("hello"
  47.     (:dialog
  48.      (label "Sample Dialog Box")
  49.      (:text (label "Hello, world."))
  50.      "ok_only;"
  51.     )
  52.    )
  53.   )
  54.   (fsxm-listdcl listdcl nil)
  55.   (princ)
  56. )
  57. ;;;这是一个"密码对话框"的范例
  58. (defun password (/ listdcl return)
  59.   (setq listdcl
  60.   '("password"
  61.     (:dialog
  62.      (label "需要你的验证:")
  63.      (:edit_box
  64.       (key "password")
  65.       (label "密码:")
  66.       (password_char "*")
  67.      )
  68.      "ok_cancel;"
  69.     )
  70.    )
  71.   )
  72.   (setq return (fsxm-listdcl listdcl nil))
  73.   (cdr (assoc "password" return))
  74. )
  75. ;;这是autolisp&dcl基础编上的一个"按钮测试范例"
  76. ;;现在我用listdcl改写了它
  77. (defun c:test (/      data    key   khh
  78.         kww      listdcl    tt_action:l  tt_action:x
  79.         tt_action:v   tt_show:initialize
  80.        )
  81.   (setq listdcl
  82.   '("dia5b"
  83.     (:dialog
  84.      (label "按钮测试范例")
  85.      (:boxed_row
  86.       (label "图形尺寸")
  87.       (:edit_box (key "kww") (label "宽度ww") (edit_width 8))
  88.       (:edit_box (key "khh") (label "高度hh") (edit_width 8))
  89.      )
  90.      (:button (key "L") (LabeL "绘制 - > L   形"))
  91.      (:button (key "X") (LabeL "绘制 - > X   形"))
  92.      (:button (key "V") (LabeL "绘制 - > 漏斗形"))
  93.      "spacer;"
  94.      "cancel_button;"
  95.     )
  96.    )
  97.   )
  98.   (defun tt_show:initialize ()  ;初始化事件函数
  99.     (set_tile "kww" "200")
  100.     (set_tile "khh" "100")
  101.   )
  102.   (defun tt_action:L ()   ;按扭L的事件函数
  103.     (setq kww (distof (get_tiLe "kww")))
  104.     (setq khh (distof (get_tiLe "khh")))
  105.     (if (and (> kww 0) (> khh 0))
  106.       (return (list key kww khh))
  107.       (alert "数据不对请更改!")
  108.     )
  109.     ;;key是由主函数fsxm-listdcl预设变量,
  110.     ;;你可以在所有[事件函数]中访问到它的值
  111.     ;;return也是主函数中封装的方法用来结束对话框返回值
  112.   )
  113.   (setq tt_action:X tt_action:L  ;按扭X的事件函数
  114. tt_action:V tt_action:L  ;按扭V的事件函数
  115.   )
  116.   (fsxm-listdcl listdcl "tt")
  117. )
  118. ;;这是autolisp&dcl基础编上的一个"toggle开关应用范例"
  119. ;;现在我用listdcl改写了它
  120. (defun c:test2 (/ listdcl data myapp_show:Initialize)
  121.   (setq listdcl
  122.   '("toggle_dlg"
  123.     (:dialog
  124.      (label "轻松掌握toggle开关应用范例")
  125.      (:boxed_column
  126.       (label "重要开关设定")
  127.       (:toggle (label "[attdia]属性对话框输入") (key "attdia"))
  128.       (:toggle (label "[dispsilh]仅显示轮廓线") (key "dispsilh"))
  129.       (:toggle (label "[textfill]文字填满控制") (key "textfill"))
  130.       (:toggle (label "[fillmode]对像填满控制") (key "fillmode"))
  131.      )
  132.      (:boxed_column
  133.       (label "命令记录控制")
  134.       (:toggle
  135.        (label "[logfilemode]命令记录开关")
  136.        (key "logfilemode")
  137.       )
  138.       (:edit_box
  139.        (label "记录文件(唯读)")
  140.        (key "logfilename")
  141.        (edit_width 30)
  142.       )
  143.      )
  144.      "spacer_1;"
  145.      "ok_cancel;"
  146.     )
  147.    )
  148.   )
  149.   (defun myapp_show:Initialize () ;初始化事件函数
  150.     (foreach a '("attdia"   "dispsilh"    "textfill"
  151.    "fillmode"   "logfilemode"    "logfilename"
  152.   )
  153.       (set_tile a (vl-princ-to-string (getvar a)))
  154.     )
  155.   )
  156.   (setq data (fsxm-listdcl listdcl "myapp"))
  157.   (cond (data
  158.   (foreach a '("attdia" "dispsilh" "textfill" "fillmode"
  159.         "logfilemode")
  160.     (setvar a (atoi (cdr (assoc a data))))
  161.   )
  162. )
  163.   )
  164.   (princ)
  165. )
  166. ;;这是autolisp&dcl基础编上的一个"redio_button单选按扭"应用范例"
  167. ;;现在我用listdcl改写了它
  168. (defun c:test3 (/ listdcl insert_action:ins_ok insert_show:initialize)
  169.   (setq listdcl
  170.   '("redio_button_dlg"
  171.     (:dialog
  172.      "spacer;"
  173.      (label "轻松掌握redio_button单选按扭")
  174.      (:text
  175.       (label "[插入带有属性的图块]")
  176.       (alignment centered)
  177.      )
  178.      (:row
  179.       (:boxed_radio_column
  180.        (width 20)
  181.        (label "设计者")
  182.        (:radio_button (label "忍者神龟") (key "r1"))
  183.        (:radio_button (label "小叮当") (key "r2"))
  184.        (:radio_button (label "钟楼怪人") (key "r3"))
  185.        (:radio_button (label "无敌铁金刚") (key "r4"))
  186.       )
  187.       (:boxed_radio_column
  188.        (width 20)
  189.        (label "比例")
  190.        (:radio_button (label "1/1") (key "sc1-1"))
  191.        (:radio_button (label "1/30") (key "sc1-30"))
  192.        (:radio_button (label "1/50") (key "sc1-50"))
  193.       )
  194.      )
  195.      (:edit_box
  196.       (label "图档编号:")
  197.       (key "dwgname")
  198.       (edit_width 10)
  199.       (edit_limit 10)
  200.       (fixed_width ture)
  201.      )
  202.      "spacer_1;"
  203.      (:row
  204.       (fixed_width ture)
  205.       (alignment centered)
  206.       (:button (label "插入图块") (key "ins_ok") (width 8))
  207.       (:spacer (width 2))
  208.       "cancel_button;"
  209.      )
  210.     )
  211.    )
  212.   )
  213.   (defun insert_show:Initialize () ;初始化事件函数
  214.     (set_tile "r1" "1")
  215.     (set_tile "sc1-1" "1")
  216.     (set_tile "sc1-1" "1")
  217.     (set_tile "dwgname" "fsxm")
  218.   )
  219.   (defun insert_action:ins_ok () ;ins_ok事件函数
  220.     (if (/= (get_tile "dwgname") "")
  221.       (accept)
  222.       ;;accept为主函数fsxm-listdcl中
  223.       ;;原本为accept按扭的预设事件
  224.       ;;现在交给了ins_ok按扭
  225.       (alert "图档编号不能为空!")
  226.     )
  227.   )
  228.   (fsxm-listdcl listdcl "insert")
  229. )
这个是listdcl的驱动程序:
如不能下载请到http://fsxm.ys168.com/下载!

本帖子中包含更多资源

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

x
发表于 2007-6-22 09:39:00 | 显示全部楼层

对于简单的对话框设计,这种方法是个好主意。但对于复杂的来说,就未必:

1: 除了在规划好DCL以外,还要认真处理复杂的层次列表,很容易LISP (Lost in Stupid Parenthesis)需要程序编制者来维护这一复杂的数据表。

2:事实上现在有许多直接辅助生成DCL的软件像ProtoBox等,已经很出色了。

3:VLX就能直接封装DCL源代码,程序在运行时临时生成文件,读取文件,再删除文件。实际上这些VLISP已经做了,而且相当不错。编程的重点应该在于操控DCL的代码而非DCL代码本身。而且DCL代码本身没有加密的必要,不存在按照VLISP标准封装后的泄密问题。当然,你要用动态变动的对话框,那另当别论。但事实是,你有多少机会会一定要用到动态变动的对话框呢?

VLDCL的DCL本身还是AutoCAD的标准DCL,同其他的没有差异,VLDCL提供的是高度集成化的控件操控函数,通过一个简单整齐的数据表来减少重复代码,事实上,在VLDCL的驱动下,程序代码中基本不会有一大堆的set_tile和action_tile,这些会由VLDCL在运行中自动执行,VLDCL是通过这样来简化代码的编程和维护。

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-28 01:37 , Processed in 0.210430 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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