Vytisknout stránku | Zavřít okno

BATCH

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=14369
Datum vytištění: 11.kvě.2026 v 20:35


Téma: BATCH
Odeslal: splonk
Předmět: BATCH
Datum odeslání: 25.led.2012 v 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:
 

;; AUTOR:
;; http://thatcadguy.blogspot.com/2009/10/batch-processing-autocad-drawings.html" rel="nofollow - 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 0
docs (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.
 
 
Predem dekuji
JASponza
 


-------------
JASponza

ACA (AutoCAD) 21, 24
RVT 21, 24

Win 10, 11 x64



Odpovědi:
Odeslal: Vladimír Michl
Datum odeslání: 25.led.2012 v 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?

-------------
Vladimír Michl (moderátor)
ARKANCE CZ - https://arkance.world - arkance.world
(podpora viz helpdesk.arkance-systems.cz)


Odeslal: splonk
Datum odeslání: 25.led.2012 v 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...


-------------
JASponza

ACA (AutoCAD) 21, 24
RVT 21, 24

Win 10, 11 x64


Odeslal: Vladimír Michl
Datum odeslání: 25.led.2012 v 22:39
Aha, ten (getfiled) je nějaký divný, zkuste tam:
 
(setq dir (getfiled "Select a directory to process..." "Start here" "dwg" 8))


-------------
Vladimír Michl (moderátor)
ARKANCE CZ - https://arkance.world - arkance.world
(podpora viz helpdesk.arkance-systems.cz)


Odeslal: Seiner
Datum odeslání: 26.led.2012 v 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" rel="nofollow - http://www2.chrudim.cz/seiner/programy/Davka.zip ) - přijde mi, že mi dává víc možností.


-------------
Vítězslav Seiner

Chrudim


Odeslal: pavelstyl
Datum odeslání: 26.led.2012 v 08:01
Já pro nalistování složky používám následující kód:
(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
)
 
Volám to
(setq adresar (get_folder "" "Zadej adresar")) 
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


Odeslal: Seiner
Datum odeslání: 26.led.2012 v 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í.

-------------
Vítězslav Seiner

Chrudim


Odeslal: alfred
Datum odeslání: 26.led.2012 v 08:16
To je dobré. ClapClap
Já používám pro výběd adresáře funkci "dos_getdir" z knihovny DOSLIB
http://www.en.emea.mcneel.com/doslib.htm" rel="nofollow - http://www.en.emea.mcneel.com/doslib.htm

Ješ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 Embarrassed




Odeslal: Seiner
Datum odeslání: 26.led.2012 v 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...

-------------
Vítězslav Seiner

Chrudim


Odeslal: splonk
Datum odeslání: 26.led.2012 v 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


-------------
JASponza

ACA (AutoCAD) 21, 24
RVT 21, 24

Win 10, 11 x64



Vytisknout stránku | Zavřít okno