Hochwertige (nicht Bitmap-) Diagrammsoftware

14

Ich bin auf der Suche nach Software, mit der FEN ein qualitativ hochwertiges Diagramm in PDF, Postscript, Windows-Metadatei oder etwas anderem mit einer Auflösung von 1200 x 1200 dpi oder besser erstellen kann. Ich dachte, die verschiedenen Schachengines würden es schaffen, aber ihre Diagramme sind alle Bitmaps (soweit ich das beurteilen kann) und sehen wie Müll aus, wenn die Größe willkürlich geändert wird. Außerdem kann der eigene Publishing-Export in AFAICT (Standard) nicht bearbeitet werden.

Bereit zu zahlen.

Andrew Lazarus
quelle
Sehen Sie sich apronus.com/chess/diagram/editor/… an - Vielleicht werden Diagramme, die so groß sind, Ihren Anforderungen doch gerecht. In jedem Fall können Sie sich an den Webmaster (mich) wenden, um das Tool an Ihre spezifischen Bedürfnisse anzupassen.
DrCapablasker
Wie ich in meinem vorherigen Kommentar geschrieben habe, kann ich das benötigte Tool bereitstellen. Ich denke darüber nach, ein SVG-Diagramm aus einzelnen SVG-Dateien für jedes Stück zu erstellen. Sie haben ein Kopfgeld angefangen, ohne mich zu kontaktieren, wie ich vorgeschlagen habe.
DrCapablasker
Hast du dir das Latex-Paket "skak" überlegt: link ? Es kann direkt ein FEN-String aufgenommen werden.
U. Hjort

Antworten:

11

Wie bereits erwähnt, benötigen Sie Vektoren. Ich schlage vor, Sie verwenden ein Python-Schach, um SVG-Vektorbilder zu generieren.

Voraussetzungen:

  1. Python 2.6+ oder 3.3+
  2. Python-Schach :
    • Installieren Sie form pypi mit pip:pip install python-chess[uci,gaviota]

Ein Skript erstellen

Da Sie möglicherweise mehrere SVGs generieren müssen, erstellen wir ein Skript. Sie können das Skript also verwenden, um auf einfache Weise mehrere Schachbretter zu generieren. Das Folgende ist in Python 3.x geschrieben. Erstellen Sie ein Python-Skript, beispielsweise FENtoSVG.py. Fügen Sie den folgenden Code ein:

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

Wenn Sie unter Linux arbeiten, starten Sie das Skript mit #!/usr/bin/env python3.

Verwendung

Nun, dies ist ein sehr einfaches Skript, wenn Sie Python kennen, aber ich möchte es für diejenigen, die nicht codieren, einfach halten. Um das Skript zu verwenden, öffnen Sie CMD / Terminal, in dem Sie das Skript gespeichert haben. Verwenden Sie dann wie folgt:

./FENtoSVG.py "examplefen" "morefen"

Angenommen, ich möchte zwei SVGs für die FEN "8/8/8/8/4N3/8/8/8 w - - 0 1"und "8/8/8/8/4Q3/8/8/8 w - - 0 1" würde Folgendes eingeben:

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

Dies würde zwei Dateien erzeugen: 88884N3888 w - - 0 1.SVGund88884Q3888 w - - 0 1.SVG

Ich empfehle Python-Schach wegen der Anpassungen, die mit den eingebauten Funktionen leicht am Diagramm vorgenommen werden können. Es ist auch gut dokumentiert.

MrFregg
quelle
Herzlichen Glückwunsch zu der klaren, benutzerfreundlichen und umfassenden Empfehlung @Fluxenein. Ich sehe mir diesen Ansatz für meine Publishing-Anforderungen an. Willkommen in der Community!
Jaxter
Vielen Dank! Es ist immer noch eine ziemlich mühsame Aufgabe für mich, daher werde ich wahrscheinlich so lange aktualisieren, bis ich eine ausreichend schnelle Lösung für meine Bedürfnisse gefunden habe.
MrFregg
Die Prämie zuerkennen, weil dies die bisher beste ist, aber wir haben noch einiges zu tun, um eine gute Integration in die Textverarbeitung zu erreichen.
Andrew Lazarus
tolle tipps zu einer tollen bibliothek. Gibt es ein Beispiel für die Angabe von Pfeilen für den letzten Zug oder den Stil der Tafel? zur klärung - suche es nicht via ./FENtoSVG.py, sondern in meinem eigenen script via python-chess.
Joe
3

