明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 588|回复: 20

[源码] entsel如何按空格或回车退出while循环

[复制链接]
发表于 2024-11-1 08:14:39 | 显示全部楼层 |阅读模式
新人自学写了一个标记两条直线交点的程序,entsel空选就循环继续选直到选中,请大神们帮我看看怎么按空格或回车能退出循环,不按空格或回车就一直循环选下去。附代码


  1. ;标记两条直线交点

  2. (defun c:ttt( / e1 e2 ent1 ent2 p11 p12 p21 p22 pt s1 s2 ss)

  3.   (setvar "cmdecho" 0)

  4.   (while T

  5.     (setq e1 (entsel "\n选取第一条线:"))

  6.         (while (= e1 nil)

  7.       (setq e1 (entsel "\n选取第一条线:"))      

  8.       )

  9.    

  10.     (setq e2 (entsel "\n选取第二条线:"))

  11.     (while (= e2 nil)

  12.       (setq e2 (entsel "\n选取第二条线:"))      

  13.       )

  14.     (if (and e1 e2)

  15.       (progn

  16.         (setq ent1 (entget(car e1)))

  17.     (setq p11 (cdr (assoc 10 ent1)))

  18.     (setq p12 (cdr (assoc 11 ent1)))

  19.           (setq ent2 (entget(car e2)))

  20.     (setq p21 (cdr (assoc 10 ent2)))

  21.     (setq p22 (cdr (assoc 11 ent2)))

  22.     (setq pt (inters p11 p12 p21 p22 nil))

  23.   (if (= pt nil)

  24.     (alert "\n所选的两条线为平行线,重选或退出")

  25.     (progn

  26.       (if (< (distance pt p11) (distance pt p12))

  27.         (command "LINE" pt p11 "")      

  28.         (command "LINE" pt p12 "")      

  29.         )

  30.       (setq s1 (entlast))

  31.       (if (< (distance pt p21) (distance pt p22))

  32.         (command "LINE" pt p21 "")      

  33.         (command "LINE" pt p22 "")      

  34.         )

  35.       (setq s2 (entlast))

  36.       (setq ss (ssadd))

  37.       (ssadd s1 ss)

  38.       (ssadd s2 ss)

  39.       (command "_.scale" ss "" pt 0.35)

  40.       )

  41.     )

  42.   )

  43.       )

  44.       

  45.     )

  46.   (princ)

  47.   )


发表于 2024-11-1 11:02:53 来自手机 | 显示全部楼层
手机想象敲的(while(/= ""(progn(initget " ")(entsel ))))

点评

好想法,是咋想到的  发表于 2024-11-1 11:44

评分

参与人数 1明经币 +1 收起 理由
ssyfeng + 1 好思路!

查看全部评分

回复 支持 2 反对 0

使用道具 举报

发表于 2024-11-1 09:04:06 | 显示全部楼层
本帖最后由 ssyfeng 于 2024-11-1 10:03 编辑

试试这个,已更新循环执行

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

点评

非常感谢,里面的东西对我非常有帮助  发表于 2024-11-1 15:55

评分

参与人数 1明经币 +1 收起 理由
zolly + 1

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2024-11-1 10:03:19 | 显示全部楼层
zolly 发表于 2024-11-1 09:52
这个选择一次程序就结束了,要完成一次标记后继续循环标记多个,直到按空格或回车跳出循环结束程序,但是 ...

更新循环执行
回复 支持 1 反对 0

使用道具 举报

发表于 2024-11-1 08:41:08 来自手机 | 显示全部楼层
试试用grread函数
 楼主| 发表于 2024-11-1 08:45:13 | 显示全部楼层
qazxswk 发表于 2024-11-1 08:41
试试用grread函数

能帮忙改一下吗?学习一下,自学的,不知道怎么下手
发表于 2024-11-1 09:04:35 | 显示全部楼层
(while (and (setq e1 (entsel "\n选取第一条线:")) (setq e2 (entsel "\n选取第二条线:")))
....
)
 楼主| 发表于 2024-11-1 09:52:36 | 显示全部楼层
本帖最后由 zolly 于 2024-11-1 09:54 编辑

