Zobrazit plnou verzi příspěvku: atributy-pořadí

Ferdinand
07.07.2008, 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))
  )
 )
)

Buba
07.07.2008, 11:59
Cez _GATTE Vám to nestačí?

alfred
07.07.2008, 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

Ferdinand
07.07.2008, 13:30
To Buba: Nebere mi to jméno atributy:
Command: GATTESelect 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_DOKUMENTUSelect attribute or type attribute name: DATUM_NÁVRHU*Invalid selection*Expects a single object.
Select attribute or type attribute name:
To Alfred:
[QUOTE=Ferdinand]Jak lze získat v lispu atribut s tímhle pořadím  (bez nutnosti ukazování na něj)?
[/QUOTE]

alfred
07.07.2008, 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))
)

Buba
07.07.2008, 14:08
A keď si atribut označíte myšou?

Ferdinand
07.07.2008, 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.Ferdinand2008-07-07 14:20:21

Sedláček
07.07.2008, 14:22
Proč 128-krát?
GATTE změní hodnotu atributu ve všech blocích daného jména najednou.

alfred
07.07.2008, 14:33
[QUOTE=Ferdinand] Ale hlavně - jsem jen "sváteční" lispátor.[/QUOTE]

To já taky, bez helpu u VisualLispu nenapisu nic. :-D

alfred
07.07.2008, 14:36
[QUOTE=Sedláček] Proč 128-krát?
GATTE změní hodnotu atributu ve všech blocích daného jména najednou.[/QUOTE]

Hadam, ale predpokladam, ze to pan Ferdinand potrebuje zmenit ve 128 souborech...

Ferdinand
07.07.2008, 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).

Buba
07.07.2008, 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))

Ferdinand
08.07.2008, 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
 Ferdinand2008-07-08 10:59:06

Sedláček
08.07.2008, 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.

Ferdinand
08.07.2008, 11:07
[QUOTE=alfred]
(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[/QUOTE]
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")       )

Sedláček
08.07.2008, 11:11
[QUOTE=Ferdinand] 
Command: (command "gatte" "_B" "RT1" "REVIZE" "_Y")[/QUOTE]
 
 
Přes command z LISPU vám to chodit nemůže. GATTE není příkaz Autocadu ale funkce LISP.

Ferdinand
08.07.2008, 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
 Ferdinand2008-07-08 11:35:32

Buba
08.07.2008, 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é)
 

Ferdinand
09.07.2008, 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 ?

Sedláček
09.07.2008, 08:44
[QUOTE=Ferdinand]
ToTo Sedláček: To myslíte sáhnout do kódu gatte.lsp ?[/QUOTE]
 
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.

Luděk Líkař
09.07.2008, 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. 

chlebovsky
09.07.2008, 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.

Ferdinand
10.07.2008, 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!

Luděk Líkař
10.07.2008, 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



Je tam i krátký návod jak to zprovoznit, doufám, že to poběží.
 
Přikládám náhled:
 
Luděk Líkař2008-07-10 14:29:07

Ferdinand
12.11.2008, 16:09
Po rozbalení mi antivir hlásí virus.

Ferdinand
12.11.2008, 16:37
To Chlebovsky: Pochopil jste mne dobře, děkuji, tohle mi chodí bez problému.

Luděk Líkař
13.11.2008, 07:17
[QUOTE=Ferdinand]Po rozbalení mi antivir hlásí virus.[/QUOTE]
 
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.

Ferdinand
13.11.2008, 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.

Luděk Líkař
14.11.2008, 09:52
Soubor jsem prověřil také pomocí NOD32 a je čistý. Zkuste použít jiný antivirus. Význam textu v závorce ?? .