FastFiber

Attribuut krijgt deels tekst

Gestart door DingDong, do 14 05 2009, 12:08:38

Vorige topic - Volgende topic

DingDong

De bijgevoegde routine is om in te voegen blokken te nummeren en te voorzien van verschillende voorloopteksten.
Echter, het gaat niet allemaal zoals het hoort, en ik kom er maar niet achter waarom: de strcat achter bori doet het wel op de command line, maar niet in de routine. Wie o wie?
Overigens, er kunnen dingen mis gaan omdat er in (command "insert" naambor2 pnt1 insc inang bori) een insc te weinig staat.

WebRacer

ik zie geen routine, enkel een DWG
?

DingDong

De eerste keer, altijd lastig...

roy_043

Beste DingDong,

Je bent een beetje aan het rommelen met locale en globale variabelen.

(setq bori (strcat vaktekstzon bor)) werkt niet omdat op dat moment vaktekstzon niet bestaat. Je zegt dat deze code wel op de command line werkt. Dit is mogelijk maar alleen nadat je in de huidige tekening een keer c:vak hebt uitgevoerd (vaktekstmet en vaktekstzon zijn daarna namelijk beschikbaar als globale variabelen).

Onderstaande code werkt wel. Tevens zijn de functies subbor1, subbor2 en subbor3 in één functie geïntegreerd en is het vreemde gebruik van cond gecorrigeerd.

(defun subbor1 ()
(graphscr)
(setvar "cmdecho" 0)
(setq pnt1 (getpoint (strcat "\nWaar wil je je " naambor1 "-blokje hebben?\n")))
(setq bor (getstring (strcat "\nNummer boring <" (itoa bu:num) ">: ")))
(c:vak) ; nodig i.v.m. strcat hierna
(if (= naambor1 "boring")
(setq bori (strcat vaktekstzon bor))
(setq bori (strcat vaktekstmet bor))
)
(if (= bor "")
(setq bor (itoa bu:num))
(setq bu:num (atoi bor))
)
(bor++)
(command "insert" naambor2 pnt1 insc insc inang bori)
(setvar "cmdecho" 1)
)


Als het jouw bedoeling is het vaknummer als globale variabele te gebruiken vervang dan:

(c:vak)

door:

(if (not vaknr)
(c:vak)
)


Groet, Roy.

WebRacer

zie mijn rode bemerkingen
(setq   bu:num 1 ; ik zou tekens als ./=%: enz vermijden in lisp
   bu:lab 65 ; ik zou tekens als ./=%: enz vermijden in lisp      
   bu:off 1 ; ik zou tekens als ./=%: enz vermijden in lisp      
   blsc 1
   blang 0
   insc "1.00"
   inang "0.00")

(defun subbor1 ()
  ;(graphscr) dit is overbodig in de recentere autocad versies
  (setvar "cmdecho" 0) 
  (setq pnt1 (getpoint (strcat "\nWaar wil je je " naambor1 "-blokje hebben?\n")))
  (if (null vaknr)
    (c:vak)) ; dit is inderdaad de oplossing voor uw probleem Roy_043 heeft gelijk
  (if (= naambor1 "boring")
    (progn
      (subbor3)
      (if (null (chk_blk naambor2)) ; veiligheid indien het blok niet bestaat
   (progn (alert "Blok bestaat niet in de tekening")(exit))
   (command "insert" naambor2 pnt1 insc insc inang bori)))
    (progn
      (subbor2)
      (if (null (chk_blk naambor2)) ; veiligheid indien het blok niet bestaat
                (progn (alert "Blok bestaat niet in de tekening")(exit))
   (command "insert" naambor2 pnt1 insc insc inang bori))))
    (setvar "cmdecho" 1))

(defun subbor2 ()
  (setq bor (getstring (strcat "\nNummer boring <" (itoa bu:num) ">: ")))
  (setq bori (strcat vaktekstzon bor))
  (cond ((eq bor "")
    (setq bor (itoa bu:num))
    (bor++))) ; ik zou tekens als ./=%: enz vermijden in lisp
  (cond ((/= bor "")
    (setq bu:num (atoi bor))
    (bor++)))) ; ik zou tekens als ./=%: enz vermijden in lisp

