Zobrazit plnou verzi příspěvku: BATCH

splonk
25.01.2012, 16:43
Dobry den pane Michl,
mohl byste se mi, prosim podivat na tento LISPik. Jedna se o Batch ktery po oznaceni "rootove" slozky otevira vsechny *.dwg soubory v ni. Pri otevirani provede prikazy ktere ma nadefinovane v Apploads.
Mam problem v tom ze mi nefunguje na Win7x64 :(. Na XPx86 SP3 to bezi bezproblemu.
 
Jedna se o nasledujici:
 
[CODE]
;; AUTOR:;; http://thatcadguy.blogspot.com/2009/10/batch-processing-autocad-drawings.html;;;;;;;;
(defun c:batch (/ dir files total ct docs doc)(defun listAllFiles (path ext /)(apply 'append(cons(mapcar(function (lambda(x) (strcat path "\\" x)))(vl-directory-files path ext 1))(mapcar(function (lambda(x) (listAllFiles (strcat path "\\" x) ext)))(cddr (vl-directory-files path nil -1)) ; to exclude "." and ".."))))(if (and(setq dir (getfiled "Select a directory to process..." "Start here" "" 33))(setq dir (vl-filename-directory dir)))(if (setq files (listAllFiles dir "*.dwg"))(progn(vl-load-com)(setq total (itoa (length files))ct 0docs (vla-get-documents (vlax-get-acad-object)))(foreach file files(setq doc (vla-open docs file)ct (1+ ct))(prompt (strcat "\r" (itoa ct) " of " total " drawings processed."))(command "_.delay" "1000")(vla-close doc :vlax-false))(vlax-release-object doc)(vlax-release-object docs))(prompt (strcat "\nNo files of that type found in " dir " !")))(prompt "\nNo path specified!"))(princ))
;;Add the .lsp file you're going to use to process the drawings to the startup suite (command: APPLOAD or Tools>Load Application). This .lsp file should end with (command "qsave") to save the drawing. DO NOT have (command "close") anywhere in the file, as this will cause an access violation and crash AutoCAD, because AutoCAD sucks.
[/CODE]
 
 
Predem dekuji
JASponza
 

Vladimír Michl
25.01.2012, 17:06


Na první pohled tam nic systémově závislého nevidím. Máte v obou případech nastavené stejně SDI a hlavně adresáře a seznam pro načítání sady APLČTI?

splonk
25.01.2012, 17:47
SDI mam na obou 0 (nula) Adresare mam stejne.Problem je na zacatku, zkusim popsat:

v APPLOAD nastavim lisy ktere chci aby se vykonali
do PRAZDNEHO vykresu naloaduju vyse zmineny lisp
zadam prikaz BATCH
vyskoci okenko (Windowsacke) kde browsuju na danou slozku :

slozku vyberu, a kliknu na Otevrit
Okenko se zmeni na:

Pak kliknu na Ulozit, a nic se nedeje :(, okenko tam porad vysi a nejde s tim nic delat...
Pritom, na XP se proces normalne spusti a toto prazdne DWGcko zacne postupne "otevirat" vsechny DWG soubory v one slozce.
Myslim si tedy, ze problem bude nekde v one smycce pri vybirani slozek... Ja tomu zase tak moc nerozumim :). Dekuji :)

PS. Omluva za drobny dodatecny edit tohoto prispevku...

Vladimír Michl
25.01.2012, 22:39


Aha, ten (getfiled) je nějaký divný, zkuste tam: [CODE](setq dir (getfiled "Select a directory to process..." "Start here" "dwg" 8))[/CODE]

Seiner
26.01.2012, 07:40
Jak se na to tak dívám, jedná se zřejmě o nedorozumnění. Dialog sice říká "Vyber složku pro začátek", ale ve skutečnosti chce vybrat jeden soubor dwg ze složky a z toho si pak určí cestu do složky. Asi je to tím, že autor nevěděl, jak se dotázat přímo na složku. (Já to nevím momentálně taky).
 
BTW. Je to sice excelentní ukázka programování ve vLispu a jsem rád, že už vím, že to jde. Ale stejně zůstanu asi u generátoru dávky (http://www2.chrudim.cz/seiner/programy/Davka.zip) - přijde mi, že mi dává víc možností.

pavelstyl
26.01.2012, 08:01
Já pro nalistování složky používám následující kód:
[CODE](defun get_folder (d txt / Dir Item Path l) (if (> (strlen d) 4)  (progn   (setq l (substr d (strlen d) 1))   (if (or (= l "\\") (= l "/"))    (setq d (substr d 2))   )  ) ) (cond  ((setq Dir (vlax-invoke (vlax-get-or-create-object "Shell.Application") 'browseforfolder 0 txt 1 d))   (cond    ((not (vl-catch-all-error-p (vl-catch-all-apply 'vlax-invoke-method (list Dir 'Items))))     (setq Item (vlax-invoke-method (vlax-invoke-method Dir 'Items) 'Item))     (setq Path (vla-get-path Item))    )   );end cond  ) );end cond (if Dir (vlax-release-object Dir)) (if Path (setq Path (vl-string-translate "/" "\\" Path))) (if Path (setq DwgPath Path)) (if path (if (= (substr path (strlen path) 1) "\\") (setq path (substr path 1 (- (strlen path) 1))))) path)[/CODE]
 
Volám to [CODE] (setq adresar (get_folder "" "Zadej adresar")) [/CODE]
Ten první parametr měl být pokus o zadání výchozí cesty, ale nějak to nefunguje a tak tam jsou ty prázdné úvozovky :-)
 
Třeba to někomu pomůže.
 
Pavel Štyl

Seiner
26.01.2012, 08:11
Ještě: domnívám se, pane Michle, že flag 8 není úplně to pravé. Pokud by byla z nějakého důvodu nastavena cesta do pracovního adresáře, přiřadí se do proměnné dir pouze jméno vybraného souboru bez cesty a následující příkaz neurčí správně složku.
Flag 33 mi taky není úplně jasný - vysvětluji si to, že to chce název nového souboru, ale neupozorňuje na přepsání.Seiner2012-01-26 08:15:03

alfred
26.01.2012, 08:16

To je dobré. Já používám pro výběd adresáře funkci "dos_getdir" z knihovny DOSLIBhttp://www.en.emea.mcneel.com/doslib.htmJeště odtud používám dialog pro možnost výběru více souborů najednou - nemáte nějaký podobný příklad pro tuto příležitost? Bohužel GETFILED umožní výběr pouze jednoho souboru.Předpokládám, že se by se pouze v řádku(setq Dir (vlax-invoke (vlax-get-or-create-object "Shell.Application") 'browseforfolder 0 "zadej adresar" 1 ""))browseforfolder zamění za nějaké jiné kouzelné slovo 


alfred2012-01-26 08:23:11

Seiner
26.01.2012, 10:15
A ještě poznámečka. Otestoval jsem původní kód na Mechnicalu 2012 na stanici s Win7-64 a na stanici XP-32. Na obou pracuje bez problémů. Zakopanej pes bude někde jinde...

splonk
26.01.2012, 15:10
Dobry den damy a panove,
Jsem rad, kdyz na CADForu vidim jak se vyvyji diskuze. To je urcite dobre. A o nejakem "svrbeni" nemuze byt ani rec :-).
Dekuji za vsechny zaslane podnety, priklady,.... Bouzel, moje znalosti programovani jsou omezene... Jsou omezene na ono "Ctrl+C, Ctrl+V" + "trochu zdraveho rozumu" s tim, ze obzvlast ta druha komponenta je cim dal hure dohledatelna. A hlavne, casova slozka je ten nejbolestnejsi clanek v celem procesu... Sice tusim o cem pisete ale urcite to neni tak, ze bich ted rovnou z mista nahradil cas puvodniho kodu napr. tim, co zaslal pan PavelStyl :-(. Kazdopadne dekuju / odivuju / a taktrochu zavidim :-).
 Ale abych se vratil na zacatek. Vyzkousel jsem radu pana Michla, funguje to, jenom musim vybrat nejkae dwg v danem souboru - to dwg tam ale v realu nemusim mit (pravda muzu ho tam umele vytvorit...). Jinak to funguje OK.
 Pan Seiner me ale, svym poslednim prispevkem,  navedl na myslenku to zkusit jeste jednou. A zakopanej pes je, zda se,v me "blbosti"... V onom druhem dialogovem okenku (vyz vyse 2nd. PrintScreen) staci kdyz do kolonky "Nazev souboru" napisu cokoliv a dam otevrit, pak to bezi bez problemu :-). Puvodne (a i na XP x86) mstcilo odkliknout s onim "Start here.*"... zrejmne drobny rozdil v UI dvou OS. A to mi (prozatim) staci :-)!!!
Tim nerikam, ze bi mi vadilo, kdyby nekdo vymenil cast puvodniho kodu za neco, co funguje lip a vyvesil to tady na CADForu ;-).
 
Kazdopadne, dekuji vsem za pomoc, moc!!!!!!
 
PS. LISP uveden na zacatku prosim pouzivat "na vlastni" nebezpeci. Zaprve, kazdy BATCH je tak trochu "ohubu" a zadruhe, kdyz spustim tento LISP v nejakem vykresu, akce probehne, pak uz zadny LISP do toho vykresu nemuzu nacist :-(. Proto ho vzdicky spoustim v onom "Drawing 1" :-)
 
Zdravim
JASponza