FastFiber

Gedeelte van bestandsnaam gebruiken in stempel (OPGELOST)

Gestart door januz, do 13 09 2012, 08:33:34

Vorige topic - Volgende topic

januz

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.

roy_043

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.

januz

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.

roy_043

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.

januz

#4
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..

sschevers

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

roy_043

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

januz

Het werkt! Fantastisch!  :vreegoe:

Roy bedankt voor de code en de moeite en Stephan bedankt voor het duwtje in de goede richting.

Groet Erik.

roy_043

Fijn dat het gelukt is.
Ik neem aan dat je ook een script gebruikt om alle tekeningen te openen...?

januz

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.

januz

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.

roy_043

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

roy_043

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


januz

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.

januz

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.