Software de diagrama de alta calidad (no mapa de bits)

14

Estoy buscando un software que pueda tomar FEN y generar un diagrama de alta calidad , en PDF, PostScript, metarchivo de Windows u otra cosa que se vea bien a 1200x1200 ppp o mejor. Pensé que los diversos motores de ajedrez lo harían, pero sus diagramas son todos mapas de bits (por lo que puedo decir) y parecen basura cuando cambian de tamaño arbitrariamente. Además, su propia exportación de publicaciones no se puede editar en nada estándar, AFAICT.

Dispuesto a pagar.

Andrew Lazarus
fuente
Visite apronus.com/chess/diagram/editor/… - Quizás los diagramas tan grandes satisfagan sus necesidades después de todo. En cualquier caso, puede ponerse en contacto con el webmaster (yo) para adaptar la herramienta a sus necesidades específicas.
DrCapablasker
Como escribí en mi comentario anterior, puedo proporcionarle la herramienta que necesita. Estoy pensando en crear un diagrama SVG a partir de archivos SVG individuales para cada pieza. Has comenzado una recompensa sin contactarme como sugerí.
DrCapablasker
¿Ha considerado el paquete de látex "skak": enlace ? Puede tomar directamente una cadena FEN.
U. Hjort

Respuestas:

11

Como señaló THB, necesitas vectores. Le sugiero que use un python-chess para generar imágenes vectoriales SVG.

Prerrequisitos:

  1. Python 2.6+ o 3.3+
  2. Python-ajedrez :
    • Instale el formulario pypi usando pip:pip install python-chess[uci,gaviota]

Crear un guión

Como es posible que deba generar múltiples SVG, creemos un script. Por lo tanto, puede usar el script para generar múltiples tableros de ajedrez fácilmente. Lo siguiente está escrito en Python 3.x. Cree un script de Python, FENtoSVG.py, por ejemplo. Inserte el siguiente 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()

Si está en Linux, comience el script con #!/usr/bin/env python3.

Uso

Ahora, este es un script muy simple si conoces Python pero quiero que sea simple para aquellos que no codifican. Para usar el script, abra CMD / Terminal donde guardó el script. Luego, use lo siguiente:

./FENtoSVG.py "examplefen" "morefen"

Digamos que quiero dos SVG para el FEN "8/8/8/8/4N3/8/8/8 w - - 0 1"y "8/8/8/8/4Q3/8/8/8 w - - 0 1" , ingresaría:

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

Esto crearía dos archivos: 88884N3888 w - - 0 1.SVGy88884Q3888 w - - 0 1.SVG

Sugiero python-chess debido a las personalizaciones que se pueden hacer fácilmente en el diagrama utilizando funciones integradas. También está bien documentado.

MrFregg
fuente
Felicidades por la recomendación clara, fácil de usar e integral, @Fluxenein. Estoy analizando este enfoque para mis necesidades de publicación. ¡Bienvenido a la comunidad!
jaxter
¡Gracias! Todavía es una tarea bastante tediosa para mí, así que probablemente seguiré actualizando hasta que encuentre / encuentre una solución lo suficientemente rápida para mis necesidades también.
MrFregg
Otorgar la recompensa porque este es el mejor hasta ahora, pero tenemos formas de lograr algo bien integrado con el procesamiento de textos.
Andrew Lazarus
excelentes consejos sobre una gran biblioteca. ¿Hay algún ejemplo de especificar flechas para el último movimiento o el estilo del tablero? para aclarar, buscando hacerlo no a través de ./FENtoSVG.py, sino en mi propio script a través de python-chess.
Joe
3

Un formato vectorial sería adecuado.

Como ya sabrá, un formato vectorial representa el gráfico no como un mapa de bits sino geométricamente, como una descripción matemática que se puede representar a cualquier escala.

Para la visualización web, puede usar el formato SVG. Aquí hay algunos ajedrecistas en formato SVG. (Si sigue el enlace, para cada pieza de ajedrez, haga clic en "archivo original (archivo SVG)". Hasta que haga clic, todo lo que obtendrá será una aproximación PNG de mapa de bits al SVG. Desea el SVG real).

Para la visualización de PDF, TeX tiene varios paquetes que puede usar. Aquí hay una lista. (Esto es conveniente solo si está familiarizado con TeX o LaTeX; pero los diagramas resultantes son buenos. Por ejemplo, vea la página 4 de este ejemplo PDF en el estilo Skak. Además, creo que la página 4 de este ejemplo PDF muestra el estilo Schwalbe-ajedrez, que es posible que prefiera, aunque su documentación parece estar en alemán. Todos estos son de código abierto, en cualquier caso).

thb
fuente
1
Creo que los diagramas en su último ejemplo (armonía) son de baja calidad. Los cuadrados blancos usan muy poco espacio horizontal, por lo que están demasiado a la izquierda, dejando grandes espacios entre la h-file y el borde del tablero. Esos diagramas me parecen como si estuvieran hechos con el paquete LaTeX "chess-problem-diagrams", que está disponible en ctan.org/tex-archive/macros/latex/contrib/… . Los diagramas que hice usando ese paquete tienen el mismo error.
Rosie F
3

Mi solución ha sido usar una fuente de ajedrez como Chess Merida o Chess Cases .

Con dicha fuente, por ejemplo, la posición de inicio se escribe así:

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

Y (suponiendo que la altura de la línea se establece a la altura de la fuente) se ve así (aquí usando Chess Merida como fuente):

ingrese la descripción de la imagen aquí

Entonces escribí este script de Python que convierte de fen a este formato. Llame a este script (suponiendo que lo haya llamado fen2diag.py ) con python fen2diag.py "<the fen>"e imprime la cadena del 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))

Estas fuentes de diagrama también admiten cuadrados marcados con puntos o estrellas, otro tipo de borde, esquinas de borde redondo, números / letras en los bordes izquierdo / inferior que indican las filas / columnas. No he incluido esto en el guión. Siéntase libre de actualizar mi código.

Chessbase también ha creado una familia de fuentes (comenzando con 'DiagramTT ...') que admite incluso más cosas (como piezas giradas 180 °) pero esta fuente asigna cosas a diferentes puntos de código, también para cuadrados negros se toman dos letras, una para el fondo y uno para la pieza.

Nils
fuente