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)
|