FastFiber

attribute

Gestart door Maikel, ma 23 04 2007, 08:10:54

Vorige topic - Volgende topic

Maikel

Goedemorgen allemaal,

Ik heb diverse blokken in een tekening. Deze hebben allemaal een attribute met dezelfde benaming. Daarnaast heb ik een lisp met een variabele. Hoe kan ik de attribute in laten vullen door het lisp programma.

Alvast bedankt,

Maikel

HofCAD

Citaat van: Maikel op ma 23 04 2007, 08:10:54
Goedemorgen allemaal,

Ik heb diverse blokken in een tekening. Deze hebben allemaal een attribute met dezelfde benaming. Daarnaast heb ik een lisp met een variabele. Hoe kan ik de attribute in laten vullen door het lisp programma.

Alvast bedankt,

Maikel

Beste Maikel,

Ik heb onderstaand programma even slordig in elkaar geknoeid,
dus je zal het moeten testen.

(defun Chgatts(BlockNaam Waarde / ~CMD ssblocks teller item details test next attrib)
(setq ~CMD (getvar "CMDECHO")) (setvar "CMDECHO" 0)
(setq ssblocks (ssget "X" (list '(0 . "INSERT") '(66 . 1)
(cons 2 BlockNaam))) teller 0)
(if ssblocks
(progn
(repeat  (sslength ssblocks)
(setq item (ssname ssblocks teller) details (entget item)
test (cdr (assoc 66 details)))
(if (= test 1)
(progn (setq next (entget (entnext (cdr (assoc -1 details))))
attrib (cdr (assoc 1 next)));setq
(command "_ATTEDIT" "N" "Y" BlockNaam "" "" (cdr (car next)) attrib Waarde)
))
(setq teller (1+ teller))
)
))
(setvar "CMDECHO" ~CMD)
)

(defun c:test()
(setq var "New")
(Chgatts "MijnBlock" var)
)


Hopelijk is het, wat je bedoelt.

Met vriendelijke groet,
HofCAD CSI
ACADcadabra

Maikel

Beste HofCAD,

Hartstikke bedankt voor je snel reactie. Wat ik zo kan zien doet dit wat nodig is. Ik zal het vanmiddag gaan testen dan zit ik namelijk weer achter de juiste PC.

Ik heb alleen twee vragen?
1) In de test staat "MijnBlock". Moet dit de naam van de block zijn of kan dit ook een lijst met daarin de verschillende blocken. Zit
    hiervoor de teller erin? De blokken die ik wil invullen hebben namelijk niet allemaal dezelfde naam.
2) Bij "if ssblocks" moet hier niet nog een vergelijkende waarde aan vast?

Misschien zijn het wel simpele antwoorden want ik ben nog niet zo bekend met LISP. Ik vind het wel een ontzettend interessant onderwerp want men kan er zoveel mee.

Alvast bedankt,

MvG,

Maikel

HofCAD

#3
Citaat van: Maikel op di 24 04 2007, 07:57:05
Beste HofCAD,

Hartstikke bedankt voor je snel reactie. Wat ik zo kan zien doet dit wat nodig is. Ik zal het vanmiddag gaan testen dan zit ik namelijk weer achter de juiste PC.

Ik heb alleen twee vragen?
1) In de test staat "MijnBlock". Moet dit de naam van de block zijn of kan dit ook een lijst met daarin de verschillende blocken. Zit
    hiervoor de teller erin? De blokken die ik wil invullen hebben namelijk niet allemaal dezelfde naam.
2) Bij "if ssblocks" moet hier niet nog een vergelijkende waarde aan vast?

Misschien zijn het wel simpele antwoorden want ik ben nog niet zo bekend met LISP. Ik vind het wel een ontzettend interessant onderwerp want men kan er zoveel mee.

Alvast bedankt,

MvG,

Maikel

Beste Maikel,


