AQucsaiJr 发表于 2022-7-6 12:55:15

全局文本替换(REPSTRING

我在脚本中使用REPSTRING LISP来替换整个文件夹中充满图形的文本。我遇到了一个文本替换问题。我想运行一个文本替换,它将找到:5X-123并将其更改为:5X-999。问题是,在一些图纸中存在:15X123、25X-123和35X-123。除了5X-123字符串之外,我不想更改任何内容。有人知道如何在不影响15X-123、25X-123或35X-123字符串的情况下更改5X-123文本字符串吗?

JohnM 发表于 2022-7-6 12:59:33

你能把剧本贴出来吗?

AQucsaiJr 发表于 2022-7-6 13:02:12

(defun repstring (ostring nstring)
(setq ss (ssget "X" (list (cons 0 "INSERT,TEXT,MTEXT,RTEXT,DTEXT,DIMENSION"))))
    (if ss
      (progn
             (repeat (sslength ss)
             (setq ent (ssname ss 0))
             (setq en (entget ent))
             (setq etype (cdr (Assoc 0 en)))
                  (if (= etype "INSERT")
                     (PROGN
                        (IF (ASSOC 66 EN)
                               (PROGN
                               (SETQ SUB1 (ENTNEXT ENT))
                                    (WHILE (= (CDR (ASSOC 0 (ENTGET SUB1))) "ATTRIB")
                                    (SETQ SUBEN (ENTGET SUB1))
                                    (SETQ STG (CDR (aSSOC 1 SUBEN)))
                                    (SETQ STG (vl-string-subst NSTRING OSTRING STG))
                                    (ENTMOD (sUBST (cONS 1 STG) (aSSOC 1 SUBEN) SUBEN))
                                    (SETQ SUB1 (eNTNEXT SUB1))
                                    )
                               (ENTUPD ENT)
                               )
                        )
                     )
                     (PROGN
                     (SETQ STG (CDR (aSSOC 1 EN)))
                     (SETQ STG (vl-string-subst NSTRING OSTRING STG))
                     (ENTMOD (SUBST (CONS 1 STG) (ASSOC 1 EN) EN))
                     )
                  )
                  

             (ssdel ent ss)
             )
      )
    )
)


(defun c:repstring ()
(SETQ OSTRING (GETSTRING T "\nSTRING TO BE REPLACED: "))
(SETQ NSTRING (GETSTRING T "\nSTRING TO REPLACE WITH: "))
(REPSTRING OSTRING NSTRING)
)

Lee Mac 发表于 2022-7-6 13:06:27

这是因为它使用vl string subst查找任何字符串中的出现项并替换它。
 
5X-123字符串是文本对象中唯一的文本吗?

AQucsaiJr 发表于 2022-7-6 13:10:07

5X-123位于单行文字或多行文字中,但它是文字对象中唯一的文字。

AQucsaiJr 发表于 2022-7-6 13:12:11

这里有一个例子。我只想更改5X-123字符串。
例子。图纸

Lee Mac 发表于 2022-7-6 13:16:52

试试这个:
 

(defun rstring (old new / ss sel)
(vl-load-com)
(setq old (strcase old))
(if (setq ss
       (ssget "_X"
         '((-4 . "<OR")
             (0 . "*TEXT")
               (-4 . "<AND")
               (0 . "INSERT")
               (66 . 1)
               (-4 . "AND>")
         (-4 . "OR>"))))
   (progn
   (vlax-for Obj (setq sel
                     (vla-get-ActiveSelectionSet
                     (vla-get-ActiveDocument
                         (vlax-get-acad-object))))
       (cond ((eq "AcDbBlockReference"
                (vla-get-ObjectName Obj))
            (foreach att (append
                           (vlax-invoke Obj 'GetAttributes)
                               (vlax-invoke Obj 'GetConstantAttributes))
                (if (eq old (strcase
                              (vla-get-TextString att)))
                  (vla-put-TextString att new))))
             (t (if (eq old (strcase
                              (vla-get-TextString Obj)))
                  (vla-put-TextString Obj new)))))
   (vla-delete sel))
   (princ "\n** No Text or Attributed Blocks Found **"))
(princ))

(defun c:test ( )
(rstring "Lee" "Mac")
(princ))

AQucsaiJr 发表于 2022-7-6 13:19:19

我加载这个lsp并尝试调用它,rstring,然后得到未知命令。有什么想法吗?

Lee Mac 发表于 2022-7-6 13:21:06

rString是一个子函数,需要提供两个参数,即旧字符串和新字符串
 
您编写的代码格式相同。

AQucsaiJr 发表于 2022-7-6 13:25:10

我不明白。我必须选择什么吗?或者在rstring之前键入一些内容?
页: [1] 2
查看完整版本: 全局文本替换(REPSTRING