프로젝트

일반

사용자정보

개정판 7fb00532

ID7fb0053246005e54b37e915b24197226f88e5c0c
상위 6eacce1d
하위 4d524245

백흠경이(가) 5년 이상 전에 추가함

issue #1173: 내보내기

Change-Id: I5d6fb29ea36c919217cf2f1950d987252a693008

차이점 보기:

DTI_PID/DTI_PID/AppDocData.py
23 23
import symbol
24 24
from NominalPipeSize import NominalPipeSize
25 25

  
26
class Source:
27
    def __init__(self, source):
28
        if type(source) is np.ndarray:
29
            self.source = Image.fromarray(source)
30
        elif type(source) is PngImagePlugin.PngImageFile or type(source) is JpegImagePlugin.JpegImageFile:
31
            self.source = source
32
        elif type(source) is QImage:
33
            self.source = Image.fromqimage(source)
34
        elif type(source) is QPixmap:
35
            self.source = Image.fromqpixmap(source)
36
        
37
    '''
38
        @history    2018.05.18  Jeongwoo    When Parameter [rect] is None, return whole image
39
    '''
40
    def getPyImageOnRect(self, rect = None):
41
        if rect is not None:
42
            return self.source.copy().crop((rect.left(), rect.top(), rect.right(), rect.bottom()))
43
        else:
44
            return self.source.copy()
45

  
46
    def getQImageOnRect(self, rect = None):
47
        image = ImageQt(self.getPyImageOnRect(rect))
48
        return image.convertToFormat(QImage.Format_RGBA8888)
49

  
50 26
class Config:
51 27
    def __init__(self, section, key, value):
52 28
        self.section = section
......
87 63

  
88 64
        self._imgFilePath = None
89 65
        self.imgName = None
90
        self.imgWidth = 0
91
        self.imgHeight = 0
92 66
        self._OCRData = None
93 67
        self._imgSrc = None
94 68

  
......
138 112
    def clear(self):
139 113
        self._imgFilePath = None
140 114
        self.imgName = None
141
        self.imgWidth = 0
142
        self.imgHeight = 0
143 115
        self._imgSrc = None
144 116

  
145 117
        self._areas.clear()
......
165 137
        @date       2018.09.28
166 138
    '''
167 139
    def getDrawingFileList(self):
168
        """
169
        get drawing files which's extension is .png or jpg from drawing folder
170
        """
140
        """ get drawing files which's extension is .png or jpg from drawing folder """
171 141
        try:
172 142
            project = AppDocData.instance().getCurrentProject()
173 143
            path = project.getDrawingFilePath()
......
403 373
        matches = [config for config in self.lineTypeConfigs if config[0] == lineType]
404 374
        return matches[0] if matches else (lineType, '#0000FF', 5, Qt.SolidLine, 50)        
405 375

  
406
    def setCurrentPidSource(self, image):
407
        self.imgWidth, self.imgHeight = image.size
408

  
409
        self.currentPidSource = Source(image)
410

  
411 376
    def getCurrentPidSource(self):
412
        return self.currentPidSource
377
        return self.activeDrawing.currentPidSource
413 378

  
414 379
    '''
415 380
        @brief      Check if exist file name or not
DTI_PID/DTI_PID/Commands/SaveWorkCommand.py
65 65
        import XmlGenerator as xg
66 66
        from AppDocData import AppDocData
67 67

  
68
        docData = AppDocData.instance()
69
        result = xg.writeXmlOnScene(docData.imgName, docData.imgWidth, docData.imgHeight)
68
        app_doc_data = AppDocData.instance()
69
        path = os.path.join(app_doc_data.getCurrentProject().getTempPath(), app_doc_data.imgName + '.xml')
70
        result = xg.writeXmlOnScene(path, app_doc_data.activeDrawing.width, app_doc_data.activeDrawing.height, app_doc_data.allItems, app_doc_data.tracerLineNos)
70 71
        
71 72
        resultStr = '[저장 결과]'
72 73

  
DTI_PID/DTI_PID/DataExportDialog.py
1
# coding: utf-8
2
""" This is Data Transfer dialog module """
3

  
4
import os
5
import sys
6
from PyQt5.QtCore import *
7
from PyQt5.QtGui import *
8
from PyQt5.QtWidgets import *
9

  
10
from AppDocData import AppDocData, MessageType
11

  
12
sys.path.insert(0, os.path.dirname(os.path.realpath(__file__)) + '\\UI')
13
import DataExport_UI
14

  
15
class QDataExportDialog(QDialog):
16
    """ This Data Trasnfer dialog class """
17

  
18
    def __init__(self, parent):
19
        QDialog.__init__(self, parent)
20

  
21
        self.ui = DataExport_UI.Ui_DataExportDialog()
22
        self.ui.setupUi(self)
23
        self.ui.pushButtonFolder.clicked.connect(self.on_select_folder)
24

  
25
        self.ui.treeWidgetDrawingList.setHeaderHidden(False)
26
        self.ui.treeWidgetDrawingList.header().setStretchLastSection(False)
27
        self.ui.treeWidgetDrawingList.setHeaderLabels([self.tr('Name'), self.tr('DateTime')])
28
        self.ui.treeWidgetDrawingList.header().setSectionResizeMode(0, QHeaderView.ResizeToContents)
29
        self.ui.treeWidgetDrawingList.header().setSectionResizeMode(1, QHeaderView.ResizeToContents)
30
        self.load_data()
31

  
32
    def load_data(self):
33
        """ load mssql server information and drawing list """
34
        
35
        configs = AppDocData.instance().getConfigs('Data Export', 'Folder')
36
        if configs:
37
            self.ui.lineEditFolder.setText(configs[0].value)
38

  
39
        self.load_drawing_list()
40

  
41
    def load_drawing_list(self):
42
        """ load drawing list """
43

  
44
        try:
45
            app_doc_data = AppDocData.instance()
46
            drawings = app_doc_data.getDrawings()
47

  
48
            self.ui.treeWidgetDrawingList.clear()
49
            self.ui.treeWidgetDrawingList.root = QTreeWidgetItem(self.ui.treeWidgetDrawingList, [self.tr('P&ID Drawings'), ''])
50
            self.ui.treeWidgetDrawingList.root.setFlags(self.ui.treeWidgetDrawingList.root.flags() | Qt.ItemIsTristate | Qt.ItemIsUserCheckable)
51
            self.ui.treeWidgetDrawingList.root.setCheckState(0, Qt.Unchecked)
52
            for drawing in drawings:
53
                item = QTreeWidgetItem(self.ui.treeWidgetDrawingList.root, [drawing.name, drawing.datetime])
54
                item.setIcon(0, QIcon(':newPrefix/image.png'))
55
                item.setFlags(item.flags() | Qt.ItemIsUserCheckable)
56
                item.setCheckState(0, Qt.Unchecked)
57
                item.setData(0, Qt.UserRole, drawing)
58
            
59
            self.ui.treeWidgetDrawingList.root.setText(0, self.tr('P&ID Drawings')+'({})'.format(self.ui.treeWidgetDrawingList.root.childCount()))
60
            self.ui.treeWidgetDrawingList.expandItem(self.ui.treeWidgetDrawingList.root)
61
            self.ui.treeWidgetDrawingList.setSortingEnabled(True)
62
            self.ui.treeWidgetDrawingList.root.sortChildren(0, Qt.AscendingOrder)
63
            self.ui.treeWidgetDrawingList.resizeColumnToContents(0)
64
        except Exception as ex:
65
            from App import App
66
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
67
            App.mainWnd().addMessage.emit(MessageType.Error, message)
68

  
69
    def on_select_folder(self):
70
        """ select xml output folder """
71

  
72
        folder = QFileDialog.getExistingDirectory(self, self.tr('Select Directory'))
73
        self.ui.lineEditFolder.setText(folder if folder else '')
74

  
75
    def accept(self):
76
        """ export selected drawing to xml file """
77
        from AppDocData import Config
78
        from AppDatabase import AppDatabase
79

  
80
        try:
81
            app_doc_data = AppDocData.instance()
82

  
83
            configs = []
84
            folder = self.ui.lineEditFolder.text()
85
            configs.append(Config('Data Export', 'Folder', folder))
86
            app_doc_data.saveConfigs(configs)
