明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 11075|回复: 10

怎么实现按鼠标右键时让程序捕捉到进而结束程序

  [复制链接]
发表于 2012-4-10 09:10:45 | 显示全部楼层 |阅读模式
下面是一段代码
(defun c:tqgc();对等高线附近位置进行高程注记
  (setvar "osmode" 512)
  (setq v2(getvar"cmdecho"));保存当前的普通命令提示状态
  (setvar"cmdecho"0);不显示普通命令的提示
  (setq ss(ssget"x"'((0 . "POLYLINE")(8 . "DGX")))j -1);建立重量线选择集
  (if ss(command"tolwpoly"ss""));将全部重量线转为轻量线
  (repeat 1000000
     (while(not(setq li1(entsel"\n请选择第一条等高线:")))
       (alert"没有选中实体,请重新选择!")
)
     (while(not(setq li2(entsel"\n请选择第二条等高线:")))
       (alert"没有选中实体,请重新选择!")
)
   (setq en1(car li1) pt1(cadr li1))
   (setq en2(car li2) pt2(cadr li2))
   (setq pt1 (list (car pt1)(cadr pt1)))
        (command "line" pt1 pt2 "");构造辅助直线
        (setq en(entlast));获取line图元名
      (setq pt(getpoint"\n请选择高程注记位置:"))
   (setq pt(list (car pt)(cadr pt)))
   (setq s1(distance pt1 pt))
   (setq el1(entget en1)el2(entget en2))
   (setq gc1(cdr(assoc 38 el1))gc2(cdr(assoc 38 el2)))
   (setq bz(/ s1(distance pt2 pt1)))
     (setq dgj(- gc2 gc1))
   (setq h (+ gc1 (* dgj bz)))
   (command "drawgcd" "" pt h "")
     (entdel en);删除辅助直线
  )
  (setvar"cmdecho"v2);恢复普通命令提示原来的显示状态
)
因为我事先不知道要提取多少高程点因此我就选择了repeat 1000000,这样的话每次结束程序时都只能通过按esc键,然后程序提示“错误: 函数被取消”就结束了,但我总感觉这样不像一个正常的程序,我想在用户按右键时能让程序安全结束,但不知道该怎么实现,所以想求各位大侠们帮帮忙!在此谢谢了!
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2012-4-10 09:18:42 | 显示全部楼层
  1. (defun c:tqgc();对等高线附近位置进行高程注记
  2.   (setvar "osmode" 512)
  3.   (setq v2(getvar"cmdecho"));保存当前的普通命令提示状态
  4.   (setvar"cmdecho"0);不显示普通命令的提示
  5.   (setq ss(ssget"x"'((0 . "POLYLINE")(8 . "DGX")))j -1);建立重量线选择集
  6.   (if ss(command"tolwpoly"ss""));将全部重量线转为轻量线
  7.   (setq loop t)
  8.   (while loop
  9.      (while(not(setq li1(entsel"\n请选择第一条等高线:")))
  10.        (alert"没有选中实体,请重新选择!")
  11. )
  12.      (while(not(setq li2(entsel"\n请选择第二条等高线:")))
  13.        (alert"没有选中实体,请重新选择!")
  14. )
  15.    (setq en1(car li1) pt1(cadr li1))
  16.    (setq en2(car li2) pt2(cadr li2))
  17.    (setq pt1 (list (car pt1)(cadr pt1)))
  18.         (command "line" pt1 pt2 "");构造辅助直线
  19.         (setq en(entlast));获取line图元名
  20.       (setq pt(getpoint"\n请选择高程注记位置:"))
  21.    (setq pt(list (car pt)(cadr pt)))
  22.    (setq s1(distance pt1 pt))
  23.    (setq el1(entget en1)el2(entget en2))
  24.    (setq gc1(cdr(assoc 38 el1))gc2(cdr(assoc 38 el2)))
  25.    (setq bz(/ s1(distance pt2 pt1)))
  26.      (setq dgj(- gc2 gc1))
  27.    (setq h (+ gc1 (* dgj bz)))
  28.    (command "drawgcd" "" pt h "")
  29.      (entdel en);删除辅助直线
  30. ;;;是否结束标志
  31.     (setq loop (getpoint "\n左键继续/右键结束:"))
  32.   )
  33.   (setvar"cmdecho"v2);恢复普通命令提示原来的显示状态
  34. )
 楼主| 发表于 2012-4-10 10:45:48 | 显示全部楼层
Gu_xl 发表于 2012-4-10 09:18

版主,这样能实现,但是每提取一个高程还得按一下左键感觉还是有点麻烦啊,能不能在用户操作的任一时刻按右键就能让程序结束呢?
发表于 2012-4-10 11:34:23 | 显示全部楼层
本帖最后由 Gu_xl 于 2012-4-10 13:34 编辑
changyiran 发表于 2012-4-10 10:45
版主,这样能实现,但是每提取一个高程还得按一下左键感觉还是有点麻烦啊,能不能在用户操作的任一时刻按 ...


(while loop
     (while(not(setq li1(entsel"\n请选择第一条等高线:")))
       (alert"没有选中实体,请重新选择!")
)
     (while(not(setq li2(entsel"\n请选择第二条等高线:")))
       (alert"没有选中实体,请重新选择!")
)
修改如下:
==>
(while (and
     (setq li1(entsel"\n请选择第一条等高线:"))
     (setq li2(entsel"\n请选择第二条等高线:"))
)
...
;;删除下面这句
;;(setq loop (getpoint "\n左键继续/右键结束:"))

还有一个方法,是利用 ErrNo系统变量返回值,这个更能满足你的要求,按右键随时退出!
(while (and
   (progn
  (setvar "ErrNo" 0)
  (while (and (null
  (setq li1 (entsel "\n请选择第一条等高线:"))
  )
       (= 7 (getvar "ErrNo"))
       )
   )
  li1
  )
(progn
  (setvar "ErrNo" 0)
  (while (and (null
  (setq li2 (entsel "\n请选择第二条等高线:"))
  )
       (= 7 (getvar "ErrNo"))
       )
   )
  li2
  )
)
...

 楼主| 发表于 2012-4-10 16:02:57 | 显示全部楼层
Gu_xl 发表于 2012-4-10 11:34
(while loop
     (while(not(setq li1(entsel"\n请选择第一条等高线:")))
       (alert"没有选中实 ...

版主你太牛了,真是佩服的五体投地,修改后的代码完全能满足我的要求,只是有一点我看不明白,当要求选择第一条等高线时,如果没选中实体的话(null(setq li1 (entsel "\n请选择第一条等高线:")))的结果是T,因为先前已经有了(setvar "ErrNo" 0),所以(= 7 (getvar "ErrNo"))是nil,因此(and (null(setq li1 (entsel "\n请选择第一条等高线:")))(= 7 (getvar "ErrNo")))就是nil,这样应该跳出while循环了啊,但是程序居然还能要求继续选择第一条等高线,虽然这正是我需要的,但我却理解不透这段代码,望版主赐教!
 楼主| 发表于 2012-4-10 16:44:21 | 显示全部楼层
changyiran 发表于 2012-4-10 16:02
版主你太牛了,真是佩服的五体投地,修改后的代码完全能满足我的要求,只是有一点我看不明白,当要求选择 ...

我貌似明白了,如果图元选择失败errno的值变为了7,谢谢版主。
 楼主| 发表于 2012-4-10 16:57:43 | 显示全部楼层
不得不感慨,明经高人太多!!!
 楼主| 发表于 2012-4-10 16:58:47 | 显示全部楼层
转个贴吧,errno详解
 楼主| 发表于 2012-4-10 17:07:00 | 显示全部楼层
Gu_xl 发表于 2012-4-10 11:34
(while loop
     (while(not(setq li1(entsel"\n请选择第一条等高线:")))
       (alert"没有选中实 ...

现在还有一点想请教版主,如果是按鼠标右键的话,errno的值是不是被重新赋予了一个新值?可我在errno的错误类型值里怎么没找到啊?
发表于 2012-4-10 17:12:30 来自手机 | 显示全部楼层
changyiran 发表于 2012-4-10 17:07
现在还有一点想请教版主,如果是按鼠标右键的话,errno的值是不是被重新赋予了一个新值?可我在errno的错 ...

返回什么值,自己测试一下不就知道了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-9-25 05:45 , Processed in 0.170063 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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