views.py 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. #encoding
  2. from app import app
  3. from flask import request, redirect, url_for, send_from_directory, render_template
  4. import subprocess
  5. import redis
  6. import random
  7. import PyPDF2
  8. import os
  9. import json
  10. import re
  11. import base64
  12. #path = "/home/bscheibel/app/app"
  13. path = "/home/centurio/Projects/engineering_drawings_ui/app"
  14. #path_extraction = '/home/bscheibel/PycharmProjects/dxf_reader/main.py'
  15. path_extraction = "/home/centurio/Projects/engineering_drawings_extraction/main.py"
  16. UPLOAD_FOLDER = path + "/temporary/"
  17. app.config["UPLOAD_FOLDER"] = UPLOAD_FOLDER
  18. ALLOWED_EXTENSIONS = set(['pdf', 'png', 'jpg', 'jpeg', 'PDF'])
  19. def allowed_file(filename):
  20. return '.' in filename and \
  21. filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS
  22. def convert_pdf_img(filename):
  23. PDFFILE = UPLOAD_FOLDER +"/" + filename
  24. subprocess.call(['pdftoppm', '-jpeg', '-singlefile',
  25. PDFFILE, '/home/centurio/web/edi2/out'])
  26. def extract_all(uuid, filename, db):
  27. #order_bounding_boxes_in_each_block.main(uuid, UPLOAD_FOLDER + "/" + filename)
  28. subprocess.call(['python3', path_extraction, str(uuid),UPLOAD_FOLDER + "/" + filename, db, str(0)])
  29. def get_file_size(file):
  30. pdf = PyPDF2.PdfFileReader(file)
  31. p = pdf.getPage(0)
  32. w = p.mediaBox.getWidth()
  33. h= p.mediaBox.getHeight()
  34. OrientationDegrees = p.get('/Rotate')
  35. if OrientationDegrees != 0 :
  36. orientation = "landscape"
  37. else:
  38. orientation = "portrait"
  39. print(w,h,OrientationDegrees)
  40. return w,h, orientation
  41. def check_links(isos):
  42. link_names = {}
  43. isos_names = []
  44. isos = list(set(isos))
  45. reg_isos = r"(ISO\s\d*)\s1\-(\d?)"
  46. print(isos)
  47. isos_new = []
  48. for name in isos:
  49. if re.search(reg_isos, name):
  50. n = 1
  51. new_isos = re.search(reg_isos,name).group(1)
  52. number = re.search(reg_isos,name).group(2)
  53. while n <= int(number):
  54. isos_new.append(new_isos+"-"+str(n))
  55. n += 1
  56. else:
  57. isos_new.append(name)
  58. for name in isos_new:
  59. try:
  60. name = name.replace(" ", "")
  61. url1 = name + ".PDF"
  62. #file = send_from_directory("static/isos",url1)
  63. url = "isos/" + url1
  64. link_names[name] = url
  65. except:
  66. isos_names.append(name)
  67. return link_names, isos_names
  68. @app.route('/', methods=['GET', 'POST'])
  69. def upload_file():
  70. if request.method == 'POST':
  71. file = request.files['file']
  72. if file and allowed_file(file.filename):
  73. filename = file.filename
  74. basedir = os.path.abspath(os.path.dirname(__file__))
  75. file.save(os.path.join(basedir,app.config["UPLOAD_FOLDER"], filename))
  76. uuid = random.randint(100,10000000)
  77. extract_all(uuid, filename, 'localhost')
  78. return redirect(url_for('uploaded_file', filename=filename, uuid=uuid))
  79. return '''
  80. <!doctype html>
  81. <title>Upload new File</title>
  82. <h1>Upload new File</h1>
  83. <form action="" method=post enctype=multipart/form-data>
  84. <p><input type=file name=file>
  85. <input type=submit value=Upload>
  86. </form>
  87. '''
  88. @app.route('/show/<filename>&<uuid>')
  89. def uploaded_file(filename, uuid):
  90. file_out = "out.jpg"
  91. if filename.endswith(".pdf") or filename.endswith(".PDF"):
  92. w,h, orientation = get_file_size(UPLOAD_FOLDER +"/" + filename)
  93. convert_pdf_img(filename)
  94. db = redis.Redis(unix_socket_path='/tmp/redis.sock',db=7)
  95. gen_tol = db.get(str(uuid)+"tol")
  96. print(gen_tol)
  97. isos = json.loads(db.get(str(uuid)+"isos"))
  98. links, isos_names = check_links(isos)
  99. dims = json.loads(db.get(str(uuid)+"dims"))
  100. details = json.loads(db.get(str(uuid) + "details"))
  101. number_blocks = db.get(str(uuid)+"eps")
  102. html_code = "General tolerances according to: " + str(gen_tol) + "<br>"
  103. html_general = ""
  104. reg = r"(-?\d{1,}\.?\d*)"
  105. det_coords= "0,0,0,0"
  106. with open(path +'/static/config.json') as f:
  107. config_file = json.load(f)
  108. print(config_file)
  109. for dim in sorted(dims):
  110. for det in details:
  111. try:
  112. if dim == det:
  113. det_coords = details[det]
  114. det_coords = ",".join(str(det) for det in det_coords)
  115. except:
  116. det_coords = "0,0,0,0"
  117. if "ZZZZ" in dim:
  118. for d in dims[dim]:
  119. html_general += d + "<br>"
  120. continue
  121. else:
  122. html_code += "<td><h4>" + dim + "</h4></td>"
  123. for d in dims[dim]:
  124. relevant_isos = []
  125. search_terms = {}
  126. terms = ''
  127. for conf in config_file:
  128. if re.search(conf,d):
  129. iso = config_file[conf]
  130. for key in iso:
  131. relevant_isos.append(key)
  132. for blub in iso[key]:
  133. search_terms[blub] = iso[key][blub]
  134. if len(search_terms) < 1:
  135. search_terms["Beginn"] = 1
  136. terms = json.dumps(search_terms)
  137. terms = base64.b64encode(terms.encode()).decode('utf-8')
  138. try:
  139. number = re.search(reg, d)
  140. number = number.group(1)
  141. try:
  142. floats = len(number.split(".")[1])
  143. if floats <= 1:
  144. steps = 0.1
  145. elif floats == 2:
  146. steps = 0.01
  147. elif floats == 3:
  148. steps = 0.001
  149. else:
  150. steps = 0.001
  151. except:
  152. steps = 0.1
  153. except:
  154. number = d
  155. steps = 0.1
  156. coords = ",".join(str(e) for e in dims[dim][d])
  157. html_code += "<tr><td style='text-align:center'> <input type='checkbox' name='relevant." + d + "' value='checked'> </td>" + \
  158. "<td style='text-align:center'>" + d + "</td>" + \
  159. "<td max='3' style='text-align:center'> <input type='number' step='" + str(steps) + "' data-coords='" + coords + " 'data-details='" + det_coords +"'' name='" + d + "' value='" + number + "'> </td>"
  160. relevant_isos = list(set(relevant_isos))
  161. for x in relevant_isos:
  162. html_code += "<td style='text-align:left' data-terms='" + terms + "'> <a onclick=ui_add_tab_active('#main','" + x.partition(".")[0] + "','" + x.partition(".")[0] +"',true,'isotab','"+terms+"')>" + x.partition(".")[0] + "</a> </td>"
  163. html_code += "</tr>"
  164. html_links = ""
  165. for link in links:
  166. html_links += "<a onclick =ui_add_tab_active('#main','" + link + "','" + link +"',true,'isotab','empty')> Open " + link + "</a> <br>"
  167. return render_template('index.html', filename=file_out, isos=isos, dims=dims, text=html_code,html_general=html_general, number=number_blocks, og_filename=filename, w=w, h=h, html_links=html_links, isos_names=isos_names, orientation=orientation)
  168. @app.route('/uploads/<filename>')
  169. def send_file(filename):
  170. return send_from_directory(UPLOAD_FOLDER, filename)
  171. @app.after_request
  172. def add_header(response):
  173. response.headers['Cache-Control'] = 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=0'
  174. response.headers['Pragma'] = 'no-cache'
  175. response.headers['Expires'] = '-1'
  176. response.headers['Access-Control-Allow-Origin'] = '*'
  177. response.headers.add("Access-Control-Allow-Headers", "*")
  178. response.headers.add("Access-Control-Allow-Methods", "*")
  179. return response
  180. @app.route('/redis/get/<key>',methods=['GET'])
  181. def redis_get(key):
  182. db = redis.Redis(unix_socket_path='/tmp/redis.sock',db=7)
  183. result = json.loads(db.get(key))
  184. return result
  185. @app.route('/redis/set/<key>',methods=['POST'])
  186. def redis_set(key):
  187. value = request.get_json(force=True)
  188. value = value["value"]
  189. db = redis.Redis(unix_socket_path='/tmp/redis.sock',db=7)
  190. value_name = value[0]
  191. value_v = value[1]
  192. try:
  193. result = json.loads(db.get(key))
  194. result[value_name] = value_v
  195. json_res = json.dumps(result)
  196. db.set(key,json_res)
  197. except:
  198. dict_res = {}
  199. dict_res[value_name] = value_v
  200. json_dict = json.dumps(dict_res)
  201. db.set(key, json_dict)
  202. return "OK"