明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 618|回复: 6

[提问] 【求助】怎样屏蔽【应用程序错误: 控制台中断】这句程序提示

[复制链接]
发表于 2016-9-25 11:01 | 显示全部楼层 |阅读模式
下面是程序,输入命令后可以连续创建图形,但是中途按ESC后,就会提示【应用程序错误: 控制台中断】提示,请问如何将这个提示屏蔽,利用error无法屏蔽这句提示???

(vl-load-com)
(defun c:TT (/ *error* msg );【★★★结束程序后,必须要把*error* msg变量删除,否则其它程序出错后,也会应用error后的操作】

(defun *error* (msg)     ;将描述错误的字符串存入变量msg
        ;(entdel Ents)
(entdel (entlast))
(entdel (entlast))
(entdel (entlast))
        (princ "错误: ")
        (princ msg);打印错误信息【函数被取消】
    )                    


(defun ABC (/ Dist GVal Pnt0 Pnt1 Pnt2 Pnt3 Ents)
  (setq        Dist (/ 10.0 (expt 3.0 0.5));█3^5=243
        TorN t
  )
  (while TorN
    (setq GVal (grread 3))
    (if        (member (car GVal) '(3 5))
      (progn
        (setq Pnt0 (cadr GVal);█返回点变量pGVal的y分量Pnt0
              Pnt1 (polar Pnt0 (/ (* pi 2.0) 3.0) Dist);█角度2pi/3
              Pnt2 (polar Pnt0 (/ pi 3.0) Dist);█角度pi/3
              Pnt3 (polar Pnt0 (/ pi 3.0) (* 2.0 Dist));█角度pi/3 距离2Dist
        )
        (if Ents
          (mapcar 'entdel Ents)
        )
        (setq Ents
               (list (entmakex
                       ;(list '(0 . "LINE") (cons 10 Pnt0) (cons 11 Pnt1))
                       (list '(0 . "LINE") (cons 10 Pnt0) (cons 11 Pnt1))

                     )
                     (entmakex
                       (list '(0 . "LINE") (cons 10 Pnt0) (cons 11 Pnt3))
                     )
                     (entmakex
                       (list '(0 . "LINE") (cons 10 Pnt1) (cons 11 Pnt2))
                     )
               )
        )
        (if (= (car GVal) 3)
          (setq TorN nil)
        )
      )
    )
  )
  (princ)
)


  (while
   (ABC)
   )
)
发表于 2016-9-27 07:55 | 显示全部楼层
问题出在grread
 楼主| 发表于 2016-9-27 11:31 | 显示全部楼层
本帖最后由 绝对速度完全 于 2016-9-27 11:52 编辑

我通过查资料,已经知道问题出在grread,但是不知道如何解决。当输入命令后,这个绘制的图形会自动跟随鼠标动态显示,当我按ESC后,相当于程序被中断,于是才出的这个错误提示。我尝试过很多方法来解决,包括error判断,undo回退,最后发现还是不行(明经上在2008年已经有人提过这个问题,但我看不了回复,里面说不需要用error判断)。因为这个控制台提示不影响程序,只是个提示,所以我想通过屏蔽的方法来使程序完美。【★★★关键在于这个提示是我在按ESC后,cad立即做出的反应,而error是错误已经发生后做出的反应,因此无法屏蔽。而undo我也是配合error来激活运行的,所以肯定也是不行的,(或许应用其它的判断可以实现,但是我水平有限,做不到)】

我不会编程,因为画图的时候能带来便利,于是自己弄了一些lsp自己改,实现一些功能。后来收集的程序多了,对lsp也很感兴趣,就想自己做一个工具箱,但是又喜欢追求完美,所以想解决自己遇到的问题。这个程序只是一个示例,为了便于测试。我最终的目的只是做一个【指北针】,但我认为它还能实现其它的功能。程序和知识大部分来自明经,这个论坛对我帮助很大。
发表于 2016-9-27 14:53 | 显示全部楼层
本帖最后由 且听风吟09 于 2016-9-27 14:55 编辑

不要*error*函数最后的(princ msg)如果只屏蔽这一句错误,可以(if (/= msg "...") (princ msg))
 楼主| 发表于 2016-9-27 17:29 | 显示全部楼层
本帖最后由 绝对速度完全 于 2016-9-30 08:40 编辑
且听风吟09 发表于 2016-9-27 14:53
不要*error*函数最后的(princ msg)如果只屏蔽这一句错误,可以(if (/= msg "...") (princ msg))

我试了这个方法不行!!!【应用程序错误: 控制台中断】这句提示应该跟其它的错误提示有区别,别的错误可在判断error后显示,而【应用程序错误: 控制台中断】这句提示可以理解为,在我按ESC的中断grread的瞬间提示的,而error也是因这个中断才启动的(也就是在error启动前,控制台中断这个提示已经显示在命令行了)。

或许解决办法不是用error,因为真的想不到如何解决。【★★★如果从grread正确结束这个出发点来想,估计能解决吧!】
【★★★还有一个思路,如果能实现按esc后程序不结束,而让程序识别你是按的esc,从而继续完成grread程序,接着关闭程序,应用undo取消最后这一次的操作[或用(entdel (entlast))],就不会有控制台这事了,呵呵】


 楼主| 发表于 2016-9-30 08:47 | 显示全部楼层
本帖最后由 绝对速度完全 于 2016-9-30 09:04 编辑

【应用程序错误: 控制台中断】问题解决了【百度知道认证程序员朱正伟解决了此问题,下面为他的原码,经同意公布,让更多人受益】
先上程序,然后细说,现在公布原码

;下面是以我的要求制作的指北针原码【支持动态显示以及无限复制】按ESC不会出现【应用程序错误;控制台中断】及其它错误提示
;制作人:朱正伟
(defun c:t1 ( / %k1 &ob1 &ob2 &ob3 n pt1 pt2 pt5 ss1 x-grread x-gval)
(setvar "cmdecho" 0)
(setvar "blipmode" 0)
(if (null vlax-dump-object) (vl-load-com) )
(setq ss1 (s09152) %k1 t ss1 (cons %k1 ss1))
(while
  (vl-catch-all-apply 'car (setq ss1 (vl-catch-all-apply 's09153 (list ss1)))) )
(princ)
)

(defun s09153 (ss1 / %k1 n pt1 pt2 x-gval xx-1)
(setq %k1 (car ss1) pt1 (cadr ss1) ss1 (cddr ss1))
(setq x-GVal (vl-catch-all-apply 'grread (list t 8)))
(setq n (vl-catch-all-apply 'car (list x-GVal)))
(if (setq xx-1 (vl-catch-all-error-p n))
  (setq %k1 nil n 2)
  (progn
   (if (member n '(3 5))
    (progn
     (setq pt2 (Vlax-3d-Point (cadr x-GVal)))
     (vla-move (car ss1) pt1 pt2)
     (vla-move (cadr ss1) pt1 pt2)
     (vla-move (caddr ss1) pt1 pt2)
     (setq pt1 pt2)
    )
   )
   (if (= n 3)
    (progn
     (setq ss1 (s09152) pt1 (car ss1) ss1 (cdr ss1))
    )
   )
  )
)
(if (and (/= n 3) (/= n 5))
  (progn
   (vla-delete (car ss1))
   (vla-delete (cadr ss1))
   (vla-delete (caddr ss1))
   (setq %k1 nil ss1 nil)
  )
)
(if ss1 (progn (setq ss1 (cons pt1 ss1) ss1 (cons %k1 ss1))))
ss1
)
(defun s09151 ()
'((0.5 -13.5) (0.5 -0.5) (4.5 -0.5) (4.5 0.5) (0.5 0.5) (0.5 4.5) (2.4 4.5) (0.0 9.12)
   (-2.4 4.5) (-0.5 4.5) (-0.5 0.5) (-4.5 0.5) (-4.5 -0.5) (-0.5 -0.5) (-0.5 -13.5))
)
;;建立宋体
(defun text->仿宋 ( / newt)
(if (null (tblsearch "style" "仿宋"))
  (progn
   (if (null vlax-dump-object) (vl-load-com) )
   (setq newT (vla-add (vla-get-TextStyles (vla-get-activedocument (vlax-get-acad-object))) "仿宋"))
   (vla-put-fontfile newT "C:\\WINDOWS\\Fonts\\simfang.TTF")
   (vla-put-height newT 0);高度0
   (vla-put-width newT 0.6);宽度因子0.6
   ;(vla-put-obliqueAngle newT (/ (* pi 3) 180));倾斜角度3
  )
)
)
(defun s09152 ( / pt1 ss x x-object1 x-object2 x-object3)
(text->仿宋);建立字体
(entmake '((0 . "TEXT") (10 0.0 13.74 0.0) (40 . 4.60981) (1 . "N") (41 . 1.0) (7 . "仿宋") (72 . 4) (11 0.0 13.74 0.0)))
(setq x-object1 (vlax-ename->vla-object (entlast)))
(setq ss (mapcar '(lambda (x) (cons 10 x)) (s09151)))
(entmake (append (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") '(90 . 15) '(70 . 1)) ss))
(setq x-object2 (entlast))
(command "HATCH" "SOLID" (ssadd x-object2) "")
(setq x-object2 (vlax-ename->vla-object x-object2))
(setq x-object3 (vlax-ename->vla-object (entlast)))
(vla-put-color x-object3 7);变颜色
(setq pt1 (Vlax-3d-Point '(0.0 0.0 0.0)))
(list pt1 x-object1 x-object2 x-object3)
)





@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
具体说明
下面这样循环,不管怎样都不会提示错误,程序也不会中断
(while (null (vl-catch-all-error-p (setq gr (vl-catch-all-apply 'grread (list t 8)))))
(princ gr)
)


vl-catch-all-apply配合(grread t 8)来写就不出现错误

vl-catch-all-error-p 与vl-catch-all-apply组合,可以消除【; 错误: 函数已取消】

(grread t 8)不提示控制台错误


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

本版积分规则

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

GMT+8, 2024-5-6 15:31 , Processed in 0.330525 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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