Yüksek kaliteli (bitmap değil) diyagram yazılımı


14

PDF, Postscript, Windows meta dosyası veya 1200x1200 dpi veya daha iyi görünecek başka bir şey FEN alabilir ve yüksek kaliteli bir diyagram oluşturabilen yazılım arıyorum . Çeşitli satranç motorlarının bunu yapacağını düşündüm, ancak diyagramlarının hepsi bitmap'lerdir (anlayabildiğim kadarıyla) ve keyfi olarak yeniden boyutlandırıldığında çöp gibi görünüyorlar. Ayrıca, kendi yayın ihracatı standart bir şey olan AFAICT ile düzenlenemez.

Ödemeye gönüllü.


Apronus.com/chess/diagram/editor/… 'a göz atın - Belki de bu büyük diyagramlar sonuçta ihtiyaçlarınızı karşılayacak. Her durumda, aracı özel ihtiyaçlarınıza göre uyarlamak için web yöneticisi (ben) ile iletişime geçebilirsiniz.
DrCapablasker

Önceki yorumumda yazdığım gibi, ihtiyacınız olan aracı sağlayabilirim. Her parça için ayrı SVG dosyalarından bir SVG diyagramı oluşturmayı düşünüyorum. Önerdiğim gibi benimle iletişime geçmeden bir ödül başlattın.
DrCapablasker

Lateks paket "skak": bağlantısını düşündünüz mü? Doğrudan bir FEN dizesi alabilir.
U. Hjort

Yanıtlar:


11

Thb'nin işaret ettiği gibi, vektörlere ihtiyacınız var. SVG vektör görüntüleri oluşturmak için bir piton satrancı kullanmanızı öneririm.

Ön şartlar:

  1. Python 2.6+ veya 3.3+
  2. Python-satranç :
    • Pip kullanarak form pypi yükleyin :pip install python-chess[uci,gaviota]

Komut dosyası oluşturma

Birden fazla SVG oluşturmanız gerekebileceğinden, bir komut dosyası oluşturalım. Böylece, kolayca birden fazla satranç tahtası oluşturmak için komut dosyasını kullanabilirsiniz. Aşağıdakiler Python 3.x'de yazılmıştır. Örneğin bir Python betiği oluşturun, FENtoSVG.py. Aşağıdaki kodu ekleyin:

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'taysanız ile komut dosyasını başlatın #!/usr/bin/env python3.

kullanım

Şimdi, python biliyorsanız bu çok basit bir komut dosyasıdır, ancak kodlamayanlar için basit tutmak istiyorum. Komut dosyasını kullanmak için komut dosyasını kaydettiğiniz CMD / Terminal'i açın. Ardından, aşağıdaki gibi kullanın:

./FENtoSVG.py "examplefen" "morefen"

Diyelim ki FEN için iki SVG istiyorum "8/8/8/8/4N3/8/8/8 w - - 0 1"ve "8/8/8/8/4Q3/8/8/8 w - - 0 1" gireceğim:

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

Bu iki dosya oluşturur: 88884N3888 w - - 0 1.SVGve88884Q3888 w - - 0 1.SVG

Yerleşik fonksiyonlar kullanarak şemaya kolayca yapılabilen özelleştirmeler nedeniyle python-satranç öneririm. Aynı zamanda iyi belgelenmiştir.


Net, kullanımı kolay ve kapsamlı öneri için tebrikler @Fluxenein. Yayıncılık ihtiyaçlarım için bu yaklaşıma bir göz atıyorum. Topluluğa hoş geldiniz!
jaxter

Teşekkürler! Benim için oldukça sıkıcı bir görev, bu yüzden ihtiyaçlarım için de yeterince hızlı bir çözüm bulana kadar muhtemelen güncellemeye devam edeceğim.
MrFregg

Ödül vermek, şimdiye kadarki en iyisi olduğu için, ancak kelime işlemeyle iyi entegre edilmiş bir şey yapmak için bir yolumuz var.
Andrew Lazarus

harika bir kütüphane harika ipuçları. Son hamle için ok belirtme örneği veya tahta stili var mı? açıklığa kavuşturmak için ./FENtoSVG.py aracılığıyla değil, kendi senaryomda python satranç ile yapmak istiyoruz.
Joe

3

Bir vektör biçimi uygun olacaktır.

Bildiğiniz gibi, bir vektör formatı grafiği bitmap olarak değil geometrik olarak herhangi bir ölçekte oluşturulabilen matematiksel bir tanım olarak temsil eder.

Web görüntüleme için SVG biçimini kullanabilirsiniz. İşte SVG formatında bazı satranç figürleri. (Eğer bağlantıyı takip ederseniz, her satranççu için "orijinal dosya (SVG dosyası)" na tıklayın. Tıklayana kadar, elde edeceğiniz tek şey bit eşlemli, SVG'ye PNG yaklaşımıdır. Gerçek SVG'yi istiyorsunuz.)

PDF ekranı için TeX'te kullanabileceğiniz çeşitli paketler bulunur. İşte bir liste. (Bu, TeX ya da LaTeX aşina yalnızca uygundur; ama sonuçta diyagramlar iyi Örneğin, bkz 4'ün.. Bu PDF örnekte Skak tarzında Üstelik bunu p inanıyoruz 4.. Bu PDF örnek gösterir tercih edebileceğiniz Schwalbe-satranç tarzı, ancak belgelerinin hepsi Almanca gibi görünüyor.


1
Son örneğinizdeki (harmonie) diyagramların düşük kalitede olduğunu düşünüyorum. Beyaz kareler çok az yatay alan kullanır, bu nedenle sola çok uzaktırlar ve h dosyası ile tahta kenarı arasında büyük boşluklar bırakırlar. Bu diyagramlar bana ctan.org/tex-archive/macros/latex/contrib/… adresinde bulunan LaTeX paketi "satranç-problem-diyagramları" ile yapılmış gibi bakıyor . Bu paketi kullanarak yaptığım diyagramlarda da aynı hata var.
Rosie F

3

Benim çözümüm Chess Merida veya Chess Cases gibi bir satranç yazı tipi kullanmak oldu .

Böyle bir yazı tipiyle, örneğin başlangıç ​​konumu şu şekilde yazılır:

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

Ve (satır yüksekliğinin yazı tipinin yüksekliğine ayarlandığı varsayılarak) şöyle görünür (Burada satranç Merida'yı yazı tipi olarak kullanmak ):

resim açıklamasını buraya girin

Bu yüzden fen'den bu formata dönüştüren bu Python betiğini yazdım. Bu komut dosyasını çağırın (bunu fen2diag.py olarak adlandırdığınız varsayılarak ) python fen2diag.py "<the fen>"ve diyagram dizesini yazdırır.

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

Bu Diyagram fontları ayrıca noktalar veya yıldızlar ile işaretlenmiş kareleri, başka bir kenarlık türünü, yuvarlak kenar köşelerini, sol / alt kenarlıklarda satırları / sütunları gösteren sayıları / harfleri destekler. Bunu senaryoya dahil etmedim. Kodumu güncellemekten çekinmeyin.

Chessbase ayrıca ('DiagramTT ...' ile başlayan) bir yazı tipi ailesi oluşturdu (180 ° döndürülmüş parçalar gibi), ancak bu yazı tipi işleri farklı kod noktalarına eşler, ayrıca siyah kareler için iki harf alınır, bir arka plan için ve bir parça için.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.