Spaces:
Sleeping
Sleeping
| from __future__ import print_function | |
| from flask import Flask, render_template,request,flash , json, url_for,g , redirect , jsonify , send_file ,make_response | |
| import json | |
| import fitz | |
| from PIL import Image | |
| import cv2 | |
| import numpy as np | |
| import pilecaps_adr | |
| import base64 | |
| from db import dropbox_connect | |
| import cv2 | |
| import pandas as pd | |
| import time | |
| from io import BytesIO, StringIO | |
| import urllib | |
| import tempfile | |
| from flask import Flask, Response | |
| from werkzeug.wsgi import wrap_file | |
| import tameem3_2 | |
| import pypdfium2 as pdfium | |
| import pixelconversion | |
| import tameem2_1 | |
| import io | |
| from urllib.parse import unquote | |
| import API | |
| import MC_Templates_API | |
| import tsadropboxretrieval | |
| import doc_search | |
| import google_sheet_Legend | |
| import dxf__omar3_2 | |
| import requests | |
| import google_sheet_to_xml | |
| from threading import Thread | |
| import mainDBAlaa | |
| import datetime | |
| import doors_fasterrcnn | |
| import deploying_3_3 | |
| import Doors_Schedule | |
| import Code_2_7 | |
| import Counting_Columns_2_1 | |
| # import Find_Hyperlinking_text | |
| import ezdxf | |
| from flask import Flask, render_template, session, redirect, url_for | |
| from flask_session import Session # Capital "S" | |
| app = Flask(__name__) | |
| prjnamesURL = 'https://docs.google.com/spreadsheets/d/1nsIgi9o9VSBKQlNxbxihPzG_N7s4um0eNVfgL4gaGPc/export?format=csv&gid=0' | |
| prjpartsURL = 'https://docs.google.com/spreadsheets/d/1nsIgi9o9VSBKQlNxbxihPzG_N7s4um0eNVfgL4gaGPc/export?format=csv&gid=34865056' | |
| prjsectionsURL = 'https://docs.google.com/spreadsheets/d/1nsIgi9o9VSBKQlNxbxihPzG_N7s4um0eNVfgL4gaGPc/export?format=csv&gid=1751466819' | |
| # Global variables (example) | |
| global colorsused | |
| global pdflink | |
| # For 2.7 | |
| global hatched_areas2_7 | |
| # Configure Flask-Session for server-side session storage | |
| app.config["SESSION_TYPE"] = "filesystem" | |
| app.config["SESSION_PERMANENT"] = False | |
| app.config["SESSION_FILE_DIR"] = "./flask_session_files" | |
| app.secret_key = "your_secret_key" | |
| # Initialize Flask-Session | |
| sess = Session() | |
| sess.init_app(app) | |
| def getInfotoMeasure(): | |
| return render_template("gui2.html") | |
| def password_page(): | |
| return render_template("gui2.html") | |
| def check_password(): | |
| password = request.form.get("password") | |
| correct_password = "c900" | |
| if password == correct_password: | |
| session["authenticated"] = True | |
| return jsonify({"authenticated": True}), 200 | |
| else: | |
| return jsonify({"authenticated": False}), 200 | |
| def main_gui(): | |
| if "authenticated" not in session or not session["authenticated"]: | |
| return redirect(url_for("password_page")) | |
| return render_template("proposed-GUI.html") | |
| def getInfo2toMeasure(): | |
| # API.AppendtablestoSheets() | |
| return render_template("wordSearch.html") | |
| def getprjnamesfromTestAPI(): | |
| progress_updates = [] # Shared list to store progress | |
| def generate_progressProjnames(): | |
| yield f"data: 10\n\n" # Initial progress | |
| # Call retrieveProjects and pass a callback to update the shared list | |
| prjnames,prjids=API.getPrjNames( progress_callback=lambda p: progress_updates.append(p)) | |
| # Continuously yield progress updates from the shared list | |
| while progress_updates: | |
| progress = progress_updates.pop(0) # Get the next progress value | |
| yield f"data: {progress}\n\n" | |
| # Final progress and result | |
| yield f"data: 80\n\n" | |
| yield f"data: 100\n\n" | |
| result = json.dumps([prjnames,prjids]) | |
| yield f"data: {result}\n\n" | |
| return Response(generate_progressProjnames(), content_type='text/event-stream') | |
| def getprjpartsfromTestAPI(jsdata): | |
| print('kkkk',jsdata) | |
| prjparts,partsIds=API.getprjParts(jsdata) | |
| return jsonify([prjparts,partsIds]) | |
| def getprjSectionsfromTestAPI(jsdata): | |
| data=json.loads(jsdata) | |
| sections=API.getprjSections(data[0],data[1]) | |
| return jsonify(sections) | |
| def get_javascript_data(jsdata): | |
| progress_updates = [] # Shared list to store progress | |
| def generate_progress(): | |
| yield f"data: 5\n\n" # Initial progress | |
| yield f"data: 10\n\n" # Initial progress | |
| # Call retrieveProjects and pass a callback to update the shared list | |
| documentsToMeasure, RelevantDocuments, extracted_path = tsadropboxretrieval.retrieveProjects( | |
| jsdata, | |
| progress_callback=lambda p: progress_updates.append(p) | |
| ) | |
| # Continuously yield progress updates from the shared list | |
| while progress_updates: | |
| progress = progress_updates.pop(0) # Get the next progress value | |
| yield f"data: {progress}\n\n" | |
| # Final progress and result | |
| yield f"data: 100\n\n" | |
| result = json.dumps([documentsToMeasure, RelevantDocuments, extracted_path]) | |
| yield f"data: {result}\n\n" | |
| return Response(generate_progress(), content_type='text/event-stream') | |
| #--------------------------------------------------------------- | |
| def searchDocument(): | |
| return render_template('wordSearch.html') | |
| def legendDirectory(): | |
| return render_template('legendDirectory.html') | |
| def getSearchinDocs(): | |
| arr=[] | |
| values = request.get_json() | |
| keyword=values.get('keyword') | |
| listpfProjs=values.get('listofprojs') | |
| print(keyword,listpfProjs) | |
| df,img_list=doc_search.search_docs(keyword,listpfProjs) | |
| for img in img_list: | |
| _, buffer = cv2.imencode('.png', img) | |
| arr.append(base64.b64encode(buffer).decode('utf-8')) | |
| return jsonify([df.to_html(index=False, escape=False),arr]) | |
| def getSearchinFolder(): | |
| arr=[] | |
| values = request.get_json() | |
| keyword=values.get('keyword') | |
| projname=values.get('ProjectName') | |
| df,img_list=doc_search.slow_search(keyword=keyword,project=projname) | |
| for img in img_list: | |
| _, buffer = cv2.imencode('.png', img) | |
| arr.append(base64.b64encode(buffer).decode('utf-8')) | |
| return jsonify([df.to_html(index=False, escape=False),arr]) | |
| def measurementConsoleFn(): | |
| return render_template("proposed-GUI.html") | |
| def CallAPIforMCTNames(): | |
| # print(jsdata) | |
| DictionaryOfTemplates=MC_Templates_API.RetrieveMC_Templates_API() | |
| # jsdata=jsdata.replace('"', '') | |
| print('here') | |
| return jsonify(DictionaryOfTemplates) #[str(jsdata).lower()] | |
| #_________________________________________________________________________________________________________________________ | |
| #_________________________________________________________________________________________________________________________ | |
| #Hex value to RGB value | |
| def hexRGB(color): | |
| color=color.lstrip('#') | |
| color= tuple(int(color[i:i+2], 16) for i in (0, 2, 4)) #hex to rgb | |
| color=list(color) #rgb to bgr | |
| return color | |
| #_________________________________________________________________________________________________________________________ | |
| #_________________________________________________________________________________________________________________________ | |
| def getfromdropboxImg(jsdata): | |
| # vv = eval(request.form.get('pdflink')) | |
| pdfpath='' | |
| # jsdata=jsdata.replace('"', '') | |
| jsdata=eval(jsdata) | |
| print('pdfnameeee==',jsdata) | |
| dbPath='/TSA JOBS/ADR Test/'+jsdata[0][0]+'/'+jsdata[0][1]+'/'+jsdata[0][2]+'/Measured Plan/'+jsdata[1] | |
| print(dbPath) | |
| dbxTeam= tsadropboxretrieval.ADR_Access_DropboxTeam('user') | |
| md, res =dbxTeam.files_download(path=dbPath) | |
| data = res.content | |
| doc = fitz.open("pdf",data) | |
| page=doc[0] | |
| pix = page.get_pixmap() # render page to an image | |
| pl=Image.frombytes('RGB', [pix.width,pix.height],pix.samples) | |
| img=np.array(pl) | |
| img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR) | |
| _, buffer = cv2.imencode('.png', img) | |
| return base64.b64encode(buffer).decode('utf-8') | |
| def stringToRGB(): | |
| vv = eval(request.form.get('answers')) | |
| print(vv) | |
| if ( vv[5][2].startswith('3.2') or vv[5][2].startswith('3.3') or vv[5][2].startswith('2.7')) : | |
| print('3.2 section') | |
| pdfpath,pdflink=tsadropboxretrieval.getPathtoPDF_File(nameofPDF=vv[0]) | |
| dbxTeam= tsadropboxretrieval.ADR_Access_DropboxTeam('user') | |
| md, res =dbxTeam.files_download(path=pdfpath) | |
| dataDoc = res.content | |
| if 'file' not in request.files: | |
| print('error, No file part in the request') | |
| else: | |
| file = request.files['file'] | |
| print('file done, measuring') | |
| arr=measureproject(vv,dataDoc,0,file) | |
| return jsonify(arr) | |
| if vv[5][2].startswith('1.0'): | |
| opencv_img,dataDoc = plan2img( str(vv[0]) ) | |
| if vv[1]==220: | |
| imgdata = base64.b64decode(vv[6]) | |
| img=Image.open(io.BytesIO(imgdata)) | |
| opencv_img= cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR) | |
| arr=measureproject(vv,dataDoc,opencv_img) | |
| if vv[5][2].startswith('2.8') or vv[5][2].startswith('2.1'): | |
| pdfpath,pdflink=tsadropboxretrieval.getPathtoPDF_File(nameofPDF= str(vv[0])) | |
| dbxTeam= tsadropboxretrieval.ADR_Access_DropboxTeam('user') | |
| md, res =dbxTeam.files_download(path=pdfpath) | |
| dataDoc = res.content | |
| doc = fitz.open("pdf",dataDoc) | |
| page=doc[0] | |
| if page.rotation!=0: | |
| page.set_rotation(0) | |
| pix = page.get_pixmap(dpi=300) # render page to an image | |
| pl=Image.frombytes('RGB', [pix.width,pix.height],pix.samples) | |
| arr=measureproject(vv,dataDoc,pl) | |
| return jsonify(arr) | |
| def measure2_1(): | |
| name = request.get_json() | |
| result=name.get('allvalues') | |
| arr=measureproject(result) | |
| return arr | |
| #MAIN FUNCTION -- calls python code to measure the chosen plan from the interface | |
| # @app.route('/projecttomeasure/<jsdata>',methods=["GET","POST"]) | |
| def measureproject(result,dataDoc=0,img=0,dxffile=0): | |
| colorarr=[] | |
| global pdflink | |
| # result = json.loads(jsdata) | |
| pdfpath='/' | |
| ################################# -1.0- ################################# | |
| for word in result[5]: | |
| pdfpath+=word +'/' | |
| arr=[] | |
| if result[5][2].startswith('1.0'): #section value - 1.0 substructure- pile caps | |
| for item in result[2]: | |
| # item1 ='#'+item | |
| c=hexRGB(item) | |
| colorarr.append(c) | |
| print('RATIOS=',result[3], result[4]) | |
| # cv2.imwrite(img,'imgg.png') | |
| # global pdflink | |
| imgPerimeter1,image_new1,SimilarAreaDictionary , colorsUsed,spreadsheet_url, spreadsheetId,list1, pdflink, areas_Perimeters, namepathArr =pilecaps_adr.drawAllContours(dataDoc,img,result[1],colorarr, result[3], result[4], result[0],pdfpath) | |
| _, buffer = cv2.imencode('.png', image_new1) | |
| arr=[base64.b64encode(buffer).decode('utf-8'),SimilarAreaDictionary.to_dict(),spreadsheet_url , spreadsheetId,colorsUsed,list1.to_dict(), pdflink, areas_Perimeters, namepathArr] | |
| ################################# -3.2- ################################# | |
| # elif result[5][2].startswith('3.2'): #section value - 3.2 floor finishes | |
| # print('IN HEREEEE 3.2') | |
| # dxfpath=dxffile.read() | |
| # with tempfile.NamedTemporaryFile(suffix='.dxf', delete=False) as temp_file: | |
| # temp_file.write(dxfpath) | |
| # temp_filename = temp_file.name | |
| # print(temp_filename) | |
| # doc,outputimg, SimilarAreaDictionary ,spreadsheetId, spreadsheet_url , namepathArr , list1,hatched_areas=dxf__omar3_2.mainFunctionDrawImgPdf(dataDoc,temp_filename,result[4] , pdfpath,result[0]) | |
| # dbPath='/TSA JOBS/ADR Test'+pdfpath+'Measured Plan/' | |
| # pdflink= tsadropboxretrieval.uploadanyFile(doc=doc,path=dbPath,pdfname=result[0]) #doc=doc,pdfname=path,pdfpath=pdfpath+'Measured Plan/' | |
| # _, buffer = cv2.imencode('.png', outputimg) | |
| # arr=[ base64.b64encode(buffer).decode('utf-8'),SimilarAreaDictionary.to_dict(), spreadsheet_url,spreadsheetId,[],list1.to_dict(),pdflink,hatched_areas,namepathArr]# , spreadsheetId, spreadsheet_url , list1.to_dict()] | |
| ################################# -3.3 or 3.2- ################################# | |
| elif result[5][2].startswith('3.3') or result[5][2].startswith('3.2'): #section value - 3.2 floor finishes | |
| print('code of 3.3 and 3.2') | |
| dxfpath=dxffile.read() | |
| with tempfile.NamedTemporaryFile(suffix='.dxf', delete=False) as temp_file: | |
| temp_file.write(dxfpath) | |
| temp_filename = temp_file.name | |
| print(temp_filename) | |
| doc,outputimg, SimilarAreaDictionary ,spreadsheetId, spreadsheet_url , namepathArr , list1,hatched_areas=deploying_3_3.mainFunctionDrawImgPdf(dataDoc,temp_filename,result[4] , pdfpath,result[0]) | |
| global colorsused | |
| colorsused=list(SimilarAreaDictionary['Color']) | |
| dbPath='/TSA JOBS/ADR Test'+pdfpath+'Measured Plan/' | |
| print(dbPath,result[0]) | |
| # | |
| pdflink= tsadropboxretrieval.uploadanyFile(doc=doc,path=dbPath,pdfname=result[0]) #doc=doc,pdfname=path,pdfpath=pdfpath+'Measured Plan/' | |
| _, buffer = cv2.imencode('.png', outputimg) | |
| arr=[ base64.b64encode(buffer).decode('utf-8'),SimilarAreaDictionary.to_dict(), spreadsheet_url,spreadsheetId,[],list1.to_dict(),pdflink,hatched_areas,namepathArr]#,hatched_areas,namepathArr]# , spreadsheetId, spreadsheet_url , list1.to_dict()] | |
| ################################# 2.7- ################################# | |
| elif result[5][2].startswith('2.7') : #section value - 2.7 floor finishes | |
| print('code of 2.7') | |
| dxfpath=dxffile.read() | |
| with tempfile.NamedTemporaryFile(suffix='.dxf', delete=False) as temp_file: | |
| temp_file.write(dxfpath) | |
| temp_filename = temp_file.name | |
| print(temp_filename) | |
| SearchArray=result[6] | |
| print(result) | |
| print("SearchArray = ",SearchArray) | |
| global hatched_areas2_7 | |
| doc,outputimg, SimilarAreaDictionary ,spreadsheetId, spreadsheet_url , namepathArr , list1,hatched_areas=Code_2_7.mainFunctionDrawImgPdf(dataDoc,temp_filename,result[4],SearchArray, pdfpath,result[0]) | |
| # global colorsused | |
| hatched_areas2_7=hatched_areas | |
| colorsused=list(SimilarAreaDictionary['Color']) | |
| dbPath='/TSA JOBS/ADR Test'+pdfpath+'Measured Plan/' | |
| print(dbPath,result[0]) | |
| # | |
| pdflink= tsadropboxretrieval.uploadanyFile(doc=doc,path=dbPath,pdfname=result[0]) #doc=doc,pdfname=path,pdfpath=pdfpath+'Measured Plan/' | |
| _, buffer = cv2.imencode('.png', outputimg) | |
| arr=[ base64.b64encode(buffer).decode('utf-8'),SimilarAreaDictionary.to_dict(), spreadsheet_url,spreadsheetId,[],list1.to_dict(),pdflink,[],namepathArr]#,hatched_areas,namepathArr]# , spreadsheetId, spreadsheet_url , list1.to_dict()] | |
| # arr=[ base64.b64encode(buffer).decode('utf-8'),SimilarAreaDictionary.to_dict(), spreadsheet_url,spreadsheetId,[],list1.to_dict(),pdflink,hatched_areas,namepathArr]#,hatched_areas,namepathArr]# , spreadsheetId, spreadsheet_url , list1.to_dict()] | |
| ################################# -2.8- ################################# | |
| elif result[5][2].startswith('2.8'): #section value - 2.8 floor finishes | |
| #vv[0] array of pdf names | |
| imgss=[] | |
| dpxlinks=[] | |
| legendLinks=[] | |
| listofmarkups=[] | |
| pdfpathDoors,_=tsadropboxretrieval.getPathtoPDF_File(nameofPDF= str(result[6])) | |
| dbxTeam= tsadropboxretrieval.ADR_Access_DropboxTeam('user') | |
| md, resDoors =dbxTeam.files_download(path=pdfpathDoors) | |
| dataDocDoorsSchedule = resDoors.content | |
| # annotatedimg,pdf_document,spreadsheet_url, list1 , df_doors=doors_fasterrcnn.main_run(img,dataDoc,'separated_classes_all.pth',result[0],pdfpath, result[4]) #single_double.pth | |
| annotatedimg, pdf_document , list1, repeated_labels , not_found =Doors_Schedule.mainRun(dataDocDoorsSchedule, dataDoc) | |
| dbPath='/TSA JOBS/ADR Test'+pdfpath+'Measured Plan/' | |
| pdflink= tsadropboxretrieval.uploadanyFile(doc=pdf_document,path=dbPath,pdfname=result[0]) #doc=doc,pdfname=path,pdfpath=pdfpath+'Measured Plan/ | |
| _, buffer = cv2.imencode('.png', annotatedimg) | |
| repeatedLabelsReturn='' | |
| NotFoundReturn='' | |
| if len(repeated_labels)>0: | |
| repeatedLabelsReturn=repeated_labels | |
| if len(not_found)>0: | |
| NotFoundReturn=not_found # , spreadsheetId, spreadsheet_url , list1.to_dict()] | |
| arr=[base64.b64encode(buffer).decode('utf-8') ,pdflink,list1.to_dict(),str(repeatedLabelsReturn), str(NotFoundReturn)] # , spreadsheetId, spreadsheet_url , list1.to_dict()] | |
| ################################# -2.1- ################################# | |
| elif result[5][2].startswith('2.1'): #section value - 2.8 floor finishes | |
| #vv[0] array of pdf names | |
| imgss=[] | |
| dpxlinks=[] | |
| legendLinks=[] | |
| listofmarkups=[] | |
| annotatedimg,pdf_document,spreadsheet_url, list1 , df_doors=Counting_Columns_2_1.mainfun(dataDoc,pdfpath,result[0]) | |
| # dbPath='/TSA JOBS/ADR Test'+pdfpath+'Measured Plan/' | |
| # pdflink= tsadropboxretrieval.uploadanyFile(doc=pdf_document,path=dbPath,pdfname=result[0]) #doc=doc,pdfname=path,pdfpath=pdfpath+'Measured Plan/ | |
| # _, buffer = cv2.imencode('.png', annotatedimg) | |
| arr=[base64.b64encode(buffer).decode('utf-8') ,pdflink,spreadsheet_url,list1.to_dict(), df_doors.to_dict()]# , spreadsheetId, spreadsheet_url , list1.to_dict()] | |
| ################################# -2.2- ################################# | |
| # elif result[5][2].startswith('2.2'): #section value - 2.2 rc slabs | |
| #add here python code | |
| # | |
| #link (add this to ur code) | |
| # pdflink= db.dropbox_upload_file(doc=doc,pdfname=path,pdfpath=pdfpath) | |
| # gc,spreadsheet_service,spreadsheetId, spreadsheet_url , namepathArr= pilecaps_adr.legendGoogleSheets(df,plan ,pdfpath) | |
| #output img | |
| # _, buffer = cv2.imencode('.png', outputimg) | |
| #let first result to be the img | |
| #return results in arr=[base64.b64encode(buffer).decode('utf-8'),pdflink,spreadsheetId,spreadsheet_url] like the previous sections in the above lines | |
| # elif result[5][2].startswith('2.1'): #section value - 2.1 frames | |
| # url = tameem2_1.mainfun( result[0], pdfpath) | |
| # return jsonify([url]) | |
| return arr | |
| #_________________________________________________________________________________________________________________________ | |
| #_________________________________________________________________________________________________________________________ | |
| def pdftoimgCanvas(jsdata): | |
| img=plan2img(jsdata)[0] | |
| _, buffer = cv2.imencode('.png', img) | |
| arr=[base64.b64encode(buffer).decode('utf-8') , img.shape[0],img.shape[1]] | |
| return jsonify(arr) | |
| #pdf to img | |
| def plan2img(nameofpdf): | |
| pdfpath,pdflink=tsadropboxretrieval.getPathtoPDF_File(nameofPDF=nameofpdf) | |
| dbxTeam= tsadropboxretrieval.ADR_Access_DropboxTeam('user') | |
| md, res =dbxTeam.files_download(path=pdfpath) | |
| data = res.content | |
| doc = fitz.open("pdf",data) | |
| page=doc[0] | |
| if page.rotation!=0: | |
| page.set_rotation(0) | |
| pix = page.get_pixmap(dpi=300) # render page to an image | |
| pl=Image.frombytes('RGB', [pix.width,pix.height],pix.samples) | |
| img=np.array(pl) | |
| img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR) | |
| return img ,data | |
| #_________________________________________________________________________________________________________________________ | |
| #_________________________________________________________________________________________________________________________ | |
| #not used in 1.0 | |
| def convert2img(path): | |
| pdf = pdfium.PdfDocument(path) | |
| page = pdf.get_page(0) | |
| pil_image = page.render().to_pil() | |
| pl1=np.array(pil_image) | |
| img = cv2.cvtColor(pl1, cv2.COLOR_RGB2BGR) | |
| return img | |
| #_________________________________________________________________________________________________________________________ | |
| #_________________________________________________________________________________________________________________________ | |
| #User-made MC-T NAME - in the second part of the interface | |
| def sendmctnametoLegend(jsdata): | |
| result = json.loads(jsdata) | |
| print(result) | |
| global pdflink | |
| summaryid=google_sheet_Legend.mapnametoLegend(result,colorsused,pdflink) | |
| allreturns=[summaryid] | |
| return jsonify(allreturns) | |
| def getguessedNames(): | |
| guessednamesDrpdwn=google_sheet_Legend.getallguessednames() | |
| return jsonify(guessednamesDrpdwn) | |
| #_________________________________________________________________________________________________________________________ | |
| #_________________________________________________________________________________________________________________________ | |
| #NOT USED (pixel conversion instead) | |
| def calcRef(img): | |
| blk = np.ones(img.shape, dtype="uint8") * [[[np.uint8(0), np.uint8(0), np.uint8(0)]]] | |
| start_point = (50, 100) | |
| end_point = (120, 200) | |
| color = (255, 255, 255) # white BGR | |
| thickness = -1 # Thickness of -1 will fill the entire shape | |
| blk = cv2.rectangle(blk, start_point, end_point, color, thickness) | |
| blk = cv2.cvtColor(blk, cv2.COLOR_BGR2GRAY) | |
| contourzz, hierarchy = cv2.findContours(image=blk, mode=cv2.RETR_EXTERNAL, method=cv2.CHAIN_APPROX_NONE) | |
| for i, cnt3 in enumerate(contourzz): | |
| M = cv2.moments(cnt3) | |
| if M['m00'] != 0.0: | |
| x2 = int(M['m10']/M['m00']) | |
| y2 = int(M['m01']/M['m00']) | |
| area = cv2.contourArea(cnt3) | |
| perimeter = cv2.arcLength(cnt3, True) | |
| return area,perimeter , blk | |
| #NOT USED (pixel conversion instead) | |
| def modifyingcalcRefDynamic(img): | |
| imgcopy = img.copy() | |
| blk = np.ones(img.shape, dtype="uint8") * [[[np.uint8(0), np.uint8(0), np.uint8(0)]]] | |
| x = 50 | |
| y = 100 | |
| xD = int(img.shape[1] * 0.10) | |
| yD = int(img.shape[0] * 0.10) | |
| start_point = (x, y) | |
| end_point = (x+xD, y+yD) | |
| blue = (255, 0, 0) # BGR | |
| white = (255, 255, 255) # BGR | |
| thickness = -1 # Thickness of -1 will fill the entire shape | |
| imgcopy = cv2.rectangle(imgcopy, start_point, end_point, blue, thickness) | |
| blk = cv2.rectangle(blk, start_point, end_point, white, thickness) | |
| blk = cv2.cvtColor(blk, cv2.COLOR_BGR2GRAY) | |
| contourzz, hierarchy = cv2.findContours(image=blk, mode=cv2.RETR_EXTERNAL, method=cv2.CHAIN_APPROX_NONE) | |
| for i, cnt3 in enumerate(contourzz): | |
| M = cv2.moments(cnt3) | |
| if M['m00'] != 0.0: | |
| x2 = int(M['m10']/M['m00']) | |
| y2 = int(M['m01']/M['m00']) | |
| area = cv2.contourArea(cnt3) | |
| perimeter = cv2.arcLength(cnt3, True) | |
| return area, perimeter, blk , imgcopy | |
| #_________________________________________________________________________________________________________________________ | |
| #_________________________________________________________________________________________________________________________ | |
| def get_pdf(jsdata): | |
| print('pdfname',jsdata) | |
| # Download PDF from Dropbox | |
| pdfpath,pdflink=tsadropboxretrieval.getPathtoPDF_File(nameofPDF=jsdata) | |
| print('pdfpath',pdfpath) | |
| dbxTeam= tsadropboxretrieval.ADR_Access_DropboxTeam('user') | |
| md, res =dbxTeam.files_download(path=pdfpath) | |
| doc = fitz.open("pdf",res.content) | |
| page=doc[0] | |
| # print('get pdf size::',page.mediabox) | |
| pdf_data = res.content # Ensure this is your correct PDF data from Dropbox | |
| response = make_response(io.BytesIO(pdf_data).getvalue()) | |
| response.headers.set('Content-Type', 'application/pdf') | |
| response.headers.set('Content-Disposition', 'attachment', filename='filename.pdf') # Replace with your desired file name | |
| # return response | |
| return response | |
| #PIXEL CONVERSION METHOD -- SAVES DOC ON DROPBOX TO BE MEASURED BY USER | |
| def getimg(jsdata): | |
| progress_updates = [] # Shared list to store progress | |
| jsdata=eval(jsdata) | |
| def generate_progressPixel(): | |
| yield f"data: 10\n\n" # Initial progress | |
| pdfpath,pdflink=tsadropboxretrieval.getPathtoPDF_File(nameofPDF=jsdata[3], progress_callback=lambda p: progress_updates.append(p)) | |
| dbxTeam= tsadropboxretrieval.ADR_Access_DropboxTeam('user') | |
| md, res =dbxTeam.files_download(path=pdfpath) | |
| data = res.content | |
| print('jsdata',jsdata) | |
| if str(jsdata[2]).startswith('1.0'): | |
| doc,areaPixel,perimeterPixel=pixelconversion.drawisrotated(data,300) # .openDrawPDF(data) | |
| else: | |
| doc,areaPixel,perimeterPixel,pdfdata=pixelconversion.drawisrotated(data) # .openDrawPDF(data) | |
| yield f"data: 20\n\n" # Initial progress | |
| dbPath='/TSA JOBS/ADR Test/'+jsdata[0]+'/'+jsdata[1]+'/'+jsdata[2]+'/'+'Scale Document' +'/' | |
| dburl=tsadropboxretrieval.uploadanyFile(doc=doc,pdfname=str(jsdata[3]) ,path=dbPath) | |
| # areaPixel,perimeterPixel= pixelconversion.getAreaPerimeter(dbPath, str(jsdata[3])) | |
| yield f"data: 40\n\n" # Initial progress | |
| outputs=[areaPixel,perimeterPixel , dburl] | |
| while progress_updates: | |
| progress = progress_updates.pop(0) # Get the next progress value | |
| yield f"data: {progress}\n\n" | |
| # Final progress and result | |
| yield f"data: 80\n\n" | |
| yield f"data: 100\n\n" | |
| result = json.dumps(outputs) | |
| yield f"data: {result}\n\n" | |
| return Response(generate_progressPixel(), content_type='text/event-stream') | |
| #_________________________________________________________________________________________________________________________ | |
| #_________________________________________________________________________________________________________________________ | |
| #get sunburst from doc_search | |
| def getSunburst(): | |
| # df=tsadropboxretrieval.GetParquetDF() | |
| tree=doc_search.prepare_sunburst() | |
| return jsonify(tree.to_dict()) | |
| #_________________________________________________________________________________________________________________________ | |
| #_________________________________________________________________________________________________________________________ | |
| #DELETE MARKUPS (for comparison) | |
| def getnewlegend(): | |
| pdfpth='' | |
| alljson = request.get_json() | |
| list1=alljson.get('dict1') | |
| print('list1',list1) | |
| # list1 = request.args.get('dict1') | |
| path=alljson.get('path') | |
| # path = request.args.get('path') | |
| spreadsheetId=alljson.get('spreadsheetId') | |
| # spreadsheetId =request.args.get('spreadsheetId') | |
| pdfpathpath=alljson.get('pdfpathpath') | |
| # pdfpathpath=request.args.get('pdfpathpath') | |
| print(pdfpathpath,type(pdfpathpath)) | |
| pdfname=request.args.get('pdfname') | |
| for word in eval(pdfpathpath): | |
| pdfpth+='/' +word | |
| pdfpth+='/' | |
| dbPath='/TSA JOBS/ADR Test'+pdfpth+'Measured Plan/' | |
| print(pdfpth) | |
| deletedrows1=google_sheet_Legend.deletemarkups(list1=list1,dbPath=dbPath,path=path) | |
| arr1=[deletedrows1.to_dict()] | |
| print('arr,',arr1) | |
| return jsonify(arr1) | |
| #--------------------------------------------------------------------------- | |
| #if user wishes to delete | |
| def dltmarkupslegend(): | |
| print('IN deletemarkupsroute') | |
| pdfpth='' | |
| alljson = request.get_json() | |
| SimilarAreaDictionary=alljson.get('dict') | |
| # SimilarAreaDictionary = request.args.get('dict') | |
| deletedrows=alljson.get('deletedrows') | |
| print('deletedrowsssssssssssssssssssssssssssssss',deletedrows) | |
| # deletedrows = request.args.get('deletedrows') | |
| path=alljson.get('path') | |
| # path = request.args.get('path') | |
| spreadsheetId=alljson.get('spreadsheetId') | |
| # spreadsheetId =request.args.get('spreadsheetId') | |
| areaPermArr=alljson.get('areaPermArr') | |
| print('aaaaaaaaaaaaa',areaPermArr) | |
| # areaPermArr=request.args.get('areaPermArr') | |
| section=alljson.get('section') | |
| # section=request.args.get('section') | |
| pdfpathpath=alljson.get('pdfpathpath') | |
| # pdfpathpath=request.args.get('pdfpathpath') | |
| for word in eval(pdfpathpath): | |
| pdfpth+='/' +word | |
| pdfpth+='/' | |
| # myDict=eval(deletedrows) | |
| deletedrows=pd.DataFrame(deletedrows) | |
| print('deletedrows',deletedrows) | |
| if section.startswith('2.7'): | |
| areaPermArr=hatched_areas2_7 | |
| if section.startswith('1.0') or section.startswith('3.2') or section.startswith('3.3'): | |
| newlgnd=google_sheet_Legend.deletefromlegend(deletedrows=deletedrows,SimilarAreaDictionarycopy=SimilarAreaDictionary, section=section,areaPermArr=areaPermArr) | |
| elif section.startswith('2.8'): | |
| newlgnd=google_sheet_Legend.deletedoors(deletedrows,SimilarAreaDictionary) | |
| print('done wit 2.8 in deleting, didnt append yet ') | |
| else: | |
| newlgnd=google_sheet_Legend.deletefromlegend(deletedrows=deletedrows,SimilarAreaDictionarycopy=SimilarAreaDictionary, section=section) | |
| try: | |
| newlgnd=google_sheet_Legend.legendGoogleSheets(SimilarAreaDictionary=newlgnd,path=path,spreadsheetId=spreadsheetId ,pdfpath=pdfpth) #new legend | |
| except: | |
| print("An exception occurred") | |
| time.sleep(20) | |
| newlgnd=google_sheet_Legend.legendGoogleSheets(SimilarAreaDictionary=newlgnd,path=path,spreadsheetId=spreadsheetId,pdfpath=pdfpth) | |
| return jsonify('donee') | |
| #_________________________________________________________________________________________________________________________ | |
| #_________________________________________________________________________________________________________________________ | |
| #get pdf dropbox url after measurement is done | |
| def calldropboxurl(jsdata): | |
| print('jsdata',jsdata) | |
| pdfurl=tsadropboxretrieval.getPathtoPDF_File(nameofPDF=jsdata)[1] | |
| print('urll',pdfurl) | |
| if pdfurl and ('http' in pdfurl or 'dropbox' in pdfurl): | |
| if 'dl=0' in pdfurl: | |
| pdfurl = pdfurl.replace('dl=0', 'dl=1') | |
| print('urll1',pdfurl) | |
| # Download the PDF content from the shareable link | |
| response = requests.get(pdfurl) | |
| pdf_content = BytesIO(response.content) # Store the content in memory | |
| if pdf_content is None: | |
| raise ValueError("No valid PDF content found.") | |
| # Open the PDF using PyMuPDF | |
| pdf_document = fitz.open(stream=pdf_content, filetype="pdf") | |
| pdf_bytes = BytesIO() | |
| pdf_document.save(pdf_bytes) | |
| return Response(pdf_bytes.getvalue(), content_type='application/pdf') | |
| #_________________________________________________________________________________________________________________________ | |
| #_________________________________________________________________________________________________________________________ | |
| pdf_content = None | |
| pageNumTextFound = 0 | |
| BASE_URL = "https://marthee-nbslink.hf.space" # Hugging Face Spaces base URL | |
| def thismain(): | |
| print('ayhaga') | |
| return render_template("gui.html") | |
| def download_pdf(): | |
| # Manually parse the query parameters | |
| full_query_string = request.query_string.decode() # Get raw query string | |
| parsed_params = urllib.parse.parse_qs(full_query_string) # Parse it | |
| # Extract pdfLink and keyword manually | |
| pdf_link = parsed_params.get('pdfLink', [None])[0] | |
| keyword = parsed_params.get('keyword', [None])[0] | |
| if not pdf_link or not keyword: | |
| return "Missing required parameters.", 400 | |
| # Decode the extracted values | |
| pdf_link = urllib.parse.unquote(pdf_link) | |
| keyword = urllib.parse.unquote(keyword) | |
| # If the keyword is a JSON string, convert it back to a list | |
| try: | |
| keyword = json.loads(keyword) | |
| except json.JSONDecodeError: | |
| keyword = [keyword] # Treat it as a single keyword if not JSON | |
| print("Extracted PDF Link:", pdf_link) | |
| print("Extracted Keywords:", keyword) | |
| createDF=False | |
| pdf_content = Find_Hyperlinking_text.annotate_text_from_pdf([pdf_link], keyword)[0] | |
| if pdf_content is None: | |
| return "PDF content not found.", 404 | |
| pdf_bytes = BytesIO(pdf_content) | |
| return send_file( | |
| pdf_bytes, | |
| mimetype='application/pdf', | |
| as_attachment=False, | |
| download_name=f"annotated_page_{pageNumTextFound}.pdf" | |
| ) | |
| def receive_pdf_data(): | |
| global pdf_content, pageNumTextFound | |
| # Get PDF link and keyword from finddata() | |
| pdfLink, keyword = finddata() | |
| if not pdfLink or not keyword: | |
| return jsonify({"error": "Both 'pdfLink' and 'keyword' must be provided."}), 400 | |
| try: | |
| print(pdfLink, keyword) | |
| pdfbytes, pdf_document , df ,tablepdfoutput= Find_Hyperlinking_text.annotate_text_from_pdf([pdfLink], keyword) | |
| dbxTeam= tsadropboxretrieval.ADR_Access_DropboxTeam('user') | |
| # Get metadata using the shared link | |
| metadata = dbxTeam.sharing_get_shared_link_metadata(pdfLink) | |
| dbPath='/TSA JOBS/ADR Test/FIND/' | |
| pdflink= tsadropboxretrieval.uploadanyFile(doc=pdf_document,path=dbPath,pdfname=metadata.name) #doc=doc,pdfname=path,pdfpath=pdfpath+'Measured Plan/ | |
| print('LINKS0',pdflink) | |
| dbPath='/TSA JOBS/ADR Test/FIND/' | |
| tablepdfLink=tsadropboxretrieval.uploadanyFile(doc=tablepdfoutput,path=dbPath,pdfname=metadata.name.rsplit(".pdf", 1)[0] +' Markup Summary'+'.pdf') | |
| print(f"PDF successfully uploaded to Dropbox at") | |
| print('LINKS1',tablepdfLink) | |
| return jsonify({ | |
| "message": "PDF processed successfully.", | |
| "PDF_MarkedUp": pdflink, | |
| 'Table_PDF_Markup_Summary': tablepdfLink | |
| }) | |
| except Exception as e: | |
| return jsonify({"error": str(e)}), 500 | |
| def finddata(): | |
| pdfLink = 'https://www.dropbox.com/scl/fi/hnp4mqigb51a5kp89kgfa/00801-ARC-20-ZZ-S-A-0002.pdf?rlkey=45abeoebzqw4qwnslnei6dkd6&st=m4yrcjm2&dl=1' | |
| keyword = ['115 INTEGRATED MRI ROOM LININGS', '310 ACCURACY'] | |
| return pdfLink, keyword | |
| #_________________________________________________________________________________________________________________________ | |
| #_________________________________________________________________________________________________________________________ | |
| #Google sheet links | |
| def getlinkscreated(jsdata): | |
| spreadsheet_service,drive_service,gc= google_sheet_Legend.authorizeLegend() | |
| ids=gc.spreadsheet_ids() | |
| titles=gc.spreadsheet_titles() | |
| allpaths=[] | |
| print('HEREEEEEEEEEE') | |
| # for title in titles: | |
| for i in range(0,len(titles)): | |
| print('titles',titles[i]) | |
| if not (titles[i].startswith('API') or (titles[i].startswith('Dropbox')) ) : | |
| ws=gc.open(titles[i]) | |
| path_metadata = ws.get_developer_metadata('path') | |
| print(path_metadata) | |
| allpaths.append([titles[i], ws.get_developer_metadata('path')[0].value , drive_service.files().get(fileId=ids[i],fields="createdTime, modifiedTime").execute() ,ids[i] ]) | |
| return jsonify(allpaths) | |
| #_________________________________________________________________________________________________________________________ | |
| #_________________________________________________________________________________________________________________________ | |
| def returnAPITables(): | |
| # API.update_df() | |
| table1,table2,table3=API.GenerateTables() | |
| return jsonify([table1.to_dict(),table2.to_dict(),table3.to_dict()]) | |
| def checktables(): | |
| projectname = request.args.get('prjname') | |
| projectpart = request.args.get('prjpart') | |
| projectpartid = request.args.get('prjpartid') | |
| print('hgh',projectname , projectpart) | |
| table1,table2,table3=API.GenerateTables() | |
| url_1 = prjnamesURL.replace('/edit#gid=', '/export?format=csv&gid=') | |
| url_2 = prjpartsURL.replace('/edit#gid=', '/export?format=csv&gid=') | |
| url_3 = prjsectionsURL.replace('/edit#gid=', '/export?format=csv&gid=') | |
| table1N = pd.read_csv(url_1) | |
| table2N = pd.read_csv(url_2) | |
| table3N = pd.read_csv(url_3) | |
| t1Diff=table1N[~table1N.isin(table1)].dropna() | |
| t1Diff1=table1[~table1.isin(table1N)].dropna() | |
| t2Diff=pd.DataFrame() | |
| t2Diff1=pd.DataFrame() | |
| t3Diff=pd.DataFrame() | |
| t3Diff1=pd.DataFrame() | |
| if projectname: | |
| print('here') | |
| differentParts=[] | |
| a = table1N.to_numpy() | |
| row = np.where(a == projectname) | |
| print(projectname,row) | |
| returnString='' | |
| t2Diff1=table2[~table2.isin(table2N)].dropna() | |
| t2Diff=table2N[~table2N.isin(table2)].dropna() | |
| if projectpart and projectname: | |
| a1 = table1N.to_numpy() | |
| row1 = np.where(a1 == projectname) | |
| prjid=a1[row1[0]][0][0] | |
| t3Diff1=table3[~table3.isin(table3N)].dropna() | |
| t3Diff=table3N[~table3N.isin(table3)].dropna() | |
| returnString='' | |
| if not t1Diff.empty or not t1Diff1.empty : | |
| if not t1Diff.empty: | |
| newvalues= t1Diff['ProjectName'].values | |
| else: | |
| newvalues= t1Diff1['ProjectName'].values | |
| returnString='' | |
| returnString=['Changes have been made in Projects. Would you like to retrieve them in the console? By saying yes, you may need to repeat the website related processes(if any).','project',(newvalues).tolist(),table2.to_dict()] | |
| if (not t2Diff.empty)or( not t2Diff1.empty) : | |
| if projectname: | |
| for i in range(len(t2Diff1['ProjectId'].values)): | |
| if int(t2Diff1['ProjectId'].values[i]) ==int(a[row[0]][0][0]): | |
| differentParts.append(t2Diff1['ProjectPart'].iloc[i]) | |
| if len(differentParts)>0: | |
| returnString=['Changes have been made in Parts. Would you like to retrieve them in the console?','part',differentParts] | |
| if (not t3Diff.empty) or (not t3Diff1.empty) : | |
| differentSections=[] | |
| if projectpart and projectname: | |
| roww=t3Diff1.iloc[np.where((t3Diff1['ProjectId']==int(prjid) ) & (t3Diff1['ProjectPartId']==int(projectpartid)) ) ] | |
| for i in range(len(roww['ProjectId'].values)): | |
| differentSections.append(str(roww['ProjectSection'].iloc[i])) | |
| if len(differentSections)>0: | |
| returnString=['Changes have been made in Sections. Would you like to retrieve them in the console?','section',differentSections] | |
| print(returnString) | |
| return jsonify(returnString) | |
| def checkdropbox(): | |
| print('checkingggdf') | |
| dfFromDropbox=tsadropboxretrieval.DropboxItemstoDF("/TSA JOBS")[0] | |
| dfParquet=tsadropboxretrieval.GetParquetDF() | |
| dfParquet1 = dfParquet[['name', 'path_display', 'client_modified', 'server_modified']] | |
| deletedrows = pd.concat([dfFromDropbox, dfParquet1]).drop_duplicates(keep=False) | |
| deletedrows = deletedrows.reset_index(drop=True) | |
| deletedrows.columns = ['name', 'path_display', 'client_modified', 'server_modified'] | |
| differences = deletedrows[~deletedrows.isin(dfFromDropbox)].dropna() | |
| if (len(differences)>0): | |
| print(differences) | |
| dbxTeam=tsadropboxretrieval.dropbox_upload_file(dfFromDropbox) | |
| stringReturned= 'Updated Sucessfully.' | |
| else: | |
| stringReturned= 'Nothing to update.' | |
| return 'stringReturned' | |
| def refreshDropboxRetrievals(extractedPath): | |
| dfFromDropbox = tsadropboxretrieval.DropboxItemstoDF(extractedPath)[0] | |
| dfParquet = tsadropboxretrieval.GetParquetDF() | |
| # print("Original Parquet size:", len(dfParquet)) | |
| # Keep only relevant columns | |
| dfParquet = dfParquet[['name', 'path_display', 'client_modified', 'server_modified']] | |
| dfFromDropbox = dfFromDropbox[['name', 'path_display', 'client_modified', 'server_modified']] | |
| # **Drop rows that start with extractedPath** | |
| dfParquetUpdated = dfParquet[~dfParquet['path_display'].str.startswith(extractedPath)] | |
| # **Append new data from Dropbox** | |
| dfParquetUpdated = pd.concat([dfParquetUpdated, dfFromDropbox], ignore_index=True) | |
| # print("Updated Parquet size:", len(dfParquetUpdated),dfParquetUpdated) | |
| # **Save the updated Parquet file** | |
| tsadropboxretrieval.dropbox_upload_file(dfParquetUpdated) | |
| if len(dfFromDropbox) > 0: | |
| print("Updated entries:", dfFromDropbox) | |
| return 'Updated Successfully.' | |
| else: | |
| return 'Nothing to update.' | |
| def handle_path(encoded_path): | |
| decoded_path = urllib.parse.unquote(encoded_path) # Decode URL encoding | |
| extracted_path = json.loads(decoded_path) # Convert back to Python object | |
| print('path to refresh',extracted_path) | |
| stringReturned=refreshDropboxRetrievals(extracted_path) | |
| print(stringReturned) | |
| return stringReturned | |
| def appendNewTables(): | |
| # value = request.args.get('keyword') | |
| # print(value) | |
| API.AppendtablestoSheets() | |
| return jsonify('appended') | |
| def cvtSummarytoXML(jsdata): | |
| path='/TSA JOBS/ADR Test/' | |
| result = json.loads(jsdata) | |
| for word in result[0]: | |
| path+=word +'/' | |
| print(path) | |
| path=path+'XML/' | |
| # print(result[0]) | |
| # print(result[1]) | |
| xmllink=google_sheet_to_xml.create_xml(documentname=result[1],dbPath=path) | |
| return jsonify(xmllink) | |
| #_________________________________________________________________________________________________________________________ | |
| #_________________________________________________________________________________________________________________________ | |
| #_________________________________________________________________________________________________________________________ | |
| #_________________________________________________________________________________________________________________________ | |
| #_________________________________________________________________________________________________________________________ | |
| #_________________________________________________________________________________________________________________________ | |
| def runn(): | |
| # app.run(host="127.0.0.1") | |
| from gevent.pywsgi import WSGIServer | |
| http_server = WSGIServer(("0.0.0.0", 7860), app) | |
| http_server.serve_forever() | |
| # serve(app, host="127.0.0.1", port=8080) | |
| def keep_alive(): | |
| t=Thread(target=runn) | |
| t.start() | |
| dtn = datetime.datetime.now(datetime.timezone.utc) | |
| print(dtn) | |
| next_start = datetime.datetime(dtn.year, dtn.month, dtn.day, 21, 0, 0).astimezone(datetime.timezone.utc) #us - 2 = utc time (21 utc is 19:00 our time and 9 is 7 our time , it needs to run 9 utc time ____ ) | |
| print(next_start) | |
| keep_alive() | |
| # active_path = "/TSA Team Folder/ADR Test/Test/" | |
| while 1: | |
| dtnNow = datetime.datetime.now(datetime.timezone.utc) | |
| print(dtnNow) | |
| if dtnNow >= next_start: | |
| next_start += datetime.timedelta(hours=12) # 1 day | |
| print(next_start) | |
| checkdropbox() | |
| time.sleep(1800) | |
| if __name__ == "__main__": | |
| runn() | |