FastFiber

Description block

Gestart door HofCAD, di 22 08 2006, 09:19:16

Vorige topic - Volgende topic

HofCAD

Geachte CADliefhebbers,

Bij het aanmaken van een block met het commando BLOCK,
kan men aan een block een Description meegeven.
Kan men een Description met een Lispprogramma ook achteraf
toevoegen?

Met vriendelijke groet,

HofCAD CSI.
ACADcadabra

Joop

Ja dit kan.
via tblsearch en tblnxt het betreffende block zoeken en op de normale mannier de 4 code toevoegen.
bv: (4 . "Dit is een test.")
Een gelovig volger van
"de Sacrale Kunst van Luiheid",
zijn leider "Lisp" en acoliet "Script".

HofCAD

#2
Citaat van: Joop op di 22 08 2006, 10:55:05
Ja dit kan.
via tblsearch en tblnxt het betreffende block zoeken en op de normale mannier de 4 code toevoegen.
bv: (4 . "Dit is een test.")

Beste Joop,

Dat lukt mij om een of andere reden niet, want ik kan alleen bij lagen, tekststijlen,
dimensiestijlen, lijntypes, appids, ucs, views en vports de symbol table  veranderen.

(setq table "BLOCK" tblname "MijnBlk" code 4 value "Dit is een test.")
(setq nent (tblobjname table tblname))
(setq edata (entget nent))
(setq edata (subst (cons code value) (assoc code edata) edata))
(entupd nent)


Wel kan ik het block opnieuw definieren met een description via entmake.

Met vriendelijke groet,
HofCAD CSI
ACADcadabra

Joop

Beste HofCAD,

Je hebt gelijk, ondanks alle pogingen lukt het niet om de waarde van (4 . "") in de block definition te wijzigen. :?
Een volledig block met attributes via entmake creeren lijkt me veel werk, vooral wat betreft de data die niet afhankelijk is van een entity.
Veel succes.

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

HofCAD

#4
Citaat van: Joop op wo 23 08 2006, 09:58:02
Beste HofCAD,

Je hebt gelijk, ondanks alle pogingen lukt het niet om de waarde van (4 . "") in de block definition te wijzigen. :?
Een volledig block met attributes via entmake creeren lijkt me veel werk, vooral wat betreft de data die niet afhankelijk is van een entity.
Veel succes.
Joop

Beste Joop,

Het onderstaande programma is nog niet volledig getest,
maar het werkt hoop ik.


