atributy-pořadí
Vytištěno z: CAD Fórum
Kategorie: Autodesk - stavebnictví, strojírenství, CAD/GIS
Název fóra: CAD programování
Popis fóra: Otázky programování - nadstavby a utility pro CAD a GIS aplikace Autodesk (VBA, AutoLISP, ARX/C++, .Net, JavaScript, Python, MEL...)
URL: https://www.cadforum.cz/forum/forum_posts.asp?TID=6746
Datum vytištění: 13.kvě.2026 v 22:47
Téma: atributy-pořadí
Odeslal: Ferdinand
Předmět: atributy-pořadí
Datum odeslání: 07.čvc.2008 v 11:55
|
Mám blok (dejme tomu že má název RT1) se 32-mi atributy, ve výkrese je 128-krát vložený. Chtěl bych pomocí lispu změnit Value atributu DATUM ve všech RT1 na stejnou hodnotu. DATUM je v dialogu Attedit zobrazen jako 14. v pořadí. Jak lze získat v lispu atribut s tímhle pořadím (bez nutnosti ukazování na něj)? Zatím je koncepce taková:
(setq AA (ssget "X" '((0 . "INSERT") (2 . "RT1"))))
(if (/= AA nil) (progn
(setq VYB0 (strcase (getstring "\nNovy datum: <2008-07-01> ")))
(setq N 0)
(while (< N (sslength AA)) (setq E (ssname AA N)) (setq E2 ???) ;tady nevím co má být
(setq S2 (entget E2))
(setq OO2 (assoc 1 (entget E2)))
(setq NN2 (cons 1 VYB0))
(setq S2 (subst NN2 OO2 S2))
(entmod S2)
(entupd E)
(setq N (1+ N))
)
)
)
------------- -FerTh-
|
Odpovědi:
Odeslal: Buba
Datum odeslání: 07.čvc.2008 v 11:59
|
Cez _GATTE Vám to nestačí?
|
Odeslal: alfred
Datum odeslání: 07.čvc.2008 v 13:00
vybrat objekt - blok
v cyklu pouzit funkci (entget ) a a kontrolovat jakou entitu to vrati. Kdyz je to atribut s pozadovanym jmenem zmenit hodnotu.
Cyklus ukoncit pokud ENTGET vrati entitu "SEQEND".
(setq objekt (car (ENTSEL)))
(setq objekt(ENTNEXT objekt))
(while (/= (cdr (assoc 0 (entget objekt))) "SEQEND")
(if (and
(= (cdr (assoc 0 (entget objekt))) "ATTRIB")
(= (cdr (assoc 2 (entget objekt))) "DATUM")
)
(print "upravit objekt")
(print "Atribut nebyl nalezen...")
);if
(setq objekt (ENTNEXT objekt))
);while
|
Odeslal: Ferdinand
Datum odeslání: 07.čvc.2008 v 13:30
|
To Buba: Nebere mi to jméno atributy:
Command: GATTE Select block or attribute [Block name]: B
Enter block name: RT1
Known tag names for block: TEXT_S2 TEXT_S1 TEXT13 TEXT12 TEXT11 È.V.ZÁKAZNÍKA JAZYK PÙVOD ODDÌLENÍ È.ZAKÁZKY ZÁKAZNÍK2 ZÁKAZNÍK1 AKCE4 AKCE3 AKCE2 AKCE1 DATUM_SCHVÁLENÍ SCHVÁLIL DATUM_NÁVRHU NAVRHL STATUS DCC - ++ + = STRANA REVIZE ÈÍSLO_DOKUMENTU NÁZEV2 NÁZEV1 DRUH_DOKUMENTU Select attribute or type attribute name: DATUM_NÁVRHU *Invalid selection* Expects a single object.
Select attribute or type attribute name:
To Alfred:
Ferdinand napsal(a):
Jak lze získat v lispu atribut s tímhle pořadím (bez nutnosti ukazování na něj)?
|
------------- -FerTh-
|
Odeslal: alfred
Datum odeslání: 07.čvc.2008 v 13:55
To mate prece v tom Vasem uvodnim prikladu
(setq AA (ssget "X" '((0 . "INSERT") (2 . "RT1"))))
vybere to vsechny bloky, selekci je potreba projit v cyklu
a pro kazdou entitu ve vyberu provest to co jsem psal.
Na prochazeni vyberem jsou funkce (sslength) a (ssname).
Neco jako:
(setq n 0)
(while (< n (sslength aa))
(setq objekt (ssname aa n))
;zde dat cast programu, ktera upravuje atribut
(setq n (+ n 1))
)
|
Odeslal: Buba
Datum odeslání: 07.čvc.2008 v 14:08
|
A keď si atribut označíte myšou?
|
Odeslal: Ferdinand
Datum odeslání: 07.čvc.2008 v 14:17
|
128-krát???
To Alfred: Aha, už to chápu. Mám trošku ztvrdlou hlavu. Ale hlavně - jsem jen "sváteční" lispátor.
------------- -FerTh-
|
Odeslal: Sedláček
Datum odeslání: 07.čvc.2008 v 14:22
|
Proč 128-krát?
GATTE změní hodnotu atributu ve všech blocích daného jména najednou.
|
Odeslal: alfred
Datum odeslání: 07.čvc.2008 v 14:33
Ferdinand napsal(a):
Ale hlavně - jsem jen "sváteční" lispátor. |
To já taky, bez helpu u VisualLispu nenapisu nic. :-D
|
Odeslal: alfred
Datum odeslání: 07.čvc.2008 v 14:36
Sedláček napsal(a):
Proč 128-krát?
GATTE změní hodnotu atributu ve všech blocích daného jména najednou. |
Hadam, ale predpokladam, ze to pan Ferdinand potrebuje zmenit ve 128 souborech...
|
Odeslal: Ferdinand
Datum odeslání: 07.čvc.2008 v 15:38
|
To Sedláček: Děkuji, to jsem nevěděl - ovšem díky Buba ode dneška už vím, že existuje i příkaz gatte... Přesto ale nelze zadat (anebo to dělám špatně) čistě jméno atributu (viz výše) - chce to po mne kliknutí na hledaný DATUM; já bych raději, aby to proběhlo bez nutnosti na něco (co nevím, kde se nachází - teda já asi ano, ale ostatní uživatelé o tom nemaj ani šajnu...) klikat.
To Alfred: Ne ve 128 souborech, ale v 1 souboru, kde je RT1 vložen 128-krát (viz pův. příspěvek).
------------- -FerTh-
|
Odeslal: Buba
Datum odeslání: 07.čvc.2008 v 16:30
|
Podľa mňa má problém s medzerami v názve atribútu a s diakritikou. Keby bol názov atribútu zadaný jednoduchým názvom, tak by Vám to zobralo. (Predpokladám, že výber atribútu ste potom dali na všetky, nie po jednom (AD128-krát))
|
Odeslal: Ferdinand
Datum odeslání: 08.čvc.2008 v 10:51
Ale ono to fakt nefunguje - mne to taky napadlo s tou diakritikou a tak jsem to zkusil pro atribut s názvem REVIZE (bez mezer, bez diakritiky)...a nic.
Dám-li do p.ř.:
Command: (command "gatte" "_B" "RT1" "REVIZE" "_Y")
tak odezva je:
gatte Unknown command "GATTE". Press F1 for help.
Command: _B Unknown command "B". Press F1 for help.
Command: RT1 Unknown command "RT1". Press F1 for help.
Command: REVIZE Unknown command "REVIZE". Press F1 for help.
Command: _Y Unknown command "Y". Press F1 for help.
Command: nil
------------- -FerTh-
|
Odeslal: Sedláček
Datum odeslání: 08.čvc.2008 v 10:54
|
To je divný mě to normálně funguje.
Ale pokusně jsem udelal atribut s diakritikou a to mě GATTE také nevzal. Asi by to chtělo sáhnout do kódu.
|
Odeslal: Ferdinand
Datum odeslání: 08.čvc.2008 v 11:07
alfred napsal(a):
(setq objekt (car (ENTSEL))) (setq objekt(ENTNEXT objekt)) (while (/= (cdr (assoc 0 (entget objekt))) "SEQEND") (if (and (= (cdr (assoc 0 (entget objekt))) "ATTRIB") (= (cdr (assoc 2 (entget objekt))) "DATUM") ) (print "upravit objekt") (print "Atribut nebyl nalezen...") );if (setq objekt (ENTNEXT objekt)) );while |
Není třeba u toho if připsat proměnnou OBJEKT ?
(if OBJEKT (and (= (cdr (assoc 0 (entget objekt))) "ATTRIB") (= (cdr (assoc 2 (entget objekt))) "DATUM") )
------------- -FerTh-
|
Odeslal: Sedláček
Datum odeslání: 08.čvc.2008 v 11:11
Ferdinand napsal(a):
Command: (command "gatte" "_B" "RT1" "REVIZE" "_Y") |
Přes command z LISPU vám to chodit nemůže. GATTE není příkaz Autocadu ale funkce LISP.
|
Odeslal: Ferdinand
Datum odeslání: 08.čvc.2008 v 11:25
|
Pljoin je taky lisp a provozuji to uvnitř vlastní aplikace:
(load (findfile "pljoin.lsp")) (command "delay" 500) pljoin _All ; 0.1 (princ)
Ale když dám
(load (findfile "gatte.lsp"))
(command "delay" 500) gatte
_B
RT1
REVIZE
NOVADATA
_Y
tak se na p.ř. objeví ona již jednou zmíněná hláška
------------- -FerTh-
|
Odeslal: Buba
Datum odeslání: 08.čvc.2008 v 12:01
|
Môj postup pri funkcii Gatte býva nasledovný a nemám s tým nikdy problémy:
_GATTE, vyberiem blok (myšou), a následne atribut (tiež myšou), napíšem novú hodnotu pre atribut, vypíše mi koľkokrát sa nachádza vo výkrese, či chcem zmeniť všetky, dám Yes a je to.
Ak Vám to takto nefunguje, tak je chyba v niektorej premennej (PICKFIRST=0 ja mám =1 al. niečo podobné)
|
Odeslal: Ferdinand
Datum odeslání: 09.čvc.2008 v 08:34
|
To Buba: Jasně, příkaz jako takový jsem vyzkoušel a funguje bez jediného zádrhelu (2x kliknout, 1x napsat, 1x Enter). Ovšem zde jsme ve fóru Programování, tudíž to chci použít v lispu. Bohužel, v tomto případě asi mám smůlu.
To Sedláček: To myslíte sáhnout do kódu gatte.lsp ?
------------- -FerTh-
|
Odeslal: Sedláček
Datum odeslání: 09.čvc.2008 v 08:44
Ferdinand napsal(a):
ToTo Sedláček: To myslíte sáhnout do kódu gatte.lsp ? |
Ano myslel jsem sáhnout do GATTE.LSP. Ale obávám se, že to nebude až ak jednoduché.
Jen pro úplnost jsem zkoušel příkaz _-ATTEDIT. I zde jsem narazil na problém s diakritikou. (Mám A2002LT)
Jsem rád, že jsem si zvykl (jako odkojenec DOSu) psát názvy souborů, bloků, hladin... bez hacku bez carek.
|
Odeslal: Luděk Líkař
Datum odeslání: 09.čvc.2008 v 12:41
Pro to co potřebujete mám udělanou utilitku ve VBA, která mi běží pod AC 2004 na XP (vzhledem k použitým funkcím XP nutné). Po nastavení prohledá soubor a změní hodnotu daného atributu ve všech blocích výkresu daného jména. Pro nastavení je nutné mít daný blok v samostaném souboru. U výkresů s velkým množstvím entit to trvá déle. Pokud budete mít zájem mohu utilitku nahrát na server iprojekt. Dejte vědět.
------------- Líkař
|
Odeslal: chlebovsky
Datum odeslání: 09.čvc.2008 v 13:33
|
Pokud jsem dobře pochopil tak ve výkrese je spousta bloků, a já potřebuju vybrat jen se jménem "RT1" a u těchto bloků změnit pouze atribut "DATUM" na nějaký napsaný text.
Toto by to mělo vyřešit :
(setq ssbloky (ssget "X" '((0 . "INSERT") (2 . "RT1")))) (if (/= ssbloky nil) (progn (setq newdate (strcase (getstring "\nNovy datum: <2008-07-01> "))) (setq i 0) (repeat (sslength ssbloky) (setq blok (entget (ssname ssbloky i))) (setq ent blok) (while (= (cdr (assoc 0 (setq ent (entget (entnext (cdr (assoc -1 ent))))))) "ATTRIB") (if (= "DATUM" (cdr (assoc 2 ent))) (progn (setq ent (subst (cons 1 newdate) (assoc 1 ent) ent)) (entmod ent) (entupd (cdr (assoc -1 ent))) ) ) ) (setq i (1+ i)) ) ) (alert "Ve výkrese se blok RT1 nevyskytuje.") )
teda doufám :-)
jinak ten zázračný příkaz jak bylo hned na začítku poptáváno je entnext....
ono totiž attributy a vertexy od křivek nelze nikde jen tak jednoduše vyhledat, ale je vždy pravidlem že když vytvoříte blok s atributama nebo křivku, tak první entita je vždy ten blok, a zaním jsou přiřazené entity - atributy popř. body na křivce, a jsou tak dlouho dokud to není uzavřené SEQEND, pak následují další entity....
takže získat jméno entity bloku = BLOKJM a
následující atribut je
ATT1 (entnext BLOKJM)
ATT2 (entnext ATT1)
ATT3 (entnext ATT2)
...
...
...
a to tak dlouho dokud to nebude SEQEND
taktéž i se křivkou, a můžete tím měnit i jednotlivé body :-)
Snad jsem pomohl.
------------- Ing. Martin Chlebovský
www.kde-je-auto.cz
GPS monitoring provozu vozidel a osob.
WebDeveloper.
Programátor aplikací pro Autocad a MS Office.
Tvorba WWW aplikací.
Modelování domů a staveb.&l
|
Odeslal: Ferdinand
Datum odeslání: 10.čvc.2008 v 11:24
|
To Chlebovsky: Hned to jdu vyzkoušet.
To Líkař: OK, pokud to dáváte k použití pro širokou veřejnost, tak si to z iprojectu stáhnu (jaký má název ten soubor?) a vyzkouším.
Děkuji všem!
------------- -FerTh-
|
Odeslal: Luděk Líkař
Datum odeslání: 10.čvc.2008 v 14:28
Tak je možno utilitu stáhnout na iprojektu: http://www.iproject.cz/get.asp?/Soubory/CAD%5FForum/U%9Eivatelsk%E9%2Dupload/Bloky/bloky%5Fv6%5F0.zip - http://www.iproject.cz/get.asp?/Soubory/CAD%5FForum/U%9Eivatelsk%E9%2Dupload/Bloky/bloky%5Fv6%5F0.zip
Je tam i krátký návod jak to zprovoznit, doufám, že to poběží.
Přikládám náhled:
------------- Líkař
|
Odeslal: Ferdinand
Datum odeslání: 12.lis.2008 v 16:09
Po rozbalení mi antivir hlásí virus.
------------- -FerTh-
|
Odeslal: Ferdinand
Datum odeslání: 12.lis.2008 v 16:37
To Chlebovsky: Pochopil jste mne dobře, děkuji, tohle mi chodí bez problému.
------------- -FerTh-
|
Odeslal: Luděk Líkař
Datum odeslání: 13.lis.2008 v 07:17
Ferdinand napsal(a):
Po rozbalení mi antivir hlásí virus. |
Projel jsem stažený soubor z i-projektu AVG a je čistý, tak netuším jak to, že Vám to hlásí vir. Tohle se mi stalo v září u GGmenu a u CAD standardů, ale soubor jsem nahrával v červenci.
------------- Líkař
|
Odeslal: Ferdinand
Datum odeslání: 13.lis.2008 v 09:43
OT: (Nejspíše do fóra Non-acad-sw ... ale zde se to týká uvedeného souboru) Používáme antivirový program VirusScan. Náš specialista IT tvrdí, že každý antivir dělá nějak "jinak", něco "jiného", že se zaměřuje na určitou oblast.
------------- -FerTh-
|
Odeslal: Luděk Líkař
Datum odeslání: 14.lis.2008 v 09:52
|
Soubor jsem prověřil také pomocí NOD32 a je čistý. Zkuste použít jiný antivirus. Význam textu v závorce ?? .
------------- Líkař
|
|