乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 63|回复: 5

[编程交流] Dcl对话框到lisp

[复制链接]

4

主题

14

帖子

10

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-5 16:57:31 | 显示全部楼层 |阅读模式
大家好!
我正在尝试为一个小程序制作DSL对话。
DCL:
  1. perfsuff: dialog {
  2.                        label = "PF";
  3.          : boxed_column
  4.          {             label = "--< Add >--";
  5.          : edit_box
  6.          {
  7.                        label = "Type prefix:";
  8.                        key = "pre";
  9.                        value = "";
  10.                        edit_width = 10;}
  11.          : edit_box
  12.          {
  13.                        label = "Type suffix:";
  14.                        key = "suf";
  15.                        value = "";
  16.                        edit_width = 10;}
  17.          : spacer
  18.          {height = 0.5;}}
  19.          ok_cancel;
  20.          }

Lisp程序:
  1. (defun c:perfsuff (/ prefiks-txt sufiks-txt spisok znach i)
  2. (initget 1)
  3. (setq prefiks-txt (getstring T "prefix: "))
  4. (initget 1)
  5. (setq sufiks-txt (getstring T "suffix: "))
  6. (princ)
  7. (setq spisok (ssget '((0 . "*text"))))
  8. (setq i 0)
  9. (while (< i (sslength spisok))
  10. (setq znach (entget (ssname spisok i)))
  11. (setq soderzhimoe (cons 1 (strcat prefiks-txt (cdr (assoc 1 znach)) sufiks-txt)))
  12. (setq znach (subst soderzhimoe (assoc 1 znach) znach))
  13. (entmod znach)
  14. (setq i (1+ i))
  15. )
  16. (princ)
  17. )
  18. (c:perfsuff)

我得到了这样的结果:
  1. (defun c:perfsuff (/ prefiks-txt sufiks-txt spisok znach i)
  2. (if (< (setq num (load_dialog "perfsuff")) 0) (exit))
  3. (if (not (new_dialog "perfsuff" num)) (exit))
  4. (action_tile "pre" "(setq rad1 (atof $value))")
  5. (terpri)
  6. (princ prefiks-txt)
  7. (action_tile "suf" "(setq rad1 (atof $value))")
  8. (terpri)
  9. (princ sufiks-txt)
  10. (terpri)
  11. (start_dialog)
  12. (unload_dialog num)
  13. (setq spisok (ssget '((0 . "*text"))))
  14. (setq i 0)
  15. (while (< i (sslength spisok))
  16. (setq znach (entget (ssname spisok i)))
  17. (setq soderzhimoe (cons 1 (strcat prefiks-txt (cdr (assoc 1 znach)) sufiks-txt)))
  18. (setq znach (subst soderzhimoe (assoc 1 znach) znach))
  19. (entmod znach)
  20. (setq i (1+ i))
  21. )
  22. (princ)
  23. )
  24. (c:perfsuff)

但是程序不工作,请告诉我哪里出错了?
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:16:34 | 显示全部楼层
几个问题
pre和suf均设置值rad1
prefiks txt是最后一篇文章中的零值
 
看一看,这是一个多行dcl,有你喜欢的行数。例如,对于代码中的2行,它返回变量Key1 key2作为字符串等
 
  1. ; multi line dcl
  2. ; sample code a 2 line example
  3. ; By Alan H
  4. ; use these two next lines in your code all thats required.
  5. ; (if (not AH:getkeys)(load "getvals2"))
  6. ;(AH:getkeys (list "Enter prefix " 5 4 "Enter suffix " 5 4 ))
  7. ; returns key1 key2 etc
  8. (princ "Getvals2 loaded")
  9. (defun AH:getkeys (INFO / fo fname newlst num x y klist)
  10. ; you can hard code a directory if you like for dcl file
  11. ;(setq fo (open (setq fname (vl-filename-mktemp "" "" ".dcl")) "w"))
  12. (setq fo (open (setq fname "c:\\acadtemp\\getkeys.dcl") "w"))
  13. (write-line "ddgetkey : dialog {" fo)
  14. (write-line " : column {" fo)
  15. (setq num (/ (length info) 3))
  16. (setq x 1)
  17. (repeat num
  18. (setq klist (cons (strcat "key" (rtos x 2 0)) klist))
  19. (setq x (+ 1 x))
  20. )
  21. (setq x 1)
  22. (setq y 1)
  23. (repeat num
  24. (write-line ": edit_box {" fo)
  25. (write-line (strcat "    key = "  (chr 34) (strcat "key" (rtos y 2 0)) (chr 34) ";") fo)
  26. (write-line (strcat " label = "  (chr 34) (nth (- x 1) info) (chr 34) ";"  )   fo)
  27. (write-line (strcat "     edit_width = " (rtos (nth x info) 2 0) ";" ) fo)
  28. (write-line (strcat "     edit_limit = " (rtos (nth (+ x 1) info) 2 0) ";" ) fo)
  29. (write-line "   is_enabled = true;" fo)
  30. (write-line "  }" fo)
  31. (write-line "spacer_1 ;" fo)
  32. (setq x (+ x 3))
  33. (setq y (+ y 1))
  34. )
  35. (write-line "  }" fo)
  36. (write-line "ok_only;}" fo)
  37. (close fo)
  38. (setq x 1)
  39. (setq outlst '())
  40. (setq dcl_id (load_dialog  fname))
  41. (if (not (new_dialog "ddgetkey" dcl_id))
  42. (exit))
  43. (foreach k klist
  44.      (action_tile k (strcat "(setq " k " (get_tile "" k ""))"))
  45. )
  46. (action_tile "accept" "(done_dialog 1)")
  47. (action_tile "cancel" "(done_dialog 0)")
  48. (setq action (start_dialog))
  49. (unload_dialog dcl_id)
  50. ) ; defun
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 17:25:48 | 显示全部楼层
我也对dcl lisp连接感兴趣,但我一直在从编辑框中获取值:
 
  1. (defun C:test ( / LstDCL FpathWithFname fileDCL dcl_id dlgRtn Prefix$ Suffix$)
  2. (setq LstDCL
  3.         (list
  4.                 "PrefSuff : dialog"
  5.                 "{"
  6.                 "label = "PF";"
  7.                 ": boxed_column"
  8.                 "{"
  9.                 "label = "--< Add >--";"
  10.                 ": edit_box"
  11.                 "{"
  12.                 "label = "Type prefix:";"
  13.                 "key = "pre";"
  14.                 "edit_width = 10;"
  15.                 "}"
  16.                 ": edit_box"
  17.                 "{"
  18.                 "label = "Type suffix:";"
  19.                 "key = "suf";"
  20.                 "edit_width = 10;"
  21.                 "}"
  22.                 ": spacer"
  23.                 "{height = 0.5;}"
  24.                 "}"
  25.                 "ok_cancel;"
  26.                 "}"
  27.         ); list
  28. ); setq LstDCL
  29. (setq FpathWithFname (vl-filename-mktemp nil nil ".dcl")); studied from LM
  30. (setq fileDCL (open FpathWithFname "w"))
  31. (foreach x LstDCL (write-line x fileDCL))
  32. (close fileDCL)
  33. ; Load Dialog
  34. (setq dcl_id (load_dialog FpathWithFname))
  35. (and (not (new_dialog "PrefSuff" dcl_id))(exit))
  36. [color="red"]; UNCLEAR what to do below:
  37. ; Set Dialog Initial Settings
  38. (set_tile "pre" Prefix$)
  39. (set_tile "suf" Suffix$)
  40. ; Dialog Actions
  41. (action_tile "pre" "(setq Prefix$ $value)")
  42. (action_tile "suf" "(setq Suffix$ $value)")
  43. (if (setq dlgRtn (start_dialog))
  44.         (progn
  45.                 (cond
  46.                         ((= 1 dlgRtn) ; ok was pressed
  47.                                 (alert (vl-princ-to-string Prefix$))
  48.                                 (alert (vl-princ-to-string Suffix$))
  49.                                 (done_dialog)
  50.                         )
  51.                         ((= 0 dlgRtn) ; cancel was pressed
  52.                                 (done_dialog)
  53.                         )
  54.                 )
  55.                 ; Unload Dialog
  56.                 (unload_dialog dcl_id)
  57.                 (vl-file-delete FpathWithFname)
  58.         ); progn
  59. ); if[/color]
  60. (princ)
  61. );| defun |; (vl-load-com) (princ)

不知道在代码的红色部分到底要做什么,有什么帮助吗?
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:35:08 | 显示全部楼层
考虑以下示例:
[code][颜色=绿色];;前缀/后缀文本-Lee Mac 2016-11-26(defunc:ps(/*error*dch dcl des enx idx pre sel str suf)(
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 17:51:04 | 显示全部楼层
你让事情看起来很简单,我不知道还能说什么。
赞美
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:59:31 | 显示全部楼层
 
非常感谢。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-13 13:01 , Processed in 0.952119 second(s), 64 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表