hytos / DTI_PID / DTI_PID / ItemTreeWidget.py @ 990644d9
이력 | 보기 | 이력해설 | 다운로드 (35.3 KB)
1 |
# coding: utf-8
|
---|---|
2 |
""" This is item tree widget module """
|
3 |
|
4 |
import os |
5 |
import re |
6 |
import sys |
7 |
|
8 |
try:
|
9 |
from PyQt5.QtCore import * |
10 |
from PyQt5.QtGui import * |
11 |
from PyQt5.QtWidgets import * |
12 |
except ImportError: |
13 |
try:
|
14 |
from PyQt4.QtCore import * |
15 |
from PyQt4.QtGui import * |
16 |
except ImportError: |
17 |
raise ImportError("ImageViewerQt: Requires PyQt5 or PyQt4.") |
18 |
|
19 |
from EngineeringAbstractItem import QEngineeringAbstractItem |
20 |
from SymbolSvgItem import SymbolSvgItem |
21 |
from EngineeringTextItem import QEngineeringTextItem |
22 |
from EngineeringNoteItem import QEngineeringNoteItem |
23 |
from EngineeringLineNoTextItem import QEngineeringLineNoTextItem |
24 |
from EngineeringEquipmentItem import QEngineeringEquipmentItem |
25 |
from EngineeringInstrumentItem import QEngineeringInstrumentItem |
26 |
from QEngineeringTrimLineNoTextItem import QEngineeringTrimLineNoTextItem |
27 |
from EngineeringUnknownItem import QEngineeringUnknownItem |
28 |
from EngineeringErrorItem import QEngineeringErrorItem |
29 |
from AppDocData import AppDocData |
30 |
from Drawing import Drawing |
31 |
|
32 |
class CustomTreeWidgetItem(QTreeWidgetItem): |
33 |
def __init__(self, *args, **kwargs): |
34 |
super(CustomTreeWidgetItem, self).__init__(*args, **kwargs) |
35 |
|
36 |
def setData(self, column, role, value): |
37 |
if role == Qt.EditRole:
|
38 |
pass
|
39 |
elif role == Qt.CheckStateRole:
|
40 |
if self.treeWidget() is not None: |
41 |
state = Qt.CheckState.Unchecked if value is 0 else Qt.CheckState.Checked |
42 |
self.treeWidget().checkBoxToggled.emit(self, state) |
43 |
|
44 |
super(CustomTreeWidgetItem, self).setData(column, role, value) |
45 |
|
46 |
class QItemTreeWidget(QTreeWidget): |
47 |
""" This is item tree widget """
|
48 |
TREE_DATA_ROLE = Qt.UserRole |
49 |
|
50 |
#Add Signal
|
51 |
singleClicked = pyqtSignal(SymbolSvgItem) |
52 |
noteNoSingleClicked = pyqtSignal(str, dict) |
53 |
lineNoSingleClicked = pyqtSignal(QEngineeringAbstractItem) |
54 |
drawingClicked = pyqtSignal(Drawing) |
55 |
checkBoxToggled = pyqtSignal(QTreeWidgetItem, Qt.CheckState) |
56 |
|
57 |
'''
|
58 |
@history 2018.05.11 Jeongwoo Add Context Menu settings
|
59 |
'''
|
60 |
def __init__(self, imageViewer): |
61 |
QTreeWidget.__init__(self)
|
62 |
|
63 |
self.checkBoxToggled.connect(self.itemCheckBoxToggled) |
64 |
|
65 |
self.itemClicked.connect(self.itemClickEvent) |
66 |
self.imageViewer = imageViewer
|
67 |
self.scene = imageViewer.scene
|
68 |
self.root = None |
69 |
self.setContextMenuPolicy(Qt.CustomContextMenu)
|
70 |
self.customContextMenuRequested.connect(self.openContextMenu) |
71 |
|
72 |
'''
|
73 |
@brief delete selected symbol
|
74 |
@author humkyung
|
75 |
@date 2018.07.20
|
76 |
'''
|
77 |
def keyPressEvent(self, event): |
78 |
try:
|
79 |
if event.key() == Qt.Key_Delete:
|
80 |
if self.selectedItems(): |
81 |
for item in self.selectedItems(): |
82 |
data = item.data(0, self.TREE_DATA_ROLE) |
83 |
if data is not None: |
84 |
self.imageViewer.scene.removeItem(data)
|
85 |
|
86 |
if type(data) is QEngineeringLineNoTextItem: |
87 |
self.imageViewer.mainWindow.removedItems['LINE'].append(str(data.uid)) |
88 |
elif type(data) is QEngineeringInstrumentItem: |
89 |
self.imageViewer.mainWindow.removedItems['INST'].append(str(data.uid)) |
90 |
elif type(data) is QEngineeringEquipmentItem: |
91 |
self.imageViewer.mainWindow.removedItems['EQUIP'].append(str(data.uid)) |
92 |
elif type(data) is QEngineeringNoteItem: |
93 |
self.imageViewer.mainWindow.removedItems['NOTE'].append(str(data.uid)) |
94 |
|
95 |
item.parent().removeChild(item) |
96 |
event.accept() |
97 |
elif event.key() == Qt.Key_Up:
|
98 |
if self.selectedItems(): |
99 |
item = self.selectedItems()[0] |
100 |
aboveItem = self.itemAbove(item)
|
101 |
if aboveItem is not None: |
102 |
self.setCurrentItem(aboveItem)
|
103 |
self.scrollToItem(aboveItem, QAbstractItemView.EnsureVisible)
|
104 |
self.itemClickEvent(aboveItem, 0) |
105 |
event.accept() |
106 |
elif event.key() == Qt.Key_Down:
|
107 |
if self.selectedItems(): |
108 |
item = self.selectedItems()[0] |
109 |
belowItem = self.itemBelow(item)
|
110 |
if belowItem is not None: |
111 |
self.setCurrentItem(belowItem)
|
112 |
self.scrollToItem(belowItem, QAbstractItemView.EnsureVisible)
|
113 |
self.itemClickEvent(belowItem, 0) |
114 |
event.accept() |
115 |
else:
|
116 |
event.ignore() |
117 |
except Exception as ex: |
118 |
print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)) |
119 |
|
120 |
'''
|
121 |
@brief Show Context Menu
|
122 |
@author Jeongwoo
|
123 |
@date 18.05.11
|
124 |
@history 18.06.14 Jeongwoo Add item None check
|
125 |
humkyung 2018.06.27 add menu of run item for selecting line type
|
126 |
'''
|
127 |
def openContextMenu(self, position): |
128 |
from EngineeringRunItem import QEngineeringRunItem |
129 |
|
130 |
indexes = self.selectedIndexes()
|
131 |
itemPosition = self.mapTo(self, position) |
132 |
item = self.itemAt(itemPosition)
|
133 |
if item is not None: |
134 |
if item is self.LineNoTreeItem: |
135 |
menu = QMenu() |
136 |
explode_action = QAction(self.tr("Explode")) |
137 |
explode_action.triggered.connect(lambda : self.explode_all_line_nos(item)) |
138 |
menu.addAction(explode_action) |
139 |
menu.exec_(self.viewport().mapToGlobal(position))
|
140 |
else:
|
141 |
data = item.data(0, self.TREE_DATA_ROLE) |
142 |
if len(indexes) > 0 and data is not None and issubclass(type(data), QEngineeringLineNoTextItem): |
143 |
index = indexes[0]
|
144 |
menu = QMenu() |
145 |
pickColorAction = QAction(self.tr("Select Line Color")) |
146 |
pickColorAction.triggered.connect(lambda : self.pickColorClickEvent(item)) |
147 |
menu.addAction(pickColorAction) |
148 |
explode_action = QAction(self.tr("Explode")) |
149 |
explode_action.triggered.connect(lambda : self.explode_line_no(item)) |
150 |
menu.addAction(explode_action) |
151 |
menu.exec_(self.viewport().mapToGlobal(position))
|
152 |
elif len(indexes) > 0 and data is not None and issubclass(type(data), QEngineeringRunItem): |
153 |
index = indexes[0]
|
154 |
menu = QMenu() |
155 |
lineTypeAction = QAction(self.tr("Select Line Type")) |
156 |
lineTypeAction.triggered.connect(lambda : self.lineTypeClickEvent(item)) |
157 |
menu.addAction(lineTypeAction) |
158 |
explode_action = QAction(self.tr("Explode")) |
159 |
explode_action.triggered.connect(lambda : self.explode_line_run(item)) |
160 |
menu.addAction(explode_action) |
161 |
menu.exec_(self.viewport().mapToGlobal(position))
|
162 |
|
163 |
'''
|
164 |
@brief Pick Color for Line No
|
165 |
@author Jeongwoo
|
166 |
@date 18.05.11
|
167 |
@history 18.05.14 Jeongwoo Change method to change color by changeTreeWidgetItemColorRecursively()
|
168 |
'''
|
169 |
def pickColorClickEvent(self, lineNoTreeWidgetItem): |
170 |
color = QColorDialog.getColor() # Dialog returns QColor
|
171 |
|
172 |
if color is not None: |
173 |
lineNoTreeWidgetItem.setForeground(0, QBrush(color))
|
174 |
lineNoTreeWidgetItem.setFont(0, lineNoTreeWidgetItem.font(0)) |
175 |
lineNoItem = lineNoTreeWidgetItem.data(0, self.TREE_DATA_ROLE) |
176 |
if lineNoItem:
|
177 |
lineNoItem.change_color(color.name()) |
178 |
lineNoItem.setColor(color.name()) |
179 |
connectedItems = lineNoItem.getConnectedItems() |
180 |
if connectedItems is not None: |
181 |
for connectedItem in connectedItems: |
182 |
connectedItem.setColor(color.name()) |
183 |
self.changeTreeWidgetItemColorRecursively(lineNoTreeWidgetItem, color)
|
184 |
|
185 |
def explode_line_run(self, tree_widget_item): |
186 |
""" explode line run """
|
187 |
|
188 |
try:
|
189 |
line_run = tree_widget_item.data(0, self.TREE_DATA_ROLE) |
190 |
if line_run:
|
191 |
for item in line_run.items: |
192 |
if issubclass(type(item), SymbolSvgItem): self.addTreeItem(self.SymbolsTreeItem, item) |
193 |
|
194 |
for i in reversed(range(tree_widget_item.childCount())): |
195 |
tree_widget_item.takeChild(i) |
196 |
|
197 |
line_run.explode() |
198 |
tree_widget_item.parent().takeChild(tree_widget_item.parent().indexOfChild(tree_widget_item)) |
199 |
finally:
|
200 |
pass
|
201 |
|
202 |
def explode_all_line_nos(self, tree_widget_item): |
203 |
""" explode all line nos """
|
204 |
|
205 |
try:
|
206 |
for i in self.LineNoTreeItem.childCount(): |
207 |
self.explode_line_no(self.LineNoTreeItem.child(i)) |
208 |
finally:
|
209 |
pass
|
210 |
|
211 |
def explode_line_no(self, lineNoTreeWidgetItem): |
212 |
""" explode line no """
|
213 |
|
214 |
try:
|
215 |
line_no_item = lineNoTreeWidgetItem.data(0, self.TREE_DATA_ROLE) |
216 |
if line_no_item:
|
217 |
connected_items = line_no_item.getConnectedItems() |
218 |
for item in connected_items: |
219 |
self.addTreeItem(self.SymbolsTreeItem, item) |
220 |
|
221 |
for i in reversed(range(lineNoTreeWidgetItem.childCount())): |
222 |
lineNoTreeWidgetItem.takeChild(i) |
223 |
|
224 |
line_no_item.explode() |
225 |
finally:
|
226 |
pass
|
227 |
|
228 |
'''
|
229 |
@brief pick line type
|
230 |
@author humkyung
|
231 |
@date 2018.06.27
|
232 |
'''
|
233 |
def lineTypeClickEvent(self, item): |
234 |
pass
|
235 |
|
236 |
'''
|
237 |
@brief Change Color recursively
|
238 |
@author Jeongwoo
|
239 |
@date 18.05.14
|
240 |
'''
|
241 |
def changeTreeWidgetItemColorRecursively(self, item, color): |
242 |
for index in range(item.childCount()): |
243 |
child = item.child(index) |
244 |
child.setForeground(0, QBrush(color))
|
245 |
child.setFont(0, child.font(0)) |
246 |
self.changeTreeWidgetItemColorRecursively(child, color)
|
247 |
|
248 |
'''
|
249 |
@brief Clear TreeWidget and Set Current PID
|
250 |
@author Jeongwoo
|
251 |
@date 18.04.11
|
252 |
@history 2018.04.26 Jeongwoo Add Child [SYMBOLS, NOTES] into root item
|
253 |
2018.05.09 Jeongwoo Change method to add default tree items
|
254 |
humkyung 2018.06.10 add tree item for Line No and Unknown Item
|
255 |
'''
|
256 |
def setCurrentPID(self, drawingName): |
257 |
appDocData = AppDocData.instance() |
258 |
|
259 |
self.clear()
|
260 |
self.root = QTreeWidgetItem(self, [drawingName]) |
261 |
self.root.setIcon(0, QIcon(':newPrefix/objects.png')) |
262 |
self.root.setData(0, self.TREE_DATA_ROLE, appDocData.activeDrawing) |
263 |
child = self.root.addChild(QTreeWidgetItem(['LINE NO'])) |
264 |
self.LineNoTreeItem = self.root.child(self.root.childCount() - 1) |
265 |
self.LineNoTreeItem.setFlags(self.root.flags() | Qt.ItemIsTristate | Qt.ItemIsUserCheckable) |
266 |
self.LineNoTreeItem.setCheckState(0, Qt.Checked) |
267 |
self.root.addChild(QTreeWidgetItem(['EQUIPMENTS'])) |
268 |
self.EqpTreeItem = self.root.child(self.root.childCount() - 1) |
269 |
self.root.addChild(QTreeWidgetItem(['SYMBOLS'])) |
270 |
self.SymbolsTreeItem = self.root.child(self.root.childCount() - 1) |
271 |
self.root.addChild(QTreeWidgetItem(['NOTES'])) |
272 |
self.NotesTreeItem = self.root.child(self.root.childCount() - 1) |
273 |
self.root.addChild(QTreeWidgetItem(['UNKNOWN'])) |
274 |
self.UnknownTreeItem = self.root.child(self.root.childCount() - 1) |
275 |
|
276 |
for idx in range(self.root.childCount()): |
277 |
child = self.root.child(idx)
|
278 |
child.setIcon(0, QIcon(':newPrefix/folder-black.png')) |
279 |
|
280 |
'''
|
281 |
@brief create tree item for pipe run if need
|
282 |
@author humkyung
|
283 |
@date 2018.05.15
|
284 |
@history 2018.05.17 Jeongwoo Change run item color with parent(LineNo Item) color
|
285 |
'''
|
286 |
def addPipeRunTreeItemIfNeed(self, lineNoTreeItem, pipeRun): |
287 |
for index in range(lineNoTreeItem.childCount()): |
288 |
treeItem = lineNoTreeItem.child(index) |
289 |
itemData = treeItem.data(0, self.TREE_DATA_ROLE) |
290 |
if itemData is not None and itemData == pipeRun: |
291 |
return treeItem
|
292 |
|
293 |
runItem = QTreeWidgetItem(['RUNS {}'.format(lineNoTreeItem.childCount()+1)]) |
294 |
runItem.setData(0, self.TREE_DATA_ROLE, pipeRun) |
295 |
|
296 |
brush = lineNoTreeItem.foreground(0)
|
297 |
runItem.setForeground(0, brush)
|
298 |
runItem.setFont(0, runItem.font(0)) |
299 |
|
300 |
lineNoTreeItem.addChild(runItem) |
301 |
|
302 |
return runItem
|
303 |
|
304 |
'''
|
305 |
@brief add a tree item
|
306 |
@author humkyung
|
307 |
@date 2018.04.17
|
308 |
@history humkyung 2018.04.19 treat a case parent is changed
|
309 |
Jeongwoo 2018.04.26 QEngineeringTextItem → QEngineeringLineNoTextItem
|
310 |
Insert if-statement for QEngineeringNoteItem
|
311 |
Add if-statement for QEngineeringLineNoTextItem
|
312 |
Jeongwoo 2018.05.11 Set color when SymbolSvgItem moved into new parent(Line No)
|
313 |
Jeongwoo 2018.05.15 Add break keyword on if-statement
|
314 |
Jeongwoo 2018.05.17 Set TreeWidgetItem's color with data's color And Set Data's color on LineNoTextItem Setting
|
315 |
humkyung 2018.06.12 add unknown item
|
316 |
humkyung 2018.07.20 append nozzle to equipment
|
317 |
'''
|
318 |
def addTreeItem(self, parent, child): |
319 |
item = None
|
320 |
appDocData = AppDocData.instance() |
321 |
|
322 |
try:
|
323 |
if (not hasattr(child, 'treeItem')) or (child.treeItem is None): |
324 |
if issubclass(type(child), SymbolSvgItem): |
325 |
isEquipmentType = appDocData.isEquipmentType(child.type) |
326 |
if isEquipmentType:
|
327 |
item = QTreeWidgetItem(self.EqpTreeItem, [child.name])
|
328 |
item.setData(0, self.TREE_DATA_ROLE, child) |
329 |
elif child.type == 'Nozzles': |
330 |
for i in range(self.EqpTreeItem.childCount()): |
331 |
eqpTreeItem = eqpRootTreeItem[0].child(i)
|
332 |
eqpSymbol = eqpTreeItem.data(0, self.TREE_DATA_ROLE) |
333 |
if child.owner is eqpSymbol: |
334 |
symbolsRootItem = eqpTreeItem |
335 |
item = QTreeWidgetItem(eqpTreeItem, [child.name]) |
336 |
item.setData(0, self.TREE_DATA_ROLE, child) |
337 |
break
|
338 |
|
339 |
if item is None: |
340 |
item = QTreeWidgetItem(self.SymbolsTreeItem, [child.name])
|
341 |
elif child.type == 'Notes': |
342 |
return item
|
343 |
else:
|
344 |
item = QTreeWidgetItem(self.SymbolsTreeItem, [child.name])
|
345 |
|
346 |
if item is not None: |
347 |
iconPath = os.path.join(AppDocData.instance().getCurrentProject().getSvgFilePath(), child.type , child.name + ".svg")
|
348 |
item.setIcon(0, QIcon(iconPath))
|
349 |
item.setData(0, self.TREE_DATA_ROLE, child) |
350 |
brush = QBrush() |
351 |
brush.setColor(QColor(child.getColor())) |
352 |
item.setForeground(0, brush)
|
353 |
item.setFont(0, item.font(0)) |
354 |
child.treeItem = item |
355 |
if isEquipmentType:
|
356 |
self.EqpTreeItem.addChild(item)
|
357 |
self.EqpTreeItem.sortChildren(0, Qt.AscendingOrder) # sort childrens |
358 |
else:
|
359 |
self.SymbolsTreeItem.addChild(item)
|
360 |
self.SymbolsTreeItem.sortChildren(0, Qt.AscendingOrder) # sort childrens |
361 |
elif type(child) is QEngineeringLineNoTextItem: |
362 |
for index in range(self.LineNoTreeItem.childCount()): |
363 |
if child.text() == self.LineNoTreeItem.child(0).text(index) and self.LineNoTreeItem.child(0).childCount() is 0: |
364 |
self.LineNoTreeItem.takeChild(index)
|
365 |
break
|
366 |
item = CustomTreeWidgetItem([child.text()]) |
367 |
item.setFlags(item.flags() | Qt.ItemIsUserCheckable) |
368 |
item.setData(0, self.TREE_DATA_ROLE, child) |
369 |
item.setCheckState(0, Qt.Checked if child.isVisible() else Qt.Unchecked) |
370 |
brush = QBrush() |
371 |
brush.setColor(QColor(child.getColor())) |
372 |
item.setForeground(0, brush)
|
373 |
item.setFont(0, item.font(0)) |
374 |
child.treeItem = item |
375 |
self.LineNoTreeItem.addChild(item)
|
376 |
elif type(child) is QEngineeringTrimLineNoTextItem: |
377 |
item = CustomTreeWidgetItem(['Unknown Line'])
|
378 |
item.setFlags(item.flags() | Qt.ItemIsUserCheckable) |
379 |
item.setData(0, self.TREE_DATA_ROLE, child) |
380 |
item.setCheckState(0, Qt.Checked if child.isVisible() else Qt.Unchecked) |
381 |
brush = QBrush() |
382 |
brush.setColor(QColor(child.getColor())) |
383 |
item.setForeground(0, brush)
|
384 |
item.setFont(0, item.font(0)) |
385 |
child.treeItem = item |
386 |
self.LineNoTreeItem.addChild(item)
|
387 |
elif (type(child) is QEngineeringNoteItem): |
388 |
founds = None
|
389 |
for i in range(self.NotesTreeItem.childCount()): |
390 |
item = self.NotesTreeItem.child(i)
|
391 |
notes = item.data(0, self.TREE_DATA_ROLE) |
392 |
founds = [note for note in notes if note.text() == child.text()] |
393 |
if founds: break |
394 |
|
395 |
if founds:
|
396 |
item.setData(0, self.TREE_DATA_ROLE, founds + [child, ]) |
397 |
else:
|
398 |
item = QTreeWidgetItem([child.text()]) |
399 |
item.setData(0, self.TREE_DATA_ROLE, [child, ]) |
400 |
if parent is not None: |
401 |
parent.addChild(item) |
402 |
parent.sortChildren(0, Qt.AscendingOrder) # sort childrens |
403 |
child.treeItem = item |
404 |
item.setText(0, '{}({})'.format(child.text(), len(item.data(0, self.TREE_DATA_ROLE)))) |
405 |
|
406 |
# show note icon if note icon is setted
|
407 |
if child.symbol:
|
408 |
iconPath = os.path.join(appDocData.getCurrentProject().getSvgFilePath(), 'Notes' , child.symbol.name + '.svg') |
409 |
item.setIcon(0, QIcon(iconPath))
|
410 |
elif (type(child) is QEngineeringUnknownItem): |
411 |
item = QTreeWidgetItem(['Unknown'])
|
412 |
item.setData(0, self.TREE_DATA_ROLE, child) |
413 |
child.treeItem = item |
414 |
self.UnknownTreeItem.addChild(item)
|
415 |
if child.lineIndicator == 'Match': |
416 |
item.setHidden(True)
|
417 |
elif issubclass(type(child), SymbolSvgItem): # change item's parent |
418 |
foundItems = self.findItems(child.name, Qt.MatchExactly|Qt.MatchRecursive, 0) |
419 |
if foundItems is not None: |
420 |
for item in foundItems: |
421 |
data = item.data(0, self.TREE_DATA_ROLE) |
422 |
if data is not None and (data == child) and (parent is not item.parent()): |
423 |
parentData = parent.data(0, self.TREE_DATA_ROLE) |
424 |
if parentData is not None and issubclass(type(parentData), QEngineeringLineNoTextItem): |
425 |
for index in range(len(parentData.runs)): |
426 |
runGroup = parentData.runs[index] |
427 |
if data in runGroup.items: |
428 |
item.parent().removeChild(item) # remove item from original parent
|
429 |
runItem = self.addPipeRunTreeItemIfNeed(parent, runGroup) #parent.child(index) |
430 |
brush = QBrush() |
431 |
brush.setColor(QColor(item.data(0, self.TREE_DATA_ROLE).getColor())) |
432 |
item.setForeground(0, brush)
|
433 |
#item.data(0, self.TREE_DATA_ROLE).setColor(brush.color().name())
|
434 |
item.setFont(0, item.font(0)) |
435 |
runItem.addChild(item) |
436 |
break
|
437 |
else:
|
438 |
pass
|
439 |
elif parent is not None: |
440 |
item.parent().removeChild(item) # remove item from original parent
|
441 |
parent.addChild(item) |
442 |
break
|
443 |
elif type(child) is QEngineeringLineNoTextItem: |
444 |
foundItems = self.findItems(child.text(), Qt.MatchExactly|Qt.MatchRecursive, 0) |
445 |
if foundItems is not None: |
446 |
for item in foundItems: |
447 |
data = item.data(0, self.TREE_DATA_ROLE) |
448 |
if data is not None and (data == child): |
449 |
connectedItems = data.getConnectedItems() |
450 |
color = data.getColor() |
451 |
for connectedItem in connectedItems: |
452 |
connectedItem.setColor(color) |
453 |
return item
|
454 |
except Exception as ex: |
455 |
from App import App |
456 |
from AppDocData import MessageType |
457 |
|
458 |
message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno) |
459 |
App.mainWnd().addMessage.emit(MessageType.Error, message) |
460 |
|
461 |
return item
|
462 |
|
463 |
'''
|
464 |
@brief Scene Changed Listener
|
465 |
@author Jeongwoo
|
466 |
@date 18.04.11
|
467 |
@history Jeongwoo 2018.04.25 Add QEngineeringNoteItem to list for loop / NOT QEngineeringTextItem
|
468 |
Jeongwoo 2018.04.26 Change changedSceneItems conditions in loop (QEngineeringTextItem → QEngineeringLineNoTextItem)
|
469 |
humkyung 2018.07.20 put items which's owner is None before item which's owner is not None
|
470 |
'''
|
471 |
lastSceneItems = None
|
472 |
def sceneChanged(self, sceneItems): |
473 |
try:
|
474 |
changedSceneItems = [item for item in sceneItems if ((issubclass(type(item), SymbolSvgItem) and type(item) is not QEngineeringErrorItem) or (type(item) is QEngineeringNoteItem) or (type(item) is QEngineeringLineNoTextItem) |
475 |
or (type(item) is QEngineeringUnknownItem)) and (not hasattr(item, 'treeItem') or item.treeItem is None)] # Sublist includes SymbolSvgItem |
476 |
first = [item for item in changedSceneItems if item.owner is None] |
477 |
second = [item for item in changedSceneItems if item.owner is not None] |
478 |
if first + second: self.initResultTreeWidget(first + second) |
479 |
finally:
|
480 |
self.update_item_count()
|
481 |
|
482 |
'''
|
483 |
@brief Initialize TreeWidget
|
484 |
Tree Item Clear and Add Item
|
485 |
@author Jeongwoo
|
486 |
@date 2018.04.11
|
487 |
@history 2018.04.12 Jeongwoo Declare self.TREE_DATA_ROLE for QTreeWidgetItem.data(column, role)
|
488 |
@history 2018.04.17 humkyung NOT remove child of root
|
489 |
2018.04.25 Jeongwoo Add QEngineeringNoteItem Child
|
490 |
2018.04.26 Jeongwoo Change method to insert child
|
491 |
'''
|
492 |
def initResultTreeWidget(self, items): |
493 |
for item in items: |
494 |
if (type(item) is QEngineeringNoteItem): |
495 |
self.addTreeItem(self.NotesTreeItem, item) |
496 |
else:
|
497 |
self.addTreeItem(self.root, item) |
498 |
|
499 |
if self.NotesTreeItem is not None: |
500 |
self.NotesTreeItem.sortChildren(0, Qt.AscendingOrder) |
501 |
|
502 |
self.expandAll()
|
503 |
|
504 |
def itemCheckBoxToggled(self, item, checkState): |
505 |
"""
|
506 |
set visible of invisible of item
|
507 |
"""
|
508 |
try:
|
509 |
itemData = item.data(0, self.TREE_DATA_ROLE) |
510 |
if (type(itemData) is QEngineeringLineNoTextItem) or (type(itemData) is QEngineeringTrimLineNoTextItem): |
511 |
itemData.setVisible(checkState == Qt.CheckState.Checked) |
512 |
except Exception as ex: |
513 |
from App import App |
514 |
from AppDocData import MessageType |
515 |
|
516 |
message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno) |
517 |
App.mainWnd().addMessage.emit(MessageType.Error, message) |
518 |
finally:
|
519 |
pass
|
520 |
|
521 |
'''
|
522 |
@brief TreeWidget Item click listener
|
523 |
@author Jeongwoo
|
524 |
@date 18.04.11
|
525 |
@history 18.04.12 Jeongwoo Declare self.TREE_DATA_ROLE for QTreeWidgetItem.data(column, role)
|
526 |
18.04.13 Jeongwoo Signal 'singleClicked' emit SymbolSvgItem
|
527 |
CenterOn() with Symbol's center
|
528 |
18.04.25 Jeongwoo Add QEngineeringNoteItem Click event
|
529 |
18.04.26 Jeongwoo QEngineeringTextItem → QEngineeringLineNoTextItem
|
530 |
18.04.27 Jeongwoo Find NOTE Contents when NOTE No. Clicked
|
531 |
Move singClicked to if-statement type(itemData) is SymbolSvgItem:
|
532 |
18.05.10 Jeongwoo Add lineNoSingleClicked emit
|
533 |
humkyung 2018.07.07 emit singleClicked signal when user click drawing name
|
534 |
'''
|
535 |
def itemClickEvent(self, item, columnNo, isSvgClick = False): |
536 |
from Drawing import Drawing |
537 |
from EngineeringRunItem import QEngineeringRunItem |
538 |
from HighlightCommand import HighlightCommand |
539 |
|
540 |
hilightColor = QColor(255, 0, 0, 127) |
541 |
|
542 |
itemData = item.data(0, self.TREE_DATA_ROLE) |
543 |
|
544 |
if itemData is not None: ## Not PID Name |
545 |
if issubclass(type(itemData), SymbolSvgItem): |
546 |
HighlightCommand(self.imageViewer).execute(itemData)
|
547 |
## Draw rectangle on selected symbol
|
548 |
#rect = itemData.sceneBoundingRect()
|
549 |
#if isSvgClick == False:
|
550 |
# self.imageViewer.centerOn(rect.center())
|
551 |
## Send new event to imageViewer's zoomImage Method
|
552 |
#self.imageViewer.zoomImage(True, QMouseEvent(QEvent.MouseButtonPress, self.imageViewer.mapFromScene(QPointF(rect.left(), rect.top())), Qt.LeftButton, Qt.LeftButton, Qt.NoModifier), 3)
|
553 |
|
554 |
self.singleClicked.emit(itemData)
|
555 |
elif (type(itemData) is QEngineeringLineNoTextItem) or (type(itemData) is QEngineeringRunItem): |
556 |
HighlightCommand(self.imageViewer).execute(itemData)
|
557 |
self.lineNoSingleClicked.emit(itemData)
|
558 |
for child in range(item.childCount()): |
559 |
item.child(child).setSelected(True)
|
560 |
elif type(itemData) is list and type(itemData[0]) is QEngineeringNoteItem: |
561 |
HighlightCommand(self.imageViewer).execute(itemData)
|
562 |
'''
|
563 |
rect = itemData.sceneBoundingRect()
|
564 |
if isSvgClick == False:
|
565 |
self.imageViewer.centerOn(rect.center())
|
566 |
## Send new event to imageViewer's zoomImage Method
|
567 |
self.imageViewer.zoomImage(True, QMouseEvent(QEvent.MouseButtonPress, self.imageViewer.mapFromScene(QPointF(rect.left(), rect.top())), Qt.LeftButton, Qt.LeftButton, Qt.NoModifier), 3)
|
568 |
'''
|
569 |
noteContentsList = itemData[0].findNoteContents(itemData[0].text()) |
570 |
|
571 |
self.noteNoSingleClicked.emit(itemData[0].text(), noteContentsList) |
572 |
elif type(itemData) is QEngineeringUnknownItem: |
573 |
HighlightCommand(self.imageViewer).execute(itemData)
|
574 |
elif type(itemData) is Drawing: |
575 |
self.drawingClicked.emit(itemData)
|
576 |
|
577 |
'''
|
578 |
if issubclass(type(itemData), QGraphicsItem):
|
579 |
itemData.setSelected(True)
|
580 |
itemData.update()
|
581 |
'''
|
582 |
|
583 |
'''
|
584 |
@brief find item which has data is given item
|
585 |
@author humkyung
|
586 |
@date 2018.04.23
|
587 |
@history 2018.06.18 Jeongwoo Add if-statement for QEngineeringUnknownItem
|
588 |
@history 2018.11.22 euisung add delete note
|
589 |
'''
|
590 |
def findItemByData(self, item): |
591 |
if issubclass(type(item), SymbolSvgItem): |
592 |
foundItems = self.findItems(item.name, Qt.MatchExactly|Qt.MatchRecursive, 0) |
593 |
for foundItem in foundItems: |
594 |
data = foundItem.data(0, self.TREE_DATA_ROLE) |
595 |
if data is not None and data is item: |
596 |
return foundItem
|
597 |
elif type(item) is QEngineeringLineNoTextItem: |
598 |
foundItems = self.findItems(item.text() , Qt.MatchExactly|Qt.MatchRecursive, 0) |
599 |
for foundItem in foundItems: |
600 |
data = foundItem.data(0, self.TREE_DATA_ROLE) |
601 |
if data is not None and data is item: |
602 |
return foundItem
|
603 |
elif type(item) is QEngineeringUnknownItem: |
604 |
foundItems = self.findItems('Unknown' , Qt.MatchExactly|Qt.MatchRecursive, 0) |
605 |
for foundItem in foundItems: |
606 |
data = foundItem.data(0, self.TREE_DATA_ROLE) |
607 |
if data is not None and data is item: |
608 |
return foundItem
|
609 |
elif type(item) is QEngineeringNoteItem: |
610 |
foundItems = self.findItems(item.text() , Qt.MatchExactly|Qt.MatchRecursive, 0) |
611 |
for foundItem in foundItems: |
612 |
data = foundItem.data(0, self.TREE_DATA_ROLE) |
613 |
if data is not None and data is item: |
614 |
return foundItem
|
615 |
|
616 |
return None |
617 |
|
618 |
'''
|
619 |
@brief Init LineNoItems child
|
620 |
@author kyouho
|
621 |
@date 2018.09.17
|
622 |
'''
|
623 |
def InitLineNoItems(self): |
624 |
try:
|
625 |
removeLineItem = [] |
626 |
for lineIndex in range(self.LineNoTreeItem.childCount()): |
627 |
## LineNoItem, TrimLine Item
|
628 |
lineItem = self.LineNoTreeItem.child(lineIndex)
|
629 |
|
630 |
removeRunItem = [] |
631 |
for runIndex in range(lineItem.childCount()): |
632 |
## RUN Item
|
633 |
runItem = lineItem.child(runIndex) |
634 |
for symbolIndex in range(runItem.childCount()): |
635 |
symbolItem = runItem.child(0)
|
636 |
symbol = symbolItem.data(0, self.TREE_DATA_ROLE) |
637 |
|
638 |
symbolItem.parent().removeChild(symbolItem) |
639 |
|
640 |
if AppDocData.instance().isEquipmentType(symbol.type):
|
641 |
self.EqpTreeItem.addChild(symbolItem)
|
642 |
else:
|
643 |
self.SymbolsTreeItem.addChild(symbolItem)
|
644 |
|
645 |
## 지울 Item 모음
|
646 |
removeRunItem.append(runItem) |
647 |
## Run Item들 삭제
|
648 |
for removeItem in removeRunItem: |
649 |
lineItem.removeChild(removeItem) |
650 |
## 지울 Trim Line 모음
|
651 |
if lineItem.text(0) == 'Trim Line': |
652 |
removeLineItem.append(lineItem) |
653 |
## Trim Line들 삭제
|
654 |
for removeItem in removeLineItem: |
655 |
self.LineNoTreeItem.removeChild(removeItem)
|
656 |
|
657 |
except Exception as ex: |
658 |
from App import App |
659 |
from AppDocData import MessageType |
660 |
|
661 |
message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno) |
662 |
App.mainWnd().addMessage.emit(MessageType.Error, message) |
663 |
|
664 |
'''
|
665 |
@brief Find QTreeWidgetItem by SymbolSvgItem object
|
666 |
@author Jeongwoo
|
667 |
@date 18.04.11
|
668 |
@history 18.04.12 Jeongwoo Change Flags (Qt.MatchExactly → Qt.MatchExactly|Qt.MatchRecursive)
|
669 |
Declare self.TREE_DATA_ROLE for QTreeWidgetItem.data(column, role)
|
670 |
@history 2018.11.22 euisung add note, unknown
|
671 |
'''
|
672 |
@pyqtSlot(SymbolSvgItem)
|
673 |
def findItem(self, item): |
674 |
if issubclass(type(item), SymbolSvgItem): |
675 |
foundItems = self.findItems(item.name, Qt.MatchExactly|Qt.MatchRecursive, 0) |
676 |
if foundItems is not None: |
677 |
for fItem in foundItems: |
678 |
data = fItem.data(0, self.TREE_DATA_ROLE) |
679 |
if data is not None and data == item: |
680 |
self.setCurrentItem(fItem)
|
681 |
return
|
682 |
elif type(item) is QEngineeringLineNoTextItem: |
683 |
foundItems = self.findItems(item.text(), Qt.MatchExactly|Qt.MatchRecursive, 0) |
684 |
if foundItems is not None: |
685 |
for fItem in foundItems: |
686 |
data = fItem.data(0, self.TREE_DATA_ROLE) |
687 |
if data is not None and data == item: |
688 |
self.setCurrentItem(fItem)
|
689 |
return
|
690 |
elif type(item) is QEngineeringNoteItem: |
691 |
founds = None
|
692 |
for i in range(self.NotesTreeItem.childCount()): |
693 |
child = self.NotesTreeItem.child(i)
|
694 |
notes = child.data(0, self.TREE_DATA_ROLE) |
695 |
founds = [note for note in notes if note.text() == item.text()] |
696 |
if founds:
|
697 |
self.setCurrentItem(child)
|
698 |
return
|
699 |
elif type(item) is QEngineeringUnknownItem: |
700 |
foundItems = self.findItems('Unknown', Qt.MatchExactly|Qt.MatchRecursive, 0) |
701 |
if foundItems is not None: |
702 |
for fItem in foundItems: |
703 |
data = fItem.data(0, self.TREE_DATA_ROLE) |
704 |
if data is not None and data == item: |
705 |
self.setCurrentItem(fItem)
|
706 |
return
|
707 |
|
708 |
## Not found
|
709 |
msg = QMessageBox() |
710 |
msg.setIcon(QMessageBox.Warning) |
711 |
msg.setText('선택하신 심볼의 데이터를 찾을 수 없습니다.')
|
712 |
|
713 |
'''
|
714 |
@brief remove given item
|
715 |
@author humkyung
|
716 |
@date 2018.04.23
|
717 |
@history Jeongwoo 2018.05.25 Remove Highlighting when item removed
|
718 |
humkyung 2018.07.22 removed code to Remove highlighting
|
719 |
'''
|
720 |
@pyqtSlot(QGraphicsItem)
|
721 |
def itemRemoved(self, item): |
722 |
try:
|
723 |
foundItem = self.findItemByData(item)
|
724 |
if foundItem is not None: |
725 |
foundItem.parent().removeChild(foundItem) |
726 |
finally:
|
727 |
self.update_item_count()
|
728 |
|
729 |
def update_item_count(self): |
730 |
"""
|
731 |
update items count
|
732 |
"""
|
733 |
if hasattr(self, 'LineNoTreeItem'): |
734 |
self.LineNoTreeItem.setText(0, 'LINE NO({})'.format(self.LineNoTreeItem.childCount())) |
735 |
if hasattr(self, 'EqpTreeItem'): |
736 |
self.EqpTreeItem.setText(0, 'EQUIPMENTS({})'.format(self.EqpTreeItem.childCount())) |
737 |
if hasattr(self, 'SymbolsTreeItem'): |
738 |
self.SymbolsTreeItem.setText(0, 'SYMBOLS({})'.format(self.SymbolsTreeItem.childCount())) |
739 |
if hasattr(self, 'NotesTreeItem'): |
740 |
self.NotesTreeItem.setText(0, 'NOTES({})'.format(self.NotesTreeItem.childCount())) |
741 |
if hasattr(self, 'UnknownTreeItem'): |
742 |
self.UnknownTreeItem.setText(0, 'UNKNOWN({})'.format(self.UnknownTreeItem.childCount())) |