Высококачественное (не растровое) программное обеспечение для диаграмм

14

Я ищу программное обеспечение, которое может взять FEN и сгенерировать высококачественную диаграмму в формате PDF, Postscript, метафайл Windows или что-то еще, что будет хорошо выглядеть при разрешении 1200x1200 точек на дюйм или лучше. Я думал, что различные шахматные движки сделают это, но их диаграммы - все растровые изображения (насколько я могу судить) и выглядят как мусор при произвольном изменении размера. Кроме того, их собственный экспорт публикации не может быть отредактирован ни в каком стандартном, AFAICT.

Готовы платить.

Андрей Лазарь
источник
Посетите сайт apronus.com/chess/diagram/editor/…. Возможно, такие большие диаграммы в конце концов будут соответствовать вашим потребностям. В любом случае вы можете связаться с веб-мастером (я) по поводу адаптации инструмента к вашим конкретным потребностям.
DrCapablasker
Как я уже писал в своем предыдущем комментарии, я могу предоставить инструмент, который вам нужен. Я думаю о создании диаграммы SVG из отдельных файлов SVG для каждой части. Вы начали награду, не связавшись со мной, как я предложил.
DrCapablasker
Рассматривали ли вы латексный пакет "скак": ссылка ? Он может напрямую принимать строку FEN.
У.

Ответы:

11

Как указывалось, вам нужны векторы. Я предлагаю вам использовать Python-шахматы для генерации векторных изображений SVG.

Предпосылки:

  1. Python 2.6+ или 3.3+
  2. Питон-шахматы :
    • Установите форму pypi с помощью pip:pip install python-chess[uci,gaviota]

Создание сценария

Поскольку вам может потребоваться сгенерировать несколько SVG, давайте создадим скрипт. Таким образом, вы можете использовать скрипт для создания нескольких шахматных досок легко. Следующее написано в Python 3.x. Создайте скрипт Python, например, FENtoSVG.py. Вставьте следующий код:

import chess, sys
from chess import svg
'''
This imports python-chess module and sys module. 
Python-chess will generate the boards while sys.argv will take 
arguments for your script.
'''
svgstomake = (list(sys.argv))[1:]
for svgs in svgstomake:
    board = chess.Board(svgs)
    nameoffile = svgs.replace("/", "")+".SVG"
    boardsvg = chess.svg.board(board = board)
    filetowriteto = open(nameoffile, "w")
    filetowriteto.write(boardsvg)
    filetowriteto.close()

Если вы используете Linux, запустите скрипт с #!/usr/bin/env python3.

использование

Это очень простой скрипт, если вы знаете Python, но я хочу, чтобы он был прост для тех, кто не кодирует. Чтобы использовать скрипт, откройте CMD / Terminal, где вы сохранили скрипт. Затем используйте следующее:

./FENtoSVG.py "examplefen" "morefen"

Скажем, я хочу два SVG для FEN, "8/8/8/8/4N3/8/8/8 w - - 0 1"и "8/8/8/8/4Q3/8/8/8 w - - 0 1" я хотел бы ввести:

./FENtoSVG.py "8/8/8/8/4N3/8/8/8 w - - 0 1" "8/8/8/8/4Q3/8/8/8 w - - 0 1"

Это создаст два файла: 88884N3888 w - - 0 1.SVGи88884Q3888 w - - 0 1.SVG

Я предлагаю python-chess из-за настроек, которые можно легко сделать на диаграмме с помощью встроенных функций. Это также хорошо задокументировано.

MrFregg
источник
Поздравляю с четкой, простой в использовании и всеобъемлющей рекомендацией, @Fluxenein. Я смотрю на этот подход для моих нужд публикации. Добро пожаловать в сообщество!
Jaxter
Благодарность! Это все еще довольно утомительная задача для меня, поэтому я, вероятно, буду продолжать обновлять, пока не найду достаточно быстрое решение для своих нужд.
MrFregg
Награждение за вознаграждение, потому что это лучшее на данный момент, но у нас есть способы сделать что-то, что хорошо интегрировано с текстовым редактором.
Андрей Лазарь
отличные советы по отличной библиотеке. Есть ли пример указания стрелок для последнего хода или стиля доски? чтобы уточнить - хочу сделать это не через ./FENtoSVG.py, а скорее в моем собственном сценарии через python-chess.
Джо,
3

Подойдет векторный формат .

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

Для отображения в Интернете вы можете использовать формат SVG. Вот несколько шахматных фигур в формате SVG. (Если вы перейдете по ссылке, для каждого шахматиста перейдите к «исходному файлу (SVG-файлу)». Пока вы не щелкнете по ссылке, все, что вы получите, - это растровое PNG-приближение к SVG. Вам нужен настоящий SVG.)

