找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2139|回复: 20

[求助] [求助][1127]dcl下拉选单疑问[烦请cy956版大解惑一番]

[复制链接]
发表于 2005-11-27 09:15:05 | 显示全部楼层 |阅读模式

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

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

×
[求助][1127]dcl下拉选单疑问?[烦请cy956版大解惑一番]

请问可以使用dcl的下拉选单来执行
写在txt档中的执行命令吗?
想要做成使用dcl下拉选单来执行很多lisp的程序命令
但程序的名称及使用命令
都在txt档案中
这样做得到吗?

烦请各位版主及高手可以解答一下
若有范例可以参考会更好
谢谢各位了~
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-11-27 09:48:02 | 显示全部楼层
为什么不直接编辑下拉菜单文件?
帮助文件:
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-27 10:42:21 | 显示全部楼层
XYP版主说的对
但是一想到要编辑这么多的程序
就头痛了
所以想说如果可以运用对话框程序
将所有的程序只需做个连结及说明
就可以按一个按钮来选定执行
这样管理起来也方便不是吗?

连结的选单.TXT档案内容:
第一段是说明  第二段是命令的执行,希望可以带入 LOAD 中来完成命令执行
"01-线段总长" "test001"
"02-打碎黄色多义线" "test002"
"03-改字母大小写" "test003"
"04-炸碎文字" "test004"
"05-字按线对齐" "test005"
"06-面积求和" "test006"

附上选单的功能表的图样及程序
tslisp02:dialog{
   label="LISP程式列表";
   :list_box{
      label="选单";
      key="klist";
      width=30;
      height=10;
   }
   :edit_box{
      label="执行";
      key="wordstr";
   }
   spacer_1;
   ok_cancel;
}

