Logiciel de diagramme de haute qualité (pas bitmap)

14

Je suis à la recherche d'un logiciel capable de prendre FEN et de générer un diagramme de haute qualité , en PDF, Postscript, métafichier Windows ou autre qui aura une belle apparence à 1200x1200 dpi ou mieux. Je pensais que les différents moteurs d'échecs le feraient, mais leurs diagrammes sont tous des bitmaps (pour autant que je sache) et ressemblent à des ordures lorsqu'ils sont redimensionnés arbitrairement. De plus, leur propre exportation de publication ne peut pas être modifiée dans quelque chose de standard, AFAICT.

Prêt à payer.

Andrew Lazarus
la source
Consultez apronus.com/chess/diagram/editor/… - Peut-être que des diagrammes de cette taille répondront à vos besoins après tout. Dans tous les cas, vous pouvez contacter le webmaster (moi) pour adapter l'outil à vos besoins spécifiques.
DrCapablasker
Comme je l'ai écrit dans mon commentaire précédent, je peux fournir l'outil dont vous avez besoin. Je pense à créer un diagramme SVG à partir de fichiers SVG individuels pour chaque pièce. Vous avez commencé une prime sans me contacter comme je l'ai suggéré.
DrCapablasker
Avez-vous considéré le package Latex "skak": lien ? Il peut prendre directement une chaîne FEN.
U. Hjort

Réponses:

11

Comme l'a souligné thb, vous avez besoin de vecteurs. Je vous suggère d'utiliser un échecs en python pour générer des images vectorielles SVG.

Conditions préalables:

  1. Python 2.6+ ou 3.3+
  2. Échecs en Python :
    • Installez le formulaire pypi à l' aide de pip:pip install python-chess[uci,gaviota]

Création d'un script

Comme vous devrez peut-être générer plusieurs SVG, créons un script. Ainsi, vous pouvez utiliser le script pour générer facilement plusieurs échiquiers. Ce qui suit est écrit en Python 3.x. Créez un script Python, FENtoSVG.py par exemple. Insérez le code suivant:

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 vous êtes sous Linux, lancez le script avec #!/usr/bin/env python3.

Usage

Maintenant, c'est un script très simple si vous connaissez python mais je veux le garder simple pour ceux qui ne codent pas. Pour utiliser le script, ouvrez CMD / Terminal où vous avez enregistré le script. Ensuite, utilisez comme suit:

./FENtoSVG.py "examplefen" "morefen"

Disons que je veux deux SVG pour le FEN "8/8/8/8/4N3/8/8/8 w - - 0 1"et j'entrerais "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"

Cela créerait deux fichiers: 88884N3888 w - - 0 1.SVGet88884Q3888 w - - 0 1.SVG

Je suggère d'échecs en python en raison des personnalisations qui peuvent être facilement apportées au diagramme à l'aide de fonctions intégrées. Il est également bien documenté.

MrFregg
la source
Félicitations pour la recommandation claire, facile à utiliser et complète, @Fluxenein. J'examine cette approche pour mes besoins d'édition. Bienvenue dans la communauté!
jaxter
Merci! C'est toujours une tâche assez fastidieuse pour moi, donc je continuerai probablement à mettre à jour jusqu'à ce que je fasse / trouve une solution assez rapide pour mes besoins aussi.
MrFregg
Attribuer la prime parce que c'est le meilleur jusqu'à présent, mais nous avons du chemin à parcourir pour quelque chose de bien intégré au traitement de texte.
Andrew Lazarus
bons conseils sur une grande bibliothèque. existe-t-il un exemple de spécification des flèches pour le dernier coup, ou le style du tableau? pour clarifier - en cherchant à le faire non pas via ./FENtoSVG.py, mais plutôt dans mon propre script via python-chess.
Joe
3

Un format vectoriel conviendrait.

Comme vous le savez peut-être, un format vectoriel représente un graphique non pas comme un bitmap mais géométriquement, comme une description mathématique qui peut être rendue à n'importe quelle échelle.

Pour l'affichage Web, vous pouvez utiliser le format SVG. Voici quelques échecs au format SVG. (Si vous suivez le lien, pour chaque joueur d'échecs, cliquez sur "fichier d'origine (fichier SVG)". Jusqu'à ce que vous cliquiez dessus, tout ce que vous obtiendrez est une approximation PNG bitmap du SVG. Vous voulez le vrai SVG.)

Pour l'affichage PDF, TeX propose plusieurs packages que vous pouvez utiliser. Voici une liste. (Ceci n'est pratique que si vous êtes familier avec TeX ou LaTeX; mais les diagrammes résultants sont bons. Par exemple, voir p. 4 de cet exemple PDF dans le style Skak. De plus, je pense que la p. 4 de cet exemple PDF montre le style d'échecs Schwalbe, que vous préférerez peut-être, bien que sa documentation semble être entièrement en allemand. Tout cela est open source, en tout cas.)

thb
la source
1
Je pense que les diagrammes de votre dernier exemple (harmonie) sont de mauvaise qualité. Les carrés blancs utilisent trop peu d'espace horizontal, ils sont donc trop loin vers la gauche, laissant de grands écarts entre le fichier h et le bord de la planche. Ces diagrammes me semblent avoir été créés avec le package LaTeX "chess-problem-diagrams", disponible sur ctan.org/tex-archive/macros/latex/contrib/… . Les diagrammes que j'ai créés en utilisant ce package ont ce même bug.
Rosie F
3

Ma solution a été d'utiliser une police d' échecs comme Chess Merida ou Chess Cases .

Avec une telle police par exemple, la position de départ est écrite comme ceci:

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

Et (en supposant que la hauteur de ligne est définie sur la hauteur de la police), cela ressemble à ceci (ici en utilisant Chess Merida comme police):

entrez la description de l'image ici

J'ai donc écrit ce script Python qui convertit de fen à ce format. Appelez ce script (en supposant que vous l'avez nommé fen2diag.py ) avec python fen2diag.py "<the fen>"et il imprime la chaîne du diagramme.

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

Ces polices de diagramme prennent également en charge les carrés marqués de points ou d'étoiles, un autre type de bordure, les coins de bordure arrondis, les chiffres / lettres sur les bordures gauche / inférieure désignant les lignes / colonnes. Je n'ai pas inclus cela dans le script. N'hésitez pas à mettre à jour mon code.

Chessbase a également créé une famille de polices (commençant par 'DiagramTT ...') qui prend en charge encore plus de choses (comme des pièces tournées de 180 °) mais cette police mappe les choses à différents points de code, également pour les carrés noirs, deux lettres sont prises, une pour le fond et un pour la pièce.

Nils
la source