pmxcad 发表于 2022-7-5 19:15:12

用于动态块的gatte

你好
 
我正在使用gatte更新几个版面的标题栏。我已经将标题栏编辑成一个带有可调北箭头的动态块。由于将块更改为动态块,块得到了一致的名称,gatte不再工作。有办法改变Lisp程序吗?
 

;;
;;;
;;;    GATTE.LSP
;;;    Copyright © 1999 by Autodesk, Inc.
;;;
;;;    Your use of this software is governed by the terms and conditions of the
;;;    License Agreement you accepted prior to installation of this software.
;;;    Please note that pursuant to the License Agreement for this software,
;;;    "opying of this computer program or its documentation except as
;;;    permitted by this License is copyright infringement under the laws of
;;;    your country.If you copy this computer program without permission of
;;;    Autodesk, you are violating the law."
;;;
;;;    AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS.
;;;    AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF
;;;    MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE.AUTODESK, INC.
;;;    DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE
;;;    UNINTERRUPTED OR ERROR FREE.
;;;
;;;    Use, duplication, or disclosure by the U.S. Government is subject to
;;;    restrictions set forth in FAR 52.227-19 (Commercial Computer
;;;    Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii)
;;;    (Rights in Technical Data and Computer Software), as applicable.
;;;
;;;----------------------------------------------------------------
;modified for XXX_YYY type attributes - CAD Studio 2012, www.cadstudio.cz

(Defun C:gatte ( /
    N      ;selection set counter
    CC   ;changed counter
    BN   ;block name
    TG   ;tag name
    ESel   ;entity pick/name/list
    EL   ;entity list
    EN   ;entity name
    PASS   ;loop pass flag
    TAGL   ;list of valid tags for a block
    TAGS   ;String of valid tags for a block
    TAGT   ;Temp tag list
    ;TAG    ;tag name in loop
    TMP    ;temporary variable
    SS1    ;selection set of insert objects
    XX X   ;flag and counter
    OLDCC;previous count of changes for update test
    A      ;entity information in change loop
    FL LA;frozen layer check variables
    na b
    )

(acet-error-init
   (List
      (List "cmdecho" 0)
      T   ;flag. True means use undo for error clean up.
   ) ;list
);acet-error-init
(sssetfirst nil nil)
;;
(Setq n 0
      cc 0
)
(while (null Pass)
   (initget "Block _Block")
;;      (setq ESel (entsel "\nBlock name/<select block or attribute>: "))
   (setq ESel (entsel "\nSelect block or attribute : "))
   (cond
       ((null ESel) (setq Pass 'T BN nil))
       ((= (type ESel) 'LIST) ;;pick selection
          (setq EL (entget (car ESel)))
          (if (= (cdr (assoc 0 EL)) "INSERT")
            (setq BN (cdr (assoc 2 EL))
                  Pass 'T
                  ESel (nentselp (cadr ESel))
                  EL (entget (car Esel))
                  TG (if (= (cdr (assoc 0 EL)) "ATTRIB")
                           (cdr (assoc 2 EL))
                           nil
                     )
            )
            (prompt "\nSelected item not an INSERT.")
          );end if
       );end second conditional for picking attrib
       ((and (= (type ESel) 'STR) (= ESel "Block"))
          (setq BN (getstring "\nEnter block name: "))
          (if (tblsearch "BLOCK" BN)
             (setq Pass 'T)
             (prompt "\nInvalid block name.")
          )
       );end third conditional
   );the conditional statement ends
) ;;end of Block Name entry.

(if BN (progn
    (setq Pass nil
          EN (cdr (assoc -2 (tblsearch "BLOCK" BN)))
    )
    (while EN
       (setq EL (entget EN))
       (if (= (cdr (assoc 0 EL)) "ATTDEF")
          (setq TAGL (cons (cdr (assoc 2 EL)) TAGL)))
       (setq EN (entnext EN))
    )
)) ;;end if BN progn
(if TG (setq Pass 'T))

(if TAGL
    (progn
      (setq TAGS (car TAGL)
            TAGT (cdr TAGL)
      )
      (foreach TAG TAGT
      (setq TAGS (strcat TAGS " " TAG))
      )
    )
)

(while (and TAGS (null Pass))
   (initget (strcat "Name " (acet-str-replace "_" "-" TAGS)))
   (prompt (strcat "\nKnown tag names for block: " TAGS))
   (setq ESel (nentsel "\nSelect attribute or type attribute name (or ): "))
   (if (= ESel "Name")(setq ESel (getstring " attribute name: ")))

   (cond
       ((= (type ESel) 'STR)
          (setq ESel (strcase ESel))
          (if (member ESel TAGL)
            (setq Pass 'T
                  TG    ESel
            )
            (prompt "\nInvalid attribute name.")
          )
       )
       ((= (type ESel) 'LIST) ;;pick selection
          (setq TG (cdr (assoc 2 (entget (car ESel)))))
          (if TG
            (setq Pass 'T)
          )
       )
   );the conditional statement ends
) ;;end of Attribute Name entry.


(if (and BN (null TAGL))
   (setq BN (prompt "\nThe block selected has no attributes!")))
(If (And BN TG)
   (Progn
      (prompt (acet-str-format "\nBlock: %1   Attribute tag: %2" BN TG))
      (Setq
         NA (GetString T "\nEnter new text: ")
         SS1 (SsGet "_X"
                (List
                   (Cons 0 "INSERT")
                   (Cons 2 bn)
                   (Cons 66 1)
                )
             )
         N (If SS1 (SsLength SS1) 0)
      )
      (initget 0 "Yes No _Yes No")
      (setq TMP
          (getkword
            (acet-str-format "\nNumber of inserts in drawing = %1Process all of them? <Yes>: " (itoa N))))
      (if (and TMP (= TMP "No"))
         (setq SS1 (ssget (list (cons 0 "INSERT")
                                  (cons 2 BN)
                                  (cons 66 1)))
               N (if SS1 (sslength SS1) 0)
         )
      )
      (if (> N 0) (Princ "\nPlease wait..."))
      (setq x 0)
      (repeat N
         (setq A (ssname SS1 x)
               B (entget A)
               la (cdr (assoc 8 B))      ;layer name from object
               fl (tblsearch "LAYER" la) ;table entry for layer
               fl (cdr (assoc 70 fl))    ;layer status flag
         )
         (if (/= fl 65) ;if layer not frozen
            (progn
               (setq XX 1
                     oldcc cc)
               (while XX
                  (setq
                     B (EntGet (EntNext (CDR (Assoc -1 B))))
                  )
                  (If (= (CDR (Assoc 0 B)) "SEQEND")
                     (Setq xx Nil)
                     (Progn
                        (If (= (CDR (Assoc 2 b)) tg)
                           (Progn
                              (Setq B (subst (Cons 1 NA) (assoc 1 B) B)
                                    CC (1+ CC)
                              )
                              (EntMod B)
                           ) ;progn
                        ) ;if
                     ) ;progn
                  ) ;if
               ) ;while
               (If (/= cc oldcc) (EntUpd a))
            ) ;progn
         ) ;if
         (Setq X (1+ X))
      ) ;repeat
      (If (/= 1 cc)
          (princ (acet-str-format "\n%1 attributes changed." (itoa cc)))
          (princ (acet-str-format "\n%1 attribute changed." (itoa cc)))
      )
   ) ;progn
)
(acet-error-restore)
(Princ)
) ;defun


(princ)

 
 
谢谢
 
PmxCAD
页: [1]
查看完整版本: 用于动态块的gatte