マインドマップのトピックを、階層のレベルを指定して
一括開閉することができます。
巨大なマインドマップの編集中や、それを人に説明する時、詳細を隠して荒いレベルでマインドマップを表示したい時などに便利です。また、現在図上検索は、開いたトピックのみに有効な為、キーワードからトピックを検索する際に、すべてのトピックを一括で開くことで、探しているトピックを素早く見つけることができます。
自分の好きなAKB48のメンバー一覧を、チーム別に表したマインドマップを作りました。
このマインドマップを使って利用例を紹介します。
手順
- astah* professional又はastah* UMLを起動します(astah*をお持ちでない方は、こちらのページから、評価版をダウンロードできます)
- こちらの手順に従ってastah*にスクリプトプラグインをインストールします
- こちらからスクリプトをダウンロードします(ダウンロード後.zipファイルを解凍してください)
- マインドマップを開きます。(ちなみにここから今回使用したマインドマップをダウンロードできます。)
「小嶋陽菜」の在籍するチームを知りたいので、図上検索(Ctrl+F)をかけます。
しかしこの状態で図上検索をかけても、図上ではメンバーの名前が見えないので、検索は引っかかりません。
ここで、各Teamのトピックを順に開いて、検索をかける、では、時間がかかるので全てのトピックを開きます。

- メインメニュー[ツール]-[スクリプト]を選択して[スクリプト]ウインドウを開きます

- [スクリプト]ウィンドウにて、[ファイル] – [開く]を選択して、ダウンロードした.jsファイルを選択します

- 続けて、[アクション] – [実行]メニュー、もしくは、右矢印のボタンを選択してください
この時、’TARGET_LEVEL’という変数に、開閉基準とするトピックの階層を指定します。今回は、全てのトピックを開きたいので「1」=ルートトピックの子トピック、を入力します。

- これで全てのトピックが開きました
- [Ctrl+F]で開いた検索欄に「小嶋」と入力します
- Team-Aのトピック配下にいることがわかりました

(2)一括して閉じる
- 所属チームが分かりました。次は、全てのチームのメンバー一覧のみ表示したいので、各メンバーのプロフィールのみ閉じます。
- 先ほどのスクリプトを開き、TARGET_LEVELを2にします
最後に、このスクリプトを使うことで、巨大なマインドマップの編集中や、それを人に説明する時、詳細を隠して荒いレベルでマインドマップを表示したい時などの悩みを解決することができるので、ぜひ一度騙されたと思って使ってみてはいかがでしょうか
下にスクリプトを載せておくので、自由にカスタマイズして、使用していただいても構いません
//指定したレベル(トピックの階層の深さ)のトピックを全て開閉するスクリプト
var Key = Java.type('com.change_vision.jude.api.inf.presentation.PresentationPropertyConstants.Key');
var IMindMapDiagram = Java.type('com.change_vision.jude.api.inf.model.IMindMapDiagram');
var TransactionManager = Java.type('com.change_vision.jude.api.inf.editor.TransactionManager');
var level = 0;
var doOpen = undefined;
var TARGET_LEVEL = 1;//指定したレベルのサブトピックを開閉します
run();
function run() {
var diagramViewManager = astah.getViewManager().getDiagramViewManager();
var diagram = diagramViewManager.getCurrentDiagram();
if (!(diagram instanceof IMindMapDiagram)) {
print('Open a mindmap and run again.');
return;
}
var rootTopic = diagram.getRoot();
try {
TransactionManager.beginTransaction();
reverseTopicVisibility(rootTopic);
TransactionManager.endTransaction();
print('LEVEL' + TARGET_LEVEL + 'のサブトピックを開閉しました')
} catch (e) {
TransactionManager.abortTransaction();
print('error: LEVEL' + TARGET_LEVEL + 'のサブトピックを開閉できませんでした');
print(e);
}
}
function reverseTopicVisibility(topic) {
if (isNaN(TARGET_LEVEL) || TARGET_LEVEL < 0) {
throw { toString: function() { return 'TARGET_LEVELには整数値を指定してください'; } };
}
if (level === TARGET_LEVEL) {
if (doOpen == undefined) {
doOpen = topic.getProperty(Key.SUB_TOPIC_VISIBILITY) == 'false';
}
topic.setProperty(Key.SUB_TOPIC_VISIBILITY, doOpen);
}
var topics = topic.getChildren();
level++;
for (var i in topics) {
if (topics[i].getType() =='Topic') { //skip MMBoundary
reverseTopicVisibility(topics[i]);
}
}
level--;
}