프로젝트

일반

사용자정보

통계
| 개정판:

hytos / DTI_PID / DTI_PID / HMBDialog.py @ 8fd1d96f

이력 | 보기 | 이력해설 | 다운로드 (17.5 KB)

1
# coding: utf-8
2

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

    
10
from AppDocData import AppDocData, Config
11
from AppDocData import Area
12

    
13
sys.path.insert(0, os.path.dirname(os.path.realpath(__file__)) + '\\Commands')
14
import CreateCommand
15
import FenceCommand
16

    
17
sys.path.insert(0, os.path.dirname(os.path.realpath(__file__)) + '\\Shapes')
18
import EngineeringPolylineItem
19
from EngineeringLineItem import QEngineeringLineItem
20
from GraphicsBoundingBoxItem import QGraphicsBoundingBoxItem
21
import Configuration_Area_UI
22

    
23
class Worker(QObject):
24
    from PyQt5.QtCore import QThread
25
    from PyQt5.QtWidgets import QApplication, QLabel, QWidget, QGridLayout, QListWidget
26
    import sys
27

    
28
    '''
29
        @brief      signals
30
    '''
31
    finished = pyqtSignal()
32
    intReady = pyqtSignal(int)
33
    recognizeText = pyqtSignal(QObject)
34
    updateProgress = pyqtSignal(int)
35

    
36
    '''
37
        @history    2018.05.25  Jeongwoo    Add if-statements by isSymbolTextChecked and isLineChecked variable
38
                    2018.05.28  Jeongwoo    Add Parameter 'xmlPath[0]'
39
                    2018.05.30  Jeongwoo    Remove import recognizeLine and self.xmlPath and remove parameter on recognizeLine.emit() (xmlPath)
40
                                            Change signal name (drawDetectedItems)
41
    '''
42
    def work(self): # A slot takes no params
43
        try:
44
            self.recognizeText.emit(self)
45
        except Exception as ex:
46
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
47

    
48
class QHMBDialog(QDialog):
49
    def __init__(self, parent):
50
        from HMB_UI import Ui_HMBDialog
51

    
52
        QDialog.__init__(self, parent)
53
        self.ui = Ui_HMBDialog()
54
        self.ui.setupUi(self)
55
        self.ui.tableWidgetHMBRecord.setHorizontalHeaderLabels(['Name', 'Unit'])
56
        self.ui.tableWidgetHMBRecord.horizontalHeaderItem(0).setSizeHint(QSize(25, 25))
57
        
58
        # add splitter widget
59
        splitter = QSplitter(Qt.Vertical)
60
        splitter.addWidget(self.ui.groupBoxHMBRecord)
61
        splitter.addWidget(self.ui.groupBoxHMBData)
62
        self.ui.verticalLayoutHMB.addWidget(splitter)
63

    
64
        self.ui.lineEditHMBArea.tag = None
65

    
66
        self.ui.pushButtonAddRecord.clicked.connect(self.onAddRecord)
67
        self.ui.pushButtonDelRecord.clicked.connect(self.onDelRecord)
68
        self.ui.pushButtonHMBArea.clicked.connect(self.onSelectHMBArea)
69
        self.ui.pushButtonRecognizeText.clicked.connect(self.onRecognizeText)
70
        self.ui.pushButtonDelHMBData.clicked.connect(self.onDelHMBData)
71
        
72
        self._cmd = FenceCommand.FenceCommand(self.parent().graphicsView)
73
        self._cmd.onSuccess.connect(self.onAreaSelected)
74

    
75
        appDocData = AppDocData.instance()
76
        configs = appDocData.getConfigs('HMB Record', 'Count')
77
        rows = int(configs[0].value) if configs else 0
78
        self.ui.tableWidgetHMBRecord.setRowCount(rows)
79
        for row in range(rows):
80
            configs = appDocData.getConfigs('HMB Record{}'.format(row))
81
            if configs:
82
                item = QTableWidgetItem([config.value for config in configs if config.key == 'Name'][0])
