프로젝트

일반

사용자정보

개정판 9ff6820d

ID9ff6820d2111ad361cfdceee3c7ff984f746dfd9
상위 45a42a9d
하위 092db086, a208ed03

백흠경이(가) 약 6년 전에 추가함

issue #578: Line No를 Explode시킬 수 있다 / 속성창에 툴팁이 표시된다

Change-Id: Iba29ab3b5564ccaf55204fc869a443bb920b1651

차이점 보기:

DTI_PID/DTI_PID/App.py
122 122
                app._mainWnd.show()
123 123
                sys.exit(app.exec_())
124 124
    except Exception as ex:
125
         print('에러가 발생했습니다.\n', ex)
125
         print('에러가 발생했습니다.\n', ex)
126
    except:
127
        ex = sys.exc_info()[0]
128
        print('에러가 발생했습니다.\n', ex)
DTI_PID/DTI_PID/AppDocData.py
1586 1586
            cursor.execute(sql)
1587 1587
            rows = cursor.fetchall()
1588 1588
            for row in rows:
1589
                pipeSize = NominalPipeSize(row[0], row[1], float(row[2]) if row[2] is not None else None, float(row[3]) if row[3] is not None else None, row[4], row[5], row[6], row[7])
1589
                pipeSize = NominalPipeSize(row[0], row[1], float(row[2]) if row[2] else None, float(row[3]) if row[3] else None, row[4], row[5], row[6], row[7])
1590 1590
                pipeSize.sizeUnit = sizeUnit
1591 1591
                if forCheckLineNumber:
1592 1592
                    if sizeUnit == 'Inch' and pipeSize.inchStr:
DTI_PID/DTI_PID/ConfigurationDialog.py
563 563
                    kyouho 2018.07.04 edit cofiguration new delimiter (self.delimiter)
564 564
    '''
565 565
    def accept(self):
566
        from NominalPipeSize import NomialPipeSizeTable
566
        from NominalPipeSize import NominalPipeSizeTable
567 567
        try:
568 568
            docData = AppDocData.instance()
569 569

  
......
652 652
            
653 653
            docData.saveConfigs(configs)
654 654
            docData.lineTypeConfigs = None  # clear line type configurations
655
            NomialPipeSizeTable.instance().pipe_sizes = None    # clear nominal pipe size table
655
            NominalPipeSizeTable.instance().pipe_sizes = None    # clear nominal pipe size table
656 656
        except Exception as ex:
657 657
            from App import App
658 658
            from AppDocData import MessageType
DTI_PID/DTI_PID/ItemPropertyTableWidget.py
207 207
        elif type(item) is QEngineeringRunItem:
208 208
            self.initLineRunCell(item)
209 209

  
210
        """ show tooltip """
211
        for index in range(self.rowCount()):
212
            item = self.item(index, 1)
213
            if item is not None:
214
                item.setToolTip(item.text())
215

  
210 216
    '''
211 217
        @brief      Initialize Title Cell
212 218
        @author     Jeongwoos
......
422 428
                    row = row + 1
423 429
                    count = count + 1
424 430
                # up to here
431

  
425 432
                for index in range(self.rowCount()):
426 433
                    item = self.item(index, 1)
427 434
                    if item is not None:
428 435
                        item.setFlags(Qt.ItemIsEnabled|Qt.ItemIsSelectable)
436
                        item.setToolTip(item.text())
429 437
                suppliedItem.setFlags(Qt.ItemIsEnabled|Qt.ItemIsSelectable|Qt.ItemIsEditable)
430 438
            else:
431 439
                self.setRowCount(0)
DTI_PID/DTI_PID/ItemTreeWidget.py
174 174

  
175 175
    def explode_line_no(self, lineNoTreeWidgetItem):
176 176
        """ explode line no """
177
        pass
177

  
178
        try:
179
            line_no_item = lineNoTreeWidgetItem.data(0, self.TREE_DATA_ROLE)
180
            if line_no_item:
181
                connected_items = line_no_item.getConnectedItems()
182
                for item in connected_items:
183
                    self.addTreeItem(self.SymbolsTreeItem, item)
184

  
185
                for i in reversed(range(lineNoTreeWidgetItem.childCount())):
186
                    lineNoTreeWidgetItem.takeChild(i)
187

  
188
                line_no_item.explode()
189
        finally:
190
            pass