另外说明一点
以上纯粹是小弟的想法
如果不能实现此做法
也请各位告知一下
好让这想法可以结束~
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-11-27 11:27:50 | 显示全部楼层
1。直接用菜单简单;
2。建议你用doslib,几行内解决问题,不用管dcl。其他api可能也有相似功能。
可以这样写:


  1. (defun c:mlm()
  2.   (setq mltxt(list '("命令说明1" . "(c:m1)")
  3.           '("命令说明2" . "(c:m2)")
  4.           '("命令说明3" . "(c:m3)")
  5.           '("命令说明4" . "(c:m4)")));;;命令名表
  6.   (setq mlbt(mapcar 'car mltxt)
  7.           mlm(dos_combolist "--by陈勇--" "选择一个命令" mlbt
  8.                            (if mlm mlm (car mlbt)))
  9.           mlm1(dxf mlm mltxt))
  10.    (eval (read mlm1))
  11. )
  12. (defun dxf (#code #list)(cdr (assoc #code #list))

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

使用道具 举报

 楼主| 发表于 2005-11-27 12:08:18 | 显示全部楼层
cy956版主所说的doslib 是指 doslib.arx 这个吗?
另外是不是整个程序就只要填入您所提供的就可以执行了呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-11-27 12:16:07 | 显示全部楼层
我编写了一个,程序不太完善,仅仅提供一个思路!
lsp文件:

  1.   [FONT=courier new]
  2. (defun c:test2 (/ dcl_id do_what)
  3.   (if (> 0 (setq dcl_id (load_dialog "tslisp02.dcl")))
  4.     (progn
  5.       (princ "\n未能加载对话框文件:tslisp02.dcl")
  6.       (setq dialogloaded nil)
  7.     )
  8.   )
  9.   (setq do_what 2)
  10.   (while (>= do_what 2)
  11.     (if        (= null (new_dialog "tslisp02" dcl_id))
  12.       (progn
  13.         (princ "\n未能显示输入键槽参数对话框。")
  14.         (setq dialogshow nil)
  15.         (exit)
  16.       )                                        ;progn结束
  17.     )
  18.     (action_tile "p_list" "(p_list)")
  19.     (action_tile
  20.       "accept"
  21.       "(done_dialog 1)"
  22.     )
  23.     (action_tile "cancel" "(done_dialog 0)")
  24.     (setq do_what (start_dialog))
  25.     (cond ((= do_what 1)
  26.            (command p_command)
  27.           )
  28.           ((= do_what 0)
  29.            (exit)
  30.            (prompt "\n对话框被取消。")
  31.           )
  32.     )
  33.     (unload_dialog dcl_id)
  34.   )
  35. )
  36. (defun p_list ()
  37.   (setq        pr_index  (get_tile "p_list")
  38.         pr_list          '("line" "circle")
  39.         p_command (nth (atoi pr_index) pr_list)
  40.   )
  41. )
  42.   [/FONT]

DCL文件:

  1.   [FONT=courier new]
  2. tslisp02:dialog{
  3.         label="LISP程式列表";
  4.         spacer;
  5.                 :popup_list{
  6.                         label="列表:";
  7.                         key="p_list";
  8.                         width=12;
  9.                         list="line\ncircle";
  10.                         value="line";
  11.                 }
  12.                 spacer;
  13.         ok_cancel;
  14. }
  15.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-11-27 12:29:05 | 显示全部楼层
最初由 xyz518mm 发布
[B]cy956版主所说的doslib 是指 doslib.arx 这个吗?
另外是不是整个程序就只要填入您所提供的就可以执行了呢? [/B]


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

使用道具 举报

 楼主| 发表于 2005-11-27 12:33:52 | 显示全部楼层
[请cy956 版主或是其他高手解答一下了]

请问cy956 版主:
小弟已经照您的写法来执行
但是却发现无法执行 LISPOK.lsp 内的命令
是哪里出了问题吗?

错误的讯息为:"ts [no function definition: DXF]"

ts.lsp主要程序
(defun c:ts ()
(LOAD "C:/LISPOK.lsp")
(setq mltxt(list
'("命令说明3-设置线宽" . "(c:LOK003)")
'("命令说明2-拾取数字差" . "(c:LOK002)")
'("命令说明1-内容改为当前日期" . "(c:LOK001)")

));;;命令名表
          
  (setq mlbt(mapcar 'car mltxt)
          mlm(dos_combolist "--by陈勇--" "选择一个命令" mlbt
                           (if mlm mlm (car mlbt)))
          mlm1(dxf mlm mltxt))
         
   (read mlm1)
(prin1))
++++++++++++++++++++++++++++++++++++
被呼叫连结的 LISPOK.lsp 程序
(defun c:LOK003 (/ d i ss tt c e v xx)
(setq olderr  *error*             ; Initialize variables
         *error* aaa)
(prompt "一般选择可用窗口选 如C,W\n")
     (setvar "cmdecho" 0)
     (princ "请设置线宽(wide)<")
(princ rr_1)
  (setq d (getreal ">:?"))
(if (/= d nil)(setq rr_1 d))
(prompt "\n请选择要修改的实体<--->")
   (initget "a b A B ")
(setq i (getkword "A--按实体类型选择,B--一般选择\n请选择<B>(A or B) "))
(cond ((or (eq i "a")(eq i "A"))
                 (setq ss (xc)))

     ((or (eq i "b")(eq i "B"))
        (setq ss (ssget)))
       (T (setq ss (ssget)))
     )
(setq tt (sslength ss))
(setq c 0)
(repeat tt
     (setq e (ssname ss c))
(setq v (entget e))
(setq xx (cdr (assoc 0 v)))
(cond ((= xx "POLYLINE")(command "pedit" e "w" rr_1 ""))
    ((or (= xx "ARC")(= xx "LINE"))(command "pedit" e "y" "w" rr_1 ""))
; (if (or (/= xx "POLYLINE")(/= xx "LINE")(/= xx "ARC")) (prompt "不能编辑此实体"))
)
     (setq c (1+ c))
  )
(setvar "cmdecho" 1)
  )

(defun c:LOK002  (/ psub1 ss totn)                ;拾取数字差(可作减法)
  (defun psub1 (ss / tot n en adn)
    (setq tot 0.0
          n   0
    )
    (while (setq en (ssname ss n))
      (setq adn (atof (cdr (assoc 1 (entget en)))))
      (setq tot        (+ tot adn)
            n        (1+ n)
      )
    )
    tot
  )

  (prompt "\n拾取数字求差: ")
  (prompt "\n请先选择被减的数字: ")
  (setq        ss   (ssget '())
        totn (psub1 ss)
  )
  (prompt "\n再选择要减去的数字: ")
  (setq        ss   (ssget '())
        totn (- totn (psub1 ss))
  )
  (princ (strcat "\n数字差: "))
  (princ totn)
  (princ)
)

(defun c:LOK001 (/ entn entl text high)
(setq entn (car (entsel "选择要将内容改为当前日期的文字")))
(setq entl (entget entn))
(setq ti (rtos (getvar "cdate") 2 6))
(setq yy (substr ti 1 4))
(setq mm (substr ti 5 2))
(setq mm (atoi mm))
(setq mm (itoa mm))
(setq dd (substr ti 7 2))
(setq dd (atoi dd))
(setq dd (itoa dd))
(setq text (strcat yy "." mm "." dd))
(setq entl (subst (cons 1 text) (assoc 1 entl) entl))
(entmod entl)
(princ)
)
;;;*******************************************************





doslib 下载位置:
http://www.xdcad.net/forum/showt ... 1703675#post1703675

http://geol-dh.narod.ru/en_news.html

http://rapidshare.de/files/72508 ... vember2005.rar.html

讨论的网站
http://geol-dh.narod.ru/en_index.html
http://www.mjtd.com/data/apihelp/doslib001.htm
http://geol-dh.ru/spds/setup-lsp-acad.html

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

使用道具 举报

发表于 2005-11-27 21:57:45 | 显示全部楼层
在4楼改好了,加了dxf,改了一处错误。内部变量清零及lsp格式书写等工作你自己调吧。
程序的功能我试过了。

  1. (defun c:ts (/ MLBT MLM1)
  2. ;;;  (LOAD "C:/LISPOK.lsp")
  3.   (setq        mltxt (list
  4.                 '("命令说明3-设置线宽" . "(c:LOK003)")
  5.                 '("命令说明2-拾取数字差" . "(c:LOK002)")
  6.                 '("命令说明1-内容改为当前日期" . "(c:LOK001)")

  7.               )
  8.   );;;命令名表
  9.   (setq        mlbt (mapcar 'car mltxt)
  10.         mlm  (dos_combolist  "--by陈勇--"  "选择一个命令"  mlbt
  11.                (if mlm mlm (car mlbt)))
  12.         mlm1 (dxf mlm mltxt)
  13.   )
  14.   (eval (read mlm1))
  15.   (prin1)
  16. )
  17. (defun c:LOK003        (/ d i ss tt c e v xx)
  18.   (setq        olderr        *error*                        ; Initialize variables
  19.         *error*        aaa
  20.   )
  21.   (prompt "一般选择可用窗口选 如C,W\n")
  22.   (setvar "cmdecho" 0)
  23.   (princ "请设置线宽(wide)<")
  24.   (princ rr_1)
  25.   (setq d (getreal ">:?"))
  26.   (if (/= d nil)
  27.     (setq rr_1 d)
  28.   )
  29.   (prompt "\n请选择要修改的实体<--->")
  30.   (initget "a b A B ")
  31.   (setq i (getkword "A--按实体类型选择,B--一般选择\n请选择(A or B) "))
  32.   (cond        ((or (eq i "a") (eq i "A"))
  33.          (setq ss (xc))
  34.         )

  35.         ((or (eq i "b") (eq i "B"))
  36.          (setq ss (ssget))
  37.         )
  38.         (T (setq ss (ssget)))
  39.   )
  40.   (setq tt (sslength ss))
  41.   (setq c 0)
  42.   (repeat tt
  43.     (setq e (ssname ss c))
  44.     (setq v (entget e))
  45.     (setq xx (cdr (assoc 0 v)))
  46.     (cond ((= xx "POLYLINE") (command "pedit" e "w" rr_1 ""))
  47.           ((or (= xx "ARC") (= xx "LINE"))
  48.            (command "pedit" e "y" "w" rr_1 "")
  49.           )
  50.                                         ; (if (or (/= xx "POLYLINE")(/= xx "LINE")(/= xx "ARC")) (prompt "不能编辑此实体"))
  51.     )
  52.     (setq c (1+ c))
  53.   )
  54.   (setvar "cmdecho" 1)
  55. )


  56. (defun c:LOK002        (/ psub1 ss totn)        ;拾取数字差(可作减法)
  57.   (defun psub1 (ss / tot n en adn)
  58.     (setq tot 0.0
  59.           n   0
  60.     )
  61.     (while (setq en (ssname ss n))
  62.       (setq adn (atof (cdr (assoc 1 (entget en)))))
  63.       (setq tot        (+ tot adn)
  64.             n        (1+ n)
  65.       )
  66.     )
  67.     tot
  68.   )


  69.   (prompt "\n拾取数字求差: ")
  70.   (prompt "\n请先选择被减的数字: ")
  71.   (setq        ss   (ssget '())
  72.         totn (psub1 ss)
  73.   )
  74.   (prompt "\n再选择要减去的数字: ")
  75.   (setq        ss   (ssget '())
  76.         totn (- totn (psub1 ss))
  77.   )
  78.   (princ (strcat "\n数字差: "))
  79.   (princ totn)
  80.   (princ)
  81. )


  82. (defun c:LOK001        (/ entn entl text high)
  83.   (setq entn (car (entsel "选择要将内容改为当前日期的文字")))
  84.   (setq entl (entget entn))
  85.   (setq ti (rtos (getvar "cdate") 2 6))
  86.   (setq yy (substr ti 1 4))
  87.   (setq mm (substr ti 5 2))
  88.   (setq mm (atoi mm))
  89.   (setq mm (itoa mm))
  90.   (setq dd (substr ti 7 2))
  91.   (setq dd (atoi dd))
  92.   (setq dd (itoa dd))
  93.   (setq text (strcat yy "." mm "." dd))
  94.   (setq entl (subst (cons 1 text) (assoc 1 entl) entl))
  95.   (entmod entl)
  96.   (princ)
  97. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-27 22:37:54 | 显示全部楼层
请问cy956 版主:
是否程序中都需要加入了 (defun dxf (#code #list)(cdr (assoc #code #list))

那在后来的程序中是否也要加入使用呢?

最后就是此对话框该怎样设定他的大小
我试过好像可以随意的拉动
烦请您再解答一下
谢谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-11-27 23:59:08 | 显示全部楼层
(defun dxf (#code #list)(cdr (assoc #code #list))一段你只要加载一次即可,这是一个普通的内部函数,在提取组码值时使用,算是lisper们最常用到的函数了。你可以粘贴到acad×××.lsp文件中。doslib对话框大小似乎没有参数可以定义,至少使用说明中未提及。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-28 06:48:20 | 显示全部楼层
真是太感谢版主您了
您的回答让我又学习了不少东西
另外关于dos_combolist 这函数的解释是否如下:
以及 dos_combolist 对话框所能表示内容是否只能显示出字串的第一位
如果有多位要显示就无法实行了是吗?

另外若再使用此程序时没有执行任何项目直接按esc键退出
出现 [损坏的引数类型: stringp nil] 这样是程序问题吗?

dos_combolist
显示带有组合样式列表框的可调整尺寸的Windows对话框。
这对于需要从列表中选择一个项目或输入字符串值是非常有用的。

语法
(dos_combolist title message list [default])

参数
title 对话框标题。
message 描述信息。
list 字符串值列表。
default 缺省字符串

返回值
成功时返回在编辑框中输入的项目或从列表中选择的项目。

取消或出错时返回nil。

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

使用道具 举报

发表于 2005-11-28 19:42:48 | 显示全部楼层
是的,你可以加上错误判断,在mlm和mlm1两处,都有可能出现nil或其他不希望出现的返回值,加两个if就可以解决。上面的程序不算完整,因为作为完整程序可能还要错误判断,系统变量赋值与返回,undo设置等等,包括内部变量清零,坛里xyp1964几位帮主都有相关帖子,你可以看看。doslib的使用早期时我贴过一个简单翻译,现在应该是明经的最全,你可以到明经通道看看。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-28 23:58:29 | 显示全部楼层
那错误判断是要 加在这些地方吗?
(setq mlbt (mapcar 'car mltxt)
      mlm  (dos_combolist  "--测试完成程序--"  "选择一个命令" mlbt
(if (= mlm nil)
  (if mlm mlm (car mlbt))
)

(if (= mlm1 nil)     
      mlm1 (dxf mlm mltxt)
))
)

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

使用道具 举报

发表于 2005-11-29 01:40:22 | 显示全部楼层

  1. (defun c:ts (/ MLBT MLM1)
  2. ;;;  (LOAD "C:/LISPOK.lsp")
  3.   (setq        mltxt (list
  4.                 '("命令说明3-设置线宽" . "(c:LOK003)")
  5.                 '("命令说明2-拾取数字差" . "(c:LOK002)")
  6.                 '("命令说明1-内容改为当前日期" . "(c:LOK001)")

  7.               )
  8.   );;;命令名表
  9.   (setq        mlbt (mapcar 'car mltxt)
  10.         mlm  (dos_combolist  "--by陈勇--"  "选择一个命令"  mlbt
  11.                (if mlm mlm (car mlbt)))
  12.         mlm1(if mlm  (dxf mlm mltxt) nil)
  13.   )
  14.   (if mlm1
  15.      (eval (read mlm1))
  16.      (alert  "未选中合适命令.")
  17.   )
  18.   (prin1)
  19. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-29 01:20 , Processed in 0.449638 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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