프로젝트

일반

사용자정보

개정판 0bcf00da

ID0bcf00dab65d2c9b842ccc5abea9bedb7fdeb8e9
상위 f94312a8
하위 a8cd73f2

김정우 이(가) 약 7년 전에 추가함

SymbolExplorer TreeWidget 구성 작업 중/아이템 계층구조 미적용/TreeWidget Item(Symbol) 클릭 시 ImageViewer에 표시, 줌, 이동

차이점 보기:

DTI_PID/DTI_PID/App.py
25 25
from AppDocData import AppDocData
26 26
import QDirTreeWidget, QPropertyTableWidget
27 27
import QSymbolEditorDialog
28
import QResultTreeWidget
28 29

  
29 30
class Worker(QObject):
30 31
    from PyQt5.QtCore import QThread
......
64 65
        self.graphicsView.setParent(self.centralwidget)
65 66
        self.graphicsView.useDefaultCommand() ##### USE DEFAULT COMMAND
66 67
        self.verticalLayout.addWidget(self.graphicsView)
67
        self.treeWidgetObjects.header().hide()
68 68

  
69 69
        # Add Custom TreeWidget
70 70
        self.dirTreeWidget = QDirTreeWidget.QDirTreeWidget()
......
76 76
        self.symbolTabVerticalLayout.addWidget(self.propertyTableWidget)
77 77
        self.dirTreeWidget.singleClicked.connect(self.propertyTableWidget.getClickedSymbol)
78 78

  
79
        # Add Custom Result Tree Widget (Symbol Explorer)
80
        self.resultTreeWidget = QResultTreeWidget.QResultTreeWidget(self.graphicsView)
81
        self.resultTreeWidget.header().hide()
82
        self.symbolExplorerVerticalLayout.addWidget(self.resultTreeWidget)
83

  
84
        # Add Empty Widget
85
        self.emptyWidget = QTableWidget()
86
        self.symbolExplorerVerticalLayout.addWidget(self.emptyWidget)
87

  
79 88
        self.loadStyleSheet(os.path.dirname(os.path.realpath(__file__)) + '\\coffee')
80 89

  
81 90
        # connect signals and slots
......
87 96
        self.actionArea.triggered.connect(self.areaConfiguration)
88 97
        self.actionConfiguration.triggered.connect(self.configuration)
89 98
        self.pushButtonCreateSymbol.clicked.connect(self.createSymbol)
90
        self.graphicsView.scene.changed.connect(self.sceneChanged)
99
        self.graphicsView.scene.changed.connect(lambda: self.resultTreeWidget.sceneChanged(self.graphicsView.scene.items()))
91 100
    
92 101
    '''
93 102
        @brief  load application style sheet
......
130 139
    '''
131 140
    def openImageDrawing(self, MainWindow):
132 141
        try:
142
            self.graphicsView.clearImage()
133 143
            self.graphicsView.scene.clear()
134 144
            self.path = self.graphicsView.loadImageFromFile()
135 145
            baseName = os.path.basename(self.path)
136
            root = QTreeWidgetItem(self.treeWidgetObjects, [os.path.splitext(baseName)[0]])
146
            root = QTreeWidgetItem(self.resultTreeWidget, [os.path.splitext(baseName)[0]])
137 147

  
138 148
            # DEBUG
139 149
            '''
......
162 172

  
163 173
        return self.path
164 174

  
165
    '''
166
        @brief  called when scene is changed
167
        @author humkyung
168
        @date   2018.04.10
169
    '''
170
    def sceneChanged(self, data):
171
        pass
175
    #'''
176
    #    @brief      called when scene is changed
177
    #    @author     humkyung
178
    #    @date       2018.04.10
179
    #    @history    18.04.11    Jeongwoo        ResultTreeWidget(SymbolExplorer)
180
    #'''
181
    #def sceneChanged(self, data):
182
    #    print("changed")
183
    #    pass
