问题:中望平台的双击事件,DCL对话框会对某些交互式函数按钮不会正确消隐,会“自动重开一次”,详以上代码(加载以上代码,随便找一个中望的单行文字双击测试可知,正常输入命令LG_textedit操作是没这问题)。 现向中望官方反馈这个DCL生命周期问题,因为从外部LISP层面很难可靠地“修复”一个平台内部的事件触发时序缺陷,这一行为已引发资源冲突或异常行为,望修正。
(vl-load-com)
(defun endxf (i en) (if (= (type en) ‘ename) (cdr (assoc i (entget en))) (princ “出错”)))
(setq *acad* (vlax-get-acad-object) )
(setq *doc* (vla-get-ActiveDocument *acad*))
(or *LG_text:mouse_reactor*
(setq *LG_text:mouse_reactor*
(vlr-mouse-reactor
nil
‘((:vlr-begindoubleclick . LG_text:mouse_DoubleClick))
)
)
)
(defun LG_text:mouse_DoubleClick (r dbk_pt / selp_data *dblclkedit* strFun th_firstss)
(princ “a”)
(setq dbk_pt (trans (car dbk_pt) 0 1))
(setq selp_data (nentselp dbk_pt))
(if selp_data
(progn
(if (caddr selp_data)
(setq *DoubleClick_en* (last (last selp_data)))
(setq *DoubleClick_en* (car selp_data))
)
(if (and (= (endxf 0 *DoubleClick_en*) “VERTEX”) (endxf 330 *DoubleClick_en*))
(setq *DoubleClick_en* (endxf 330 *DoubleClick_en*))
)
)
)
(cond
((and *DoubleClick_en* ;;单行文字双击
(= (endxf 0 *DoubleClick_en*) “TEXT”)
)
(vla-SendCommand *doc* “LG_textedit “)
)
(t ())
)
)
(defun c:LG_textedit (/ make_dcl_file a dclname filen dclid Action Main notexit)
(defun make_dcl_file ()
(setq dclname
(cond
((setq tempname (vl-filename-mktemp “LG-dcl-tmp.dcl”) filen (open tempname “w”))
(foreach stream
(apply ‘append
(list
(list
“test_dialog : dialog {\n”
” label = \”【中望CAD】双击反应器 + DCL模态对话框 + 临时退出交互,DCL对话框自动重开一次(BUG测试代码)\”;\n”
” : button { key = \”getpoint-fun\”; label = \”选点《DCL对话框正常关闭》\”; }\n”
” : button { key = \”entsel-fun\”; label = \”选单个《DCL对话框正常关闭》\”; }\n”
” : button { key = \”ssget-fun\”; label = \”框选《DCL对话框自动重开一次》\”; }\n”
” ok_cancel;\n”
“}\n”
)
)
)
(princ stream filen)
)
(close filen)
tempname
)
)
)
)
(defun Action ()
(foreach a ‘(“ssget-fun” “getpoint-fun” “entsel-fun” “accept” “cancel”)
(progn (action_tile a (strcat “(setq lastcmd \”” a “\”)(done_dialog))”)));;不想关闭对话框取消(done_dialog)
)
(action_tile “cancel” “(setq lastcmd \”cancel\”)(done_dialog)”)
)
(defun Main ()
(if (not (new_dialog “test_dialog” dclid)) ;;在dclid后面加”” ‘(193 300)语句定位对话框位置
(progn (alert “dcl对话框加载失败.”)(vl-exit-with-error “”))
)
(vl-file-delete dclname)
(Action)
(start_dialog)
)
;;程序入口
;;=============================
(make_dcl_file)
(setq dclid (load_dialog dclname))
(Main)
(setq notexit t)
(while notexit
(cond
((= lastcmd “getpoint-fun”)
(getpoint “\n请选择一个点:”)
(Main) ; 再次进入对话框
)
((= lastcmd “entsel-fun”)
(entsel “\n请选择一个对象:”)
(Main) ; 再次进入对话框
)
((= lastcmd “ssget-fun”)
(princ “\n请框选对象:”)
(ssget)
(Main) ; 再次进入对话框
)
((= lastcmd “accept”)
(setq notexit nil)
)
((= lastcmd “cancel”)
(setq notexit nil)
)
(t (setq notexit nil))
)
)
(unload_dialog dclid)
(princ)
)







