hytos / DTI_PID / DTI_PID / StreamlineDialog.py @ 08433949
이력 | 보기 | 이력해설 | 다운로드 (11.6 KB)
1 |
# coding: utf-8
|
---|---|
2 |
""" This is Streamline dialog module """
|
3 | |
4 |
import os |
5 |
import sys |
6 |
from functools import partial |
7 |
from PyQt5.QtCore import * |
8 |
from PyQt5.QtGui import * |
9 |
from PyQt5.QtWidgets import * |
10 | |
11 |
from AppDocData import AppDocData, MessageType |
12 | |
13 |
from UI.Streamline_UI import Ui_StreamlineDialog |
14 | |
15 | |
16 |
class FromToModel(QStandardItemModel): |
17 |
def __init__(self, parent=None, *args): |
18 |
QStandardItemModel.__init__(self, parent, *args)
|
19 | |
20 |
self._need_to_pick_backcolor = QColor(255, 0, 255) |
21 |
self._target_drawing_backcolor = QColor(0, 255, 0) |
22 |
self._new_data_backcolor = Qt.yellow
|
23 | |
24 |
def data(self, index, role): |
25 |
if not index.isValid(): |
26 |
return None |
27 | |
28 |
if role in [Qt.BackgroundRole]: |
29 |
item = super(FromToModel, self).item(index.row(), index.column()) |
30 | |
31 |
if index.column() in [1, 2]: |
32 |
uid = item.data(Qt.UserRole) |
33 |
if not uid: |
34 |
return self._need_to_pick_backcolor |
35 |
elif hasattr(item, '_new') and item._new: |
36 |
return self._new_data_backcolor |
37 |
elif index.column() in [0]: |
38 |
app_doc_data = AppDocData.instance() |
39 |
uid = item.data(Qt.UserRole) |
40 |
if uid and uid == app_doc_data.activeDrawing.UID: |
41 |
return self._target_drawing_backcolor |
42 | |
43 |
return super(FromToModel, self).data(index, role) |
44 | |
45 | |
46 |
class FromToWidget(QWidget): |
47 |
def __init__(self, parent, column: int, from_to: str = ''): |
48 |
QWidget.__init__(self, parent)
|
49 |
self._column = column
|
50 | |
51 |
layout = QHBoxLayout() |
52 |
layout.setAlignment(Qt.AlignRight) |
53 |
layout.setContentsMargins(0, 0, 0, 0) |
54 |
pick = QToolButton(self)
|
55 |
pick.setIcon(QIcon(':/newPrefix/OK.svg'))
|
56 |
pick.setMaximumHeight(32)
|
57 |
pick.setMaximumWidth(32)
|
58 |
pick.clicked.connect(partial(parent.parent().parent().parent().on_select_comp, self._column))
|
59 |
layout.addWidget(pick) |
60 |
self.setLayout(layout)
|
61 | |
62 | |
63 |
class QStreamlineDialog(QDialog): |
64 |
""" This Streamline dialog class """
|
65 | |
66 |
def __init__(self, parent): |
67 |
QDialog.__init__(self, parent)
|
68 |
self._from_to_widgets = {}
|
69 |
self._from_to_models = {}
|
70 | |
71 |
self.ui = Ui_StreamlineDialog()
|
72 |
self.ui.setupUi(self) |
73 |
self.ui.splitterHorizontal.setSizes([200, 700]) |
74 | |
75 |
self.fill_hmb_data()
|
76 |
self.ui.tableViewStreamNo.selectionModel().selectionChanged.connect(self.on_selection_changed) |
77 | |
78 |
self.ui.toolButtonAddFromTo.clicked.connect(self.on_add_new_from_to) |
79 |
self.ui.toolButtonDelFromTo.clicked.connect(self.on_del_from_to) |
80 |
self.ui.pushButtonSaveFromTo.clicked.connect(self.on_save_from_to) |
81 | |
82 |
#self.ui.buttonBox.button(QDialogButtonBox.Ok).setIcon(QIcon(':/newPrefix/OK.svg'))
|
83 |
self.ui.buttonBox.button(QDialogButtonBox.Close).setIcon(QIcon(':/newPrefix/Remove.svg')) |
84 | |
85 |
self.ui.tableViewFromTo.clicked.connect(self.listCellClicked) |
86 | |
87 |
def listCellClicked(self, index): |
88 |
from HighlightCommand import HighlightCommand |
89 | |
90 |
if index.isValid():
|
91 |
col = index.column() |
92 |
row = index.row() |
93 |
else:
|
94 |
return
|
95 | |
96 |
if not (col == 1 or col == 2): |
97 |
return
|
98 |
|
99 |
self.ui.tableViewFromTo.clearSelection()
|
100 |
HighlightCommand(self.parent().graphicsView).execute(index.model().item(row, col).text())
|
101 | |
102 |
def fill_hmb_data(self): |
103 |
"""load hmb data and fill table view"""
|
104 |
import uuid |
105 | |
106 |
hmbs = AppDocData.get_hmb_data(None)
|
107 |
if not hmbs: |
108 |
return
|
109 | |
110 |
model = QStandardItemModel() |
111 |
header = ['UID', 'Stream No'] |
112 | |
113 |
for hmb in hmbs: |
114 |
UID = hmb.uid |
115 |
STREAM_NO = hmb.stream_no |
116 |
items = [QStandardItem(UID), QStandardItem(STREAM_NO)] |
117 | |
118 |
for data in sorted(hmb.data, key=lambda param: param.index): |
119 |
if hmbs.index(hmb) == 0: |
120 |
header.append(f"{data.name}\n({data.unit})" if data.unit else f"{data.name}") |
121 |
items.append(QStandardItem(data.value)) |
122 |
model.appendRow(items) |
123 | |
124 |
model.setHorizontalHeaderLabels(header) |
125 | |
126 |
self.ui.tableViewStreamNo.setModel(model)
|
127 |
self.ui.tableViewStreamNo.resizeColumnsToContents()
|
128 |
self.ui.tableViewStreamNo.setEditTriggers(QAbstractItemView.NoEditTriggers)
|
129 |
for col in range(self.ui.tableViewStreamNo.model().columnCount()): |
130 |
self.ui.tableViewStreamNo.setColumnHidden(col, col != 1) # hide all columns except index is 1 |
131 | |
132 |
def on_selection_changed(self, selection): |
133 |
"""show stream line from, to related to selected hmb"""
|
134 | |
135 |
if selection.indexes():
|
136 |
row = selection.indexes()[0].row()
|
137 |
stream_no = self.ui.tableViewStreamNo.model().item(row, 1).text() |
138 | |
139 |
if stream_no not in self._from_to_models: |
140 |
model = FromToModel() |
141 |
self._from_to_models[stream_no] = model
|
142 |
self.ui.tableViewFromTo.setModel(model)
|
143 | |
144 |
app_doc_data = AppDocData.instance() |
145 |
rows = app_doc_data.get_stream_from_to(stream_no=stream_no) |
146 |
if rows:
|
147 |
for row_ in rows: |
148 |
from_ = row_['From_Component_UID']
|
149 |
from_item = QStandardItem(from_) |
150 |
from_item.setData(row_['From_Component_UID'], Qt.UserRole)
|
151 | |
152 |
to_ = row_['To_Component_UID']
|
153 |
to_item = QStandardItem(to_) |
154 |
to_item.setData(row_['To_Component_UID'], Qt.UserRole)
|
155 | |
156 |
drawing = row_['Name']
|
157 |
drawing_item = QStandardItem(drawing) |
158 |
drawing_item.setData(row_['Drawing_UID'], Qt.UserRole)
|
159 | |
160 |
items = [drawing_item, from_item, to_item] |
161 |
model.appendRow(items) |
162 | |
163 |
model.setHorizontalHeaderLabels(['Drawing No', 'From', 'To']) |
164 |
else:
|
165 |
model = self._from_to_models[stream_no]
|
166 | |
167 |
self.ui.tableViewFromTo.setModel(model)
|
168 |
self.ui.tableViewFromTo.resizeColumnsToContents()
|
169 | |
170 |
self._from_to_widgets.clear()
|
171 |
for row_ in range(self.ui.tableViewFromTo.model().rowCount()): |
172 |
i = self.ui.tableViewFromTo.model().index(row_, 1) |
173 |
data = self.ui.tableViewFromTo.model().data(i, Qt.DisplayRole)
|
174 |
from_button = FromToWidget(self.ui.tableViewFromTo, 1, data) |
175 |
i = self.ui.tableViewFromTo.model().index(row_, 1) |
176 |
self.ui.tableViewFromTo.setIndexWidget(i, from_button)
|
177 |
self._from_to_widgets[from_button] = (row_, 1) |
178 | |
179 |
i = self.ui.tableViewFromTo.model().index(row_, 2) |
180 |
data = self.ui.tableViewFromTo.model().data(i, Qt.DisplayRole)
|
181 |
to_button = FromToWidget(self.ui.tableViewFromTo, 2, data) |
182 |
self.ui.tableViewFromTo.setIndexWidget(i, to_button)
|
183 |
self._from_to_widgets[to_button] = (row_, 2) |
184 | |
185 |
"""Properties"""
|
186 |
if not self.ui.tableViewProperties.model(): |
187 |
model_property = QStandardItemModel() |
188 |
self.ui.tableViewProperties.setModel(model_property)
|
189 | |
190 |
model_property = self.ui.tableViewProperties.model()
|
191 |
model_property.clear() |
192 | |
193 |
for col in range(self.ui.tableViewStreamNo.model().columnCount()): |
194 |
value = self.ui.tableViewStreamNo.model().item(row, col).text()
|
195 |
property_ = self.ui.tableViewStreamNo.model().headerData(col, Qt.Horizontal)
|
196 |
items = [QStandardItem(property_), QStandardItem(value)] |
197 |
model_property.appendRow(items) |
198 | |
199 |
model_property.setHorizontalHeaderLabels(['Property', 'Value']) |
200 |
self.ui.tableViewProperties.setModel(model_property)
|
201 |
self.ui.tableViewFromTo.horizontalHeader().setResizeMode(QHeaderView.Stretch)
|
202 |
self.ui.tableViewProperties.resizeColumnsToContents()
|
203 |
self.ui.tableViewProperties.setEditTriggers(QAbstractItemView.NoEditTriggers)
|
204 |
self.ui.tableViewProperties.setRowHidden(0, True) # hide all columns except index is 1 |
205 |
self.ui.tableViewProperties.verticalHeader().setVisible(False) |
206 | |
207 |
def on_add_new_from_to(self): |
208 |
"""add a new from/to record"""
|
209 |
if not self.ui.tableViewFromTo.model(): |
210 |
return
|
211 |
rows = self.ui.tableViewFromTo.model().rowCount()
|
212 |
index = self.ui.tableViewFromTo.model().index(rows, 0) |
213 | |
214 |
app_doc_data = AppDocData.instance() |
215 |
drawing_item = QStandardItem(app_doc_data.activeDrawing.name) |
216 |
drawing_item.setData(app_doc_data.activeDrawing.UID, Qt.UserRole) |
217 | |
218 |
self.ui.tableViewFromTo.model().insertRow(rows, [drawing_item, QStandardItem(), QStandardItem()])
|
219 |
self.ui.tableViewFromTo.selectionModel().setCurrentIndex(index, QItemSelectionModel.NoUpdate)
|
220 | |
221 |
from_button = FromToWidget(self.ui.tableViewFromTo, 1) |
222 |
i = self.ui.tableViewFromTo.model().index(rows, 1) |
223 |
self.ui.tableViewFromTo.setIndexWidget(i, from_button)
|
224 |
self._from_to_widgets[from_button] = (i.row(), 1) |
225 | |
226 |
to_button = FromToWidget(self.ui.tableViewFromTo, 2) |
227 |
i = self.ui.tableViewFromTo.model().index(rows, 2) |
228 |
self.ui.tableViewFromTo.setIndexWidget(i, to_button)
|
229 |
self._from_to_widgets[to_button] = (i.row(), 2) |
230 | |
231 |
def on_del_from_to(self): |
232 |
"""delete selected from/to"""
|
233 |
current = self.ui.tableViewFromTo.selectionModel().currentIndex()
|
234 |
self.ui.tableViewFromTo.model().removeRow(current.row())
|
235 | |
236 |
def on_select_comp(self, column: int): |
237 |
"""select from or to component"""
|
238 |
from App import App |
239 |
from Commands.SelectCompCommand import SelectCompCommand |
240 | |
241 |
def on_success_select_comp(selected): |
242 |
current = self.ui.tableViewFromTo.selectionModel().currentIndex()
|
243 |
row = current.row() |
244 |
column = current.column() |
245 |
item = self.ui.tableViewFromTo.model().item(row, column)
|
246 |
item.setText(str(selected))
|
247 |
item.setData(str(selected.uid), Qt.UserRole)
|
248 |
item._new = True
|
249 |
App.mainWnd().graphicsView.useDefaultCommand() |
250 | |
251 |
# save column index
|
252 |
if self.sender().parent() in self._from_to_widgets: |
253 |
row, column = self._from_to_widgets[self.sender().parent()] |
254 |
self.ui.tableViewFromTo.setCurrentIndex(self.ui.tableViewFromTo.model().index(row, column)) |
255 | |
256 |
app_doc_data = AppDocData.instance() |
257 |
drawing_item = self.ui.tableViewFromTo.model().item(row, 0) |
258 |
if drawing_item.data(Qt.UserRole) != app_doc_data.activeDrawing.UID:
|
259 |
return
|
260 |
# up to here
|
261 | |
262 |
cmd = SelectCompCommand(App.mainWnd().graphicsView) |
263 |
cmd.onSuccess.connect(on_success_select_comp) |
264 |
App.mainWnd().graphicsView.command = cmd |
265 | |
266 |
def on_save_from_to(self): |
267 |
"""save current from/to data"""
|
268 |
row = self.ui.tableViewStreamNo.selectionModel().currentIndex().row()
|
269 |
stream_no = self.ui.tableViewStreamNo.model().item(row, 1).text() |
270 | |
271 |
from_to_data = [] |
272 | |
273 |
model = self.ui.tableViewFromTo.model()
|
274 |
for row in range(model.rowCount()): |
275 |
drawing_ = model.item(row, 0)
|
276 |
drawing_uid = drawing_.data(Qt.UserRole) |
277 |
from_ = model.item(row, 1)
|
278 |
from_uid = from_.data(Qt.UserRole) |
279 |
to_ = model.item(row, 2)
|
280 |
to_uid = to_.data(Qt.UserRole) |
281 | |
282 |
from_to_data.append((drawing_uid, from_uid, to_uid, stream_no)) |
283 | |
284 |
AppDocData.save_stream_line_data([stream_no, from_to_data]) |
285 | |
286 |
def accept(self): |
287 |
QDialog.accept(self)
|
288 | |
289 |
def reject(self): |
290 |
QDialog.reject(self)
|