Vytisknout stránku | Zavřít okno

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:
Původně odeslal(a) Ferdinand 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

Cry 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
Původně odeslal(a) Ferdinand 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
Původně odeslal(a) Sedláček 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
Question 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
Původně odeslal(a) alfred 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
Původně odeslal(a) Ferdinand Ferdinand napsal(a):

Question 
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
Původně odeslal(a) Ferdinand 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.Nuke

-------------
-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
Původně odeslal(a) Ferdinand Ferdinand napsal(a):

Po rozbalení mi antivir hlásí virus.Nuke
 
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 ?? Dead.



-------------
Líkař



Vytisknout stránku | Zavřít okno