프로젝트

일반

사용자정보

개정판 c82b5644

IDc82b56446670bdec98a05344e97e120da96be7e0
상위 3ec1874a
하위 990644d9

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

issue #563: set uid type of item to UUID, fixed run flow direction

Change-Id: I9c6299b728fad4cc50c2c08592abe88d5dda6df3

차이점 보기:

DTI_PID/DTI_PID/ConnectAttrDialog.py
47 47
'''
48 48
'''
49 49
class QConnectAttrDialog(QDialog):
50
    '''
51
    '''
50
    """ This is connect attr dialog class """
51

  
52 52
    def __init__(self, parent, graphicsView): #Parent is MainWindow
53 53
        import ConnectAttr_UI
54 54

  
......
58 58
        self.graphicsView = graphicsView
59 59
        self.ui = ConnectAttr_UI.Ui_ConnectAttr()
60 60
        self.ui.setupUi(self)
61
        self.ui.pushButtonStart.setFocus()
61 62
        self.ui.buttonBox.setEnabled(True)
62 63
        self.ui.listWidget.model().rowsInserted.connect(self.rowInserted) ## connect to func rowInserted(self, item)
63 64
        self.isAccepted = False
DTI_PID/DTI_PID/ConnectAttr_UI.py
1 1
# -*- coding: utf-8 -*-
2 2

  
3
# Form implementation generated from reading ui file './UI/dlgConnectAttr.ui'
3
# Form implementation generated from reading ui file '.\UI\dlgConnectAttr.ui'
4 4
#
5 5
# Created by: PyQt5 UI code generator 5.11.3
6 6
#
......
56 56
        self.retranslateUi(ConnectAttr)
57 57
        self.buttonBox.clicked['QAbstractButton*'].connect(ConnectAttr.accept)
58 58
        QtCore.QMetaObject.connectSlotsByName(ConnectAttr)
59
        ConnectAttr.setTabOrder(self.pushButtonStart, self.listWidget)
59 60

  
60 61
    def retranslateUi(self, ConnectAttr):
61 62
        _translate = QtCore.QCoreApplication.translate
62 63
        ConnectAttr.setWindowTitle(_translate("ConnectAttr", "Connect Attribute"))
63 64
        self.pushButtonStart.setText(_translate("ConnectAttr", "Start"))
64 65

  
65

  
66
if __name__ == "__main__":
67
    import sys
68
    app = QtWidgets.QApplication(sys.argv)
69
    ConnectAttr = QtWidgets.QDialog()
70
    ui = Ui_ConnectAttr()
71
    ui.setupUi(ConnectAttr)
72
    ConnectAttr.show()
73
    sys.exit(app.exec_())
74

  
DTI_PID/DTI_PID/ItemPropertyTableWidget.py
689 689
                        if attr.Attribute == keyCell.text():
690 690
                            items[0].attrs[attr] = None
691 691
                    self.show_item_property(items[0])
692
        elif (event.key() == Qt.Key_C) and (event.modifiers() & Qt.ControlModifier):
693
            self.copy_cells_to_clipboard()
694
            event.accept()
695

  
696
    def copy_cells_to_clipboard(self):
697
        """ copy selected text to clipboard """
698

  
699
        selection = self.selectedIndexes()
700
        if selection:
701
            rows = sorted(index.row() for index in selection)
702
            columns = sorted(index.column() for index in selection)
703
            text = self.item(rows[-1], columns[-1]).text()
704
            QApplication.clipboard().setText(text)
692 705

  
693 706
    '''
694 707
        @brief      int cell check
DTI_PID/DTI_PID/ItemTreeWidget.py
116 116
                event.ignore()
117 117
        except Exception as ex:
118 118
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
119

  
119
    
120 120
    '''
121 121
        @brief      Show Context Menu
122 122
        @author     Jeongwoo
......
148 148
                lineTypeAction = QAction(self.tr("Select Line Type"))
149 149
                lineTypeAction.triggered.connect(lambda : self.lineTypeClickEvent(item))
150 150
                menu.addAction(lineTypeAction)
151
                explode_action = QAction(self.tr("Explode"))
152
                explode_action.triggered.connect(lambda : self.explode_line_run(item))
153
                menu.addAction(explode_action)
151 154
                menu.exec_(self.viewport().mapToGlobal(position))
