Zobrazit plnou verzi příspěvku: zjištění dat bloku v rozvrženích

Ferdinand
28.11.2008, 14:05
Chtěl bych se dopídit, zda lze přiřadit do proměnných (třeba VADNO, VAREV, VATI1) různé hodnoty VALUE některých (vždy těch stejných tří) atributů bloku stejného názvu z různých rozvržení. Něco jako filtr pro 3 různé TAGy (DOC_NO. ,  REV.  ,  TITLE_1) v bloku RAZ--T1 pro různé CTAB.
Osvělím blíže na příkladu:
výkres má celkem 17 rozvržení
-vytvořit list layoutů (to dokážu)
->cyklus: přepni do 1. layoutu
-zjisti v bloku RAZ--T1 hodnoty u TAGů v tomto layoutu:
DOC_NO. -> VADNO
REV. -> VAREV
TITLE_1 -> VATI1
...
sestavení řetězce z VADNO a VAREV
podmíněná funkce dle VATI1
...
-přepni do následujícího layoutu
->po vyčerpání všech 17 - konec cyklu
 

chlebovsky
04.12.2008, 16:50
získat jakékoliv informace lze z čehokoliv ať je to kdekoliv. Jen záleží natom jak to máte udělaný. Když pošlete to DWG s těma blokama dá se na to koknout. Dle toho Vašeho popisu, mi to moc jasný není :-(
 
Dále je tam dotaz ohledně nějakého přiřazení, všeobecně, k jakékoliv entitě, úsečka, křivka, šrafa... ale i blok, můžete přiřadit téměř jakýkoliv seznam rozšířených dat, tzv XDATA.
 
Trochu bych pochopil že v podstatě požadujete aby :
na každém rozvržení byl blok a ten měl 3 údaje, prostě nějaké přidělené data.
 
A pak z toho chcete vytvořit seznam aby to vyhledalo všechny bloky a načetlo z nich ty údaje.
 
Možná jsem řešil něco podobného. V rozvržení mám popisovou tabulku. Tam klasické texty, projektant, datum, číslo výkresu......
A pak mám udělanou funkci na tu když kliknu tak mi to vytvoří seznam výkresů včetně datumů, názvů..... atd
Řeším to tak že na 1 rozvržení mám napsaný text, tomu textu přidělím rozšířená data s vlastností "PROJEKTANT" a pak jen samotný text přepíšu na ing. Martin Chlebovský
to udělám pro všechny texty.
Takže mám jakoby vytvořenou šablonu s 1 rozvržením, to si nakopčím kolikrát potřebuju, vyplním údaje.
Pak kliknu na tu funkci a vyjede mi dialog kde mám jednotlivé položky a odpovídající texty, to pak můžu exportnout do excelu.
Když tak dejte vědět, a dáme to nějak dokupy.

Ferdinand
05.12.2008, 14:43
Takže ten princip nyní trošku podrobněji:
V bloku RAZ--T1 jsou atributy (hodně - je to roh. razítko). Potřebuji znát v každém rozvržení (je jich 17):
1. pro TAG atributu s názvem DOC_NO. hodnotu VALUE  tohoto atributu přiřadit proměnné VADNO - to neumím
2. pro TAG atributu s názvem REV. hodnotu VALUE  tohoto atributu přiřadit proměnné VAREV - to neumím
3. pro TAG atributu s názvem TITLE_1 hodnotu VALUE  tohoto atributu přiřadit proměnné VATI1 - to neumím
4. pro TAG atributu s názvem TITLE_2 hodnotu VALUE  tohoto atributu přiřadit proměnné VATI2 - to neumím
5. V akt. rozvržení je z těchto hodnot vždy sestaven řetězec (=název výstupního souboru pdf)
(setq NNR (strcat VADNO "_" VAREV))
6. dle obsahu VATI1 a VATI2 je nastaven styl vykreslování (přiřazeno proměnné CTB) - něco jako
(if (or (= VATI1 "FOUND*")(= VATI1 "FOUND*")))(setq CTB "LASER-1.ctb"))
7. název bloku "0PZ*" (=rámeček, v každém rozvržení jiný) přiřadit proměnné FR a dle toho přiřadit proměnné FORMAT kód formátu (např.   FR="0PZA0" => FORMAT="A0 (841.00 x 1189.00 MM)" atd.) - to dokážu
(Dík za trpělivost)

chlebovsky
05.12.2008, 20:16
1) je třeba sestavit seznam rozvržení a jejich názvů, jestli to jde nějak popořadě, dle názvů nebo jak to záleží na tom jak to máte tvořené, ale každopádně
 
