XMindのpython SDKの使い方メモ

Mind Mapツールの一つである[XMind](http://jp.xmind.net/)のPython SDKを使ってみたメモです。

# XMind

[http://jp.xmind.net](http://jp.xmind.net)

# XMind Python SDK

## Python2.x

[https://github.com/xmindltd/xmind-sdk-python](https://github.com/xmindltd/xmind-sdk-python)

## Python3.x

[https://github.com/jmoraleda/xmind-sdk-python3](https://github.com/jmoraleda/xmind-sdk-python3)

# SDK 使い方

ここではPython3を使います。

## ファイル作成

### 新規ファイルの作成

```python
#!/usr/bin/env python3
from xmind import save
from xmind.core.workbook import WorkbookDocument

if __name__ == "__main__":
    """
    空のファイルを作成
    """
    # xmindのWorkBookを作成
    wb = WorkbookDocument("", "./example.xmind")

    # xmindのファイルを保存
    save(wb)
```

または `load` メソッドを使います。

```python
#!/usr/bin/env python3
from xmind import load, save
from xmind.core.workbook import WorkbookDocument

if __name__ == "__main__":
    """
    空のファイルを作成
    """
    # xmindのWorkBookを作成
    wb = load("./example.xmind")

    # xmindのファイルを保存
    save(wb)
```

### WorkSheet名を設定

```python
#!/usr/bin/env python3
from xmind import save
from xmind.core.workbook import WorkbookDocument

if __name__ == "__main__":
    """
    WorkSheet作成
    """
    # xmindのWorkBookを作成
    wb = WorkbookDocument("", "./example.xmind")

    # WorkSheetを作成
    ws = wb.getPrimarySheet()
    ws.setTitle("WorkSheet1")

    # xmindのファイルを保存
    save(wb)
```

### root topic取得

```python
#!/usr/bin/env python3
from xmind import save
from xmind.core.workbook import WorkbookDocument

if __name__ == "__main__":
    """
    root topicを取得
    """
    # xmindのWorkBookを作成
    wb = WorkbookDocument("", "./example.xmind")

    # WorkSheetを作成
    ws = wb.getPrimarySheet()
    ws.setTitle("WorkSheet1")

    # WorkSheetのRoot Topicを取得してタイトルをセット
    rt = ws.getRootTopic()
    rt.setTitle("root topic")

    # xmindのファイルを保存
    save(wb)
```

### root topicにsub topicを追加

```python
#!/usr/bin/env python3
from xmind import save
from xmind.core.workbook import WorkbookDocument

if __name__ == "__main__":
    """
    root topicにsub topicを追加
    """
    # xmindのWorkBookを作成
    wb = WorkbookDocument("", "./example.xmind")

    # WorkSheetを作成
    ws = wb.getPrimarySheet()
    ws.setTitle("WorkSheet1")

    # WorkSheetのRoot Topicを取得してタイトルをセット
    rt = ws.getRootTopic()
    rt.setTitle("root topic")

    # Root TopicにSub Topicを追加
    rt.addSubTopic().setTitle("sub topic1")

    # xmindのファイルを保存
    save(wb)
```

複数のsub topicを追加したい場合は `rt` オブジェクトに連続して追加します。

```python
(snip)
    # Root TopicにSub Topicを追加
    rt.addSubTopic().setTitle("sub topic1")
    rt.addSubTopic().setTitle("sub topic2")
(snip)
```

### topicの階層

```python
#!/usr/bin/env python3
from xmind import save
from xmind.core.workbook import WorkbookDocument

if __name__ == "__main__":
    """
    sub topicの配下に新しいtopicを追加する
    image: root topic --- sub topic1 --- sub topic3
                       |
                        - sub topic2
    """
    # xmindのWorkBookを作成
    wb = WorkbookDocument("", "./example.xmind")

    # WorkSheetを作成
    ws = wb.getPrimarySheet()
    ws.setTitle("WorkSheet1")

    # WorkSheetのRoot Topicを取得してタイトルをセット
    rt = ws.getRootTopic()
    rt.setTitle("root topic")

    # Root TopicにSub Topicを追加
    rt.addSubTopic().setTitle("sub topic1")
    rt.addSubTopic().setTitle("sub topic2")

    # sub topicのindexを取得
    topic_index = {}
    for t in rt.getSubTopics():
        topic_index[t.getTitle()] = t.getIndex()

    # sub topic1配下にtopicを追加
    rt.getSubTopicByIndex(index=topic_index['sub topic1']).addSubTopic().setTitle("sub topic3")

    # xmindのファイルを保存
    save(wb)
```

`sub topic3` 配下にtopicを追加する例

```python
#!/usr/bin/env python3
from xmind import save
from xmind.core.workbook import WorkbookDocument

if __name__ == "__main__":
    """
    sub topicの配下に新しいtopicを追加する
    image: root topic --- sub topic1 --- sub topic3 ---- sub topic4
                       |
                        - sub topic2
    """
    # xmindのWorkBookを作成
    wb = WorkbookDocument("", "./example.xmind")

    # WorkSheetを作成
    ws = wb.getPrimarySheet()
    ws.setTitle("WorkSheet1")

    # WorkSheetのRoot Topicを取得してタイトルをセット
    rt = ws.getRootTopic()
    rt.setTitle("root topic")

    # Root TopicにSub Topicを追加
    rt.addSubTopic().setTitle("sub topic1")
    rt.addSubTopic().setTitle("sub topic2")

    # sub topicのindexを取得
    topic_index = {}
    for t in rt.getSubTopics():
        topic_index[t.getTitle()] = t.getIndex()

    # sub topic1配下にtopicを追加
    rt.getSubTopicByIndex(index=topic_index['sub topic1']).addSubTopic().setTitle("sub topic3")

    # sub topic3配下にtopicを追加する例
    for t in rt.getSubTopics():
        if(t.getTitle() == "sub topic1"):
            for st in t.getSubTopics():
                st.addSubTopic().setTitle("sub topic4")

    # xmindのファイルを保存
    save(wb)
```
## ファイル読み込み

### ファイルの読み込み

```python
#!/usr/bin/env python3
from xmind import load, save

if __name__ == "__main__":
    """
    XMindのファイルを読み込む
    """
    # xmindのWorkBookを作成
    wb = load("./example.xmind")

    # WorkSheetを取得
    ws = wb.getPrimarySheet()

    # WorkSheetのRoot Topicを取得
    rt = ws.getRootTopic()

    # sub topicを表示
    for topic in rt.getSubTopics():
        print(topic.getTitle())
```

### 読み込むWorkSheetを指定

```python
#!/usr/bin/env python3
from xmind import load, save

if __name__ == "__main__":
    """
    読み込むWorkSheetを指定する
    """
    # xmindのWorkBookを作成
    wb = load("./example.xmind")

    # 複数あるWorkSheetを取得
    wss = wb.getSheets()

    # `シート 2` を指定する
    for ws in wss:
        if(ws.getTitle() == "シート 2"):
            ws = ws
            break

    # WorkSheetのRoot Topicを取得してタイトルをセット
    rt = ws.getRootTopic()

    # sub topicを表示
    for topic in rt.getSubTopics():
        print(topic.getTitle())
```

### 既存のファイルにtopicを追加

以下のマップの `a-d` に `p` を追加してみます。

![スクリーンショット 2018-01-02 17.09.36.png](https://qiita-image-store.s3.amazonaws.com/0/180118/99f187c8-b9e0-2592-ec41-b995e32dd0bd.png)

```python
#!/usr/bin/env python3
from xmind import load, save

def getAlltopic(topics, allTopics):
    """
    XMindのtopicのtitleをキーにしてtopicのオブジェクトを返す辞書を作成する

    :type topics: list
    :param topics: XMindのtopicオブジェクトリスト

    :type allTopics: dict
    :param allTopics: topicのオブジェクトを保存する辞書

    :rtype: dict
    :return: topicのtitleをキーにしてtopicのオブジェクトを返す辞書
    """
    for topic in topics:
        allTopics[topic.getTitle()] = topic
        if(len(topic.getSubTopics()) > 0):
            getAlltopic(topic.getSubTopics(), allTopics)

    return allTopics

if __name__ == "__main__":
    """
    既存のtopicに追加する
    ただし、このやり方はtopicのtitleが被らないことが前提
    """
    # XMindのファイルを読み込む
    wb = load("./example.xmind")

    # WorkSheetを取得
    ws = wb.getPrimarySheet()

    # Root Topicを取得
    rt = ws.getRootTopic()

    # 全topicのindexを取得
    allTopics = {}
    r = getAlltopic(rt.getSubTopics(), allTopics)

    # root topic - a - d に `p` を追加する
    r['d'].addSubTopic().setTitle("p")

    # xmindのファイルを保存
    save(wb)
```

### 別名でファイルを保存

```python
#!/usr/bin/env python3
from xmind import load, save

if __name__ == "__main__":
    """
    別名で保存する
    """
    # xmindのWorkBookを作成
    wb = load("./example.xmind")

    # 複数あるWorkSheetを取得
    wss = wb.getSheets()

    # `シート 2` を指定する
    for ws in wss:
        if(ws.getTitle() == "シート 2"):
            ws = ws
            break

    # WorkSheetのRoot Topicを取得してタイトルをセット
    rt = ws.getRootTopic()

    # sub topicを追加
    rt.addSubTopic().setTitle("b")

    # 別名保存
    save(wb, "./hoge.xmind")
```

# 参考

[https://github.com/xmindltd/xmind-sdk-python/blob/master/example.py](https://github.com/xmindltd/xmind-sdk-python/blob/master/example.py)