Software de diagrama de alta qualidade (não bitmap)

14

Estou procurando um software que possa pegar o FEN e gerar um diagrama de alta qualidade , em PDF, Postscript, metarquivo do Windows ou qualquer outra coisa que pareça boa em 1200x1200 dpi ou melhor. Eu pensei que os vários mecanismos de xadrez fariam isso, mas seus diagramas são todos bitmaps (até onde eu sei) e parecem lixo quando redimensionados arbitrariamente. Além disso, sua própria exportação de publicação não pode ser editada em nada padrão, o AFAICT.

Dispostos a pagar.

Andrew Lazarus
fonte
Confira apronus.com/chess/diagram/editor/… - Talvez diagramas desse tamanho atendam às suas necessidades, afinal. De qualquer forma, você pode entrar em contato com o webmaster (eu) sobre como adaptar a ferramenta às suas necessidades específicas.
DrCapablasker
Como escrevi no meu comentário anterior, posso fornecer a ferramenta que você precisa. Estou pensando em criar um diagrama SVG a partir de arquivos SVG individuais para cada peça. Você começou uma recompensa sem entrar em contato comigo, como sugeri.
DrCapablasker
Você considerou o pacote de látex "skak": link ? Pode pegar diretamente uma string FEN.
U. Hjort

Respostas:

11

Como thb apontou, você precisa de vetores. Sugiro que você use um python-xadrez para gerar imagens vetoriais SVG.

Pré-requisitos:

  1. Python 2.6+ ou 3.3+
  2. Xadrez-Python :
    • Instale o formulário pypi usando pip:pip install python-chess[uci,gaviota]

Criando um script

Como você pode precisar gerar vários SVGs, vamos criar um script. Portanto, você pode usar o script para gerar vários tabuleiros de xadrez facilmente. O seguinte está escrito em Python 3.x. Crie um script Python, FENtoSVG.py, por exemplo. Insira o seguinte código:

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()

Se você estiver no linux, inicie o script com #!/usr/bin/env python3.

Uso

Agora, este é um script muito simples, se você conhece python, mas quero mantê-lo simples para quem não codifica. Para usar o script, abra o CMD / Terminal onde você salvou o script. Em seguida, use o seguinte:

./FENtoSVG.py "examplefen" "morefen"

Digamos que eu queira dois SVGs para a FEN "8/8/8/8/4N3/8/8/8 w - - 0 1"e "8/8/8/8/4Q3/8/8/8 w - - 0 1" , digito :

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

Isso criaria dois arquivos: 88884N3888 w - - 0 1.SVGe88884Q3888 w - - 0 1.SVG

Eu sugiro python-xadrez por causa das personalizações que podem ser feitas facilmente no diagrama usando funções internas. Também está bem documentado.

MrFregg
fonte
Parabéns pela recomendação clara, fácil de usar e abrangente, @Fluxenein. Estou analisando essa abordagem para minhas necessidades de publicação. Bem-vindo à comunidade!
Jaxter
Obrigado! Ainda é uma tarefa tediosa para mim, então provavelmente continuarei atualizando até encontrar / encontrar uma solução rápida o suficiente para minhas necessidades.
MrFregg 01/10/19
Concedendo a recompensa por ser o melhor até agora, mas temos um caminho a percorrer para algo bem integrado ao processamento de texto.
Andrew Lazarus
ótimas dicas sobre uma ótima biblioteca. existe um exemplo de especificação de flechas para a última jogada ou o estilo do tabuleiro? para esclarecer - procurando fazê-lo não via ./FENtoSVG.py, mas sim no meu próprio script via python-xadrez.
315 Joe
3

Um formato vetorial seria adequado.

Como você deve saber, um formato vetorial representa o gráfico não como um bitmap, mas geometricamente, como uma descrição matemática que pode ser renderizada em qualquer escala.

Para exibição na web, você pode usar o formato SVG. Aqui estão algumas peças de xadrez no formato SVG. (Se você seguir o link, para cada jogo de xadrez, clique em "arquivo original (arquivo SVG)." Até clicar, tudo o que você obterá será uma aproximação PNG de bitmap ao SVG. Você deseja o SVG real.)

Para exibição em PDF, o TeX possui vários pacotes que você pode usar. Aqui está uma lista. (Isso é conveniente apenas se você estiver familiarizado com o TeX ou LaTeX; mas os diagramas resultantes são bons. Por exemplo, consulte a página 4 deste exemplo em PDF no estilo Skak. Além disso, acredito que a página 4 deste exemplo em PDF mostre o estilo Schwalbe-xadrez, que você pode preferir, embora sua documentação pareça toda em alemão. Todos eles são de código aberto, pelo menos.)

thb
fonte
1
Eu acho que os diagramas no seu último exemplo (harmonia) são de baixa qualidade. Os quadrados brancos usam muito pouco espaço horizontal, portanto ficam muito à esquerda, deixando grandes lacunas entre o arquivo h e a borda da placa. Esses diagramas parecem para mim como se tivessem sido feitos com o pacote "diagramas de problemas de xadrez" do LaTeX, disponível em ctan.org/tex-archive/macros/latex/contrib/… . Os diagramas que fiz usando esse pacote têm o mesmo bug.
Rosie F
3

Minha solução foi usar uma fonte de xadrez como Chess Merida ou Chess Cases .

Com essa fonte, por exemplo, a posição inicial é escrita assim:

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

E (supondo que a altura da linha esteja definida como a altura da fonte), fica assim (Aqui usando o Chess Merida como fonte):

insira a descrição da imagem aqui

Então, eu escrevi este script Python que converte de fen para este formato. Chame esse script (assumindo que você o nomeou fen2diag.py ) python fen2diag.py "<the fen>"e ele imprime a sequência do diagrama.

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))

Essas fontes do diagrama também suportam quadrados marcados com pontos ou estrelas, outro tipo de borda, cantos arredondados, números / letras nas bordas esquerda / inferior, indicando as linhas / colunas. Eu não incluí isso no script. Sinta-se livre para atualizar meu código.

O Chessbase também criou uma família de fontes (começando com 'DiagramTT ...') que suporta ainda mais coisas (como peças giradas em 180 °), mas essa fonte mapeia as coisas para diferentes pontos de código, também para quadrados pretos duas letras são usadas, uma para o fundo e um para a peça.

Nils
fonte