172 184

  
173 185
    '''
174 186
        @brief  create a symbol
......
205 217

  
206 218
        try:
207 219
            self.dlg = QRecognitionDialog(self)
208
            self.startThread()
220
            self.dlg.ui.buttonBox.setEnabled(True)
221
            #self.startThread()
209 222
            self.dlg.show()
210 223
            self.dlg.exec_()
211

  
224
            self.dlg.isAccepted = True
225
            self.xmlPath = ["D:/Visual Studio Project/DTIPID/DTIPID/DTI_PID/DTI_PID/res/Result/SG_TEST/output/UY1-K-2000_P1_300dpi.xml"]
212 226
            if self.dlg.isAccepted == True:
213 227
                self.loadRecognitionResult(self.xmlPath[0])
214 228

  
......
216 230
                #img = cv2.imread(self.path)
217 231
                area = AppDocData.instance().getArea('Drawing')
218 232
                detector = LineDetector(area.img)
233
                sceneItems = self.graphicsView.scene.items()
219 234
                for item in self.graphicsView.scene.items():
220 235
                    if (type(item) is SymbolSvgItem):
221 236
                        res = detector.detectConnectedLine(item, int(area.x), int(area.y))
......
253 268
                svgFilePath = project.getSvgFilePath() + '/' + type + '/' + name + '.svg'
254 269
                if os.path.isfile(svgFilePath):
255 270
                    svg = SymbolSvgItem(svgFilePath)
271
                    svg.name = name
256 272
                    svg.angle = angle
257 273
                    svg.loc = pt
258 274
                    svg.size = size
DTI_PID/DTI_PID/Commands/DefaultCommand.py
24 24
        #self.imageViewer.setCursor(QCursor(Qt.OpenHandCursor))
25 25
    
26 26
    '''
27
        @brief      Scrol / Pan / Zoom with Wheel Button
27
        @brief      Scroll / Pan / Zoom with Wheel Button
28 28
        @author     Jeongwoo
29 29
        @date       18.04.10
30 30
        @history    .
DTI_PID/DTI_PID/DTI_PID_UI.py
1 1
# -*- coding: utf-8 -*-
2 2

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

  
......
49 49
        self.dockWidgetContents = QtWidgets.QWidget()
50 50
        self.dockWidgetContents.setObjectName("dockWidgetContents")
51 51
        self.gridLayout_2 = QtWidgets.QGridLayout(self.dockWidgetContents)
52
        self.gridLayout_2.setContentsMargins(0, 0, 0, 0)
52 53
        self.gridLayout_2.setObjectName("gridLayout_2")
53 54
        self.tabWidget = QtWidgets.QTabWidget(self.dockWidgetContents)
54 55
        self.tabWidget.setObjectName("tabWidget")
55 56
        self.Symbol = QtWidgets.QWidget()
56 57
        self.Symbol.setObjectName("Symbol")
57 58
        self.gridLayout_3 = QtWidgets.QGridLayout(self.Symbol)
59
        self.gridLayout_3.setContentsMargins(0, 0, 0, 0)
58 60
        self.gridLayout_3.setObjectName("gridLayout_3")
59 61
        self.symbolTabVerticalLayout = QtWidgets.QVBoxLayout()
60 62
        self.symbolTabVerticalLayout.setObjectName("symbolTabVerticalLayout")
......
73 75
        self.dockWidgetContents_2 = QtWidgets.QWidget()
74 76
        self.dockWidgetContents_2.setObjectName("dockWidgetContents_2")
75 77
        self.gridLayout_4 = QtWidgets.QGridLayout(self.dockWidgetContents_2)
78
        self.gridLayout_4.setContentsMargins(0, 0, 0, 0)
76 79
        self.gridLayout_4.setObjectName("gridLayout_4")
77
        self.verticalLayout_3 = QtWidgets.QVBoxLayout()
78
        self.verticalLayout_3.setObjectName("verticalLayout_3")
79
        self.treeWidgetObjects = QtWidgets.QTreeWidget(self.dockWidgetContents_2)
80
        self.treeWidgetObjects.setObjectName("treeWidgetObjects")
81
        self.treeWidgetObjects.headerItem().setText(0, "1")
82
        self.verticalLayout_3.addWidget(self.treeWidgetObjects)
83
        self.listView_3 = QtWidgets.QListView(self.dockWidgetContents_2)
84
        self.listView_3.setObjectName("listView_3")
85
        self.verticalLayout_3.addWidget(self.listView_3)
86
        self.gridLayout_4.addLayout(self.verticalLayout_3, 0, 0, 1, 1)
80
        self.symbolExplorerVerticalLayout = QtWidgets.QVBoxLayout()
81
        self.symbolExplorerVerticalLayout.setObjectName("symbolExplorerVerticalLayout")
82
        self.gridLayout_4.addLayout(self.symbolExplorerVerticalLayout, 0, 0, 1, 1)
87 83
        self.dockWidgetObjectExplorer.setWidget(self.dockWidgetContents_2)
88 84
        MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(1), self.dockWidgetObjectExplorer)
89 85
        self.actionOpen = QtWidgets.QAction(MainWindow)
......
159 155
        self.actionConfiguration.setText(_translate("MainWindow", "환경 설정"))
