Jump to content

Global Text Replace (REPSTRING)


AQucsaiJr

Recommended Posts

I am using REPSTRING LISP in a script to replace text throughout a folder full of drawings. I am having trouble with a text replace problem I came across. I want to run a text replace that will find: 5X-123 and change it too: 5X-999. The problem is, in some of the drawings there exists: 15X123, 25X-123, and 35X-123. I do not want anything except the 5X-123 string to change. Anyone know how I can change the 5X-123 text string without effecting the 15X-123, 25X-123, or 35X-123 strings?

Link to comment
Share on other sites

(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)
)

Link to comment
Share on other sites

Its because it is using vl-string-subst which looks for the occurence in any string and substitutes it.

 

Are the 5X-123 strings the only text in the text object?

Link to comment
Share on other sites

Try this:

 

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

[b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] c:test [b][color=RED]([/color][/b] [b][color=RED])[/color][/b]
 [b][color=RED]([/color][/b]rstring [b][color=#ff00ff]"Lee"[/color][/b] [b][color=#ff00ff]"Mac"[/color][/b][b][color=RED])[/color][/b]
 [b][color=RED]([/color][/b][b][color=BLUE]princ[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]

Link to comment
Share on other sites

I must be missing something. So the LISP I provided, you just call it up and it asks for the string to be replaced and then what to replace it with. I don't know where I am going wrong with your but I can't figure out how to call it up.

 

P.S. I didn't write the REPSTRING LISP. That was a LISP I found here in the forums.

Link to comment
Share on other sites

If you look at the whole LISP there are two function definitions. One is a sub-function, the other is a test function.

 

In the test function, you can see how I have called rstring (the sub-function) with two arguments ("Lee" & "Mac").

 

You can modify the test function to suit your needs, i.e. include prompts, etc.

Link to comment
Share on other sites

To get the code above, that Lee created for you; simply change the text within the " " marks at the bottom. Change "Lee" to whatever text you want to replace, and change "Mac" to the text you want it to become.

Then simply load the lsp, and type Test, and it should work. It did for me, in any case

Link to comment
Share on other sites

Here's with prompts just to clear the confusion :glare:

 

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

[b][color=RED]([/color][/b][b][color=BLUE]defun[/color][/b] c:repstring [b][color=RED]([/color][/b][b][color=BLUE]/[/color][/b] old new[b][color=RED])[/color][/b]
 [b][color=RED]([/color][/b][b][color=BLUE]setq[/color][/b] old [b][color=RED]([/color][/b][b][color=BLUE]getstring[/color][/b] [b][color=BLUE]t[/color][/b] [b][color=#ff00ff]"\nOld String: "[/color][/b][b][color=RED])[/color][/b]
       new [b][color=RED]([/color][/b][b][color=BLUE]getstring[/color][/b] [b][color=BLUE]t[/color][/b] [b][color=#ff00ff]"\nNew String: "[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]
 [b][color=RED]([/color][/b]rstring old new[b][color=RED])[/color][/b]
 [b][color=RED]([/color][/b][b][color=BLUE]princ[/color][/b][b][color=RED])[/color][/b][b][color=RED])[/color][/b]

Link to comment
Share on other sites

Ah Ha.... I misunderstood what you were saying. I guess I was trying to use it like the other LISP. I got it now. Thanks for the detailed explanation. Sorry for the confusion.

Link to comment
Share on other sites

You continue amaze me Lee. This works perfect. I apologize for my ignorance. I have read back through this thread to see were I lost you and it seems I overlooked a post. I was able to figure it out from your test example at the end of the LISP, I was just blind to it in the beginning. Thank you for such quick responses to all my questions. Cheers:)

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...