Для отображения PDF у TeX есть несколько пакетов, которые вы можете использовать. Вот список. (Это удобно, только если вы знакомы с TeX или LaTeX; но результирующие диаграммы хороши. Например, см. Стр. 4 этого примера PDF в стиле Skak. Более того, я считаю, что на стр. 4 этого примера PDF показано стиль шахмат Швальбе, который вы могли бы предпочесть, хотя его документация, кажется, все на немецком языке. Все они, во всяком случае, с открытым исходным кодом.)

THB
источник
1
Я думаю, что диаграммы в вашем последнем примере (гармония) низкого качества. Белые квадраты занимают слишком мало горизонтального пространства, поэтому они слишком далеко налево, оставляя большие промежутки между h-файлом и краем доски. Эти диаграммы выглядят для меня так, как если бы они были созданы с помощью пакета LaTeX «шахматные задачи-диаграммы», который доступен по адресу ctan.org/tex-archive/macros/latex/contrib/… . Диаграммы, которые я сделал с использованием этого пакета, содержат ту же ошибку.
Рози Ф
3

Мое решение было использовать шахматный шрифт, как Chess Merida или Chess Cases .

Например, с таким шрифтом начальная позиция записывается так:

1222222223
4tMvWlVmT5
4OoOoOoOo5
4 + + + +5
4+ + + + 5
4 + + + +5
4+ + + + 5
4pPpPpPpP5
4RnBqKbNr5
7888888889

И (при условии, что высота строки установлена ​​на высоту шрифта) это выглядит следующим образом (Здесь используется Chess Merida в качестве шрифта):

введите описание изображения здесь

Поэтому я написал этот скрипт на Python, который конвертирует из FEN в этот формат. Вызовите этот скрипт (при условии, что вы назвали его fen2diag.py ), python fen2diag.py "<the fen>"и он выведет строку диаграммы.

import sys


def fen2diag(fen, borders=False):
    """
    Convert a fen to a diagram string used by fonts like
    'Chess Merida' and 'Chess Cases'.

    fen:        The fen. For example the fen for the startposition is
                'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1'.
    borders:    If the returned diagram string shall have borders.

    Returns the diagram string.
    """

    # We dont need anything except the piece positions.
    fen = fen[:fen.find(' ')]

    # Transposition table for the black pieces.
    # White pieces are the same in both formats.
    t = {'k': 'l', 'q': 'w', 'r': 't', 'b': 'v', 'n': 'm', 'p': 'o'}

    # If the current square is a white square or not.
    w = False

    def todiagletter(fenletter):
        """"
        Return the diagram letter corresponding to the letter in the fen.
        """

        nonlocal borders, w
        w = not w
        if fenletter == '/':
            # In the diagram font these are the characters for the diagram borders:
            # '1' upper left, '2' upper, '3' upper right,
            # '4' left, '5' right,
            # '7' bottom left, '8' bottom, '9' bottom right
            return '5\n4' if borders else '\n'
        else:
            # this code handles numbers in the fen, denoting empty squares.
            try:
                # this is a number between 1 and 8.
                n = int(fenletter)

                # This will be a string denoting empty squares.
                # Would be eg. ' + + + +' for an empty eight rank.
                spaces = []

                while n > 0:
                    # In the diagram font ' ' denotes a white square
                    # and '+' denotes a black square.
                    spaces.append(' ' if w else '+')

                    w = not w
                    n -= 1
                w = not w
                return ''.join(spaces)

            # this code handles piece letters in the fen.
            except ValueError:
                # a black piece
                if fenletter in t:
                    fenletter = t[fenletter]

                # In the diagram font lowercase letters denote
                # pieces on white squares and uppercase letters
                # denote pieces on black squares.
                return fenletter.lower() if w else fenletter.upper()

    diagram = ''.join(map(todiagletter, fen))
    if borders:
        return f'1222222223\n4{diagram}5\n7888888889'
    else:
        return diagram


if __name__ == '__main__':
    print(fen2diag(sys.argv[1], borders=True))

Эти шрифты Diagram также поддерживают квадраты, отмеченные точками или звездами, границы другого типа, закругленные углы границ, цифры / буквы слева / снизу, обозначающие строки / столбцы. Я не включил это в сценарий. Не стесняйтесь обновлять мой код.

Chessbase также создал семейство шрифтов (начинающееся с 'DiagramTT ...'), которое поддерживает еще больше вещей (например, кусочки, повернутые на 180 °), но этот шрифт отображает вещи в разные кодовые точки, также для черных квадратов берут две буквы, одну для фона и один для куска.

Nils
источник