178 191

  
179 192
    '''
180 193
        @brief      pick line type
......
363 376
                        data = item.data(0, self.TREE_DATA_ROLE)
364 377
                        if data is not None and (data == child) and (parent is not item.parent()):
365 378
                            parentData = parent.data(0, self.TREE_DATA_ROLE)
366
                            if issubclass(type(parentData), QEngineeringLineNoTextItem):
379
                            if parentData is not None and issubclass(type(parentData), QEngineeringLineNoTextItem):
367 380
                                for index in range(len(parentData.runs)):
368 381
                                    runGroup = parentData.runs[index]
369 382
                                    if data in runGroup.items:
......
378 391
                                        break
379 392
                                    else:
380 393
                                        pass
394
                            elif parent is not None:
395
                                item.parent().removeChild(item) # remove item from original parent
396
                                parent.addChild(item)
381 397
                            break
382 398
            elif type(child) is QEngineeringLineNoTextItem:
383 399
                foundItems = self.findItems(child.text(), Qt.MatchExactly|Qt.MatchRecursive, 0)
DTI_PID/DTI_PID/LineNoTracer.py
75 75
        @author humkyung
76 76
    '''
77 77
    def findSecondaryLines(self, lines):
78
        from EngineeringAbstractItem import QEngineeringAbstractItem
78 79
        from EngineeringLineItem import QEngineeringLineItem
79 80
        from EngineeringRunItem import QEngineeringRunItem
80 81

  
......
86 87
                for line in lines:
87 88
                    if line.owner is not None: continue
88 89

  
89
                    matches = [x for x in self._lines if x.owner is not None and x.is_connectable(line)]
90
                    matches = [x for x in self._lines if x.owner is not None and x.is_connected(line, QEngineeringAbstractItem.CONNECTED_AT_BODY)]
90 91
                    if matches:
91 92
                        foundCount += 1
92 93
                        connectedItems = self.findConnectedObjects(line, toler=10)
......
106 107
                        notMatches.append(line)
107 108
                lines = notMatches
108 109
        except Exception as ex:
109
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
110
            from App import App 
110 111

  
111
            
112
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
113
            App.mainWnd().addMessage.emit(MessageType.Error, message)
112 114

  
113 115
    '''
114 116
        @brief      trace line no
......
137 139

  
138 140
                docData.tracerLineNos.clear()
139 141
                
140
                ## 기존에 찾은 것 유지
141
                #for lineNo in self._lineNos:
142
                #    lineNo.conns.clear()
143

  
144 142
                docData.tracerLineNos = self._lineNos
145 143
                remainLineNos = []
146 144
                for lineno in docData.tracerLineNos:
DTI_PID/DTI_PID/Shapes/EngineeringAbstractItem.py
14 14
    CONNECTED_AT_PT = 0
15 15
    CONNECTED_AT_BODY = 1
16 16

  
17
    HOVER_ZVALUE = 200
18

  
17 19
    def __init__(self, parent=None):
18 20
        self._color = self.DEFAULT_COLOR # default color
19 21
        self._owner = None
DTI_PID/DTI_PID/Shapes/EngineeringArrowItem.py
1
# coding: utf-8
2
""" This is engineering arrow item module """
3

  
4
import os.path
5
import copy, sys
6
try:
7
    from PyQt5.QtCore import *
8
    from PyQt5.QtGui import *
9
    from PyQt5.QtWidgets import *
10
except ImportError:
11
    try:
12
        from PyQt4.QtCore import Qt, QRectF, pyqtSignal, QT_VERSION_STR
13
        from PyQt4.QtGui import QGraphicsView, QGraphicsScene, QImage, QPixmap, QPainterPath, QFileDialog
14
    except ImportError:
15
        raise ImportError("ImageViewerQt: Requires PyQt5 or PyQt4.")
16

  
17
from EngineeringAbstractItem import QEngineeringAbstractItem
18
from EngineeringLineItem import QEngineeringLineItem
19

  
20
"""
21
    A {ArrowItem} is the graphical representation of a {Symbol.Arrow}.
22
"""
23
class QEngineeringArrowItem(QGraphicsPolygonItem, QEngineeringAbstractItem):
24
    """ This is engineering arrow item class """
25
    SMALL_SIZE = 10
26
    BIG_SIZE = 16
27
    HIGHLIGHT = '#BC4438'
28

  
29
    def __init__(self, polygon, parent=None):
30
        """ initialize arrow """
31

  
32
        QGraphicsPolygonItem.__init__(self, polygon, parent)
33
        QEngineeringAbstractItem.__init__(self)
34

  
35
        self.setFlag(QGraphicsItem.ItemIsSelectable, False) 
36
        self.setFlag(QGraphicsItem.ItemIsFocusable, False) 
37
        self.setFlag(QGraphicsItem.ItemStacksBehindParent, True)
DTI_PID/DTI_PID/Shapes/EngineeringConnectorItem.py
305 305
    '''