(defun subbor3 ()
  (setq bor (getstring (strcat "\nNummer boring <" (itoa bu:num) ">: ")))
  (setq bori (strcat vaktekstmet bor))
  (cond ((eq bor "")
    (setq bor (itoa bu:num))
    (bor++))) ; ik zou tekens als ./=%: enz vermijden in lisp
  (cond ((/= bor "")
    (setq bu:num (atoi bor))
    (bor++)))) ; ik zou tekens als ./=%: enz vermijden in lisp

(defun bor++ () ; ik zou tekens als ./=%: enz vermijden in lisp
        (setq bu:num (+ bu:num bu:off))) ; ik zou tekens als ./=%: enz vermijden in lisp

(defun c:ins ()
  (setvar "cmdecho" 0)
  (setq insc (getreal (strcat "\nInsert schaal <" (rtos blsc 2 2) ">: ")))
  (if (/= insc nil)
    (progn
      (setq blsc insc)
      (setq insc (rtos insc 2 2)))
    (setq insc (rtos blsc 2 2)))
  (princ))

(defun c:ina ()
  (setvar "cmdecho" 0)
  (setq inang (getreal (strcat "\nInsert angle <" (rtos blang 2 2) ">: ")))
  (if (/= inang nil)
    (progn
      (setq blang inang)
      (setq inang (rtos inang 2 2)))
    (setq inang (rtos blang 2 2)))
  (princ))

(defun c:vak ()
  (setvar "cmdecho" 0)
  (setq vaknr (getstring "\nWat is het vaknummer? "))
  (setq vaktekstmet (strcat "%%U" vaknr "-"))
  (setq vaktekstzon (strcat "" vaknr "-"))
  (setvar "cmdecho" 1))

(defun c:off ()
  (initget 1)
  (setq bu:num (getint "\nAutonummer begin waarde: "))
  (initget 3)
  (setq bu:off (getint "\nAutonummer offset: ")) ; ik zou tekens als ./=%: enz vermijden in lisp
  (princ))

(defun c:bg (/ pnt1 bori)
(setq naambor1 "boring gestaakt")
(setq naambor2 "e17")
(subbor1)
(princ))

(defun c:b (/ pnt1 bori)
(setq naambor1 "boring")
(setq naambor2 "e18")
(subbor1)
(princ))

(defun c:pf (/ pnt1 bori)
(setq naambor1 "peilfilter")
(setq naambor2 "e19")
(subbor1)
(princ))

(defun c:son (/ pnt1 bori)
(setq naambor1 "sondering")
(setq naambor2 "e20")
(subbor1)
(princ))

(defun chk_blk (blk / blok result)
  (setq blok (tblnext "BLOCK" T))
  (while (/= blok nil)
    (if (= (dxf 2 blok) blk)
      (setq result T))
    (setq blok (tblnext "BLOCK")))
  result)
?

roy_043

#5
@WebRacer:
Controleren of het blok bestaat in de tekening is een goed idee maar het kan eleganter.
Is dxf een eigen lispfunctie?

@DingDong:
De hele code kan eleganter en efficiënter.


(setq
bu:num 1
bu:off 1
blsc 1
blang 0
)

(defun c:bg () (subbor "boring gestaakt" "e17") (princ))
(defun c:b () (subbor "boring" "e18") (princ))
(defun c:pf () (subbor "peilfilter" "e19") (princ))
(defun c:son () (subbor "sondering" "e20") (princ))

(defun subbor (naambor1 naambor2)
(if (or (chk_blk naambor2) (findfile (strcat naambor2 ".dwg")))
(subbor_insert naambor1 naambor2)
(alert (strcat "Kan blok " naambor2 " niet vinden!"))
)
)

(defun subbor_insert (naambor1 naambor2 / pnt1 bor vaknr bori)
(graphscr)
(setvar "attdia" 0)
(setvar "cmdecho" 0)
(setq pnt1 (getpoint (strcat "\nWaar wil je je " naambor1 "-blokje hebben?\n")))
(setq bor (getstring (strcat "\nNummer boring <" (itoa bu:num) ">: ")))
(if (= bor "")
(setq bor (itoa bu:num))
(setq bu:num (atoi bor))
)
(setq bu:num (+ bu:num bu:off))
(setq vaknr (getstring "\nWat is het vaknummer? "))
(if (= naambor1 "boring")
(setq bori (strcat "%%U" vaknr "-" bor))
(setq bori (strcat vaknr "-" bor))
)
(command "insert" naambor2 pnt1 blsc blsc blang bori)
(setvar "cmdecho" 1)
(setvar "attdia" 1)
)

