Есть ли способ упорядочить объекты в таблице (или сетке), используя Inkscape из командной строки? - PullRequest
0 голосов
/ 27 июня 2019

Мне нравится функциональность Inkscape должен упорядочивать элементы в таблице (или сетке). Тем не менее, я хотел бы использовать его программно, я имею в виду сценарий. Действительно, у меня есть несколько графиков в уникальном файле .svg, назовем его «комбинированный. Svg», и я хотел бы что-то вроде этого:

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

Где ROWS, COLS, SPACING_X и SPACING_Y будут целочисленными параметрами.

Однако, насколько мне известно, я не могу передавать аргументы глаголам и не использую их без графического интерфейса.

Есть ли способ достичь моей цели?

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Нет, в настоящее время это невозможно с Inkscape 0.92.4.

Однако вы можете написать расширение Inkscape или скрипт на любом языке, который может это сделать, и который вы можете запустить изкомандная строка.

0 голосов
/ 28 июня 2019

Я следовал предложению @Moini и записал свой собственный скрипт, чтобы упорядочить SVG-файлы в сетке с заданным количеством строк и столбцов. Чтобы достичь своей цели, я использовал эту библиотеку Python svg_stack . Я предоставляю свой сценарий ниже. Чтобы использовать его, загрузите библиотеку, добавьте новый файл python прямо в директорию библиотеки и скопируйте мой скрипт. Используя python2.7, установите библиотеку (python2.7 setup.py install) и используйте ее, как я объясню в следующем примере:

Чтобы расположить 4 файла SVG (f1, f2, f3 и f4) в таблицу из 2 строк и 2 столбцов и сохранить их в 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: Я знаю, что могут быть более элегантные решения, но я не смог найти такое простое, как я хотел.

...