306 306
    def mouseMoveEvent(self, event):
307 307
        import shapely
308
        from EngineeringArrowItem import QEngineeringArrowItem
308 309

  
309 310
        if self.parentItem() is not None and self._savedPos is not None:
310 311
            if event.buttons() == Qt.LeftButton:
311
                items = [item for item in self.scene().items(event.scenePos()) if item is not self and item is not self.parent and type(item) is not QGraphicsPixmapItem]
312
                items = [item for item in self.scene().items(event.scenePos()) if item is not self and item is not self.parent and \
313
                    type(item) is not QGraphicsPixmapItem and type(item) is not QEngineeringArrowItem]
312 314
                ## highlight underitem
313 315
                if len(items) > 0:
314 316
                    if not hasattr(self, '_underItem') or self._underItem is not items[0]:
DTI_PID/DTI_PID/Shapes/EngineeringLineItem.py
21 21
import shapely
22 22

  
23 23
class QEngineeringLineItem(QGraphicsLineItem, QEngineeringAbstractItem):
24
    """
25
    This is engineering line item
26
    """
24
    """ This is engineering line item """
27 25

  
28 26
    ARROW_SIZE = 30
29 27
    ZVALUE = 100
......
79 77
                    connector.setZValue(self.zValue() + 1)
80 78
                    self.connectors.append(connector)
81 79

  
80
                self.update_arrow()
81

  
82 82
                self.setToolTip('({},{})-({},{})'.format(vertices[0][0], vertices[0][1], vertices[1][0], vertices[1][1]))
83 83
        except Exception as ex:
84 84
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
......
597 597
        line = self.line()
598 598
        self.setLine(QLineF(line.p2(), line.p1()))
599 599
        self.connectors[0], self.connectors[1] = self.connectors[1], self.connectors[0]
600
        self.update()
600 601

  
601 602
    '''
602 603
        @brief      add flow arrow
......
953 954
                    self.lineType = 'Connect To Process'
954 955

  
955 956
    def hoverEnterEvent(self, event):
956
        """
957
        hilight item and it's children
958
        """
957
        """ hilight item and it's children """
959 958
        self.hover = True
959
        self.setZValue(QEngineeringAbstractItem.HOVER_ZVALUE)
960 960
        self.update()
961 961

  
962
        for connector in self.connectors:
963
            connector.setZValue(self.zValue() + 1)
964

  
962 965
    def hoverLeaveEvent(self, event):
963
        """
964
        restore original color
965
        """
966
        """ restore original color """
966 967
        self.hover = False
968
        self.setZValue(QEngineeringLineItem.ZVALUE)
967 969
        self.update()
968 970

  
971
        for connector in self.connectors:
972
            connector.setZValue(self.zValue() + 1)
973

  
969 974
    def hoverMoveEvent(self, event):
970 975
        pass
971 976
    
......
980 985
            self.scene().removeItem(self)
981 986
        elif event.key() == Qt.Key_C:
982 987
            self.reverse()
983
            rect = self.sceneBoundingRect()
984
            rect.setRect(rect.left() - QEngineeringLineItem.ARROW_SIZE, rect.top() - QEngineeringLineItem.ARROW_SIZE, 
985
                rect.width() + QEngineeringLineItem.ARROW_SIZE*2, rect.height() + QEngineeringLineItem.ARROW_SIZE*2)
986
            self.scene().invalidate(rect)
988
            self.update_arrow()
987 989
    
988 990
    '''
989 991
        @brief  draw rect when item is selected
......
1011 1013
        for child in self.childItems():
1012 1014
            child.setBrush(self.pen().color())