87

  
88
            checked = [self.ui.treeWidgetDrawingList.root.child(i) for i in range(self.ui.treeWidgetDrawingList.root.childCount()) \
89
                if self.ui.treeWidgetDrawingList.root.child(i).checkState(0) == Qt.Checked]
90
            self.ui.progressBarDataExport.setMaximum(len(checked))
91

  
92
            for item in checked:
93
                drawing = item.data(0, Qt.UserRole)
94
                if drawing: drawing.export(os.path.join(folder, os.path.splitext(drawing.name)[0] + '.xml'))
95
                self.ui.progressBarDataExport.setValue(self.ui.progressBarDataExport.value() + 1)
96
                QApplication.processEvents()
97

  
98
            QDialog.accept(self)
99
        except Exception as ex:
100
            from App import App
101
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
102
            App.mainWnd().addMessage.emit(MessageType.Error, message)
DTI_PID/DTI_PID/Drawing.py
4 4
import os
5 5
import sys
6 6
import uuid
7
from PIL import PngImagePlugin, JpegImagePlugin
8
from PIL import Image
9
from PIL.ImageQt import ImageQt
10
import numpy as np
7 11
from AppDocData import AppDocData
8 12

  
13
sys.path.insert(0, os.path.dirname(os.path.realpath(__file__)) + '\\Shapes')
14
from SymbolSvgItem import SymbolSvgItem
15
from EngineeringTextItem import QEngineeringTextItem
16
from EngineeringLineItem import QEngineeringLineItem
17
from EngineeringLineNoTextItem import QEngineeringLineNoTextItem
18
from EngineeringRunItem import QEngineeringRunItem
19
from EngineeringVendorItem import QEngineeringVendorItem
20
from EngineeringUnknownItem import QEngineeringUnknownItem
21
from QEngineeringTrimLineNoTextItem import QEngineeringTrimLineNoTextItem
22

  
23
class Source:
24
    """ This is Source class """
25
    def __init__(self, source):
26
        if type(source) is np.ndarray:
27
            self.source = Image.fromarray(source)
28
        elif type(source) is PngImagePlugin.PngImageFile or type(source) is JpegImagePlugin.JpegImageFile:
29
            self.source = source
30
        elif type(source) is QImage:
31
            self.source = Image.fromqimage(source)
32
        elif type(source) is QPixmap:
33
            self.source = Image.fromqpixmap(source)
34
        
35
    '''
36
        @history    2018.05.18  Jeongwoo    When Parameter [rect] is None, return whole image
37
    '''
38
    def getPyImageOnRect(self, rect = None):
39
        if rect is not None:
40
            return self.source.copy().crop((rect.left(), rect.top(), rect.right(), rect.bottom()))
41
        else:
42
            return self.source.copy()
43

  
44
    def getQImageOnRect(self, rect = None):
45
        image = ImageQt(self.getPyImageOnRect(rect))
46
        return image.convertToFormat(QImage.Format_RGBA8888)
47

  
9 48
class Drawing:
10 49
    '''
11 50
        @brief  construction
......
26 65
            self._datetime = drawing[0].datetime if drawing else None
27 66
        else:
28 67
            self.UID = uid
68

  
69
        self.width = 0
70
        self.height = 0
29 71
        self._attrs = [['Drawing No', ''], ['Rev No', ''], ['Unit', '']] # attributes
30 72

  
31 73
    @property
......
56 98
    def attrs(self, value):
57 99
        self._attrs = value
58 100

  
101
    def set_pid_source(self, image):
102
        """ set image source for drawing """
103
        self.width, self.height = image.size
104
        self.currentPidSource = Source(image)
105

  
59 106
    '''
60 107
        @brief  set attribute
61 108
        @author humkyung
......
70 117

  
71 118
        print('attribute({},{})'.format(name, value))
72 119

  
120
    def from_database(self):
121
        """ load all components of drawing """
122
        
123
        items = []
124
        tracer_line_nos = []
125
        app_doc_data = AppDocData.instance()
126
        try:
127
            components = app_doc_data.get_components(self.UID)
128

  
129
            """ parsing all symbols """
130
            for symbol in [component for component in components if component['SymbolType_UID'] != -1]:
131
                item = SymbolSvgItem.from_database(symbol)
132
                if item: items.append(item)
133

  
134
            # parse texts
135
            for text in [component for component in components if component['Name'] == 'Text' and component['SymbolType_UID'] == -1]:
136
                item = QEngineeringTextItem.from_database(text)
137
                if item:
138
                    item.uid = text['UID']
139
                    item.attribute = text['Value']
140
                    items.append(item)
141

  
142
            # note
143
            for note in [component for component in components if component['Name'] == 'Note' and component['SymbolType_UID'] == -1]:
144
                item = QEngineeringTextItem.from_database(note)
145
                if item is not None:
146
                    item.uid = note['UID']
147
                    items.append(item)
148

  
149
            for line in [component for component in components if component['Name'] == 'Line' and component['SymbolType_UID'] == -1]:
150
                item = QEngineeringLineItem.from_database(line)
151
                if item: items.append(item)
152

  
153
            for unknown in [component for component in components if component['Name'] == 'Unknown' and component['SymbolType_UID'] == -1]:
154
                item = QEngineeringUnknownItem.from_database(unknown)
155
                if item: items.append(item)
156

  
157
            for component in [component for component in components if component['Name'] == 'Line NO' and component['SymbolType_UID'] == -1]:
158
                line_no = QEngineeringLineNoTextItem.from_database(component)
159
                if type(line_no) is QEngineeringLineNoTextItem:
160
                    runs = app_doc_data.get_pipe_runs(str(line_no.uid))
161
                    if not runs: continue
162
                    for run in runs:
163
                        line_run = QEngineeringRunItem()
164
                        run_items = app_doc_data.get_pipe_run_items(run['UID'])
165
                        for record in run_items:
166
                            uid = record['Components_UID']
167
                            matches = [item for item in items if str(item) == str(uid)]
168
                            if matches:
169
                                matches[0]._owner = line_no
170
                                line_run.items.append(matches[0])
171
                        line_run.owner = line_no
172
                        line_no.runs.append(line_run)
173

  
174
            for component in [component for component in components if component['Name'] == 'Trim Line NO' and component['SymbolType_UID'] == -1]:
175
                tracer_line_no = QEngineeringTrimLineNoTextItem()
176
                tracer_line_no.uid = uuid.UUID(component['UID'], version=4)
177

  
178
                runs = app_doc_data.get_pipe_runs(str(tracer_line_no.uid))
179
                if not runs: continue
180
                for run in runs:
181
                    line_run = QEngineeringRunItem()
182
                    run_items = app_doc_data.get_pipe_run_items(run['UID'])
183
                    for record in run_items:
184
                        uid = record['Components_UID']
185
                        matches = [item for item in items if str(item) == str(uid)]
186
                        if matches:
187
                            matches[0].owner = tracer_line_no
188
                            line_run.items.append(matches[0])
189
                tracer_line_no.runs.append(line_run)
190
                
191
                tracer_line_nos.append(tracer_line_no)
192

  
193
            for component in [component for component in components if component['Name'] == 'VendorPackage' and component['SymbolType_UID'] == -1]:
194
                item = QEngineeringVendorItem.from_database(component)
195
                if item: items.append(item)
196
        except Exception as ex:
197
            from App import App
198
            from AppDocData import MessageType
199

  
200
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
201
            App.mainWnd().addMessage.emit(MessageType.Error, message)
202
        finally:
203
            return items,tracer_line_nos
204

  
205
    def export(self, path):
206
        """ save items of drawing to given xml file """
207
        import XmlGenerator as xg
208

  
209
        items,tracer_line_nos = self.from_database()
210
        xg.writeXmlOnScene(path, self.width, self.height, items, tracer_line_nos)
211

  
73 212
    def transfer(self, database):
74 213
        """ data transfer to given database """
75 214
        from AppDocData import AppDocData, MessageType
