Ahankhah 发表于 2022-7-6 09:44:36

如何征服entsel#039;s d

朋友们好,
 
正如你们中的一些人所知,entsel是一个很好的选择单个对象的函数,但它在区分“按enter键”和“不选择任何对象”方面有一个严重的缺陷:(。
 
有人有什么建议可以克服这个缺陷吗:哎呀:?

BlackBox 发表于 2022-7-6 10:01:03

我不确定我是否理解你的问题。。。您试图调用什么行为?

Ahankhah 发表于 2022-7-6 10:10:14

代码如下:

(defun C:Length () (MT-TotalLength))

(defun MT-TotalLength (/ *error* ans layname cont len)
   (MT-Start)
   (initget "Name eXit _Name eXit")
   (setq ans nil)
   (setq ans
            (entsel
                "\nSelect an object on the layer to proceed <eXit>: "
            )
   )
   (cond
       ((member ans '(nil "eXit")) (exit))
       ((= "Name" ans)
      (setq cont T)
      (while cont
            (setq layname (getstring T "\nEnter layer name: "))
            (if (null (read layname))
                (progn (princ "\nNull name for layer not allowed, try again."))
                (progn (if (tblsearch "layer" layname)
                           (setq cont nil)
                           (princ (strcat "\nLayer \""
                                          layname
                                          "\" not exists, try again."
                                  )
                           )
                     )
                )
            )
      )
       )
       (T (setq layname (cdr (assoc 8 (entget (car ans))))))
   )
   (and (setq ss (ssget "_X"
                        (list (cons -4 "<OR")
                              (cons 0 "LINE")
                              (cons 0 "ARC")
                              (cons 0 "LWPOLYLINE")
                              (cons -4 "OR>")
                              (cons 8 layname)
                        )
               )
      )
      (setq len (MT-Calc-Length ss))
   )
   (setq msg
            (strcat
                "Total length of objects (Lines, Arcs, Polylines) in layer:   \""
                layname
                "\"\n\nequals to:   "
                (rtos len)
            )
   )
   (princ msg)
   (alert msg)
   (MT-End)
)

(defun MT-Calc-Length (ss / sslist len)
   (setq sslist (MT-Conv-SS-To-List ss))
   (setq len 0)
   (foreach obj sslist (setq len (+ len (MT-Get-Obj-Length obj))))
)

(defun MT-Conv-SS-To-List (ss / entlist index)
   (setq entlist nil)
   (if (= 'PICKSET (type ss))
       (progn (setq index -1)
            (repeat (sslength ss)
                  (setq
                      entlist (append (list (ssname ss (setq index (1+ index))))
                                    entlist
                              )
                  )
            )
       )
   )
   (reverse entlist)
)

(defun MT-Error (msg)
   (or (member (read msg) '(nil *BREAK *CANCEL*)); *EXIT* isn't an error condition
       (princ (strcat "\n** Error: " msg " **"))
   )
   (setvar 'Cmdecho 1)
   (princ)
)

(defun MT-Start () (setq *error* MT-Error) (setvar 'Cmdecho 0))

(defun MT-End () (MT-Error ""))

(defun MT-Exit () (exit))

 
如您所知,在工作空间的空白区域按Enter键和单击鼠标底部没有区别。
这就是上述限制。

alanjt 发表于 2022-7-6 10:15:19

将errno变量与while一起使用

Lee Mac 发表于 2022-7-6 10:29:50

正如Alan所说,可以使用ERRNO系统变量。。。
 
请参阅此处以获取示例。

Ahankhah 发表于 2022-7-6 10:40:54

alanjt和Lee Mac,非常感谢。
我将使用说明和提到的代码。

alanjt 发表于 2022-7-6 10:53:09

享受
页: [1]
查看完整版本: 如何征服entsel#039;s d