Zobrazit plnou verzi příspěvku: pořadí příkazů v makrech

Petr75
29.10.2012, 11:04
Mám makro:^C^C_setvar;USERI2;$M=$(+,1,$(getvar,USERI1))^M_setvar;USERI3;$M=$(+,2,$(getvar,USERI1))^M_-insert blok1.dwg \1 1 0 $M=$(getvar,USERI1)^M$M=$(getvar,USERI2)^M$M=$(getvar,USERI3)^M_-insert blok2.dwg @0,-2000 1 1 0 $M=$(getvar,USERI1)^M$M=$(getvar,USERI2)^M$M=$(getvar,USERI3)^M_setvar;USERI1;$M=$(+,3,$(getvar,USERI1))Podle mně by se měla nastavit proměnnáUSERI2 na USERI1+1 a USERI3 na USERI1+2,vložit blok1 na souřadnice zadané při vstupu, s měřítkem 1 a natočením 0.blok má 3 atributy a chci mu postupně předat čísla z USERI1, USERI2 a USERI3Toto se opakuje pro další bloky (zde uvádím jen 2, ale budu jich vkládat více).Na konec se zvýší proměnná USERI1 o 3.Z nějakého mně neznámého důvodu se změna proměnných USERI2 a USERI3 projeví až po skončení makra. Takže 2. a 3. atribut se nastaví s číslem o 3 menší. Při prvním použití makra, nejsou USERI2 a USERI3 definovaná, takže se použije 0.V čem je chyba?Sice můžu napsat makro takhle:^C^C_-insert blok1.dwg \1 1 0 $M=$(getvar,USERI1)^M$M=$(+,1,$(getvar,USERI1))^M$M=$(+,2,$(getvar,USERI1))^M_-insert blok2.dwg @0,-2000 1 1 0 $M=$(getvar,USERI1)^M$M=$(+,1,$(getvar,USERI1))^M$M=$(+,2,$(getvar,USERI1))^M_setvar;USERI1;$M=$(+,3,$(getvar,USERI1))Ale to budu muset stejnou hodnotu víckrát počítat.

Sedláček
29.10.2012, 14:09
Zde by měly pomoci "uvozovky". Nejsem tak zběhlý, abych je bez ladění doplnil přesně, ale zkuste je doplnit viz citace. 
 
 
[QUOTE=Petr75]Mám makro:^C^C_setvar;USERI2;$M=$(+,1,$(getvar,USERI1))^M_setvar;USERI3;$M=$(+,2,$(getvar,USERI1))^M_-insert blok1.dwg \1 1 0 "$M=$(getvar,USERI1)"^M"$M=$(getvar,USERI2)"^M"$M=$(getvar,USERI3)"^M_-insert blok2.dwg @0,-2000 1 1 0 "$M=$(getvar,USERI1)"^M"$M=$(getvar,USERI2)"^M"$M=$(getvar,USERI3)"^M_setvar;USERI1;$M=$(+,3,$(getvar,USERI1))[/QUOTE]

Sedláček
29.10.2012, 14:11
Ještě pro doplnění - pro ladění DIESELu nastavte proměnné:
menuecho 8macrotrace 1

Petr75
29.10.2012, 15:39
S přidanými uvozovkami to nefunguje vůbec.


Sedláček
29.10.2012, 16:34
Minule jsem se s tšmí uvozovkami nějak moc rozjel. Asi by měly stačit:
 
 
[QUOTE=Petr75]Mám makro:^C^C_setvar;USERI2;"$M=$(+,1,$(getvar,USERI1))^M_setvar;USERI3;$M=$(+,2,$(getvar,USERI1))"^M_-insert blok1.dwg \1 1 0 $M=$(getvar,USERI1)^M$M=$(getvar,USERI2)^M$M=$(getvar,USERI3)^M_-insert blok2.dwg @0,-2000 1 1 0 $M=$(getvar,USERI1)^M$M=$(getvar,USERI2)^M$M=$(getvar,USERI3)^M_setvar;USERI1;$M=$(+,3,$(getvar,USERI1))

Petr75
30.10.2012, 07:36
Děkuji za snahu, ale takhle to také nefunguje.

Sedláček
30.10.2012, 09:12
Tak ještě jednou, tentokrát jsem to i vyzkoušel a mělo by to fungovat. Pokud ne, tak si zapněte ty výše zmiňované proměnné (menuecho=8, macrotrace=1) a případně vystavte co vám bude Autocad hlásit.
 
 
[QUOTE=Petr75]Mám makro:
^C^C_setvar;USERI2;$M=$(+,1,$(getvar,USERI1))^M_setvar;USERI3;$M=$(+,2,$(getvar,USERI1))^M_-insert blok1.dwg \1 1 0 """$M=$(getvar,USERI1)^M$M=$(getvar,USERI2)^M$M=$(getvar,USERI3)"""^M_-insert blok2.dwg @0,-200 1 1 0 """$M=$(getvar,USERI1)^M$M=$(getvar,USERI2)^M$M=$(getvar,USERI3)"""^M_setvar;USERI1;$M=$(+,3,$(getvar,USERI1))
 
 
[/QUOTE]

Petr75
30.10.2012, 13:18
Tentokrát to již funguje. Přidal jsem ještě další 2 bloky, ale asi mám makro již moc dlouhé.Udělal jsem ještě zkrácení:- _setvar;USERIx jsem zkrátil na USERx- ^M jsem nahradil znakem ;Ale pořád to je dlouhé. Dočetl jsem se, že makro má omezení na 256 znaků, ale délka výrazu $M=... se počítá až vyhodnoceného výraz.Škoda, že v nápovědě AutoCADu jsou minimální informace u makrech a výrazech DIESEL a na internetu něco najít, je docela obtížné.

