FastFiber

Meerdere teksten tegelijkertijd aanpassen met 1 klik

Gestart door Arjen, vr 03 02 2017, 12:12:51

Vorige topic - Volgende topic

EddyBeerke

Citaat van: Arjen op do 09 02 2017, 14:46:32
...
Als ik een tekening heb met 'aanbrengen betonverharding' en 'aanbrengen trottoirtegels' en 'aanbrengen trottoirband' en 'aanbrengen asfaltverharding' etc. Is het dan mogelijk in de lisp alleen het woord 'aanbrengen' te vervangen. Want als ik dus één van de bovenstaande voorbeelden heb, vervangt deze het woord niet, dan doet de lisp het niet.
Het kan wel maar dan moet je dus gaan programmeren.
Sneller om het commando "FIND" te gebruiken.
Civil3d 2026, Blender 4.x gebruiker
Gebruiker sinds AutoCAD R12

http://eddylucas.c1.biz/
https://www.google.com/maps/contrib/109381066561676463628/photos/

roy_043

(vl-load-com)

; (String_Subst "aabbaacc" "aa" "xx") => "xxbbxxcc"
(defun String_Subst (str old new)
  (while (vl-string-search old str)
    (setq str (vl-string-subst new old str))
  )
  str
)

(defun TxtSelSubst (old new / ss)
  (if
    (setq ss
      (ssget
        "_X"
        (list
          '(-4 . "<OR")
            '(-4 . "<AND") '(0 . "MTEXT,TEXT") (cons 1 (strcat "*" old "*")) '(-4 . "AND>")
            '(-4 . "<AND") '(0 . "INSERT") '(66 . 1) '(-4 . "AND>")
          '(-4 . "OR>")
        )
      )
    )
    (mapcar
      '(lambda (enm / obj)
        (setq obj (vlax-ename->vla-object enm))
        (if (= "AcDbBlockReference" (vla-get-objectname obj))
          (foreach att (vlax-invoke obj 'getattributes)
            (vla-put-textstring att (String_Subst (vla-get-textstring att) old new))
          )
          (vla-put-textstring obj (String_Subst (vla-get-textstring obj) old new))
        )
      )
      (mapcar 'cadr (ssnamex ss))
    )
  )
)

(defun c:Test ( / doc)
  (setq doc (vla-get-activedocument (vlax-get-acad-object)))
  (vla-endundomark doc)
  (vla-startundomark doc)
  (TxtSelSubst "aanbrengen" "aangebracht")
  (TxtSelSubst "Aanbrengen" "Aangebracht")
  (TxtSelSubst "AANBRENGEN" "AANGEBRACHT")
  (TxtSelSubst "herplaatsen" "herplaatst")
  (TxtSelSubst "Herplaatsen" "Herplaatst")
  (TxtSelSubst "HERPLAATSEN" "HERPLAATST")
  (TxtSelSubst "abc" "def")
  (TxtSelSubst "Abc" "Def")
  (TxtSelSubst "ABC" "DEF")
  ; ... etc.
  (vla-endundomark doc)
  (princ)
)


EddyBeerke

Civil3d 2026, Blender 4.x gebruiker
Gebruiker sinds AutoCAD R12

http://eddylucas.c1.biz/
https://www.google.com/maps/contrib/109381066561676463628/photos/

roy_043

Verbeterde versie...
De functie String_Subst kwam in een oneindige lus terecht als de nieuwe tekst de oude tekst bevatte.
(vl-load-com)

; (String_Subst "aabbaacc" "aa" "xx")   => "xxbbxxcc"
; (String_Subst "aabbaacc" "aa" "xxaa") => "xxaabbxxaacc"
(defun String_Subst (str old new / idx)
  (setq idx 0)
  (while (setq idx (vl-string-search old str idx))
    (setq str (vl-string-subst new old str idx))
    (setq idx (+ idx (strlen new)))
  )
  str
)

(defun TxtSelSubst (old new / ss)
  (if
    (setq ss
      (ssget
        "_X"
        (list
          '(-4 . "<OR")
            '(-4 . "<AND") '(0 . "MTEXT,TEXT") (cons 1 (strcat "*" old "*")) '(-4 . "AND>")
            '(-4 . "<AND") '(0 . "INSERT") '(66 . 1) '(-4 . "AND>")
          '(-4 . "OR>")
        )
      )
    )
    (mapcar
      '(lambda (enm / obj)
        (setq obj (vlax-ename->vla-object enm))
        (if (= "AcDbBlockReference" (vla-get-objectname obj))
          (foreach att (vlax-invoke obj 'getattributes)
            (vla-put-textstring att (String_Subst (vla-get-textstring att) old new))
          )
          (vla-put-textstring obj (String_Subst (vla-get-textstring obj) old new))
        )
      )
      (mapcar 'cadr (ssnamex ss))
    )
  )
)

(defun c:Test ( / doc)
  (setq doc (vla-get-activedocument (vlax-get-acad-object)))
  (vla-endundomark doc)
  (vla-startundomark doc)
  (TxtSelSubst "aanbrengen" "aangebracht")
  (TxtSelSubst "Aanbrengen" "Aangebracht")
  (TxtSelSubst "AANBRENGEN" "AANGEBRACHT")
  (TxtSelSubst "herplaatsen" "herplaatst")
  (TxtSelSubst "Herplaatsen" "Herplaatst")
  (TxtSelSubst "HERPLAATSEN" "HERPLAATST")
  (TxtSelSubst "abc" "def")
  (TxtSelSubst "Abc" "Def")
  (TxtSelSubst "ABC" "DEF")
  ; ... etc.
  (vla-endundomark doc)
  (princ)
)

Arjen

Citaat van: roy_043 op vr 10 02 2017, 14:55:12
Verbeterde versie...
De functie String_Subst kwam in een oneindige lus terecht als de nieuwe tekst de oude tekst bevatte.
(vl-load-com)

; (String_Subst "aabbaacc" "aa" "xx")   => "xxbbxxcc"
; (String_Subst "aabbaacc" "aa" "xxaa") => "xxaabbxxaacc"
(defun String_Subst (str old new / idx)
  (setq idx 0)
  (while (setq idx (vl-string-search old str idx))
    (setq str (vl-string-subst new old str idx))
    (setq idx (+ idx (strlen new)))
  )
  str
)

(defun TxtSelSubst (old new / ss)
  (if
    (setq ss
      (ssget
        "_X"
        (list
          '(-4 . "<OR")
            '(-4 . "<AND") '(0 . "MTEXT,TEXT") (cons 1 (strcat "*" old "*")) '(-4 . "AND>")
            '(-4 . "<AND") '(0 . "INSERT") '(66 . 1) '(-4 . "AND>")
          '(-4 . "OR>")
        )
      )
    )
    (mapcar
      '(lambda (enm / obj)
        (setq obj (vlax-ename->vla-object enm))
        (if (= "AcDbBlockReference" (vla-get-objectname obj))
          (foreach att (vlax-invoke obj 'getattributes)
            (vla-put-textstring att (String_Subst (vla-get-textstring att) old new))
          )
          (vla-put-textstring obj (String_Subst (vla-get-textstring obj) old new))
        )
      )
      (mapcar 'cadr (ssnamex ss))
    )
  )
)

(defun c:Test ( / doc)
  (setq doc (vla-get-activedocument (vlax-get-acad-object)))
  (vla-endundomark doc)
  (vla-startundomark doc)
  (TxtSelSubst "aanbrengen" "aangebracht")
  (TxtSelSubst "Aanbrengen" "Aangebracht")
  (TxtSelSubst "AANBRENGEN" "AANGEBRACHT")
  (TxtSelSubst "herplaatsen" "herplaatst")
  (TxtSelSubst "Herplaatsen" "Herplaatst")
  (TxtSelSubst "HERPLAATSEN" "HERPLAATST")
  (TxtSelSubst "abc" "def")
  (TxtSelSubst "Abc" "Def")
  (TxtSelSubst "ABC" "DEF")
  ; ... etc.
  (vla-endundomark doc)
  (princ)
)


Geil! Tnx guys!

derockere

Ik heb jullie discussie gevolgd en heb gezien dat alles opgelost is.
Nu zit ik wel met een probleempje. Zelf teken ik af en toe in Autocad en ken het bestaan van Lisp-routines.
Nu is mijn vraag hoe moet ik deze Lisp activeren in Autocad?
Die (vl-load-com), is dit een aanroep functie? En wat betekent (defun TxtSelSubst (old new / ss)?
Sorry op dit gebied ben ik nog maar een amateur hoor.

EddyBeerke

#37
Citaat van: derockere op wo 30 08 2017, 09:26:48
Die (vl-load-com), is dit een aanroep functie?
Ja dit is een functie die de Visual Lisp activeert, zodat je o.a. de functie "vl-string-search" kunt gebruiken.
Citaat van: derockere op wo 30 08 2017, 09:26:48En wat betekent (defun TxtSelSubst (old new / ss)?
defun TxtSelSubst = De functie die in (voor) dit programma gemaakt is.
old new= variabelen die door gegeven moeten worden aan deze functie
/ ss = variabelen die locaal, dus in deze functie gebruikt worden en na gebruik van de functie ophouden te bestaan
==-- EDIT --==
(defun c:Test : Hierin geeft de "c:Test" aan dat het om de functie "Test" gaat en die kan van de commandoregel als commando "Test" aangeroepen kan worden. Hiermee is dus een extra commando gemaakt.
==-- EINDE EDIT --==
Dit alles is misschien lastig te begrijpen als je niet een beetje in het programmeren zit.
Misschien zijn de LISP lessen van Joop wel iets voor je om meer begrip te krijgen wat het inhoud:
https://cadsite.be/lisp/lisp.php
Civil3d 2026, Blender 4.x gebruiker
Gebruiker sinds AutoCAD R12

http://eddylucas.c1.biz/
https://www.google.com/maps/contrib/109381066561676463628/photos/

gery

Citaat van: derockere op wo 30 08 2017, 09:26:48
Ik heb jullie discussie gevolgd en heb gezien dat alles opgelost is.
Nu zit ik wel met een probleempje. Zelf teken ik af en toe in Autocad en ken het bestaan van Lisp-routines.
Nu is mijn vraag hoe moet ik deze Lisp activeren in Autocad?
Die (vl-load-com), is dit een aanroep functie? En wat betekent (defun TxtSelSubst (old new / ss)?
Sorry op dit gebied ben ik nog maar een amateur hoor.
Ik denk dat u best eerst ergens een cursus LISP gaat volgen.
Hoe is het trouwens gesteld met uw kennis van AutoCAD? Want "zelf teken ik af en toe in AutoCAD" doet vermoeden dat ook die kennis niet groot is. En om met LISP te beginnen moet u toch een zekere kennis van AutoCAD zelf hebben.
AutoCAD 2020 - Windows 10

derockere

Ik ben begonnen met Autocad in 1988, dit was met Autocad 10, toen nog onder DOS.
Toen heb ik me nog een coprosseccor moeten aanschaffen.
Daarna ben ik voort gegaan met de R14, deze was al héél wat soepeler. Toen heb ik mijn eerste ervaringen opgedaan met Autolisp. Ik heb toen zelf enkele routines gemaakt samen met enkele Scriptfiles.
Nu ben ik op pensioen en heb de beschikking over Autocad 2015.
Hiermee maak ik soms al eens voor mezelf en voor anderen constructie tekeningen, of elektrische schema's.
Het is dus wel een héle tijd geleden dat ik nog eens een Lisproutine heb gebruikt.
Ziezo!

derockere

Citaat van: EddyBeerke op wo 30 08 2017, 09:43:07
Citaat van: derockere op wo 30 08 2017, 09:26:48
Die (vl-load-com), is dit een aanroep functie?
Ja dit is een functie die de Visual Lisp activeert, zodat je o.a. de functie "vl-string-search" kunt gebruiken.
Citaat van: derockere op wo 30 08 2017, 09:26:48En wat betekent (defun TxtSelSubst (old new / ss)?
defun TxtSelSubst = De functie die in (voor) dit programma gemaakt is.
old new= variabelen die door gegeven moeten worden aan deze functie
/ ss = variabelen die locaal, dus in deze functie gebruikt worden en na gebruik van de functie ophouden te bestaan
==-- EDIT --==
(defun c:Test : Hierin geeft de "c:Test" aan dat het om de functie "Test" gaat en die kan van de commandoregel als commando "Test" aangeroepen kan worden. Hiermee is dus een extra commando gemaakt.
==-- EINDE EDIT --==
Dit alles is misschien lastig te begrijpen als je niet een beetje in het programmeren zit.
Misschien zijn de LISP lessen van Joop wel iets voor je om meer begrip te krijgen wat het inhoud:
https://cadsite.be/lisp/lisp.php


Bedankt voor deze tip! Hier kan ik wel mee voort hoor, dit word een lekkere opfrissing.