明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: zolly

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

[复制链接]
 楼主| 发表于 2024-11-1 15:49:27 | 显示全部楼层
被承包的东子 发表于 2024-11-1 11:39
(defun c:tt(/ code e1 e2 ent1 ent2 loop mag msg n1 n2 p11 p12 p21 p22 pt s1 s2 ss ss1 ss2)

                                 ...

谢谢解答,主要是想学习entsel这个选择如何处理,ssget本身就有选择空的不会退出要求继续选,所以一个while就解决了,entsel如果点的是空的就返回nil退出了
 楼主| 发表于 2024-11-1 15:51:29 | 显示全部楼层
被承包的东子 发表于 2024-11-1 11:39
(defun c:tt(/ code e1 e2 ent1 ent2 loop mag msg n1 n2 p11 p12 p21 p22 pt s1 s2 ss ss1 ss2)

                                 ...

不过结合你这里面的代码,貌似能看懂一点ssyfeng大佬那段代码了,非常感谢
 楼主| 发表于 2024-11-1 16:23:29 | 显示全部楼层
wzg356 发表于 2024-11-1 11:02
手机想象敲的(while(/= ""(progn(initget " ")(entsel ))))

这个怎么用呢,按空格会跳出循环,但是entsel不管选中选不中都一起循环让选
发表于 2024-11-1 16:57:29 | 显示全部楼层
本帖最后由 kozmosovia 于 2024-11-1 17:01 编辑

需要比较tricky的处理
  1. (DEFUN _PICK (MSG / RR RUN)
  2.   (SETQ RUN T)
  3.   (WHILE RUN
  4.     (SETQ RR (INITGET " ")
  5.     RR (ENTSEL MSG)
  6.     )
  7.     (COND ((= RR "")
  8.      (SETQ RUN NIL
  9.      RR  NIL
  10.      )
  11.     )
  12.     ((= (TYPE RR) 'LIST)
  13.      (SETQ RUN NIL
  14.      RR  (CAR RR)
  15.      )
  16.     )
  17.     )
  18.   )
  19.   RR
  20. )
  21. (AND (SETQ E1 (_PICK "\n选取第一条线:"))
  22.      (SETQ E2 (_PICK "\n选取第二条线:"))
  23. )
复制代码


发表于 2024-11-1 17:07:06 | 显示全部楼层
本帖最后由 被承包的东子 于 2024-11-1 17:12 编辑



(defun c:ttt (/ e1 e2)
        (while(/= ""(if (and (NULL(initget " ")) (/= ""(setq E1 (entsel "选择第一根直线"))) (NULL(initget " ")) (/= ""(setq E2 (entsel "选择第二根直线"))))
                                                                (zhs E1 E2)
                                                                ""         
                                                        )))       
(PRINC)       
)


(defun zhs(e1 e2 / ent1 ent2 p11 p12 p21 p22 pt s1 s2 ss)
       
        (if (and e1 e2)                                               
                                                (progn
                                                        ;(setq loop nil)
                                                        (setq ent1 (entget (CAR e1)))                               
                                                        (setq p11 (cdr (assoc 10 ent1)))                               
                                                        (setq p12 (cdr (assoc 11 ent1)))                               
                                                        (setq ent2 (entget (CAR 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)                                               
                                                )
                                               
                                        )
       
)
发表于 2024-11-1 18:38:00 来自手机 | 显示全部楼层
zolly 发表于 2024-11-1 16:23
这个怎么用呢,按空格会跳出循环,但是entsel不管选中选不中都一起循环让选

(progn……)选中返回表,选不中返回nil,回车/右键/空格——返回“”,自己设定循环条件就行了,用手机打的,没法写多。
 楼主| 发表于 2024-11-2 07:41:09 | 显示全部楼层
wzg356 发表于 2024-11-1 18:38
(progn……)选中返回表,选不中返回nil,回车/右键/空格——返回“”,自己设定循环条件就行了,用手机 ...

好的,谢谢
 楼主| 发表于 2024-11-2 07:50:13 | 显示全部楼层
被承包的东子 发表于 2024-11-1 17:07
(defun c:ttt (/ e1 e2)
        (while(/= ""(if (and (NULL(initget " ")) (/= ""(setq E1 (entsel "选择第 ...

有点BUG,调试一下就好了,非常感谢
 楼主| 发表于 2024-11-2 07:56:54 | 显示全部楼层
kozmosovia 发表于 2024-11-1 16:57
需要比较tricky的处理

非常感谢解答
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-21 01:40 , Processed in 0.255805 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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