DTI_PID/DTI_PID/ID2.pro
1 1
SOURCES += MainWindow_UI.py MainWindow.py License_UI.py License.py Project_UI.py ProjectDialog.py Recognition_UI.py SymbolPropertyTableWidget.py SymbolEditor_UI.py TextItemEdit_UI.py TrainingEditor_UI.py TrainingImageList_UI.py SpecBreak_UI.py ItemDataExport_UI.py OcrResultDialog_UI.py SymbolAttrEditor_UI.py SymbolEditor_UI.py TrainingImageListDialog.py Configuration_UI.py Configuration_Area_UI.py ItemDataFormat_UI.py ItemDataExportDialog.py HMB_UI.py RecognitionDialog.py LineNoTracer.py ConnectAttr_UI.py ItemTreeWidget.py .\UI\DataTransfer_UI.py DataTransferDialog.py
2
SOURCES += .\UI\DataExport_UI.py DataExportDialog.py
2 3
TRANSLATIONS = translate/ko_kr.ts translate/ja_jp.ts
DTI_PID/DTI_PID/MainWindow.py
207 207
        self.actionText_Data_List.triggered.connect(self.showTextDataList)
208 208
        self.actionSpecialItemTypes.triggered.connect(self.on_show_special_item_types)  ### show special item types dialog
209 209
        self.actionDataTransfer.triggered.connect(self.on_show_data_transfer)  ### show data transfer dialog
210
        self.actionDataExport.triggered.connect(self.on_show_data_export)
210 211
        self.actionOPCRelation.triggered.connect(self.on_show_opc_relation)     ### show OPC Relation dialog
211 212
        self.actionCodeTable.triggered.connect(self.onShowCodeTable)
212 213
        self.actionImage_Drawing.triggered.connect(self.onViewImageDrawing)
......
225 226
        self.actionpdf_to_image.triggered.connect(self.onConvertPDFToImage)
226 227
        self.actionImport_Text_From_CAD.triggered.connect(self.onImportTextFromCAD)
227 228
        self.actionHelp.triggered.connect(self.on_help)
228
        #self.graphicsView.scene.changed.connect(self.onSceneChanged)
229 229
        self.graphicsView.scene.contents_changed.connect(self.onSceneChanged)
230 230
        self.graphicsView.scene.selectionChanged.connect(self.onSelectionChanged)
231 231
        self.actionInitialize.triggered.connect(self.onInitializeScene)
......
1025 1025
        dlg = QDataTransferDialog(self)
1026 1026
        dlg.exec_()
1027 1027

  
1028
    def on_show_data_export(self):
1029
        """ show data export dialog """
1030
        from DataExportDialog import QDataExportDialog
1031

  
1032
        dlg = QDataExportDialog(self)
1033
        dlg.exec_()
1034

  
1028 1035
    def on_show_opc_relation(self):
1029 1036
        """ show opc relation dialog """
1030 1037
        from OPCRelationDialog import QOPCRelationDialog
......
1141 1148

  
1142 1149
                appDocData.setImgFilePath(self.path)
1143 1150
                appDocData.activeDrawing = Drawing(None, appDocData.imgName, None)
1144
                appDocData.setCurrentPidSource(Image.open(self.path))
1151
                appDocData.activeDrawing.set_pid_source(Image.open(self.path))
1145 1152
                self.itemTreeWidget.setCurrentPID(appDocData.activeDrawing.name)
1146 1153

  
1147 1154
                drawingList = self.treeWidgetDrawingList.topLevelItem(0)
......
1165 1172
                    self.progress.show()
1166 1173
                    ## Load data on xml
1167 1174
                    path = os.path.join(appDocData.getCurrentProject().getTempPath(), appDocData.imgName + '.xml')
1168
                    if False:#os.path.isfile(path):
1175
                    if os.path.isfile(path):
1169 1176
                        self.loadRecognitionResultFromXml(path)
1170 1177
                    else:
1171 1178
                        self.load_drawing(appDocData.activeDrawing)
......
2370 2377

  
2371 2378
    def load_drawing(self, drawing):
2372 2379
        """ load drawing """
2373
        from xml.etree.ElementTree import Element, SubElement, dump, ElementTree, parse
2374 2380
        from EngineeringRunItem import QEngineeringRunItem
2375 2381
        from QEngineeringTrimLineNoTextItem import QEngineeringTrimLineNoTextItem
2376 2382

  
......
2834 2840
            appDocData.texts = [item for item in self.graphicsView.scene.items() if issubclass(type(item), QEngineeringTextItem) and type(item) is not QEngineeringLineNoTextItem]
2835 2841
            ## up to here
2836 2842

  
2837
            appDocData.imgOutput = np.ones((appDocData.imgHeight, appDocData.imgWidth), np.uint8)*255
2838
            xg.writeOutputXml(appDocData.imgName, appDocData.imgWidth, appDocData.imgHeight) # TODO: check
2843
            appDocData.imgOutput = np.ones((appDocData.activeDrawing.height, appDocData.activeDrawing.width), np.uint8)*255
2844
            xg.writeOutputXml(appDocData.imgName, appDocData.activeDrawing.width, appDocData.activeDrawing.height) # TODO: check
2839 2845
            project = appDocData.getCurrentProject()
2840 2846
            cv2.imwrite(os.path.join(project.getTempPath() , 'OUTPUT.png') , appDocData.imgOutput)
2841 2847
        except Exception as ex:
DTI_PID/DTI_PID/MainWindow_UI.py
13 13
class Ui_MainWindow(object):
14 14
    def setupUi(self, MainWindow):
15 15
        MainWindow.setObjectName("MainWindow")
16
        MainWindow.resize(1089, 888)
16
        MainWindow.resize(1089, 903)
17 17
        MainWindow.setBaseSize(QtCore.QSize(0, 300))
18 18
        font = QtGui.QFont()
19 19
        font.setFamily("맑은 고딕")
......
491 491
        self.actionOPCRelation.setObjectName("actionOPCRelation")
492 492
        self.actionHelp = QtWidgets.QAction(MainWindow)
493 493
        self.actionHelp.setObjectName("actionHelp")
494
        self.actionDataExport = QtWidgets.QAction(MainWindow)
495
        self.actionDataExport.setObjectName("actionDataExport")
494 496
        self.menu.addAction(self.actionOpen)
495 497
        self.menu.addAction(self.actionArea)
496 498
        self.menu.addAction(self.actionConfiguration)
......
521 523
        self.menu_4.addAction(self.actionImport_Text_From_CAD)
522 524
        self.menu_4.addSeparator()
523 525
        self.menu_4.addAction(self.actionDataTransfer)
526
        self.menu_4.addAction(self.actionDataExport)
524 527
        self.menu_5.addAction(self.actionFindReplaceText)
525 528
        self.menu_5.addAction(self.actionText_Data_List)
526 529
        self.menuHelp.addAction(self.actionHelp)
......
648 651
        self.actionHelp.setText(_translate("MainWindow", "Help"))
649 652
        self.actionHelp.setToolTip(_translate("MainWindow", "Help"))
650 653
        self.actionHelp.setShortcut(_translate("MainWindow", "F1"))
654
        self.actionDataExport.setText(_translate("MainWindow", "DataExport"))
655
        self.actionDataExport.setToolTip(_translate("MainWindow", "Data Export"))
656
        self.actionDataExport.setShortcut(_translate("MainWindow", "Ctrl+T, Ctrl+E"))
651 657
import MainWindow_rc
DTI_PID/DTI_PID/RecognitionDialog.py
427 427
                    otherTextInfoList = textDetector.otherTextInfoList.copy() if textDetector.otherTextInfoList is not None else None
428 428
                    titleBlockTextInfoList = textDetector.titleBlockTextInfoList.copy() if textDetector.titleBlockTextInfoList is not None else None
429 429
   
430
                    appDocData.imgWidth, appDocData.imgHeight = appDocData.imgSrc.shape[::-1]
430
                    appDocData.activeDrawing.width, appDocData.activeDrawing.height = appDocData.imgSrc.shape[::-1]
431 431
                    Worker.drawFoundSymbolsOnCanvas(mainRes, textInfoList, listWidget)
432 432
     
433 433
                    # remove text from image