152 155

  
153 156
    '''
......
172 175
                        connectedItem.setColor(color.name())
173 176
                    self.changeTreeWidgetItemColorRecursively(lineNoTreeWidgetItem, color)
174 177

  
178
    def explode_line_run(self, tree_widget_item):
179
        """ explode line run """
180

  
181
        try:
182
            line_run = tree_widget_item.data(0, self.TREE_DATA_ROLE)
183
            if line_run:
184
                for item in line_run.items:
185
                    if issubclass(type(item), SymbolSvgItem): self.addTreeItem(self.SymbolsTreeItem, item)
186

  
187
                for i in reversed(range(tree_widget_item.childCount())):
188
                    tree_widget_item.takeChild(i)
189

  
190
                line_no = tree_widget_item.parent().data(0, self.TREE_DATA_ROLE)
191
                line_no.runs.remove(line_run)
192

  
193
                line_run.explode()
194
                tree_widget_item.parent().takeChild(tree_widget_item.parent().indexOfChild(tree_widget_item))
195
        finally:
196
            pass
197

  
175 198
    def explode_line_no(self, lineNoTreeWidgetItem):
176 199
        """ explode line no """
177 200

  
DTI_PID/DTI_PID/LineNoTracer.py
99 99
                        for item in connectedItems:
100 100
                            item.owner = line_matches[0].owner if line_matches else symbol_matches[0].owner   # set item's owner
101 101

  
102
                        pipeRun = QEngineeringRunItem()
103
                        pipeRun.items = connectedItems
104
                        if pipeRun.items is not None and len(pipeRun.items) > 0:
105
                            line_matches[0].owner.runs.append(pipeRun) if line_matches else symbol_matches[0].owner.runs.append(pipeRun)
102
                        pipe_run = QEngineeringRunItem()
103
                        pipe_run.items = connectedItems
104
                        pipe_run.arrange_flow_direction()
105
                        if pipe_run.items is not None and len(pipe_run.items) > 0:
106
                            line_matches[0].owner.runs.append(pipe_run) if line_matches else symbol_matches[0].owner.runs.append(pipe_run)
106 107
                    else:
107 108
                        notMatches.append(line)
108 109
                lines = notMatches
DTI_PID/DTI_PID/MainWindow.py
638 638
    def saveToXml(self, alert = True):
639 639
        import XmlGenerator as xg
640 640
        from AppDocData import AppDocData
641
        docData = AppDocData.instance()
642
        if docData.imgName is None:
643
            self.showImageSelectionMessageBox()
644
            return
645
        result = xg.writeXmlOnScene(docData.imgName, docData.imgWidth, docData.imgHeight)
646
        
647
        if len(self.removedItems['LINE']):
648
            docData.deleteLineDataList_LineNo(self.removedItems['LINE'])
649
            self.removedItems['LINE'] = []
650

  
651
        if len(self.removedItems['EQUIP']):
652
            docData.deleteEquipDataList(self.removedItems['EQUIP'])
653
            self.removedItems['EQUIP'] = []
654

  
655
        if len(self.removedItems['INST']):
656
            docData.deleteInstDataList(self.removedItems['INST'])
657
            self.removedItems['INST'] = []
658

  
659
        if len(self.removedItems['NOTE']):
660
            docData.deleteNoteDataList(self.removedItems['NOTE'])
661
            self.removedItems['NOTE'] = []
662 641

  
663

  
664
        if alert:
665
            resultStr = '[저장 결과]'
666

  
667
            for item in result.items():
668
                itemName = str(item[0])
669
                itemSuccessCount = str(item[1][0])
670
                itemFailUidList = item[1][1]
671
                resultStr += "\r\n" + itemName + " Save Count : " + itemSuccessCount
672
                if len(itemFailUidList) > 0:
673
                    resultStr += "\r\n" + itemName + " Error List(UID)"
674
                    for uid in itemFailUidList:
675
                        resultStr += "\r\n" + uid
676

  
677
            QMessageBox.about(self.graphicsView, self.tr('Notice'), resultStr)
642
        try:
643
            docData = AppDocData.instance()
644
            if docData.imgName is None:
645
                self.showImageSelectionMessageBox()
646
                return
647
            result = xg.writeXmlOnScene(docData.imgName, docData.imgWidth, docData.imgHeight)
648
            
649
            if len(self.removedItems['LINE']):
650
                docData.deleteLineDataList_LineNo(self.removedItems['LINE'])
651
                self.removedItems['LINE'] = []
652

  
653
            if len(self.removedItems['EQUIP']):
654
                docData.deleteEquipDataList(self.removedItems['EQUIP'])
655
                self.removedItems['EQUIP'] = []
656

  
657
            if len(self.removedItems['INST']):
658
                docData.deleteInstDataList(self.removedItems['INST'])
659
                self.removedItems['INST'] = []
660

  
661
            if len(self.removedItems['NOTE']):
662
                docData.deleteNoteDataList(self.removedItems['NOTE'])
663
                self.removedItems['NOTE'] = []
664

  
665
            if alert:
666
                resultStr = '[저장 결과]'
667

  
668
                for item in result.items():
669
                    itemName = str(item[0])
670
                    itemSuccessCount = str(item[1][0])
671
                    itemFailUidList = item[1][1]
672
                    resultStr += "\r\n" + itemName + " Save Count : " + itemSuccessCount
673
                    if len(itemFailUidList) > 0:
674
                        resultStr += "\r\n" + itemName + " Error List(UID)"
675
                        for uid in itemFailUidList:
676
                            resultStr += "\r\n" + uid
677

  
678
                QMessageBox.about(self.graphicsView, self.tr('Notice'), resultStr)
679
        except Exception as ex:
680
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
681
            self.addMessage.emit(MessageType.Error, message)
678 682

  
679 683
    '''
680 684
        @brief      refresh resultPropertyTableWidget
DTI_PID/DTI_PID/Shapes/EngineeringArrowItem.py
20 20
"""
21 21
    A {ArrowItem} is the graphical representation of a {Symbol.Arrow}.
22 22
"""
23
class QEngineeringArrowItem(QGraphicsPolygonItem, QEngineeringAbstractItem):
23
class QEngineeringArrowItem(QGraphicsPolygonItem):
24 24
    """ This is engineering arrow item class """
25 25
    SMALL_SIZE = 10
26 26
    BIG_SIZE = 16
......
30 30
        """ initialize arrow """
31 31

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

  
35 35
        self.setFlag(QGraphicsItem.ItemIsSelectable, False) 
36 36
        self.setFlag(QGraphicsItem.ItemIsFocusable, False) 
DTI_PID/DTI_PID/Shapes/EngineeringConnectorItem.py
45 45

  
46 46
        QGraphicsEllipseItem.__init__(self, parent)
47 47

  
48
        self.uid = uuid.uuid4() if uid is None else uid
48
        self.uid = uuid.uuid4() if uid is None else uuid.UUID(uid, version=4)
49 49
        self.parent = parent
50 50
        self.buildItem()
51 51
        self._direction = 'AUTO'
