Beste allemaal,
Ik zit met een probleempje. Wij hebben een klant welke een paar honderd tekeningen bij ons in beheer heeft. Nu is het zo dat er een verzoek kwam om een stempel te plaatsen op de tekeningen, ingevuld en wel natuurlijk.. De opbouw van de bestandsnamen zijn altijd gelijk namelijk:
postcode_huisnummer_aanduiding plattegrond of geveltekening_straatnaam.dwg
Ik ben al wel zover dat ik door middel van een script een stempel kan invoegen, die grotendeels wordt ingevuld door gebruik te maken van fields in combinatie met een diesel expressie, geplot, gepurged en afgesloten. Probleem is het aantal karakters waaruit het huisnummer is opgebouwd, soms is dat 1, meestal is dat 2 en soms is dat drie. Ik heb:
$(substr,$(getvar,dwgname),9,1) waarbij vanaf het negende karakter er 1 wordt weergeven, voor 1 huisnummer
$(substr,$(getvar,dwgname),9,2) waarbij vanaf het negende karakter er 2 worden weergeven, voor 2 huisnummers, en zo verder. Nu moet ik dus drie verschillende scripts en even zoveel stempels gebruiken om tot een goed resultaat te komen en ik zou dit graag in 1 willen zien.
Mooiste zou zijn dat ik het gedeelte tot de eerste underscore zou kunnen gebruiken, en tussen de eerste en de tweede underscore, enzovoort, zodat ik niet telkens het aantal karakters hoef op te geven.
Ik hoop dat mijn vraagstelling een beetje duidelijk is en dat iemand een oplossing voor me heeft.
Groet Erik.
Probeer dit:
(defun SplitDwgName ( / i ret str sub)
(setq str (strcat (substr (getvar 'dwgname) 1 (vl-string-search ".dwg" (getvar 'dwgname))) "_"))
(while (/= str "")
(setq
sub (substr str 1 (setq i (vl-string-search "_" str)))
ret (cons sub ret)
str (substr str (+ i 2))
)
)
(reverse ret)
)
Bij een bestandsnaam:
"1234 AB_567C_Plattegrond_Straat.dwg"
Retourneert de functie:
("1234 AB" "567C" "Plattegrond" "Straat")
Lisp-code voor postcode:
(nth 0 (SplitDwgName))
Lisp-code voor huisnummer:
(nth 1 (SplitDwgName))
etc.
Roy, dankjewel voor je antwoord. Hoe krijg ik dit verhaal in een field? Je kan wel diesel expressies maar geen lisp expressies in typen als waarde voor een field..
Groet Erik.
Probeer dit om de attributes te wijzigen (zonder fields!):
; (WijzAtt "onderhoek" "postcode" (nth 0 (SplitDwgName)))
; (WijzAtt "onderhoek" "huisnummer" (nth 1 (SplitDwgName)))
(defun WijzAtt (blockName attTag str / ent entLst)
(setq attTag (strcase attTag))
(setq ent (ssname (ssget "_X" (list (cons 2 blockName) '(66 . 1))) 0))
(while
(and
(setq ent (entnext ent))
(setq entLst (entget ent))
(= (cdr (assoc 0 entLst)) "ATTRIB")
(/= (strcase (cdr (assoc 2 entLst))) attTag)
)
)
(if
(= (cdr (assoc 0 entLst)) "ATTRIB") ; Probleem met SEQEND vermijden.
(entmod
(subst
(cons 1 str)
(assoc 1 entLst)
entLst
)
)
)
(princ)
)
De code roept de functie (SplitDwgName) uit mijn vorige bericht aan.
Ik heb de code geplakt in de attribute, dus zonder fields te gebruiken, maar krijg dan de melding dat ik meer text invoer dan is toegestaan en na 50 karakters wordt de text afgebroken..
Januz,
lisp ocde in attributen plakken heeft geen zin omdat deze dan niet wordt uitgevoerd. Je kunt de code in je script opnemen waarmee je het stempel plaatst. In dit script kun je attributen vullen.
groeten
stephan
Voor de duidelijkheid:
Plaats de lisp-code in een lsp-bestand en laad dit m.b.v. het script.
Het script-bestand kan er zo uitzien:
(load "WijzOnderhoek.lsp")
(WijzAtt "onderhoek" "postcode" (nth 0 (SplitDwgName)))
(WijzAtt "onderhoek" "postcode" (nth 1 (SplitDwgName)))
Het werkt! Fantastisch! :vreegoe:
Roy bedankt voor de code en de moeite en Stephan bedankt voor het duwtje in de goede richting.
Groet Erik.
Fijn dat het gelukt is.
Ik neem aan dat je ook een script gebruikt om alle tekeningen te openen...?
We willen proberen om dit met script pro te doen, daar moet je meerdere dwg's aangeven en dan loopt ie daar door, dit moet je dan wel weer per map doen. Als je nog een tip hebt om door middel van een script alle dwg's uit een map en alle submappen te openen zou dat helemaal perfect zijn.
Gr. Erik.
Ik loop nu wel een beetje tegen een ander probleempje op, nl. de afstand tussen straatnaam en huisnummer. Die is bij een kortere straatnaam veel groter dan bij een langere, bij fields kun je een spatie tussen de beide verschillende fields opgeven. Is zoiets ook mogelijk bij attributes?
Gr. Erik.
Citaat van: januz op vr 14 09 2012, 10:26:29
We willen proberen om dit met script pro te doen, daar moet je meerdere dwg's aangeven en dan loopt ie daar door, dit moet je dan wel weer per map doen. Als je nog een tip hebt om door middel van een script alle dwg's uit een map en alle submappen te openen zou dat helemaal perfect zijn.
Gr. Erik.
Misschien kan dit met BaBe:
http://www.cadsite.be/smf/index.php?topic=2811.0
Citaat van: januz op vr 14 09 2012, 12:00:05
Ik loop nu wel een beetje tegen een ander probleempje op, nl. de afstand tussen straatnaam en huisnummer. Die is bij een kortere straatnaam veel groter dan bij een langere, bij fields kun je een spatie tussen de beide verschillende fields opgeven. Is zoiets ook mogelijk bij attributes?
Gr. Erik.
Ik zou voor de straatnaam en het huisnummer 1 attribute gebruiken en iets dergelijks in het script opnemen:
(WijzAtt "onderhoek" "straatEnHuisummer" (strcat (nth 3 (SplitDwgName)) " " (nth 1 (SplitDwgName))))
Roy, het werkt perfect! :vreegoe:
Dankjewel voor de moeite. Mooi dat er mensen zijn die hun kennis en ervaring belangeloos willen delen met mensen zoals ik.
Naar dat babe verhaal had ik al eens gekeken maar daar kwam ik zo niet uit, ik zal me er een dezer dagen nog eens in verdiepen.
Nogmaals bedankt, groet Erik.
durf het bijna niet te vragen, maar weet iemand misschien een manier om de plotlocatie mee te nemen in het script? Nu worden de pdf's in een directory weggeschreven en dan moet ik ze nog verplaatsen naar de goede directory. Het zijn nogal wat verschillende locaties het liefste zou ik per map dwg's een plot locatie in het script opgeven.
Ik gebruik onderstaand om te plotten:
-plot
n
(substr(getvar "dwgname")1(-(strlen(getvar "dwgname"))4))
-purge
a
*
n
zoom
e
qsave
close
Ik zorg er dus door middel van (substr(getvar "dwgname")1(-(strlen(getvar "dwgname"))4)) voor dat de pdf naam gelijk is aan de dwg naam, maar dan zonder.dwg. Ik zou zeggen dat ik in deze string wel een locatie zou kunnen opgeven maar het is me na een paar uurtjes aanpassen en proberen nog niet gelukt.
Groet Erik.
Januz,
Met (getvar "dwgprefix") haal je het pad op van je tekening. je kunt vanuit je script voordat gaat plotten in de map waar je dwg's staan een map "plots" aanmaken met
(vl-load-com)
;; definieer plot dir
(setq plotdir (strcat(getvar "dwgprefix") "plots"))
;; check of dir bestaat
(if (not (vl-file-directory-p plotdir))
(progn
;; bestaat hij niet dan maak we de dir aan
(vl-mkdir plotdir)
)
)
;; deze naam kun je gebruiken voor het afdrukken van je tekening
(setq plotFileName (strcat plotdir "\\" (substr(getvar "dwgname")1(-(strlen(getvar "dwgname"))4)) ".extensie"))
-plot
n
plotFilename
-purge
a
*
n
zoom
e
qsave
close
.
De variable plotFileName kun je gebruiken op de plek waar je nu de bestandsnaam bepaalt bij het plotten. De lispcode kun je gewoon opnemen in je script.
succes
stephan
Hoi Stephan,
Als ik het goed begrijp maak je van:
(vl-load-com)
;; definieer plot dir
(setq plotdir (strcat(getvar "dwgprefix") "plots"))
;; check of dir bestaat
(if (not (vl-file-directory-p plotdir))
(progn
;; bestaat hij niet dan maak we de dir aan
(vl-mkdir plotdir)
)
)
een lisp die je aanroept vanuit je script? Met welk commando zou ik dat dan kunnen doen?
en daarna geef ik
(setq plotFileName (strcat plotdir "\\" (substr(getvar "dwgname")1(-(strlen(getvar "dwgname"))4)) ".extensie"))
in plaats van
(strcat plotdir "\\" (substr(getvar "dwgname")1(-(strlen(getvar "dwgname"))4)))?
Gr. Erik.
Januz,
de lisp code kun je rechstreeks in je script plakken
stephan
Stephan, ik krijg het niet aan de praat, dat zal ongetwijfeld aan mij liggen..
Ik heb inmiddels het volgende script:
layout
r
"PDF Plattegronden"
Haarlem
(ssget "_X" '((0 . "TEXT,MTEXT")(1 . "maten in cm.")))
erase
p
-insert
"X:\klant\Digitalisatie\klant_onderhoek\Tools\onderhoekklant.dwg"
319.08,35.87
1
1
0
explode
last
(load "WijzOnderhoek.lsp")
(WijzAtt "stempel_klant" "adres" (strcat (nth 3 (SplitDwgName)) " " (nth 1 (SplitDwgName))))
(WijzAtt "stempel_klant" "postcode" (nth 0 (SplitDwgName)))
(vl-load-com)
(setq plotdir (strcat(getvar "dwgprefix") "plots"))
(if (not (vl-file-directory-p plotdir))
(progn
(vl-mkdir plotdir)
)
)
(setq plotFileName (strcat plotdir "\\" (substr(getvar "dwgname")1(-(strlen(getvar "dwgname"))4)) ".extensie"))
-plot
n
plotFilename
-purge
a
*
n
zoom
e
qsave
Als ik dit script run wordt de pdf weggeschreven in de directory X:\klant\Digitalisatie\klant_onderhoek\Tools, dus de locatie waar de onderhoek vandaan wordt ingevoegd. De naam van het pdf bestand wordt nu plotFilename.pdf.
Ik zal vast iets over het hoofd zien, maar ik zou niet weten wat..
Groet Erik.
Eric,
probeer het onderstaande stukje eens in je script te plakken:
(vl-load-com)
(setq plotdir (strcat(getvar "dwgprefix") "plots"))
(if (not (vl-file-directory-p plotdir))
(progn
(vl-mkdir plotdir)
)
)
(setq plotFileName (strcat plotdir "\\" (substr(getvar "dwgname")1(-(strlen(getvar "dwgname"))4)) ".pdf"))
(command "-plot"
"n"
""
""
""
plotFilename
"n"
"")
(command "-purge" "a" "*" "n")
(command "zoom" "e")
(command "qsave")
Ik heb dit net op een openstaande tekening geprobeed en de pdf wordt netjes in de map plots gezet
stephan
:ole: :ole: :ole:
Super, het werkt. Ik ben hier echt ontzettend blij mee!
Stephan, ontzettend bedankt voor de tijd en moeite die je erin hebt gestoken!
Groet, Erik.