Oprogramowanie diagramów wysokiej jakości (nie bitmapowych)

14

Szukam oprogramowania, które nie może wziąć FEN i wygenerować diagram wysokiej jakości , w formacie PDF, Postscript, metapliku Windows lub czegoś innego, co będzie wyglądać dobrze przy rozdzielczości 1200 x 1200 dpi lub lepszej. Myślałem, że różne silniki szachowe to zrobią, ale ich diagramy są bitmapami (o ile wiem) i wyglądają jak śmieci, gdy dowolnie zmieni się rozmiar. Ponadto ich eksportu publikacji nie można edytować w żadnym standardowym formacie AFAICT.

Gotowość do zapłaty.

Andrew Lazarus
źródło
Sprawdź apronus.com/chess/diagram/editor/… - Być może jednak tak duże diagramy spełnią twoje potrzeby. W każdym razie możesz skontaktować się z webmasterem (mną) w sprawie dostosowania narzędzia do twoich konkretnych potrzeb.
DrCapablasker,
Tak jak napisałem w poprzednim komentarzu, mogę dostarczyć narzędzie, którego potrzebujesz. Zastanawiam się nad stworzeniem diagramu SVG z poszczególnych plików SVG dla każdego kawałka. Rozpocząłeś nagrodę bez kontaktu ze mną, jak sugerowałem.
DrCapablasker 28.09.16
Czy zastanawiałeś się nad pakietem lateksowym „skak”: link ? Może bezpośrednio pobrać ciąg FEN.
U. Hjort,

Odpowiedzi:

11

Jak wskazano, potrzebujesz wektorów. Sugeruję użycie szachów szachowych do generowania obrazów wektorowych SVG.

Wymagania wstępne:

  1. Python 2.6+ lub 3.3+
  2. Szachy Python :
    • Zainstaluj formularz pypi przy użyciu pip:pip install python-chess[uci,gaviota]

Tworzenie skryptu

Ponieważ może być konieczne wygenerowanie wielu plików SVG, utwórzmy skrypt. Możesz więc użyć skryptu, aby łatwo wygenerować wiele szachownic. W Pythonie 3.x napisano poniżej. Utwórz na przykład skrypt w języku Python, FENtoSVG.py. Wstaw następujący kod:

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

Jeśli korzystasz z systemu Linux, uruchom skrypt za pomocą #!/usr/bin/env python3.

Stosowanie

To jest bardzo prosty skrypt, jeśli znasz Pythona, ale chcę, aby był prosty dla tych, którzy nie kodują. Aby użyć skryptu, otwórz CMD / Terminal, w którym zapisałeś skrypt. Następnie użyj następującego polecenia:

./FENtoSVG.py "examplefen" "morefen"

Powiedzmy, że chcę dwóch plików SVG dla FEN "8/8/8/8/4N3/8/8/8 w - - 0 1"i "8/8/8/8/4Q3/8/8/8 w - - 0 1" chciałbym wprowadzić:

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

Spowoduje to utworzenie dwóch plików: 88884N3888 w - - 0 1.SVGi88884Q3888 w - - 0 1.SVG

Sugeruję szachy python ze względu na dostosowania, które można łatwo wprowadzić do diagramu za pomocą wbudowanych funkcji. Jest również dobrze udokumentowany.

MrFregg
źródło
Gratulujemy jasnej, łatwej w użyciu i kompleksowej rekomendacji @Fluxenein. Przyjmuję to podejście do moich potrzeb wydawniczych. Witamy w społeczności!
jaxter
Dzięki! To wciąż jest dla mnie dość żmudne zadanie, więc prawdopodobnie będę aktualizować, dopóki nie znajdę wystarczająco szybkiego rozwiązania dla moich potrzeb.
MrFregg
Przyznawanie nagrody, ponieważ jest to jak dotąd najlepsza, ale mamy sposoby, aby wybrać coś dobrze zintegrowanego z edytorem tekstu.
Andrew Lazarus
świetne wskazówki na temat wspaniałej biblioteki. czy istnieje przykład określania strzałek dla ostatniego ruchu lub styl planszy? dla wyjaśnienia - szukam tego nie poprzez ./FENtoSVG.py, ale raczej we własnym skrypcie poprzez python-szachy.
Joe
3

Vector format będzie pasował.

Jak zapewne wiesz, format wektorowy reprezentuje grafikę nie jako mapę bitową, ale geometrycznie, jako opis matematyczny, który można renderować w dowolnej skali.

Do wyświetlania w Internecie można użyć formatu SVG. Oto niektórzy szachy w formacie SVG. (Jeśli podążysz za linkiem, dla każdego szachisty klikniesz „oryginalny plik (plik SVG).” Do momentu kliknięcia wszystko, co otrzymasz, to mapowanie bitowe, zbliżenie PNG do SVG. Chcesz prawdziwego SVG.)

Do wyświetlania plików PDF TeX ma kilka pakietów, których możesz użyć. Oto lista. (Jest to wygodne tylko, jeśli znasz TeX lub LaTeX; ale powstałe diagramy są dobre. Na przykład zobacz str. 4 tego przykładu PDF w stylu Skak. Ponadto uważam, że str. 4 tego przykładu PDF pokazuje styl Schwalbe-szachy, który możesz preferować, choć jego dokumentacja wydaje się być w całości w języku niemieckim. W każdym razie są to programy typu open source.)

thb
źródło
1
Myślę, że diagramy w twoim ostatnim przykładzie (harmonie) są niskiej jakości. Białe kwadraty zajmują zbyt mało miejsca w poziomie, więc są zbyt daleko w lewo, pozostawiając duże odstępy między plikiem h a krawędzią płytki. Te diagramy wyglądają na mnie, jakby zostały wykonane z pakietu LaTeX „szachy-problemy-diagramy”, który jest dostępny na stronie ctan.org/tex-archive/macros/latex/contrib/… . Diagramy, które utworzyłem przy użyciu tego pakietu, zawierają ten sam błąd.
Rosie F,
3

Moim rozwiązaniem było użycie czcionki szachowej, takiej jak Chess Merida lub Chess Cases .

Na przykład z taką czcionką pozycja początkowa jest zapisana w następujący sposób:

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

I (zakładając, że wysokość linii jest ustawiona na wysokość czcionki) wygląda to tak (Tutaj przy użyciu Chess Merida jako czcionki):

wprowadź opis zdjęcia tutaj

Więc napisałem ten skrypt Pythona, który konwertuje z fen do tego formatu. Wywołaj ten skrypt (zakładając, że nazwałeś go fen2diag.py ) za pomocą python fen2diag.py "<the fen>"i wyświetli on ciąg diagramu.

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

Te czcionki diagramów obsługują również kwadraty oznaczone kropkami lub gwiazdkami, inny rodzaj obramowania, okrągłe rogi obramowania, cyfry / litery na lewym / dolnym obramowaniu oznaczające wiersze / kolumny. Nie zawarłem tego w skrypcie. Zaktualizuj mój kod.

Chessbase stworzył także rodzinę czcionek (zaczynającą się od „DiagramTT ...”), która obsługuje jeszcze więcej rzeczy (np. Elementy obrócone o 180 °), ale ta czcionka odwzorowuje różne punkty kodowe, również w przypadku czarnych kwadratów pobierane są dwie litery, jedna za tło i jeden za utwór.

Nils
źródło