......
241 241
    '''
242 242
    def mouseReleaseEvent(self, event):
243 243
        import shapely
244
        if self.parentItem() is not None and self._savedPos is not None:
245
            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]
246

  
247
            if items and type(items[0]) is QEngineeringLineItem:
248
                length = items[0].length()*0.5
249
                dir = items[0].perpendicular()
250
                if self.parent.isHorizontal():
251
                    start = [event.scenePos().x() - dir[0]*length, self.parent.startPoint()[1] - dir[1]*length]
252
                    end = [event.scenePos().x() + dir[0]*length, self.parent.startPoint()[1] + dir[1]*length]
244

  
245
        try:
246
            if self.parentItem() is not None and self._savedPos is not None:
247
                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]
248

  
249
                if items and type(items[0]) is QEngineeringLineItem:
250
                    length = items[0].length()*0.5
251
                    dir = items[0].perpendicular()
252
                    if self.parent.isHorizontal():
253
                        start = [event.scenePos().x() - dir[0]*length, self.parent.startPoint()[1] - dir[1]*length]
254
                        end = [event.scenePos().x() + dir[0]*length, self.parent.startPoint()[1] + dir[1]*length]
255
                    else:
256
                        start = [self.parent.startPoint()[0] - dir[0]*length, event.scenePos().y() - dir[1]*length]
257
                        end = [self.parent.startPoint()[0] + dir[0]*length, event.scenePos().y() + dir[1]*length]
258

  
259
                    pt = items[0].intersection([start, end])
260
                    if (pt is not None) and (type(pt) == shapely.geometry.point.Point):
261
                        self.setPos((pt.x, pt.y))
262
                        self.connect(items[0], QEngineeringAbstractItem.CONNECTED_AT_BODY)
263
                elif items and type(items[0]) is QEngineeringConnectorItem:
264
                    self.setPos(items[0].center())
265
                    
266
                    if self.connectedItem is not None:
267
                        for connect in self.connectedItem.connectors:
268
                            if connect.connectedItem == self.parent:
269
                                connect.connect(None)
270

  
271
                    self.connect(items[0].parent)
272
                    items[0].connect(self.parent)
253 273
                else:
254
                    start = [self.parent.startPoint()[0] - dir[0]*length, event.scenePos().y() - dir[1]*length]
255
                    end = [self.parent.startPoint()[0] + dir[0]*length, event.scenePos().y() + dir[1]*length]
256

  
257
                pt = items[0].intersection([start, end])
258
                if (pt is not None) and (type(pt) == shapely.geometry.point.Point):
259
                    self.setPos((pt.x, pt.y))
260
                    self.connect(items[0], QEngineeringAbstractItem.CONNECTED_AT_BODY)
261
            elif items and type(items[0]) is QEngineeringConnectorItem:
262
                self.setPos(items[0].center())
263
                
264
                if self.connectedItem is not None:
265
                    for connect in self.connectedItem.connectors:
266
                        if connect.connectedItem == self.parent:
267
                            connect.connect(None)
274
                    pt = [event.scenePos().x(), event.scenePos().y()]
275
                    if self._drawing_mode == QEngineeringConnectorItem.AXIS_MODE:
276
                        if len(self.parentItem().connectors) == 2:
277
                            other = [connector for connector in self.parent.connectors if connector is not self]
278
                            if other:
279
                                pt = [event.scenePos().x(), event.scenePos().y()]
280
                                dx = abs(pt[0] - other[0].center()[0])
281
                                dy = abs(pt[1] - other[0].center()[1])
282
                                if dx < dy:
283
                                    pt[0] = other[0].center()[0]
284
                                else:
285
                                    pt[1] = other[0].center()[1]
268 286

  
269
                self.connect(items[0].parent)
270
                items[0].connect(self.parent)
271
            else:
272
                pt = [event.scenePos().x(), event.scenePos().y()]
273
                if self._drawing_mode == QEngineeringConnectorItem.AXIS_MODE:
274
                    if len(self.parentItem().connectors) == 2:
275
                        other = [connector for connector in self.parent.connectors if connector is not self]
276
                        if other:
277
                            pt = [event.scenePos().x(), event.scenePos().y()]
278
                            dx = abs(pt[0] - other[0].center()[0])
279
                            dy = abs(pt[1] - other[0].center()[1])
280
                            if dx < dy:
281
                                pt[0] = other[0].center()[0]
282
                            else:
283
                                pt[1] = other[0].center()[1]
284

  
285
                self.setPos(pt)
286
                if self.connectedItem is not None:
287
                    for connect in self.connectedItem.connectors:
288
                        if connect.connectedItem == self.parent:
289
                            connect.connect(None)
290

  
291
                self.connect(None)
292

  
293
            ## unhighlight underitem
294
            if hasattr(self, '_underItem') and self._underItem is not None:
295
                self._underItem.hoverLeaveEvent(event)
296
            ## up to here
287
                    self.setPos(pt)
288
                    if self.connectedItem is not None:
289
                        for connect in self.connectedItem.connectors:
290
                            if connect.connectedItem == self.parent:
291
                                connect.connect(None)
297 292

  
298
        if self.parentItem() is not None:
299
            self._savedPos = None 
300
            self._savedConnectedItem = None
293
                    self.connect(None)
294

  
295
                ## unhighlight underitem
296
                if hasattr(self, '_underItem') and self._underItem is not None:
297
                    self._underItem.hoverLeaveEvent(event)
298
                ## up to here
299

  
300
            if self.parentItem() is not None:
301
                self._savedPos = None 
302
                self._savedConnectedItem = None
303
                self.transfer.onPosChanged.emit(self)
304
        finally:
301 305
            self.ungrabKeyboard()
302
            self.transfer.onPosChanged.emit(self)
303 306

  
304 307
        QGraphicsEllipseItem.mouseReleaseEvent(self, event)
305 308

  
......
373 376
    def keyPressEvent(self, event):
374 377
        if event.key() == Qt.Key_Escape:
375 378
            if hasattr(self, '_savedPos') and self._savedPos is not None:
376
                self.ungrabKeyboard()
377 379
                self.setPos(self._savedPos)
378 380
                self.connectedItem = self._savedConnectedItem
379 381
                self._savedPos = None
......
405 407

  
406 408
    def parse_xml(self, node):
407 409
        """ parse given node """
410
        import uuid
411

  
412
        if 'UID' in node.attrib: self.uid = uuid.UUID(node.attrib['UID'], version=4)
413

  
408 414
        if 'CONNECTED_AT' in node.attrib:
409 415
            self._connected_at = QEngineeringAbstractItem.CONNECTED_AT_PT if node.attrib['CONNECTED_AT'] == '0' else QEngineeringAbstractItem.CONNECTED_AT_BODY
410 416
        else:
......
432 438
        """ generate xml code for connector """
433 439
        from xml.etree.ElementTree import Element, SubElement, dump, ElementTree
434 440

  
435
        node = Element('CONNECTOR')
436
        node.attrib['CONNECTED_AT'] = str(self._connected_at)
437
        connectedItemNode = Element('CONNECTEDITEM')
438
        connectedItemNode.text = str(self.connectedItem.uid) if self.connectedItem is not None else 'None'
439
        connectPointNode = Element('CONNECTPOINT')
440
        connectPointNode.text = str(self.connectPoint[0]) + ',' + str(self.connectPoint[1])
441
        sceneConnectPointNode = Element('SCENECONNECTPOINT')
442
        sceneConnectPointNode.text = str(self.sceneConnectPoint[0]) + ',' + str(self.sceneConnectPoint[1])
443

  
444
        node.append(connectedItemNode)
445
        node.append(connectPointNode)
446
        node.append(sceneConnectPointNode)
441
        try:
442
            node = Element('CONNECTOR')
443
            node.attrib['UID'] = str(self.uid)
444
            node.attrib['CONNECTED_AT'] = str(self._connected_at)
445
            connectedItemNode = Element('CONNECTEDITEM')
446
            connectedItemNode.text = str(self.connectedItem.uid) if self.connectedItem else 'None'
447
            connectPointNode = Element('CONNECTPOINT')
448
            connectPointNode.text = str(self.connectPoint[0]) + ',' + str(self.connectPoint[1])
449
            sceneConnectPointNode = Element('SCENECONNECTPOINT')
450
            sceneConnectPointNode.text = str(self.sceneConnectPoint[0]) + ',' + str(self.sceneConnectPoint[1])
451

  
452
            node.append(connectedItemNode)
453
            node.append(connectPointNode)
454
            node.append(sceneConnectPointNode)
455
        except Exception as ex:
456
            from App import App 
457
            from AppDocData import MessageType
458

  
459
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
460
            App.mainWnd().addMessage.emit(MessageType.Error, message)
461
            return None
447 462

  
448 463
        return node
449 464

  
DTI_PID/DTI_PID/Shapes/EngineeringEquipmentItem.py
146 146
            node = SymbolSvgItem.toXml(self)
147 147
            self.toXmlAsAttribute(node)
148 148
        except Exception as ex:
149
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
149
            from App import App 
150
            from AppDocData import MessageType
151

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

  
155
            return None
150 156

  
151 157
        return node 
152 158

  
DTI_PID/DTI_PID/Shapes/EngineeringInstrumentItem.py
17 17
from UserInputAttribute import UserInputAttribute
18 18

  
19 19
class QEngineeringInstrumentItem(SymbolSvgItem):
20
    """
21
    This is Engineering Instrument Item class
22
    """
20
    """ This is Engineering Instrument Item class """
23 21
    clicked = pyqtSignal(QGraphicsSvgItem)
24 22
    INST_COLUMN_LIST = None 
25 23
    INST_COLOR = None
DTI_PID/DTI_PID/Shapes/EngineeringLineItem.py
40 40
            QGraphicsLineItem.__init__(self, parent)
41 41
            QEngineeringAbstractItem.__init__(self)
42 42

  
43
            self.uid = str(uuid.uuid4()) if uid is None else uuid.UUID(uid)
43
            self.uid = uuid.uuid4() if uid is None else uuid.UUID(uid, version=4)
44 44
            self.thickness = thickness
45 45

  
46 46
            self.setPen(QPen(Qt.blue, 4, Qt.SolidLine)) # set default pen
......
976 976
        @history    swap start, end point when user press 'c' key
977 977
    '''