a) seznam rozvržení se získá :
(setq roz (dictsearch (namedobjdict) "ACAD_LAYOUT"))
 
toto vám vrátí seznam kde je vždy
(3 . "P1") (350 . <Entity name: 7efd6448>)
x krát posobě dle toho kolik tam máte rozvržení včetně modelu a dalších parametrů
3 znamená název, 350 znamená entitu která charakterizuje samotné rozvržení
dále když si dáte (entget a té 350 entity) vyjede to info o tom rozvržení - tiskárnu a tak dále
 
2) jak dojít k danému bloku v daném rozvržení
vím že blok je RAZ--T1 a rozvrzeni trebas ROZ-1
pak blok je
(setq ent (ssget "X" (list (cons 0 "INSERT")(cons 2 "RAZ--T1")(cons 410 "ROZ-1"))))
vrátí vám to výběrovou množinu jejiž prvky získáte
(setq blok (ssname ent 0))
a máte vlastně daný blok v daném rozvržení
 
to vše musíte v ciklu dle počtu těch 350 v tom ROZ
 
3) máme blok a jak získat dané atributy
(setq att1 (entnext blok))

(setq att2 (entnext att1))
(setq att3 (entnext att3))
tak dlouho dokud nebude (entget attI) -> 0."SEQUEND")
pak jste na konci seznamu atributu, a někde mezi nimy musely být ty Vaše atributy.
dejme tomu že :
(setq data (entget att1))
to je náš blok s TAGEM REV
0 . "ATTRIB" že jedná o atribut
410 . "ROZ-1"  že je v rozvržení ROZ-1
poloha, hladina, adalší a další a další až
1 . "VALUE" a to musíme změnit
(setq data1 (subst (cons 1 "POKUS")(assoc 1 data) data))
kde "POKUS" může být klidně ta Vaše proměnná VAREV
poté se provede aktualizace toho atributu a to :
(entmod data1)
a je hotovo.
Tak pro všechny atributy pro všechny rozvržení
 
A to bych řek že je vše ?
Když tak napište a budeme pokračovat.
S pozdravem Martin.

