pBe 发表于 2022-7-6 09:39:25

 
我以前说过。“预防措施”
 
说到错误,我通常使用函数(cond((and…))
 
(defun c:Test(/ a b c)
   (cond
         ((and
                  (setq a (car (entsel "\Select Line:")))
                  (setq b (eq (cdr (Assoc 0 (entget a))) "LINE"))
                  (setq c (getint "\nEnter Number of Cars: "))
                  (setq d (getpoint "\nPick Point on screen: "))
                  (princ "\nDone All Three:")
                  )))
   (princ)
   )
 
但我的大多数人都会问
 
我做错了什么?在我做了这个或没有做那个之后它就停止了!
我错过了什么?
错误消息在哪里?"
 
 
所以我想出了一个_error\u mesage例程
 
(defun c:Test(/ a b c)
    (defun _errorMsg(lst / NilVal)
       (while (eval (setq NilVal (car (car lst))))
             (setq lst (cdr lst)))
       (if lst
             (alert (cadr (assoc NilVal lst))))
       )
   (cond
         ((and
                  (setq a (car (entsel "\Select Line:")))
                  (setq b (eq (cdr (Assoc 0 (entget a))) "LINE"))
                  (setq c (getint "\nEnter Number of Cars: "))
                  (setq d (getpoint "\nPick Point on screen: "))
                  (princ "\nDone All Three:")
                  )))
    (_errorMsg
       (list '(a "Failed to select Object")
             '(b "Not a Line Entity")
             '(c "Failed to Enter Number")
             '(d "Failed ot pick a point")
             ))
   (princ)
   )
 
我知道这听起来可能很奇怪,但您如何将vl catch all apply与getpoint结合使用来捕捉错误?
 
通常我使用initget/if,甚至有一次我使用了ggread
 
我对错误处理函数不是很有效,有时我会使用好的ol
(setq*Error*oldError)thingy。为了爱我,我似乎无法理解vl-catch-apply/vl-catch-all-error-p背后的想法
 
以下是我认为我会使用vl错误捕捉的内容
 

(vl-catch-all-error-p
(vl-catch-all-apply 'cadr
            (setq fp (getpoint "\nPick point:"))))

但是,在两种情况下都出现了拾取点和不拾取点的结果是T,给出了什么?
 
 
-一盎司预防胜于一磅治疗

Lee Mac 发表于 2022-7-6 09:41:01

 
好主意pBe
 
使用vl,您可以将其缩短为:
 
(defun c:Test ( / _errormsg a b c d )

(defun _errormsg ( lst / x )
   (if (setq x (vl-some '(lambda ( x ) (if (null (eval (car x))) (cadr x))) lst))
   (alert x)
   )
)

(cond
   (
   (and
       (setq a (car (entsel "\nSelect Line:")))
       (setq b (eq (cdr (assoc 0 (entget a))) "LINE"))
       (setq c (getint "\nEnter Number of Cars: "))
       (setq d (getpoint "\nPick Point on screen: "))
       (princ "\nDone All Three:")
   )
   )
   ( t
   (_errormsg
      '(
         (a "Failed to select Object")
         (b "Not a Line Entity")
         (c "Failed to Enter Number")
         (d "Failed to pick a point")
       )
   )
   )
)
(princ)
)
 
可以使用以下表达式:
 
其中是一个函数,当提供null点参数时会出错。
 
然而,在我看来,我觉得这是一种糟糕的编程实践,因为你在等待某些东西失败,而不是从一开始就防止错误。
 
 
由于vl catch all apply函数采用与apply函数相同的参数,因此每次都会出错。使用上述代码,您将所选点(或nil)作为参数列表传递,这相当于:
 
(apply 'cadr '(1 2 3)) == (cadr 1 2 3)这将出错。
 
但是,请注意,cadr函数不需要vl catch all apply构造,因为
11

Tharwat 发表于 2022-7-6 09:44:11

 
这真是一个非常聪明的想法。
 
我可能在不久的将来使用它,希望你不要介意。我可以吗?

Qonfire 发表于 2022-7-6 09:48:13

12
 
 
谢谢你们。RenderMan我只需要添加1作为y比例。现在,通过拾取两点,Autocad为我绘制了一个剖面线管道。谢谢大家。请解释问题。我很乐意学习autolisp课程,但显然我不太喜欢。

pBe 发表于 2022-7-6 09:52:29

 
很高兴你喜欢这个想法,我把编码优雅的一面留给你。。。。工具箱的另一个例程
 
 
谢谢你的信息,李,我会试试的。。。。

pBe 发表于 2022-7-6 09:53:31

 
当然你可以。。。我一点也不介意。。
 
干杯

Tharwat 发表于 2022-7-6 09:57:49

 
谢谢你,伙计。

Lee Mac 发表于 2022-7-6 10:02:14

 
和功能:
 
http://www.cadtutor.net/forum/showthread.php?61672-块属性&p=419102&viewfull=1#post419102
 
initget:请参阅initget上的VLIDE帮助文档,查找位代码32。
 
_non=\u none=忽略下一点的所有OSNAP。

Qonfire 发表于 2022-7-6 10:03:33

谢谢你抽出时间
页: 1 [2]
查看完整版本: 插入块并缩放