개정판 52e28a3a
issue #366: show gif animation while saving
Change-Id: I72a6223e1457b36ee5a163f84b0c624b856fac20
DTI_PID/DTI_PID/AppDocData.py | ||
---|---|---|
2665 | 2665 |
return result |
2666 | 2666 |
|
2667 | 2667 |
def saveToDatabase(self, items): |
2668 |
""" |
|
2669 |
save given items to database |
|
2670 |
""" |
|
2668 |
""" save given items to database """ |
|
2671 | 2669 |
try: |
2672 | 2670 |
# Creates or opens a file called mydb with a SQLite3 DB |
2673 | 2671 |
dbPath = os.path.join(self.getCurrentProject().getDbFilePath(), AppDocData.DATABASE) |
2674 |
conn = sqlite3.connect(dbPath) |
|
2672 |
conn = sqlite3.connect(dbPath, isolation_level=None)
|
|
2675 | 2673 |
# Get a cursor object |
2676 | 2674 |
cursor = conn.cursor() |
2677 | 2675 |
|
DTI_PID/DTI_PID/Commands/SaveWorkCommand.py | ||
---|---|---|
1 |
# coding: utf-8 |
|
2 |
""" This is SaveWork command module """ |
|
3 |
import os.path |
|
4 |
import sys |
|
5 |
from enum import Enum |
|
6 |
from PyQt5.QtCore import * |
|
7 |
from PyQt5.QtGui import * |
|
8 |
from PyQt5.QtWidgets import * |
|
9 |
|
|
10 |
class SaveWorkCommand(QThread): |
|
11 |
display_message = pyqtSignal(Enum, str) |
|
12 |
|
|
13 |
def __init__(self): |
|
14 |
QThread.__init__(self) |
|
15 |
self.resultStr = None |
|
16 |
|
|
17 |
def __del__(self): |
|
18 |
self.wait() |
|
19 |
|
|
20 |
def run(self): |
|
21 |
""" do given work""" |
|
22 |
from datetime import datetime |
|
23 |
from AppDocData import AppDocData |
|
24 |
from AppDocData import MessageType |
|
25 |
from EngineeringTextItem import QEngineeringTextItem |
|
26 |
from EngineeringLineNoTextItem import QEngineeringLineNoTextItem |
|
27 |
from EngineeringNoteItem import QEngineeringNoteItem |
|
28 |
from QEngineeringSizeTextItem import QEngineeringSizeTextItem |
|
29 |
from EngineeringEquipmentItem import QEngineeringEquipmentItem |
|
30 |
from EngineeringInstrumentItem import QEngineeringInstrumentItem |
|
31 |
from EngineeringSpecBreakItem import QEngineeringSpecBreakItem |
|
32 |
from EngineeringVendorItem import QEngineeringVendorItem |
|
33 |
from SymbolSvgItem import SymbolSvgItem |
|
34 |
|
|
35 |
try: |
|
36 |
appDocData = AppDocData.instance() |
|
37 |
|
|
38 |
titleBlockProps = appDocData.getTitleBlockProperties() |
|
39 |
items = appDocData.allItems |
|
40 |
titleBlockItems = [] |
|
41 |
for item in items: |
|
42 |
if type(item) is QEngineeringTextItem: |
|
43 |
for titleBlockProp in titleBlockProps: |
|
44 |
if item.area == titleBlockProp[0]: |
|
45 |
titleBlockItems.append(item) |
|
46 |
|
|
47 |
dbItems = [item for item in items if type(item) is QEngineeringInstrumentItem or type(item) is QEngineeringEquipmentItem or\ |
|
48 |
type(item) is QEngineeringNoteItem or type(item) is SymbolSvgItem or type(item) is QEngineeringLineNoTextItem or type(item) is QEngineeringVendorItem] + titleBlockItems |
|
49 |
appDocData.saveToDatabase(dbItems) |
|
50 |
|
|
51 |
self.resultStr = SaveWorkCommand.save_to_xml() |
|
52 |
|
|
53 |
""" update drawing's modified time """ |
|
54 |
drawings = appDocData.getDrawings() |
|
55 |
drawing = [drawing for drawing in drawings if appDocData.imgName == os.path.splitext(drawing[1])[0]] |
|
56 |
if drawing[0]: |
|
57 |
drawing[0][2] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') |
|
58 |
appDocData.saveDrawings(drawing) |
|
59 |
except Exception as ex: |
|
60 |
from AppDocData import MessageType |
|
61 |
|
|
62 |
message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno) |
|
63 |
self.disconnect.emit(MessageType.Error, message) |
|
64 |
|
|
65 |
@staticmethod |
|
66 |
def save_to_xml(): |
|
67 |
""" save recognized items to xml file """ |
|
68 |
import XmlGenerator as xg |
|
69 |
from AppDocData import AppDocData |
|
70 |
|
|
71 |
docData = AppDocData.instance() |
|
72 |
result = xg.writeXmlOnScene(docData.imgName, docData.imgWidth, docData.imgHeight) |
|
73 |
|
|
74 |
resultStr = '[저장 결과]' |
|
75 |
|
|
76 |
for item in result.items(): |
|
77 |
itemName = str(item[0]) |
|
78 |
itemSuccessCount = str(item[1][0]) |
|
79 |
itemFailUidList = item[1][1] |
|
80 |
resultStr += "\r\n" + itemName + " Save Count : " + itemSuccessCount |
|
81 |
if len(itemFailUidList) > 0: |
|
82 |
resultStr += "\r\n" + itemName + " Error List(UID)" |
|
83 |
for uid in itemFailUidList: |
|
84 |
resultStr += "\r\n" + uid |
|
85 |
|
|
86 |
return resultStr |
DTI_PID/DTI_PID/MainWindow.py | ||
---|---|---|
62 | 62 |
from DisplayColors import DisplayOptions |
63 | 63 |
|
64 | 64 |
class MainWindow(QMainWindow, MainWindow_UI.Ui_MainWindow, SingletonInstane): |
65 |
""" |
|
66 |
This is MainWindow class |
|
67 |
""" |
|
65 |
""" This is MainWindow class """ |
|
68 | 66 |
addMessage = pyqtSignal(Enum, str) |
69 | 67 |
|
70 | 68 |
''' |
... | ... | |
589 | 587 |
def actionSaveCliked(self): |
590 | 588 |
from datetime import datetime |
591 | 589 |
from AppDocData import AppDocData |
590 |
from SaveWorkCommand import SaveWorkCommand |
|
592 | 591 |
|
593 | 592 |
try: |
594 | 593 |
appDocData = AppDocData.instance() |
... | ... | |
604 | 603 |
appDocData.allItems.append(item) |
605 | 604 |
if issubclass(type(item), QEngineeringTextItem): |
606 | 605 |
appDocData.texts.append(item) |
607 |
#elif issubclass(type(item), SymbolSvgItem): |
|
608 |
# appDocData.symbols.append(item) |
|
609 |
|
|
610 | 606 |
## |
607 |
|
|
611 | 608 |
itemTypes = [] |
612 | 609 |
for item in items: |
613 | 610 |
typeExist = False |
... | ... | |
619 | 616 |
itemTypes.append(type(item)) |
620 | 617 |
## |
621 | 618 |
|
622 |
self.dbUpdate() |
|
623 |
self.saveToXml(True) |
|
619 |
self._save_work_cmd = SaveWorkCommand() |
|
620 |
self._save_work_cmd.display_message.connect(self.onAddMessage) |
|
621 |
self._save_work_cmd.finished.connect(self.save_finished) |
|
624 | 622 |
|
625 |
drawings = appDocData.getDrawings() |
|
626 |
drawing = [drawing for drawing in drawings if appDocData.imgName == os.path.splitext(drawing[1])[0]] |
|
627 |
if drawing[0]: |
|
628 |
drawing[0][2] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') |
|
629 |
appDocData.saveDrawings(drawing) |
|
630 |
except Exception as ex: |
|
631 |
message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno) |
|
632 |
self.addMessage.emit(MessageType.Error, message) |
|
623 |
""" show spinner gif animation """ |
|
624 |
self.label_spinner.setWindowFlags(Qt.WindowStaysOnTopHint) |
|
625 |
if not hasattr(self, '_movie'): |
|
626 |
self._movie = QMovie(':/newPrefix/spinner.gif') |
|
627 |
self.label_spinner.setMovie(self._movie) |
|
628 |
self.label_spinner.show() |
|
629 |
self._movie.start() |
|
633 | 630 |
|
634 |
''' |
|
635 |
@brief save items to xml |
|
636 |
@author kyouho |
|
637 |
@date 2018.07.31 |
|
638 |
''' |
|
639 |
def saveToXml(self, alert = True): |
|
640 |
import XmlGenerator as xg |
|
641 |
from AppDocData import AppDocData |
|
642 |
|
|
643 |
try: |
|
644 |
docData = AppDocData.instance() |
|
645 |
if docData.imgName is None: |
|
646 |
self.showImageSelectionMessageBox() |
|
647 |
return |
|
648 |
result = xg.writeXmlOnScene(docData.imgName, docData.imgWidth, docData.imgHeight) |
|
649 |
|
|
650 |
if len(self.removedItems['LINE']): |
|
651 |
docData.deleteLineDataList_LineNo(self.removedItems['LINE']) |
|
652 |
self.removedItems['LINE'] = [] |
|
653 |
|
|
654 |
if len(self.removedItems['EQUIP']): |
|
655 |
docData.deleteEquipDataList(self.removedItems['EQUIP']) |
|
656 |
self.removedItems['EQUIP'] = [] |
|
657 |
|
|
658 |
if len(self.removedItems['INST']): |
|
659 |
docData.deleteInstDataList(self.removedItems['INST']) |
|
660 |
self.removedItems['INST'] = [] |
|
661 |
|
|
662 |
if len(self.removedItems['NOTE']): |
|
663 |
docData.deleteNoteDataList(self.removedItems['NOTE']) |
|
664 |
self.removedItems['NOTE'] = [] |
|
665 |
|
|
666 |
if alert: |
|
667 |
resultStr = '[저장 결과]' |
|
668 |
|
|
669 |
for item in result.items(): |
|
670 |
itemName = str(item[0]) |
|
671 |
itemSuccessCount = str(item[1][0]) |
|
672 |
itemFailUidList = item[1][1] |
|
673 |
resultStr += "\r\n" + itemName + " Save Count : " + itemSuccessCount |
|
674 |
if len(itemFailUidList) > 0: |
|
675 |
resultStr += "\r\n" + itemName + " Error List(UID)" |
|
676 |
for uid in itemFailUidList: |
|
677 |
resultStr += "\r\n" + uid |
|
678 |
|
|
679 |
QMessageBox.about(self.graphicsView, self.tr('Notice'), resultStr) |
|
631 |
self._save_work_cmd.start() |
|
680 | 632 |
except Exception as ex: |
681 | 633 |
message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno) |
682 | 634 |
self.addMessage.emit(MessageType.Error, message) |
683 | 635 |
|
636 |
def save_finished(self): |
|
637 |
""" stop movie and hide label after finishing save """ |
|
638 |
self._movie.stop() |
|
639 |
self.label_spinner.hide() |
|
640 |
QMessageBox.about(self.graphicsView, self.tr('Notice'), self._save_work_cmd.resultStr) |
|
641 |
|
|
684 | 642 |
''' |
685 | 643 |
@brief refresh resultPropertyTableWidget |
686 | 644 |
@author kyouho |
... | ... | |
1677 | 1635 |
self.createDetectedTitleBlockTextItem(titleBlockTextInfoList) |
1678 | 1636 |
|
1679 | 1637 |
self.dbUpdate() |
1680 |
#self.saveToXml(False) |
|
1681 | 1638 |
|
1682 | 1639 |
# update scene |
1683 | 1640 |
#self.graphicsView.scene.update(self.graphicsView.sceneRect()) |
... | ... | |
1985 | 1942 |
from QEngineeringFlowArrowItem import QEngineeringFlowArrowItem |
1986 | 1943 |
from EngineeringLineItem import QEngineeringLineItem |
1987 | 1944 |
from EngineeringUnknownItem import QEngineeringUnknownItem |
1945 |
from SaveWorkCommand import SaveWorkCommand |
|
1988 | 1946 |
|
1989 | 1947 |
try: |
1990 | 1948 |
docData = AppDocData.instance() |
... | ... | |
2064 | 2022 |
message = 'can\'t found {}'.format(diffFilePath) |
2065 | 2023 |
self.addMessage.emit(MessageType.Normal, message) |
2066 | 2024 |
|
2067 |
self.saveToXml(False)
|
|
2025 |
SaveWorkCommand.save_to_xml()
|
|
2068 | 2026 |
except Exception as ex: |
2069 | 2027 |
message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno) |
2070 | 2028 |
self.addMessage.emit(MessageType.Error, message) |
DTI_PID/DTI_PID/MainWindow_UI.py | ||
---|---|---|
1 | 1 |
# -*- coding: utf-8 -*- |
2 | 2 |
|
3 |
# Form implementation generated from reading ui file './UI/MainWindow.ui'
|
|
3 |
# Form implementation generated from reading ui file './ui/MainWindow.ui'
|
|
4 | 4 |
# |
5 |
# Created by: PyQt5 UI code generator 5.11.3
|
|
5 |
# Created by: PyQt5 UI code generator 5.12
|
|
6 | 6 |
# |
7 | 7 |
# WARNING! All changes made in this file will be lost! |
8 | 8 |
|
9 | 9 |
from PyQt5 import QtCore, QtGui, QtWidgets |
10 | 10 |
|
11 |
|
|
11 | 12 |
class Ui_MainWindow(object): |
12 | 13 |
def setupUi(self, MainWindow): |
13 | 14 |
MainWindow.setObjectName("MainWindow") |
... | ... | |
24 | 25 |
self.verticalLayout = QtWidgets.QVBoxLayout() |
25 | 26 |
self.verticalLayout.setSizeConstraint(QtWidgets.QLayout.SetMaximumSize) |
26 | 27 |
self.verticalLayout.setObjectName("verticalLayout") |
28 |
self.label_spinner = QtWidgets.QLabel(self.centralwidget) |
|
29 |
self.label_spinner.setText("") |
|
30 |
self.label_spinner.setAlignment(QtCore.Qt.AlignCenter) |
|
31 |
self.label_spinner.setObjectName("label_spinner") |
|
32 |
self.verticalLayout.addWidget(self.label_spinner) |
|
27 | 33 |
self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1) |
28 | 34 |
MainWindow.setCentralWidget(self.centralwidget) |
29 | 35 |
self.menubar = QtWidgets.QMenuBar(MainWindow) |
... | ... | |
572 | 578 |
self.actionVendor.setToolTip(_translate("MainWindow", "Set Vendor Package")) |
573 | 579 |
self.actionViewVendor_Area.setText(_translate("MainWindow", "Vendor Area(7)")) |
574 | 580 |
|
575 |
import MainWindow_rc |
|
576 |
|
|
577 |
if __name__ == "__main__": |
|
578 |
import sys |
|
579 |
app = QtWidgets.QApplication(sys.argv) |
|
580 |
MainWindow = QtWidgets.QMainWindow() |
|
581 |
ui = Ui_MainWindow() |
|
582 |
ui.setupUi(MainWindow) |
|
583 |
MainWindow.show() |
|
584 |
sys.exit(app.exec_()) |
|
585 | 581 |
|
582 |
import MainWindow_rc |
DTI_PID/DTI_PID/Shapes/SymbolSvgItem.py | ||
---|---|---|
240 | 240 |
return [x for x in self.associations() if issubclass(type(x), SymbolSvgItem)] |
241 | 241 |
|
242 | 242 |
def toSql(self): |
243 |
""" |
|
244 |
convert valve data to sql query |
|
245 |
""" |
|
243 |
""" convert valve data to sql query """ |
|
246 | 244 |
import uuid |
247 | 245 |
from AppDocData import AppDocData |
248 | 246 |
|
DTI_PID/DTI_PID/UI/MainWindow.ui | ||
---|---|---|
27 | 27 |
<property name="sizeConstraint"> |
28 | 28 |
<enum>QLayout::SetMaximumSize</enum> |
29 | 29 |
</property> |
30 |
<item> |
|
31 |
<widget class="QLabel" name="label_spinner"> |
|
32 |
<property name="text"> |
|
33 |
<string/> |
|
34 |
</property> |
|
35 |
<property name="alignment"> |
|
36 |
<set>Qt::AlignCenter</set> |
|
37 |
</property> |
|
38 |
</widget> |
|
39 |
</item> |
|
30 | 40 |
</layout> |
31 | 41 |
</item> |
32 | 42 |
</layout> |
내보내기 Unified diff