프로젝트

일반

사용자정보

통계
| 개정판:

hytos / DTI_PID / DTI_PID / Shapes / EngineeringInstrumentItem.py @ 56eeffb4

이력 | 보기 | 이력해설 | 다운로드 (9.51 KB)

1
# coding: utf-8
2
"""
3
This is Engineering Instrument Item module
4
"""
5

    
6
import sys
7
import os
8
import math
9
from PyQt5.QtGui import *
10
from PyQt5.QtCore import *
11
from PyQt5.QtSvg import *
12
from PyQt5.QtWidgets import (QApplication, QGraphicsItem)
13

    
14
from SymbolSvgItem import SymbolSvgItem
15
from EngineeringAbstractItem import QEngineeringAbstractItem
16
from EngineeringConnectorItem import QEngineeringConnectorItem
17
from EngineeringTextItem import QEngineeringTextItem
18
from UserInputAttribute import UserInputAttribute
19

    
20

    
21
class QEngineeringInstrumentItem(SymbolSvgItem):
22
    """ This is Engineering Instrument Item class """
23
    clicked = pyqtSignal(QGraphicsSvgItem)
24
    INST_COLUMN_LIST = None
25
    INST_COLOR = None
26

    
27
    '''
28
    '''
29

    
30
    def __init__(self, path, uid=None, flip=0):
31
        SymbolSvgItem.__init__(self, None, path, uid, flip=flip)
32

    
33
        self._measuredVairableCode = None
34
        self._typeModifier = None
35
        self._tagSeqNo = None
36
        self._tagSuffix = None
37

    
38
        '''
39
        if QEngineeringInstrumentItem.INST_COLUMN_LIST is None:
40
            from AppDocData import AppDocData
41

42
            appDocData = AppDocData.instance()
43
            QEngineeringInstrumentItem.INST_COLUMN_LIST = appDocData.getColNames('INSTRUMENT_DATA_LIST')
44
        '''
45

    
46
    '''
47
        @brief  getter of measured variable code
48
        @author humkyung
49
        @date   2018.05.06
50
    '''
51

    
52
    @property
53
    def measuredVariableCode(self):
54
        return self._measuredVairableCode
55

    
56
    '''
57
        @brief  setter of measured variable code
58
        @author humkyung
59
        @date   2018.05.06
60
    '''
61

    
62
    @measuredVariableCode.setter
63
    def measuredVariableCode(self, value):
64
        self._measuredVairableCode = value
65

    
66
    '''
67
        @brief  getter of type modifier
68
        @author humkyung
69
        @date   2018.05.06
70
    '''
71

    
72
    @property
73
    def typeModifier(self):
74
        return self._typeModifier
75

    
76
    '''
77
        @brief  setter of type modifier
78
        @author humkyung
79
        @date   2018.05.06
80
    '''
81

    
82
    @typeModifier.setter
83
    def typeModifier(self, value):
84
        self._typeModifier = value
85

    
86
    '''
87
        @brief  getter of tag seq no
88
        @author humkyung
89
        @date   2018.05.06
90
    '''
91

    
92
    @property
93
    def tagSeqNo(self):
94
        return self._tagSeqNo
95

    
96
    '''
97
        @brief  setter of tag seq no
98
        @author humkyung
99
        @date   2018.05.06
100
    '''
101

    
102
    @tagSeqNo.setter
103
    def tagSeqNo(self, value):
104
        self._tagSeqNo = value
105

    
106
    '''
107
        @brief  getter of tag suffix
108
        @author humkyung
109
        @date   2018.05.06
110
    '''
111

    
112
    @property
113
    def tagSuffix(self):
114
        return self._tagSuffix
115

    
116
    '''
117
        @brief  setter of tag suffix
118
        @author humkyung
119
        @date   2018.05.06
120
    '''
121

    
122
    @tagSuffix.setter
123
    def tagSuffix(self, value):
124
        self._tagSuffix = value
125

    
126
    def highlight(self, flag):
127
        """ highlight/unhighlight the instrument """
128

    
129
        try:
130
            self.hover = flag
131
            self.update()
132

    
133
            for assoc in self.associations():
134
                assoc.highlight(flag)
135

    
136
            for connector in self.connectors:
137
                connector.highlight(flag)
138
        except Exception as ex:
139
            from App import App
140
            from AppDocData import MessageType
141

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

    
146
    '''
147
        @brief  connect attribute
148
        @author humkyung
149
        @date   2018.05.06
150
    '''
151

    
152
    def connectAttribute(self, attributes, clear=True):
153
        from AppDocData import AppDocData
154

    
155
        try:
156
            if clear:
157
                if not self.clear_attr_and_assoc_item():
158
                    return
159

    
160
            rect = self.sceneBoundingRect()
161

    
162
            minDist = None
163
            selected = None
164

    
165
            configs = AppDocData.instance().getConfigs('Range', 'Detection Ratio')
166
            ratio = float(configs[0].value) if 1 == len(configs) else 1.5
167

    
168
            dist = (self.sceneBoundingRect().height() + self.sceneBoundingRect().width()) * ratio / 2
169
            center = [self.origin[0], self.origin[1]]
170

    
171
            for attr in attributes:
172
                if issubclass(type(attr), QEngineeringTextItem):