(defun chk_blk (blk / start blok result)
(setq start T)
(while (and (setq blok (tblnext "BLOCK" start)) (= result nil))
(setq start nil)
(if (= (cdr (assoc 2 blok)) blk)
(setq result T)
)
)
result
)

(defun c:ins ( / tmp)
(if (setq tmp (getreal (strcat "\nInsert schaal <" (rtos blsc 2 2) ">: ")))
(setq blsc tmp)
)
(princ)
)

(defun c:ina ( / tmp)
(if (setq tmp (getreal (strcat "\nInsert angle <" (rtos blang 2 2) ">: ")))
(setq blang tmp)
)
(princ)
)

(defun c:off ()
(initget 1)
(setq bu:num (getint "\nAutonummer begin waarde: "))
(initget 3)
(setq bu:off (getint "\nAutonummer offset: "))
(princ)
)


Groet, Roy.

WebRacer

nee dxf is geen functie... :oops:

en code kan altijd eleganter
?

DingDong

Beste Roy,

Mooi gedaan, zo wordt het nog eens wat. Schoonheidsfoutjes weggewerkt, maar daar weet jij alles van. Blijft er nog één maar (en daar ga ik nu niet meer al te veel over peinzen): het vak is meestal hetzelfde, maar het kan wel eens veranderen binnen 'n tekening. Nu wordt er bij elke insert om het vak gevraagd zonder 'default', en da's niet zo handig. Beter om de eerste keer het vak in te vullen en dan later te kunnen aanpassen indien nodig; kortom: vak is na invulling hetzelfde todat het veranderd moet worden.

Vr.gr., Paul.

roy_043

Beste Paul,

Probeer deze eens... Zeer efficiënt: je kunt nu gewoon blijven doorklikken!


(setq
globalBorNr 1
globalBorOff 1
globalVakNr ""
globalBlScale 1
globalBlAng 0
)

(defun c:bg ()  (subbor "boring gestaakt" "e17") (princ))
(defun c:b ()   (subbor "boring"          "e18") (princ))
(defun c:pf ()  (subbor "peilfilter"      "e19") (princ))
(defun c:son () (subbor "sondering"       "e20") (princ))

(defun subbor (borOmschrijving borBlok)
(if (or (chk_blk borBlok) (findfile (strcat borBlok ".dwg")))
(subbor_insert borOmschrijving borBlok)
(alert (strcat "Kan blok " borBlok " niet vinden!"))
)
)

