BLOACH85 发表于 2022-7-6 14:55:12

错误捕获??

这是一个Lisp例程,它在文本、多行文字或尺寸周围绘制一个文本框。我将其修改为绘制该框,并允许用户在框内进行修剪,然后该框就会消失,但如果在任何时候点击escape按钮,则所有osnap设置都会关闭。有人能帮助解决这个lisp上的错误陷阱吗?我试过了,但还没有完全成功。谢谢
 
~诗篇30:5~

BLOACH85 发表于 2022-7-6 14:59:30

(defun c:TB ( )(c:Text-Box));Shortcut
(defun c:Text-Box (/ Cnt# EntName^ Osmode# Pt PtsList@ SS& ss ln1 ln2 eln1 eln2 pln1 pln2 ln1p1 ln1p2 ln2p1 ln2p2
                  p1 p2 p3 p4 cmd osm)
(setq Osmode# (getvar "OSMODE"))
(princ "\nSelect Text, Mtext or Dimension for Text Box")
(if (setq SS& (ssget '((-4 . "<OR")(0 . "TEXT")(0 . "MTEXT")(0 . "DIMENSION")(-4 . "OR>"))))
   (progn
   (command "UNDO" "BEGIN")
   (setvar "osmode" 4)
   (setq Cnt# 0)
   (repeat (sslength SS&)
   (setq EntName^ (ssname SS& Cnt#))
       (setq PtsList@ (append (Text-Box EntName^) (list "C")))
(setq Cnt# (+ 4 Cnt#))
       (command "PLINE" (foreach Pt PtsList@(command Pt) ))
       (command "_offset" "_erase" "_yes" 3.75 (entlast) "0,0,0" "exit")

   );repeat
   (setvar "OSMODE" Osmode#)
   (command "_trim" "_last" "" "_crossing"(while(> (getvar "cmdactive")0)(command pause) ptslist@)"" "_erase" "_previous""")
   (command "_offset" "e" "no" "" "_EXIT")
   (command "UNDO" "END")
   (setvar "OSMODE" Osmode#)
   (redraw)
   );progn
   (princ "\nNo Text, Mtext or Dimension selected.")
)
(princ)
);defun c:Text-Box
;-------------------------------------------------------------------------------
; Text-Box - Function for Text, Mtext and Dimension entities
; Arguments: 1
;   Entity^ = Entity name of the Text, Mtext or Dimension to use
; Returns: A list of the four corners of the Text Box
;-------------------------------------------------------------------------------
(defun Text-Box (Entity^ / Ang~ AngEntity~ Corners: EntList@ EntNext^ EntType$
First List@ MovePt NewPts@ Pt Return@ Textboxes@ X X1 X3 Y Y1 Y3 Zero)
;-----------------------------------------------------------------------------
; Corners: - Calculates the four corners of the Text Box
;-----------------------------------------------------------------------------
(defun Corners: (Entity^ / Ang~ Corners@ Dist~ EntList@ Ins Pt Pt1 Pt2 Pt3 Pt4)
   (setq EntList@ (entget Entity^)
         Corners@ (textbox EntList@)
         Ang~ (cdr (assoc 50 EntList@))
         Ins (cdr (assoc 10 EntList@))
         Pt (mapcar '+ (car Corners@) Ins)
         Pt1 (polar Ins (+ Ang~ (angle Ins Pt)) (distance Ins Pt))
         Pt (mapcar '+ (cadr Corners@) Ins)
         Pt3 (polar Ins (+ Ang~ (angle Ins Pt)) (distance Ins Pt))
         Dist~ (* (distance (car Corners@) (cadr Corners@)) (cos (- (angle Pt1 Pt3) Ang~)))
         Pt2 (polar Pt1 Ang~ Dist~)
         Pt4 (polar Pt3 Ang~ (- Dist~))


   );setq
   (list Pt1 Pt2 Pt3 Pt4)
);defun Corners:
;-----------------------------------------------------------------------------
(setq EntList@ (entget Entity^)
       EntType$ (cdr (assoc 0 EntList@))
);setq
(cond
   ((= EntType$ "TEXT")
   (setq Return@ (Corners: Entity^))
   );case
   ((or (= EntType$ "MTEXT")(= EntType$ "DIMENSION"))
   (command "UNDO" "MARK")
   (setq EntNext^ (entlast))
   (command "EXPLODE" Entity^)
   (if (= EntType$ "DIMENSION")
       (command "EXPLODE" (entlast))
   );if
   (while (setq EntNext^ (entnext EntNext^))
       (if (= "TEXT" (cdr (assoc 0 (entget EntNext^))))
         (setq Textboxes@ (append Textboxes@ (list (Text-Box EntNext^))))
       );if
   );while
   (command "UNDO" "BACK")
   (setq AngEntity~ (angle (nth 0 (nth 0 Textboxes@))(nth 1 (nth 0 Textboxes@)))
         Zero (list 0 0)
         First t
   );setq
   (foreach List@ Textboxes@
       (foreach Pt List@
         (setq X (car Pt) Y (cadr Pt))
         (if First
         (setq First nil X1 X Y1 Y)
         );if
         (if (< X X1)(setq X1 X))
         (if (< Y Y1)(setq Y1 Y))
       );foreach
   );foreach
   (if (or (< X1 0)(< Y1 0))
       (progn
         (cond
         ((and (< X1 0)(< Y1 0))(setq MovePt (list X1 Y1)))
         ((< X1 0)(setq MovePt (list X1 0)))
         ((< Y1 0)(setq MovePt (list 0 Y1)))
    (setq x1 (+ 1))
    (setq y1 (+ 1))
         );cond
         (command "UCS" "M" MovePt)
       );progn
   );if
   (setq First t)
   (foreach List@ Textboxes@
       (foreach Pt List@
         (setq Ang~ (- (angle Zero Pt) AngEntity~))
         (setq Pt (polar Zero Ang~ (distance Zero Pt)))
         (setq X (car Pt) Y (cadr Pt))
         (if First
         (setq First nil X1 X X3 X Y1 Y Y3 Y)
         );if
         (if (< X X1)(setq X1 X))
         (if (< Y Y1)(setq Y1 Y))
         (if (> X X3)(setq X3 X))
         (if (> Y Y3)(setq Y3 Y))
       );foreach
   );foreach
   (command "UCS" "W")
   (setq NewPts@ (list (list X1 Y1)(list X3 Y1)(list X3 Y3)(list X1 Y3)))
   (foreach Pt NewPts@
       (setq Ang~ (+ (angle Zero Pt) AngEntity~))
       (setq Pt (polar Zero Ang~ (distance Zero Pt)))
       (setq Return@ (append Return@ (list Pt)))
   );foreach
   );case
)
Return@
);defun Text-Box
;-------------------------------------------------------------------------------
(princ)

Se7en 发表于 2022-7-6 15:02:44

到目前为止,我见过的最好的错误处理程序必须来自一个叫Evgeniy的朋友。
 
试一试:
(*错误*“”)

Lee Mac 发表于 2022-7-6 15:04:56

Se7en,就要打败我了:
 

(defun c:tb () (c:text-box))
(defun c:text-box(/ *error* vlst ovars cnt# entname^ osmode# pt ptslist@ ss& ss ln1
             ln2 eln1 eln2 pln1 pln2 ln1p1 ln1p2 ln2p1
             ln2p2 p1 p2 p3 p4 cmd osm)

(defun *error*(msg)
   (if    ovars
   (mapcar 'setvar vlst ovars))
   (princ))

(setq    vlst'("OSMODE"); <<--- List changed variables here
   ovars (mapcar 'getvar vlst))

(princ "\nSelect Text, Mtext or Dimension for Text Box")
(setq osmode# (getvar "OSMODE"))
(if (setq ss& (ssget '((-4 . "<OR") (0 . "TEXT") (0 . "MTEXT") (0 . "DIMENSION") (-4 . "OR>"))))
   (progn
   (command "UNDO" "BEGIN")
   (setvar "osmode" 4)
   (setq cnt# 0)
   (repeat (sslength ss&)
   (setq entname^ (ssname ss& cnt#))
   (setq ptslist@ (append (text-box entname^) (list "C")))
   (setq cnt# (+ 4 cnt#))
   (command "PLINE" (foreach pt ptslist@ (command pt)))
   (command "_offset" "_erase" "_yes" 3.75 (entlast) "0,0,0" "exit")

   ) ;repeat
   (setvar "OSMODE" osmode#)
   (command "_trim"
          "_last"
          ""
          "_crossing"
          (while (> (getvar "cmdactive") 0) (command pause) ptslist@)
          ""
          "_erase"
          "_previous"
          "")
   (command "_offset" "e" "no" "" "_EXIT")
   (command "UNDO" "END")
   (setvar "OSMODE" osmode#)
   (redraw)
   ) ;progn
   (princ "\nNo Text, Mtext or Dimension selected.")
   )
(mapcar 'setvar vlst ovars)
(princ)
) ;defun c:Text-Box

;-------------------------------------------------------------------------------
; Text-Box - Function for Text, Mtext and Dimension entities
; Arguments: 1
;   Entity^ = Entity name of the Text, Mtext or Dimension to use
; Returns: A list of the four corners of the Text Box
;-------------------------------------------------------------------------------
(defun text-box   (entity^   /          ang~    angentity~      corners:entlist@    entnext^enttype$first
         list@      movept    newpts@    pt      return@   textboxes@      x      x1      x3
         y      y1          y3    zero)
;-----------------------------------------------------------------------------
; Corners: - Calculates the four corners of the Text Box
;-----------------------------------------------------------------------------
(defun corners:(entity^ / ang~ corners@ dist~ entlist@ ins pt pt1 pt2 pt3 pt4)
   (setq entlist@ (entget entity^)
   corners@ (textbox entlist@)
   ang~       (cdr (assoc 50 entlist@))
   ins       (cdr (assoc 10 entlist@))
   pt       (mapcar '+ (car corners@) ins)
   pt1       (polar ins (+ ang~ (angle ins pt)) (distance ins pt))
   pt       (mapcar '+ (cadr corners@) ins)
   pt3       (polar ins (+ ang~ (angle ins pt)) (distance ins pt))
   dist~       (* (distance (car corners@) (cadr corners@)) (cos (- (angle pt1 pt3) ang~)))
   pt2       (polar pt1 ang~ dist~)
   pt4       (polar pt3 ang~ (- dist~))


   ) ;setq
   (list pt1 pt2 pt3 pt4)
   ) ;defun Corners:
;-----------------------------------------------------------------------------
(setq    entlist@ (entget entity^)
   enttype$ (cdr (assoc 0 entlist@))
   ) ;setq
(cond
   ((= enttype$ "TEXT")
    (setq return@ (corners: entity^))
    ) ;case
   ((or (= enttype$ "MTEXT") (= enttype$ "DIMENSION"))
    (command "UNDO" "MARK")
    (setq entnext^ (entlast))
    (command "EXPLODE" entity^)
    (if (= enttype$ "DIMENSION")
      (command "EXPLODE" (entlast))
      ) ;if
    (while (setq entnext^ (entnext entnext^))
      (if (= "TEXT" (cdr (assoc 0 (entget entnext^))))
    (setq textboxes@ (append textboxes@ (list (text-box entnext^))))
    ) ;if
      ) ;while
    (command "UNDO" "BACK")
    (setq angentity~ (angle (nth 0 (nth 0 textboxes@)) (nth 1 (nth 0 textboxes@)))
      zero          (list 0 0)
      first      t
      ) ;setq
    (foreach list@textboxes@
      (foreach    ptlist@
    (setq x (car pt)
          y (cadr pt))
    (if first
      (setq first nil
      x1    x
      y1    y)
      ) ;if
    (if (< x x1)
      (setq x1 x))
    (if (< y y1)
      (setq y1 y))
    ) ;foreach
      ) ;foreach
    (if (or (< x1 0) (< y1 0))
      (progn
    (cond
      ((and (< x1 0) (< y1 0)) (setq movept (list x1 y1)))
      ((< x1 0) (setq movept (list x1 0)))
      ((< y1 0) (setq movept (list 0 y1)))
      (setq x1 (+ 1))
      (setq y1 (+ 1))
      ) ;cond
    (command "UCS" "M" movept)
    ) ;progn
      ) ;if
    (setq first t)
    (foreach list@textboxes@
      (foreach    ptlist@
    (setq ang~ (- (angle zero pt) angentity~))
    (setq pt (polar zero ang~ (distance zero pt)))
    (setq x (car pt)
          y (cadr pt))
    (if first
      (setq first nil
      x1    x
      x3    x
      y1    y
      y3    y)
      ) ;if
    (if (< x x1)
      (setq x1 x))
    (if (< y y1)
      (setq y1 y))
    (if (> x x3)
      (setq x3 x))
    (if (> y y3)
      (setq y3 y))
    ) ;foreach
      ) ;foreach
    (command "UCS" "W")
    (setq newpts@ (list (list x1 y1) (list x3 y1) (list x3 y3) (list x1 y3)))
    (foreach ptnewpts@
      (setq ang~ (+ (angle zero pt) angentity~))
      (setq pt (polar zero ang~ (distance zero pt)))
      (setq return@ (append return@ (list pt)))
      ) ;foreach
    ) ;case
   )
return@
) ;defun Text-Box
;-------------------------------------------------------------------------------
(princ)

 
^^没有那么优雅

Se7en 发表于 2022-7-6 15:08:54

> ... 没有那么优雅。。。
 
哦,别难过!当我第一次看到他的解决方案时,我被震撼了(事实上,我差点从椅子上摔下来!)。这太神奇了,不是吗?此外,看起来你也有同样的想法。

alanjt 发表于 2022-7-6 15:13:53

这是我在模板中保留的*错误*处理程序。非常欢迎你来这里。我继续并添加了osmode的重置和撤消结束。如果使用这种类型的*错误*处理程序,则必须将其本地化(将其放置在主例程中,并将*错误*添加到局部变量中)。
 
;;;error handler

(defun *error* (msg)
   (and Osmode# (setvar "osmode" Osmode#))
   (command "_.undo" "_e")
   (if
   (not
   (member
   msg
   '("console break" "Function cancelled" "quit / exit abort")
   ) ;_ member
   ) ;_ not
      (princ (strcat "\nError: " msg))
   ) ;_ if
) ;_ defun

Lee Mac 发表于 2022-7-6 15:16:37

看起来他正在以一种“脚本”的方式思考这个问题——创建一个可以随意评估的编码列表。
 
好主意

Lee Mac 发表于 2022-7-6 15:17:32

 
好的一点-我已经讨论了很多关于本地化错误处理程序的问题,而不是
 
我不确定是否有一种“正确”的方法来实现它,但我更喜欢在重新定义后定位“错误”。

alanjt 发表于 2022-7-6 15:21:50

废话,我想每个人都赢了我。
约翰,你再一次证明了你是我的英雄。
 
哎呀,我讨厌我在mac电脑上粘贴代码的样子。

Lee Mac 发表于 2022-7-6 15:23:54

只是一种选择:
 
我从David Bethel那里学到了一些东西:
 


;++++++++++++ Set Modes & Error ++++++++++++++++++++++++++++++++++
(defun nw_smd ()
   (SetUndo)
   (setq oldlay(getvar "CLAYER")
   olderr*error*
   *error* (lambda (e)
             (while (> (getvar "CMDACTIVE") 0)
             (command)
             ) ;_end while
             (and (/= e "quit / exit abort")
            (princ (strcat "\nError: *** " e " *** "))
             ) ;_end and
             (and (= (logand (getvar "UNDOCTL")8)
            (command "_.UNDO" "_END" "_.U")
             ) ;_end and
             (nw_rmd)
         ) ;_end lambda
   nw_var'(("CMDECHO" . 0)
         ("MENUECHO" . 0)
         ("MENUCTL" . 0)
         ("MACROTRACE" . 0)
         ("OSMODE" . 0)
         ("SORTENTS" . 119)
         ("MODEMACRO" . ".")
         ("LUPREC" . 2)
         ("BLIPMODE" . 0)
         ("EXPERT" . 0)
         ("SNAPMODE" . 1)
         ("PLINEWID" . 0)
         ("ORTHOMODE" . 1)
         ("GRIDMODE" . 0)
         ("ELEVATION" . 0)
         ("THICKNESS" . 0)
         ("FILEDIA" . 0)
         ("FILLMODE" . 0)
         ("SPLFRAME" . 0)
         ("UNITMODE" . 0)
         ("TEXTEVAL" . 0)
         ("ATTDIA" . 0)
         ("AFLAGS" . 0)
         ("ATTREQ" . 1)
         ("ATTMODE" . 1)
         ("UCSICON" . 1)
         ("HIGHLIGHT" . 1)
         ("REGENMODE" . 1)
         ("COORDS" . 2)
         ("DRAGMODE" . 2)
         ("DIMZIN" . 1)
         ("PDMODE" . 0)
         ("CECOLOR" . "BYLAYER")
         ("CELTYPE" . "BYLAYER")
          )
   ) ;_end setq
   (foreach v nw_var
   (and (getvar (car v))
      (setq nw_rst (cons (cons (car v) (getvar (car v))) nw_rst))
      (setvar (car v) (cdr v))
   ) ;_end and
   ) ;_end foreach
   (princ (strcat (getvar "PLATFORM") " Release " (ver)))
   (princ)
) ;_end defun

(PDot) ;++++++++++++ Return Modes & Error +++++++++++++++++++++++++++++++
(defun nw_rmd ()
   (SetLayer oldlay)
   (setq *error* olderr)
   (foreach v nw_rst (setvar (car v) (cdr v)))
   (command "_.UNDO" "_END")
   (prin1)
) ;_end defun

(PDot) ;++++++++++++ Set And Start An Undo Group ++++++++++++++++++++++++
(defun SetUndo ()
   (and (zerop (getvar "UNDOCTL"))
    (command "_.UNDO" "_ALL")
   ) ;_end and
   (and (= (logand (getvar "UNDOCTL") 2) 2)
    (command "_.UNDO" "_CONTROL" "_ALL")
   ) ;_end and
   (and (= (logand (getvar "UNDOCTL")8)
    (command "_.UNDO" "_END")
   ) ;_end and
   (command "_.UNDO" "_GROUP")
) ;_end defun

(PDot) ;++++++++++++ Make Layer Current +++++++++++++++++++++++++++++++++
(defun SetLayer    (name / ldef flag)
   (command "_.LAYER")
   (if    (not (tblsearch "LAYER" name))
   (command "_Make" name)
   (progn
       (setq ldef (tblsearch "LAYER" name)
         flag (cdr (assoc 70 ldef))
       ) ;_end setq
       (and (= (logand flag 1) 1)
      (command "_Thaw" name)
       ) ;_end and
       (and (minusp (cdr (assoc 62 ldef)))
      (command "_On" name)
       ) ;_end and
       (and (= (logand flag 4) 4)
      (command "_Unlock" name)
       ) ;_end and
       (and (= (logand flag 16) 16)
      (princ "\nCannot Set To XRef Dependent Layer")
      (quit)
       ) ;_end and
       (command "_Set" name)
   ) ;_end progn
   ) ;_end if
   (command "")
   name
) ;_end defun

;************ Main Program ***************************************
(defun nw_ (/ olderr oldlay nw_var nw_rst)
   (nw_smd)

;;;DO YOUR THING HERE

   (nw_rmd)
) ;_end defun

(defun C:NW () (nw_))
(if nw_
   (princ "\nNew Loaded\n")
) ;_end if
(prin1)

 
我见过的最复杂的错误模板。。。
页: [1] 2
查看完整版本: 错误捕获??