프로젝트

일반

사용자정보

통계
| 개정판:

hytos / DTI_PID / DTI_PID / TextItemFactory.py @ ff77e799

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

1
"""
2
This is TextItemFactor module
3
"""
4

    
5
from SingletonInstance import SingletonInstane
6
import re
7
try:
8
    from PyQt5.QtCore import *
9
    from PyQt5.QtGui import *
10
    from PyQt5.QtWidgets import *
11
except ImportError:
12
    try:
13
        from PyQt4.QtCore import *
14
        from PyQt4.QtGui import *
15
    except ImportError:
16
        raise ImportError("ImageViewerQt: Requires PyQt5 or PyQt4.")
17
from AppDocData import *
18
import sys, os
19
sys.path.insert(0, os.path.dirname(os.path.realpath(__file__)) + '\\Shapes')
20
from EngineeringTextItem import QEngineeringTextItem
21
from EngineeringLineNoTextItem import QEngineeringLineNoTextItem
22
from EngineeringNoteItem import QEngineeringNoteItem
23
from QEngineeringSizeTextItem import QEngineeringSizeTextItem
24
from QEngineeringTagNoTextItem import QEngineeringTagNoTextItem
25
from EngineeringValveOperCodeTextItem import QEngineeringValveOperCodeTextItem
26
from EngineeringReservedWordTextItem import QEngineeringReservedWordTextItem
27

    
28
class TextItemFactory(SingletonInstane):
29
    """ This is TextItemFactor class """
30
    def __init__(self):
31
        self.delimiter = '"'
32
        self.lineNoDelimiter = '!-!'
33

    
34
    '''
35
        @history    2018.04.27  Jeongwoo    Add condition on elif-statement (delimiter != '' and lineNoConfig != '')
36
                    humkyung 2018.05.02 create engineering size text item if condition matches
37
                    humkyung 2018.06.19 set line no's color
38
                    kyouho 2018.07.04 edit for isLineNo method (add parameter)
39
                    humkyung 2018.08.08 fill linePropertyData and tagSeqNoPattern if given data is None
40
                    euisung 2018.11.19  now textitemfactory set plain text in createTextItem() for allowables
41
    '''             
42
    def createTextItem(self, textInfo):
43
        import random
44
        from Configs import LineNoConfig
45

    
46
        item = None
47

    
48
        try:
49
            text = textInfo.getText()
50
            docData = AppDocData.instance()
51

    
52
            """ create normal text item if it is not in drawing area """
53
            area = docData.getArea('Drawing')
54
            if not area.contains([textInfo.getX(), textInfo.getY()]):
55
                item = QEngineeringTextItem()
56
                item.setToolTip(text)
57
                item.setPlainText(text)
58

    
59
            configs = docData.getConfigs('Size', 'Delimiter')
60
            sizeDelimiter = configs[0].value.upper() if 1 == len(configs) else None
61

    
62
            line_no_configs = LineNoConfig.instance()
63
            if line_no_configs:
64
                for line_no_config in line_no_configs:
65
                    result = line_no_config.parse(text)
66
                    if result[0]:
67
                        sizeUnit = line_no_config.unit
68
                        break
69
            else:
70
                result = (False,)
71

    
72
            if result[0]:
73
                item = QEngineeringLineNoTextItem()
74
                text = ''.join(result[1])
75
                item.setToolTip('<b>{}</b><br>LINE NO={}'.format(str(item.uid), text))
76
                item.setPlainText(text)
77

    
78
                # get color option
79
                configs = docData.getConfigs('Line Color', 'Visible Option')
80
                if configs:
81
                    visibleOption = configs[0].value
82
                else:
83
                    visibleOption = 'Random'
84

    
85
                configs = docData.getConfigs('Color Property', 'State')
86
                if configs:
87
                    color_property = configs[0].value
88

    
89
                # set line no color
90
                if visibleOption == 'Random':
91
                    colorCount = len(docData.colors)
92
                    if colorCount:
93
                        colorIdx = random.randrange(0, colorCount)
94
                        rgb = docData.colors[colorIdx]
95
                        item.change_color(QColor(rgb.red, rgb.green, rgb.blue).name())
