明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1593|回复: 9

[已解答] dcl对话框嵌入LSP调试问题

[复制链接]
发表于 2016-8-3 18:04:49 | 显示全部楼层 |阅读模式
本帖最后由 xyz2009xyz 于 2016-8-4 11:36 编辑

dcl对话框嵌入LSP调试问题:问什么执行到红色标示位置,就一直提示:“错误: 参数类型错误: numberp: nil”
备注:这个语句是从DCL2LSP程序里面原封不动摘下来,就是一直通不过。麻烦各位知道原因的指导下。
错误语句:
(while (or (eq (substr (setq lin (vl-string-right-trim "\" fn)" (vl-string-left-trim "(write-line \"" (read-line fn)))) 1 2) "//") (eq (substr lin 1 (vl-string-search " " lin)) "") (not (eq (substr lin (+ (vl-string-search " " lin) 1) 9) " : dialog"))))

主程序如下:
(defun C:DD2 ( / PLACE_FSBG FSR_num FSC_num FS_X0 FS_Y0 FS_TMP1 FS_TMP2 DLHJ_str DLLJ_str DLHS_str WZBL_str DLHJ_num DLLJ_num DLHS_num WZBL_num )
(vl-load-com)  
;;(CMDLA0)
(setq fname (vl-filename-mktemp nil nil "dxpl.dcl" ))
(setq fn (open fname "w" ))
(write-line "dxpl:dialog {" fn)
(write-line "    label=\"排序工具 \"; " fn)
(write-line "    :row{" fn)
(write-line "        :column{" fn)
(write-line "                 :edit_box{label=\"每行行距\";allow_accept=true;key=\"DLxyz1\";}//edit_box =true" fn)
(write-line "                 :edit_box{label=\"每列列距\";allow_accept=true;key=\"DLxyz2\";}//edit_box =true" fn)
(write-line "               }" fn)
(write-line "            :column{" fn)
(write-line "         :edit_box{label=\"每列行数\";allow_accept=true;key=\"DLxyz3\";}//edit_box =true" fn)
(write-line "         :edit_box{label=\"文字比例\";allow_accept=true;key=\"DLxyz4\";}//edit_box =true" fn)
(write-line "               }" fn)
(write-line "        }//end row" fn)
(write-line "  :row{" fn)
(write-line "        : boxed_row {" fn)
(write-line "            label = \"生成方式\";" fn)
(write-line "            : radio_row {" fn)
(write-line "                : radio_button {" fn)
(write-line "                    key = \"DLSTY1\";" fn)
(write-line "                    label = \"原文字重新排列\";" fn)
(write-line "          value=1;" fn)
(write-line "                }" fn)
(write-line "                : radio_button {" fn)
(write-line "                    key = \"DLSTY2\";" fn)
(write-line "                    label = \"重新生成不分列\";" fn)
(write-line "          value=0;" fn)
(write-line "                }" fn)
(write-line "            }" fn)
(write-line "                    }" fn)
(write-line "    } " fn)
(write-line "       spacer_1;//" fn)
(write-line "       ok_cancel;" fn)
(write-line "               }" fn)
(close fn)
(setq fn (open fname "r"))
(setq dclid (load_dialog fname))
(while (or (eq (substr (setq lin (vl-string-right-trim "\" fn)" (vl-string-left-trim "(write-line \"" (read-line fn)))) 1 2) "//") (eq (substr lin 1 (vl-string-search " " lin)) "") (not (eq (substr lin (+ (vl-string-search " " lin) 1) 9) " : dialog"))))
(new_dialog (substr lin 1 (vl-string-search " " lin)) dclid)
(action_tile "accept" "(ok_DLxyz)(done_dialog dd)")
(setq dd (start_dialog))
(cond
     ((= dd 1)(Cable_Sort1))
  ((= dd 2)(Cable_Sort2))
)  
(action_tile "cancel" "(done_dialog 0)")
(setq return# (start_dialog))
(princ return#)
(unload_dialog dclid)
(close fn)
(vl-file-delete fname)
(princ)
;;(CMDLA1)
(princ)
)



 楼主| 发表于 2016-8-3 18:11:07 | 显示全部楼层
还有小第一直遇到的一个问题,就是程序如果用.LSP和.DCL在cad2004支持路径下,程序对话框加载一直没问题。但是如果编译成VLX(专家),就有的DCL能调用,有的对话框就是不出来。这是什么原因?
发表于 2016-8-3 20:38:11 | 显示全部楼层
不错很有思路
发表于 2016-8-3 21:47:43 | 显示全部楼层
本帖最后由 llsheng_73 于 2016-8-3 21:54 编辑

不太明白的是明明自己写了对话框名称,然后又搞半天想从文件中读取它,为此折腾好久,最终还搞得出错了
vl-string-search这个函数在找不到指定的内容的时候返回的是nil而不是0,对它进行加1当然会出错
(vl-string-trim" "(substr str 1(vl-string-search":dialog"str)))



对话框的名称直接记住,那一长串while不要了,显示对话框的时候直接(new_dialog "dxpl" dclid)不行么?
另外,把对话框写入临时文件可以用下边这个函数,我也是在论坛里边找的
(defun makdcl(str_lst / file fileID Handle)
  (setq file(vl-filename-mktemp nil nil ".dcl")fileID(open file "w"))
  (write-line(apply'strcat(Tlist(list str_lst)t))fileID)
    (close fileID)
    (setq Handle(load_dialog file))
    (vl-file-delete file)
    Handle)

调用它的时候向下边这样就可以
(setq dcl(makdcl'("ZDEX:dialog{label=\"~去除冗余点~\";"
       ":column{:popup_list{label=\"处理图层\";key=\"LA\";}"
       ":row{key=\"GET\";:radio_button {label=\"自动\";key=\"ALL\";value=\"1\";}:radio_button {label=\"选择\";key=\"MANU\";}"
       ":button{key=\"ESC\";label=\"取消\";is_cancel=true;}:button{key=\"GO\";label=\"确定\";}}}}")))
然后直接通过(new_dialog"ZDEX"dcl)就行了

评分

参与人数 1明经币 +1 收起 理由
xyz2009xyz + 1

查看全部评分

 楼主| 发表于 2016-8-4 07:59:33 | 显示全部楼层
llsheng_73 发表于 2016-8-3 21:47
不太明白的是明明自己写了对话框名称,然后又搞半天想从文件中读取它,为此折腾好久,最终还搞得出错了
vl ...

你说的是这一句吧:
(setq fname (vl-filename-mktemp nil nil "dxpl.dcl" ))的确改的时候没有改过来,附件里面应该是:
(setq fname (vl-filename-mktemp nil nil ".dcl" ))

这个将dcl插入lsp引用的一位论坛上兄台的源码,源码测试是通过的,我原封不动弄过来的,今天早上测试错误没了,但是还是卡在那一句话退出了。

另给出论坛兄台的源码:
(defun c:dcl2lsp ( / fname1 fn1 fname2 fn2 k fn1l fn2l )
  (setq fname1 (getfiled "Select DCL file" "" "dcl" 16))
  (setq fn1 (open fname1 "r"))
  (setq fname2 (getfiled "File to save" "" "lsp" 1))
  (setq fn2 (open fname2 "w"))
  (while (setq fn1l (read-line fn1))
    (setq fn2l fn1l)
    (setq k 0)
    (while (setq k (vl-string-search "\"" fn2l k))
      (setq fn2l (vl-string-subst "\\\"" "\"" fn2l k))
      (setq k (+ k 2))
    )
    (setq fn2l (strcat "(write-line \"" fn2l "\" fn)"))
    (write-line fn2l fn2)
  )
  (close fn1)
  (close fn2)
  (princ)
)


(defun c:lsp2dcl ( / fname1 fn1 fname2 fn2 k fn1l fn2l )
  (setq fname1 (getfiled "Select LSP file" "" "lsp" 16))
  (setq fn1 (open fname1 "r"))
  (setq fname2 (getfiled "File to save" "" "dcl" 1))
  (setq fn2 (open fname2 "w"))
  (while (setq fn1l (read-line fn1))
    (setq fn2l fn1l)
    (setq fn2l (substr fn2l (+ (vl-string-search "\"" fn2l) 2) (- (vl-string-position (ascii "\"") fn2l nil T) (+ (vl-string-search "\"" fn2l) 1))))
    (setq k 0)
    (while (setq k (vl-string-search "\\\"" fn2l k))
      (setq fn2l (vl-string-subst "\"" "\\\"" fn2l k))
      (setq k (+ k 1))
    )
    (write-line fn2l fn2)
  )
  (close fn1)
  (close fn2)
  (princ)
)

;实例

(defun c:TestDialog ( / fname fn dclid lin return# )
(setq fname (vl-filename-mktemp nil nil ".dcl"))
(setq fn (open fname "w"))
(write-line "TestDialog : dialog {" fn)
(write-line "  label = \"Testing \\\\ DCL2LSP\";" fn)
(write-line "  : edit_box {" fn)
(write-line "    key = \"ser\";" fn)
(write-line "    label = \"Edit box\";" fn)
(write-line "    width = 50;" fn)
(write-line "  }" fn)
(write-line "  : list_box {" fn)
(write-line "    key = \"key\";" fn)
(write-line "    label = \"List Box\";" fn)
(write-line "    tabs = \"20 35\";" fn)
(write-line "    multiple_select = true;" fn)
(write-line "    list = \"One\\t1\\nTwo\\t2\\nThree\\t3\";" fn)
(write-line "    value = \"1 2\";" fn)
(write-line "  }" fn)
(write-line "  : text {" fn)
(write-line "    key = \"txt\";" fn)
(write-line "    height = 3;" fn)
(write-line "    value = \"My long line of text\\nhas a second line\";" fn)
(write-line "  }" fn)
(write-line "  ok_cancel;" fn)
(write-line "}" fn)
  (close fn)
  (setq fn (open fname "r"))
  (setq dclid (load_dialog fname))
  (while (or (eq (substr (setq lin (vl-string-right-trim "\" fn)" (vl-string-left-trim "(write-line \"" (read-line fn)))) 1 2) "//") (eq (substr lin 1 (vl-string-search " " lin)) "") (not (eq (substr lin (+ (vl-string-search " " lin) 1) 9) " : dialog"))))
  (new_dialog (substr lin 1 (vl-string-search " " lin)) dclid)
  (action_tile "accept" "(done_dialog 1)")
  (action_tile "cancel" "(done_dialog 0)")
  (setq return# (start_dialog))
  (princ return#)
  (unload_dialog dclid)
  (close fn)
  (vl-file-delete fname)
  (princ)
)

点评

"TestDialog"这个难道不是写对话框临时文件的时候就确定了的?  发表于 2016-8-4 08:27
 楼主| 发表于 2016-8-4 12:57:39 | 显示全部楼层
llsheng_73 发表于 2016-8-3 21:47
不太明白的是明明自己写了对话框名称,然后又搞半天想从文件中读取它,为此折腾好久,最终还搞得出错了
vl ...

我测试了半天,发现程序有问题部分还是DCL代码部分。为什么同样的置换为别人的DCL代码能通过,自己的那部分DCL代码就是不行,卡在(substr lin (+ (vl-string-search " " lin) 1) 9)这一句,区别在哪里?
 楼主| 发表于 2016-8-4 13:00:45 | 显示全部楼层
llsheng_73 发表于 2016-8-3 21:47
不太明白的是明明自己写了对话框名称,然后又搞半天想从文件中读取它,为此折腾好久,最终还搞得出错了
vl ...

5楼实例部分用TestDialog命令就能调出对话框,为什么他的vl-string-search这个函数在,对它进行加1不会出错,是我的dcl部分有问题吗?
dlpx:dialog {
    label="排序工具";
    :row{
        :column{
                 :edit_box{label="每行行距";allow_accept=true;key="DLxyz1";}//edit_box =true
                 :edit_box{label="每列列距";allow_accept=true;key="DLxyz2";}//edit_box =true
               }
                                        :column{
                                                                 :edit_box{label="每列行数";allow_accept=true;key="DLxyz3";}//edit_box =true
                                                                 :edit_box{label="文字比例";allow_accept=true;key="DLxyz4";}//edit_box =true
               }
        }//end row
                :row{
        : boxed_row {
            label = "生成方式";
            : radio_row {
                : radio_button {
                    key = "DLSTY1";
                    label = "原文字重新排列";
                                                                                value=1;
                }
                : radio_button {
                    key = "DLSTY2";
                    label = "重新生成不分列";
                                                                                value=0;
                }
            }
                    }
                                }
       spacer_1;//
       ok_cancel;
               }
 楼主| 发表于 2016-8-4 14:09:52 | 显示全部楼层
llsheng_73 发表于 2016-8-3 21:47
不太明白的是明明自己写了对话框名称,然后又搞半天想从文件中读取它,为此折腾好久,最终还搞得出错了
vl ...

no function definition: TLIST
这是个什么函数?提示缺少此函数
发表于 2016-8-4 19:14:15 | 显示全部楼层
xyz2009xyz 发表于 2016-8-4 14:09
no function definition: TLIST
这是个什么函数?提示缺少此函数

关键就这句:(foreach fstream lst (write-line fstream ofile))
发表于 2016-8-4 19:23:38 | 显示全部楼层
  1. ;;;;小小修改一下;
  2. (defun makdcl( lst / file fileid handle )
  3.   (setq file(vl-filename-mktemp nil nil ".dcl")fileid(open file "w"))
  4.   (foreach fstream lst (write-line fstream fileid))
  5.   (close fileid)
  6.   (setq id (load_dialog file))
  7.   (vl-file-delete file)
  8.   id
  9. )
  10. ;注意:没写UNLOAD_DIALOG函数,当心[em21]
  11. 测试:
  12. (new_dialog "dia7b"
  13.   (makdcl
  14.     '(
  15.       "dia7b:dialog{"
  16.       "label="列表框的专家词库范例";"
  17.       ":list_box{"
  18.       "label="常用词库菜单";"
  19.       "key="klist";width=30;height=10;"
  20.       "fixed_width_font=true; //加入了这一行"
  21.       "}"
  22.       ":edit_box{label="词库";key="wordstr";}"
  23.       "spacer_1;"
  24.       "ok_cancel;"
  25.       "}"
  26.     )
  27.   )
  28. )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-24 04:05 , Processed in 0.210065 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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