Ferdinand
08.12.2008, 09:24
ad1a. Tohle jsem ještě nikde neviděl, kde chodíte na ty příkazy? Věděl jsem jenom, že lze získat názvy rozvržení pomocí (layoutlist)
tj. seznam ("ROZ1" "ROZ2" ...)
ad2. To vím, jde mi o to, že v cyklu nemohu psát konkrétní název rozvržení ale vždy další název z (layoutlist). Takže by tam mělo asi být
(cons 410 LAYT1)
přičemž
(setq LAYTL (layoutlist))
(setq i 0)  (while (< i (sslength LAYTL))    (command "_layout" "_S" (nth i LAYTL))  )  (setq LAYT1 (nth i LAYTL))
Takže nevím, jak to tam dostat když uvažuji takhle
  (setq RT1 (ssget "_X" (list (cons 0 "INSERT") (cons 2 "RAZ--T1") (cons 410 LAYT1))))  (if (/= RT1 nil)    (progn      (setq E (ssname RT1 0))      (setq S0 (entget E))
;;...a co sem??
ad3. Nechci měnit hodnoty atributu - chci jenom získat jejich hodnotu a ty hodnoty použít dál.
Proč je tam (cons 410 ...) když jméno rozvržení je pod kódem 3 (jak jste to psal výše)? Ovšem v obou případech dostanu nil .Ferdinand2008-12-11 09:15:17

Ferdinand
11.12.2008, 16:53
Pořád to není dobrý.

chlebovsky
13.12.2008, 09:37
jak píšete seznam můžete sehnat i touto cestou, možná lepší :-)
pokud používáte pro výběr ssget "_X" myslím si a nepoužívám to, nemusíte se do daného rozvržení vůbec přepínat, takže ten command "_lay... muzete uplne vynechat. SSget "_X" totiz pracuje s databazi nikoli s monitorem
pak do hodnoty LAYT1 načítáte  název layoutu - ok
pak do RT1 vyhledáte příslušný blok - ok
máte kontrolu existence bloku - ok
pak získáte jeho jméno entity a jeho data vložíte do SO - eeee
to už je zbytečný, protože pokud máte název bloku, tak jeho atributy získáte pomoci
(entnext E) tím získáte první atribut
rekneme (setq atr (entnext E))
dalsi atribut pak (setq atr (entnext atr))
atd.. tak dlouho dokud to nebude ten sequend
Takže napřed musíte z toho E dostat další atribut, a pak cyklem dokud to nebude seq....
když dostanete ten daný atribut je rekneme v ATR
tak (setq DATA-ATR (entget ATR))
a máte zase asociativní seznam dat příslušného atributu a z toho můžete pomoci (setq text (cdr (assoc **** DATA-ATR))) získat příslušný text
kde **** je číslo kodu příslušného textu
ve vašem případě
(setq text (cdr (assoc 1 DATA-ATR)))
 
dále se ptáte proč nahoře je v seznamu 3 a dole 410
každá entita ve výkresu je vlastně uložená v databázi daného DWG, a z ní se nějakým způsobem zobrazuje na monitoru.
Vy většinou pracujete na monitoru, takže pomoci nějakého příkazu "command" vytvoříte na monitoru něco, a to se uloží do databaze.
Pomoci lsp příkazu, entnext, entmakex, entget.... pracujete přímo s databazi, aniz by to nějak ovlivnovalo monitor, takže jste schopen zjistit daleko víc info o daných prvcích.
např layout je zapsán v seznamu a je tvořen právě nějakým způsobem že ke 3 přiřazuje název
naopak každá entita je tvořená tak, že ke každé 410 je přiřazeny název.
pokud by jste chtěl zjistit kde který údaj je a souvislosti mezi všemi prvky, at atribut a blok, srafy, reaktory atd. doporučuju výkres uložit ve formátu DXF a otevřít v nějakém editoru např notepad.
Sice si trošku pohledáte a hodně počtete, ale je to dost dobrý na to aby jste pochopil samotnou databazi entit.
Počínaje rozvrzenim, hladinama, az po samotne entity, pak i v helpu pod DXF referencni přiručka, nebo tak nejak, jsou samotné kody vypsány.
 
Každopádně, zkuste a kdyby to zase nešlo, dejte vědět, budeme pokračovat.
 
S pozdravem Martin.

Ferdinand
15.12.2008, 14:42
Přiznávám, že když jsem se snažil využít možnosti učení se zde (v sekci Školení/Výuka), tak jsem to neshledal příliš přehledným. Dost těžko se v tom hledá, je to příliš všeobecný, bez konkrétních příkladů. Někdo jako já (tj. neprogramátor) potřebuje metodu "Když napíšete TOHLE tak se stane TOTO a výsledek vypadá TAKTO. Předpokladem je PREDPOKLAD." - kde namísto VELKÝCH PÍSMEN mají být konkrétní řetězce syntaxu. Děkuji Martinovi, že se mne ujal a sželelo se mu nad mou nevědomostí. Navíc mám svou hlavu a když zatvrdne, tak to se mnou nic není...
Proč ale mi to vrací pořád nil, když
(setq RT1 (ssget "_X" (list (cons 0 "INSERT") (cons 2 "RAZ--T1") (cons 410 LAYT1))))
? Zkoušel jsem to ve výkresu, kde blok RAZ--T1 je 17-krát přítomen.
Jakýsi první nástin toho celého procesu viz ->zdeFerdinand2008-12-15 14:44:49

chlebovsky
15.12.2008, 15:26
pokud "_X" máte velké X
pokud se blok opravdu jmenuje "RAZ--T1"  velké písmena
pokus LAYT1 je opravdu přesný název rozvržení včetně mezer....
pokud tam ten blok je, tak není jediný důvod aby to bylo nilové :-)
 
jinak když k tomu LSPéčku přibalíte i to DWG tak to můžu otestovat v reálu, já si tady u sebe hraju jen s daty a né s realitou, třeba tam je nějaký detail co jsem přehlídl. Pošlete to DWG a to LSP (už mám) takže na to kouknu.
 
Pak to i upravím.

Vladimír Michl
15.12.2008, 16:20
Velikost písmen je nepodstatná. Ten Ferdinandův výraz je v pořádku (vyzkoušeno), za předpokladu, že LAYT1 je řetězcová proměnná obsahující název rozvržení - např:
(setq LAYT1 "Rozvržení1")

Ferdinand
17.12.2008, 11:34
Pokud je tomu tak, a nezdržuji zbytečně, je to ->zde
Ve výkresu chci nechat pojmenování rozvržení původní.Ferdinand2008-12-17 11:37:01

chlebovsky
17.12.2008, 22:08
Chtěl jsem na to kouknout, ale nemám asi přístup na iprojekt :-(
Poraďte mi někdo co mám pro to udělat :-)
Dík.

Vladimír Michl
17.12.2008, 22:27
Přihlašovací jméno a heslo účtu pro výměnu souborů CAD Fóra je "cadforum". Viz otazníček:
http://www.cadforum.cz/cadforum/co-je-to-cad-forum.asp#Obsluha