96
                        #item.setColor(QColor(rgb.red, rgb.green, rgb.blue).name())
97
                else:
98
                    configs = docData.getConfigs('Line No', 'Configuration')
99
                    configs = configs[0].value.split(self.delimiter)
100

    
101
                    values = result[1]
102
                    index = configs.index(color_property)
103
                    if index >= 0:
104
                        value = values[index]
105
                        line_properties = docData.getLinePropertiesByUID(color_property)
106
                        if line_properties[0].Attribute.replace(' ','') == 'NominalDiameter':
107
                            if sizeUnit == "Inch":
108
                                value = docData.convertInchToMetric(value)
109

    
110
                        configs = docData.getConfigs(color_property, value)
111
                        if configs:
112
                            data = configs[0].value
113
                            rgb = data.split(',')
114
                            item.change_color(QColor(int(rgb[0]), int(rgb[1]), int(rgb[2])).name())
115
                    # up to here
116
            else:
117
                item = self.create_note_no_text(textInfo)
118
                if item:
119
                    pass
120
                elif self.isSizeText(text, sizeDelimiter):
121
                    item = QEngineeringSizeTextItem()
122
                    item.setToolTip('SIZE = {}'.format(text))
123
                    item.setPlainText(text)
124
                elif self.isTagNoText(text):
125
                    item = QEngineeringTagNoTextItem()
126
                    item.setToolTip('TAG NO = {}'.format(text))
127
                    item.setPlainText(text)
128
                elif self.is_valve_operation_code(text):
129
                    item = QEngineeringValveOperCodeTextItem()
130
                    item.setToolTip('Valve Operation Code = {}'.format(text))
131
                    item.setPlainText(text)
132
                elif self.is_reserved_word(text):
133
                    item = QEngineeringReservedWordTextItem()
134
                    item.setToolTip('Reserved Word = {}'.format(text))
135
                    item.setPlainText(text)
136
                else:
137
                    item = QEngineeringTextItem()
138
                    item.setToolTip(text)
139
                    item.setPlainText(text)
140
        except Exception as ex:
141
            from App import App
142

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

    
146
        return item
147
    
148
    '''
149
        @brief      Check Text startwith word
150
        @author     kyouho
151
        @date       2018.07.04
152
    '''
153
    def isStartWithWord(self, text, word):
154
        sliceText = text[0:len(word[0])]
155
        if sliceText == word[0]:
156
            return (True, text[len(sliceText):len(text)], word[1])
157
        else:
158
            return (False,)
159

    
160

    
161
    '''
162
        @brief      Check Text startwith number
163
        @author     kyouho
164
        @date       2018.07.05
165
    '''
166
    def isStartWithNumber(self, text):
167
        sliceText = text[0:1]
168
        num = ''
169
        if self.isNumber(sliceText):
170
            text = text[1:len(text)]
171
            num += text 
172
            while len(text) > 0:
173
                sliceText = text[0:1]
174
                
175
                if self.isNumber(sliceText):
176
                    text = text[1:len(text)]
177
                    num += text
178
                else:
179
                    break
180
            
181
            return (True, text, num)
182
        else:
183
            return (False,)
184

    
185
    '''
186
        @brief      Check Number
187
        @author     kyouho
188
        @date       2018.07.05
189
        @history    kyouho 2018.07.09   add Refular Expression
190
    '''
191
    def isNumber(self, num):
192
        p = re.compile('(^[0-9]+$)')
193
        result = p.match(num)
194

    
195
        if result:
196
            return True
197
        else:
198
            return False
199

    
200
    '''
201
        @brief      Check Number
202
        @author     kyouho
203
        @date       2018.07.05
204
    '''
205
    def isTagSeqNo(self, text, pattern):
206
        try:
207
            if pattern is not None:
208
                attr = text
209
                result = eval(pattern)
210
                if self.isNumber(result):
211
                    sliceText = text[0:len(result)]
212
                    return (True, text[len(sliceText):len(text)], sliceText)
213
                else:
214
                    return (False,)
215
            else:
216
                return (False,)
217
        except Exception as ex:
218
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))       
219
            
