프로젝트

일반

사용자정보

개정판 2e5a8935

ID2e5a8935dc70f972d7e36c4e24ea03e697c5315e
상위 dee2cc26
하위 b9c3eb4e

함의성이(가) 일년 이상 전에 추가함

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

클립보드 이미지 추가 (최대 크기: 500 MB)