......
1776 1776
    '''
1777 1777
        @brief set buttonbox's enabled flag
1778 1778
        @history    2018.05.25  Jeongwoo    Moved from MainWindow
1779
                    2018.05.30  Jeongwoo    Remove self.xmlPath variable and Add writeXmlOnScene
1780 1779
                    2018.06.14  Jeongwoo    Change sentence order
1781 1780
                    2018.11.26  euisung     add drawing part
1782 1781
                    2018.11.26  euising     move save and unknown part into executerecognition
DTI_PID/DTI_PID/Shapes/EngineeringAbstractItem.py
159 159
        for key in self._associations.keys():
160 160
            index = 0
161 161
            for assoc in list(set(self._associations[key])):
162
                # find owner with uid
163
                if assoc and type(assoc) is uuid.UUID:
162
                # find owner with uid if self.scene() is valid
163
                if self.scene() and assoc and type(assoc) is uuid.UUID:
164 164
                    matches = [x for x in self.scene().items() if hasattr(x, 'uid') and str(x.uid) == str(assoc)]
165 165
                    if matches:
166 166
                        res.append(matches[0])
DTI_PID/DTI_PID/Shapes/EngineeringTextItem.py
68 68
        import uuid
69 69

  
70 70
        # find owner with uid
71
        if self._owner is not None and type(self._owner) is uuid.UUID:
71
        if self.scene() and self._owner is not None and type(self._owner) is uuid.UUID:
72 72
            matches = [x for x in self.scene().items() if hasattr(x, 'uid') and str(x.uid) == str(self._owner)]
73 73
            if matches: self._owner = matches[0]
74 74
            return matches[0] if matches else None
DTI_PID/DTI_PID/Shapes/SymbolSvgItem.py
162 162

  
163 163
        return None
164 164

  
165
    '''
166
    def attrib(self, name):
167
        """ return the value of given attribute with name """
168
        matches = [(attr,value) for attr,value in self.getAttributes().items() if attr.Attribute == name]
169
        if matches: return matches[0][1]
170

  
171
        return None
172

  
173
    def set_attrib(self, attrib, value):
174
        """ set attribute with given value """
175
        matches = [attr for attr,_ in self.attrs.items() if attr.UID == attrib.UID]
176
        if len(matches) == 1: self.attrs[matches[0]] = value
