ラベル MaxScript の投稿を表示しています。 すべての投稿を表示
ラベル MaxScript の投稿を表示しています。 すべての投稿を表示

2013年1月17日木曜日

DotNet-ListViewを使用した画像一覧サンプルコード

DotNet-ListViewを使用した画像一覧サンプルコード
適当なフォルダ内にある画像から画像リストを生成します。
画像間の隙間調整をするコードと、画像のドラッグ&ドロップ並び替えコードのサンプルです。
※実行する場合は画像格納先パスを編集して下さい。

ドラッグ&ドロップ後のソーティングは無理やりやってます。
1番目のカラムの値を書き換えてソーティングしてます。


2012年12月5日水曜日

起動時のスクリプト実行プロセス

3dsMaxをファイル指定無しで起動した場合、
スクリプトファイルがどのようなプロセスで評価・実行されているかを検証。

基本的にMaxScriptヘルプの「スタートアップ スクリプト」項目を検証した内容。
※基本的にプロジェクトフォルダは検索しない<C:\Users\*\Documents\3dsMax>



(1) load Macroscript

 <C:\Program Files\Autodesk\3ds Max 2011\UI\MacroScripts\>
 <[カスタマイズ]>[システム パスの設定]>[システム]>[Additional Macros]>指定フォルダ

 ・全サブディレクトリのファイルがロードされる(コンパイルは無し)
 ・フォルダ名を半角丸カッコ()でくくると無視される

(2) stdscripts

 <C:\Program Files\Autodesk\3ds Max 2011\stdplugs\stdscripts>
 
 ・[*.ms]が実行されグローバル変数として格納される
 ・全サブディレクトリのファイルも実行される
 ・フォルダ名を半角丸カッコ()でくくると無視される
 ・[startup.ms]というファイルは無視される

(3) サードパーティプラグインパス

 <[カスタマイズ]>[システム パスの設定]>[サードパーティプラグイン]>追加パス

 ・全サブディレクトリのファイルも実行される
 ・フォルダ名を半角丸カッコ()でくくると無視される
 ・[startup.ms]というファイルは無視される

(4) 3dsMax GUI構築進捗

 ・3ds Max シーンは作成されいない
 ・ビューポートは作成されていない
 ・シーン オブジェクトは作成できない
 ・UI 関連の作業は何もできない
 ・上記の操作関数を定義できるが、呼び出しはできない

(5) Macroscript評価

 ・キーボード/ツールバー/メニュー/クアッドメニューにアサインされたマクロは、この時点でコンパイルされる。

 ※この時点で3ds Max は基本シーンとユーザ インタフェースを作成します。
 ※この時点でコンパイルされないマクロは、初回実行時にコンパイルされていると思われる。

(6)スタートアップスクリプト

 <システムスクリプトフォルダ><\startup>
 <[カスタマイズ]>[システム パスの設定]>[システム]>[Additional Startup Scripts]>指定フォルダ

 ・全サブディレクトリのファイルも実行される
 ・フォルダ名を半角丸カッコ()でくくると無視される
  
 ※スタートアップ実行するかどうかは、[カスタマイズ]>[基本設定]>[MaxScript]>[スタートアップ]設定に依存 
 ※[Additional Startup Scripts]指定フォルダ内の<\startup>は実行されない

2012年12月3日月曜日

基点位置を変更する(最大/最小)

 バウンディングボックスの座標を元に基点位置を変更する(3dsMax標準と同じ?)

2012年11月2日金曜日

詳細レベル(LOD)を操作する

 詳細レベル(LOD)を操作する方法。
 直接スクリプトで値を変更出来ないので、この方法を使用する
 ※メッセージ番号は「sendMessage listbox」といった具合で調べればなんとなくわかる。

2012年10月18日木曜日

INIファイル用関数で扱える文字数制限について

概要

MaxScript標準で用意されているINIファイルへのアクセス関数において、
書き込んだ文字列の取得制限について

結論

下記コードで検証したところ、8192byte以上は追加出来ても文字列として取得できなかった。(max2012x64調べ)

関連情報

getINISetting ではファイル名だけを指定するとセクション名が配列で、セクション名まで指定するとキー名が配列で取得可能。
この配列取得においても、一度に取得できる要素数は 395 が上限のよう。
※setINISetting による追加、セクション名とキー名を直接指定した値の取得は問題無く行える。

パス文字記述方法

パス文字記述方法について

2011年12月9日金曜日

独自メニューバーを使ってウィンドウサイズ縮小機能を実装する

ウィンドウを必要としないツールや、ボタンが数個のスクリプトだと
ほとんど実装しないメニューバー。


以前記事にしたロールアウトの開閉を使ったウィンドウサイズの変更
それのメニューバーバージョンといったものをメモしておきます。

  • メニューバー操作でウィンドウサイズを縮小できる
  • ウィンドウ縮小状態でツールの機能を実行できる
  • 一般的なメニューバーの機能を実装



結果1)コンパクトモードをクリックすると、
ウィンドウサイズがメニューバーだけの高さになります。

結果2)メニューバーからロールアウトの機能を実行できる。
結果3)一般的メニューバーの機能実装完了。

ちなみにヘルプファイルはCHMファイルを実行するようにしていますが、
SpeedHelpPad を使うと凄くラクに作成できます。

2011年12月7日水曜日

メニューバーに各種フォルダを開くメニュー項目を作成する