1013 1015

  
1016
        """
1014 1017
        if self.lineType == 'Primary' or self.lineType == 'Secondary':
1015 1018
            ## draw direction mark
1016 1019
            length = self.length()
......
1020 1023

  
1021 1024
                _dir = [(ptEnd[0] - ptStart[0])/self.length(), (ptEnd[1] - ptStart[1])/self.length()]
1022 1025
                perpendicular = (-_dir[1], _dir[0])
1023

  
1024
                polygon = QPolygonF()
1025
                polygon.append(QPointF(ptEnd[0] - _dir[0]*QEngineeringLineItem.ARROW_SIZE + perpendicular[0]*QEngineeringLineItem.ARROW_SIZE*0.25, 
1026
                                    ptEnd[1] - _dir[1]*QEngineeringLineItem.ARROW_SIZE + perpendicular[1]*QEngineeringLineItem.ARROW_SIZE*0.25))
1027
                polygon.append(QPointF(ptEnd[0] - _dir[0]*QEngineeringLineItem.ARROW_SIZE - perpendicular[0]*QEngineeringLineItem.ARROW_SIZE*0.25, 
1028
                                    ptEnd[1] - _dir[1]*QEngineeringLineItem.ARROW_SIZE - perpendicular[1]*QEngineeringLineItem.ARROW_SIZE*0.25))
1029
                polygon.append(QPointF(ptEnd[0], ptEnd[1]))
1030
                polygon.append(polygon[0])
1031

  
1032
                _pen = self.pen() 
1033
                _pen.setWidth(1)
1034
                painter.setPen(_pen)
1035
                painter.setBrush(QBrush(_pen.color()))
1036
                painter.drawConvexPolygon(polygon)
1037 1026
            ## up to here
1027
        """
1038 1028

  
1039 1029
        if self.isSelected():
1040 1030
            self.drawFocusRect(painter)
......
1207 1197
        self.setPen(_pen)
1208 1198
        self.update()
1209 1199

  
1200
    def update_arrow(self):
1201
        """ update flow arrow """
1202
        from EngineeringArrowItem import QEngineeringArrowItem
1203

  
1204
        start = self.line().p1()
1205
        end = self.line().p2()
1206

  
1207
        _dir = [(end.x() - start.x())/self.length(), (end.y() - start.y())/self.length()]
1208
        perpendicular = (-_dir[1], _dir[0])
1209
        polygon = QPolygonF()
1210
        polygon.append(QPointF(end.x() - _dir[0]*QEngineeringLineItem.ARROW_SIZE + perpendicular[0]*QEngineeringLineItem.ARROW_SIZE*0.25, 
1211
                            end.y() - _dir[1]*QEngineeringLineItem.ARROW_SIZE + perpendicular[1]*QEngineeringLineItem.ARROW_SIZE*0.25))
1212
        polygon.append(QPointF(end.x() - _dir[0]*QEngineeringLineItem.ARROW_SIZE - perpendicular[0]*QEngineeringLineItem.ARROW_SIZE*0.25, 
1213
                            end.y() - _dir[1]*QEngineeringLineItem.ARROW_SIZE - perpendicular[1]*QEngineeringLineItem.ARROW_SIZE*0.25))
1214
        polygon.append(end)
1215
        polygon.append(polygon[0])  # close polygon
1216

  
1217
        if not hasattr(self, '_arrow'):
1218
            self._arrow = QEngineeringArrowItem(polygon, self)
1219
        else:
1220
            self._arrow.setPolygon(polygon)
1221

  
1222
        self._arrow.update()
1223

  
1210 1224
    '''
1211 1225
        @brief      reshape line
1212 1226
        @author     humkyung
1213 1227
        @date       2018.07.27
1214 1228
    '''
1215 1229
    def onConnectorPosChaned(self, connector):
1230
        from EngineeringArrowItem import QEngineeringArrowItem
1231

  
1216 1232
        start = self.connectors[0].center()
1217 1233
        end = self.connectors[1].center()
1218
        line = QLineF(QPointF(start[0], start[1]), QPointF(end[0], end[1]))
1219
        self.setLine(line)
1234
        #line = QLineF(QPointF(start[0], start[1]), QPointF(end[0], end[1]))
1235
        self.setLine(start[0], start[1], end[0], end[1])
1220 1236
        self.update()
1221 1237

  
1238
        self.update_arrow()
1239

  
1222 1240
    '''
1223 1241
        @brief      
1224 1242
        @author     humkyung
......
1252 1270

  
1253 1271
        QGraphicsLineItem.mouseReleaseEvent(self, event)
1254 1272

  
1255
    '''
1256
        @brief      reshape line
1257
        @author     humkyung
1258
        @date       2018.07.24
1259
    '''
1260
    '''
1261
    def mouseMoveEvent(self, event):
1262
        import math
1263
        from EngineeringConnectorItem import QEngineeringConnectorItem
1264

  
1265
        if event.buttons() == Qt.LeftButton and self._selectedIndex != -1:
1266
            if self._selectedIndex == 0:
1267
                item = self.scene().itemAt(event.scenePos(), QTransform())
