FastFiber

hoe maak ik lisp script om waarde van blockattribuut in 200 dwg's te wijzigen?

Gestart door delangstevandestraat, ma 13 12 2010, 16:42:10

Vorige topic - Volgende topic

delangstevandestraat

De titel zegt het eigenlijk al hé,
ik weet hoe ik een lisp script kan maken om 200 dwg's af te drukken in één keer,
want -plot in een functie zonder diabox
echter : find en replace >>> hoe geef ik dit in in lisp ??? want de diabox hiervan krijg ik niet uit...
ter nfo : autocad 2007
Ik hou van werken,
ik kan er uuuren naar kijken...
daarom zorg ik ook dat er altijd genoeg overblijft voor morgen :-)

Joop

Een gelovig volger van
"de Sacrale Kunst van Luiheid",
zijn leider "Lisp" en acoliet "Script".

delangstevandestraat

joop, alvast bedankt voor de info, doch het stuk om in 200 dwg iets te doen heb ik al, nu nog het stuk om in een dwg een waarde v/e attribuut v/e block aan te passen.
Ik hou van werken,
ik kan er uuuren naar kijken...
daarom zorg ik ook dat er altijd genoeg overblijft voor morgen :-)

roy_043

@ delangstevandestraat:
Leesvoer:
http://www.theswamp.org/index.php?topic=36153.0
Geef a.u.b. wat meer info:
Wat voor een find/replace wil jij uitvoeren?

delangstevandestraat

ik heb een voorbeeld meegestuurd alsook hetgeen ik al heb kunnen bekomen... (je moet maar enkele kopies maken van het voorbeeld om te simuleren)

Dit werkt... maar niet helemaal, ttz er wordt maar één file goed gedaan dan stopt het kreng en vraag me niet waarom,
ik vermoed dat het iets te maken heeft met het closen van de file, want als ik deze twee regels weglaat dan doet ze wel alles. maar staan alle tekeningen nog open, met een 10-tal kan dit nog maar uiteindelijk moet dit runnen op honderden files. ik vrees dat ze dan zal crashen.

de bedoeling : in de block titelsid wil ik iets wijzigen aan attrib 7000, nl ipv "12&13/" moet er "10...." komen.

aanvaardbaar zou ook zijn dat ik gewoon de volledige waarde van attrib 7000 vervang want er zijn enkele dwg's waar "12&13" anders geschreven staat, (met een - bvb of een extra spatie)

help, (als je wil)
Ik hou van werken,
ik kan er uuuren naar kijken...
daarom zorg ik ook dat er altijd genoeg overblijft voor morgen :-)

roy_043

Opmerkingen:
1.
Na "qsave" en "close" schrijf je "no" naar het scr-bestand. Maar na qsave wordt de vraag "Do you want to save?" niet meer gesteld.
2.
Je start het script vanuit de lisp. Dit betekent dat de tekening van waaruit je de lisp hebt gestart niet in het script mag komen te staan. Deze tekening moet open blijven anders wordt het cad-programma instabiel. Je zou de lisp dus moeten starten vanuit een andere map. Alternatief is om het script "met de hand" te starten.
3.
Je kunt met attedit alleen een vaste tekst door een andere vaste tekst veranderen. Je kunt dus niet een willekeurige tekst vervangen door een vaste tekst. Dit kan wel met een lisp-programmaatje. Ik zal hier dit weekend eens naar kijken.
4.
In jouw lisp staat dit commentaar: ;vraag niet waarom maar laten staan
Als je het commando attedit stap voor stap doorloopt dan moet je deze vraag zelf kunnen beantwoorden. :D

roy_043

Ok, dat ging iets sneller :wink::

Wijzig dit gedeelte in jouw lisp:

...
;==================================================================
; vanaf hier staat wat er gebeurt in iedere dwg
;==================================================================
   (write-line "(load \"WijzAtt.lsp\")" scrFile) ; lisp moet gevonden kunnen worden (in zoekpad of in de huidige werkmap)
   (write-line "WijzAtt" scrFile)

;==========================================
;  dwg bewaren
;==========================================
   (write-line "qsave" scrfile)      ;gewoon saven
   (write-line "close" scrFile)
   ; (write-line "no" scrFile)       ;er is al gesaved dus deze vraag wordt niet gesteld
 ) ; end foreach loop
...


En zorg dat WijzAtt.lsp op de goede plaats staat:

(defun c:WijzAtt ( / ent entLst ss str)
 (if
   (and
     (setq ss (ssget "_X" '((2 . "TITELSID"))))
     (setq ent (ssname ss 0))
   )
   (progn
     (while
       (and
         (setq ent (entnext ent))
         (setq entLst (entget ent))
         (= (cdr (assoc 0 entLst)) "ATTRIB")
         (/= (cdr (assoc 2 entLst)) "7000")
       )
     )
     (if (wcmatch (setq str (cdr (assoc 1 entLst))) "*12*13*") ; de oude waarde moet "12" en "13" bevatten
       (entmod
         (subst
           (cons 1 (strcat (substr str 1 (vl-string-search "12" str)) "10 GEMEENSCHAPPELIJK DEEL")) ; alles vanaf "12" wordt vervangen
           (assoc 1 entLst)
           entLst
         )
       )
     )
   )
 )
 (princ)
)