83
                self.ui.tableWidgetHMBRecord.setItem(row, 0, item)
84
                item = QTableWidgetItem([config.value for config in configs if config.key == 'Unit'][0])
85
                self.ui.tableWidgetHMBRecord.setItem(row, 1, item)
86

    
87
        configs = appDocData.getConfigs('HMB Data', 'Column Width')
88
        self.ui.lineEditColumnWidth.setText(configs[0].value if 1 == len(configs) else '0')
89
        configs = appDocData.getConfigs('HMB Data', 'Row Height')
90
        self.ui.lineEditRowHeight.setText(configs[0].value if 1 == len(configs) else '0')
91
        configs = appDocData.getConfigs('HMB Data', 'Record Direction')
92
        if 0 == len(configs) or 'Horizontal' == configs[0].value:
93
            self.ui.radioButtonHorizontal.setChecked(True)
94
            self.ui.radioButtonVertical.setChecked(False)
95
        else:
96
            self.ui.radioButtonHorizontal.setChecked(False)
97
            self.ui.radioButtonVertical.setChecked(True)
98

    
99
        self.ui.tableWidgetHMBData.setRowCount(self.ui.tableWidgetHMBRecord.rowCount())
100
        for row in range(self.ui.tableWidgetHMBData.rowCount()):
101
            name = self.ui.tableWidgetHMBRecord.item(row, 0).text()
102
            item = QTableWidgetItem(name)
103
            item.setFlags(Qt.ItemIsEnabled)
104
            item.setBackground(QColor(220, 220, 220))
105
            self.ui.tableWidgetHMBData.setItem(row, 0, item)
106
            unit = self.ui.tableWidgetHMBRecord.item(row, 1).text()
107
            item = QTableWidgetItem(unit)
108
            item.setFlags(Qt.ItemIsEnabled)
109
            item.setBackground(QColor(220, 220, 220))
110
            self.ui.tableWidgetHMBData.setItem(row, 1, item)
111

    
112
        # display HMB Data
113
        fixedCols = self.ui.tableWidgetHMBRecord.columnCount()
114
        streamNos = sorted(list(appDocData.hmbTable.streamNos()))
115
        self.ui.tableWidgetHMBData.setColumnCount(fixedCols + len(streamNos))
116
        for col  in range(2, self.ui.tableWidgetHMBData.columnCount()):
117
            streamNo = streamNos[col - 2]
118
            datas = appDocData.hmbTable.dataOfStreamNo(streamNo)
119
            for data in datas:
120
                selectedRow = -1
121
                for row in range(self.ui.tableWidgetHMBData.rowCount()):
122
                    name = self.ui.tableWidgetHMBData.item(row, 0).text()
123
                    unit = self.ui.tableWidgetHMBData.item(row, 1).text()
124
                    if data.name == name and data.unit == unit:
125
                        selectedRow = row
126
                        break
127
                
128
                if selectedRow != -1:
129
                    item = QTableWidgetItem(data.value)
130
                    item.setData(Qt.UserRole, data)
131
                    self.ui.tableWidgetHMBData.setItem(selectedRow, col, item)
132
        
133
        self.ui.tableWidgetHMBData.setHorizontalHeaderLabels(['Name', 'Unit'] + streamNos)
134
        self.ui.tableWidgetHMBData.horizontalHeaderItem(0).setSizeHint(QSize(25, 25))
135
        # up to here
136
        self.ui.tableWidgetHMBData.cellChanged.connect(self.cellValueChanged)   # connect to slot after setting data
137

    
138
    '''
139
        @brief      cellValueChange event
140
        @author     humkyung
141
        @date       2018.07.16
142
    '''
143
    def cellValueChanged(self, row, column):
144
        from HMBTable import HMBData
145

    
146
        try:
147
            item = self.ui.tableWidgetHMBData.item(row, column)
148
            data = item.data(Qt.UserRole)
149
            if data is not None:
