0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Draw.ioでタブ名をファイル名にしてエクスポート

0
Posted at

タブ名でまとめてエクスポートしたい

Draw.io はとても便利で、いつもvscode内で使っているのだけど、エクスポートが面倒くさい。個々の絵にはタブに名前がつけられるので、このタブの名前をファイル名にしてまとめてエクスポートする方法がありそうなものだけど、どうもないらしい。

デスクトップアプリを使うと、個々のタブを個別にエクスポートする事はできるし、その際にファイル名を指定することもできるのだけど、タブの名前を取り出す方法がわからない。Pythonのdrawioパッケージ?みたいなものを使うとできるらしいが、このためだけに導入するのも、管理上面倒だと思っていたら、drawioファイルはXMLファイルで普通に読めるらしいのでやってみた。

Draw.io ファイルの構造

適当にDraw.ioファイルを作って、タブを2つ作って開いてみると以下のようになっている。mxfile の中に diagram がネストされていて、diagramname 属性にタブ名が入っている。

<mxfile host="65bd71144e">
    <diagram id="cN5VryQN1u5QBBV3Ox7x" name="Page-1">
        <mxGraphModel dx="937" dy="366" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
            <root>
                <mxCell id="0"/>
                <mxCell id="1" parent="0"/>
            </root>
        </mxGraphModel>
    </diagram>
    <diagram id="Gwga_LjCDhwcRshZ86WP" name="Page-2">
        <mxGraphModel dx="937" dy="366" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
            <root>
                <mxCell id="0"/>
                <mxCell id="1" parent="0"/>
            </root>
        </mxGraphModel>
    </diagram>
</mxfile>

タブ名の取り出し

ということで、このファイルは標準のXMLパッケージを使って読めばいいので、以下のようにすればよい。diagramという要素を探してそのname属性をプリントしているだけ。

import xml.etree.ElementTree as ET
import sys

def main(filename):
    try: 
        with open(filename, "r") as f:
            xml_string = f.read()
            root = ET.fromstring(xml_string)
            for d in root.findall("diagram"):
                print(d.attrib['name'])
    except Exception as e :
        print(f"Got exception {e}", file=sys.stderr)
        sys.exit(-1)

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print(f"Usage: python {sys.argv[0]} DRAWIO_FILENAME")
    main(sys.argv[1])

タブ名でのエクスポート

あとは、タブ名が分かれば後はdrawio コマンドを使って出力してやればいい。上のコードをextract_tabnames.pyとして保存してあるとすると、下記のようにすればいい。

#!/bin/bash

target_dir=../figs 

counter=1   
for f in `python extract_tabnames.py $1`; do
    drawio --export --format svg -p $counter --output $target_dir/$f.svg $1
    ((counter++))
done

-p オプションでタブの番号を指定する。タブ番号は1オリジンなのだけど、なぜか0にしてもエラーがでずに、1枚目がでてくる。つまり0と1で挙動が同じになる。こういうのやめてほしい。

所感

タブ名のリストを出力する機能ぐらい、デスクトップコマンドに用意されていてもいいと思うのだけど、なんでないのだろう。。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?