(defun C:PutDesc (/ Ent Bent Desc EntNaam NewBlk EntInfo)
  (setq Ent (entget (car (entsel "\n Selecteer een block... "))))
  (setq Bent (entget (tblobjname "BLOCK" (cdr (assoc 2 Ent)))))
  (if (assoc 4 Bent)
    (setq Desc (cdr (assoc 4 bent)))
    (setq Desc "")
  )
  (setq   Desc
(getstring T
    (strcat "\nNieuwe Description voor block <" Desc ">")
)
  )
  (setq EntNaam (cdr (assoc -2 Bent)))
  (setq NewBlk (list '(0 . "BLOCK")
     (assoc 2 Bent)
     (cons 4 Desc)
     (assoc 70 Bent)
     (assoc 67 Bent)
     (assoc 10 Bent)
       )
  )
  (if (assoc 62 Bent)
    (setq NewBlk (append Newblk (list (assoc 62 Bent))))
  )
  (entmake NewBlk)
  (entmake (cdr (entget EntNaam)))
  (while (setq EntNaam (entnext EntNaam))
    (setq EntInfo (cdr (entget EntNaam)))
    (entmake EntInfo)
  )
  (entmake '((0 . "ENDBLK")))
)


Kun je je licht er eens over laten schijnen?

Met vriendelijke groet,

HofCAD CSI
ACADcadabra

Joop

HofCAD,

Je bent op de goede weg.
Ik heb het uitgetest op een blok bestaande uit een cirkel en een box.
Na uitvoering van jouw programma en het geven van een regen was de box weg.
Ik heb een nieuw block aangemaakt met een cirkel, box en een lijn.
Deze keer was ik de box en de lijn kwijt.

Wat je programma nu doet is het eerste element van de blockdefinitie in een nieuw block stoppen en deze aanpassen met een omschrijving.
Met tblobjname haal je de entity name van het eerste element van de de block definitie op.
Je zult alle elementen uit het blok moeten overzetten naar het nieuwe blok, inclusief attributen.

Groetjes,

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

HofCAD

#6
Citaat van: Joop op wo 23 08 2006, 13:33:10
HofCAD,

Je bent op de goede weg.
Ik heb het uitgetest op een blok bestaande uit een cirkel en een box.
Na uitvoering van jouw programma en het geven van een regen was de box weg.
Ik heb een nieuw block aangemaakt met een cirkel, box en een lijn.
Deze keer was ik de box en de lijn kwijt.
Wat je programma nu doet is het eerste element van de blockdefinitie in een nieuw block stoppen en deze aanpassen met een omschrijving.
Met tblobjname haal je de entity name van het eerste element van de de block definitie op.
Je zult alle elementen uit het blok moeten overzetten naar het nieuwe blok, inclusief attributen.
Groetjes, Joop

Beste Joop,

Ik heb een grote fout gemaakt in een van de laatste regels,
want er stond (entmake ent_info) en dat moet natuurlijk (entmake EntInfo) zijn.
Hoe kan ik toch zo dom zijn, het lijkt of ik het nooit leer.

Met vriendelijke groet,
HofCAD CSI

PS Kan het zijn, dat ik nu als dom blondje :oops: nog iets vergeet?

ACADcadabra

Joop

Als dat iets van een dom blondje is dan ben ik blond van top tot teen, want ik heb het ook niet gezien.
Ik heb het geheel getest en alle elementen worden nu meegenomen, inclusief geneste blocks.
Je kunt nog een verbetering aanbrengen: Als je "per ongeluk" naast een een block klikt of een "niet blok" selecteerd,  krijg je een foutmelding.
Gewoon met:
(defun C:PutDesc (/ ;|Ent Bent Desc EntNaam NewBlk EntInfo|;)
  (setq Ent (entsel "\n Selecteer een block... "))
  (if (/= Ent nil)
    (progn
      (setq Ent (entget (car ent)))
      (if (= (cdr (assoc 0 Ent)) "INSERT")
(progn
  (setq Bent (entget (tblobjname "BLOCK" (cdr (assoc 2 Ent)))))
  (if (assoc 4 Bent)
    (setq Desc (cdr (assoc 4 bent)))
    (setq Desc "")
  )
  (setq Desc
(getstring T
    (strcat "\nNieuwe Description voor block <" Desc ">")
)
  )
  (setq EntNaam (cdr (assoc -2 Bent)))
  (setq NewBlk (list '(0 . "BLOCK")
     (assoc 2 Bent)
     (cons 4 Desc)
     (assoc 70 Bent)
     (assoc 67 Bent)
     (assoc 10 Bent)
       )
  )
  (if (assoc 62 Bent)
    (setq NewBlk (append Newblk (list (assoc 62 Bent))))
  )
  (entmake NewBlk)
  (entmake (cdr (entget EntNaam)))
  (while (setq EntNaam (entnext EntNaam))
    (setq EntInfo (cdr (entget EntNaam)))
    (entmake EntInfo)
  )
  (entmake '((0 . "ENDBLK")))
)
(alert "Ben je blond of zo? \nJe MOET een block selecteren!"!")
      )
    )
    (alert "Ben je blond of zo? \nJe moet een BLOCK selectern!")
  )
)


Zoals je ziet heb ik voor het debuggen de locale variabelen even op wereld gezet. Wel zo handig.

Wat ik heb toegevoegd is een controle op de aanwezigheid van een element in de selectieset. (if (/= Ent nil) ...
Dan pas haal ik het element op. (setq Ent (entget (car ent)))
Als er iets in aanwezig is controleer ik of het blok is. (if (= assoc Ent) "INSERT") ...
Tot slot: Als je de verkeerde selectie hebt gemaakt wordt je vriendelijk gevraagd om toch maar een block te kiezen.

De groetjes,

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

HofCAD

#8
Beste Joop,

Aller eerst wil ik je bedanken voor het testen en de aanvulling van mijn programma.

Maar onderstaande regel in je programmacode geeft problemen.
(alert "Ben je blond of zo? \nJe MOET een block selecteren!"!")

Waarschijnlijk bedoel je:
(alert "Ben je blond of zo? \nJe MOET een block selecteren!")

Met vriendelijke groet,
HofCAD CSI

Een gelovig volger van
"de Sacrale Kunst van Luiheid",
zijn leider "Joop" en acoliet "Lisp".
ACADcadabra

Joop

Zoals je ziet, is wijzigen van een code zonder te testen gevaarlijk voor ons geloof.
Het levert alleen maar meer werk op.
En extra werk is voor de volgers van de "Sacrale kunst van Luiheid" helemaal uit den boze.( zie regelement artikel 2105-av-bt-23.6-18-lh-bis 36-5a)

Zalige rust,

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

WebRacer

 :vreegoe: goed bezig zou ik zeggen :vreegoe:
?

yoin