177
    '''
178

  
179 165
    @property
180 166
    def Size(self):
181 167
        """ return valve's size """
......
1130 1116
            node.append(nameNode)
1131 1117

  
1132 1118
            attributeValueNode = Element('ASSOCIATIONS')
1133
            for assoc in self.associations():
1134
                assoc_node = Element('ASSOCIATION')
1135
                assoc_node.attrib['TYPE'] = QEngineeringAbstractItem.assoc_type(assoc)
1136
                assoc_node.text = str(assoc.uid)
1137
                attributeValueNode.append(assoc_node)
1119
            for key, value in self._associations.items():
1120
                for assoc in value:
1121
                    assoc_node = Element('ASSOCIATION')
1122
                    assoc_node.attrib['TYPE'] = str(key)
1123
                    assoc_node.text = str(assoc)
1124
                    attributeValueNode.append(assoc_node)
1138 1125
            node.append(attributeValueNode)
1139 1126

  
1140 1127
            typeNode = Element('TYPE')
DTI_PID/DTI_PID/SymbolAttr.py
144 144
        attr.AttributeType = record['AttributeType']
145 145
        attr.AttrAt = record['AttrAt']
146 146
        attr.Expression = record['Expression']
147
        attr.Length = record['Length']
148
        attr.IsProp = int(record['Property'])
147
        attr.Length = record['Length'] if 'Length' in record else 0
148
        attr.IsProp = int(record['Property']) if record['Property'] else 0
149 149

  
150 150
        return attr
151 151

  
DTI_PID/DTI_PID/TextDataListDialog.py
2 2
from PyQt5.QtCore import *
3 3
from PyQt5.QtGui import *
4 4
from PyQt5.QtWidgets import *
5
from AppDocData import AppDocData, Source
5
from AppDocData import AppDocData
6 6
import TextDataList_UI
7 7
from EngineeringTextItem import QEngineeringTextItem
8 8

  
DTI_PID/DTI_PID/TrainingEditorDialog.py
4 4
from PyQt5.QtCore import *
5 5
from PyQt5.QtGui import *
6 6
from PyQt5.QtWidgets import *
7
from AppDocData import AppDocData, Source
7
from AppDocData import AppDocData
8 8
import TrainingEditor_UI
9 9
import QtImageViewer
10 10
from GraphicsBoundingBoxItem import QGraphicsBoundingBoxItem
DTI_PID/DTI_PID/TrainingImageListDialog.py
10 10
from PyQt5.QtCore import *
11 11
from PyQt5.QtGui import *
12 12
from PyQt5.QtWidgets import *
13
from AppDocData import AppDocData, Source
13
from AppDocData import AppDocData
14 14
import pytesseract
15 15
import TrainingImageList_UI
16 16
from TrainingEditorDialog import QTrainingEditorDialog
DTI_PID/DTI_PID/UI/DataExport.ui
1
<?xml version="1.0" encoding="UTF-8"?>
2
<ui version="4.0">
3
 <class>DataExportDialog</class>
4
 <widget class="QDialog" name="DataExportDialog">
5
  <property name="geometry">
6
   <rect>
7
    <x>0</x>
8
    <y>0</y>
9
    <width>683</width>
10
    <height>385</height>
11
   </rect>
12
  </property>
13
  <property name="windowTitle">
14
   <string>Data Export</string>
15
  </property>
16
  <layout class="QGridLayout" name="gridLayout">
17
   <item row="2" column="0">
18
    <widget class="QDialogButtonBox" name="buttonBox">
19
     <property name="orientation">
20
      <enum>Qt::Horizontal</enum>
21
     </property>
22
     <property name="standardButtons">
23
      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
24
     </property>
25
    </widget>
26
   </item>
27
   <item row="1" column="0">
28
    <widget class="QProgressBar" name="progressBarDataExport">
29
     <property name="value">
30
      <number>0</number>
31
     </property>
32
    </widget>
33
   </item>
34
   <item row="0" column="0">
35
    <widget class="QSplitter" name="splitter">
36
     <property name="baseSize">
37
      <size>
38
       <width>0</width>
39
       <height>0</height>
40
      </size>
41
     </property>
42
     <property name="orientation">
43
      <enum>Qt::Horizontal</enum>
44
     </property>
45
     <widget class="QGroupBox" name="groupBox">
46
      <property name="title">
47
       <string>Drawings</string>
48
      </property>
49
      <layout class="QGridLayout" name="gridLayout_2">
50
       <item row="0" column="0">
51
        <widget class="QTreeWidget" name="treeWidgetDrawingList">
52
         <property name="minimumSize">
53
          <size>
54
           <width>100</width>
55
           <height>0</height>
56
          </size>
57
         </property>
58
         <property name="baseSize">
59
          <size>
60
           <width>200</width>
61
           <height>0</height>
62
          </size>
63
         </property>
64
         <property name="sortingEnabled">
65
          <bool>true</bool>
66
         </property>
67
         <attribute name="headerVisible">
68
          <bool>false</bool>
69
         </attribute>
70
         <column>
71
          <property name="text">
72
           <string notr="true">1</string>
73
          </property>
74
         </column>
75
        </widget>
76
       </item>
77
      </layout>
78
     </widget>
79
     <widget class="QGroupBox" name="groupBox_2">
80
      <property name="title">
81
       <string>Folder</string>
82
      </property>
83
      <layout class="QGridLayout" name="gridLayout_3">
84
       <item row="1" column="0">
85
        <layout class="QFormLayout" name="formLayout">
86
         <property name="formAlignment">
87
          <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
88
         </property>
89
         <item row="0" column="1">
90
          <layout class="QHBoxLayout" name="horizontalLayout">
91
           <item>
92
            <widget class="QLineEdit" name="lineEditFolder"/>
93
           </item>
94
           <item>
95
            <widget class="QPushButton" name="pushButtonFolder">
96
             <property name="maximumSize">
97
              <size>
98
               <width>24</width>
99
               <height>16777215</height>
100
              </size>
101
             </property>
102
             <property name="text">
103
              <string>...</string>
104
             </property>
105
            </widget>
106
           </item>
107
          </layout>
108
         </item>
109
         <item row="0" column="0">
110
          <widget class="QLabel" name="label">
111
           <property name="text">
112
            <string>Folder : </string>
113
           </property>
114
          </widget>
115
         </item>
116
        </layout>
117
       </item>
118
      </layout>
119
     </widget>
120
    </widget>
121
   </item>
122
  </layout>
123
 </widget>
124
 <resources/>
125
 <connections>
126
  <connection>
127
   <sender>buttonBox</sender>
128
   <signal>accepted()</signal>
129
   <receiver>DataExportDialog</receiver>
130
   <slot>accept()</slot>
131
   <hints>
132
    <hint type="sourcelabel">
133
     <x>248</x>
134
     <y>254</y>
135
    </hint>
136
    <hint type="destinationlabel">
137
     <x>157</x>
138
     <y>274</y>
139
    </hint>
140
   </hints>
141
  </connection>
142
  <connection>
143
   <sender>buttonBox</sender>
144
   <signal>rejected()</signal>
145
   <receiver>DataExportDialog</receiver>
146
   <slot>reject()</slot>
147
   <hints>
148
    <hint type="sourcelabel">
149
     <x>316</x>
150
     <y>260</y>
151
    </hint>
152
    <hint type="destinationlabel">
153
     <x>286</x>
154
     <y>274</y>
155
    </hint>
156
   </hints>
157
  </connection>
158
 </connections>
159
</ui>
DTI_PID/DTI_PID/UI/DataExport_UI.py
1
# -*- coding: utf-8 -*-
2

  
3
# Form implementation generated from reading ui file '.\UI\DataExport.ui'
4
#
5
# Created by: PyQt5 UI code generator 5.13.0
6
#
7
# WARNING! All changes made in this file will be lost!
8

  
9

  
10
from PyQt5 import QtCore, QtGui, QtWidgets
11

  
12

  
13
class Ui_DataExportDialog(object):
14
    def setupUi(self, DataExportDialog):
15
        DataExportDialog.setObjectName("DataExportDialog")
16
        DataExportDialog.resize(683, 385)
17
        self.gridLayout = QtWidgets.QGridLayout(DataExportDialog)
18
        self.gridLayout.setObjectName("gridLayout")
19
        self.buttonBox = QtWidgets.QDialogButtonBox(DataExportDialog)
20
        self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
21
        self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
22
        self.buttonBox.setObjectName("buttonBox")
23
        self.gridLayout.addWidget(self.buttonBox, 2, 0, 1, 1)
24
        self.progressBarDataExport = QtWidgets.QProgressBar(DataExportDialog)
25
        self.progressBarDataExport.setProperty("value", 0)
26
        self.progressBarDataExport.setObjectName("progressBarDataExport")
27
        self.gridLayout.addWidget(self.progressBarDataExport, 1, 0, 1, 1)
28
        self.splitter = QtWidgets.QSplitter(DataExportDialog)
29
        self.splitter.setBaseSize(QtCore.QSize(0, 0))
30
        self.splitter.setOrientation(QtCore.Qt.Horizontal)
31
        self.splitter.setObjectName("splitter")
32
        self.groupBox = QtWidgets.QGroupBox(self.splitter)
33
        self.groupBox.setObjectName("groupBox")
34
        self.gridLayout_2 = QtWidgets.QGridLayout(self.groupBox)
35
        self.gridLayout_2.setObjectName("gridLayout_2")
36
        self.treeWidgetDrawingList = QtWidgets.QTreeWidget(self.groupBox)
37
        self.treeWidgetDrawingList.setMinimumSize(QtCore.QSize(100, 0))
38
        self.treeWidgetDrawingList.setBaseSize(QtCore.QSize(200, 0))
39
        self.treeWidgetDrawingList.setObjectName("treeWidgetDrawingList")
40
        self.treeWidgetDrawingList.headerItem().setText(0, "1")
41
        self.treeWidgetDrawingList.header().setVisible(False)
42
        self.gridLayout_2.addWidget(self.treeWidgetDrawingList, 0, 0, 1, 1)
43
        self.groupBox_2 = QtWidgets.QGroupBox(self.splitter)
44
        self.groupBox_2.setObjectName("groupBox_2")
45
        self.gridLayout_3 = QtWidgets.QGridLayout(self.groupBox_2)
46
        self.gridLayout_3.setObjectName("gridLayout_3")
47
        self.formLayout = QtWidgets.QFormLayout()
48
        self.formLayout.setFormAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
49
        self.formLayout.setObjectName("formLayout")
50
        self.horizontalLayout = QtWidgets.QHBoxLayout()
51
        self.horizontalLayout.setObjectName("horizontalLayout")
52
        self.lineEditFolder = QtWidgets.QLineEdit(self.groupBox_2)
53
        self.lineEditFolder.setObjectName("lineEditFolder")
54
        self.horizontalLayout.addWidget(self.lineEditFolder)
55
        self.pushButtonFolder = QtWidgets.QPushButton(self.groupBox_2)
56
        self.pushButtonFolder.setMaximumSize(QtCore.QSize(24, 16777215))
57
        self.pushButtonFolder.setObjectName("pushButtonFolder")
58
        self.horizontalLayout.addWidget(self.pushButtonFolder)
59
        self.formLayout.setLayout(0, QtWidgets.QFormLayout.FieldRole, self.horizontalLayout)
60
        self.label = QtWidgets.QLabel(self.groupBox_2)
61
        self.label.setObjectName("label")
62
        self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label)
63
        self.gridLayout_3.addLayout(self.formLayout, 1, 0, 1, 1)
64
        self.gridLayout.addWidget(self.splitter, 0, 0, 1, 1)
65

  
66
        self.retranslateUi(DataExportDialog)
67
        self.buttonBox.accepted.connect(DataExportDialog.accept)
68
        self.buttonBox.rejected.connect(DataExportDialog.reject)
69
        QtCore.QMetaObject.connectSlotsByName(DataExportDialog)
70

  
71
    def retranslateUi(self, DataExportDialog):
72
        _translate = QtCore.QCoreApplication.translate
73
        DataExportDialog.setWindowTitle(_translate("DataExportDialog", "Data Export"))
74
        self.groupBox.setTitle(_translate("DataExportDialog", "Drawings"))
75
        self.treeWidgetDrawingList.setSortingEnabled(True)
76
        self.groupBox_2.setTitle(_translate("DataExportDialog", "Folder"))
77
        self.pushButtonFolder.setText(_translate("DataExportDialog", "..."))
78
        self.label.setText(_translate("DataExportDialog", "Folder : "))
DTI_PID/DTI_PID/UI/MainWindow.ui
7 7
    <x>0</x>
8 8
    <y>0</y>
9 9
    <width>1089</width>
10
    <height>888</height>
10
    <height>903</height>
11 11
   </rect>
12 12
  </property>
13 13
  <property name="baseSize">
......
119 119
    <addaction name="actionImport_Text_From_CAD"/>
120 120
    <addaction name="separator"/>
121 121
    <addaction name="actionDataTransfer"/>
122
    <addaction name="actionDataExport"/>
122 123
   </widget>
123 124
   <widget class="QMenu" name="menu_5">
124 125
    <property name="title">
......
1101 1102
    <string>F1</string>
1102 1103
   </property>
1103 1104
  </action>
1105
  <action name="actionDataExport">
1106
   <property name="text">
1107
    <string>DataExport</string>
1108
   </property>
1109
   <property name="toolTip">
1110
    <string>Data Export</string>
1111
   </property>
1112
   <property name="shortcut">
1113
    <string>Ctrl+T, Ctrl+E</string>
1114
   </property>
1115
  </action>
1104 1116
 </widget>
1105 1117
 <resources>
1106 1118
  <include location="../res/MainWindow.qrc"/>
DTI_PID/DTI_PID/XmlGenerator.py
382 382
                2018.06.14  Jeongwoo    Add if-statement for QEngineeringUnknownItem data node
383 383
                2018.11.26  euisung     remove scene dependency
384 384
'''
385
def writeXmlOnScene(pidName, pidWidth, pidHeight):
385
def writeXmlOnScene(path, pidWidth, pidHeight, items, tracer_line_nos):
386 386
    from EngineeringAbstractItem import QEngineeringAbstractItem
387 387
    from EngineeringNoteItem import QEngineeringNoteItem
388 388
    from EngineeringTextItem import QEngineeringTextItem
......
400 400
    from GraphicsBoundingBoxItem import QGraphicsBoundingBoxItem
401 401
    from EngineeringEndBreakItem import QEngineeringEndBreakItem
402 402

  
403
    appDocData = AppDocData.instance()
404
    items = []
405
    items = appDocData.allItems
406
    path = os.path.join(AppDocData.instance().getCurrentProject().getTempPath(), pidName + '.xml')
407

  
408 403
    xml = Element(ROOT_NODE_NAME) # Root Node
409
    SubElement(xml, ROOT_DWGNAME_NODE_NAME).text = pidName