978 978
    def keyPressEvent(self, event): 
979
        if event.key() == Qt.Key_Delete:
979
        if self.isSelected() and event.key() == Qt.Key_Delete:
980 980
            self.scene().removeItem(self)
981 981
        elif event.key() == Qt.Key_C:
982 982
            self.reverse()
......
1138 1138

  
1139 1139
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
1140 1140
            App.mainWnd().addMessage.emit(MessageType.Error, message)
1141
            return str(self.uid)
1141
            return None
1142 1142

  
1143 1143
        return node
1144 1144

  
......
1213 1213
        else:
1214 1214
            self._arrow.setPolygon(polygon)
1215 1215

  
1216
        self._arrow.setBrush(Qt.blue)
1216 1217
        self._arrow.update()
1217 1218

  
1218 1219
    '''
DTI_PID/DTI_PID/Shapes/EngineeringLineNoTextItem.py
321 321
           
322 322
            if self.conns:
323 323
                connNode = Element('CONNLINE')
324
                connNode.text = self.conns[0].uid
324
                connNode.text = str(self.conns[0].uid)
325 325
                node.append(connNode)
326 326

  
327 327
        except Exception as ex:
......
331 331
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
332 332
            App.mainWnd().addMessage.emit(MessageType.Error, message)
333 333

  
334
            return str(self.uid)
334
            return None
335 335

  
336 336
        return node 
337 337

  
DTI_PID/DTI_PID/Shapes/EngineeringNozzleItem.py
63 63
                    minDist = dist
64 64
                    selected = attr
65 65
            
66
            if selected is not None: self.attrs.append(selected)
67

  
68
    '''