Sedláček
30.10.2012, 16:53
Jako ukázka využití uvozovek v DIESELu se mi líbí následující makro. Po zadání 4 bodů se mezi mimi vykreslí čtyřúhelník. Před spuštěním makra je třeba zapnout _SNAP (KROK). Před použitím výraz v nějakém textovém editoru (NOTEPADu) převeďte do jednoho řádku. 
 
^Cid;\$m=id;\$m=id;\$m=id;\$m=_line;$(getvar,lastpoint);"$(getvar,lastpoint);;
_line;$(getvar,lastpoint);""$(getvar,lastpoint);;_line;$(getvar,lastpoint);""""$(getvar,lastpoint);;
_line;"""""""$(getvar,lastpoint);"""""""$(getvar,lastpoint);;"""""""^CSedláček2012-10-30 17:06:29

Petr75
30.10.2012, 22:50
Zajímavé. Ke konci jsem se v těch uvozovkách začal ztrácet.


Sedláček
01.11.2012, 15:52
[QUOTE=Petr75]Tentokrát to již funguje. Přidal jsem ještě další 2 bloky, ale asi mám makro již moc dlouhé.Udělal jsem ještě zkrácení:- _setvar;USERIx jsem zkrátil na USERx- ^M jsem nahradil znakem ;Ale pořád to je dlouhé. Dočetl jsem se, že makro má omezení na 256 znaků, ale délka výrazu $M=... se počítá až vyhodnoceného výraz.Škoda, že v nápovědě AutoCADu jsou minimální informace u makrech a výrazech DIESEL a na internetu něco najít, je docela obtížné.[/QUOTE]
 
Když jsem před lety experimentoval s DIESELem tak jsem omezení na délku znaků řešil tak, že jsem část kódu uložil pomocí _SETENV (ukládá se do REGISTRY Windows) při tvorbě makra  a pak jej v  makru načetl pomocí _GETENV. Fungovalo to ale pouze v Autocadu LT - plná verze neznala příkazy _SETENV a _GETENV (bylo to v A2002LT - jak to je v nových verzích nevím). Opět bylo nutno experimentovat s uvozovkama, aby načítání proběhlo až v době, kdy už bude část makra zpracována (po několika průchodech interpretem DIESELu).
 

Vladimír Michl
01.11.2012, 16:14
Příkazy [CMD]SETENV[/CMD] a [CMD]GETENV[/CMD] jsou stále jen LT-příkazy. Plná verze má k tomuto účelu funkce (setenv) a (getenv). Navíc tam podobná DIESELová supermakra nejsou potřebná, protože se podstatně jednodušeji vytvoří v LISPu nebo VBA nebo v makrorekorderu.

Sedláček
02.11.2012, 13:35
Pokud máte po přidání dalších dvou bloků makro již moc dlouhé, je možné váš algoritmus jinak.
Např. vložit nejprve bloky s nadefinovanými (jedinečnými) texty atributů (aaa bbb ccc) a ty pak zaměnit za požadovanou hodnotu pomocí příkazu _-ATTEDIT:
 
^C^C_-insert blok1.dwg \1 1 0 aaa;bbb;ccc;_-insert blok2.dwg @0,-200 1 1 0 aaa;bbb;ccc;_setvar;USERI2;$M=$(+,1,$(getvar,USERI1))^M_setvar;USERI3;$M=$(+,2,$(getvar,USERI1)) _-attedit n n;;;aaa;aaa;"""$M=$(getvar,USERI1)""";_-attedit n n;;;bbb;bbb;"""$M=$(getvar,USERI2)""";_-attedit n n;;;ccc;ccc;"""$M=$(getvar,USERI3)""";_setvar;USERI1;$M=$(+,3,$(getvar,USERI1)) (graphscr)
 
Po odladění makra ještě doporučuji doplnit na začátek "hvězdičku" * pro opakování makra:
*^C^C_-insert ....

Petr75
05.11.2012, 10:13
Nejdelší makro mám zatím se 4 bloky a 3x4 atribut. Hodnoty jsem počítal u každého atributu. Makro je sice delší, ale pro vyhodnocení je "kratší" a funguje. Vkládám to sem na více řádcích kvůli lepšímu přehledu, ale jinak to je jeden řádek.^C^C_-insert Sch_4K.dwg \1 1 0 $M=$(getvar,USERI1);$M=$(+,1,$(getvar,USERI1));$M=$(+,2,$(getvar,USERI1));$M=$(+,3,$(getvar,USERI1));_-insert Nar_4K.dwg @0,-2500 1 1 0 $M=$(getvar,USERI1);$M=$(+,1,$(getvar,USERI1));$M=$(+,2,$(getvar,USERI1));$M=$(+,3,$(getvar,USERI1));_-insert Pud_4K.dwg @0,-1900 1 1 0 $M=$(getvar,USERI1);$M=$(+,1,$(getvar,USERI1));$M=$(+,2,$(getvar,USERI1));$M=$(+,3,$(getvar,USERI1));_-insert Ram_4K.dwg @0,-1900 1 1 0 _setvar;USERI1;$M=$(+,4,$(getvar,USERI1))Ještě bych se chtěl zeptat, jak to funguje s vícenásobnými uvozovkami.