404
    SubElement(xml, ROOT_DWGNAME_NODE_NAME).text = os.path.splitext(os.path.basename(path))[0]
410 405
    SubElement(xml, ROOT_SIZE_NODE_NAME).text = str(pidWidth) + "," + str(pidHeight)
411 406
    symbolListNode = Element(SYMBOL_LIST_NODE_NAME) # Symbol List Node
412 407
    textInfoListNode = Element(TEXT_INFO_LIST_NODE_NAME) # Text Info List Node
......
455 450
            else:
456 451
                resultDic[key][1].append(str(item.uid))
457 452

  
458
        for line in appDocData.tracerLineNos:
453
        for line in tracer_line_nos:
459 454
            if type(line) is QEngineeringTrimLineNoTextItem:
460 455
                trimNode = line.toXml()
461 456
                if trimNode:
DTI_PID/DTI_PID/translate/ja_jp.ts
390 390
    </message>
391 391
</context>
392 392
<context>
393
    <name>DataExportDialog</name>
394
    <message>
395
        <location filename="../UI/DataExport_UI.py" line="73"/>
396
        <source>Data Export</source>
397
        <translation type="unfinished"></translation>
398
    </message>
399
    <message>
400
        <location filename="../UI/DataExport_UI.py" line="74"/>
401
        <source>Drawings</source>
402
        <translation type="unfinished"></translation>
403
    </message>
404
    <message>
405
        <location filename="../UI/DataExport_UI.py" line="76"/>
406
        <source>Folder</source>
407
        <translation type="unfinished"></translation>
408
    </message>
409
    <message>
410
        <location filename="../UI/DataExport_UI.py" line="77"/>
411
        <source>...</source>
412
        <translation type="unfinished"></translation>
413
    </message>
414
    <message>
415
        <location filename="../UI/DataExport_UI.py" line="78"/>
416
        <source>Folder : </source>
417
        <translation type="unfinished"></translation>
418
    </message>
419
</context>
420
<context>
393 421
    <name>DataTransferDialog</name>
394 422
    <message>
395 423
        <location filename="../UI/DataTransfer_UI.py" line="81"/>
......
798 826
<context>
799 827
    <name>MainWindow</name>
800 828
    <message>
801
        <location filename="../MainWindow_UI.py" line="559"/>
829
        <location filename="../MainWindow_UI.py" line="562"/>
802 830
        <source>File</source>
803 831
        <translation type="unfinished">ファイル</translation>
804 832
    </message>
805 833
    <message>
806
        <location filename="../MainWindow_UI.py" line="562"/>
834
        <location filename="../MainWindow_UI.py" line="565"/>
807 835
        <source>Data</source>
808 836
        <translation type="unfinished">データ</translation>
809 837
    </message>
810 838
    <message>
811
        <location filename="../MainWindow_UI.py" line="563"/>
839
        <location filename="../MainWindow_UI.py" line="566"/>
812 840
        <source>View</source>
813 841
        <translation type="unfinished">見る</translation>
814 842
    </message>
815 843
    <message>
816
        <location filename="../MainWindow_UI.py" line="564"/>
844
        <location filename="../MainWindow_UI.py" line="567"/>
817 845
        <source>Tool</source>
818 846
        <translation type="unfinished">ツール</translation>
819 847
    </message>
820 848
    <message>
821
        <location filename="../MainWindow_UI.py" line="565"/>
849
        <location filename="../MainWindow_UI.py" line="568"/>
822 850
        <source>Edit</source>
823 851
        <translation type="unfinished">編集する</translation>
824 852
    </message>
......
828 856
        <translation type="unfinished">P&amp;ID ドローイング</translation>
829 857
    </message>
830 858
    <message>
831
        <location filename="../MainWindow_UI.py" line="561"/>
859
        <location filename="../MainWindow_UI.py" line="564"/>
832 860
        <source>Language</source>
833 861
        <translation type="unfinished">言語</translation>
834 862
    </message>
835 863
    <message>
836
        <location filename="../MainWindow_UI.py" line="633"/>
864
        <location filename="../MainWindow_UI.py" line="636"/>
837 865
        <source>English</source>
838 866
        <translation type="unfinished">英語</translation>
839 867
    </message>
840 868
    <message>
841
        <location filename="../MainWindow_UI.py" line="558"/>
869
        <location filename="../MainWindow_UI.py" line="561"/>
842 870
        <source>MainWindow</source>
843 871
        <translation type="unfinished"></translation>
844 872
    </message>
845 873
    <message>
846
        <location filename="../MainWindow_UI.py" line="560"/>
874
        <location filename="../MainWindow_UI.py" line="563"/>
847 875
        <source>Theme</source>
848 876
        <translation type="unfinished"></translation>
849 877
    </message>
850 878
    <message>
851
        <location filename="../MainWindow_UI.py" line="567"/>
879
        <location filename="../MainWindow_UI.py" line="570"/>
852 880
        <source>Main Toolbar</source>
853 881
        <translation type="unfinished"></translation>
854 882
    </message>
855 883
    <message>
856
        <location filename="../MainWindow_UI.py" line="568"/>
884
        <location filename="../MainWindow_UI.py" line="571"/>
857 885
        <source>Symbol Explorer</source>
858 886
        <translation type="unfinished"></translation>
859 887
    </message>
860 888
    <message>
861
        <location filename="../MainWindow_UI.py" line="569"/>
889
        <location filename="../MainWindow_UI.py" line="572"/>
862 890
        <source>Create</source>
863 891
        <translation type="unfinished"></translation>
864 892
    </message>
865 893
    <message>
866
        <location filename="../MainWindow_UI.py" line="570"/>
894
        <location filename="../MainWindow_UI.py" line="573"/>
867 895
        <source>Symbol Manager</source>
868 896
        <translation type="unfinished"></translation>
869 897
    </message>
......
873 901
        <translation type="unfinished"></translation>
874 902
    </message>
875 903
    <message>
876
        <location filename="../MainWindow_UI.py" line="573"/>
904
        <location filename="../MainWindow_UI.py" line="576"/>
877 905
        <source>Object Explorer</source>
878 906
        <translation type="unfinished"></translation>
879 907
    </message>
880 908
    <message>
881
        <location filename="../MainWindow_UI.py" line="574"/>
909
        <location filename="../MainWindow_UI.py" line="577"/>
882 910
        <source>Batch Job</source>
883 911
        <translation type="unfinished"></translation>
884 912
    </message>
885 913
    <message>
886
        <location filename="../MainWindow_UI.py" line="575"/>
914
        <location filename="../MainWindow_UI.py" line="578"/>
887 915
        <source>Refresh Drawing List</source>
888 916
        <translation type="unfinished"></translation>
889 917
    </message>
890 918
    <message>
891
        <location filename="../MainWindow_UI.py" line="577"/>
919
        <location filename="../MainWindow_UI.py" line="580"/>
892 920
        <source>Drawing List</source>
893 921
        <translation type="unfinished"></translation>
894 922
    </message>
895 923
    <message>
896
        <location filename="../MainWindow_UI.py" line="578"/>
924
        <location filename="../MainWindow_UI.py" line="581"/>
897 925
        <source>Edit Toolbar</source>
898 926
        <translation type="unfinished"></translation>
899 927
    </message>
900 928
    <message>
901
        <location filename="../MainWindow_UI.py" line="579"/>
929
        <location filename="../MainWindow_UI.py" line="582"/>
902 930
        <source>Output Window</source>
903 931
        <translation type="unfinished"></translation>
904 932
    </message>
905 933
    <message>
906
        <location filename="../MainWindow_UI.py" line="580"/>
934
        <location filename="../MainWindow_UI.py" line="583"/>
907 935
        <source>Clear</source>
908 936
        <translation type="unfinished"></translation>
909 937
    </message>
910 938
    <message>
911
        <location filename="../MainWindow_UI.py" line="581"/>
939
        <location filename="../MainWindow_UI.py" line="584"/>
912 940
        <source>X</source>
913 941
        <translation type="unfinished"></translation>
914 942
    </message>
915 943
    <message>
916
        <location filename="../MainWindow_UI.py" line="583"/>
944
        <location filename="../MainWindow_UI.py" line="586"/>
917 945
        <source>Inconsistency</source>
918 946
        <translation type="unfinished"></translation>
919 947
    </message>
920 948
    <message>
921
        <location filename="../MainWindow_UI.py" line="584"/>