这个选择一次程序就结束了,要完成一次标记后继续循环标记多个,直到按空格或回车跳出循环结束程序,但是你这个能使正在选的程序按空格结束,我再看看,谢谢帮助
 楼主| 发表于 2024-11-1 10:21:29 | 显示全部楼层

大佬,那个grread那一段看都看不懂,我在外面再嵌套个while程序都运行不了,能不能帮忙完善一下,代码后面如果能注解一下就太感谢了
发表于 2024-11-1 11:39:49 | 显示全部楼层
zolly 发表于 2024-11-1 10:21
大佬,那个grread那一段看都看不懂,我在外面再嵌套个while程序都运行不了,能不能帮忙完善一下,代码后 ...

(defun c:tt(/ code e1 e2 ent1 ent2 loop mag msg n1 n2 p11 p12 p21 p22 pt s1 s2 ss ss1 ss2)

                                (setq loop T N1 nil N2 nil MSG T)
                                (while loop
                                        (setq code (grread T 8) )
                                        (cond
                                                ((= (car code) 5)                                                                                       
                                                        (IF MSG
                                                                (PROGN
                                                                        (princ "点击鼠标左键,进入选择!")
                                                                        (setq MSG nil)
                                                                )
                                                               
                                                        )
                                                )
                                                ((AND (= (car code) 2) (OR (= (cadr code) 32) (= (cadr code) 13)) )
                                                        (princ "\n按键空格或回车,取消操作!")
                                                        (setq loop nil)
                                                )
                                                ((= (car code) 3)                                                                                       
                                                        (setq pt (cadr code))
                                                        (if (and (null n1) (princ "\n请选择第一根直线") (setq sS1 (ssget "_:E" '((0 . "LINE")) )) )
                                                                (PROGN
                                                                        (setq e1 (ssname sS1 0))
                                                                        (setq n1 t)                                                                                                                                               
                                                                )
                                                                (setq e2 nil)                                                               
                                                        )
                                                        (if (and  (princ "\n请选择第二根直线") (setq sS2 (ssget "_:E" '((0 . "LINE")) )) )
                                                                (PROGN
                                                                        (setq e2 (ssname sS2 0))
                                                                        (setq n1 nil)
                                                                       
                                                                )
                                                               
                                                        )                                                       
                                                )                                                                                               
                                        )
                                        (if (and e1 e2)                                               
                                                (progn
                                                        ;(setq loop nil)
                                                        (setq ent1 (entget e1))                               
                                                        (setq p11 (cdr (assoc 10 ent1)))                               
                                                        (setq p12 (cdr (assoc 11 ent1)))                               
                                                        (setq ent2 (entget e2))                               
                                                        (setq p21 (cdr (assoc 10 ent2)))                               
                                                        (setq p22 (cdr (assoc 11 ent2)))                               
                                                        (setq pt (inters p11 p12 p21 p22 nil))                               
                                                        (if (= pt nil)                                       
                                                                (alert "\n所选的两条线为平行线,重选或退出")                                       
                                                                (progn                                               
                                                                        (if (< (distance pt p11) (distance pt p12))                                                       
                                                                                (command "LINE" pt p11 "")                                                             
                                                                                (command "LINE" pt p12 "")                                                             
                                                                        )                                               
                                                                        (setq s1 (entlast))                                               
                                                                        (if (< (distance pt p21) (distance pt p22))                                                       
                                                                                (command "LINE" pt p21 "")                                                             
                                                                                (command "LINE" pt p22 "")                                                             
                                                                        )                                               
                                                                        (setq s2 (entlast))                                               
                                                                        (setq ss (ssadd))                                               
                                                                        (ssadd s1 ss)                                               
                                                                        (ssadd s2 ss)                                               
                                                                        (command "_.scale" ss "" pt 0.35)                                               
                                                                )                                                               
                                                        )       
                                                        (setq e1 nil e2 nil MSG T)                                               
                                                )
                                               
                                        )
                                                       
                                )                                                                                                                               
               
       
        (PRINC)
       
)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-22 20:19 , Processed in 0.205733 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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