qslGen.py 3.2 KB

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