69
        @brief      generate xml code for nozzle
70
        @author     humkyung
71
        @date       2018.07.19
72
    '''
73
    def toXml(self):
74
        from xml.etree.ElementTree import Element, SubElement, dump, ElementTree
75

  
76
        try:
77
            node = SymbolSvgItem.toXml(self)
78
        except Exception as ex:
79
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
80

  
81
        return node 
66
            if selected is not None: self.attrs.append(selected)
DTI_PID/DTI_PID/Shapes/EngineeringOriginItem.py
139 139
    '''
140 140
    def mouseReleaseEvent(self, event):
141 141
        import shapely
142
        if type(self.parent) is QEngineeringLineItem and self._savedPos is not None:
143
            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]
144

  
145
            if items and type(items[0]) is QEngineeringLineItem:
146
                length = items[0].length()*0.5
147
                dir = items[0].perpendicular()
148
                if self.parent.isHorizontal():
149
                    start = [event.scenePos().x() - dir[0]*length, self.parent.startPoint()[1] - dir[1]*length]
150
                    end = [event.scenePos().x() + dir[0]*length, self.parent.startPoint()[1] + dir[1]*length]
151
                else:
152
                    start = [self.parent.startPoint()[0] - dir[0]*length, event.scenePos().y() - dir[1]*length]
153
                    end = [self.parent.startPoint()[0] + dir[0]*length, event.scenePos().y() + dir[1]*length]
154

  
155
                pt = items[0].intersection([start, end])
156
                if (pt is not None) and (type(pt) == shapely.geometry.point.Point):
157
                    self.setPos((pt.x, pt.y))
158
                    self.connectedItem = items[0]
159
            elif items and type(items[0]) is QEngineeringConnectorItem:
160
                self.setPos(items[0].center())
161
                
162
                if self.connectedItem is not None:
163
                    for connect in self.connectedItem.connectors:
164
                        if connect.connectedItem == self.parent:
165
                            connect.connectedItem = None
166 142

  
167
                self.connectedItem = items[0].parent
168
                items[0].connectedItem = self.parent
169
            else:
170
                other = [connector for connector in self.parent.connectors if connector is not self]
171
                if other:
172
                    pt = [event.scenePos().x(), event.scenePos().y()]
173
                    dx = abs(pt[0] - other[0].center()[0])
174
                    dy = abs(pt[1] - other[0].center()[1])
175
                    if dx < dy:
176
                        pt[0] = other[0].center()[0]
143
        try:
144
            if type(self.parent) is QEngineeringLineItem and self._savedPos is not None:
145
                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]
146

  
147
                if items and type(items[0]) is QEngineeringLineItem:
148
                    length = items[0].length()*0.5
149
                    dir = items[0].perpendicular()
150
                    if self.parent.isHorizontal():
151
                        start = [event.scenePos().x() - dir[0]*length, self.parent.startPoint()[1] - dir[1]*length]
152
                        end = [event.scenePos().x() + dir[0]*length, self.parent.startPoint()[1] + dir[1]*length]
177 153
                    else:
178
                        pt[1] = other[0].center()[1]
154
                        start = [self.parent.startPoint()[0] - dir[0]*length, event.scenePos().y() - dir[1]*length]
155
                        end = [self.parent.startPoint()[0] + dir[0]*length, event.scenePos().y() + dir[1]*length]
179 156

  
180
                self.setPos(pt)
181
                if self.connectedItem is not None:
182
                    for connect in self.connectedItem.connectors:
183
                        if connect.connectedItem == self.parent:
184
                            connect.connectedItem = None
157
                    pt = items[0].intersection([start, end])
158
                    if (pt is not None) and (type(pt) == shapely.geometry.point.Point):
159
                        self.setPos((pt.x, pt.y))
160
                        self.connectedItem = items[0]
161
                elif items and type(items[0]) is QEngineeringConnectorItem:
162
                    self.setPos(items[0].center())
163
                    
164
                    if self.connectedItem is not None:
165
                        for connect in self.connectedItem.connectors:
166
                            if connect.connectedItem == self.parent:
167
                                connect.connectedItem = None
168

  
169
                    self.connectedItem = items[0].parent
170
                    items[0].connectedItem = self.parent
171
                else:
172
                    other = [connector for connector in self.parent.connectors if connector is not self]
173
                    if other:
174
                        pt = [event.scenePos().x(), event.scenePos().y()]
175
                        dx = abs(pt[0] - other[0].center()[0])
176
                        dy = abs(pt[1] - other[0].center()[1])
177
                        if dx < dy:
178
                            pt[0] = other[0].center()[0]
179
                        else:
180
                            pt[1] = other[0].center()[1]
185 181

  
186
                self.connectedItem = None
182
                    self.setPos(pt)
183
                    if self.connectedItem is not None:
184
                        for connect in self.connectedItem.connectors:
185
                            if connect.connectedItem == self.parent:
186
                                connect.connectedItem = None
187 187

  
188
            ## unhighlight underitem
189
            if hasattr(self, '_underItem') and self._underItem is not None:
190
                self._underItem.hoverLeaveEvent(event)
191
            ## up to here
188
                    self.connectedItem = None
192 189

  
193
        if type(self.parent) is QEngineeringLineItem:
194
            self._savedPos = None 
195
            self._savedConnectedItem = None
190
                ## unhighlight underitem
191
                if hasattr(self, '_underItem') and self._underItem is not None:
192
                    self._underItem.hoverLeaveEvent(event)
193
                ## up to here
194

  
195
            if type(self.parent) is QEngineeringLineItem:
196
                self._savedPos = None 
197
                self._savedConnectedItem = None
198
                self.transfer.onPosChanged.emit(self)