chlebovsky
17.12.2008, 22:48
To jsem zkoušel, ale nic :-(
 
cadforum / cadforum
Přístup do [application/Files] odepřen.Příčina:Nejste členem projektu.

Vladimír Michl
18.12.2008, 08:44
Aha, pane Ferdinand si vytvořil vlastní projekt - pak vás tedy musí přizvat osobně nebo nastavit oprávnění jeho projektu pro veřejný přístup.

chlebovsky
18.12.2008, 10:16
Díky, něco takového jsem předpokládal, takže p. Ferdinande, prosím preosím o přístupové údaje, klidně na martin@vchlebovska.eu díky moc.
 
A ještě poprosím p. Michla když ho tady vidím, sice je to mimo tento okruh otázky, ale jestli by mi mohl poradit jak udělat to, že se hlásím do fora ze 2 počítačů, a vždy se musím přihlašovat, když jsem pouze na jednom, hlásí se automaticky, ale jak přejdu na 2 kompl, v jiné firmě, musím se přihlásit znovu
DOMA a v PRACI - lze to nějak udělat ? Diky moc.

Vladimír Michl
18.12.2008, 15:33
Ochrana účtu při přístupu z jiného počítače je bohužel součástí kódu aplikace fóra. Také bych někdy uvítal zůstat přihlášený z více strojů.

Ferdinand
19.12.2008, 13:43
Aha, no jasně, na to jsem zapomněl - omluva; již napraveno.

chlebovsky
19.12.2008, 14:11
Nevím jestli jsem už mimo kvůli svátků, ale pořád mi to nějak nejde :-) Něco dělám špatně ? a mejl s heslem mi taky nedošel, tak nevím :-)

