Zobrazit plnou verzi příspěvku: Vyplnanie titulneho bloku automaticky

martiner33
03.01.2010, 18:20

Mam zhruba 3000 vykresov. Na kazdom potrebujem zmenit verziu revizie, nazov vykresu a este par poloziek v titulnom bloku. Je mozne napisat urcity program ktory mi zmeni tento titulny blok podla urciteho vstupneho suboru? Moja predstava je taka ze mam v tabulkovom editore stlpce, kde kazdy stlpec zodpoveda urcitemu polu v titulnom bloku a kazdy riadok zodpoveda jednemu vykresu. Pretoze praca typu otvorit kazdy vykres a prepisat to manualne sa mi zda zdlhava.Co vsetko potrebujem? Mam AUTOCAD2009 full version.Dik martiner332010-01-03 18:22:00

alfred
03.01.2010, 18:57
nejsnazsi se mi zda napsat si programek v LISPu, ktery zmeni pozadovane veci v jednom vykresu. Pak pouzijte skript s nazvem SCRIPTMAKER.LSP, ktery vytvari se Vas zepta na seznam souboru, nazev prikazu, ktery se ma provest a pak vytvori skript *.SCR, ktery pak z prazdneho souboru spustite. Seznam souboru musi byt v textovem souboru - LISP bohuzel neumi otevrit vice souboru najednou. Ale to je jen drobnost.Dle seznamu se jednotlive soubory otevrou, nacte se LISP, ktery jste si vytvoril, soubor se ulozi a zavre. A pak dalsi... To prave dela ten vytvoreny skript.http://www.cadforum.cz/forum/uploads/20081110_184049_scriptmaker.LSP

alfred
03.01.2010, 19:09
Kouknete jeste sem: http://www.cadforum.cz/forum/forum_posts.asp?TID=7536&KW=scriptmaker

martiner33
04.01.2010, 08:12
Dik za super radu. V LISPe som este nerobil. Bude stacit AutoLISP alebo tu aplikaciu mam spravit vo VisualLISPe? Ako som spominal do peciatky bude treba vlozit par veci, aj obrazok. Otvaram teda nejaky manual a idem studovat ;)

Vladimír Michl
04.01.2010, 08:21
Nebude to úplně triviální (pokud s LISPem začínáte). AutoLISP a VisualLISP je dnes už prakticky totéž.
 
Vedle následné dávkové úpravy atributů rovněž zvažte možnost napojení titleblocku přímo na externí na databází (např. Excel).

alfred
04.01.2010, 08:42
AutoLisp a VisulalLIs je prakticky totez. Spustte prikaz [CMD]VLIDE[/CMD] (_VLIDE) a uvidite.S tim scriptmakerem si to predtim zkuste. Napriklad si cvicne ulozte par prazdnych souboru a jako funkci pouzijte treba nakresleni primky z bodu 0,0 do bodu 1,1.(defun c:kratka_usecka ()(command "_line" "0,0" "1,1" "")(princ))Jinak, pokud v LISPu vubec neumite delat tak preji hodne stesti... Kouknete sem:http://www.cadforum.cz/cadforum/Vyvojove-prostredky-AutoCADu/Pokud potrebujete pouze zamenit texty (treba datum zakazky, apod. ) tak to jsem jednou resil.

martiner33
04.01.2010, 11:48
No tak ten manual Vyvojove prostredky AutoCADu je genialny, citam to od vcera vecera ;)Mojim planom je konkretne zmenit v peciatke par udajov, teoreticky je jedno kolko. Tie udaje by som nacital z externeho suboru.Co som sa dozvedel z mojich studii - ako mam postupovat:1..Vymazat text na urcitych suradniciach - kazda suradnica(X,Y,Z) bude predstavovat jednu polozku v titulnom bloku2. Vymazat obrazok na urcitej suradnici (vsetky budu dane rucne podla polohy obrazkov a textov)3. Vlozit text na definovane suradnice .. kazdy jeden z urcitej casti EXCEL/TXT suboru4. Vlozit obrazok na definovane suradniceCo sa tyka toho scriptmakera. Postupoval som nasledovne:1.nacital som aplikaciu kratka_usecka uvedenu vo vyssom prispevku2. nacital som aplikaciu Scriptmaker, nasledne som ju spustil3. zadal som TXT subor so zoznamom dwg suborov, pricom jednotlive nazvy som dal pod seba .. skusal som aj iba jeden subor4.vybral som subor LSP ktory obsahuje zdrojak kratka_usecka5.zadal smo prikaz kratka_usecka6.ulozil som suobr scr na diskproblem je ze subor ma velkost 0BKde je problem?

