qslGen.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #!/usr/bin/python3
  2. import os
  3. import sys
  4. import time
  5. import adi
  6. import config
  7. baseDir = os.path.expanduser("~/qslKarten")
  8. baseDir = config.baseDir
  9. inDir = f"{baseDir}/Eingang"
  10. outDir = f"{baseDir}/Karten"
  11. templateDir = f"{baseDir}/Vorlage"
  12. template = None
  13. dpi = 300
  14. verbose = False
  15. cfg = {}
  16. def exec(cmd, logFile=None):
  17. if verbose:
  18. print(f"# {cmd}")
  19. if logFile is not None:
  20. appendFile(logFile, f"# {cmd}")
  21. return os.system(f"{cmd} >> {logFile} 2>&1")
  22. return os.system(cmd)
  23. def progressBar(nMax, pos, name):
  24. p = int(20 * (pos / nMax))
  25. msg = "[" + ("=" * p) + (" " * (20 - p)) + "]"
  26. msg += f" {pos}/{nMax}: {name} "
  27. print(msg, end="\r")
  28. def appendFile(name, message):
  29. with open(name, "at") as f:
  30. f.write(f"{message}\n")
  31. def createQslCards(fileName, name):
  32. global outDir
  33. global dpi
  34. nCards = 0
  35. logFile = f"{outDir}/logs/{name}.log"
  36. exec(f"mkdir -p {outDir}/logs")
  37. appendFile(logFile, "--------------------")
  38. exec(f"date", logFile)
  39. data = adi.loadAdi(fileName)
  40. numOfRows = len(data)
  41. for pos, row in enumerate(data):
  42. tCall = row.fileName(cfg["card_name"])
  43. if not verbose:
  44. progressBar(numOfRows, pos + 1, tCall)
  45. svg = row.fillTemplate(f"{template}")
  46. d = f"{outDir}/{row.subPath()}"
  47. name = f"{d}/{tCall}"
  48. os.makedirs(d, exist_ok=True)
  49. n = 0
  50. fOut = f'{name}'
  51. while os.path.exists(fOut + ".jpg"):
  52. n += 1
  53. fOut = f'{name}-{n}'
  54. fTmp = f"{fOut}.svg"
  55. with open(fTmp, "wt") as f:
  56. f.write(svg)
  57. if 0 != exec(f"inkscape -C -d {dpi} --export-type=png -o '{fOut}.png' '{fTmp}'", logFile):
  58. raise "Problem with inkscape!"
  59. if 0 != exec(f"convert '{fOut}.png' '{fOut}.jpg'", logFile):
  60. raise "Problem with Imagemagick"
  61. os.remove(f"{fOut}.png")
  62. os.remove(fTmp)
  63. nCards += 1
  64. print("")
  65. return nCards
  66. def selectTemplate():
  67. templates = [None]
  68. for name in os.listdir(templateDir):
  69. if name.endswith(".svg"):
  70. templates.append(name)
  71. while True:
  72. for k, v in enumerate(templates):
  73. if k > 0:
  74. print(f"[{k}] '{v}'")
  75. print()
  76. print("[0] Abbrechen")
  77. print()
  78. x = input("Bitte Nummer waehlen: ")
  79. try:
  80. x = int(x)
  81. except:
  82. continue
  83. if x < 0 or x >= len(templates):
  84. continue
  85. if x == 0 or templates[x] is None:
  86. print("* Verarbeitung abgebrochen.")
  87. exit(0)
  88. return templates[x]
  89. if __name__ == "__main__":
  90. cfg = config.loadConfig(f"{baseDir}/config.cfg")
  91. verbose = cfg["verbose"]
  92. if "-v" in sys.argv or "--verbose" in sys.argv:
  93. verbose = True
  94. print("|------------------------------------------------------------")
  95. print("| qslGen.py V1.0.1")
  96. print("| Programm zum erstellen von QSL-Karten aus ADI Dateien.")
  97. print("|------------------------------------------------------------")
  98. print("")
  99. print("====[ Auswahl der Vorlage ]==================================")
  100. templateName = selectTemplate()
  101. print(f"* Lade Vorlage '{templateName}'")
  102. with open(f"{templateDir}/{templateName}", "rt") as f:
  103. template = f.read()
  104. print("====[ Verarbeite ADI Dateien ]===============================")
  105. for name in os.listdir(inDir):
  106. if name.endswith(".adi"):
  107. print(f"* Verarbeite '{name}'")
  108. fname = f"{inDir}/{name}"
  109. createQslCards(fname, name)
  110. os.remove(fname)