123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- import re
- def get_details(result): #search for all details in drawing and store it in list details, first need to append all text elements of one line and then check if regular expression is found in this text element
- reg = r"([A-Z])-\1|([A-Z]\W?[A-Z]?\s?\W\s?\d\d?\s?\s?:\s?\d\d?\s?\W)"
- details = []
- for element in result:
- new = []
- if re.search(reg,element):
- new.extend(result[element])
- new.append(element)
- details.append(new)
- number = len(details)
- return details, number
- def get_borders(details, tables):
- sections = []
- #print(coords)
- for first in details:
- x_min = -1
- y_min = -1
- x_max = -1
- y_max = -1
- firstx_max = first[2]
- firstx_min = first[0]
- firsty_max = first[3]
- firsty_min = first[1]
- distance_xmax = 100000000000
- distance_xmin = 100000000000
- distance_ymin = 100000000000
- distance_ymax = 100000000000
- for second in details:
- secondx_min = second[0]
- secondx_max = second[2]
- secondy_min = second[1]
- secondy_max = second[3]
- if secondx_max < firstx_min and abs(firsty_min-secondy_min) < 90 and first != second: ###check for left side, are there any other details at the left side at a certain y-span
- if abs(firstx_min - secondx_max)/2 < distance_xmax:
- distance_xmax = abs(firstx_min - secondx_max)/2
- x_min = secondx_max + distance_xmax
- if secondx_min > firstx_max and abs(firsty_min-secondy_min) < 190 and first != second: ####check for right side
- if abs(secondx_min - firstx_max)/2 < distance_xmin:
- distance_xmin = abs(secondx_min - firstx_max)/2
- x_max = firstx_max + distance_xmin
- if firsty_min > secondy_max and abs(firstx_min-secondx_min) < 80 and first != second: ####check above
- if abs(firsty_min - secondy_max)/2 < distance_ymin:
- distance_ymin = abs(firsty_min - secondy_max)/2
- y_min = firsty_min
- if firsty_max < secondy_min and abs(firstx_min-secondx_min) < 80 and first != second: ####check below
- if abs(firsty_max - secondy_min)/2 < distance_ymax:
- distance_ymax = abs(firsty_max - secondy_min)/2
- y_max = secondy_min
- if y_min == -1:
- y_min = firsty_min
- if x_min == -1:
- x_min = 0
- if x_max == -1:
- x_max = firstx_max + distance_xmax
- if y_max == -1:
- y_max = 1000000000
- ##check if it intersects with tables
- for table in tables:
- table_xmin = table[0]
- if "Start drawing" in table[4]:
- table_xmax = 100000000
- else:
- table_xmax = table[2]
- table_ymin = table[1]
- if y_max > table_ymin:
- if table_xmin < firstx_min < table_xmax:
- y_max = table_ymin
- elif table_xmin < x_max < table_xmax:
- y_max = table_ymin
- sections.append((first,x_min, y_min,x_max,y_max))
- """for section in sections:
- print(section)"""
- return sections
- def intersects(detail, rectangle): #using the separating axis theorem
- rect1_bottom_left_x = float(detail[1][0])
- rect1_top_right_x = float(detail[1][2])
- rect1_bottom_left_y = float(detail[1][3])
- rect1_top_right_y = float(detail[1][1])
- rect2_bottom_left_x = float(rectangle[0])
- rect2_top_right_x = float(rectangle[2])
- rect2_bottom_left_y = float(rectangle[3])
- rect2_top_right_y = float(rectangle[1])
- return not (rect1_top_right_x < rect2_bottom_left_x or rect1_bottom_left_x > rect2_top_right_x or rect1_top_right_y > rect2_bottom_left_y or rect1_bottom_left_y < rect2_top_right_y)
- def main_function(result, tables):
- reg = r"([A-Z])-\1|([A-Z]\W?[A-Z]?\s?\W\s?\d\d?\s?\s?:\s?\d\d?\s?\W)"
- details, number = get_details(result)
- details = sorted(details, key=lambda x: x[0]) #sort by distance from 0,0
- sections = get_borders(details, tables)
- section = []
- details_dict = {}
- for sect in sections:
- coord = []
- coord_name = sect[0][4]
- for sec in sect[1:]:
- coord.append(sec)
- details_dict[coord_name] = coord
- section.append(list((coord_name,coord)))
- for table in tables:
- table[3] = 10000000
- coord = []
- name = "ZZZZZTable"
- for tab in table[:4]:
- coord.append(tab)
- details_dict[name] = coord
- section.append(list((name,coord)))
- if number == 0 | len(section) == 0:
- section.append(list(("No details",list((000.000,000.000,100000000.000,10000000.000)))))
- dict_help = {}
- for res in result:
- for det in section:
- help_dict = {}
- if re.match(reg, res): ###damit nicht details zu details zugeordnet werden!!!
- break
- if intersects(det,result[res]):
- name = det[0]
- help_dict[res] = result[res]
- if name in dict_help:
- dict_help[name].update(help_dict)
- else:
- dict_help[name] = help_dict
- break
- return dict_help, details_dict
|