프로젝트

일반

사용자정보

개정판 52e28a3a

ID52e28a3a91545c8b52b820f0dc32d9ae5cdff0e5
상위 c45aea04
하위 1c11e3b5, 66caf460, 4a4e7537

백흠경이(가) 약 6년 전에 추가함

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

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