yoin

Joop

Het is de laatste tijd een beetje stilletjes op het forum. :mrgreen:
Is iedereen zo goed?
Komt niemand meer een "probleem" tegen?
Of werkt niemand meer?

Wat de reden ook is het lijkt me leuk om (in het kader van de educatie) een paar probleempjes te "verzinnen".

Hier is de eerste:
De attribute editor is onafhankelijk van het aantal attributen dat een blok bevat.
De editor gebruikt de prompt van de attribuut.
Dus bijvoorbeeld "Geef wijzingsletter:" i.p.v. "WIJZ3".
Nu wil ik een LISP-routine dit zelfde hebben. Dus de originele prompt tonen.

Vraag 1: Op wat voor manier kom ik achter de inhoud van de prompt en hoe haal ik hem op?

Nog even voor alle duidelijkheid: De oplossing is bij mij bekend en dit is puur om  on-/minder- bekende punten van AutoCAD te belichten.

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

Joop

Niemand?

Een klein tipje:
Insert een block met minimaal een attribuut in een lege tekening en save deze als .dxf file.
Open de file in een textverwerker, bv wordpad (Voor notepad is het bestand waarschijnlijk te groot).

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

julien

Ik denk dat je probleempje een beetje te moeilijk is voor ons.  :mrgreen:

Joop

Citaat van: julien op vr 19 05 2006, 14:14:23
Ik denk dat je probleempje een beetje te moeilijk is voor ons.  :mrgreen:

Geloof ik niks van.
"Te moeilijk" wil zeggen een te laag niveau cq te weinig capaciteit.
"Moeilijk" wil zeggen te weinig kennis en/of ervaring. Allebij te verhelpen.

Dan hier de oplossing:
AutoCAD geeft meerdere mogelijkheden om gegevens uit een tekening te halen.
Als je met LISP een blok selecteerd kan je mbv entget, entnext, enz... alle attributen opgehaald worden.
Maar de prompt zit hier niet bij. Waarom niet? I don't know!

Het programma maakt ook een table aan van alle blokken.
Hierin staat de gehele definitie van alle blokken, inclusief de prompt.
Je kan deze gegevens benaderen mbv tblsearch en tblnext.
Prbeer het maar eens uit.

By the way:
er bestaat ook een table van layers, handig om snel een lijst van alle lagen te maken.
Een gelovig volger van
"de Sacrale Kunst van Luiheid",
zijn leider "Lisp" en acoliet "Script".

HofCAD

#4
Citaat van: Joop op ma 22 05 2006, 20:44:05
Citaat van: julien op vr 19 05 2006, 14:14:23
Ik denk dat je probleempje een beetje te moeilijk is voor ons.  :mrgreen:

Geloof ik niks van.
"Te moeilijk" wil zeggen een te laag niveau cq te weinig capaciteit.
"Moeilijk" wil zeggen te weinig kennis en/of ervaring. Allebij te verhelpen.

Dan hier de oplossing:
AutoCAD geeft meerdere mogelijkheden om gegevens uit een tekening te halen.
Als je met LISP een blok selecteerd kan je mbv entget, entnext, enz... alle attributen opgehaald worden.
Maar de prompt zit hier niet bij. Waarom niet? I don't know!

Het programma maakt ook een table aan van alle blokken.
Hierin staat de gehele definitie van alle blokken, inclusief de prompt.
Je kan deze gegevens benaderen mbv tblsearch en tblnext.
Prbeer het maar eens uit.

By the way:
er bestaat ook een table van layers, handig om snel een lijst van alle lagen te maken.
'

Beste Joop,

Je opmerking "Maar de prompt zit hier niet bij. Waarom niet? I don't know!"
begrijp ik niet, want wat moet een blockreferentie met de prompt en de defaultwaarde?
Want daardoor zou alleen de tekening zwaarder worden; wegens de grotere opslag. :vraagteken:
Ik heb de onderstaande twee programma's in elkaar geknutseld.


(defun c:AttDefLst1 (/ BlkLst data x)
  (textpage)
  (setq blklst (tblnext "BLOCK" T))
  (while blklst
     (princ "\nLabel\tPrompt\tDefault\n")
     (setq x (cdr (assoc -2 blklst)))
     (while x
        (if x
(progn (setq data (entget x))
          (if (= (cdr (assoc 0 data)) "ATTDEF")
(princ (strcat (cdr (assoc 2 data))
"\t"
(cdr (assoc 3 data))
"\t"
(cdr (assoc 1 data))
"\n"
)
)
          )
)
        )
        (setq x (entnext x))
     )
     (setq BlkLst (tblnext "BLOCK"))
  )
(princ)
)


en


(defun c:AttDefLst2 (/ doc blk blknameslist blklst data x)
  (defun tempList (theObject / item dwgName)
     (setq theList '())
     (vlax-for item theObject
        (setq dwgName (vlax-get-property item 'Name))
        (setq theList (append (list dwgName) theList))
     )
     (setq theList (reverse theList))
  )
  (vl-load-com)
  (setq doc (vla-get-activeDocument (vlax-get-acad-object)))
  (textpage)
  (setq blk 3
blknameslist
(templist (vla-get-BLOCKS doc))
  )
  (repeat (- (length blknameslist) 3);*Model_Space, *Paper_Space, *Paper_Space0
     (setq blklst (cdr (tblsearch "BLOCK" (nth blk blknameslist) T)))
     (princ "\nLabel\tPrompt\tDefault\n")
     (setq x (cdr (assoc -2 blklst)))
     (while x
        (if x
(progn (setq data (entget x))
          (if (= (cdr (assoc 0 data)) "ATTDEF")
(princ (strcat (cdr (assoc 2 data))
"\t"
(cdr (assoc 3 data))
"\t"
(cdr (assoc 1 data))
"\n"
)
)
          )
)
        )
        (setq x (entnext x))
     )
     (setq blk (1+ blk))
  )
  (princ)
)


Waarschijnlijk heb je een mooiere oplossing voor ogen, dan wat ik bereikt heb.
Want ik heb o.a. de waarden nog niet in een Excel spreadsheet geplaatst.
Verder heb ik het ook niet echt goed getest, en dus ben ik zeer benieuwd naar jouw versie en
kritiek.

Met vriendelijke groet, HofCAD CSI.

PS Op 2 juni is een extra programma toegevoegd
PS Ik ben blond. :oops:
ACADcadabra

Joop

 :pintje: :pintje:
HofCAD,

Dit is precies wat ik bedoel.
Je hebt de twee methodes goed weergegeven.
Misschien kun je voor degene die nog niet zover met visual lisp zijn de programmatjes voorzien van commentaar.

Ook blondjes kunnen slim zijn.
Wat dacht je dan van een lui blondje?
Een gelovig volger van
"de Sacrale Kunst van Luiheid",
zijn leider "Lisp" en acoliet "Script".