개정판 2e5a8935
add symbol only recognition func
Change-Id: Id4919a1904753f4c13eefaa8eb182e378fc03335
DTI_PID/DTI_PID/MainWindow.py | ||
---|---|---|
3133 | 3133 |
self.addMessage.emit(MessageType.Error, message) |
3134 | 3134 |
|
3135 | 3135 |
def recognizeSymbol(self): |
3136 |
print('a') |
|
3136 |
# save alarm |
|
3137 |
self.save_alarm_enable(False) |
|
3138 |
|
|
3139 |
if not self.graphicsView.hasImage(): |
|
3140 |
self.showImageSelectionMessageBox() |
|
3141 |
return |
|
3142 |
|
|
3143 |
app_doc_data = AppDocData.instance() |
|
3144 |
|
|
3145 |
current_drawing = app_doc_data.activeDrawing |
|
3146 |
checked_drawings = {} |
|
3147 |
drawing_top = self.treeWidgetDrawingList.topLevelItem(0) |
|
3148 |
|
|
3149 |
for idx in range(drawing_top.childCount()): |
|
3150 |
child = drawing_top.child(idx) |
|
3151 |
if child.data(Qt.UserRole, 0) is current_drawing: |
|
3152 |
checked_drawings[child.data(Qt.UserRole, 0)] = child |
|
3153 |
|
|
3154 |
try: |
|
3155 |
self.on_clear_log() |
|
3156 |
dlg = QRecognitionDialog(self, [drawing for drawing in checked_drawings.keys()], symbolOnly=True) |
|
3157 |
dlg.exec_() |
|
3158 |
|
|
3159 |
self.changeViewCheckedState(True) |
|
3160 |
except Exception as ex: |
|
3161 |
message = f"error occurred({repr(ex)}) in {sys.exc_info()[-1].tb_frame.f_code.co_filename}:" \ |
|
3162 |
f"{sys.exc_info()[-1].tb_lineno}" |
|
3163 |
self.addMessage.emit(MessageType.Error, message) |
|
3164 |
|
|
3165 |
# save alarm |
|
3166 |
self.save_alarm_enable(True, True) |
|
3137 | 3167 |
|
3138 | 3168 |
def recognize(self): |
3139 | 3169 |
"""recognize symbol, text and line for selected drawings""" |
... | ... | |
3185 | 3215 |
drawing.datetime = _now |
3186 | 3216 |
tree_item.setText(1, _now) |
3187 | 3217 |
#app_doc_data.saveDrawings(checked_drawings.keys()) |
3218 |
# up to here |
|
3219 |
|
|
3188 | 3220 |
self.changeViewCheckedState(True) |
3221 |
|
|
3189 | 3222 |
# count up for recognition |
3190 | 3223 |
QLicenseDialog.count_up() |
3191 | 3224 |
# up to here |
DTI_PID/DTI_PID/RecognitionDialog.py | ||
---|---|---|
21 | 21 |
from EngineeringUnknownItem import QEngineeringUnknownItem |
22 | 22 |
from EngineeringErrorItem import QEngineeringErrorItem |
23 | 23 |
from EngineeringEndBreakItem import QEngineeringEndBreakItem |
24 |
from EngineeringAbstractItem import QEngineeringAbstractItem |
|
24 | 25 |
from EngineeringLineItem import QEngineeringLineItem |
25 | 26 |
from EngineeringTextItem import QEngineeringTextItem |
26 | 27 |
from EngineeringLineNoTextItem import QEngineeringLineNoTextItem |
... | ... | |
441 | 442 |
2018.11.29 euisung change name drawUnknownItems() -> createUnknownItems |
442 | 443 |
''' |
443 | 444 |
def create_unknown_items(self, path): |
444 |
from QEngineeringFlowArrowItem import QEngineeringFlowArrowItem |
|
445 |
from EngineeringLineItem import QEngineeringLineItem |
|
446 | 445 |
from EngineeringUnknownItem import QEngineeringUnknownItem |
447 | 446 |
|
448 | 447 |
try: |
... | ... | |
798 | 797 |
textDetector = TextDetector() |
799 | 798 |
|
800 | 799 |
configs = app_doc_data.getConfigs('Engine', 'Symbol') |
801 |
if (configs and int(configs[0].value) is 1) or not configs or worker.isTrainingChecked: |
|
800 |
if (configs and int(configs[0].value) is 1) or not configs or worker.isTrainingChecked or worker.symbolOnly:
|
|
802 | 801 |
Worker.initTargetSymbolDataList() |
803 | 802 |
else: |
804 | 803 |
Worker.initTargetSymbolDataList(all=True) |
... | ... | |
818 | 817 |
#worker.scene.clear() |
819 | 818 |
#worker.text_scene.clear() |
820 | 819 |
#worker.line_scene.clear() |
821 |
worker.clear_scene.emit(worker.scene, worker.text_scene, worker.line_scene) |
|
822 |
worker.cond.wait(worker.mutex) |
|
820 |
if not worker.symbolOnly: |
|
821 |
worker.clear_scene.emit(worker.scene, worker.text_scene, worker.line_scene) |
|
822 |
worker.cond.wait(worker.mutex) |
|
823 | 823 |
|
824 |
app_doc_data.clearItemList(True) |
|
824 |
app_doc_data.clearItemList(True)
|
|
825 | 825 |
|
826 | 826 |
app_doc_data.setImgFilePath(mainRes) |
827 | 827 |
app_doc_data.imgSrc = None |
... | ... | |
830 | 830 |
#app_doc_data.activeDrawing.set_pid_source(Image.open(mainRes)) |
831 | 831 |
|
832 | 832 |
# Load equipment package |
833 |
worker.add_predata_to_scene.emit(app_doc_data.activeDrawing, worker.scene, False, False, False, False, True) |
|
834 |
worker.cond.wait(worker.mutex) |
|
833 |
if not worker.symbolOnly: |
|
834 |
worker.add_predata_to_scene.emit(app_doc_data.activeDrawing, worker.scene, False, False, False, False, True) |
|
835 |
worker.cond.wait(worker.mutex) |
|
835 | 836 |
|
836 | 837 |
# remove not drawing area |
837 | 838 |
configs = app_doc_data.getConfigs('{} Equipment Desc Area'.format(app_doc_data.imgName)) |
... | ... | |
858 | 859 |
#cv2.imwrite('c:\\temp\\removed_note.png', app_doc_data.imgSrc) |
859 | 860 |
# up to here |
860 | 861 |
|
862 |
if worker.symbolOnly: |
|
863 |
for _item in [_item for _item in worker.scene.items() if issubclass(type(_item), QEngineeringAbstractItem)]: |
|
864 |
rect = _item.sceneBoundingRect() |
|
865 |
cv2.rectangle(app_doc_data.imgSrc, (round(rect.x()), round(rect.y())), |
|
866 |
(round(rect.x() + rect.width()), round(rect.y() + rect.height())), 255, -1) |
|
867 |
|
|
861 | 868 |
area = app_doc_data.getArea('Drawing') |
862 | 869 |
if area is not None: |
863 | 870 |
# copy image |
... | ... | |
1104 | 1111 |
app_doc_data.imgName = os.path.splitext(os.path.basename(mainRes))[0] |
1105 | 1112 |
|
1106 | 1113 |
worker.text_time = timeit.default_timer() - worker.text_time if not text_time_temp else timeit.default_timer() - worker.text_time + text_time_temp |
1107 |
else:
|
|
1114 |
elif not worker.symbolOnly:
|
|
1108 | 1115 |
import math |
1109 | 1116 |
from TextInfo import TextInfo |
1110 | 1117 |
|
... | ... | |
1132 | 1139 |
|
1133 | 1140 |
worker.updateBatchProgress.emit(len(drawings), 2) |
1134 | 1141 |
|
1135 |
# check symbol validate |
|
1136 |
#valid_sym = [] |
|
1137 |
for index in reversed(range(len(searchedTextSymList))): |
|
1138 |
sym_xmin = searchedTextSymList[index].getSp()[0] |
|
1139 |
sym_ymin = searchedTextSymList[index].getSp()[1] |
|
1140 |
sym_xmax = searchedTextSymList[index].getSp()[0] + searchedTextSymList[index].getWidth() |
|
1141 |
sym_ymax = searchedTextSymList[index].getSp()[1] + searchedTextSymList[index].getHeight() |
|
1142 |
valid_count = searchedTextSymList[index].getHasInstrumentLabel() |
|
1143 |
valid = 0 |
|
1144 |
for text_info in textInfoList: |
|
1145 |
info_center = text_info.center |
|
1146 |
if sym_xmin < info_center[0] < sym_xmax and sym_ymin < info_center[1] < sym_ymax: |
|
1147 |
valid += 1 |
|
1148 |
break |
|
1149 |
#if valid >= valid_count: |
|
1150 |
# valid_sym.append(searchedTextSymList[index]) |
|
1151 |
# break |
|
1152 |
if valid < valid_count: |
|
1153 |
searchedSymbolList.pop(searchedSymbolList.index(searchedTextSymList[index])) |
|
1142 |
if not worker.symbolOnly: |
|
1143 |
# check symbol validate |
|
1144 |
#valid_sym = [] |
|
1145 |
for index in reversed(range(len(searchedTextSymList))): |
|
1146 |
sym_xmin = searchedTextSymList[index].getSp()[0] |
|
1147 |
sym_ymin = searchedTextSymList[index].getSp()[1] |
|
1148 |
sym_xmax = searchedTextSymList[index].getSp()[0] + searchedTextSymList[index].getWidth() |
|
1149 |
sym_ymax = searchedTextSymList[index].getSp()[1] + searchedTextSymList[index].getHeight() |
|
1150 |
valid_count = searchedTextSymList[index].getHasInstrumentLabel() |
|
1151 |
valid = 0 |
|
1152 |
for text_info in textInfoList: |
|
1153 |
info_center = text_info.center |
|
1154 |
if sym_xmin < info_center[0] < sym_xmax and sym_ymin < info_center[1] < sym_ymax: |
|
1155 |
valid += 1 |
|
1156 |
break |
|
1157 |
#if valid >= valid_count: |
|
1158 |
# valid_sym.append(searchedTextSymList[index]) |
|
1159 |
# break |
|
1160 |
if valid < valid_count: |
|
1161 |
searchedSymbolList.pop(searchedSymbolList.index(searchedTextSymList[index])) |
|
1154 | 1162 |
|
1155 | 1163 |
# roll back because invalidated symbol was deleted for text detection |
1156 | 1164 |
app_doc_data.imgSrc = app_doc_data.activeDrawing.image_origin |
1157 | 1165 |
|
1158 | 1166 |
for sym in searchedSymbolList: |
1159 |
Worker.remove_detected_symbol_image(sym, app_doc_data.imgSrc)
|
|
1167 |
Worker.remove_detected_symbol_image(sym, app_doc_data.imgSrc) |
|
1160 | 1168 |
#pool = futures.ThreadPoolExecutor(max_workers=THREAD_MAX_WORKER) |
1161 | 1169 |
#for sym in valid_sym: |
1162 | 1170 |
# pool.submit(Worker.remove_detected_symbol_image, sym, app_doc_data.imgSrc) |
... | ... | |
1183 | 1191 |
|
1184 | 1192 |
if isLineChecked: |
1185 | 1193 |
Worker.recognizeLine(mainRes, listWidget, worker.scene, worker) |
1186 |
else:
|
|
1194 |
elif not worker.symbolOnly:
|
|
1187 | 1195 |
"""load lines""" |
1188 | 1196 |
worker.add_predata_to_scene.emit(app_doc_data.activeDrawing, worker.line_scene, False, False, True, False, False) |
1189 | 1197 |
worker.cond.wait(worker.mutex) |
... | ... | |
1358 | 1366 |
worker.displayLog.emit(MessageType.Error, message) |
1359 | 1367 |
# up to here |
1360 | 1368 |
|
1361 |
# make short line that can not detected, symbol to line |
|
1362 |
try: |
|
1363 |
conns = [] |
|
1364 |
for sym in symbols: |
|
1365 |
if sym.conn_type: |
|
1366 |
for index in range(len(sym.conn_type)): |
|
1367 |
if QEngineeringLineItem.check_piping(sym.conn_type[index], True): |
|
1368 |
item = sym.connectors[index].connectedItem |
|
1369 |
if item is None and sym.connectors[index] not in not_conn: |
|
1370 |
conns.append(sym.connectors[index]) |
|
1371 |
|
|
1372 |
Worker.make_short_lines_stl(app_doc_data.lines, conns, worker) |
|
1369 |
if not worker.symbolOnly: |
|
1370 |
# make short line that can not detected, symbol to line |
|
1371 |
try: |
|
1372 |
conns = [] |
|
1373 |
for sym in symbols: |
|
1374 |
if sym.conn_type: |
|
1375 |
for index in range(len(sym.conn_type)): |
|
1376 |
if QEngineeringLineItem.check_piping(sym.conn_type[index], True): |
|
1377 |
item = sym.connectors[index].connectedItem |
|
1378 |
if item is None and sym.connectors[index] not in not_conn: |
|
1379 |
conns.append(sym.connectors[index]) |
|
1380 |
|
|
1381 |
Worker.make_short_lines_stl(app_doc_data.lines, conns, worker) |
|
1382 |
|
|
1383 |
except Exception as ex: |
|
1384 |
message = f"error occurred({repr(ex)}) in {sys.exc_info()[-1].tb_frame.f_code.co_filename}:" \ |
|
1385 |
f"{sys.exc_info()[-1].tb_lineno}" |
|
1386 |
worker.displayLog.emit(MessageType.Error, message) |
|
1387 |
|
|
1388 |
# remove line has not connected item |
|
1389 |
try: |
|
1390 |
count = 1 |
|
1391 |
while count > 0: |
|
1392 |
count = 0 |
|
1393 |
for line in reversed(app_doc_data.lines): |
|
1394 |
if not line.has_connection: |
|
1395 |
app_doc_data.lines.remove(line) |
|
1396 |
app_doc_data.allItems.remove(line) |
|
1397 |
count += 1 |
|
1398 |
for item in app_doc_data.lines + symbols: |
|
1399 |
for conn in item.connectors: |
|
1400 |
if conn.connectedItem is line: |
|
1401 |
conn.connectedItem = None |
|
1402 |
except Exception as ex: |
|
1403 |
message = f"error occurred({repr(ex)}) in {sys.exc_info()[-1].tb_frame.f_code.co_filename}:" \ |
|
1404 |
f"{sys.exc_info()[-1].tb_lineno}" |
|
1405 |
worker.displayLog.emit(MessageType.Error, message) |
|
1406 |
# up to here |
|
1373 | 1407 |
|
1374 |
except Exception as ex: |
|
1375 |
message = f"error occurred({repr(ex)}) in {sys.exc_info()[-1].tb_frame.f_code.co_filename}:" \ |
|
1376 |
f"{sys.exc_info()[-1].tb_lineno}" |
|
1377 |
worker.displayLog.emit(MessageType.Error, message) |
|
1408 |
# change line type using visual pattern |
|
1409 |
try: |
|
1410 |
lines = [] |
|
1411 |
for sym in symbols: |
|
1412 |
if sym.conn_type: |
|
1413 |
for index in range(len(sym.conn_type)): |
|
1414 |
if not QEngineeringLineItem.check_piping(sym.conn_type[index], True): |
|
1415 |
item = sym.connectors[index].connectedItem |
|
1416 |
if item and type(item) is QEngineeringLineItem: |
|
1417 |
if item in lines: |
|
1418 |
continue |
|
1419 |
else: |
|
1420 |
run = [item] |
|
1421 |
Worker.find_connected_line(run, item) |
|
1422 |
lines.extend(run) |
|
1423 |
|
|
1424 |
Worker.changeVisualLineType(lines, worker) |
|
1425 |
|
|
1426 |
except Exception as ex: |
|
1427 |
message = f"error occurred({repr(ex)}) in {sys.exc_info()[-1].tb_frame.f_code.co_filename}:" \ |
|
1428 |
f"{sys.exc_info()[-1].tb_lineno}" |
|
1429 |
worker.displayLog.emit(MessageType.Error, message) |
|
1430 |
# up to here |
|
1378 | 1431 |
|
1379 |
# remove line has not connected item |
|
1380 |
try: |
|
1381 |
count = 1 |
|
1382 |
while count > 0: |
|
1383 |
count = 0 |
|
1432 |
# change line type using line type contidion |
|
1433 |
try: |
|
1384 | 1434 |
for line in reversed(app_doc_data.lines): |
1385 |
if not line.has_connection: |
|
1386 |
app_doc_data.lines.remove(line) |
|
1387 |
app_doc_data.allItems.remove(line) |
|
1388 |
count += 1 |
|
1389 |
for item in app_doc_data.lines + symbols: |
|
1390 |
for conn in item.connectors: |
|
1391 |
if conn.connectedItem is line: |
|
1392 |
conn.connectedItem = None |
|
1393 |
except Exception as ex: |
|
1394 |
message = f"error occurred({repr(ex)}) in {sys.exc_info()[-1].tb_frame.f_code.co_filename}:" \ |
|
1395 |
f"{sys.exc_info()[-1].tb_lineno}" |
|
1396 |
worker.displayLog.emit(MessageType.Error, message) |
|
1397 |
# up to here |
|
1398 |
|
|
1399 |
# change line type using visual pattern |
|
1400 |
try: |
|
1401 |
lines = [] |
|
1402 |
for sym in symbols: |
|
1403 |
if sym.conn_type: |
|
1404 |
for index in range(len(sym.conn_type)): |
|
1405 |
if not QEngineeringLineItem.check_piping(sym.conn_type[index], True): |
|
1406 |
item = sym.connectors[index].connectedItem |
|
1407 |
if item and type(item) is QEngineeringLineItem: |
|
1408 |
if item in lines: |
|
1409 |
continue |
|
1410 |
else: |
|
1411 |
run = [item] |
|
1412 |
Worker.find_connected_line(run, item) |
|
1413 |
lines.extend(run) |
|
1414 |
|
|
1415 |
Worker.changeVisualLineType(lines, worker) |
|
1416 |
|
|
1417 |
except Exception as ex: |
|
1418 |
message = f"error occurred({repr(ex)}) in {sys.exc_info()[-1].tb_frame.f_code.co_filename}:" \ |
|
1419 |
f"{sys.exc_info()[-1].tb_lineno}" |
|
1420 |
worker.displayLog.emit(MessageType.Error, message) |
|
1421 |
# up to here |
|
1422 |
|
|
1423 |
# change line type using line type contidion |
|
1424 |
try: |
|
1425 |
for line in reversed(app_doc_data.lines): |
|
1426 |
line.update_line_type() |
|
1427 |
except Exception as ex: |
|
1428 |
message = f"error occurred({repr(ex)}) in {sys.exc_info()[-1].tb_frame.f_code.co_filename}:" \ |
|
1429 |
f"{sys.exc_info()[-1].tb_lineno}" |
|
1430 |
worker.displayLog.emit(MessageType.Error, message) |
|
1431 |
# up to here |
|
1435 |
line.update_line_type() |
|
1436 |
except Exception as ex: |
|
1437 |
message = f"error occurred({repr(ex)}) in {sys.exc_info()[-1].tb_frame.f_code.co_filename}:" \ |
|
1438 |
f"{sys.exc_info()[-1].tb_lineno}" |
|
1439 |
worker.displayLog.emit(MessageType.Error, message) |
|
1440 |
# up to here |
|
1432 | 1441 |
|
1433 |
#print('flag4') |
|
1434 |
worker.create_unknown_items(mainRes) |
|
1442 |
if not worker.symbolOnly: |
|
1443 |
#print('flag4') |
|
1444 |
worker.create_unknown_items(mainRes) |
|
1435 | 1445 |
worker.add_detected_items_to_scene.emit(worker.scene, [flange_list, blind_list]) |
1436 | 1446 |
worker.cond.wait(worker.mutex) |
1437 | 1447 |
|
1438 |
# run preset |
|
1439 |
presets = app_doc_data.getSymbolPreset() |
|
1440 |
for preset in presets: |
|
1441 |
worker.preset_execute.emit(worker.scene, preset[0], preset[1], preset[2], preset[3]) |
|
1442 |
worker.cond.wait(worker.mutex) |
|
1448 |
if not worker.symbolOnly: |
|
1449 |
# run preset |
|
1450 |
presets = app_doc_data.getSymbolPreset() |
|
1451 |
for preset in presets: |
|
1452 |
worker.preset_execute.emit(worker.scene, preset[0], preset[1], preset[2], preset[3]) |
|
1453 |
worker.cond.wait(worker.mutex) |
|
1443 | 1454 |
|
1444 | 1455 |
# remove piping line and text for instrument mode |
1445 | 1456 |
try: |
... | ... | |
1493 | 1504 |
worker.displayLog.emit(MessageType.Error, message) |
1494 | 1505 |
# up to here |
1495 | 1506 |
|
1496 |
#print('flag5') |
|
1497 |
worker.save_scene.emit(worker.scene) |
|
1498 |
worker.cond.wait(worker.mutex) |
|
1507 |
if not worker.symbolOnly: |
|
1508 |
#print('flag5') |
|
1509 |
worker.save_scene.emit(worker.scene) |
|
1510 |
worker.cond.wait(worker.mutex) |
|
1499 | 1511 |
|
1500 | 1512 |
worker.scene._end = False |
1501 | 1513 |
# clear drawing |
... | ... | |
1514 | 1526 |
""" make short lines logically, symbol to symbol """ |
1515 | 1527 |
|
1516 | 1528 |
import math |
1517 |
from EngineeringAbstractItem import QEngineeringAbstractItem |
|
1518 | 1529 |
|
1519 | 1530 |
try: |
1520 | 1531 |
app_doc_data = AppDocData.instance() |
... | ... | |
3817 | 3828 |
2018.05.29 Jeongwoo Chnage parameter(graphicsView → parent) and Get graphicsView from parent |
3818 | 3829 |
''' |
3819 | 3830 |
|
3820 |
def __init__(self, parent, drawings): # Parent is MainWindow |
|
3831 |
def __init__(self, parent, drawings, symbolOnly=False): # Parent is MainWindow
|
|
3821 | 3832 |
from AppDocData import AppDocData |
3822 | 3833 |
|
3823 | 3834 |
QDialog.__init__(self, parent) |
3824 | 3835 |
|
3825 | 3836 |
self.parent = parent |
3826 |
self._scene = QGraphicsScene() |
|
3837 |
self._scene = QGraphicsScene() if not symbolOnly else parent.graphicsView.scene()
|
|
3827 | 3838 |
self._text_scene = QGraphicsScene() |
3828 | 3839 |
self._line_scene = QGraphicsScene() |
3829 | 3840 |
self.drawings = drawings |
... | ... | |
3832 | 3843 |
self.ui.setupUi(self) |
3833 | 3844 |
self.isTreated = False |
3834 | 3845 |
|
3846 |
self.symbolOnly = symbolOnly |
|
3847 |
|
|
3835 | 3848 |
self.ui.buttonBox.setEnabled(True) |
3836 | 3849 |
self.ui.listWidget.model().rowsInserted.connect(self.rowInserted) |
3837 | 3850 |
self.ui.recognizeButton.clicked.connect(self.recognizeButtonClicked) |
... | ... | |
3848 | 3861 |
else: |
3849 | 3862 |
self.ui.checkBoxTraining.setVisible(False) |
3850 | 3863 |
|
3851 |
if False:
|
|
3864 |
if self.symbolOnly:
|
|
3852 | 3865 |
self.ui.checkBoxSymbol.setCheckState(Qt.Checked) |
3866 |
self.ui.lineCheckBox.setVisible(False) |
|
3867 |
self.ui.checkBoxText.setVisible(False) |
|
3853 | 3868 |
self.ui.lineCheckBox.setCheckState(Qt.Unchecked) |
3854 | 3869 |
self.ui.checkBoxText.setCheckState(Qt.Unchecked) |
3870 |
self.ui.checkBoxTraining.setVisible(False) |
|
3871 |
#self.ui.progressBarBatch.setVisible(False) |
|
3855 | 3872 |
else: |
3856 | 3873 |
self.ui.checkBoxSymbol.setCheckState(Qt.Checked) |
3857 | 3874 |
self.ui.lineCheckBox.setCheckState(Qt.Checked) |
... | ... | |
4000 | 4017 |
self.obj.isTextChecked = self.ui.checkBoxText.isChecked() |
4001 | 4018 |
self.obj.isLineChecked = self.ui.lineCheckBox.isChecked() |
4002 | 4019 |
self.obj.isTrainingChecked = self.ui.checkBoxTraining.isChecked() |
4020 |
self.obj.symbolOnly = self.symbolOnly |
|
4003 | 4021 |
self.thread = QThread() # no parent! |
4004 | 4022 |
|
4005 | 4023 |
# 2 - Move the Worker object to the Thread object |
DTI_PID/DTI_PID/UI/Edit.ui | ||
---|---|---|
6 | 6 |
<rect> |
7 | 7 |
<x>0</x> |
8 | 8 |
<y>0</y> |
9 |
<width>580</width>
|
|
9 |
<width>587</width>
|
|
10 | 10 |
<height>84</height> |
11 | 11 |
</rect> |
12 | 12 |
</property> |
... | ... | |
34 | 34 |
<property name="spacing"> |
35 | 35 |
<number>0</number> |
36 | 36 |
</property> |
37 |
<item row="0" column="4">
|
|
38 |
<widget class="QToolButton" name="toolButtonConnectLineToSymbol">
|
|
37 |
<item row="0" column="3">
|
|
38 |
<widget class="QToolButton" name="toolButtonOCRUnknown">
|
|
39 | 39 |
<property name="text"> |
40 |
<string>Connect |
|
41 |
Symbols and Lines</string> |
|
40 |
<string>OCR Unknown Items</string> |
|
42 | 41 |
</property> |
43 | 42 |
<property name="icon"> |
44 | 43 |
<iconset resource="../res/MainWindow.qrc"> |
45 |
<normaloff>:/newPrefix/connect_symbol_line.svg</normaloff>:/newPrefix/connect_symbol_line.svg</iconset>
|
|
44 |
<normaloff>:/newPrefix/OCR.svg</normaloff>:/newPrefix/OCR.svg</iconset>
|
|
46 | 45 |
</property> |
47 | 46 |
<property name="iconSize"> |
48 | 47 |
<size> |
... | ... | |
58 | 57 |
</property> |
59 | 58 |
</widget> |
60 | 59 |
</item> |
61 |
<item row="0" column="1">
|
|
62 |
<widget class="QToolButton" name="toolButtonTextDataList">
|
|
60 |
<item row="0" column="5">
|
|
61 |
<widget class="QToolButton" name="toolButtonConnectLineToSymbol">
|
|
63 | 62 |
<property name="text"> |
64 |
<string>Text
|
|
65 |
Data List</string>
|
|
63 |
<string>Connect
|
|
64 |
Symbols and Lines</string>
|
|
66 | 65 |
</property> |
67 | 66 |
<property name="icon"> |
68 | 67 |
<iconset resource="../res/MainWindow.qrc"> |
69 |
<normaloff>:/newPrefix/text_list_32px.svg</normaloff>:/newPrefix/text_list_32px.svg</iconset>
|
|
68 |
<normaloff>:/newPrefix/connect_symbol_line.svg</normaloff>:/newPrefix/connect_symbol_line.svg</iconset>
|
|
70 | 69 |
</property> |
71 | 70 |
<property name="iconSize"> |
72 | 71 |
<size> |
... | ... | |
82 | 81 |
</property> |
83 | 82 |
</widget> |
84 | 83 |
</item> |
85 |
<item row="0" column="2">
|
|
86 |
<widget class="QToolButton" name="toolButtonOCRUnknown">
|
|
84 |
<item row="0" column="0">
|
|
85 |
<widget class="QToolButton" name="toolButtonFindReplaceText">
|
|
87 | 86 |
<property name="text"> |
88 |
<string>OCR Unknown Items</string> |
|
87 |
<string>Text |
|
88 |
Find/Replace |
|
89 |
(Ctrl+F)</string> |
|
89 | 90 |
</property> |
90 | 91 |
<property name="icon"> |
91 | 92 |
<iconset resource="../res/MainWindow.qrc"> |
92 |
<normaloff>:/newPrefix/OCR.svg</normaloff>:/newPrefix/OCR.svg</iconset>
|
|
93 |
<normaloff>:/newPrefix/ReplaceText.svg</normaloff>:/newPrefix/ReplaceText.svg</iconset>
|
|
93 | 94 |
</property> |
94 | 95 |
<property name="iconSize"> |
95 | 96 |
<size> |
... | ... | |
105 | 106 |
</property> |
106 | 107 |
</widget> |
107 | 108 |
</item> |
108 |
<item row="0" column="0">
|
|
109 |
<widget class="QToolButton" name="toolButtonFindReplaceText">
|
|
109 |
<item row="0" column="4">
|
|
110 |
<widget class="QToolButton" name="toolButtonSymbolReplaceInsert">
|
|
110 | 111 |
<property name="text"> |
111 |
<string>Text |
|
112 |
Find/Replace |
|
113 |
(Ctrl+F)</string> |
|
112 |
<string>Symbol |
|
113 |
Replace/Insert</string> |
|
114 | 114 |
</property> |
115 | 115 |
<property name="icon"> |
116 | 116 |
<iconset resource="../res/MainWindow.qrc"> |
117 |
<normaloff>:/newPrefix/ReplaceText.svg</normaloff>:/newPrefix/ReplaceText.svg</iconset>
|
|
117 |
<normaloff>:/newPrefix/Reinforcement.svg</normaloff>:/newPrefix/Reinforcement.svg</iconset>
|
|
118 | 118 |
</property> |
119 | 119 |
<property name="iconSize"> |
120 | 120 |
<size> |
... | ... | |
130 | 130 |
</property> |
131 | 131 |
</widget> |
132 | 132 |
</item> |
133 |
<item row="0" column="3">
|
|
134 |
<widget class="QToolButton" name="toolButtonSymbolReplaceInsert">
|
|
133 |
<item row="0" column="2">
|
|
134 |
<widget class="QToolButton" name="toolButtonTextDataList">
|
|
135 | 135 |
<property name="text"> |
136 |
<string>Symbol
|
|
137 |
Replace/Insert</string>
|
|
136 |
<string>Text
|
|
137 |
Data List</string>
|
|
138 | 138 |
</property> |
139 | 139 |
<property name="icon"> |
140 | 140 |
<iconset resource="../res/MainWindow.qrc"> |
141 |
<normaloff>:/newPrefix/Reinforcement.svg</normaloff>:/newPrefix/Reinforcement.svg</iconset>
|
|
141 |
<normaloff>:/newPrefix/text_list_32px.svg</normaloff>:/newPrefix/text_list_32px.svg</iconset>
|
|
142 | 142 |
</property> |
143 | 143 |
<property name="iconSize"> |
144 | 144 |
<size> |
... | ... | |
154 | 154 |
</property> |
155 | 155 |
</widget> |
156 | 156 |
</item> |
157 |
<item row="0" column="5">
|
|
157 |
<item row="0" column="1">
|
|
158 | 158 |
<widget class="QToolButton" name="toolButtonSymbolRecognition"> |
159 | 159 |
<property name="text"> |
160 | 160 |
<string>Recognize |
내보내기 Unified diff