Phần mềm sơ đồ chất lượng cao (không phải bitmap)


14

Tôi đang tìm kiếm phần mềm hơn là có thể lấy FEN và tạo một sơ đồ chất lượng cao , dưới dạng PDF, Postcript, siêu dữ liệu Windows hoặc một cái gì đó khác sẽ trông tốt ở 1200x1200 dpi hoặc tốt hơn. Tôi nghĩ rằng các công cụ cờ khác nhau sẽ làm điều đó, nhưng sơ đồ của chúng đều là bitmap (theo như tôi có thể nói) và trông giống như rác khi thay đổi kích thước tùy ý. Ngoài ra, xuất bản xuất bản của riêng họ không thể được chỉnh sửa theo bất kỳ tiêu chuẩn nào, AFAICT.

Sẵn sàng trả.


Hãy xem apronus.com/chess/diagram/editor/ từ - Có lẽ sơ đồ lớn này sẽ đáp ứng nhu cầu của bạn sau tất cả. Trong mọi trường hợp, bạn có thể liên hệ với quản trị trang web (tôi) về việc điều chỉnh công cụ theo nhu cầu cụ thể của bạn.
DrCapablasker

Giống như tôi đã viết trong bình luận trước đây tôi có thể cung cấp công cụ mà bạn cần. Tôi đang nghĩ đến việc tạo một sơ đồ SVG từ các tệp SVG riêng lẻ cho mỗi phần. Bạn đã bắt đầu một tiền thưởng mà không liên lạc với tôi như tôi đề nghị.
DrCapablasker

Bạn đã xem xét gói "skak": liên kết chưa? Nó có thể trực tiếp lấy một chuỗi FEN.
U. Hjort

Câu trả lời:


11

Như thb đã chỉ ra, bạn cần vectơ. Tôi đề nghị bạn sử dụng một python-Chess để tạo hình ảnh vector SVG.

Điều kiện tiên quyết:

  1. Python 2.6+ hoặc 3.3+
  2. Cờ vua :
    • Cài đặt biểu mẫu pypi bằng pip:pip install python-chess[uci,gaviota]

Tạo một kịch bản

Vì bạn có thể cần tạo nhiều SVG, hãy tạo một tập lệnh. Vì vậy, bạn có thể sử dụng tập lệnh để tạo nhiều bàn cờ dễ dàng. Sau đây được viết bằng Python 3.x. Tạo tập lệnh Python, ví dụ FENtoSVG.py. Chèn mã sau đây:

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

Nếu bạn đang dùng linux, hãy bắt đầu script với #!/usr/bin/env python3.

Sử dụng

Bây giờ, đây là một kịch bản rất đơn giản nếu bạn biết python nhưng tôi muốn giữ nó đơn giản cho những người không viết mã. Để sử dụng tập lệnh, hãy mở CMD / Terminal nơi bạn đã lưu tập lệnh. Sau đó, sử dụng như sau:

./FENtoSVG.py "examplefen" "morefen"

Nói rằng tôi muốn hai SVG cho FEN "8/8/8/8/4N3/8/8/8 w - - 0 1""8/8/8/8/4Q3/8/8/8 w - - 0 1" , tôi sẽ nhập:

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

Điều này sẽ tạo ra hai tệp: 88884N3888 w - - 0 1.SVG88884Q3888 w - - 0 1.SVG

Tôi đề nghị python-Chess vì các tùy chỉnh có thể dễ dàng thực hiện cho sơ đồ bằng các hàm dựng sẵn. Nó cũng là tài liệu tốt.


Xin chúc mừng về khuyến nghị rõ ràng, dễ sử dụng và toàn diện, @Fluxenein. Tôi đang xem xét phương pháp này cho nhu cầu xuất bản của tôi. Chào mừng đến với cộng đồng!
jaxter

Cảm ơn! Đây vẫn là một nhiệm vụ khá tẻ nhạt đối với tôi vì vậy có lẽ tôi sẽ tiếp tục cập nhật cho đến khi tôi thực hiện / tìm một giải pháp đủ nhanh cho nhu cầu của mình.
MrFregg

