[中望CAD]双击反应器 + DCL模态对话框 + 临时退出交互,DCL对话框自动重开一次(BUG测试代码)

名片

裹.L G

★lv1

需求:

BUG:

已完成:

进行中:

BUG 热度

  • 需求ID:暂无
  • 需求状态: 进行中 已完成

问题:中望平台的双击事件,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)  
) 

0 条评论 A文章作者 M管理员
    暂无讨论,说说你的看法吧
❯
购物车
优惠劵
今日签到
有新私信 私信列表
搜索
复制链接
微信扫码
已复制到剪贴板