Zobrazit plnou verzi příspěvku: uložení výkresu s datumem_automatické

Marlowwe
20.05.2009, 09:56
Dobrý den, chtěl bych se zeptat, jestli nejde nějak nastavit, aby se výkres automaticky uložil :  Název výkresu_datum (např.: Půrodys1.NP_090520   -rok/měsíc/den) a aby se uložil jako nový soubor při kliknutí na uložení (i během práce). Hledal jsem to v nastavení, ale nenašel jsem to.Doufma že jsem to popsal srozumitelněDíky za rady

Seiner
20.05.2009, 10:37
Že by to nějak uměl AutoCAD, si neuvědomuji. Teoreticky by šlo udělat makro, které by si vzalo název souboru a doplnilo ho datem. Něco jako:
(strcat (getvar "DWGPREFIX")(SUBSTR (GETVAR "dwgname") 1(-(strlen(getvar "dwgname"))4))"_"(rtos(getvar "cdate")2 0)".dwg")
Problém ale vidím v tom, jak zjistit, jestli původní název už datum obsahuje, nebo ne a podle toho rozhodovat, jestli ho doplnit, nebo přepsat.
Logičtější by asi bylo, kdyby se jméno souboru bralo třeba z razítka. Ale to už záleží na vašich podmínkách.

Marlowwe
20.05.2009, 11:21
Myslel jsem to tak, že se např.:1. udělá se startovací výkres s Názvem- Půdorys1.NP2. uloží se a vznikne- Půdorys1.NP_0905203. uloží se znovu a vznikne- Půdorys1.NP_090520_2 (3, 4.....) pokud se to uloží v ten samý den a pokud se uloží až druhý den- datum se přepíše na- Půdorys1.NP_090521Tak nějak to udělat, aby se to dalo udělat (rozhodnout), zda uložit jako nový nebo jen přepsat, popřípadě ještě uvážit automatické ukládání (z důvodu ztrát dat, pak by tam bylo vytvořeno x-desítek souborů)PS: kam se pak to makro zkopíruje.Díky

johny
20.05.2009, 11:43




Zkuste toto... 3. bod to nedělá, ani to nedělejte přes Uložit jako... protože nebude fungovat to testování. Asi by to šlo dodělat, kdyby výchozí byl třeba pro dnešek JmenoSouboru_20090520.1.dwg (aby to mělo pevný počet cifer,tečka aby to celé bylo číslo, čili max 9 denních verzí).Jinak jestli neumíte pracovat s programy, tak kód uložete přes Notepad např jako SaveAs_Date.lsp (lsp nutné) někam... (já dávam do AutoCad/Suppotr/Moje....). Tento soubor načtěte (Nástroje/Autolisp/Načíst aplikaci...) - načte se teď a také uložte do schránky (Nástroje/Autolisp/Načíst aplikaci/Obsah) - načte se ve všech dalších výkresech.Program spustíte napsáním SAD (jako SaveAsDate) do příkazového řádku, ale můžete si naň udělat v CUI ikonu nebo zkratku... jak chcete...Btw. Za "_saveas" je uvedeno "2000" to je verze dwg souboru... pokud používáte 2004, pak to přepiště, když 2007, pak stačí jen "". Možná by šlo aby to udělalo automaticky dle toho co máte uloženo v Možnostech jako výchozí... nevím v jaké proměnné to je, snad mě někdo doplní...(defun C:SAD ( / Path LastDate)  (setvar "FILEDIA" 0)  (if (numberp (setq LastDate (read (SUBSTR (GETVAR "dwgname") (-(strlen(getvar "dwgname"))11) 8))))    (if (eq LastDate (read (rtos(getvar "cdate")2 0)))      (command "_save" "" "_y") ;today ; automatic overwritten      (command "_saveas" "2000" (strcat (getvar "DWGPREFIX")   ;is date, not today, ask for overwrite                    (SUBSTR (GETVAR "dwgname") 1 (-(strlen(getvar "dwgname"))13))                    "_"                    (rtos(getvar "cdate")2 0)                    ".dwg")))    (command "_saveas" "2000" (strcat (getvar "DWGPREFIX") ;not date, ask for overwrite                    (SUBSTR (GETVAR "dwgname") 1 (-(strlen(getvar "dwgname"))4))                    "_"                    (rtos(getvar "cdate")2 0)                    ".dwg")))  (setvar "FILEDIA" 1)  (princ)) 
johny2009-05-20 12:07:07