220
    '''
221
        @brief      Check Number
222
        @author     kyouho
223
        @date       2018.07.05
224
    '''
225
    def isLimitWord(self, text, pattern):
226
        try:
227
            if pattern is not None:
228
                attr = text
229
                length = pattern[0]
230
                isNumber = pattern[1]
231

    
232
                if length:  # Length가 있으면 Length만큼 문자열을 가져와 길이를 검사한다.
233
                    result = eval('attr[:' + str(length) + ']')
234
                    if int(length) != len(result):
235
                        return(False,)
236
                elif isNumber:
237
                    match = re.search(re.compile('^[0-9]+'), attr)
238
                    if match:
239
                        result = match.group(match.start()) 
240
                    else:
241
                        return (False,)
242
                else:
243
                    result = attr
244

    
245
                if isNumber:
246
                    if self.isNumber(result):
247
                        sliceText = text[0:len(result)]
248
                        return (True, text[len(sliceText):len(text)], sliceText)
249
                    else:
250
                        return (False,)
251
                else:
252
                    sliceText = text[0:len(result)]
253
                    return (True, text[len(sliceText):len(text)], sliceText)
254
            else:
255
                return (False,)
256
        except Exception as ex:
257
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))       
258

    
259
    '''
260
        @brief      Check if given text is Note No Text (ex : NOTE 1, NOTE 2, ...)
261
        @author     Jeongwoo
262
        @date       2018.04.26
263
        @history    2018.05.16  Jeongwoo    Modify Validator flag
264
    '''
265
    def create_note_no_text(self, textInfo):
266
        item = None
267

    
268
        appDocData = AppDocData.instance()
269
        configs = appDocData.getConfigs('Note No Tag Rule', 'Note No Expression')
270
        if 1 == len(configs) and configs[0].value:
271
            expression = configs[0].value
272
            match = re.search(re.compile(expression), textInfo.getText())
273

    
274
            if match:
275
                configs = appDocData.getConfigs('Note No Tag Rule', 'Note No Symbol Name')
276
                if 1 == len(configs) and configs[0].value:
277
                    symbol_names = configs[0].value.split(',')
278
                    for symbol in appDocData.symbols:
279
                        if symbol.name in symbol_names and symbol.includes(textInfo.center):
280
                            item = QEngineeringNoteItem(symbol=symbol)
281
                            break
282
                else:
283
                    item = QEngineeringNoteItem()
284

    
285
                if item:
286
                    item.setToolTip(textInfo.getText())
287
                    item.setPlainText(textInfo.getText())
288

    
289
        return item
290

    
291
    '''
292
        @brief  check if given text is size text
293
        @author humkyung
294
        @date   2018.05.02
295
    '''
296
    def isSizeText(self, text, delimiter=None):
297
        from NominalPipeSize import NominalPipeSizeTable
298

    
299
        pipe_sizes = NominalPipeSizeTable.instance().pipe_sizes
300

    
301
        tokens = text.upper().split(delimiter) if delimiter is not None else [text]
302
        for token in tokens:
303
            matches = [sizeData for sizeData in pipe_sizes if sizeData.find(token.strip())]
304
            if not matches: return False
305
        
306
        return True
307
    
308
    '''
309
        @brief  check if given text is tag no
310
        @author humkyung
311
        @date   2018.05.03
312
    '''
313
    def isTagNoText(self, text):
314
        from CodeTables import CodeTable
315

    
316
        found = CodeTable.instance('EqpTagNames').find_starts_with(text)
317

    
318
        return True if found else False
319

    
320
    def is_valve_operation_code(self, text):
321
        """
322
        check if given text is valve operation code
323
        """
324
        from CodeTables import CodeTable
325

    
326
        found = CodeTable.instance('ValveOperCodes').find_starts_with(text)
327

    
328
        return True if found else False
329

    
330
    def is_reserved_word(self, text):
331
        """ check if given text is reserved words """
332
        from CodeTables import CodeTable
333

    
334
        found = CodeTable.instance('ReservedWords').find_starts_with(text)
335

    
336
        return True if found else False
클립보드 이미지 추가 (최대 크기: 500 MB)