개정판 c693d70b
Feature: 도면 검색 기능 추가
Change-Id: I891a1f7396090407b5d8370a5119a442eb6647e9
DTI_PID/DTI_PID/DrawingTreeWidget.py | ||
---|---|---|
1 |
# coding: utf-8 |
|
2 |
""" This is Drawing Tree Widget module """ |
|
3 |
|
|
4 |
try: |
|
5 |
from PyQt5.QtCore import * |
|
6 |
from PyQt5.QtGui import * |
|
7 |
from PyQt5.QtWidgets import * |
|
8 |
except ImportError: |
|
9 |
try: |
|
10 |
from PyQt4.QtCore import * |
|
11 |
from PyQt4.QtGui import * |
|
12 |
except ImportError: |
|
13 |
raise ImportError("DrawingTreeWidget: Requires PyQt5 or PyQt4.") |
|
14 |
from AppDocData import * |
|
15 |
|
|
16 |
class SearchProxyModel(QSortFilterProxyModel): |
|
17 |
def setFilterRegExp(self, pattern): |
|
18 |
if isinstance(pattern, str): |
|
19 |
pattern = QRegExp( pattern, Qt.CaseInsensitive, QRegExp.FixedString) |
|
20 |
super(SearchProxyModel, self).setFilterRegExp(pattern) |
|
21 |
|
|
22 |
def _accept_index(self, idx): |
|
23 |
if idx.isValid(): |
|
24 |
text = idx.data(Qt.DisplayRole) |
|
25 |
if self.filterRegExp().indexIn(text) >= 0: |
|
26 |
return True |
|
27 |
for row in range(idx.model().rowCount(idx)): |
|
28 |
if self._accept_index(idx.model().index(row, 0, idx)): |
|
29 |
return True |
|
30 |
return False |
|
31 |
|
|
32 |
def filterAcceptsRow(self, source_row, source_parent): |
|
33 |
idx = self.sourceModel().index(source_row, 0, source_parent) |
|
34 |
return self._accept_index(idx) |
|
35 |
|
|
36 |
class QDrawingTreeWidget(QTreeWidget): |
|
37 |
def __init__(self): |
|
38 |
QTreeWidget.__init__(self) |
|
39 |
|
|
40 |
def load_drawing_list(self, reverse=False): |
|
41 |
"""load p&id drawing list""" |
|
42 |
from Drawing import Drawing |
|
43 |
|
|
44 |
app_doc_data = AppDocData.instance() |
|
45 |
drawings = app_doc_data.getDrawings() |
|
46 |
new_drawings = [] |
|
47 |
|
|
48 |
self.clear() |
|
49 |
self.root = QTreeWidgetItem(self, [self.tr('P&ID Drawings'), '']) |
|
50 |
self.root.setFlags(self.root.flags() | Qt.ItemIsTristate | Qt.ItemIsUserCheckable) |
|
51 |
self.root.setCheckState(0, Qt.Unchecked) |
|
52 |
files = app_doc_data.getDrawingFileList() |
|
53 |
|
|
54 |
count = 0 |
|
55 |
for file in files if not reverse else reversed(files): |
|
56 |
x = [drawing for drawing in drawings if drawing.name == file] |
|
57 |
if not x or not x[0].UID: |
|
58 |
drawing = Drawing(None, file, None) |
|
59 |
new_drawings.append(drawing) |
|
60 |
else: |
|
61 |
drawing = x[0] |
|
62 |
|
|
63 |
item = QTreeWidgetItem(self.root, [file, drawing.datetime]) |
|
64 |
item.setIcon(0, QIcon(':newPrefix/image.png')) |
|
65 |
item.setFlags(item.flags() | Qt.ItemIsUserCheckable) |
|
66 |
item.setCheckState(0, Qt.Unchecked) |
|
67 |
item.setData(Qt.UserRole, 0, drawing) |
|
68 |
|
|
69 |
count += 1 |
|
70 |
|
|
71 |
self.root.setText(0, self.tr('P&ID Drawings') + f"({self.root.childCount()})") |
|
72 |
self.expandItem(self.root) |
|
73 |
self.resizeColumnToContents(0) |
|
74 |
|
|
75 |
app_doc_data.saveDrawings(new_drawings) |
|
76 |
|
|
77 |
def set_filter_regexp(self, regexp: QRegExp) -> None: |
|
78 |
"""set filter string which is regular expression""" |
|
79 |
|
|
80 |
if isinstance(regexp, QRegExp): |
|
81 |
for i in range(0, self.root.childCount()): |
|
82 |
item = self.root.child(i) |
|
83 |
drawing_name = item.text(0) |
|
84 |
item.setHidden(regexp.indexIn(drawing_name) < 0) |
DTI_PID/DTI_PID/License.py | ||
---|---|---|
70 | 70 |
|
71 | 71 |
msg = QMessageBox() |
72 | 72 |
msg.setIcon(QMessageBox.Critical) |
73 |
msg.setText('Process check fail \nRunnung Process List : ' + '\n' + '\n'.join(names))
|
|
73 |
msg.setText('Process check fail \nRunning Process List : ' + '\n' + '\n'.join(names))
|
|
74 | 74 |
msg.setWindowTitle('License') |
75 | 75 |
msg.setStandardButtons(QMessageBox.Ok) |
76 | 76 |
msg.exec_() |
DTI_PID/DTI_PID/MainWindow.py | ||
---|---|---|
56 | 56 |
from AppDocData import * |
57 | 57 |
import SymbolTreeWidget, SymbolPropertyTableWidget |
58 | 58 |
import SymbolEditorDialog |
59 |
from DrawingTreeWidget import QDrawingTreeWidget |
|
59 | 60 |
import ItemTreeWidget |
60 | 61 |
import ItemPropertyTableWidget |
61 | 62 |
from UserInputAttribute import UserInputAttribute |
... | ... | |
137 | 138 |
self.graphicsView.setScene(self._scene) |
138 | 139 |
self.verticalLayout.addWidget(self.graphicsView) |
139 | 140 |
|
140 |
# Add Custom TreeWidget
|
|
141 |
# Add Symbol TreeWidget
|
|
141 | 142 |
self.symbolTreeWidget = SymbolTreeWidget.QSymbolTreeWidget() |
142 | 143 |
self.symbolTreeWidget.header().hide() |
143 | 144 |
self.verticalLayoutSymbolTree.addWidget(self.symbolTreeWidget) |
... | ... | |
242 | 243 |
self.resizeDocks({self.dockWidget}, {self.dockWidgetObjectExplorer.sizeHint().width()}, Qt.Horizontal) |
243 | 244 |
|
244 | 245 |
# drawing list |
246 |
self.verticalLayoutSymbolTree.addWidget(self.symbolTreeWidget) |
|
247 |
|
|
248 |
self.treeWidgetDrawingList = QDrawingTreeWidget() |
|
245 | 249 |
self.treeWidgetDrawingList.setHeaderHidden(False) |
246 | 250 |
self.treeWidgetDrawingList.header().setStretchLastSection(False) |
247 | 251 |
self.treeWidgetDrawingList.setHeaderLabels([self.tr('Name'), self.tr('DateTime')]) |
... | ... | |
251 | 255 |
self.treeWidgetDrawingList.header().sectionClicked.connect(self.sort_drawing_list) |
252 | 256 |
self.treeWidgetDrawingList.itemDoubleClicked.connect(self.open_selected_drawing) |
253 | 257 |
self.load_drawing_list() |
258 |
self.drawingFilter.textChanged.connect(self.on_drawing_filter_changed) |
|
259 |
self.drawingLayout.addWidget(self.treeWidgetDrawingList) |
|
254 | 260 |
|
255 | 261 |
self.ribbon = AppRibbon() |
256 | 262 |
self.setMenuWidget(self.ribbon) |
... | ... | |
602 | 608 |
else: |
603 | 609 |
self.load_drawing_list(reverse=True) |
604 | 610 |
|
605 |
|
|
606 | 611 |
def load_drawing_list(self, reverse=False): |
607 | 612 |
"""load p&id drawing list""" |
608 |
from Drawing import Drawing |
|
609 |
|
|
610 | 613 |
try: |
611 |
app_doc_data = AppDocData.instance() |
|
612 |
drawings = app_doc_data.getDrawings() |
|
613 |
new_drawings = [] |
|
614 |
|
|
615 |
self.treeWidgetDrawingList.clear() |
|
616 |
self.treeWidgetDrawingList.root = QTreeWidgetItem(self.treeWidgetDrawingList, |
|
617 |
[self.tr('P&ID Drawings'), '']) |
|
618 |
self.treeWidgetDrawingList.root.setFlags( |
|
619 |
self.treeWidgetDrawingList.root.flags() | Qt.ItemIsTristate | Qt.ItemIsUserCheckable) |
|
620 |
self.treeWidgetDrawingList.root.setCheckState(0, Qt.Unchecked) |
|
621 |
files = app_doc_data.getDrawingFileList() |
|
622 |
|
|
623 |
# self.progress_bar.setMaximum(len(files)) |
|
624 |
count = 0 |
|
625 |
# self.progress_bar.setValue(count) |
|
626 |
self.drawing_reverse = reverse |
|
627 |
for file in files if not self.drawing_reverse else reversed(files): |
|
628 |
x = [drawing for drawing in drawings if drawing.name == file] |
|
629 |
if not x or not x[0].UID: |
|
630 |
drawing = Drawing(None, file, None) |
|
631 |
new_drawings.append(drawing) |
|
632 |
else: |
|
633 |
drawing = x[0] |
|
634 |
|
|
635 |
item = QTreeWidgetItem(self.treeWidgetDrawingList.root, [file, drawing.datetime]) |
|
636 |
item.setIcon(0, QIcon(':newPrefix/image.png')) |
|
637 |
item.setFlags(item.flags() | Qt.ItemIsUserCheckable) |
|
638 |
item.setCheckState(0, Qt.Unchecked) |
|
639 |
item.setData(Qt.UserRole, 0, drawing) |
|
640 |
|
|
641 |
count += 1 |
|
642 |
# self.progress_bar.setValue(count) |
|
643 |
# QApplication.processEvents() |
|
644 |
|
|
645 |
self.treeWidgetDrawingList.root.setText(0, self.tr('P&ID Drawings') + |
|
646 |
f"({self.treeWidgetDrawingList.root.childCount()})") |
|
647 |
self.treeWidgetDrawingList.expandItem(self.treeWidgetDrawingList.root) |
|
648 |
#self.treeWidgetDrawingList.root.sortChildren(0, Qt.AscendingOrder) |
|
649 |
self.treeWidgetDrawingList.resizeColumnToContents(0) |
|
650 |
|
|
651 |
app_doc_data.saveDrawings(new_drawings) |
|
614 |
self.treeWidgetDrawingList.load_drawing_list(reverse) |
|
652 | 615 |
except Exception as ex: |
653 |
message = 'error occurred({}) in {}:{}'.format(repr(ex), sys.exc_info()[-1].tb_frame.f_code.co_filename,
|
|
654 |
sys.exc_info()[-1].tb_lineno)
|
|
616 |
message = f'error occurred({repr(ex)}) in {sys.exc_info()[-1].tb_frame.f_code.co_filename}:' \
|
|
617 |
f'{sys.exc_info()[-1].tb_lineno}'
|
|
655 | 618 |
self.addMessage.emit(MessageType.Error, message) |
656 | 619 |
finally: |
657 | 620 |
self.progress_bar.setValue(self.progress_bar.maximum()) |
... | ... | |
2185 | 2148 |
def showImageSelectionMessageBox(self): |
2186 | 2149 |
QMessageBox.about(self.graphicsView, self.tr("Notice"), self.tr("First Select Drawing")) |
2187 | 2150 |
|
2151 |
def on_drawing_filter_changed(self): |
|
2152 |
"""filter drawing tree view""" |
|
2153 |
regexp = QRegExp(self.drawingFilter.text(), Qt.CaseInsensitive, QRegExp.FixedString) |
|
2154 |
|
|
2155 |
self.treeWidgetDrawingList.set_filter_regexp(regexp) |
|
2156 |
|
|
2157 |
self.treeWidgetDrawingList.expandAll() |
|
2158 |
|
|
2188 | 2159 |
def on_search_text_changed(self): |
2189 | 2160 |
"""filter symbol tree view""" |
2190 | 2161 |
regexp = QRegExp(self.lineEditFilter.text(), Qt.CaseInsensitive, QRegExp.FixedString) |
DTI_PID/DTI_PID/MainWindow_UI.py | ||
---|---|---|
1 | 1 |
# -*- coding: utf-8 -*- |
2 | 2 |
|
3 |
# Form implementation generated from reading ui file './UI/MainWindow.ui'
|
|
3 |
# Form implementation generated from reading ui file '.\UI\MainWindow.ui'
|
|
4 | 4 |
# |
5 |
# Created by: PyQt5 UI code generator 5.9.2
|
|
5 |
# Created by: PyQt5 UI code generator 5.15.4
|
|
6 | 6 |
# |
7 |
# WARNING! All changes made in this file will be lost! |
|
7 |
# WARNING: Any manual changes made to this file will be lost when pyuic5 is |
|
8 |
# run again. Do not edit this file unless you know what you are doing. |
|
9 |
|
|
8 | 10 |
|
9 | 11 |
from PyQt5 import QtCore, QtGui, QtWidgets |
10 | 12 |
|
13 |
|
|
11 | 14 |
class Ui_MainWindow(object): |
12 | 15 |
def setupUi(self, MainWindow): |
13 | 16 |
MainWindow.setObjectName("MainWindow") |
... | ... | |
159 | 162 |
self.verticalLayoutDrawingList.setObjectName("verticalLayoutDrawingList") |
160 | 163 |
self.horizontalLayout_4 = QtWidgets.QHBoxLayout() |
161 | 164 |
self.horizontalLayout_4.setObjectName("horizontalLayout_4") |
162 |
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) |
|
163 |
self.horizontalLayout_4.addItem(spacerItem1) |
|
165 |
self.drawingFilter = QtWidgets.QLineEdit(self.tabDrawingList) |
|
166 |
self.drawingFilter.setObjectName("drawingFilter") |
|
167 |
self.horizontalLayout_4.addWidget(self.drawingFilter) |
|
164 | 168 |
self.pushButtonRefreshDrawings = QtWidgets.QPushButton(self.tabDrawingList) |
165 | 169 |
self.pushButtonRefreshDrawings.setObjectName("pushButtonRefreshDrawings") |
166 | 170 |
self.horizontalLayout_4.addWidget(self.pushButtonRefreshDrawings) |
167 | 171 |
self.verticalLayoutDrawingList.addLayout(self.horizontalLayout_4) |
168 |
self.treeWidgetDrawingList = QtWidgets.QTreeWidget(self.tabDrawingList) |
|
169 |
self.treeWidgetDrawingList.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) |
|
170 |
self.treeWidgetDrawingList.setColumnCount(2) |
|
171 |
self.treeWidgetDrawingList.setObjectName("treeWidgetDrawingList") |
|
172 |
self.treeWidgetDrawingList.headerItem().setText(0, "1") |
|
173 |
self.treeWidgetDrawingList.headerItem().setText(1, "2") |
|
174 |
self.treeWidgetDrawingList.header().setVisible(False) |
|
175 |
self.verticalLayoutDrawingList.addWidget(self.treeWidgetDrawingList) |
|
176 | 172 |
self.gridLayout_7.addLayout(self.verticalLayoutDrawingList, 0, 0, 1, 1) |
173 |
self.drawingLayout = QtWidgets.QVBoxLayout() |
|
174 |
self.drawingLayout.setObjectName("drawingLayout") |
|
175 |
self.gridLayout_7.addLayout(self.drawingLayout, 1, 0, 1, 1) |
|
177 | 176 |
self.tabWidgetItemExplorer.addTab(self.tabDrawingList, "") |
178 | 177 |
self.gridLayout_4.addWidget(self.tabWidgetItemExplorer, 0, 0, 1, 1) |
179 | 178 |
self.dockWidgetObjectExplorer.setWidget(self.dockWidgetContents_2) |
... | ... | |
198 | 197 |
self.verticalLayout_3.setObjectName("verticalLayout_3") |
199 | 198 |
self.horizontalLayout_5 = QtWidgets.QHBoxLayout() |
200 | 199 |
self.horizontalLayout_5.setObjectName("horizontalLayout_5") |
201 |
spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
202 |
self.horizontalLayout_5.addItem(spacerItem2)
|
|
200 |
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
201 |
self.horizontalLayout_5.addItem(spacerItem1)
|
|
203 | 202 |
self.toolButtonClearLog = QtWidgets.QToolButton(self.tabTerminal) |
204 | 203 |
self.toolButtonClearLog.setText("") |
205 | 204 |
icon1 = QtGui.QIcon() |
... | ... | |
239 | 238 |
self.verticalLayout_4.setObjectName("verticalLayout_4") |
240 | 239 |
self.horizontalLayout_3 = QtWidgets.QHBoxLayout() |
241 | 240 |
self.horizontalLayout_3.setObjectName("horizontalLayout_3") |
242 |
spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
243 |
self.horizontalLayout_3.addItem(spacerItem3)
|
|
241 |
spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
|
|
242 |
self.horizontalLayout_3.addItem(spacerItem2)
|
|
244 | 243 |
self.pushButtonMemoRefresh = QtWidgets.QPushButton(self.tabMemo) |
245 | 244 |
self.pushButtonMemoRefresh.setObjectName("pushButtonMemoRefresh") |
246 | 245 |
self.horizontalLayout_3.addWidget(self.pushButtonMemoRefresh) |
... | ... | |
648 | 647 |
self.dockWidgetObjectExplorer.setWindowTitle(_translate("MainWindow", "Object Explorer")) |
649 | 648 |
self.pushButtonRefreshTree.setText(_translate("MainWindow", "Refresh Item List")) |
650 | 649 |
self.tabWidgetItemExplorer.setTabText(self.tabWidgetItemExplorer.indexOf(self.tabItemProperty), _translate("MainWindow", "Topology Manager")) |
650 |
self.drawingFilter.setPlaceholderText(_translate("MainWindow", "Search...")) |
|
651 | 651 |
self.pushButtonRefreshDrawings.setText(_translate("MainWindow", "Refresh Drawing List")) |
652 | 652 |
self.tabWidgetItemExplorer.setTabText(self.tabWidgetItemExplorer.indexOf(self.tabDrawingList), _translate("MainWindow", "Drawing List")) |
653 | 653 |
self.dockWidgetOutputWnd.setWindowTitle(_translate("MainWindow", "Output Window")) |
... | ... | |
748 | 748 |
self.actionReadme.setText(_translate("MainWindow", "Readme")) |
749 | 749 |
self.actionImport_Text_from_CAD_for_Instrument.setText(_translate("MainWindow", "Import Text from PDF for Instrument")) |
750 | 750 |
self.actionStreamline.setText(_translate("MainWindow", "Streamline")) |
751 |
|
|
752 | 751 |
import MainWindow_rc |
753 |
|
|
754 |
if __name__ == "__main__": |
|
755 |
import sys |
|
756 |
app = QtWidgets.QApplication(sys.argv) |
|
757 |
MainWindow = QtWidgets.QMainWindow() |
|
758 |
ui = Ui_MainWindow() |
|
759 |
ui.setupUi(MainWindow) |
|
760 |
MainWindow.show() |
|
761 |
sys.exit(app.exec_()) |
|
762 |
|
DTI_PID/DTI_PID/UI/MainWindow.ui | ||
---|---|---|
289 | 289 |
<item> |
290 | 290 |
<layout class="QHBoxLayout" name="horizontalLayout_4"> |
291 | 291 |
<item> |
292 |
<spacer name="horizontalSpacer_2"> |
|
293 |
<property name="orientation"> |
|
294 |
<enum>Qt::Horizontal</enum> |
|
295 |
</property> |
|
296 |
<property name="sizeHint" stdset="0"> |
|
297 |
<size> |
|
298 |
<width>40</width> |
|
299 |
<height>20</height> |
|
300 |
</size> |
|
292 |
<widget class="QLineEdit" name="drawingFilter"> |
|
293 |
<property name="placeholderText"> |
|
294 |
<string>Search...</string> |
|
301 | 295 |
</property> |
302 |
</spacer>
|
|
296 |
</widget>
|
|
303 | 297 |
</item> |
304 | 298 |
<item> |
305 | 299 |
<widget class="QPushButton" name="pushButtonRefreshDrawings"> |
... | ... | |
310 | 304 |
</item> |
311 | 305 |
</layout> |
312 | 306 |
</item> |
313 |
<item> |
|
314 |
<widget class="QTreeWidget" name="treeWidgetDrawingList"> |
|
315 |
<property name="editTriggers"> |
|
316 |
<set>QAbstractItemView::NoEditTriggers</set> |
|
317 |
</property> |
|
318 |
<property name="columnCount"> |
|
319 |
<number>2</number> |
|
320 |
</property> |
|
321 |
<attribute name="headerVisible"> |
|
322 |
<bool>false</bool> |
|
323 |
</attribute> |
|
324 |
<column> |
|
325 |
<property name="text"> |
|
326 |
<string notr="true">1</string> |
|
327 |
</property> |
|
328 |
</column> |
|
329 |
<column> |
|
330 |
<property name="text"> |
|
331 |
<string notr="true">2</string> |
|
332 |
</property> |
|
333 |
</column> |
|
334 |
</widget> |
|
335 |
</item> |
|
336 | 307 |
</layout> |
337 | 308 |
</item> |
309 |
<item row="1" column="0"> |
|
310 |
<layout class="QVBoxLayout" name="drawingLayout"/> |
|
311 |
</item> |
|
338 | 312 |
</layout> |
339 | 313 |
</widget> |
340 | 314 |
</widget> |
내보내기 Unified diff