モチベーション
MATLABでfigureを保存するのって、地味に面倒じゃないですか?
毎回saveas
コマンドを打つのも面倒だし、figureのウィンドウから「ファイル」→「名前をつけて保存」→「フォルダ・ファイル名指定」といった具合に毎回設定し直すのも面倒くさい。
そこで、GUIで簡単にfigureを保存できるツールを作ってみました!
ソースコード
GitHubで公開しています!もしよければ使ってみてください!
どんなものを作ったのか?
使い方
基本的にGUI上の操作で完結できます。
- コマンドウィンドウで
figCapture
と入力してEnter - GUIが起動するので、UI上で以下のパラメータを設定
- ファイル形式 (
png
、eps
、pdf
など) - 保存場所 (既定値は現在のディレクトリ)
- ファイル名 (既定値は現在の日時から自動生成)
- ファイル形式 (
- Captureボタンをクリックしてfigureを保存
※ファイル名について
デフォルトのファイル名には、GUIを起動した日時が含まれるので、基本的にファイル名が重複する心配はありません。ファイル名が重複した場合は上書きしないよう番号を付加して保存する仕様になっています。
※保存対象のfigureについて
保存するfigureは内部でgcf
で取得しています。ですので、最後にプロットしたfigureもしくは、最後にカーソルで選択したfigureになります。
実装の中身の話
MATLABでクラス定義を行う際、値の管理はどうしていますか?
普通はクラスのプロパティに保存しますよね?
でも、このGUIツールでは少し違う方法を使っています。
設定はconfig.json
ファイルに保存!
なぜそんなことをするのか?
それは、毎回GUIを起動するたびに設定し直すのが面倒だからです。
config.json
に保存しておけば、MATLABを再起動しても前回の設定がそのまま使えます!(私は数値解析結果を保存する用のフォルダを作成して、自動的にそこに保存されるようにしています)
ざっくりの実装内容
以下のような仕組みで実現しています。
- クラスのプロパティはDependent属性で定義
- プロパティに値を設定する場合は、setメソッドで
config.json
にデータを保存 - プロパティの値を取得する場合は、getメソッドで
config.json
の内容を読み取り
これで、ユーザーはconfig.json
を意識せずに、普通にプロパティにアクセスできます。
「毎回設定しなくてもいいように、設定をファイルに保存する仕組みを作った」ということですね!
コマンド実行にも対応!
GUIを起動して使ってもらうのが便利ですが、スクリプト実行中にfigureを保存したい場合もあるかと思います。
保存場所や拡張子、ファイル名の指定など、GUIでできることはコマンドでも実行できます。
具体的には、figCapture
クラスの静的メソッドを呼び出すことで、GUIを起動せずにfigureを保存できます。
ファイルの保存場所を設定
setPath
メソッドを使えば、保存先のフォルダを指定できます。パスを指定しない場合は、GUIが起動してフォルダを選択できます。
>> figCapture.setPath('/mypath') % 保存したいパス名をchar型またはstring型で指定
>> figCapture.setPath; % 引数がない場合は保存場所を設定するGUIが起動
保存する拡張子を設定
setExtension
メソッドで保存するファイルの拡張子を設定できます。複数の拡張子を指定することも可能です。拡張子を指定しない場合は拡張子を設定するGUIが起動します。
>> figCapture.setExtension({'eps','pdf'}); % 拡張子をcellまたはstring配列で指定
>> figCapture.setExtension; % 引数がない場合は拡張子を設定するGUIが起動
figureを保存
capture
メソッドでfigureを保存します。ファイル名を指定しない場合は、日時ベースのファイル名で保存されます。
%configに保存されている設定内容(保存場所・拡張子)でfigureを保存
>> figCapture.capture('filename'); % 指定したファイル名で保存
>> figCapture.capture; % 日時の値から自動的に命名して保存
これらのコマンドを使えば、スクリプトから figCapture の機能をフル活用できます!
静的メソッドで設定した内容は、次にGUIを起動した際の初期設定になります。
逆に、GUIで一度設定しておけば、その内容が静的メソッドにも適用されます。
これもconfig.json
でデータ管理をしている恩恵ですね。