160 156
        self.actionArea.setText(_translate("MainWindow", "영역 설정"))
161 157

  
162
import DTI_PID_rc
163 158

  
164 159
if __name__ == "__main__":
165 160
    import sys
DTI_PID/DTI_PID/QResultTreeWidget.py
1
try:
2
    from PyQt5.QtCore import *
3
    from PyQt5.QtGui import *
4
    from PyQt5.QtWidgets import *
5
except ImportError:
6
    try:
7
        from PyQt4.QtCore import *
8
        from PyQt4.QtGui import *
9
    except ImportError:
10
        raise ImportError("ImageViewerQt: Requires PyQt5 or PyQt4.")
11
from SymbolSvgItem import SymbolSvgItem
12

  
13
class QResultTreeWidget(QTreeWidget):
14

  
15
    def __init__(self, imageViewer):
16
        QTreeWidget.__init__(self)
17
        self.itemClicked.connect(self.itemClickEvent)
18
        self.imageViewer = imageViewer
19
        self.scene = imageViewer.scene
20

  
21
    '''
22
        @brief      Scene Changed Listener
23
        @author     Jeongwoo
24
        @date       18.04.11
25
        @history    .
26
    '''
27
    lastSceneItems = None
28
    def sceneChanged(self, sceneItems):
29
        changedSceneItems = [item for item in sceneItems if type(item) is SymbolSvgItem] # Sublist includes SymbolSvgItem
30
        print("Total Svg Item count : " + str(len(changedSceneItems)))
31
        if self.lastSceneItems != changedSceneItems:
32
            self.initResultTreeWidget(changedSceneItems)
33
            
34
    '''
35
        @brief      Initialize TreeWidget
36
                    Tree Item Clear and Add Item
37
        @author     Jeongwoo
38
        @date       18.04.11
39
        @history    .
40
    '''
41
    def initResultTreeWidget(self, sceneItems):
42
        print("initResultTree")
43
        self.clear()
44
        symbolSvgItemList = []
45
        for item in sceneItems:
46
            if (type(item) is SymbolSvgItem):
47
                newItem = QTreeWidgetItem([item.name])
48
                newItem.setData(0, Qt.ToolTipRole, item)
49
                self.invisibleRootItem().addChild(newItem)
50
                symbolSvgItemList.append(item)
51
        self.lastSceneItems = symbolSvgItemList
52
        
53
    '''
54
        @brief      TreeWidget Item click listener
55
        @author     Jeongwoo
56
        @date       18.04.11
57
        @history    .
58
    '''
59
    lastClickedItem = None
60
    def itemClickEvent(self, item, columnNo):
61
        print("Item " + item.text(0) + " clicked")
62
        svgItem = item.data(0, Qt.ToolTipRole)
63
        if self.lastClickedItem is not None:
64
            self.scene.removeItem(self.lastClickedItem)
65
        ## Draw rectangle on selected symbol
66
        graphicItem = self.scene.addRect(svgItem.loc[0], svgItem.loc[1], svgItem.size[0], svgItem.size[1], QPen(QColor(255,255,0,100)), QBrush(QColor(255,255,0,100)))
67
        self.imageViewer.centerOn(QPointF(svgItem.loc[0], svgItem.loc[1]))
68
        ## Send new event to imageViewer's zoomImage Method
69
        self.imageViewer.zoomImage(True, QMouseEvent(QEvent.MouseButtonPress, self.imageViewer.mapFromScene(QPointF(svgItem.loc[0], svgItem.loc[1])), Qt.LeftButton, Qt.LeftButton, Qt.NoModifier), 3)
70
        self.lastClickedItem = graphicItem
DTI_PID/DTI_PID/QtImageViewer.py
181 181
            self.updateViewer()
182 182
            self.setCursor(QCursor(Qt.ArrowCursor))
183 183

  
184
    def zoomImage(self, isZoomIn, event):
184
    '''
185
        @brief      Zoom in & out image
186
        @author     Jeongwoo
187
        @date       -
188
        @history    18.04.11    Jeongwoo    add parameter 'adjust' (@ref QResultTreeWidget.itemClickEvent(self, item, columnNo))
189
    '''
190
    def zoomImage(self, isZoomIn, event, adjust = 1):
185 191
        """ Zoom in & out
186 192
        """
193
        HALF_SIZE = 300
187 194
        clickPos = event.pos()
188
        scenePos1 = self.mapToScene(clickPos.x() - 300, clickPos.y() - 300)
189
        scenePos2 = self.mapToScene(clickPos.x() + 300, clickPos.y() + 300)