martiner33
04.01.2010, 12:03

Problem ze subor *.scr bol prazdny bol ten ze som nemal zadefinovanu kompletnu cestu k dwg suboruVysledok._OPEN"D:\devices\autocad\scriptmakr-test\1.dwg"(setq LispFile (getstring))"D:\devices\autocad\scriptmakr-test\usecka_test.LSP"(load LispFile )KRATKA_USECKA._QSAVE._CLOSEteraz uz len prist na to ako to spustit ;) idem surfovatmartiner332010-01-04 12:09:26

Martin Bielina
04.01.2010, 12:11
Tak to je zcela správná úvaha. Ve scriptu, který Vám Alfred dal k dispozici se o vyhledávání souboru stará funkce (findfile).(findfile filename)"The findfile function makes no assumption
about the file type or extension of filename. If filename does not specify a drive/directory prefix, findfile searches the AutoCAD library path. If a
drive/directory prefix is supplied, findfile
looks only in that directory."To znamená že musíte ve svém seznamu buď přidat celou cestu k souborům DWG nebo (když nejde Mohamed k hoře...) nakopírovat soubory DWG do adresáře, které funkce prohledává sama. Ta druhá možnost je ale spíš pro zasmání, to radši nedějte.

Martin Bielina
04.01.2010, 12:29

A abych Vám trochu zkrátil serfování. Seznam souborů ke zpracování získate snadno a rychle takto:dir d:\PROJEKT\DWG\*.dwg /b /s > c:\seznam_dwg.txt

Pak budete mít první část úkolu hotovou a zbývá jen napsat nebo najít vhodný LSP který udělá ten zbytek.
Martin Bielina2010-01-04 12:30:05

alfred
04.01.2010, 12:53

[QUOTE=martiner33]
.....teraz uz len prist na to ako to spustit ;) idem surfovat[/QUOTE]Prikaz pro spusteni SCR souboru je [CMD]DEMO[/CMD] (_SCRIPT)

alfred
04.01.2010, 13:06

[QUOTE=martiner33]Mojim planom je konkretne zmenit v peciatke par udajov, teoreticky je jedno kolko. Tie udaje by som nacital z externeho suboru.Co som sa dozvedel z mojich studii - ako mam postupovat:1..Vymazat text na urcitych suradniciach - kazda suradnica(X,Y,Z) bude predstavovat jednu polozku v titulnom bloku2. Vymazat obrazok na urcitej suradnici (vsetky budu dane rucne podla polohy obrazkov a textov)3. Vlozit text na definovane suradnice .. kazdy jeden z urcitej casti EXCEL/TXT suboru4. Vlozit obrazok na definovane suradnice
[/QUOTE]Nevim, jak vypada razitko stavajici/nove. V prvnich prizpevcich jsem pochopil, ze chcete menit BLOK (tedy jsem predpokladal ze menite jeho atributy) ted pisete, ze chcete menit texty a obrazky. S tim Vam uz nikdo nepomuze, pokud to nepopisete podrobneji. AD obrazek - neni mozne jen zmenit obrazek - tedy pokud to je externe odkazovany rastr a ne OLE objekt.AD texty - neni mozne zamenit konkretni string jinym stringem? Je nutne  nekde neco smazat a pak nove vytvaret? Jsou vykresy tvorene stejne? Tedy jako ze vsechny maji na 100% stejne umisteni entit v razitku.

martiner33
04.01.2010, 15:15


