프로젝트

일반

사용자정보

통계
| 개정판:

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)