Ferdinand
04.02.2009, 14:51
Zlehka navážu na téma - potřebuji získat v lispu vlastnosti bloku COLOR a LINETYPE. Jak/kde se to dá přečíst, když data bloku vypadají takhle:
((-1 . <Entity name: 7efe6060>) (0 . "INSERT") (330 . <Entity name: 7ef92cf8>) (5 . "494") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbBlockReference") (2 . "pokus-block#ClosedPolyline_C") (10 0.0 0.0 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))
tj. kód 62(=barva) ani 6(=typ čáry) tam není.

Seiner
04.02.2009, 15:48
Myslím, že nejsou uvedeny kódy, který jsou BYLAYER. Takže zjistit hladinu a z ní barvu a typ čáry.

Ferdinand
05.02.2009, 08:31
...(8 . "0")...
hladina tam je. Ale není jisté, že barva bloku bude vždy Bylayer - právě proto to chci zjistit. Když se podívám do souboru dxf, tam to je uvedeno { (6 . Byblock) a (62 . 222) } :
...
AcDbBlockEnd  0ENDSEC  0SECTION  2ENTITIES  0INSERT  547B3301F100AcDbEntity  80  6ByBlock 62   222100AcDbBlockReference 66     1  2...
Chci se ale dopátrat, jak to v lispu napsat.

Seiner
05.02.2009, 10:26
...tu hladinu vidím taky...
 
To se právě, i když neobratně, pokuším sdělit. V databázi IMHO nejsou kódy, pokud jsou defautní. Co je pro blok default, si nejsem tak jistý - asi to bude tedy BYBLOCK a ne BYLAYER. Obdobně, pokud si udělám výpis na jakoukoliv entitu, třeba úsečku, tak pokud má barvu a typ čáry podle hladiny, tak ty kódy 6 a 62 tam nejsou. Jakmite té úsečce nastavím nějakou jinou barvu a/nebo typ čáry, tak se kódy ve výpisu objeví.
(DXF asi je ukecanější a dává i redundantní údaje)

Martin Bielina
05.02.2009, 11:10
0 = BYBLOCK; 256 = BYLAYER (default) a to platí pro jakoukoliv entitu a group code týkající se barvy což je 62 a u některých entit (kóty) pro jejich dílčí subentity pak 70. S každou další verzí autocadu se ale možnosti stále rozšiřují, takže nejlepší je najít si to v aktuální nápovědě. IMHO default hodnoty autocad zapisuje jako nil a tim šetří místo v databázi, a proto pří nastavení BYLAYER ve výpisu 62 není.

Ferdinand
05.02.2009, 15:08
[QUOTE=Seiner]...V databázi IMHO nejsou kódy, pokud jsou defautní. ...pokud si udělám výpis na jakoukoliv entitu, třeba úsečku, tak pokud má barvu a typ čáry podle hladiny, tak ty kódy 6 a 62 tam nejsou. Jakmite té úsečce nastavím nějakou jinou barvu a/nebo typ čáry, tak se kódy ve výpisu objeví...[/QUOTE]
Je to tak.
- úsečka nakreslená defaultními hodnotami:
((-1 . <Entity name: 7efeb0a0>) (0 . "LINE") (330 . <Entity name: 7efe5cf8>) (5 . "48C") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (62 . 0) (100 . "AcDbLine") (10 50.0 110.0 0.0) (11 260.0 220.0 0.0) (210 0.0 0.0 1.0))
- po změně color=222, linetype="center", ltscale=0.111 :
((-1 . <Entity name: 7efeb0a0>) (0 . "LINE") (330 . <Entity name: 7efe5cf8>) (5 . "48C") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (62 . 222) (6 . "CENTER") (48 . 0.111) (100 . "AcDbLine") (10 50.0 110.0 0.0) (11 260.0 220.0 0.0) (210 0.0 0.0 1.0))
[QUOTE=Seiner]...Co je pro blok default, si nejsem tak jistý - asi to bude tedy BYBLOCK a ne BYLAYER....[/QUOTE]
Závisí na aktuálním nastavení při vytáření bloku (nebo čehokoliv) - já používám color=ByBlock, linetype=ByBlock.
 
[QUOTE=Martin Bielina]...group code týkající se barvy což je 62 a u některých entit (kóty) pro jejich dílčí subentity pak 70. ...[/QUOTE]
Je to jiné u bloku, který obsahuje atributy a u bloku bez atributů? Anebo pokud blok obsahuje obyč. text?Ferdinand2009-02-05 15:18:42

Ferdinand
07.07.2009, 10:47
Po nějaké době opět navážu, nyní mám dotaz na následující:
(setq LAYTL (layoutlist))(setq LAYT1 (nth i LAYTL))(setq RT1 (ssget "_X" (list (cons 0 "INSERT") (cons 2 "RAZ--T1*") (cons 410 LAYT1))))
Poslední řádek vrací nil - a to právě nevím, proč? Blok RAZ--T1 má variantu buď RAZ--T1 anebo RAZ--T1_en anebo RAZ--T1_ru a pouze jeden z nich je vždy vložen do rozvržení.

Martin Bielina
07.07.2009, 11:07
neověřeno, nevyzkoušeno (nemám momentálně na čem), ale zápis zmíněného řádku by měl vypadat spíše takto:
                         
(setq RT1 (ssget "_X" '((-4 . "<AND") (0 . "INSERT") (2 . "RAZ--T1*") (410 . "LAYT1") (-4 . "AND>"))))

Výsledkem pak bude množina všech entit, které splňují všechna uvedená kriteria.

=======
opravil jsem chybu v zápisu. Nesmíte moje příspěvky aplikovat na svůj případ systémem CTRL+C a CTRL+V. Je to jen návod jak na to. "LAYT1" je zase možné upravit dle potřeby a doplnit o znaky *, ? atd.

Původní zápis s LAYT1 (bez uvozovek) by fungoval pokud by se jednalo o načítanou proměnnou. To jen na vysvětlenou, aby byl můj příspěvek co nejkompletnější. Pokud je porovnávaný s podmínkou konkrétní textový řetězec musí být v uvozovkách stejně jako všechny ostatní v podmínce uvedené.Martin Bielina2009-07-15 11:36:42

Ferdinand
09.07.2009, 15:12
Děkuji, mezitím jsem našel tuhle odpověď i v jiném tématu... omlouvám se.

Ferdinand
15.07.2009, 11:07
Pořád to není OK...
...(setq LAYTL (layoutlist))(setq i 0)(while (< i (sslength LAYTL))  (command "_layout" "_S" (nth i LAYTL))  (setq LAYT1 (nth i LAYTL))  (setq RT1 (ssget "_X" '((-4 . "<AND") (0 . "INSERT") (2 . "RAZ--T1*") (410 . LAYT1) (-4 . "AND>")))) ;error: bad SSGET list value  (if (/= RT1 nil)    (progn      (setq E (ssname RT1 0))...    )  )...
)
...
A to i v případě, když to napíšu jako
(setq RT1 (ssget "_X" (list (cons -4 "<AND") (cons 0 "INSERT") (cons 2 "RAZ--T1*") (cons 410 LAYT1) (cons -4 "AND>")))) ;error: bad SSGET list value

Vladimír Michl
15.07.2009, 11:34
Ta druhá konstrukce by měla fungovat - pro jistotu si vypisujte hodnotu LAYT1 - jestli je to opravdu string.

pavelstyl
15.07.2009, 11:42
No nemělo by tam být u toho while místo sslength pouze length ?
 
Pavel Štyl