Takze finalne sa mi podarilo scr pekne spustit ako ste pisali prikazom DEMO. Do vsetkych troch pripravenych suborov mi to nadherne vkreslilo usecku.Aby som este raz upresnil co xcem spravit: Mam cca 3000 vykresov. Tit.blok ostane povedny, zmenia sa v nom len dve textove polia TITLE a DATE, a jedna cast kde je vlozene BMP logo firmy. To xcem zmazat a vlozit tam nove - povodny obrazok je OLE objekt. Predpokladam ze postup bude obdobny ako zamena textov.Uvazujem spravit externy subor. Prvy stlpec TITLE a druhy DATE. Potom predpokladam bude mozne pridat XY stlpcov a riadkov.Jsou vykresy tvorene stejne? Tedy jako ze vsechny maji na 100% stejne umisteni entit v razitku. ANO MAJU VSETKY ROVNAKE UMIESTNENIE.Povodny titulny blok uzamknuty v hladine. Nasiel som ze vsetky sa daju odomknut prikazom layerp (Undoes
the last change or set of changes made to layer settings). Tento prikaz ale funguje len v pripade z hladina bola menena od otvorenia suboru. Pouzit sa da teda neskor na konci na zamknutie hladiny. Existuje prikaz -layer ktory vsak pracuje s aktualnou hladinou. Takze dalsim orieskom je zmenit aktualnu hladinu na hladinu titulneho bloku. Program na zmazanie obrazku, chyba tam este odomknutie hladiny Drawing_title.(defun c:vymaz_ole ()(command "layerp")(setq coordinate '(365.2295 91.875))(command "_erase" coordinate)(initget 1)(princ))martiner332010-01-04 15:20:06

alfred
04.01.2010, 15:24

[QUOTE=martiner33]
Existuje prikaz -layer ktory vsak pracuje s aktualnou hladinou. Takze dalsim orieskom je zmenit aktualnu hladinu na hladinu titulneho bloku.[/QUOTE]Nastaveni nejake hladiny jako aktualni:(setvar "clayer" "nazev_pozadova_aktualni_hladiny")Pro manipulaci s hladinami muzete take pouzit prikaz (command "_-layer" "prislusne prikazy ....... ")

alfred
04.01.2010, 15:31

Pokud by Vam stacilo textove pole najit a nahradit jinym textem, tak muzete pouzit utilitu SRXTEXT2.VLX od XANADUUtilitu nactete:(LOAD "C:\\cesta......\\SRXTEXT2.VLX")a pouzijte prikaz (srxtext "Substring" "hledany text" "novy text" "spravna volba")vyzkousejte si to prikazem: srxtext
alfred2010-01-04 15:31:31

martiner33
05.01.2010, 07:57
Takze podarilo sa mi spravit program ktory odomkne hladinu Drawing_title a zmaze obrazok podla zadanych suradnic. Doriesit musim teraz ako na to iste miesto vlozit novy OLE objekt pomocou prikazov. Prikaz insertobj mi vsak otvori len win okno s moznostami. (defun c:vymaz_ole ()(setvar "clayer" "Drawing_title")(command "_-layer" "Odemkni" "Drawing_title" "")(initget 1)(setq coordinate '(365.2295 91.875))(command "_erase" coordinate "")(princ))Co sa tyka tej utility od Xanadu .. celkom pekna srandicka akurat ze je obmedzena (first 2 pairs are processed). Takze bud mi niekto z vas posle full verziu alebo to budem musiet riesit podobne ako s tym obrazkom. Teda podla suradnic zmazem text a potom ho tam aj vlozim.Idem sa trapit teda dalej. Zatial sa mi LISP fest zapacil, zrejme sa mu zacnem venovat aktivnejsie.

Martin Bielina
05.01.2010, 09:28
  [QUOTE=martiner33]...Co sa tyka tej utility od Xanadu .. celkom pekna srandicka akurat ze je obmedzena (first 2 pairs are processed). Takze bud mi niekto z vas posle full verziu alebo to budem musiet riesit podobne ako s tym obrazkom...[/QUOTE]Dost pochybuji, že Vám kdokoliv z tohoto fóra v tomto smyslu vyhoví. Ne snad proto že by tu byli samí krkouni co se nechtějí s nikým a o nic rozdělit, ale předávat zdarma něco, co je majetkem firmy XANADU je přinejmenším NEETICKÉ i kdyby už neexistoval žádný jiný právní důvod (jako že existuje...) proč by jste to něměl dělat.Můžete se ptát, nějaká odpověď se vždycky najde. Přemýšlejte o tom co děláte. Zkoušejte práci druhých napodobit svými vlastními utilitkami. Dělám totéž a je to myslím jedna z nejlepších cest jak se něco naučit. Zmíněná funkce od XANADU nědělá přeci nic složitějšího než že nahrazuje části textových řetezců jinými řetězci. Stačí udělat je několik kroků:vytvořit seznam řetězců ve výkresechspárovat je s požadacky na nový obsahvyměnit vzájemně jejich obsahK tomu si přidejte nějakou metodu načítání obsahu z externího souboru a jednoduše řečeno máte hotovo. Práci si můžete rozdělit do více LISPů a při troše snahy je jeden po druhém najdete na webu už hotové. Pak to jen celé vhodně spojíte buď pracovním postupem nebo jejich skutečnou kombinací v jednom LSP.

Sedláček
05.01.2010, 10:09
[QUOTE=martiner33]Prikaz insertobj mi vsak otvori len win okno s moznostami. [/QUOTE]




Možná by šlo vytvořit blok (_WBLOCK) s oním OLE obrázkem a do výkresů vkládat ten (_-INSERT)

Sedláček
05.01.2010, 10:18
Pro náhradu textů fungoval tento LISP (byl součástí nějaké prehistorické verze AutoCadu, dnes by to šlo řešit asi elegantněji):
 
(defun C:CHGTEXT ( / p l n e os as ns st s nsl osl sl si test chm olderr)   (setq olderr  *error*             ; Initialize variables         *error* chgterr         chm     0)   (setq p (ssget))                  ; Select objects   (if p (progn                      ; If any objects selected      (while (= 0 (setq osl (strlen (setq os (getstring t "\nOld string: ")))))            (princ "Null input invalid")      )      (setq nsl (strlen (setq ns (getstring t "\nNew string: "))))      (setq l 0 n (sslength p))      (while (< l n)                 ; For each selected object...         (if (= "TEXT"               ; Look for TEXT entity type (group 0)                (cdr (assoc 0 (setq e (entget (ssname p l))))))            (progn               (setq test nil si 1)               (setq s (cdr (setq as (assoc 1 e))))               (while (= osl (setq sl (strlen                             (setq st (substr s si osl)))))                  (if (= st os)                      (progn                        (setq s (strcat (substr s 1 (1- si)) ns                                        (substr s (+ si osl))))                        (setq test "t") ; Found old string                        (setq si (+ si nsl))                      )                      (setq si (1+ si))                  )               )               (if test (progn        ; Substitute new string for old                  (setq e (subst (cons 1 s) as e))                  (entmod e)         ; Modify the TEXT entity                  (setq chm (1+ chm))               ))            )         )         (setq l (1+ l))      )   ))   (princ "Changed ")                ; Print total lines changed   (princ chm)   (princ " text lines.")   (terpri)   (setq *error* olderr)             ; Restore old *error* handler   (princ))
 
 
 
 

alfred
05.01.2010, 10:20

Soubor SRXTEXT.VLX a SRXTEXT2.VLX mam stazeny nekdy od roku 2006. Nepamatuji se, jestli jsem je stahoval z VIP a nebo v te dobe byly ke stazeni free. V zadnem pripade jsem je ale v te dobe neplatil - mozna je to nejaka starsi free verze. Pokud vim, tak fungovaly bez omezeni. Nicmene pokud by slo o to zamenit jeden text za druhy  v celem vykresu a nebylo by nutne se zabyvat s regulernimi vyrazy, tak by snadno slo upravit jeden muj skriptik. Snadno se zedituje a dopise se zamenovany par. Pozor, skript prochazi databazi vykresu - tedy i zmrazene hladiny!http://alfredcadpage.wz.cz/download/replace_unicode_v_textech.zipalfred2010-01-05 10:22:15

alfred
05.01.2010, 10:28

[QUOTE=Sedláček][QUOTE=martiner33]Prikaz insertobj mi vsak otvori len win okno s moznostami. [/QUOTE]




Možná by šlo vytvořit blok (_WBLOCK) s oním OLE obrázkem a do výkresů vkládat ten (_-INSERT)[/QUOTE]A nebo vkladejte obrazek jako rastr - prikazem [CMD]-OBRÁZEK[/CMD] (_-IMAGE)Samozrejme si nastavte promennou FILEDIA na 0 a pak zpet na 1

martiner33
05.01.2010, 11:40
srxtext funguje pekne priamo v prikazovom riadku Autocadu ale v lispe ani za svet. v autocade si program pyta nasledovne:Search - Regular expression/Exact string/<Substring>:Enter the searched text: maleEnter the replace text: femaleSearch Layer/<All>:Search Selected/<All>:Number of searched entities: 258male-->femaleReplace/Dont ask - yes/Exit/<Next>: dontNumber of found/replaced entities: 1/1takze ako uzivatel zadavam 6x vstup pre program preto by aj v LISPe malo fungovat nasledovne:(command "srxtext" "Substring" "male" "female" "All" "All" "Dont")vysledok je nasledujuciPříkaz: REPLACE_TEXTNeznámý příkaz "SRXTEXT".  Stiskněte F1 pro nápovědu.Neznámý příkaz "SUBSTRING".  Stiskněte F1 pro nápovědu.Neznámý příkaz "MALE".  Stiskněte F1 pro nápovědu.Neznámý příkaz "FEMALE".  Stiskněte F1 pro nápovědu.Neznámý příkaz "ALL".  Stiskněte F1 pro nápovědu.Neznámý příkaz "ALL".  Stiskněte F1 pro nápovědu.Neznámý příkaz "DONT".  Stiskněte F1 pro nápovědu.Avsak ak tam dam (srxtext "Substring" "male" "female" "All" "All" "Dont")tak mi vypise ze tam mam prilis mnoho argumentov. ak som ich tam dal 4 ako ste pisali tak program nespravi nic(srxtext "Substring" "male" "female" "spravna volba")Troska som sa zamotal ale nechapem preco to nefunguje.Co sa tyka programu SRXTEXTCSV. Tam zadava uzivatel tiez viacero vstupov. Pri druhom vyskoci okno load file, da sa tato volba nahradit?Myslim tym(srxtextcsv "Substring" "cesta k suboru csv/pripadne nieco ako prikaz load" "...." "...." )

alfred
05.01.2010, 12:02
Nevim, pouzil jsem to pred par lety v jednom lispu presne podobnem pripade - soucasne s SCRIPTMAKER.LSP.Mozna mam opravdu nejakou historickou verzi...Jinak ja v lispu pouzivam SRXTEXT2.VLX - krome toho take jeste mam stazene SRXTEXT.VLX, ale to pro pouziti v LISPu nelze pouzit.Oba soubory jsou z roku 2006.Pokud by mi nekdo z XANADU v diskusi potvrdil, ze to sem muzu dat, tak Vam klidne tu historickou verzi poslu...Nicmene zpet k Vasemu problemu - chapu to tak, ze nepotrebujete nejaky text smazat a jinde tvorit novy (jak jste puvodne planoval), ale postaci zamena retezce? Pokud pri tom nepotrebujete regulerni vyrazy, tak Vam v nejhorsim postaci nejake jine zamenovani (viz vyse nebo na webu nebo vlastni tvorba)....

martiner33
05.01.2010, 13:19
Neviem co si pod pojmom retazec predstavujete, jaj mam na mysli text ktory oznacuje napriklad nazov vykresu - teda retazec. Tento retazec xcem nahradit novym retazcom. Chcem to riesit pomocou suradnic, teda na konkretnych suradniciach sa zmaze obsah a nahradi sa to novym retazcom. Mam spraveny csv subor kde v prvom stlpci je TITLE vykresu a v druhom DATE, pricom sa daju dalsie doplnat. Mojou snahou je teda spravit LISP skript ktory mi nahradi retazec na konkretnych suradniciach. Co sa tyka obrazka na to mam spraveny zvlast LISP script.Tot vsjo.Ako ste to mysleli ze SRXTEXT.VLX nefunguje v LISPe?Kde momentalne stagnujem? Momentalne sa mi nedari rozbehat srxtext.vlx. Nefunguje mi ked ho zakomponujem to svojho LSP skriptu, pricom v AutoCADe samotnom bezi v pohode. Vid moj komentar vyssie.

alfred
05.01.2010, 13:42
Retezec - mam na mysli "textovy retezec", string, proste text.Nahrazeni textu lze dvema zpusoby:-editaci jedne entity a pouhou zamenou obsahovaneho textu (retezce). To dela SRXTEXT.VLX . Podobnych utilit najdete hromadu. Specialita SRXTEXT.VLX je ze umi hledat regulerni vyrazy-smazanim jedne entity a vytvorenim nove entity SRXTEXT.VLX nefunguje v lispe - tedy alespon ta moje prastara verze. Proste pokud napisu :(srxtext "Substring" "xxx" "yyy" "ALL") tak to nefunguje, musim pouzit (nacist) jiny soubor, ktery se u me jmenuje SRXTEXT2.VLX. Kde jsem ho ale stahnul uz nevim.

martiner33
05.01.2010, 14:17
Nuz pan Google nenasiel ani mastny mak, mam na mysli SRXTEXT2.VLX. Ten druhy system sa mi pozdava viac nakolko umiestnenie konkretneho retazca je v kazdom vykrese rovnake. V kazdom vykrese su dva retazce. Ak by som prepisoval v kazdom vykrese napriklad datum, tak to bude jednoduche nakolko datum bude vsade rovnaky. Ja sa pokusam vsak do kazdeho suboru dat iny TITLE. Poradie v zozname vykresov bude rovnake ako poradie novych udajov v CSV/XLS subore. Teda ani by som nemusel pouzit ziaden SRXTEXT.VLX/SRXTEXT2.VLX.(defun c:vymaz_text ()(setvar "clayer" "Drawing_title")(command "_-layer" "Odemkni" "Drawing_title" "")(initget 1)(setq coordinate1 '(348.7742 39.9479))(command "_erase" coordinate1 "")(princ))Program odomkne hladinu a na suradniciach 348.7742 39.9479 zmaze objekt. Pridat by som xcel prikaz ktory pri kazdom vykrese zapise udaje z jedneho riadku CSV/XLS subora. Riadok zodpoveda jednemu vykresu, stlpec jednej polozke.Idem teda surfovat ako drak, ak niekoho z vas napadne nejaka featurina budem rad.Zatial vrele diiiiki ...

Vladimír Michl
05.01.2010, 16:15
Starší verze srxText byly free kompletně, několik novějších verzí (s řadou oprav a doplnění) je také free, kromě speciálního režimu CSV (Excel), ten je třeba nejprve aktivovat (např. pomocí bezplatného generátoru kódů na vip.xanadu.cz).
Starší verze srxText si mj. neporadí s novějšími typy entity (podobně jako výše uvedená Alfredova utilita) a obsahovaly několik drobnějších chyb, takže je nedoporučujeme už používat.

alfred
05.01.2010, 18:41
Tak v poradku. Pokud by martiner33 potreboval starsi verzi utility poslat tak muji poslu treba e-mailem. Pokud tedy budete mit zajem, ozvete se mi pres soukromou zpravu.

Sedláček
07.01.2010, 15:16



 
Měl jsem chvilku na experimentování tak posílám pro inspiraci.
Pro vygenerování scriptu jsem použil Exel, kde v buňkách B-I jsou jednotlivé příkazy a jejich parametry. V buňce A jsou pak tyto příkazy sloučeny (pomocí "&").
 
Sloupec A je pak v Notepadu překopírován (přes schránku) do vykr.scr
 
V novějších verzích Autocdu to nemusí být funkční - nevím zda byla zachována posloupnost parametrů jednotlivých příkazů.
 
Místo "Enter" jsou použity "Mezery" a tak je zápis dost nepřehledný.
 
(script by měl ve všech výkresech vymazat kružnici a text "ddddd" nahradit dle sloupce I ve vykres_11.xls)
 Sedláček2010-01-07 15:49:03

Sedláček
07.01.2010, 15:48
uploads/20100107_154657_script_ukazka.zip

Zasílám ještě jednou - v předchozím příspěvku jsem měl vzorové výkresy už po aplikování scriptu.