150
                data.value  = self.ui.tableWidgetHMBData.item(row, column).text()
151
            else:
152
                data = HMBData()
153
                data.name  = self.ui.tableWidgetHMBData.item(row, 0).text()
154
                data.unit  = self.ui.tableWidgetHMBData.item(row, 1).text()
155
                data.value  = self.ui.tableWidgetHMBData.item(row, column).text()
156
                item.setData(Qt.UserRole, data)
157
                
158
            if data.name == 'STREAM NO':
159
                streamNo = data.value
160
                header = self.ui.tableWidgetHMBData.horizontalHeaderItem(column)
161
                if header is not None:
162
                    header.setText(streamNo)
163
                else:
164
                    header = QTableWidgetItem(streamNo)
165
                    self.ui.tableWidgetHMBData.setHorizontalHeaderItem(column, header)
166
                    
167
                for row in range(self.ui.tableWidgetHMBData.rowCount()):
168
                    item = self.ui.tableWidgetHMBData.item(row, column)
169
                    if item is not None:
170
                        data = item.data(Qt.UserRole)
171
                        data.streamNo = streamNo
172
            elif data.streamNo is None:
173
                data.streamNo = self.ui.tableWidgetHMBData.item(0, column).data(Qt.UserRole).streamNo
174
        except Exception as ex:
175
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
176

    
177
    '''
178
        @brief  add a record
179
        @author humkyung
180
        @date   2018.07.11
181
    '''
182
    def onAddRecord(self):
183
        rows = self.ui.tableWidgetHMBRecord.rowCount()
184
        self.ui.tableWidgetHMBRecord.setRowCount(rows + 1)
185

    
186
    '''
187
        @brief  delete selected record
188
        @author humkyung
189
        @date   2018.07.11
190
    '''
191
    def onDelRecord(self):
192
        model = self.ui.tableWidgetHMBRecord.model()
193

    
194
        row = self.ui.tableWidgetHMBRecord.currentRow()
195
        if row != -1:
196
            model.removeRow(row)
197

    
198
    '''
199
        @brief  select HMB area
200
        @author humkyung
201
        @date   2018.07.11
202
    '''
203
    def onSelectHMBArea(self):
204
        self._cmd.tag = self.ui.lineEditHMBArea
205
        self.parent().graphicsView.command = self._cmd
206

    
207
    '''
208
        @brief      called when area is created
209
        @author     humkyung
210
        @date       2018.07.11
211
    '''
212
    def onAreaSelected(self, x, y , width, height):
213
        THICKNESS = 3
214

    
215
        if self._cmd.tag is self.ui.lineEditHMBArea:
216
            if self.ui.lineEditHMBArea.tag is None:
217
                item = QGraphicsBoundingBoxItem(x, y, width, height)
218
                item.setPen(QPen(Qt.red, THICKNESS, Qt.SolidLine))
219
                self.parent().graphicsView.scene.addItem(item)
220

    
221
                self.ui.lineEditHMBArea.tag = item
222
            else:
223
                self.ui.lineEditHMBArea.tag.setRect(x, y, width, height)
224

    
225
            self.ui.lineEditHMBArea.setText('({},{}),({},{})'.format(round(x), round(y), round(width), round(height)))
226

    
227
        self.parent().graphicsView.command = None
228

    
229
    '''
230
        @brief  recognize text in selected area
231
        @author humkyung
232
        @date   2018.07.11
233
    '''
234
    def onRecognizeText(self):
235
        if len(self.ui.lineEditColumnWidth.text()) > 0 and len(self.ui.lineEditRowHeight.text()) > 0 and len(self.ui.lineEditHMBArea.text()) > 0:
236
            self.ui.buttonBox.setEnabled(False)
237
            self.ui.progressBar.setValue(0)
238
            self.startThread()
239

    
240
    '''
241
        @brief  delete selected data 
242
        @author humkyung
243
        @date   2018.07.13
244
    '''
245
    def onDelHMBData(self):