Seiner
20.05.2009, 12:10
Tak nějak jsem to i myslel. Ještě jde o to, jestli na tom dělá jeden člověk, nebo víc člověků :-). Pak by asi bylo dobré také testovat, zda v úložišti již existuje takový soubor (FINDFILE ...).
   Co se týká načítání definované funkce, preferuji atomatické načítání  (AUTOLOAD) v souboru .mnl. Pak se načítá jen to, co se používá.

johny
20.05.2009, 12:52
Ten (command "SaveAs...") je otevřenej ... přepsání otestuje a nechá uživatele rozhodnout. S více uživateli nemám zkušenosti, ale nebude si to SaveAs... taky nějak hlídat?

Seiner
20.05.2009, 13:20
Ano - máte pravdu, pokud rezignujete na ten požadavek číslování souborů v jednom dni. IMHO mi ale přijde čistší řešení přes nějaký systém správy dokumnetů.  Ale to je OT.

Marlowwe
20.05.2009, 13:46
jj tak nějak jsem to myslel, PS: bude na tom pracovat jen jeden člověkDíky...vyzkouším a kdyžtak se ještě zeptám...Díky

Marlowwe
20.05.2009, 16:06
jj je to dobrý...ale když dám uložit tak se mi soubor z Půdorys_20090520.1  přejmenuje na Půdorys_2_20090520, nešlo by aby se to přejmenovalo na Půdorys_20090520.2?? (Protože pak se to seřazuje podle pořadí 1,2,3.. a ne podle datumu a pořadí) a když pak dám opět SAD, tak se mě to zeptá jestli chci přepsat---dám N (jako ne) a nefunguje to. Díky za radu

cestár
20.05.2009, 17:03
... a neobsahuje to všetko Vault ?

Vladimír Michl
20.05.2009, 22:43
Ano, obsahuje. Navíc řeší i situace, kde je výkres odkazován jako Xref či jiná externí reference, stará se o komentování revizí, odstraňování nepotřebných starších verzí, atd.
 
Přejmenovávání verzí souborů je jen pro hodně zjednodušené jednouživatelské scénáře použití.

Seiner
21.05.2009, 08:03
Přestože v Autolispu jde udělat kde-co, obávám se, že tohle bude dost tvrdý oříšek. Funkce Findfile totiž neumožňuje zástupné znaky a já momentálně nevím, jak zjistit, jestli v úložišti je už soubor s dnešním datem a libovolným indexem.
V navrženém kódu je navíc chybička - havaruje, pokud ektuální jméno souboru je kratší, jak 11 znaků nebo má právě 11 znaků. Je třeba ošetřit.
třeba:
(defun C:SAD ( / Path ldate);  (setvar "FILEDIA" 0)  (if(<=(strlen(getvar "dwgname"))11)    (command "_saveas" "2000" (strcat (getvar "DWGPREFIX") (SUBSTR (GETVAR "dwgname") 1 (-(strlen(getvar "dwgname"))4))"_"(rtos(getvar "cdate")2 0)".dwg"))  (if (numberp (setq ldate (read (SUBSTR (GETVAR "dwgname") (-(strlen(getvar "dwgname"))11) 8))))    (if (eq ldate (read (rtos(getvar "cdate")2 0)))      (command "_save" "" "_y") ;today ; automatic overwritten      (command "_saveas" "2000" (strcat (getvar "DWGPREFIX")   ;is date, not today, ask for overwrite                  (SUBSTR (GETVAR "dwgname") 1 (-(strlen(getvar "dwgname"))13))"_"(rtos(getvar "cdate")2 0)".dwg")))    (command "_saveas" "2000" (strcat (getvar "DWGPREFIX") ;not date, ask for overwrite                    (SUBSTR (GETVAR "dwgname") 1 (-(strlen(getvar "dwgname"))4))"_"(rtos(getvar "cdate")2 0)".dwg"))));  (setvar "FILEDIA" 1)  (princ)) 
Přepínání FILEDIA je zbytečné.
To, že při odmítnutí přepsání se nic nezapíše, není chyba, ale tak je to napsané - zkuste se zorientovat v kódu.
 
