有没有办法使用命令行中的 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
其中 ROWS
、COLS
、SPACING_X
和 SPACING_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:我知道可能有更优雅的解决方案,但我找不到我想要的那么简单的解决方案。
我喜欢 Inkscape 必须将项目排列到 table(或网格)中的功能。但是,我想以编程方式使用它,我的意思是针对脚本。事实上,我在一个独特的 .svg 文件中有几个图,我们称之为 "combined.svg" 我想要这样的东西:
inkscape -z -f combined.svg --verb EditSelectAll --verb DialogArrange ROWS COLS SPACING_X SPACING_Y --verb savefile
其中 ROWS
、COLS
、SPACING_X
和 SPACING_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:我知道可能有更优雅的解决方案,但我找不到我想要的那么简单的解决方案。