CADsite forum

AutoCAD => Autolisp => Topic gestart door: Joop op wo 17 05 2006, 12:31:12

Titel: "Vraag 1"
Bericht door: Joop op wo 17 05 2006, 12:31:12
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.
Titel: Re: "Vraag 1"
Bericht door: Joop op vr 19 05 2006, 13:06:03
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:
Titel: Re: "Vraag 1"
Bericht door: julien op vr 19 05 2006, 14:14:23
Ik denk dat je probleempje een beetje te moeilijk is voor ons.  :mrgreen:
Titel: Re: "Vraag 1"
Bericht door: 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.
Titel: Re: "Vraag 1"
Bericht door: HofCAD op do 01 06 2006, 15:32:08
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:
Titel: Re: "Vraag 1"
Bericht door: Joop op vr 02 06 2006, 12:30:12
 :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?