PS. Na tomto místě bych připomenul, že to byl můj návrh, použít nějaký EDM :-)) (Parafráze na Cestu do Liptákova)

johny
21.05.2009, 10:22

Tak jsem to ještě trochu upravil... pridal ty denní verze. Funguje to tak, že to hledá znaky "_20"... když je najde a zároven za "_" je 8 čísel, pak to vyhodnotí jako datum. Ten pokud je dnešní pak, za k datumu připočte 0.1  a uloží. Pokud není dnešní, pak přidá/nahradí za dnešní datum. Pokud si nakonec názvu (za datum) něco připíšete (třeba "pomocny"), pak to nezachová a uloží novou denní verzi bez tohoto.Pokud budoucí soubor už existuje, pak se zeptá na přepis- když dáte ano, pak přepíše, když ne tak NIC, a musíte si udělat co chcete sám (typicky, když aktuálně nepracujete v poslední denní verzi - děláte v 20000521.2, ale už existuje .3, pak vám nenabídne .4, ale zeptá se na přepsání .3, a příp. skončí.)Ps. Máte max 10 denních verzí, snad je to dost :)(defun C:SAD ( / Path LastDate DatePos)  (if (and (setq DatePos (vl-string-search "_20" (GETVAR "dwgname")))       (numberp (setq LastDate (read (SUBSTR (GETVAR "dwgname") (+ DatePos 2) 8)))))    (if (eq LastDate (read (rtos(getvar "cdate")2 0)))      (if (= (rtos (- (atof (SUBSTR (GETVAR "dwgname") (+ DatePos 2) 10))              (atoi (SUBSTR (GETVAR "dwgname") (+ DatePos 2) 10))) 2 1)        "0.9")    (princ "\nDosáhl jsi již 10. denní verze, program neumožňuje uložení další.")        (command "_saveas" "2000" (strcat (getvar "DWGPREFIX")   ;is date, adds new day's version (+0.1)                    (SUBSTR (GETVAR "dwgname") 1 DatePos)                    "_"                    (rtos (+ (atof (SUBSTR (GETVAR "dwgname") (+ DatePos 2) 10)) 0.1) 2 1)                    ".dwg")))      (command "_saveas" "2000" (strcat (getvar "DWGPREFIX")   ;is date, not today, ask for overwrite                    (SUBSTR (GETVAR "dwgname") 1 DatePos)                    "_"                    (rtos(getvar "cdate")2 0)                    ".dwg")))    (command "_saveas" "2000" (strcat (getvar "DWGPREFIX") ;not date, ask for overwrite                    (SUBSTR (GETVAR "dwgname") 1 (-(strlen(getvar "dwgname"))4))                    "_"                    (rtos(getvar "cdate")2 0)                    ".dwg")))  (princ))  PS. Moc jsem to netestoval, to zkuste sám... :) johny2009-05-21 10:23:55

Seiner
21.05.2009, 10:58
Ta finta s hledáním _20 není špatná. Akorát si uživatel musí nýt vědom, že tento řetězec nesmí použít jinde v názvu.
   Další omezení je v tom, že předpokládáte, že se pracuje vždy s poslední verzí. Havárie nehrozí (saveas upozorní na přepsání).

Seiner
21.05.2009, 12:38
no, pokud by se někomu ještě chtělo v tom pokračovat, tak seznam výkresů stejného jména se stejným datem v názvu by se dal získat třeba:
 
(vl-directory-files(vl-filename-directory (strcat(getvar "dwgprefix")(getvar "dwgname"))) (strcat(SUBSTR (GETVAR "dwgname") 1 (+(vl-string-search (rtos(getvar "cdate")2 0) (GETVAR "dwgname"))8))"*.dwg"))

Seiner
21.05.2009, 15:57
uploads/20090521_155638_SAD.zip


Tak kahle by to snad mohlo hrát požadovanou písničku :-)

johny
21.05.2009, 16:53

Už to trošku dostává na robustnosti... (což nebyl až tak můj záměr :) Dalším cyklem, ikdyž asi jednodušším, by šlo ošetřit aby to fungovalo i kdyby v názvu bylo "_20" vícekrát...Jinak nejspíš nedopatřením při kopírování vznikla na 4. řádku od konce chybka, spíš mi to připomíná html než lisp, díky které nefunguje to základní... přidání data souboru bez data.johny2009-05-22 08:48:44