195
        scenePos1 = self.mapToScene(clickPos.x() - HALF_SIZE//adjust, clickPos.y() - HALF_SIZE//adjust)
196
        scenePos2 = self.mapToScene(clickPos.x() + HALF_SIZE//adjust, clickPos.y() + HALF_SIZE//adjust)
190 197
        if isZoomIn:
191 198
            print("zoom in")
192
            zoomArea = QRectF(QPointF(scenePos1.x(), scenePos1.y()), QPointF(scenePos2.x(), scenePos2.y()))
199
            zoomArea = QRectF(QPointF(scenePos1.x() if scenePos1.x() > 0 else 0, scenePos1.y() if scenePos1.y() > 0 else 0), QPointF(scenePos2.x(), scenePos2.y()))
200
            #self.fitInView(zoomArea, Qt.KeepAspectRatioByExpanding)
193 201
            viewBBox = self.zoomStack[-1] if len(self.zoomStack) else self.sceneRect()
194 202
            selectionBBox = zoomArea.intersected(viewBBox)
195 203
            self.scene.setSelectionArea(QPainterPath())  # Clear current selection area.
196
            if selectionBBox.isValid() and (selectionBBox != viewBBox):
197
                self.zoomStack.append(selectionBBox)
198
                self.updateViewer()
204
            if selectionBBox.width() > HALF_SIZE*2 and selectionBBox.height() > HALF_SIZE*2:
205
                if selectionBBox.isValid() and (selectionBBox != viewBBox):
206
                    self.zoomStack.append(selectionBBox)
207
                    self.updateViewer()
199 208
        else:
200 209
            print("zoom out")
201 210
            self.scene.setSelectionArea(QPainterPath())  # Clear current selection area.
......
312 321
                painter.drawLine(0, self.crosshairPos.y(), width, self.crosshairPos.y())#Horizontal
313 322
            #else:
314 323
            #    painter.eraseRect(QRectF(0, 0, width, height))
315
            
316
    '''
317
        @brief  override paint event
318
    '''
319
    def paintEvent(self, event):
320
        try:
321
            super(QtImageViewer, self).paintEvent(event)
324
                        
325
    #'''
326
    #    @brief  override paint event
327
    #'''
328
    #def paintEvent(self, event):
329
    #    try:
330
    #        super(QtImageViewer, self).paintEvent(event)
322 331

  
323
            #if (self.command is not None) and ('CreateCommand' == self.command.__class__.__name__):
324
            #    self.command.template.paint(QPainter(self))
325
        except Exception as ex:
326
            print('Error occurs', ex)
332
    #        #if (self.command is not None) and ('CreateCommand' == self.command.__class__.__name__):
333
    #        #    self.command.template.paint(QPainter(self))
334
    #    except Exception as ex:
335
    #        print('Error occurs', ex)
327 336

  
328 337
    GUIDELINE_ITEMS = []
329 338
    def showGuideline(self, isShow):
DTI_PID/DTI_PID/Shapes/SymbolSvgItem.py
9 9
from PyQt5.QtWidgets import (QGraphicsItem)
10 10

  
11 11
class SymbolSvgItem(QGraphicsSvgItem):
12
    '''
13
        @history    18.04.11    Jeongwoo    Add Variable (Name)
14
    '''
12 15
    def __init__(self, path):
13 16
        super(SymbolSvgItem, self).__init__(path)
14 17

  
15 18
        self.setFlags(QGraphicsItem.ItemIsSelectable)
16 19
                      #QGraphicsItem.ItemIsMovable)
17 20
        
21
        self.name = ''
18 22
        self.angle = 0
19 23
        self.loc = None
20 24
        self.size = None
DTI_PID/DTI_PID/UI/DTI__PID.ui
139 139
   <widget class="QWidget" name="dockWidgetContents_2">
140 140
    <layout class="QGridLayout" name="gridLayout_4">
141 141
     <item row="0" column="0">
142
      <layout class="QVBoxLayout" name="verticalLayout_3">
143
       <item>
144
        <widget class="QTreeWidget" name="treeWidgetObjects">
145
         <column>
146
          <property name="text">
147
           <string notr="true">1</string>
148
          </property>
149
         </column>
150
        </widget>
151
       </item>
152
       <item>
153
        <widget class="QListView" name="listView_3"/>
154
       </item>
155
      </layout>
142
      <layout class="QVBoxLayout" name="symbolExplorerVerticalLayout"/>
156 143
     </item>
157 144
    </layout>
158 145
   </widget>

내보내기 Unified diff