SVGの生成方法
お世話になります.ベクター画像系はまったく初心者ですので、質問のおかしな点がありましたらご指摘ください.
以下のようなXMLデータのフラグメントがあります.LibreOfficeのDrawで作った.odgファイルの中のXMLファイルの一部です.
<draw:custom-shape draw:style-name="gr2" draw:text-style-name="P1"
draw:layer="measurelines" svg:width="1.231cm" svg:height="10.807cm"
draw:transform="rotate (-1.5707963267949) translate (11.44cm 1.975cm)">
<text:p/>
<draw:enhanced-geometry svg:viewBox="0 0 21600 21600"
draw:mirror-vertical="true" draw:mirror-horizontal="true"
draw:glue-points="21600 0 0 10800 21600 21600"
draw:text-areas="13800 ?f9 21600 ?f10" draw:type="left-brace"
draw:modifiers="1800 10800"
draw:enhanced-path="M 21600 0 C 16200 0 10800 ?f0 10800 ?f1 L 10800 ?f2 C 10800 ?f3 5400 ?f4 0 ?f4 5400 ?f4 10800 ?f5 10800 ?f6 L 10800 ?f7 C 10800 ?f8 16200 21600 21600 21600 N">
<draw:equation draw:name="f0" draw:formula="$0 /2"/>
<draw:equation draw:name="f1" draw:formula="$0 "/>
<draw:equation draw:name="f2" draw:formula="?f4 -$0 "/>
<draw:equation draw:name="f3" draw:formula="?f4 -?f0 "/>
<draw:equation draw:name="f4" draw:formula="$1 "/>
<draw:equation draw:name="f5" draw:formula="?f4 +?f0 "/>
<draw:equation draw:name="f6" draw:formula="?f4 +$0 "/>
<draw:equation draw:name="f7" draw:formula="21600-$0 "/>
<draw:equation draw:name="f8" draw:formula="21600-?f0 "/>
<draw:equation draw:name="f9" draw:formula="$0 *10000/31953"/>
<draw:equation draw:name="f10" draw:formula="21600-?f9 "/>
<draw:handle draw:handle-position="10800 $0" draw:handle-range-y-minimum="0"
draw:handle-range-y-maximum="5400"/>
<draw:handle draw:handle-position="left $1" draw:handle-range-y-minimum="0"
draw:handle-range-y-maximum="21600"/>
</draw:enhanced-geometry>
</draw:custom-shape>
このデータを変換して、LibreOfficeのエキスポートで行った出力と同じものを(LibreOffice本体のAPIを使わずに)作り出したいと思います.(上記のXMLのフラグメント以外で参照している箇所があるかもしれません.)
<g class="com.sun.star.drawing.CustomShape">
<g id="id11">
<rect class="BoundingBox" stroke="none" fill="none" x="630" y="1972" width="10811" height="1235"/>
<path fill="none" stroke="rgb(52,101,164)" d="M 631,1973 C 631,2281 1081,2589 1531,2589 L 5134,2589 C 5584,2589 6035,2897 6035,3205 6035,2897 6485,2589 6935,2589 L 10538,2589 C 10988,2589 11439,2281 11439,1973"/>
</g>
</g>
最初のXMLの断片をご覧いただくとわかるようにdraw:enhanced-pathがパラメータを伴った命令で、それはdraw:equationで動的に定義された関数を呼び出しています.このようなデータ構造を処理しようとしたとき、
- 動的な関数の生成
- この関数の呼び出しと結果の取得
が必要と思われますが、どのような言語のどのような機能を使用すれば実現可能でしょうか?これが質問の主旨です.(普段使っている言語が偏っているので、このようなデータ構造を処理できるものを知りません)
なお.odgに関する仕様は
https://standards.iso.org/ittf/PubliclyAvailableStandards/index.html
の ISO/IEC 26300-1:2015 でえられる c066363_ISO_IEC_26300-1_2015.zip 中の C066363e.pdf で内容を見ることができます.
例えば、draw:enhanced-path は p.378, draw:equationのdraw:formula は p.387 です.
以上 よろしくお願います.