(defun subbor_insert (borOmschrijving borBlok / lusSchakelaar borNrString vraagString resultaat attString tmp)
(graphscr)
(setvar "attdia" 0)
(setvar "cmdecho" 0)
(setq lusSchakelaar T)
(if (= globalVakNr "")
(progn
(setq globalVakNr (getstring "\nGeef een vaknummer (vereist): "))
(if (= globalVakNr "")
(progn
(setq lusSchakelaar nil)
(princ "\nEr is geen vaknummer opgegeven en de functie is geannuleerd")
)
)
)
)
;; Het patroon van deze while-lus kom je op diverse plaatsen op het www tegen. Zie o.a.:
;; http://discussion.autodesk.com/forums/thread.jspa?threadID=475434&tstart=10905
(while lusSchakelaar
(setq
borNrString (itoa globalBorNr)
vraagString (strcat "\n\nPlaats een " borOmschrijving "-blok met vaknummer=" globalVakNr " en boringnummer= " borNrString ": ")
vraagString (strcat vraagString "\ngeef een punt of [ENTER=Annuleren/V=Vaknummer aanpassen/B=Boringnummer aanpassen]: ")
)
(initget "Vaknummer Boringnummer")
(setq resultaat (getpoint vraagString))
(cond
((= (type resultaat) 'list) ; Als er een punt is aangeklikt dan is resultaat een lijst.
(if (= borOmschrijving "boring")
(setq attString (strcat "%%U" globalVakNr "-" borNrString))
(setq attString (strcat globalVakNr "-" borNrString))
)
(command "insert" borBlok resultaat globalBlScale globalBlScale globalBlAng attString)
(setq globalBorNr (+ globalBorNr globalBorOff))
; (setq lusSchakelaar nil) ; Haal de eerste ";" op deze regel weg om het repeteren van de functie te voorkomen.
)
((= resultaat "Vaknummer")
(setq tmp (getstring (strcat "\nGeef het vaknummer <" globalVakNr ">: ")))
(if (/= tmp "")
(setq globalVakNr tmp)
)
)
((= resultaat "Boringnummer")
(setq tmp (getint (strcat "\nGeef het boringnummer <" borNrString ">: ")))
(if tmp
(setq globalBorNr tmp)
)
)
(T
(princ "\nDe functie is geannuleerd.")
(setq lusSchakelaar nil)
)
)
)
(setvar "cmdecho" 1)
(setvar "attdia" 1)
(princ)
)

(defun chk_blk (blk / start blok result)
(setq start T)
(while (and (setq blok (tblnext "BLOCK" start)) (= result nil))
(setq start nil)
(if (= (cdr (assoc 2 blok)) blk)
(setq result T)
)
)
result
)

(defun c:ins ( / tmp)
(if (setq tmp (getreal (strcat "\nInsert schaal <" (rtos globalBlScale 2 2) ">: ")))
(setq globalBlScale tmp)
)
(princ)
)

(defun c:ina ( / tmp)
(if (setq tmp (getreal (strcat "\nInsert angle <" (rtos globalBlAng 2 2) ">: ")))
(setq globalBlAng tmp)
)
(princ)
)

(defun c:off ()
(initget 1)
(setq globalBorNr (getint "\nAutonummer begin waarde: "))
(initget 3)
(setq globalBorOff (getint "\nAutonummer offset: "))
(princ)
)

(princ "\nCommando's:    bg  = boring gestaakt    pf  = peilfilter ")
(princ "\n               b   = boring             son = sondering ")
(princ)


De functie nog steeds niet helemaal af. Er moet i.i.g. nog een juiste laag worden geactiveerd.

Tenslotte een verzoek: zou jij ter completering alle aangeroepen blocks kunnen posten (dus e17 t/m e20)?

Groet, Roy.

DingDong

Beste Roy,

Met alle respect, maar ik vind deze versie enigszins over the top. Om te beginnen moet ik hier vreselijk goed over na denken om het te volgen (ik ben geen begenadigd programmeur), het is ook een stuk groter/langer en er zitten naar mijn idee te veel foutcontroles en keuzedingen in.
Mijn idee is: een programma moet wel werken binnen redelijke marges, maar het is voor intern gebruik door mensen die behoren te weten wat ze doen, en als ze ff zitten te pitten, zit ik er niet mee als ze *Cancel* voor de kiezen krijgen. De standaard dwt gaat t.z.t. de blokken krijgen, en b, bg, pf en son lijkt me wel uit het hoofd te leren.
De versie van gisteravond is in mijn optiek veel mooier: kort maar krachtig, niet te veel toeters en bellen én te behappen voor de gemiddelde dumbo met wat LISP-kennis.
Moet alleen nog wat doen met die (setq vaknr (getstring "\nWat is het vaknummer? ")). Zal wel iets moeten worden met (if vaknr "")ofzo.
Ik wil je bij dezen van harte bedanken voor je bijdrage aan dit geboorgedoe. Zal je t.zt. wel laten weten wat de heren tekenaars er van vinden (er wordt op de afdeling waar ik werk he-le-maal nix met LISP gedaan, hetgeen ik vreemd vind).
Trouwens, als je de puntjes écht op de ï wilt zetten: e17 wordt amper gebruikt (en mag je gevoeglijk vergeten), e18 heeft een underscore, e 19 krijgt na het boringnummer een "A" en e 20 is 'enkel' het vaknummer-streepje-boringnummer.
Oftewel, als je zin hebt... :D

Vr.gr., Paul.

roy_043

Beste Paul,

Bijgevoegd:
BtestNew2.LSP
BtestNew3.LSP

Dit zijn de voorlopers van de code die jij over-the-top vindt.
De puntjes op de I die jij noemt kun jij volgens mij zelf wel zetten...


DingDong

Beste Roy,

BtestNew2.lsp is het helemaal. Ik heb de punjes op de i gezet, en nu is het bWN.lsp geworden. Nogmaals veel dank voor je geLISPel.

Vr.gr., Paul.

yoin