949
        <location filename="../MainWindow_UI.py" line="587"/>
922 950
        <source>Open</source>
923 951
        <translation type="unfinished"></translation>
924 952
    </message>
925 953
    <message>
926
        <location filename="../MainWindow_UI.py" line="585"/>
954
        <location filename="../MainWindow_UI.py" line="588"/>
927 955
        <source>Open(Ctrl + O)</source>
928 956
        <translation type="unfinished"></translation>
929 957
    </message>
930 958
    <message>
931
        <location filename="../MainWindow_UI.py" line="586"/>
959
        <location filename="../MainWindow_UI.py" line="589"/>
932 960
        <source>Ctrl+O</source>
933 961
        <translation type="unfinished"></translation>
934 962
    </message>
935 963
    <message>
936
        <location filename="../MainWindow_UI.py" line="587"/>
964
        <location filename="../MainWindow_UI.py" line="590"/>
937 965
        <source>Exit</source>
938 966
        <translation type="unfinished"></translation>
939 967
    </message>
940 968
    <message>
941
        <location filename="../MainWindow_UI.py" line="589"/>
969
        <location filename="../MainWindow_UI.py" line="592"/>
942 970
        <source>Recognize Eng. Info.</source>
943 971
        <translation type="unfinished"></translation>
944 972
    </message>
945 973
    <message>
946
        <location filename="../MainWindow_UI.py" line="590"/>
974
        <location filename="../MainWindow_UI.py" line="593"/>
947 975
        <source>Create Line</source>
948 976
        <translation type="unfinished"></translation>
949 977
    </message>
950 978
    <message>
951
        <location filename="../MainWindow_UI.py" line="591"/>
979
        <location filename="../MainWindow_UI.py" line="594"/>
952 980
        <source>Create Line(L)</source>
953 981
        <translation type="unfinished"></translation>
954 982
    </message>
955 983
    <message>
956
        <location filename="../MainWindow_UI.py" line="592"/>
984
        <location filename="../MainWindow_UI.py" line="595"/>
957 985
        <source>L</source>
958 986
        <translation type="unfinished"></translation>
959 987
    </message>
960 988
    <message>
961
        <location filename="../MainWindow_UI.py" line="593"/>
989
        <location filename="../MainWindow_UI.py" line="596"/>
962 990
        <source>Validate</source>
963 991
        <translation type="unfinished"></translation>
964 992
    </message>
965 993
    <message>
966
        <location filename="../MainWindow_UI.py" line="594"/>
994
        <location filename="../MainWindow_UI.py" line="597"/>
967 995
        <source>Validate(V)</source>
968 996
        <translation type="unfinished"></translation>
969 997
    </message>
970 998
    <message>
971
        <location filename="../MainWindow_UI.py" line="595"/>
999
        <location filename="../MainWindow_UI.py" line="598"/>
972 1000
        <source>V</source>
973 1001
        <translation type="unfinished"></translation>
974 1002
    </message>
975 1003
    <message>
976
        <location filename="../MainWindow_UI.py" line="596"/>
1004
        <location filename="../MainWindow_UI.py" line="599"/>
977 1005
        <source>Configuration</source>
978 1006
        <translation type="unfinished"></translation>
979 1007
    </message>
980 1008
    <message>
981
        <location filename="../MainWindow_UI.py" line="597"/>
1009
        <location filename="../MainWindow_UI.py" line="600"/>
982 1010
        <source>Setup Area</source>
983 1011
        <translation type="unfinished"></translation>
984 1012
    </message>
985 1013
    <message>
986
        <location filename="../MainWindow_UI.py" line="598"/>
1014
        <location filename="../MainWindow_UI.py" line="601"/>
987 1015
        <source>OCR</source>
988 1016
        <translation type="unfinished"></translation>
989 1017
    </message>
990 1018
    <message>
991
        <location filename="../MainWindow_UI.py" line="599"/>
1019
        <location filename="../MainWindow_UI.py" line="602"/>
992 1020
        <source>OCR(T)</source>
993 1021
        <translation type="unfinished"></translation>
994 1022
    </message>
995 1023
    <message>
996
        <location filename="../MainWindow_UI.py" line="600"/>
1024
        <location filename="../MainWindow_UI.py" line="603"/>
997 1025
        <source>T</source>
998 1026
        <translation type="unfinished"></translation>
999 1027
    </message>
1000 1028
    <message>
1001
        <location filename="../MainWindow_UI.py" line="602"/>
1029
        <location filename="../MainWindow_UI.py" line="605"/>
1002 1030
        <source>Link Attribute</source>
1003 1031
        <translation type="unfinished"></translation>
1004 1032
    </message>
1005 1033
    <message>
1006
        <location filename="../MainWindow_UI.py" line="603"/>
1034
        <location filename="../MainWindow_UI.py" line="606"/>
1007 1035
        <source>Convert</source>
1008 1036
        <translation type="unfinished"></translation>
1009 1037
    </message>
1010 1038
    <message>
1011
        <location filename="../MainWindow_UI.py" line="604"/>
1039
        <location filename="../MainWindow_UI.py" line="607"/>
1012 1040
        <source>Equipment Data List</source>
1013 1041
        <translation type="unfinished"></translation>
1014 1042
    </message>
1015 1043
    <message>
1016
        <location filename="../MainWindow_UI.py" line="605"/>
1044
        <location filename="../MainWindow_UI.py" line="608"/>
1017 1045
        <source>Engineering Info. List</source>
1018 1046
        <translation type="unfinished"></translation>
1019 1047
    </message>
1020 1048
    <message>
1021
        <location filename="../MainWindow_UI.py" line="606"/>
1049
        <location filename="../MainWindow_UI.py" line="609"/>
1022 1050
        <source>Instrument Data List</source>
1023 1051
        <translation type="unfinished"></translation>
1024 1052
    </message>
1025 1053
    <message>
1026
        <location filename="../MainWindow.py" line="835"/>
1054
        <location filename="../MainWindow.py" line="836"/>
1027 1055
        <source>Initialize</source>
1028 1056
        <translation type="unfinished"></translation>
1029 1057
    </message>
1030 1058
    <message>
1031
        <location filename="../MainWindow_UI.py" line="608"/>
1059
        <location filename="../MainWindow_UI.py" line="611"/>
1032 1060
        <source>Image Drawing (1)</source>
1033 1061
        <translation type="unfinished"></translation>
1034 1062
    </message>
1035 1063
    <message>
1036
        <location filename="../MainWindow_UI.py" line="609"/>
1064
        <location filename="../MainWindow_UI.py" line="612"/>
1037 1065
        <source>Zoom</source>
1038 1066
        <translation type="unfinished"></translation>
1039 1067
    </message>
1040 1068
    <message>
1041
        <location filename="../MainWindow_UI.py" line="610"/>
1069
        <location filename="../MainWindow_UI.py" line="613"/>
1042 1070
        <source>Zoom(Z)</source>
1043 1071
        <translation type="unfinished"></translation>
1044 1072
    </message>
1045 1073
    <message>
1046
        <location filename="../MainWindow_UI.py" line="611"/>
1074
        <location filename="../MainWindow_UI.py" line="614"/>
1047 1075
        <source>Z</source>
1048 1076
        <translation type="unfinished"></translation>
1049 1077
    </message>
1050 1078
    <message>
1051
        <location filename="../MainWindow_UI.py" line="612"/>
1079
        <location filename="../MainWindow_UI.py" line="615"/>
1052 1080
        <source>FitWindow</source>
1053 1081
        <translation type="unfinished"></translation>
1054 1082
    </message>
1055 1083
    <message>
1056
        <location filename="../MainWindow_UI.py" line="613"/>
1084
        <location filename="../MainWindow_UI.py" line="616"/>
1057 1085
        <source>Symbol (3)</source>
1058 1086
        <translation type="unfinished"></translation>
1059 1087
    </message>
1060 1088
    <message>
1061
        <location filename="../MainWindow_UI.py" line="614"/>
1089
        <location filename="../MainWindow_UI.py" line="617"/>
1062 1090
        <source>Text (2)</source>
1063 1091
        <translation type="unfinished"></translation>
1064 1092
    </message>
1065 1093
    <message>
1066
        <location filename="../MainWindow_UI.py" line="615"/>
1094
        <location filename="../MainWindow_UI.py" line="618"/>
1067 1095
        <source>Line (4)</source>
