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


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 из-за настроек, которые можно легко сделать на диаграмме с помощью встроенных функций. Это также хорошо задокументировано.


Поздравляю с четкой, простой в использовании и всеобъемлющей рекомендацией, @Fluxenein. Я смотрю на этот подход для моих нужд публикации. Добро пожаловать в сообщество!
— Jaxter

Благодарность! Это все еще довольно утомительная задача для меня, поэтому я, вероятно, буду продолжать обновлять, пока не найду достаточно быстрое решение для своих нужд.
— MrFregg

Награждение за вознаграждение, потому что это лучшее на данный момент, но у нас есть способы сделать что-то, что хорошо интегрировано с текстовым редактором.
— Андрей Лазарь

отличные советы по отличной библиотеке. Есть ли пример указания стрелок для последнего хода или стиля доски? чтобы уточнить - хочу сделать это не через ./FENtoSVG.py, а скорее в моем собственном сценарии через python-chess.
— Джо,

3

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

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

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

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


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 °), но этот шрифт отображает вещи в разные кодовые точки, также для черных квадратов берут две буквы, одну для фона и один для куска.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.