246
        try:
247
            model = self.ui.tableWidgetHMBData.model()
248

    
249
            item = self.ui.tableWidgetHMBData.currentItem()
250
            if item is not None:
251
                data = item.data(Qt.UserRole)
252
                if data.uid is None:
253
                    model.removeColumn(item.column())
254
                else:
255
                    currentCol = item.column()
256
                    for row in range(self.ui.tableWidgetHMBData.rowCount()):
257
                        _item = self.ui.tableWidgetHMBData.item(row, currentCol)
258
                        if _item is not None:
259
                            data = _item.data(Qt.UserRole)
260
                            data.isDeleted = True
261

    
262
                    self.ui.tableWidgetHMBData.hideColumn(item.column())
263
        except Exception as ex:
264
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
265

    
266
    '''
267
        @brief      recognize text in selected area
268
        @author     humkyung
269
        @date       2018.07.11
270
    '''
271
    def recognizeText(self, worker):
272
        from TextDetector import TextDetector
273

    
274
        try:
275
            appDocData = AppDocData.instance()
276

    
277
            textDetector = TextDetector()
278
            img = appDocData.imgSrc[round(worker.area[1]):round(worker.area[1]+worker.area[3]), round(worker.area[0]):round(worker.area[0]+worker.area[2])]
279
            texts = textDetector.getTextAreaInfo(img, worker.area[0], worker.area[1])
280
            textDetector.recognizeText(appDocData.imgSrc, (worker.area[0], worker.area[1]), texts, [], worker, None, len(texts))
281
            worker.textInfoList = textDetector.textInfoList.copy()
282
        except Exception as ex:
283
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
284
        finally:
285
            worker.finished.emit()
286

    
287
    '''
288
        @brief      start thread
289
        @author     humkyung
290
        @date       2018.07.12
291
    '''
292
    def startThread(self):
293
        import re
294

    
295
        self.ui.buttonBox.setDisabled(True)
296

    
297
        # 1 - create Worker and Thread inside the Form
298
        self.obj = Worker()         # no parent!
299
        self.obj.columnWidth = float(self.ui.lineEditColumnWidth.text())
300
        self.obj.rowHeight = float(self.ui.lineEditRowHeight.text())
301
        found = re.findall('\d+', self.ui.lineEditHMBArea.text())
302
        self.obj.area = [float(x) for x in found]
303
        self.thread = QThread()     # no parent!
304

    
305
        # 2 - Move the Worker object to the Thread object
306
        self.obj.moveToThread(self.thread)
307

    
308
        # 3 - Connect Worker Signals to the Thread slots
309
        self.obj.finished.connect(self.thread.quit)
310
        self.obj.recognizeText.connect(self.recognizeText)
311
        self.obj.updateProgress.connect(self.updateProgress)
312

    
313
        # 4 - Connect Thread started signal to Worker operational slot method
314
        self.thread.started.connect(self.obj.work)
315
        
316
        # 5 - Thread finished signal will close the app if you want!
317
        self.thread.finished.connect(self.dlgExit)
318

    
319
        # 6 - Start the thread
320
        self.thread.start()
321

    
322
    '''
323
        @brief      update progressbar with given value
324
        @author     humkyung
325
        @date       2018.07.12
326
    '''
327
    def updateProgress(self, maxValue):
328
        if maxValue != -1:
329
            self.ui.progressBar.setMaximum(maxValue)
330
            self.ui.progressBar.setValue(self.ui.progressBar.value() + 1)
331
        else:
332
            self.ui.progressBar.setValue(0)
333

    
334
    '''
335
        @brief      set buttonbox's enabled flag
336
        @author     humkyung
337
        @date       2018.07.12
338
    '''
339
    def dlgExit(self):
340
        from HMBTable import HMBData
341

    
342
        try:
343
            columns = round(self.obj.area[2] / self.obj.columnWidth)
344
            rows = round(self.obj.area[3] / self.obj.rowHeight)