199
        finally:
196 200
            self.ungrabKeyboard()
197
            self.transfer.onPosChanged.emit(self)
198 201

  
199 202
        QGraphicsEllipseItem.mouseReleaseEvent(self, event)
200 203

  
DTI_PID/DTI_PID/Shapes/EngineeringRunItem.py
1
# coding: utf-8
2
""" This is engineering run item moduel """
3

  
1 4
import sys
2 5
import os.path
3 6
import copy
......
15 18
from EngineeringAbstractItem import QEngineeringAbstractItem
16 19

  
17 20
class QEngineeringRunItem(QEngineeringAbstractItem):
21
    """ This is engineering run item class """
22

  
18 23
    def __init__(self):
19 24
        import uuid
20 25
        QEngineeringAbstractItem.__init__(self)
......
55 60
        self._items = value
56 61

  
57 62
    def explode(self):
58
        """ explode run """
63
        """ explode run and subtract it from line no """
59 64
        try:
60 65
            for item in self.items:
61 66
                item.owner = None
......
91 96
        for at in range(len(self.items)):
92 97
            if type(self.items[at]) is QEngineeringLineItem and at > 0:
93 98
                self.items[at].arrange_flow_direction(self.items[at-1])
99
            elif type(self.items[at]) is QEngineeringLineItem and len(self.items) > 1:
100
                self.items[at].arrange_flow_direction(self.items[at+1])
101
                self.items[at].reverse()
94 102

  
95 103
    def reverse(self):
96 104
        """ reverse line's flow direction """
97 105
        from EngineeringLineItem import QEngineeringLineItem
98 106

  
107
        self.items.reverse()
99 108
        for at in range(len(self.items)):
100 109
            if type(self.items[at]) is QEngineeringLineItem:
101 110
                self.items[at].reverse()
......
153 162

  
154 163
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
155 164
            App.mainWnd().addMessage.emit(MessageType.Error, message)
165
            return None
156 166

  
157 167
        return node
DTI_PID/DTI_PID/Shapes/EngineeringSpecBreakItem.py
173 173

  
174 174
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
175 175
            App.mainWnd().addMessage.emit(MessageType.Error, message)
176
            return None
176 177

  
177 178
        return node
DTI_PID/DTI_PID/Shapes/EngineeringTextItem.py
32 32
        QGraphicsTextItem.__init__(self, parent)
33 33
        QEngineeringAbstractItem.__init__(self)
34 34

  
35
        self.uid = uuid.uuid4() if uid is None else uid
35
        self.uid = uuid.uuid4() if uid is None else uuid.UUID(uid, version=4)
36 36
        self.loc = None
37 37
        self.size = None
38 38
        self.angle = 0  # angle in radian
......
152 152
                    humkyung 2018.08.18 rotate text when user press 'R'
153 153
    '''
154 154
    def keyPressEvent(self, event): 
155
        if event.key() == Qt.Key_Delete:
155
        if self.isSelected() and event.key() == Qt.Key_Delete:
156 156
            self.deleteTextItemFromScene()
157 157
        elif event.key() == Qt.Key_R:
158 158
            #degree 0
......
576 576
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
577 577
            App.mainWnd().addMessage.emit(MessageType.Error, message)
578 578

  
579
            return str(self.uid)
579
            return None
580 580

  
581 581
        return node 
582 582
    
DTI_PID/DTI_PID/Shapes/EngineeringUnknownItem.py
90 90
        @history    2018.06.18  Jeongwoo    Call deleteUnknownItemFromScene method
91 91
    '''
92 92
    def keyPressEvent(self, event): 
93
        if event.key() == Qt.Key_Delete:
93
        if self.isSelected() and event.key() == Qt.Key_Delete:
94 94
            self.deleteUnknownItemFromScene()
95 95

  
96 96
    '''
......
271 271
                lINode.text = 'False' + '#' + 'None' + '#' + 'None'
272 272
            node.append(lINode)
273 273
        except Exception as ex:
274
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
275
            return str(self.uid)
274
            from App import App
275
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
276
            App.mainWnd().addMessage.emit(MessageType.Error, message)
277
            return None
276 278

  
277 279
        return node 
278 280

  
DTI_PID/DTI_PID/Shapes/EngineeringVendorItem.py
29 29
        QGraphicsPolygonItem.__init__(self, polygon, parent)
30 30
        QEngineeringAbstractItem.__init__(self)
31 31

  
32
        self.uid = str(uuid.uuid4()) if uid is None else uid
32
        self.uid = str(uuid.uuid4()) if uid is None else uuid.UUID(uid, version=4)
33 33
        self.points = points
34 34

  
35 35
        self.isEntered = False
......
143 143
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
144 144
            App.mainWnd().addMessage.emit(MessageType.Error, message)
145 145

  
146
            return str(self.uid)
146
            return None
147 147

  
148 148
        return node 
149 149

  
DTI_PID/DTI_PID/Shapes/QEngineeringOPCItem.py
1 1
# coding: utf-8
2
""" This engineering opc item module """
2 3

  
3 4
import sys
4 5
import os
......
12 13
from EngineeringConnectorItem import QEngineeringConnectorItem
13 14

  
14 15
class QEngineeringOPCItem(SymbolSvgItem):
16
    """ This is engineering opc item class """
17

  
15 18
    clicked = pyqtSignal(QGraphicsSvgItem)
16
    #removed = pyqtSignal(QGraphicsItem)
17 19

  
18 20
    '''
