Zobrazit plnou verzi příspěvku: Načtení XRECORDU z jiného výkresu

chlebovsky
20.06.2008, 08:21
Zdravím.
 
Opět se na Vás všechny obracím s prosbičkou. Zase jsem narazil a nevím jak dál :-)
 
Na disku mám uložený jeden soubor DWG. V něm mám vytvořené spousty xrecordů. A mám je nějakým způsobem pojmenovány.... a v textové položce pak popis, např. *****MATERIAL*****01*****ŠTĚRK*****
takových tam mám spousty. V tom DWG je to krásně čitelné i když ho jen tak otevřu v jakémkoliv textovém editoru
 
A teď k dotazu.
 
Mohu se nějak programově v otevřeném souboru, dostat na tento externí uložený soubor a načíst všechny potřebné xrecordy ??? Vím že lisp neumí pracovat s více soubory, takže tuším jaká bude odpověď, ale napadlo mě jestli to přeci nějak nejde obejít.
 
Zatím to řeším tak že to klasicky otevřu pomoci (open "r") a načítám data po data a testuju zda to začíná *****MATERIAL***** a pak načtu text.... jenže to funguje jenom někdy, pokud se tam vyskytují určitě znakové kody tak se to prostě chová jakoby byl soubor ukončen, což je logické, je to kompilát a může se tam vyskytovat cokoliv.
 
Pak mne napadla ještě jedna varianta. Spustit nějaký externí soubor, který by to dokázal vyčíst, a uložit do nějakého texťáku, a ten už načtu...
 
Nebo ten soubor převést programově do dxf, z toho to načíst, a pak to dxf smazat.
 
Prosím nesetkal jste se s tím už někdo ?
 
Předem moc děkuji za pomoc.
 
Využití mám k tomu, že v jedná obsáhlé nadstavbě si uživatel může vytvořit spoustu vlasních materiálů, a ty aby nemusel pracně jinde vytvářet znovu, tak jsem chtěl prostě načíst z toho prvního dwg. Napadlo mě to udělat i exportem, že nejprve otevřu ten první, exportnu to, pak otevřu ten druhý a načtu.... ale nechci tímto projektanta obtěžovat.... když to ale jinak nepůjde. Co se dá dělat.

Vladimír Michl
20.06.2008, 09:09
Přístup (i z LISPu) do datových struktur jiných DWG možný je, ale není to tak jednoduché. Nepomohlo by vám připojit ty DWG jako Xref nebo mít ty definice v samostatném DWG?
Číst obsah jakéhokoliv DWG souboru pomocí (open "r") rozhodně možné není.

chlebovsky
20.06.2008, 12:20
To s tím načítáním obsahu pomoci (open "r") s tím naprosto souhlasím, je to velice špatný postup....
 
Ty definice mám právě vždycky uložené v každém DWG. Řeknu příklad, v jednom DWG řešim třebas železniční trať na Jeseníku, a tam zemina má naprosto jinou teplotní odolnost, a jiné moduly pružnosti. Proto to mám uložené v tomto DWG.
 
Pak řeším třebas jinou lokalitu, a taky mám jiné materiály.
 
Ale pak řeším třebas další trať z druhé strany jeseníků, a tam bych chtěl právě načíst ty materiály z toho prvního.
 
3lo by to tak jak jsem psal, že otevřu ten první, exportuju to do nějakého tyt, a pak otevřu ten třetí a načtu, ale chci uživateli toto ušetřit, je to kolikrát 20MB soubor a né každý má skvělou mašinu :-)
 
Ten Xref by to mohl částečně řešit. To mne nenapadlo, prostě ho vložit, načíst z něj data a pak zase odpojit, ale je to něco jako zase to otvírání... ale už by to nebylo na uživateli. Jenže, dokáže Fref přenášet data která jsou uložená v namedobjdict - pod xrecordama ??? A jak se na ně dostat.
 
A k té první variantě jak jste psal, že přístup možný existuje... je možno se někde k tomu dočíst více ???
 
Díky moc.
Zdravím, Martin.
 
Tady posílám odkaz na soubor DWG s daty :
www.vchlebovska.eu/martin/railcad320.zip
 
A data jsou např:
(namedobjdict)(RCAD)(RC_PR)(RC_PR_MA)(RC_PR_MA_1) a z tama všechny data od ***START*** do ***KONEC***
 
a právě nevím jak to dostat.

chlebovsky
20.06.2008, 16:00
Na jednom anglickým foru jsem něco našel ale :
 
(vl-load-com)(setq dwg-txt "celacesta a nazev souboru včetně .dwg")(setq dwg-obj (vla-open (vla-get-documents (vlax-get-acad-object)) dwg-txt :vlax-true))(setq dwg-dbs (vla-get-Database dwg-obj))(setq dwg-dic (vla-get-Dictionaries dwg-dbs))
(setq newdic (vla-Add dwg-dic "RCAD"))(setq d1 (vl-catch-all-apply (function vla-item) (list newdic "RC_PR")))(setq d2 (vl-catch-all-apply (function vla-item) (list d1 "RC_PR_MA")))(setq d3 (vl-catch-all-apply (function vla-item) (list d2 "RC_PR_MA_1")))
(setq dwg-Xre (vla-getXRecordData d3 'd4 'd5))(setq dwg-sez (mapcar (function cons)(vlax-safearray->list d4)(mapcar (function vlax-variant-value) (vlax-safearray->list d5))))
(close dwg-obj)
 
krásně funguje. Jen mě štve že to DWG otevírá, ale budiž, proč ale píšu.
 
Když vezmu strom Xrecordu
 
RCAD  ->  RC_PR  ->  RC_PR_MA  -> ( RC_PR_MA_1, RC_PR_MA_2, RC_PR_MA_3.........)
 
Tak dokážu nějak testovat že RCAD existuje když ano, tak pokračuj
Taktéž RC_PR (stejný jasný) a RC_PR_MA (taky stejný, jasný) ale u toho posledního XRECORDU navíc potřebuju zjistit všechny jakoby PODSLOŽKY
a navíc nemusí být 1,2,3,4,5 ale klidně 1,5,10,11... a počet je libovolný
 
Takže dotaz :
 
Jak můžu testovat že XRECORD EXISTUJE třeba ten RC_PR
když to krokuju nahlásí toto #<%catch-all-apply-error%>
ale jak to programově řešit s čím porovnat.
V podstatě mi stačí otestovat úplně tu poslední RC_PR_MA a pak jak zjistím všechny ta RC_PR_MA_1.......až třeba 100
 
Dík moc.
 
Martin