1268
                if item is not None and type(item) is QEngineeringLineItem:
1269
                    self.joinTo(item)
1270
                elif item is not None and type(item) is QEngineeringConnectorItem:
1271
                    center = item.center()
1272
                    line = QLineF(QPointF(center[0], center[1]), QPointF(self.endPoint()[0], self.endPoint()[1]))
1273
                    self.setLine(line)
1274
                else:
1275
                    pt = [event.scenePos().x(), event.scenePos().y()]
1276
                    dx = abs(pt[0] - self.endPoint()[0])
1277
                    dy = abs(pt[1] - self.endPoint()[1])
1278
                    if dx < dy:
1279
                        pt[0] = self.endPoint()[0]
1280
                    else:
1281
                        pt[1] = self.endPoint()[1]
1282

  
1283
                    line = QLineF(QPointF(pt[0], pt[1]), QPointF(self.endPoint()[0], self.endPoint()[1]))
1284
                    self.setLine(line)
1285
            elif self._selectedIndex == 1:
1286
                item = self.scene().itemAt(event.scenePos(), QTransform())
1287
                if item is not None and type(item) is QEngineeringLineItem:
1288
                    self.joinTo(item)
1289
                elif item is not None and type(item) is QEngineeringConnectorItem:
1290
                    center = item.center()
1291
                    line = QLineF(QPointF(self.startPoint()[0], self.startPoint()[1]), QPointF(center[0], center[1]))
1292
                    self.setLine(line)
1293
                else:
1294
                    pt = [event.scenePos().x(), event.scenePos().y()]
1295
                    dx = abs(pt[0] - self.startPoint()[0])
1296
                    dy = abs(pt[1] - self.startPoint()[1])
1297
                    if dx < dy:
1298
                        pt[0] = self.startPoint()[0]
1299
                    else:
1300
                        pt[1] = self.startPoint()[1]
1301

  
1302
                    line = QLineF(QPointF(self.startPoint()[0], self.startPoint()[1]), QPointF(pt[0], pt[1]))
1303
                    self.setLine(line)
1304

  
1305
            self.update()
1306
        else:
1307
            self._selectedIndex = -1
1308

  
1309
            pos = event.scenePos()
1310
            ptStart = self.startPoint()
1311
            dx = ptStart[0] - pos.x()
1312
            dy = ptStart[1] - pos.y()
1313
            if math.sqrt(dx*dx + dy*dy) < 10:
1314
                self._selectedIndex = 0
1315

  
1316
            ptEnd = self.endPoint()
1317
            dx = ptEnd[0] - pos.x()
1318
            dy = ptEnd[1] - pos.y()
1319
            if math.sqrt(dx*dx + dy*dy) < 10:
1320
                self._selectedIndex = 1
1321

  
1322
            self.update()
1323

  
1324
        QGraphicsLineItem.mouseMoveEvent(self, event)
1325
    '''
1326

  
1327 1273
'''
1328 1274
    @brief      The class transfer pyqtSignal Event. Cause Subclass of QGraphicsRectItem can't use pyqtSignal
1329 1275
    @author     Jeongwoo
DTI_PID/DTI_PID/Shapes/EngineeringLineNoTextItem.py
34 34
        self._runs = []
35 35

  
36 36
    def setVisible(self, visible):
37
        """
38
        override visible value
39
        """
37
        """ override visible value """
40 38
        super(QEngineeringTextItem, self).setVisible(visible)
41 39
        for run in self.runs:
42 40
            run.visible = visible
......
302 300

  
303 301
        return visited
304 302

  
303
    def explode(self):
304
        """ explode line no """
305
        try:
306
            for run in self.runs:
307
                run.explode()
308
        finally:
309
            self.runs.clear()
310

  
305 311
    '''
306 312
        @brief      save Line Data
307 313
        @author     kyouho
DTI_PID/DTI_PID/Shapes/EngineeringRunItem.py
25 25

  
26 26
    @property
27 27
    def visible(self):
28
        """
29
        return visible
30
        """
28
        """ return visible """
31 29
        return self._visible
32 30

  
33 31
    @visible.setter
......
58 56
    def items(self, value):
59 57
        self._items = value
60 58

  
59
    def explode(self):
60
        """ explode run """
61
        try:
62
            for item in self.items:
63
                item.owner = None
64
        finally:
65
            self.items.clear()
66

  
61 67
    '''
62 68
        @brief  get two points which's length is max
63 69
        @author humkyung

내보내기 Unified diff

클립보드 이미지 추가 (최대 크기: 500 MB)