3dsMaxで作業を行っている際、アクセス頻度の高いフォルダがあります。
  • 現在のシーンファイルが保存されているフォルダ
  • オートバックアップフォルダ
  • スクリプト格納フォルダ(scripts)
  • スクリプト格納フォルダ(startup)
  • スクリプト格納フォルダ(usermacros)

もっとも頻度が高いのはシーンファイル保存フォルダでしょうか?
シーンファイルを履歴から開いたり、ショートカット実行で開いたりした場合、
そのファイルが存在しているフォルダを開かない場合があるからです。

また、他の人のPCにスクリプトを配布した場合、
配布先PCでデバッグが必要になる事が結構あります。
そういった場合、これらのフォルダに素早くアクセス出来ると非常に楽です。

考えた末、3dsMaxのメニューバーにフォルダを開く機能を実装しようということに。


ハイライトしている部分は、 それぞれのメニュー項目に対して
項目選択時に実行するマクロスクリプトを指定しています。

例えば、シーン保存フォルダを開くマクロスクリプトであれば、次のような簡単なものです。

つまり、事前にマクロスクリプトが配布先で有効になっている必要があります。
なので、一緒にマクロスクリプトも配布して本スクリプトを実行するような、
インストーラーを用意するなどの手段が必要です。

※Menuまわりは結構曖昧なコードになっています。
  なのでコメントがアバウト気味です (^^;

2011年12月6日火曜日

3dsMax起動時のスプラッシュウィンドウ画像を変更する

3dsMax起動時に表示される画像(スプラッシュ画面)は下記の画像を使用しています。
max2010の場合)C:\Program Files\Autodesk\3ds Max 2010\splash.bmp

画像ファイルを直接表示しているようなので、
このファイルを置き換えれば別の画像が表示出来るのでは?
そう思って試してみたら簡単に出来たので、ランダムで変更するツールにしてみました。

  • スクリプトがランダムで使用する画像を格納するフォルダを作成しておく
  • ランダムで表示する画像を用意する
  • スタートアップスクリプトとして作成したスクリプトを実行する


実際には、1回目の起動時に画像を置き換え、
次の起動時に置き換え後の画像が表示されています。

2011年12月1日木曜日

ロールアウトフロータの高さをロールアウト開閉に連動させる

ウィンドウを持つタイプのツールを作成する場合、
出来るだけウィンドウサイズをコンパクトにしたいと考えています。

基本はウィンドウは表示したままを想定した上で、
ビューポートを隠す領域を狭めたいと思うからです。

そういう場合に基本機能としてよく実装する機能が、
ロールアウトの開閉状態に合わせて、ロールアウトフロータの高さも拡大縮小させるという機能です。

そうすることで、あまり使わないロールアウトパネルは閉じておくことで、
ウィンドウの高さを縮小させる事が出来ます。
実行すると、ロールアウトの開閉状態に応じて、 ロールアウトフロータの高さが動的に変化します。

オブジェクトの名前取得ツール

MaxScriptを作成する時、よく使用するのがオブジェクト名です。

実験をおこなったり、特定オブジェクト名をコードに使用する場合、
素早くコードに適した名前を取得したいなと感じるわけです。

簡単ながら効果が非常に高いツールとして、
選択オブジェクトの名前を編集した状態で、クリップボードにコピーするというものを作成しています。
  結果的には次のような感じに。(実行後、エディタに[Ctrl+V]した状態)


 後付けで[Shift]キーが押されている場合の挙動を追加しましたが、
 実際のところ忘れている機能となっていました。。。

 ちなみに私はツールバーにボタンとして配置しています。

2011年11月25日金曜日

実行時間の計測

処理時間の削減を行いたい時など、
作成した処理にどの程度時間がかかっているか?を調べたい時などに。

いわゆるタイムスタンプを使用する一連の処理をまとめてスクリプト化しただけですが、
時々使う気がするのでアップ。

myStopWatch.ms をMaxScriptフォルダのStartupフォルダに格納しておくと、
3dsMax起動時にタイムスタンプを扱う関数が生成されます。
タイムスタンプを計測したい場合、下記のようにします。
実行結果は下記のように出力されます。
※このツールをインストールしていないPCに
上記関数を埋め込んだままスクリプトを配布しないよう注意して下さい。

2011年11月24日木曜日

ウィンドウ状態の保存と復元

ウィンドウ(ロールアウト・ロールアウトフロータ)を使用するツールを作成する時、
ウィンドウの状態を保存・復元するというのをよく実装します。

例えば下記のようなものを扱います
  • ウィンドウ位置
  • ロールアウトの開閉状態
  • チェックボックスのチェック状態
以上のような情報をウィンドウがクローズされたタイミングで、
設定ファイルとして保存する。

そして、次回起動時に設定ファイルの情報をもとに
前回起動時の状態を復元します。


この時、標準で読み書きが提供されているINIファイル関数を私はよく使用します。

 ウィンドウがクローズされたタイミングで情報を保存する事が多いので、 ほとんどロールアウトが閉じられた時に実行しています。
ロールアウトのmovedイベントで一時的にウィンドウ位置を変数に格納していますが、
ロールアウトを使用した場合、createDialog後にウィンドウ位置を
取得する方法がわからなかったからです(^^; )

ロールアウトフロータを使用する場合は、フロータのプロパティから
直接その時のウィンドウ位置が取得できます。


外部ファイルに何か情報を保存する際、
直接テキスト出力したり、XMLを使用する方法もありますが、
手軽なこの方法を使用する事が多いです。