173
                    if rect.contains(attr.center()):
174
                        if self.add_assoc_item(attr):
175
                            attr.owner = self  # set owner of text
176

    
177
                elif issubclass(type(attr), SymbolSvgItem) and attr is not self:
178
                    dx = attr.origin[0] - center[0]
179
                    dy = attr.origin[1] - center[1]
180

    
181
                    length = math.sqrt(dx * dx + dy * dy)
182

    
183
                    if (length < dist) and (minDist is None or length < minDist):
184
                        minDist = length
185
                        selected = attr
186

    
187
            if selected is not None:
188
                self.add_assoc_item(selected)
189

    
190
        except Exception as ex:
191
            from App import App
192
            from AppDocData import MessageType
193

    
194
            message = 'error occurred({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename,
195
                                                          sys.exc_info()[-1].tb_lineno)
196
            App.mainWnd().addMessage.emit(MessageType.Error, message)
197

    
198
    '''
199
        @brief  generate xml code for attribute
200
        @author humkyung
201
        @date   2018.05.06
202
    '''
203

    
204
    def toXmlAsAttribute(self, parentNode):
205
        from xml.etree.ElementTree import Element, SubElement, dump, ElementTree
206

    
207
        try:
208
            attrNode = Element('ATTRIBUTE')
209

    
210
            uidNode = Element('UID')
211
            uidNode.text = str(self.uid)
212
            attrNode.append(uidNode)
213

    
214
            nameNode = Element('NAME')
215
            nameNode.text = 'Measured Variable Code'
216
            attrNode.append(nameNode)
217

    
218
            valueNode = Element('VALUE')
219
            valueNode.text = self.measuredVariableCode
220
            attrNode.append(valueNode)
221

    
222
            parentNode.append(attrNode)
223
        except Exception as ex:
224
            print('error occurred({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename,
225
                                                      sys.exc_info()[-1].tb_lineno))
226

    
227
        try:
228
            attrNode = Element('ATTRIBUTE')
229

    
230
            uidNode = Element('UID')
231
            uidNode.text = str(self.uid)
232
            attrNode.append(uidNode)
233

    
234
            nameNode = Element('NAME')
235
            nameNode.text = 'Type Modifier'
236
            attrNode.append(nameNode)
237

    
238
            valueNode = Element('VALUE')
239
            valueNode.text = self.typeModifier
240
            attrNode.append(valueNode)
241

    
242
            parentNode.append(attrNode)
243
        except Exception as ex:
244
            print('error occurred({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename,
245
                                                      sys.exc_info()[-1].tb_lineno))
246

    
247
        try:
248
            attrNode = Element('ATTRIBUTE')
249

    
250
            uidNode = Element('UID')
251
            uidNode.text = str(self.uid)
252
            attrNode.append(uidNode)
253

    
254
            nameNode = Element('NAME')
255
            nameNode.text = 'Tag Seq No'
256
            attrNode.append(nameNode)
257

    
258
            valueNode = Element('VALUE')
259
            valueNode.text = self.tagSeqNo
260
            attrNode.append(valueNode)
261

    
262
            parentNode.append(attrNode)
263
        except Exception as ex:
264
            print('error occurred({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename,
265
                                                      sys.exc_info()[-1].tb_lineno))
266

    
267
        try:
268
            attrNode = Element('ATTRIBUTE')
269

    
270
            uidNode = Element('UID')
271
            uidNode.text = str(self.uid)
272
            attrNode.append(uidNode)
273

    
274
            nameNode = Element('NAME')
275
            nameNode.text = 'Tag Suffix'
276
            attrNode.append(nameNode)
277

    
278
            valueNode = Element('VALUE')
279
            valueNode.text = self.tagSuffix
280
            attrNode.append(valueNode)
281

    
282
            parentNode.append(attrNode)
283
        except Exception as ex:
284
            print('error occurred({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename,
285
                                                      sys.exc_info()[-1].tb_lineno))
286

    
287
    '''
288
        @brief      return inst Data List
289
        @author     kyouho
290
        @date       2018.08.14
291
    '''
292

    
293
    def getInstrumentDataList(self):
294
        dataList = []
295
        try:
296
            from AppDocData import AppDocData
297

    
298
            docData = AppDocData.instance()
299
            attrs = self.getAttributes()
300

    
301
            for index in range(len(QEngineeringInstrumentItem.INST_COLUMN_LIST)):
302
                dataList.append('')
303

    
304
            dataList[0] = str(self.uid)
305
            dataList[13] = docData.imgName
306

    
307
            for key in attrs.keys():
308
                attrInfo = docData.getSymbolAttributeByUID(key.UID)
309
                attrName = attrInfo.Attribute
310
                if attrName in QEngineeringInstrumentItem.INST_COLUMN_LIST:
311
                    colIndex = QEngineeringInstrumentItem.INST_COLUMN_LIST.index(attrName)
312
                    dataList[colIndex] = attrs[key]
313
        except Exception as ex:
314
            from App import App
315
            from AppDocData import MessageType
316

    
317
            message = 'error occurred({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename,
318
                                                          sys.exc_info()[-1].tb_lineno)
319
            App.mainWnd().addMessage.emit(MessageType.Error, message)
320

    
321
        return dataList