19 21
    '''
DTI_PID/DTI_PID/Shapes/QEngineeringTrimLineNoTextItem.py
59 59
            for run in self.runs:
60 60
                node.append(run.toXml())
61 61
        except Exception as ex:
62
            return self.uid
63
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
62
            return None
64 63

  
65 64
        return node 
DTI_PID/DTI_PID/Shapes/SymbolSvgItem.py
37 37

  
38 38
        self.setFlags(QGraphicsItem.ItemIsSelectable|QGraphicsItem.ItemIsFocusable)#|QGraphicsItem.ItemIsMovable)
39 39

  
40
        self.uid = uuid.uuid4() if uid is None else uid
40
        self.uid = uuid.uuid4() if uid is None else uuid.UUID(uid, version=4)
41 41
        self.name = ''
42 42
        self.type = ''
43 43
        self.angle = 0
......
588 588
                    2018.05.25  Jeongwoo    Seperate delete item method
589 589
    '''
590 590
    def keyPressEvent(self, event):
591
        if event.key() == Qt.Key_Delete:
591
        if self.isSelected() and event.key() == Qt.Key_Delete:
592 592
            self.deleteSvgItemFromScene()
593 593
        elif event.key() == Qt.Key_R:
594 594
            self.rotateSymbol()
......
834 834
            currentPointModeIndexNode = Element('CURRENTPOINTMODEINDEX')
835 835
            currentPointModeIndexNode.text = str(self.currentPointModeIndex)
836 836
            node.append(currentPointModeIndexNode)
837

  
838 837
        except Exception as ex:
839 838
            from App import App 
840 839
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
841 840
            App.mainWnd().addMessage.emit(MessageType.Error, message)
842 841

  
843
            return str(self.uid)
842
            return None
844 843

  
845 844
        return node 
846 845

  
DTI_PID/DTI_PID/TextItemEditDialog.py
1 1
# coding: utf-8
2
""" This is text item edit dialog module """
3

  
2 4
import os
3 5
import sys
4 6
from PyQt5.QtCore import *
......
11 13
from EngineeringTextItem import QEngineeringTextItem
12 14

  
13 15
class QTextItemEditDialog(QDialog):
16
    """ This is text item edit dialog class """
17

  
14 18
    def __init__(self, parent):
15 19
        QDialog.__init__(self, parent)
16 20

  
......
34 38
    '''
35 39
    def findTextClicked(self):
36 40
        self.findText()
41
    
42
    def is_valid_uuid(self, text, version=4):
43
        """ Check if uuid_to_test is a valid UUID. """
44
        import uuid
45

  
46
        try:
47
            uuid_obj = uuid.UUID(text, version=version)
48
        except:
49
            return False
50

  
51
        return str(uuid_obj) == text
37 52

  
38 53
    '''
39 54
        @brief      find text
......
42 57
    '''
43 58
    def findText(self):
44 59
        text = self.ui.lineEditFindText.text()
45
        if text == '':
46
            return
47
        
48
        self.listIndex += 1
60
        if not text: return
49 61

  
50
        if self.prevText != text:
51
            self.prevText = text
52
            self.textItems = [item for item in self.mainWindow.graphicsView.scene.items() if type(item) is QEngineeringTextItem and item.text().count(text)]
53
            self.listIndex = 0
54
        elif self.textItems and self.listIndex == len(self.textItems):
55
            self.listIndex = 0
62
        if self.is_valid_uuid(text):
63
            matches = [item for item in self.mainWindow.graphicsView.scene.items() if hasattr(item, 'uid') and str(item.uid) == text]
64
            if matches: self.selectTextItem(matches[0])
65
        else:
66
            self.listIndex += 1
56 67

  
57
        if self.textItems:
58
            item = self.textItems[self.listIndex]
59
            self.selectTextItem(item)
68
            if self.prevText != text:
69
                self.prevText = text
70
                self.textItems = [item for item in self.mainWindow.graphicsView.scene.items() if type(item) is QEngineeringTextItem and item.text().count(text)]
71
                self.listIndex = 0
72
            elif self.textItems and self.listIndex == len(self.textItems):
73
                self.listIndex = 0
60 74

  
75
            if self.textItems:
76
                item = self.textItems[self.listIndex]
77
                self.selectTextItem(item)
61 78

  
62 79
    '''
63 80
        @brief      replace text
DTI_PID/DTI_PID/UI/dlgConnectAttr.ui
87 87
   </item>
88 88
  </layout>
89 89
 </widget>
90
 <tabstops>
91
  <tabstop>pushButtonStart</tabstop>
92
  <tabstop>listWidget</tabstop>
93
 </tabstops>
90 94
 <resources/>
91 95
 <connections>
92 96
  <connection>
DTI_PID/DTI_PID/XmlGenerator.py
1
# coding: utf-8
2
""" This is xml generator module """
3

  
1 4
from xml.etree.ElementTree import Element, SubElement, dump, ElementTree, parse
2 5
import symbol
3 6
import SymbolBase
......
360 363
                2018.11.26  euisung     remove scene dependency