Trao tiền thưởng vì đây là thứ tốt nhất cho đến nay, nhưng chúng tôi có một cách để tìm kiếm thứ gì đó được tích hợp tốt với xử lý văn bản.
Andrew Lazarus

lời khuyên tuyệt vời về một thư viện tuyệt vời. Có một ví dụ về việc chỉ định mũi tên cho bước di chuyển cuối cùng, hoặc phong cách của bảng? để làm rõ - tìm cách thực hiện nó không thông qua ./FENtoSVG.py, mà là trong kịch bản của riêng tôi thông qua python-Chess.
Joe

3

Một định dạng vector sẽ phù hợp.

Như bạn có thể biết, một định dạng vector đại diện cho đồ họa không phải là bitmap mà là về mặt hình học, như một mô tả toán học có thể được hiển thị ở bất kỳ tỷ lệ nào.

Để hiển thị web, bạn có thể sử dụng định dạng SVG. Dưới đây là một số quân cờ ở định dạng SVG. (Nếu bạn theo liên kết, đối với mỗi người chơi cờ, hãy nhấp qua "tệp gốc (tệp SVG)." Cho đến khi bạn nhấp qua, tất cả những gì bạn sẽ nhận được là một bitmap, xấp xỉ PNG với SVG. Bạn muốn có SVG thực.)

Để hiển thị PDF, TeX có một số gói bạn có thể sử dụng. Đây là một danh sách. (Điều này chỉ thuận tiện nếu bạn quen thuộc với TeX hoặc LaTeX; nhưng sơ đồ kết quả là tốt. Ví dụ, xem trang 4 của ví dụ PDF này theo kiểu Skak. Hơn nữa, tôi tin rằng trang 4 của ví dụ PDF này hiển thị phong cách cờ vua Schwalbe, mà bạn có thể thích, mặc dù tài liệu của nó dường như hoàn toàn bằng tiếng Đức. Tất cả những thứ này là nguồn mở, ở bất kỳ giá nào.)


1
Tôi nghĩ rằng các sơ đồ trong ví dụ cuối cùng của bạn (hòa âm) có chất lượng thấp. Hình vuông màu trắng sử dụng quá ít không gian ngang, do đó chúng ở quá xa về bên trái, để lại những khoảng trống lớn giữa tệp h và cạnh bảng. Các sơ đồ đó nhìn vào tôi như thể chúng được tạo ra với gói "cờ-vấn đề-cờ" của gói LaTeX, có sẵn tại ctan.org/tex-archive/macros/latex/contrib/ . Các sơ đồ tôi đã thực hiện bằng cách sử dụng gói đó có cùng một lỗi.
Rosie F

3

Giải pháp của tôi là sử dụng một phông chữ cờ như Chess Merida hoặc Chess Case .

Với một phông chữ như vậy, ví dụ, vị trí bắt đầu được viết như thế này:

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

Và (giả sử chiều cao của dòng được đặt thành chiều cao của phông chữ) trông giống như thế này (Ở đây sử dụng Chess Merida làm phông chữ):

nhập mô tả hình ảnh ở đây

Vì vậy, tôi đã viết kịch bản Python này chuyển đổi từ fen sang định dạng này. Gọi tập lệnh này (giả sử bạn đặt tên cho nó là fen2diag.py ) python fen2diag.py "<the fen>"và nó in ra chuỗi sơ đồ.

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

Các phông chữ Sơ đồ này cũng hỗ trợ các ô vuông được đánh dấu bằng dấu chấm hoặc ngôi sao, một loại đường viền khác, góc viền tròn, số / chữ cái ở viền trái / đáy biểu thị các hàng / cột. Tôi đã không bao gồm điều này trong kịch bản. Hãy cập nhật mã của tôi.

Chessbase cũng đã tạo một họ phông chữ (bắt đầu bằng 'Sơ đồ ...') hỗ trợ nhiều nội dung hơn (như các mảnh được quay 180 °) nhưng phông chữ này ánh xạ mọi thứ đến các điểm mã khác nhau, cũng cho các ô vuông màu đen, hai chữ cái được lấy cho nền và một cho mảnh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.