2014年8月7日木曜日

Maxscript Struct 構造体2 ランチャー

前回グダグダな感じになったので目的をシンプルにして
構造体使ってランチャー作ってみましょう。

まず、アプリケーションを管理する構造体を作ります。
----------------------
struct app (
    name,
    file,
    option,
   
    fn setValue n f o = (
        name = n
        file = f
        option = o
    ),
    fn startApp = (
        ShellLaunch file option
    ),
    fn openDir = (
        ShellLaunch (getFilenamePath file) ""
    )
)

a = app()
a.setValue ("Calc")(@"C:\Windows\System32\calc.exe")("") --電卓を登録
a.startApp() --電卓起動
a.openDir() --電卓のインストールフォルダを開く

------------------------------
次にアプリ登録と複数管理する構造体を書き足す。
------------------------------
--単体アプリ構造体
struct app (
    name,
    file,
    option,
   
    fn setValue n f o = (
        name = n
        file = f
        option = o
    ),
    fn startApp = (
        ShellLaunch file option
    ),
    fn openDir = (
        ShellLaunch (getFilenamePath file) ""
    )
)

--複数アプリ用構造体
struct apps (
    a =#(),
   
    fn setApps = (
        a[1] = app()
        a[1].setValue("3ds Max 2014 JP")(@"C:\Program Files\Autodesk\3ds Max 2014\3dsmax.exe")("/Language=JPN")
       
        a[2] = app()
        a[2].setValue("3ds Max 2014 EN")(@"C:\Program Files\Autodesk\3ds Max 2014\3dsmax.exe")("/Language=ENU")
       
        a[3] = app()
        a[3].setValue("Calc")(@"C:\Windows\System32\calc.exe")("")
       
        a[4] = app()
        a[4].setValue("BB Monitor")(@"C:\Program Files (x86)\Autodesk\Backburner\monitor.exe")("")
    ),
    fn getAppList = (
        n =#()
        for i = 1 to a.count do (append n a[i].name)
        return n
    ),
    fn startAllapp = (
        for i = 1 to a.count do a[i].startApp()
    )
)

apl = apps()
apl.setApps() --アプリ登録

print (apl.getAppList()) --登録されているアプリ表示

apl.a[1].openDir() -- Max2014のexeファイルがあるフォルダを開く

apl.a[1].startApp() --Max2014 JP起動
apl.a[2].startApp() --Max2014 EN起動
apl.a[3].startApp() --電卓起動
apl.a[4].startApp() --モニター起動

apl.startAllapp() --登録されているアプリすべて起動
------------------------------
これで仕組みは完成。UIを実装します。
------------------------------
--単体アプリ構造体
struct app (
    name,
    file,
    option,
   
    fn setValue n f o = (
        name = n
        file = f
        option = o
    ),
    fn startApp = (
        ShellLaunch file option
    ),
    fn openDir = (
        ShellLaunch (getFilenamePath file) ""
    )
)

--複数アプリ管理用構造体
struct apps (
    a =#(),
   
    fn setApps = (
        a[1] = app()
        a[1].setValue("3ds Max 2014 JP")(@"C:\Program Files\Autodesk\3ds Max 2014\3dsmax.exe")("/Language=JPN")
       
        a[2] = app()
        a[2].setValue("3ds Max 2014 EN")(@"C:\Program Files\Autodesk\3ds Max 2014\3dsmax.exe")("/Language=ENU")
       
        a[3] = app()
        a[3].setValue("Calc")(@"C:\Windows\System32\calc.exe")("")
       
        a[4] = app()
        a[4].setValue("BB Monitor")(@"C:\Program Files (x86)\Autodesk\Backburner\monitor.exe")("")
    ),
    fn getAppList = (
        n =#()
        for i = 1 to a.count do (append n a[i].name)
        return n
    ),
    fn startAllapp = (
        for i = 1 to a.count do a[i].startApp()
    )
)

-- UI
try (DestroyDialog r_launcher) catch()

rollout r_launcher "Launcher" (
    local apl = apps()

    dropdownlist ddl_apps "App"
    button b_allapps "All"
    button b_openDir "OpenDir"

    on r_launcher open do (
        apl.setApps()
        ddl_apps.items = apl.getAppList()
    )
    on ddl_apps selected i do apl.a[i].startApp()
    on b_allapps pressed do apl.startAllapp()
    on b_openDir pressed do apl.a[ddl_apps.selection].openDir()
)

createDialog r_launcher
------------------------------
ボタン2つ多分意味ないですけど例文という事で・・・。
fn setApps =()の所は以下のように記述しても多分行けます。こっちの方が何を渡してるか分かりやすいかもですね。

fn setApps = (
        a[1] = app name:"3ds Max 2014 JP" file:@"C:\Program Files\Autodesk\3ds Max 2014\3dsmax.exe" option:"/Language=JPN"
        a[2] = app name:"3ds Max 2014 EN" file:@"C:\Program Files\Autodesk\3ds Max 2014\3dsmax.exe" option:"/Language=ENU"
        a[3] = app name:"Calc" file:@"C:\Windows\System32\calc.exe" option:""
        a[4] = app name:"BB Monitor" file:@"C:\Program Files (x86)\Autodesk\Backburner\monitor.exe" option:""
       --アプリじゃないですが特定フォルダを登録してみたり
        a[5] = app name:"autoback" file:@"C:\Users\yamagishi\Documents\3dsMax\autoback" option:""
        a[6] = app name:"project" file:@"C:\project" option:""
        a[7] = app name:"2bit-Blog" file:@"http://yamagishi-2bit.blogspot.jp/" option:""
    )
------------------------------
構造体のプロパティ調べたいときは
getPropNames <構造体>
例文:getPropNames app
などで

また、ScriptEditorで変数名などを入力する際にCTL+ENTERで候補が表示されます。

ちなみにShellLaunchはwindowsでのダブルクリックをシミュレートしているようです。

追記:見やすいように関数の戻り値にreturnを使用していますが、Maxscriptリファレンスにはreturn使うと処理が遅くなるような事が記載されています。

fn test1a v = (if v == true do return 1; 0)
fn test1b v = (if v == true then 1 else 0)

test1a true  -- 15890 ミリ秒
test1a false  -- 78 ミリ秒
test1b true  -- 47 ミリ秒
test1b false  -- 62 ミリ秒

処理速度を気にする場合はreturnを使用しない方がいいかもしれません。具体的にはreturnの文字を省略するだけです。

 fn getAppList = (
        n =#()
        for i = 1 to a.count do (append n a[i].name)
        return n
    )



fn getAppList = (
        n =#()
        for i = 1 to a.count do (append n a[i].name)
        n
    )

いや・・・でも見づらい・・・。個人的にはどうせスクリプトですし、最近のPC早いですし、よほど重たい処理をさせない限りはあまり気にしなくてもいい気もしますが・・・。

0 件のコメント:

コメントを投稿