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