345
            fixedColumns = self.ui.tableWidgetHMBData.columnCount()
346
            self.ui.tableWidgetHMBData.setColumnCount(fixedColumns + columns)
347
            self.ui.tableWidgetHMBData.setRowCount(rows)
348

    
349
            for text in self.obj.textInfoList:
350
                item = QTableWidgetItem(text.getText())
351
                col = int((text.x - self.obj.area[0]) / self.obj.columnWidth)
352
                row = int((text.y - self.obj.area[1]) / self.obj.rowHeight)
353
                data = HMBData()
354
                data.name = self.ui.tableWidgetHMBData.item(row, 0).text() if self.ui.tableWidgetHMBData.item(row, 0) is not None else ''
355
                data.unit = self.ui.tableWidgetHMBData.item(row, 1).text() if self.ui.tableWidgetHMBData.item(row, 1) is not None else ''
356
                data.value = item.text()
357
                item.setData(Qt.UserRole, data)
358
                self.ui.tableWidgetHMBData.setItem(row, fixedColumns + col, item)
359
                if data.name == 'STREAM NO':
360
                    self.ui.tableWidgetHMBData.horizontalHeaderItem(col).setText(data.value)
361
                                
362
            self.ui.progressBar.setValue(self.ui.progressBar.maximum())
363
            self.ui.buttonBox.setEnabled(True)
364
        except Exception as ex:
365
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
366
        finally:
367
            pass
368

    
369
    '''
370
        @brief  accept dialog
371
    '''
372
    def accept(self):
373
        from HMBTable import HMBTable,HMBData
374

    
375
        try:
376
            configs = []
377

    
378
            configs.append(Config('HMB Record', 'Count', self.ui.tableWidgetHMBRecord.rowCount()))
379
            for row in range(self.ui.tableWidgetHMBRecord.rowCount()):
380
                item = self.ui.tableWidgetHMBRecord.item(row, 0)
381
                name = item.text() if item is not None else ''
382
                item = self.ui.tableWidgetHMBRecord.item(row, 1)
383
                unit = item.text() if item is not None else ''
384
                configs.append(Config('HMB Record{}'.format(row), 'Name', name))
385
                configs.append(Config('HMB Record{}'.format(row), 'Unit', unit))
386
                
387
            configs.append(Config('HMB Data', 'Column Width', self.ui.lineEditColumnWidth.text()))
388
            configs.append(Config('HMB Data', 'Row Height', self.ui.lineEditRowHeight.text()))
389
            configs.append(Config('HMB Data', 'Record Direction', 'Horizontal' if self.ui.radioButtonHorizontal.isChecked() else 'Vertical'))
390

    
391
            appDocData = AppDocData.instance()
392
            appDocData.saveConfigs(configs)
393

    
394
            # save hmb data
395
            appDocData.hmbTable.reset()
396
            for col in range(2, self.ui.tableWidgetHMBData.columnCount()):
397
                item = self.ui.tableWidgetHMBData.item(0, col)
398
                if item is not None:
399
                    for row in range(self.ui.tableWidgetHMBData.rowCount()):
400
                        item = self.ui.tableWidgetHMBData.item(row, col)
401
                        if item is not None:
402
                            data = item.data(Qt.UserRole)
403
                            appDocData.hmbTable.append(data)
404
            
405
            appDocData.hmbTable.saveData()
406
            # up to here
407
        except Exception as ex:
408
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
409
        finally:
410
            if self.ui.lineEditHMBArea.tag is not None:
411
                self.parent().graphicsView.scene.removeItem(self.ui.lineEditHMBArea.tag)
412

    
413
        QDialog.accept(self)
414

    
415
    '''
416
        @brief  reject dialog
417
    '''
418
    def reject(self):
419
        if self.ui.lineEditHMBArea.tag is not None:
420
            self.parent().graphicsView.scene.removeItem(self.ui.lineEditHMBArea.tag)
421

    
422
        QDialog.reject(self)