dcl对话框嵌入LSP调试问题
本帖最后由 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)
)
还有小第一直遇到的一个问题,就是程序如果用.LSP和.DCL在cad2004支持路径下,程序对话框加载一直没问题。但是如果编译成VLX(专家),就有的DCL能调用,有的对话框就是不出来。这是什么原因? 不错很有思路 本帖最后由 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)就行了 llsheng_73 发表于 2016-8-3 21:47 static/image/common/back.gif
不太明白的是明明自己写了对话框名称,然后又搞半天想从文件中读取它,为此折腾好久,最终还搞得出错了
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)
) llsheng_73 发表于 2016-8-3 21:47 static/image/common/back.gif
不太明白的是明明自己写了对话框名称,然后又搞半天想从文件中读取它,为此折腾好久,最终还搞得出错了
vl ...
我测试了半天,发现程序有问题部分还是DCL代码部分。为什么同样的置换为别人的DCL代码能通过,自己的那部分DCL代码就是不行,卡在(substr lin (+ (vl-string-search " " lin) 1) 9)这一句,区别在哪里? llsheng_73 发表于 2016-8-3 21:47 static/image/common/back.gif
不太明白的是明明自己写了对话框名称,然后又搞半天想从文件中读取它,为此折腾好久,最终还搞得出错了
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;
} llsheng_73 发表于 2016-8-3 21:47 static/image/common/back.gif
不太明白的是明明自己写了对话框名称,然后又搞半天想从文件中读取它,为此折腾好久,最终还搞得出错了
vl ...
no function definition: TLIST
这是个什么函数?提示缺少此函数 xyz2009xyz 发表于 2016-8-4 14:09 static/image/common/back.gif
no function definition: TLIST
这是个什么函数?提示缺少此函数
关键就这句:(foreach fstream lst (write-line fstream ofile)) ;;;;小小修改一下;
(defun makdcl( lst / file fileid handle )
(setq file(vl-filename-mktemp nil nil ".dcl")fileid(open file "w"))
(foreach fstream lst (write-line fstream fileid))
(close fileid)
(setq id (load_dialog file))
(vl-file-delete file)
id
)
;注意:没写UNLOAD_DIALOG函数,当心
测试:
(new_dialog "dia7b"
(makdcl
'(
"dia7b:dialog{"
"label=\"列表框的专家词库范例\";"
":list_box{"
"label=\"常用词库菜单\";"
"key=\"klist\";width=30;height=10;"
"fixed_width_font=true; //加入了这一行"
"}"
":edit_box{label=\"词库\";key=\"wordstr\";}"
"spacer_1;"
"ok_cancel;"
"}"
)
)
)
页:
[1]