1068 1096
        <translation type="unfinished"></translation>
1069 1097
    </message>
1070 1098
    <message>
1071
        <location filename="../MainWindow_UI.py" line="616"/>
1099
        <location filename="../MainWindow_UI.py" line="619"/>
1072 1100
        <source>Unrecognization (5)</source>
1073 1101
        <translation type="unfinished"></translation>
1074 1102
    </message>
1075 1103
    <message>
1076
        <location filename="../MainWindow_UI.py" line="617"/>
1104
        <location filename="../MainWindow_UI.py" line="620"/>
1077 1105
        <source>Code Table</source>
1078 1106
        <translation type="unfinished"></translation>
1079 1107
    </message>
1080 1108
    <message>
1081
        <location filename="../MainWindow_UI.py" line="618"/>
1109
        <location filename="../MainWindow_UI.py" line="621"/>
1082 1110
        <source>Fluid Code</source>
1083 1111
        <translation type="unfinished"></translation>
1084 1112
    </message>
1085 1113
    <message>
1086
        <location filename="../MainWindow_UI.py" line="619"/>
1114
        <location filename="../MainWindow_UI.py" line="622"/>
1087 1115
        <source>Convert PDF</source>
1088 1116
        <translation type="unfinished"></translation>
1089 1117
    </message>
1090 1118
    <message>
1091
        <location filename="../MainWindow_UI.py" line="620"/>
1119
        <location filename="../MainWindow_UI.py" line="623"/>
1092 1120
        <source>HMB Data</source>
1093 1121
        <translation type="unfinished"></translation>
1094 1122
    </message>
1095 1123
    <message>
1096
        <location filename="../MainWindow_UI.py" line="621"/>
1124
        <location filename="../MainWindow_UI.py" line="624"/>
1097 1125
        <source>Save</source>
1098 1126
        <translation type="unfinished"></translation>
1099 1127
    </message>
1100 1128
    <message>
1101
        <location filename="../MainWindow_UI.py" line="622"/>
1129
        <location filename="../MainWindow_UI.py" line="625"/>
1102 1130
        <source>Save(Ctrl + S)</source>
1103 1131
        <translation type="unfinished"></translation>
1104 1132
    </message>
1105 1133
    <message>
1106
        <location filename="../MainWindow_UI.py" line="623"/>
1134
        <location filename="../MainWindow_UI.py" line="626"/>
1107 1135
        <source>Ctrl+S</source>
1108 1136
        <translation type="unfinished"></translation>
1109 1137
    </message>
1110 1138
    <message>
1111
        <location filename="../MainWindow_UI.py" line="624"/>
1139
        <location filename="../MainWindow_UI.py" line="627"/>
1112 1140
        <source>Rotate</source>
1113 1141
        <translation type="unfinished"></translation>
1114 1142
    </message>
1115 1143
    <message>
1116
        <location filename="../MainWindow_UI.py" line="626"/>
1144
        <location filename="../MainWindow_UI.py" line="629"/>
1117 1145
        <source>Find/Replace</source>
1118 1146
        <translation type="unfinished"></translation>
1119 1147
    </message>
1120 1148
    <message>
1121
        <location filename="../MainWindow_UI.py" line="627"/>
1149
        <location filename="../MainWindow_UI.py" line="630"/>
1122 1150
        <source>Fine/Replace</source>
1123 1151
        <translation type="unfinished"></translation>
1124 1152
    </message>
1125 1153
    <message>
1126
        <location filename="../MainWindow_UI.py" line="629"/>
1154
        <location filename="../MainWindow_UI.py" line="632"/>
1127 1155
        <source>Modify Text</source>
1128 1156
        <translation type="unfinished"></translation>
1129 1157
    </message>
1130 1158
    <message>
1131
        <location filename="../MainWindow_UI.py" line="630"/>
1159
        <location filename="../MainWindow_UI.py" line="633"/>
1132 1160
        <source>OCR Training</source>
1133 1161
        <translation type="unfinished"></translation>
1134 1162
    </message>
1135 1163
    <message>
1136
        <location filename="../MainWindow_UI.py" line="631"/>
1164
        <location filename="../MainWindow_UI.py" line="634"/>
1137 1165
        <source>OCR Training Editor</source>
1138 1166
        <translation type="unfinished"></translation>
1139 1167
    </message>
1140 1168
    <message>
1141
        <location filename="../MainWindow_UI.py" line="632"/>
1169
        <location filename="../MainWindow_UI.py" line="635"/>
1142 1170
        <source>coffee</source>
1143 1171
        <translation type="unfinished"></translation>
1144 1172
    </message>
1145 1173
    <message>
1146
        <location filename="../MainWindow_UI.py" line="634"/>
1174
        <location filename="../MainWindow_UI.py" line="637"/>
1147 1175
        <source>Inconsistency (6)</source>
1148 1176
        <translation type="unfinished"></translation>
1149 1177
    </message>
1150 1178
    <message>
1151
        <location filename="../MainWindow_UI.py" line="635"/>
1179
        <location filename="../MainWindow_UI.py" line="638"/>
1152 1180
        <source>Text Data List</source>
1153 1181
        <translation type="unfinished"></translation>
1154 1182
    </message>
1155 1183
    <message>
1156
        <location filename="../MainWindow_UI.py" line="636"/>
1184
        <location filename="../MainWindow_UI.py" line="639"/>
1157 1185
        <source>Drawing Only ( ` )</source>
1158 1186
        <translation type="unfinished"></translation>
1159 1187
    </message>
1160 1188
    <message>
1161
        <location filename="../MainWindow_UI.py" line="637"/>
1189
        <location filename="../MainWindow_UI.py" line="640"/>
1162 1190
        <source>Vendor</source>
1163 1191
        <translation type="unfinished"></translation>
1164 1192
    </message>
1165 1193
    <message>
1166
        <location filename="../MainWindow_UI.py" line="638"/>
1194
        <location filename="../MainWindow_UI.py" line="641"/>
1167 1195
        <source>Set Vendor Package</source>
1168 1196
        <translation type="unfinished"></translation>
1169 1197
    </message>
1170 1198
    <message>
1171
        <location filename="../MainWindow_UI.py" line="639"/>
1199
        <location filename="../MainWindow_UI.py" line="642"/>
1172 1200
        <source>Vendor Area(7)</source>
1173 1201
        <translation type="unfinished"></translation>
1174 1202
    </message>
1175 1203
    <message>
1176
        <location filename="../MainWindow_UI.py" line="640"/>
1204
        <location filename="../MainWindow_UI.py" line="643"/>
1177 1205
        <source>Import Text From CAD</source>
1178 1206
        <translation type="unfinished"></translation>
1179 1207
    </message>
1180 1208
    <message>
1181
        <location filename="../MainWindow_UI.py" line="642"/>
1209
        <location filename="../MainWindow_UI.py" line="645"/>
1182 1210
        <source>Special Item Types</source>
1183 1211
        <translation type="unfinished"></translation>
1184 1212
    </message>
1185 1213
    <message>
1186
        <location filename="../MainWindow_UI.py" line="643"/>
1214
        <location filename="../MainWindow_UI.py" line="646"/>
1187 1215
        <source>DataTransfer</source>
1188 1216
        <translation type="unfinished"></translation>
1189 1217
    </message>
1190 1218
    <message>
1191
        <location filename="../MainWindow_UI.py" line="644"/>
1219
        <location filename="../MainWindow_UI.py" line="647"/>
1192 1220
        <source>Data Transfer</source>
1193 1221
        <translation type="unfinished"></translation>
1194 1222
    </message>
1195 1223
    <message>
1196
        <location filename="../MainWindow_UI.py" line="645"/>
1224
        <location filename="../MainWindow_UI.py" line="649"/>
1197 1225
        <source>OPCRelation</source>
1198 1226
        <translation type="unfinished"></translation>
1199 1227
    </message>
1200 1228
    <message>
1201
        <location filename="../MainWindow_UI.py" line="646"/>
1229
        <location filename="../MainWindow_UI.py" line="650"/>
1202 1230
        <source>OPC Relation</source>
1203 1231
        <translation type="unfinished"></translation>
1204 1232
    </message>
......
1253 1281
        <translation type="unfinished"></translation>
... 이 차이점은 표시할 수 있는 최대 줄수를 초과해서 이 차이점은 잘렸습니다.

내보내기 Unified diff

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