GRASS7 : メニューのカスタマイズ

GRASS7ではメニューをカスタマイズすることができるようになっています。
GRASS7ではエクステンションが多く配布されているので、追加したコマンドをよく使うようであればメニューに追加しておきたいところです。
コマンドの追加を含めたメニューのカスタマイズのやり方は以下のリンクにあります。

GRASS GIS Manual_ wxGUI Toolboxes

ちょっとわかりにくかったので、以下にメモを記します。
なお、以下の説明はOSGeo4W版GRASS7についてのものです。

ファイルを2つ作成

そもそも、GRASSのメニューを定義しているファイルは/OSGeo4W/apps/grass/grass-7.2.2/gui/wxpython/xml/以下にある一連のファイル群です。
これらに直接手を入れてもおそらくはカスタマイズできるとは思われますが、ユーザごとに異なるメニューを用意したりする場合はこれだと困ります。
ユーザごとにメニューをカスタマイズするには、メニューの定義ファイルをユーザごとのフォルダに作成する必要があります。

GRASSをインストール(もしくは初回起動)すると、
C:Usersユーザ名AppDataRoamingGRASS7 以下に、addons、toolboxesというフォルダがあると思います。
このフォルダ以下に、toolboxes.xmlとmain_menu.xmlという2つのファイルを作ります。
main_menu.xmlは、/OSGeo4W/apps/grass/grass-7.2.2/gui/wxpython/xml/以下にあるものを取ってくると良いでしょう。

メインメニューの編集

元のmain_menu.xmlの中身は以下のテキストファイルです。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE toolbox SYSTEM "main_menu.dtd">
<toolbox name="DefaultMainMenu">
  <label>Default GRASS GIS main menu bar</label>
  <items>
    <subtoolbox name="File"/>
    <subtoolbox name="Settings"/>
    <subtoolbox name="Raster"/>
    <subtoolbox name="Vector"/>
    <subtoolbox name="Imagery"/>
    <subtoolbox name="Volumes"/>
    <subtoolbox name="Database"/>
    <subtoolbox name="Temporal"/>
    <subtoolbox name="Help"/>
  </items>
</toolbox>

このファイルを編集することでメインメニューを変更することができます。
例えば、筆者があまり使わないTemporalメニューを消去して代わりにAdditionalというメニューを追加したりすることができます。
また、<user-toolboxes-list>を追加すると、追加した位置に「Custom toolboxes」というメインメニューが作られ、
後述するユーザ追加サブメニューはこのメニューのサブメニューに配置されます。
自分で追加したコマンドを細かくカテゴリわけしたい場合にはいいかと思います。

メインメニュー変更後

ユーザ追加コマンド

メニューにコマンドを追加するには、toolboxes.xmlでコマンドとメニューを関連付ける定義を行います。
書式は以下のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE toolboxes SYSTEM "toolboxes.dtd">
<toolboxes>
  <toolbox name="Additional">
    <label>Additional</label>
    <items>
      <module-item name="i.edge">
        <label>i.edge</label>
      </module-item>
      <module-item name="r.surf.idw2">
        <label>r.surf.idw2</label>
      </module-item>
      <separator />
      <module-item name="i.segment.stats">
        <label>i.segment.stats</label>
      </module-item>
      <module-item name="r.object.geometry">
        <label>r.object.geometry</label>
      </module-item>
      <module-item name="v.class.mlR">
        <label>v.class.mlR</label>
      </module-item>
    </items>
  </toolbox>
  <toolbox name="Test commands">
    <label>Test commands</label>
    <items>
      <module-item name="r.test">
        <label>Test command</label>
      </module-item>
      <module-item name="r.test2">
        <label>Test command</label>
      </module-item>
    </items>
  </toolbox>
</toolboxes>

まずルートタグに”toolboxes”を配置します。
“toolboxes”タグの下には、”toolbox”タグを配置しサブメニューの定義を記述します。
上の例では「Additional」と「Test commands」の2つのサブメニューを作成しています。

“toolbox”タグの下には、”label”タグと”items”タグを配置します。”label”タグはメニューに表示する文字列を記載します。
コマンドは”items”タグの下に”module-item”タグとして記述します。
“module-item”タグの”name”属性が呼び出すコマンド名となります。
“module-item”タグの下にある”label”タグは、メニューに表示されるコマンドの文字列です。

また、”separator”タグはその位置に横棒のセパレータを配置します。

上記のファイルを使った場合、下図のようなメニューが作成されます。

サブメニュー作成後

自動作成されるメニュー定義ファイル

ユーザがmain_menu.xmlとtoolboxes.xmlを上記のフォルダ内に作成したのちにGRASSを起動すると、
同じフォルダにmenudata.xmlとmoxule_tree_menudata.xmlという2つのファイルが作成されます。
これらはユーザが作成した2つのファイルをGRASSが解析して自動的に作成したもので、
実際にメニューの定義としてGRASSが読み取っているのはmenudata.xmlになります。

module_tree_menudata.xmlはModulesタブを開くと表示されるツリーの中身を定義するもので、
こちらにもユーザが追加したコマンドが登録されています。

モジュールツリー

なお、作成したXMLファイルに何らかの誤りがある場合はデフォルトのメニューがロードされます。
なので、安心してバシバシいじってみましょう。

アーカイブ