개정판 0bcf00da
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