Якісне (не растрове) програмне забезпечення для діаграм


14

Я шукаю програмне забезпечення, ніж може взяти FEN і створити високоякісну діаграму, у форматі PDF, Postscript, метафайлі Windows, або щось інше, що буде добре виглядати у 1200x1200 dpi або вище. Я думав, що це роблять різні шахові двигуни, але їхні діаграми - це все растрові карти (наскільки я можу сказати) і виглядають як сміття, коли змінюються довільно. Крім того, власний експорт видавництва не може бути відредагований нічим стандартним, AFAICT.

Готовий платити.


Ознайомтеся з apronus.com/chess/diagram/editor/… - Можливо, діаграми такого великого розміру все-таки відповідатимуть вашим потребам. У будь-якому випадку ви можете зв’язатися з веб-майстром (мною) щодо адаптації інструменту до ваших конкретних потреб.
DrCapablasker

Як я писав у своєму попередньому коментарі, я можу поставити потрібний вам інструмент. Я думаю створити SVG-діаграму з окремих файлів SVG для кожного фрагмента. Ви почали щедро, не зв’язуючись зі мною, як я запропонував.
DrCapablasker

Ви розглядали пакет латексу "skak": посилання ? Він може безпосередньо приймати рядок FEN.
U. Hjort

Відповіді:


11

Як вказував thb, вам потрібні вектори. Я пропоную вам використовувати пітон-шахи для створення векторних зображень SVG.

Передумови:

  1. Python 2.6+ або 3.3+
  2. Пітон-шахи :
    • Встановіть форму pypi за допомогою pip:pip install python-chess[uci,gaviota]

Створення сценарію

Оскільки вам може знадобитися генерація декількох SVG, давайте створимо сценарій. Отже, ви можете використовувати сценарій, щоб легко створити кілька шахових дощок. Далі написано в Python 3.x. Створіть сценарій Python, наприклад FENtoSVG.py. Вставте наступний код:

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

Якщо ви користуєтесь Linux, запустіть скрипт із #!/usr/bin/env python3.

Використання

Тепер це дуже простий сценарій, якщо ви знаєте python, але я хочу зробити його простим для тих, хто не кодує. Щоб використовувати скрипт, відкрийте CMD / Terminal, де ви зберегли сценарій. Потім використовуйте наступне:

./FENtoSVG.py "examplefen" "morefen"

Скажіть, що я хочу два SVG для FEN, "8/8/8/8/4N3/8/8/8 w - - 0 1"і "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"

Це створило б два файли: 88884N3888 w - - 0 1.SVGі88884Q3888 w - - 0 1.SVG

Я пропоную python-chess через налаштування, які можна легко внести до діаграми за допомогою вбудованих функцій. Це також добре задокументовано.


Вітаю за чітку, просту у використанні та вичерпну рекомендацію @Fluxenein. Я розглядаю цей підхід для моїх видавничих потреб. Ласкаво просимо до громади!
jaxter

Спасибі! Для мене це все ще досить втомлива задача, тому я, мабуть, продовжуватимуть оновлюватись, поки я не знайду / знайду досить швидке рішення для своїх потреб.
MrFregg

Нагородження винагороди за те, що це найкраще до цих пір, але у нас є способи вирішити щось добре інтегроване з текстовою обробкою.
Андрій Лазар

чудові поради щодо чудової бібліотеки. чи є приклад вказівки стрілок для останнього ходу чи стилю дошки? щоб уточнити - прагну зробити це не через ./FENtoSVG.py, а скоріше за власним сценарієм через python-chess.
Джо

3

Підходить векторний формат .

Як ви можете знати, векторний формат представляє графіку не як растрову карту, а геометрично, як математичний опис, який може бути відображений у будь-якому масштабі.

Для веб-відображення можна використовувати формат SVG. Ось кілька шахістів у форматі SVG. (Якщо ви перейдете за посиланням, для кожного шаховика натисніть "оригінальний файл (файл SVG)". Поки ви не натиснете, все, що ви отримаєте, це растрове зображення, наближення PNG до SVG. Ви хочете справжнього SVG.

Для відображення PDF у TeX є кілька пакетів, які ви можете використовувати. Ось список. (Це зручно, лише якщо ви знайомі з TeX або LaTeX; але отримані діаграми хороші. Наприклад, див. П. 4 цього прикладу PDF у стилі Скака. Більше того, я вважаю, що на п. 4 цього прикладу PDF показано шаховий стиль Швальбе, який ви можете віддати перевагу, хоча його документація, здається, є всіма німецькою мовою. Все це є відкритим кодом, у будь-якому разі.)


1
Я думаю, що діаграми у вашому останньому прикладі (гармонія) низької якості. Білі квадрати використовують занадто мало горизонтального простору, тому вони знаходяться занадто далеко зліва, залишаючи великі зазори між h-файлом та краєм дошки. Ці діаграми на мене виглядають так, ніби вони були зроблені за допомогою пакету LaTeX "шахові проблеми-діаграми", який доступний за адресою ctan.org/tex-archive/macros/latex/contrib/… . Діаграми, які я робив за допомогою цього пакета, мають таку саму помилку.
Розі Ф

3

Моє рішення полягало у використанні шахового шрифту на зразок Chess Merida або Chess Cases .

Наприклад, з таким шрифтом стартове положення записується так:

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

І (якщо припустити, що висота рядка встановлена ​​у висоту шрифту), це виглядає приблизно так (Тут із використанням шрифту Merida Merida в якості шрифту):

введіть тут опис зображення

Тому я написав цей скрипт Python, який перетворює з фен в цей формат. Викличте цей скрипт (припускаючи, що ви його назвали fen2diag.py ) за допомогою, python fen2diag.py "<the fen>"і він надрукує рядок діаграми.

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

Ці шрифти Diagram також підтримують квадрати, позначені крапками або зірками, інший тип облямівки, круглі кути кордону, цифри / літери на лівій / нижній межі, що позначають рядки / стовпці. Я не включив це до сценарію. Не соромтеся оновити свій код.

Chessbase також створила сімейство шрифтів (починаючи з "DiagramTT ..."), яка підтримує ще більше матеріалів (наприклад, шматки, повернені на 180 °), але цей шрифт відображає речі в різні кодові точки, також для чорних квадратів приймаються дві літери, одна для фону та одного для фрагмента.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.