Als er in de selectieset ssblocks geen entiteiten (blocks in dit geval) zitten,
dan is ssblocks nil.
De teller is, om alle blocks met de naam  blocknaam een voor een af te lopen.
Indien je bij meerdere blocknamen de attribuut waarde wil veranderen,
dan zul je het programma Chgatts meerdere keren moeten aanroepen.
(Chgatts "MijnBlock1" var)
(Chgatts "MijnBlock2" var)
(Chgatts "MijnBlock3" var)
enz.
Waarbij Mijnblock1, Mijnblock2, Mijnblock3 de resp. blocknamen zijn, en var
de variabele met de nieuwe waarde.
Natuurlijk kun je de blocknamen in een lijst zetten, en het programma met een
repeat de lijst laten afwerken.

(defun c:test2()
(setq var "Hallo")
(setq i 0 blocknamen '("MijnBlock1" "MijnBlock2" "MijnBlock3"))
(repeat (length  blocknamen)
(Chgatts (nth i blocknamen) var)
(setq i (1+ i))
))


Met vriendelijke groet,
HofCAD CSI
ACADcadabra

Maikel

Beste HofCAD,

Is het mogelijk de naam van de attribute die ingevuld moet worden in te geven. Er zitten namelijk meerder attribute aan het block vast. Met het programmatje van jou wordt het eerst attribute ingevuld.

Alvast bedankt,

Maikel.



HofCAD

#5
Citaat van: Maikel op wo 25 04 2007, 14:56:00
Beste HofCAD,
Is het mogelijk de naam van de attribute die ingevuld moet worden in te geven.
Er zitten namelijk meerder attribute aan het block vast.
Met het programaatje van jou wordt het eerst attribute ingevuld.
Alvast bedankt,
Maikel.
Beste Maikel,

Een volgende poging.


(defun Chgatts3(BlockNaam attrib Waarde / ~CMD ssblocks teller item test next dnext)
(setq ~CMD (getvar "CMDECHO")) (setvar "CMDECHO" 0)
(setq attrib (strcase attrib)
ssblocks (ssget "X" (list '(0 . "INSERT") '(66 . 1)
(cons 2 BlockNaam))) teller 0)
(if ssblocks
(progn
(repeat  (sslength ssblocks)
(setq item (ssname ssblocks teller)
test (cdr (assoc 66 (entget item))))
(if (= test 1)
(progn
(setq dnext (entget (setq next (entnext (cdr (assoc -1 (entget item)))))))
(while (= (cdr (assoc 0 dnext)) "ATTRIB")
(if (= attrib (strcase (cdr (assoc 2 dnext))))
(progn
(command "_ATTEDIT" "N" "Y" BlockNaam "" "" (cdr (car dnext)) (cdr (assoc 1 dnext)) waarde))
)
(setq next (entnext next))
(setq dnext (entget next))
)
))
(setq teller (1+ teller))
)
))
(setvar "CMDECHO" ~CMD)
)



(defun c:test3()
(setq attrib "MijnTag" var "Nieuwtje")
(setq i 0 blocknamen '("MijnBlock1" "MijnBlock2" "MijnBlock3"))
(repeat (length  blocknamen)
(Chgatts3 (nth i blocknamen) attrib var)
(setq i (1+ i))
)
)



Met vriendelijke groet,
HofCAD CSI




ACADcadabra

Maikel

Beste HofCAD,

Het programma werkt. Bedankt

Misschien dat ik lastig ben, is het mogelijk een selectie te maken van de blocks. die gewijzigd worden. In plaats van dat de hele tekening wordt gewijzigd.
Ik dacht zelf. De X weg te halen bij:

ssblocks (ssget "X" (list '(0 . "insert") '(66 .1) (cons 2 BlockNaam)

Maar dit geeft als probleem dat de blocknaam niet overeen komt. Zou hier een oplossing voor zijn, zo ja dan hoor ik die graag.

Alvast bedankt.

Maikel

HofCAD

#7
Citaat van: Maikel op do 26 04 2007, 16:07:20
Beste HofCAD,
Het programma werkt. Bedankt
Misschien dat ik lastig ben, is het mogelijk een selectie te maken van de blocks. die gewijzigd worden. In plaats van dat de hele tekening wordt gewijzigd.
Ik dacht zelf. De X weg te halen bij:
ssblocks (ssget "X" (list '(0 . "insert") '(66 .1) (cons 2 BlockNaam)
Maar dit geeft als probleem dat de blocknaam niet overeen komt. Zou hier een oplossing voor zijn, zo ja dan hoor ik die graag.
Alvast bedankt.
Maikel

Beste Maikel,

Weet je de blocknamen wel of niet van te voren,
en indien je ze weet wil je daarop discrimineren ja of nee.

Als je de blocknamen weet en je wilt daarop discrimineren,
dan kun je het onderstaande doen:


(defun Chgatts4(ssblocks BlockNaam attrib Waarde / ~CMD teller item test next dnext)
(setq ~CMD (getvar "CMDECHO")) (setvar "CMDECHO" 0)
(setq attrib (strcase attrib) BlockNaam (strcase BlockNaam) teller 0)
(if ssblocks
(progn
(repeat  (sslength ssblocks)
(setq item (ssname ssblocks teller)
test (cdr (assoc 66 (entget item))))
(if (= test 1)
(progn
(setq dnext (entget (setq next (entnext (cdr (assoc -1 (entget item)))))))
(while (= (cdr (assoc 0 dnext)) "ATTRIB")
(if (and (= attrib (strcase (cdr (assoc 2 dnext))))
(=  BlockNaam (strcase(cdr (assoc 2 (entget item))))))
(progn
(command "_ATTEDIT" "N" "Y" BlockNaam "" "" (cdr (car dnext)) (cdr (assoc 1 dnext)) waarde))
)
(setq next (entnext next))
(setq dnext (entget next))
)
))
(setq teller (1+ teller))
)
))
(setvar "CMDECHO" ~CMD)
)


(defun c:test4(/ ssblocks attrib var i blocknamen)
(setq ssblocks (ssget (list '(0 . "INSERT") '(66 . 1))))
(setq attrib "MijnTag" var "Nieuwtjes")
(setq i 0 blocknamen '("MijnBlock1" "MijnBlock2" "MijnBlock3"))
(repeat (length  blocknamen)
(Chgatts4 ssblocks (nth i blocknamen) attrib var)
(setq i (1+ i))
)
)


Met vriendelijke groet,
HofCAD CSI
ACADcadabra

HofCAD

#8
Citaat van: Maikel op do 26 04 2007, 16:07:20
Beste HofCAD,
Het programma werkt. Bedankt
Misschien dat ik lastig ben, is het mogelijk een selectie te maken van de blocks. die gewijzigd worden. In plaats van dat de hele tekening wordt gewijzigd.
Ik dacht zelf. De X weg te halen bij:
ssblocks (ssget "X" (list '(0 . "insert") '(66 .1) (cons 2 BlockNaam)
Maar dit geeft als probleem dat de blocknaam niet overeen komt. Zou hier een oplossing voor zijn, zo ja dan hoor ik die graag.
Alvast bedankt.
Maikel

Beste Maikel,

Als je niet wil discrimineren op de blocknaam,
dan kun je het volgende doen.

(defun Chgatts5(ssblocks attrib Waarde / ~CMD teller item test next dnext)
(setq ~CMD (getvar "CMDECHO")) (setvar "CMDECHO" 0)
(setq attrib (strcase attrib) teller 0)
(if ssblocks
(progn
(repeat  (sslength ssblocks)
(setq item (ssname ssblocks teller)
test (cdr (assoc 66 (entget item))))
(if (= test 1)
(progn
(setq dnext (entget (setq next (entnext (cdr (assoc -1 (entget item)))))))
(while (= (cdr (assoc 0 dnext)) "ATTRIB")
(if (= attrib (strcase (cdr (assoc 2 dnext))))
(progn
(command "_ATTEDIT" "N" "Y" "" "" "" (cdr (car dnext)) (cdr (assoc 1 dnext)) waarde))
)
(setq next (entnext next))
(setq dnext (entget next))
)
))
(setq teller (1+ teller))
)
))
(setvar "CMDECHO" ~CMD)
)



(defun c:test5()
(setq ssblocks (ssget (list '(0 . "INSERT") '(66 . 1))))
(setq attrib "MijnTag" var "Nieuwigheden")
(Chgatts5 ssblocks attrib var)
)


Met vriendelijke groet,
HofCAD CSI
ACADcadabra

Maikel

 :mrgreen:Perfect  :vreegoe:

Dit laatste programma is precies wat ik zocht, thanx.

Maikel