ซอฟต์แวร์ไดอะแกรมคุณภาพสูง (ไม่ใช่บิตแมป)


14

ฉันกำลังมองหาซอฟต์แวร์มากกว่าที่จะใช้ FEN และสร้างไดอะแกรมคุณภาพสูงในรูปแบบ PDF, Postscript, Windows metafile หรืออย่างอื่นที่ดูดีที่ 1200x1200 dpi หรือดีกว่า ฉันคิดว่าเครื่องมือหมากรุกต่างๆจะทำเช่นนั้น แต่ไดอะแกรมของพวกเขาเป็นบิตแมปทั้งหมด (เท่าที่ฉันจะบอกได้) และดูเหมือนขยะเมื่อปรับขนาดโดยพลการ นอกจากนี้การส่งออกสิ่งพิมพ์ของตนเองไม่สามารถแก้ไขได้ในทุกมาตรฐาน AFAICT

ยินดีจ่าย


ตรวจสอบapronus.com/chess/diagram/editor/ … - ไดอะแกรมขนาดใหญ่นี้อาจตอบสนองความต้องการของคุณ ไม่ว่าในกรณีใดคุณสามารถติดต่อผู้ดูแลเว็บ (ฉัน) เกี่ยวกับการปรับแต่งเครื่องมือตามความต้องการเฉพาะของคุณ
DrCapablasker

เช่นเดียวกับที่ฉันเขียนในความคิดเห็นก่อนหน้าของฉันฉันสามารถจัดหาเครื่องมือที่คุณต้องการ ฉันกำลังคิดที่จะสร้างแผนภาพ SVG จากไฟล์ SVG แต่ละไฟล์สำหรับแต่ละชิ้น คุณได้รับค่าหัวโดยไม่ติดต่อฉันอย่างที่ฉันแนะนำ
DrCapablasker

คุณได้พิจารณาแพคเกจลาเท็กซ์ "skak": ลิงก์หรือไม่ มันสามารถใช้สตริง FEN โดยตรง
คุณ Hjort

คำตอบ:


11

คุณต้องการเวกเตอร์ ฉันแนะนำให้คุณใช้ python-Chess เพื่อสร้างภาพเวกเตอร์ SVG

วิชาบังคับก่อน:

  1. Python 2.6+ หรือ 3.3+
  2. Python หมากรุก :
    • ติดตั้ง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()

#!/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

การมอบรางวัลเพราะนี่คือสิ่งที่ดีที่สุดจนถึงตอนนี้ แต่เรามีวิธีที่จะรวมบางสิ่งเข้ากับการประมวลผลคำ
Andrew Lazarus

เคล็ดลับที่ดีเกี่ยวกับห้องสมุดที่ดี มีตัวอย่างของการระบุลูกศรสำหรับการย้ายครั้งล่าสุดหรือสไตล์ของบอร์ดหรือไม่? เพื่อความกระจ่าง - กำลังมองหาที่จะไม่ผ่าน. /FtotoVG.py แต่ใช้สคริปต์ของตัวเองผ่าน python-Chess
Joe

3

รูปแบบเวกเตอร์จะเหมาะกับ

อย่างที่คุณอาจทราบว่ารูปแบบเวกเตอร์แสดงถึงกราฟิกไม่ใช่บิตแมป แต่เป็นเชิงเรขาคณิตเป็นคำอธิบายทางคณิตศาสตร์ที่สามารถแสดงผลในระดับใดก็ได้

สำหรับการแสดงผลเว็บคุณสามารถใช้รูปแบบ SVG นี่คือนักหมากรุกบางคนในรูปแบบ SVG (หากคุณไปที่ลิงก์สำหรับหมากรุกแต่ละคนคลิกผ่านไปที่ "ไฟล์ต้นฉบับ (ไฟล์ SVG)" จนกว่าคุณจะคลิกผ่านสิ่งที่คุณจะได้รับคือบิตแมปการประมาณ PNG ไปยัง SVG คุณต้องการ SVG จริง)

สำหรับการแสดง PDF, TeX มีหลายแพ็คเกจที่คุณสามารถใช้ได้ นี่คือรายการ (วิธีนี้จะสะดวกก็ต่อเมื่อคุณคุ้นเคยกับ TeX หรือ LaTeX แต่ไดอะแกรมผลลัพธ์นั้นดีตัวอย่างเช่นดูหน้า 4 ของตัวอย่าง PDF นี้ในสไตล์ Skak นอกจากนี้ฉันเชื่อว่าหน้า 4 ของตัวอย่าง PDF นี้แสดง สไตล์ Schwalbe-Chess ซึ่งคุณอาจชอบแม้ว่าเอกสารของมันจะเป็นภาษาเยอรมันทั้งหมดนี้เป็นโอเพ่นซอร์สไม่ว่าจะด้วยวิธีใดก็ตาม)


1
ฉันคิดว่าแผนภาพในตัวอย่างสุดท้ายของคุณ (Harmonie) มีคุณภาพต่ำ สี่เหลี่ยมสีขาวใช้พื้นที่แนวนอนน้อยเกินไปดังนั้นมันจึงอยู่ทางด้านซ้ายมากเกินไปทำให้เกิดช่องว่างขนาดใหญ่ระหว่างไฟล์ h กับขอบบอร์ด แผนภาพเหล่านั้นมองไปที่ฉันเป็นถ้าพวกเขาทำกับแพคเกจน้ำยาง "หมากรุกปัญหาแผนภาพ" ซึ่งสามารถใช้ได้ที่ctan.org/tex-archive/macros/latex/contrib/... ไดอะแกรมที่ฉันสร้างขึ้นโดยใช้แพ็คเกจนั้นมีจุดบกพร่องเดียวกัน
Rosie F

3

วิธีการแก้ปัญหาของฉันได้รับที่จะใช้ตัวอักษรเช่นหมากรุกหมากรุก Meridaหรือหมากรุกกรณี

ด้วยแบบอักษรเช่นตำแหน่งเริ่มต้นจะถูกเขียนดังนี้:

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

และ (สมมติว่า line-height ถูกตั้งค่าเป็นความสูงของแบบอักษร) ดูเหมือนว่านี้ (ที่นี่ใช้Chess Meridaเป็นแบบอักษร):

ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นฉันจึงเขียนสคริปต์ Python นี้ซึ่งแปลงจาก fen เป็นรูปแบบนี้ เรียกสคริปต์นี้ (สมมติว่าคุณชื่อ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))

แบบอักษรไดอะแกรมเหล่านี้ยังสนับสนุนสี่เหลี่ยมที่ทำเครื่องหมายด้วยจุดหรือดาวเส้นขอบอีกประเภทหนึ่ง ฉันไม่ได้รวมสิ่งนี้ไว้ในสคริปต์ โปรดอัปเดตโค้ดของฉัน

Chessbase ได้สร้างตระกูลตัวอักษร (เริ่มต้นด้วย 'DiagramTT ... ') ซึ่งรองรับสิ่งต่าง ๆ ได้มากขึ้น (เช่นชิ้นส่วนหันหลัง 180 °) แต่ตัวอักษรนี้แมปสิ่งต่าง ๆ ไปยังจุดรหัสที่แตกต่างกันเช่นสำหรับสี่เหลี่ยมสีดำสองตัวอักษร สำหรับพื้นหลังและอีกอันสำหรับชิ้นงาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.