有没有办法使用命令行中的 Inkscape 将对象排列成 table(或网格)?

Is there a way to arrange objects into a table (or grid) using Inkscape from comand line?

我喜欢 Inkscape 必须将项目排列到 table(或网格)中的功能。但是,我想以编程方式使用它,我的意思是针对脚本。事实上,我在一个独特的 .svg 文件中有几个图,我们称之为 "combined.svg" 我想要这样的东西:

inkscape -z -f combined.svg --verb EditSelectAll --verb DialogArrange ROWS COLS SPACING_X SPACING_Y --verb savefile

其中 ROWSCOLSSPACING_XSPACING_Y 将是整数参数。

但是,据我所知,我无法将参数传递给动词,也无法在没有图形界面的情况下使用它。

有什么方法可以实现我的目标吗?

不,目前 Inkscape 0.92.4 无法做到这一点。

但是,您可以使用您选择的语言编写 Inkscape 扩展程序或脚本,并且您可以从命令行运行。

我已经按照@Moini 的建议写下了我自己的脚本,以便将 svg 文件排列到给定行数和列数的网格中。为了实现我的目标,我使用了这个 Python 库 svg_stack。我在下面提供我的脚本。要使用它,请下载库,在库目录中添加一个新的 python 文件并复制我的脚本。使用 python2.7,安装库 ( python2.7 setup.py install ) 并按照我在以下示例中的说明使用它:

要将 4 个 svg 文件(f1、f2、f3 和 f4)布局为 2 行 2 列的 table 并将其保存到 ft.svg,请使用:

  pyhon2.7 name_you_give_to_the_script --rows=2 --cols=2 f1.svg f2.svg f3.svg f4.svg > ft.svg 
from svg_stack import *

def main():
    usage = '''%prog FILE1 [FILE2] [...] [options]

This will concatenate FILE1, FILE2, ... to a new svg file. Also, this will arrange 
the provided elements into a table which given number of rows and columns. 
The table will be populated by rows.

EXAMPLE

To layout 4 svg files (f1,f2,f3 and f4) into a table of 2 rows and 2 cols and save it to ft.svg use:
  %prog --rows=2 --cols=2 f1.svg f2.svg f3.svg f4.svg > ft.svg

'''

    parser = OptionParser(usage, version=VERSION)
    parser.add_option("--rows",type='int',
                      help='number of grid rows (required)')
    parser.add_option("--cols",type='int',
                      help='number of grid cols (required)')
    parser.add_option("--spacing_x",type='str', help='size of margin (in any units, px default)')
    parser.add_option("--spacing_y",type='str', default='0px', help='size of margin (in any units, px default)')
    (options, args) = parser.parse_args()
    fnames = args

    if options.spacing_x is not None:
        spacing_x = convert_to_pixels(*get_unit_attr(options.spacing_x))
    else:
        spacing_x = 0

    if options.spacing_y is not None:
        spacing_y = convert_to_pixels(*get_unit_attr(options.spacing_y))
    else:
        spacing_y = 0

    if options.rows is None:
        raise ValueError('You must provide the number of rows that you want in the table')

    if options.cols is None:
        raise ValueError('You must provide the number of cols that you want in the table')

    if len(fnames) != options.rows * options.cols:
        raise ValueError('You must supply as much files as it requires to populate the table')

    doc = Document()
    layout = VBoxLayout()
    for i in range(options.rows):
        layout_row = HBoxLayout()        
        for j in range(options.cols):
            fname = fnames[i * options.cols + j]
            layout_row.addSVG(fname, alignment=AlignCenter)

        layout_row.setSpacing(spacing_x)
        layout.addLayout(layout_row)
        layout.setSpacing(spacing_y)

    if 0:
        fd = open('tmp.svg',mode='w')
    else:
        fd = sys.stdout

    doc.setLayout(layout)
    doc.save(fd)


if __name__=='__main__':
    main()


Pd:我知道可能有更优雅的解决方案,但我找不到我想要的那么简单的解决方案。