Ein Vektorformat würde passen.

Wie Sie vielleicht wissen, stellt ein Vektorformat eine Grafik nicht als Bitmap, sondern geometrisch dar, als mathematische Beschreibung, die in jedem Maßstab wiedergegeben werden kann.

Für die Webanzeige können Sie das SVG-Format verwenden. Hier sind einige Schachfiguren im SVG-Format. (Wenn Sie dem Link folgen, klicken Sie sich für jeden Schachspieler bis zur "Originaldatei (SVG-Datei)" durch. Bis Sie durchklicken, erhalten Sie nur eine Bitmap-PNG-Annäherung an die SVG. Sie möchten die echte SVG.)

Für die PDF-Anzeige stehen in TeX mehrere Pakete zur Verfügung. Hier ist eine Liste. (Dies ist nur dann praktisch, wenn Sie mit TeX oder LaTeX vertraut sind. Die sich ergebenden Diagramme sind jedoch gut. Siehe z. B. S. 4 dieses PDF-Beispiels im Skak-Stil. Ich bin außerdem der Meinung, dass S. 4 dieses PDF-Beispiels dies zeigt der Schwalbe-Schachstil, den Sie vielleicht bevorzugen, obwohl die Dokumentation allesamt in Deutsch zu sein scheint. All dies sind auf jeden Fall Open Source.)

thb
quelle
1
Ich denke, die Diagramme in Ihrem letzten Beispiel (Harmonie) sind von geringer Qualität. Weiße Quadrate belegen zu wenig horizontalen Raum, sodass sie zu weit links liegen und große Lücken zwischen der H-Feile und der Brettkante lassen. Diese Diagramme sehen für mich so aus, als wären sie mit dem LaTeX-Paket "chess-problem-diagrams" erstellt worden, das unter ctan.org/tex-archive/macros/latex/contrib/… verfügbar ist . Die Diagramme, die ich mit diesem Paket erstellt habe, haben denselben Fehler.
Rosie F
3

Meine Lösung bestand darin, eine Schachschrift wie Chess Merida oder Chess Cases zu verwenden .

Mit einer solchen Schriftart wird beispielsweise die Startposition folgendermaßen geschrieben:

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

Und (unter der Annahme, dass die Zeilenhöhe auf die Höhe der Schriftart festgelegt ist) sieht es so aus (hier mit Chess Merida als Schriftart):

Bildbeschreibung hier eingeben

Also habe ich dieses Python-Skript geschrieben, das von fen in dieses Format konvertiert. Rufen Sie dieses Skript mit (vorausgesetzt, Sie haben es fen2diag.py genannt ) auf, python fen2diag.py "<the fen>"und es gibt den Diagramm-String aus.

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

Diese Diagrammschriftarten unterstützen auch Quadrate, die mit Punkten oder Sternen markiert sind, eine andere Art von Rahmen, runde Rahmenecken und Zahlen / Buchstaben am linken / unteren Rand, die die Zeilen / Spalten kennzeichnen. Ich habe dies nicht in das Skript aufgenommen. Fühlen Sie sich frei, meinen Code zu aktualisieren.

Chessbase hat auch eine Schriftfamilie erstellt (beginnend mit 'DiagramTT ...'), die noch mehr Dinge unterstützt (wie um 180 ° gedrehte Teile), aber diese Schrift ordnet Dinge verschiedenen Codepunkten zu, auch für schwarze Quadrate werden zwei Buchstaben verwendet, einer für den Hintergrund und eine für das Stück.

Nils
quelle