361 364
'''
362 365
def writeXmlOnScene(pidName, pidWidth, pidHeight):
366
    from EngineeringAbstractItem import QEngineeringAbstractItem
363 367
    from EngineeringNoteItem import QEngineeringNoteItem
364 368
    from EngineeringTextItem import QEngineeringTextItem
365 369
    from EngineeringLineItem import QEngineeringLineItem
......
387 391
    unknownListNode = Element(UNKNOWNS_NODE_NAME)
388 392
    vendorListNode = Element(VENDOR_NODE_NAME)
389 393

  
394
    node_dictionary = {SymbolSvgItem:symbolListNode, QEngineeringTextItem:textInfoListNode, QEngineeringNoteItem:noteTextInfoListNode, 
395
        QEngineeringLineItem:lineListNode, QEngineeringLineNoTextItem:lineNoListNode, QEngineeringUnknownItem:unknownListNode,
396
        QEngineeringSizeTextItem:textInfoListNode, QEngineeringValveOperCodeTextItem:textInfoListNode, QEngineeringVendorItem:vendorListNode}
397

  
390 398
    # trim line 추가
391 399
    trimLineNoListNode = Element(TRIM_LINE_NOS_NODE_NAME)
392 400
    
393 401
    try:
394 402
        resultDic = {}
395
        resultDic["Symbol Item"] = [0, []]
396
        resultDic["Line Item"] = [0, []]
397
        resultDic["Line No Text Item"] = [0, []]
398
        resultDic["Text Item"] = [0, []]
399
        resultDic["Note Item"] = [0, []]
400
        resultDic["Unknown Item"] = [0, []]
401
        resultDic["Trim Line Item"] = [0, []]
402
        resultDic["Size Item"] = [0, []]
403
        resultDic["Valve Oper Code"] = [0, []]
404
        resultDic["Vendor Package"] = [0, []]
405 403

  
406 404
        for item in items:
407
            if issubclass(type(item), SymbolSvgItem):
408
                symbolNode = item.toXml()
409
                if symbolNode is None: continue
410
                if type(symbolNode) is str:
411
                    resultDic["Symbol Item"][1].append(symbolNode)
412
                else:
413
                    resultDic["Symbol Item"][0] += 1
414
                    symbolListNode.append(symbolNode)
415
            elif type(item) is QEngineeringLineItem:
416
                lineNode = item.toXml()
417
                if type(lineNode) is str:
418
                    resultDic["Line Item"][1].append(lineNode)
419
                else:
420
                    resultDic["Line Item"][0] += 1
421
                    lineListNode.append(lineNode)
422
            elif type(item) is QEngineeringLineNoTextItem:
423
                lineNoNode = item.toXml()
424
                if type(lineNoNode) is str:
425
                    resultDic["Line No Text Item"][1].append(lineNoNode)
426
                else:
427
                    resultDic["Line No Text Item"][0] += 1
428
                    lineNoListNode.append(lineNoNode)
429
            elif type(item) is QEngineeringTextItem:
430
                textNode = item.toXml()
431
                if type(textNode) is str:
432
                    resultDic["Text Item"][1].append(textNode)
433
                else:
434
                    resultDic["Text Item"][0] += 1
435
                    textInfoListNode.append(textNode)
436
            elif type(item) is QEngineeringNoteItem:
437
                noteNode = item.toXml(name = 'NOTE')
438
                if type(noteNode) is str:
439
                    resultDic["Note Item"][1].append(noteNode)
440
                else:
441
                    resultDic["Note Item"][0] += 1
442
                    noteTextInfoListNode.append(noteNode)
443
            elif type(item) is QEngineeringUnknownItem:
444
                unknownNode = item.toXml()
445
                if type(unknownNode) is str:
446
                    resultDic["Unknown Item"][1].append(unknownNode)
447
                else:
448
                    resultDic["Unknown Item"][0] += 1
449
                    unknownListNode.append(unknownNode)
405
            key = str(type(item))
406
            if not key in resultDic:
407
                resultDic[key] = [0, []]
408

  
409
            node = None
410
            if type(item) is QEngineeringNoteItem:
411
                node = item.toXml(name = 'NOTE')
450 412
            elif type(item) is QEngineeringSizeTextItem:
451
                sizeNode = item.toXml(name='SIZE')
452
                if type(sizeNode) is str:
453
                    resultDic["Size Item"][1].append(sizeNode)
454
                else:
455
                    resultDic["Size Item"][0] += 1
456
                    textInfoListNode.append(sizeNode)
413
                node = item.toXml(name='SIZE')
457 414
            elif type(item) is QEngineeringValveOperCodeTextItem:
458
                valve_oper_code = item.toXml(name='VALVE OPER CODE')
459
                if type(valve_oper_code) is str:
460
                    resultDic["Valve Oper Code"][1].append(valve_oper_code)
461
                else:
462
                    resultDic["Valve Oper Code"][0] += 1
463
                    textInfoListNode.append(valve_oper_code)
464
            elif type(item) is QEngineeringVendorItem:
465
                vendor_package = item.toXml()
466
                if type(vendor_package) is str:
467
                    resultDic["Vendor Package"][1].append(vendor_package)
468
                else:
469
                    resultDic["Vendor Package"][0] += 1
470
                    vendorListNode.append(vendor_package)
415
                node = item.toXml(name='VALVE OPER CODE')
416
            elif issubclass(type(item), QEngineeringAbstractItem):
417
                node = item.toXml()
418
            else:
419
                continue
420

  
421
            if node:
422
                resultDic[key][0] += 1
423
                if type(item) in node_dictionary: node_dictionary[type(item)].append(node)
424
            else:
425
                resultDic[key][1].append(str(item.uid))
426

  
471 427
        for line in appDocData.tracerLineNos:
472 428
            if type(line) is QEngineeringTrimLineNoTextItem:
473 429
                trimNode = line.toXml()
474
                if type(trimNode) is str:
475
                    resultDic["Trim Line Item"][1].append(trimNode)
476
                else:
477
                    resultDic["Trim Line Item"][0] += 1
430
                if trimNode:
431
                    resultDic[str(type(item))][0] += 1
478 432
                    trimLineNoListNode.append(trimNode)
433
                else:
434
                    resultDic[str(type(item))][1].append(str(line.uid))
479 435

  
480
    except Exception as ex:
481
        print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
482
    finally:
483 436
        xml.append(symbolListNode)
484 437
        xml.append(textInfoListNode)
485 438
        xml.append(noteTextInfoListNode)
......
489 442
        xml.append(trimLineNoListNode)
490 443
        xml.append(vendorListNode)
491 444
        ElementTree(xml).write(path)
445
    except Exception as ex:
446
        from App import App
447
        from AppDocData import MessageType
448

  
449
        message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
450
        App.mainWnd().addMessage.emit(MessageType.Error, message)
492 451

  
493 452
    return resultDic
494 453

  

내보내기 Unified diff

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