Inkscape Extension :要素を追加するには?

inkscape-python-add.png

グループの追加

        layer = inkex.etree.SubElement(svg, 'g')
        layer.set(inkex.addNS('label', 'inkscape'), 'Hello %s Layer' % (what))
        layer.set(inkex.addNS('groupmode', 'inkscape'), 'layer')
<svg>
    <g inkscape:label="Helo Layer" inkscape:groupmode="layer"></g>

あるいはこんなかんじでElementコンストラクタを使うのも手

attributes={"points":"200,10 250,190 160,210","style":"fill:lime;stroke:purple;stroke-width:1"}
polygon =inkex.etree.Element("polygon",attributes)
svg.append(polygon)

ここで使われているElementはpython-xml-elementと同じです

各関数の意味

関数の名前 意味 戻り値
inkex.etree.SubElement(親,子) 親要素に子要素を追加する Element
inkex.addNS(タグ名,名前空間名) NSとはname spaceの略。名前空間つきで要素を追加する 属性のキーとしてよく使われる
Element.set(key,value) 要素の属性keyにvalueをセットします アトリビュートをセットする。

つまりこの一文

 layer.set(inkex.addNS('groupmode', 'inkscape'), 'layer')

Element型であるlayerにkey=inkex.addNS('groupmode', 'inkscape'),
value="layer"をセットしているのだ

パスの追加

SVGのパスの仕様にのっとってpythonで書く。

2次元配列=[[命令名,[x,y]],[命令名,[x,y]]]

というかんじになっている2次元配列で書く。

そのあとは、simplepath.formatPathを使えばinkscapeに適した形に変換してくれる。

cmds = [['M', [p1.x, p1.y]],
    ['L', [p2.x, p2.y]],
    ['L', [p3.x, p3.y]],
    ['Z', []]]
path = inkex.etree.Element(inkex.addNS('path', 'svg'))
path.set('d', simplepath.formatPath(cmds))
path.set('style', simplestyle.formatStyle(linestyle))
    <path
       style="fill:#e99ad5;fill-opacity:1"
       d="M 300,72.362205 265.71429,298.07649 537.14286,286.64792"
       id="path12560"
       inkscape:connector-curvature="0" />

ellipse(楕円)

def draw_SVG_ellipse((rx, ry), (cx, cy), parent, start_end=0,2*pi),transform='' ):
 
    style = {   'stroke'        : '#000000',
                'stroke-width'  : '1',
                'fill'          : 'none'            }
    ell_attribs = {'style':simplestyle.formatStyle(style),
        inkex.addNS('cx','sodipodi')        :str(cx),
        inkex.addNS('cy','sodipodi')        :str(cy),
        inkex.addNS('rx','sodipodi')        :str(rx),
        inkex.addNS('ry','sodipodi')        :str(ry),
        inkex.addNS('start','sodipodi')     :str(start_end[0]),
        inkex.addNS('end','sodipodi')       :str(start_end[1]),
        inkex.addNS('open','sodipodi')      :'true',    #all ellipse sectors we will draw are open
        inkex.addNS('type','sodipodi')      :'arc',
        'transform'                         :transform
 
            }
    ell = inkex.etree.SubElement(parent, inkex.addNS('path','svg'), ell_attribs )

サポートサイト Wikidot.com