프로젝트

일반

사용자정보

통계
| 개정판:

hytos / DTI_PID / DTI_PID / AppDocData.py @ ff3d1c7a

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

1
# coding: utf-8
2

    
3
import sys
4
import os
5
from PyQt5.QtCore import *
6
import sqlite3
7
import datetime
8
from PIL import PngImagePlugin, JpegImagePlugin
9
from PIL import Image
10
from PIL.ImageQt import ImageQt
11

    
12
try:
13
    from PyQt5.QtCore import QBuffer
14
    from PyQt5.QtGui import QImage, QPixmap
15
except ImportError:
16
    from PyQt4.QtCore import QBuffer
17
    from PyQt4.QtGui import QImage, QPixmap
18
import numpy as np
19

    
20
from SingletonInstance import SingletonInstane
21
import Project
22
import SymbolBase
23
import symbol
24
from EquipmentData import EquipmentData
25

    
26
class Source:
27
    def __init__(self, source):
28
        if type(source) is np.ndarray:
29
            self.source = Image.fromarray(source)
30
        elif type(source) is PngImagePlugin.PngImageFile or type(source) is JpegImagePlugin.JpegImageFile:
31
            self.source = source
32
        elif type(source) is QImage:
33
            self.source = Image.fromqimage(source)
34
        elif type(source) is QPixmap:
35
            self.source = Image.fromqpixmap(source)
36
            
37
    def getPyImageOnRect(self, rect):
38
        return self.source.copy().crop((rect.left(), rect.top(), rect.right(), rect.bottom()))
39

    
40
    def getQImageOnRect(self, rect):
41
        image = ImageQt(self.getPyImageOnRect(rect))
42
        return image.convertToFormat(QImage.Format_RGBA8888)
43

    
44
class Area:
45
    def __init__(self):
46
        self.name = None
47
        self.x = None
48
        self.y = None
49
        self.width = None
50
        self.height = None
51
    
52
    '''
53
        @brief  clone an object
54
    '''
55
    def clone(self):
56
        clone = Area()
57
        clone.x = self.x
58
        clone.y = self.y
59
        clone.width = self.width
60
        clone.height = self.height
61

    
62
class Config:
63
    def __init__(self, section, key, value):
64
        self.section = section
65
        self.key = key
66
        self.value = value
67

    
68
class NominalPipeSize:
69
    def __init__(self, code, metric, inch, inchStr, metricStr):
70
        self.code = code
71
        self.metric = metric
72
        self.inch = inch
73
        self.inchStr = inchStr
74
        self.metricStr = metricStr
75
        self.sizeUnit = 'Metric'
76

    
77
    '''
78
        @brief  return size value string
79
        @author humkyung
80
        @date   2018.04.24
81
    '''
82
    def sizeValue(self):
83
        return self.inchStr if 'Inch' == self.sizeUnit else self.metricStr
84

    
85
class AppDocData(SingletonInstane):
86
    def __init__(self):
87
        self.imgName = None
88
        self.imgWidth = 0
89
        self.imgHeight = 0
90

    
91
        self._areas = []
92
        self.equipments = []
93
        self.equipmentDataList = []
94
        self.lineNos = []
95

    
96
    def setCurrentPidSource(self, image):
97
        self.currentPidSource = Source(image)
98

    
99
    def getCurrentPidSource(self):
100
        return self.currentPidSource
101

    
102
    '''
103
        @brief      Check if Exist data or not, Moved from SG_DbHelper
104
        @author     Jeongwoo
105
        @date       2018.05.03
106
    '''
107
    def isExistData(self, fieldName, data):
108
        rows = None
109
        try:
110
            dbPath = self.getCurrentProject().getDbFilePath() + "/ITI_PID.db"
111

    
112
            conn = sqlite3.connect(dbPath)
113
            cursor = conn.cursor()
114
            sql = ""
115
            if isinstance(data, str):
116
                sql = "SELECT * FROM Symbol WHERE " + fieldName + " = '"+ data +"'"
117
            else:
118
                sql = "SELECT * FROM Symbol WHERE " + fieldName + " = "+ str(data) +""
119
            cursor.execute(sql)
120
            rows = cursor.fetchall()
121
        # Catch the exception
122
        except Exception as ex:
123
            # Roll back any change if something goes wrong
124
            conn.rollback()
125
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
126
        finally:
127
            conn.close()
128
            if rows is not None and len(rows) > 0:
129
                return True
130
            else:
131
                return False
132

    
133
    '''
134
        @brief      Check if exist file name or not, Moved from SG_DbHelper
135
        @author     Jeongwoo
136
        @date       2018.05.03
137
    '''
138
    def isExistFileName(self, name):
139
        rows = None
140
        try:
141
            dbPath = self.getCurrentProject().getDbFilePath() + "/ITI_PID.db"
142
            conn = sqlite3.connect(dbPath)
143
            cursor = conn.cursor()
144
            sql = "SELECT * FROM Symbol WHERE name = '"+ name +"'"
145
            cursor.execute(sql)
146
            rows = cursor.fetchall()
147
        # Catch the exception
148
        except Exception as ex:
149
            # Roll back any change if something goes wrong
150
            conn.rollback()
151
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
152
        finally:
153
            conn.close()
154
            if rows is not None and len(rows) > 0:
155
                return True
156
            else:
157
                return False
158

    
159
    '''
160
        @brief      Insert new symbol into Symbol Table, Moved from SG_DbHelper
161
        @author     Jeongwoo
162
        @date       2018.05.03
163
    '''
164
    def insertSymbol(self, symbol):
165
        isAdded = False
166
        try:
167
            dbPath = self.getCurrentProject().getDbFilePath() + "/ITI_PID.db"
168
            conn = sqlite3.connect(dbPath)
169
            
170
            INSERT_SYMBOL_SQL = '''
171
                INSERT INTO Symbol(symId, name, type, threshold, minMatchPoint, isDetectOrigin, rotationCount, ocrOption, isContainChild, originalPoint, connectionPoint, baseSymbol, additionalSymbol, isExceptDetect) 
172
                VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
173
            '''
174

    
175
            cursor = conn.cursor()
176
            query = (symbol.getId(), symbol.getName(), symbol.getType(), symbol.getThreshold()
177
                           , symbol.getMinMatchCount(), symbol.getIsDetectOnOrigin(), symbol.getRotationCount()
178
                           , symbol.getOcrOption(), symbol.getIsContainChild()
179
                           , symbol.getOriginalPoint(), symbol.getConnectionPoint()
180
                           , symbol.getBaseSymbol(), symbol.getAdditionalSymbol(), symbol.getIsExceptDetect())
181
            cursor.execute(INSERT_SYMBOL_SQL, query)
182
            conn.commit()
183
            isAdded = True
184
        # Catch the exception
185
        except Exception as ex:
186
            # Roll back any change if something goes wrong
187
            conn.rollback()
188
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
189
        finally:
190
            conn.close()
191
            return (isAdded, symbol.getType(), symbol.getName(), symbol.getPath())
192

    
193
    '''
194
        @brief      Update symbol in Symbol Table, Moved from SG_DbHelper
195
        @author     Jeongwoo
196
        @date       2018.05.03
197
    '''
198
    def updateSymbol(self, symbol):
199
        isUpdated = False
200
        try:
201
            dbPath = self.getCurrentProject().getDbFilePath() + "/ITI_PID.db"
202
            conn = sqlite3.connect(dbPath)
203
            
204
            UPDATE_SYMBOL_SQL = '''
205
                UPDATE Symbol
206
                SET
207
                    symId = ?, name = ?, type = ?, threshold = ?, minMatchPoint = ?, isDetectOrigin = ?,
208
                    rotationCount = ?, ocrOption = ?, isContainChild = ?, originalPoint = ?, connectionPoint = ?,
209
                    baseSymbol = ?, additionalSymbol = ?, isExceptDetect = ?
210
                WHERE uid = ?
211
            '''
212
            
213
            cursor = conn.cursor()
214
            query = (symbol.getId(), symbol.getName(), symbol.getType(), symbol.getThreshold()
215
                           , symbol.getMinMatchCount(), symbol.getIsDetectOnOrigin(), symbol.getRotationCount()
216
                           , symbol.getOcrOption(), symbol.getIsContainChild()
217
                           , symbol.getOriginalPoint(), symbol.getConnectionPoint()
218
                           , symbol.getBaseSymbol(), symbol.getAdditionalSymbol(), symbol.getIsExceptDetect(), symbol.getUid())
219
            cursor.execute(UPDATE_SYMBOL_SQL, query)
220
            conn.commit()
221
            isUpdated = True
222
        # Catch the exception
223
        except Exception as ex:
224
            # Roll back any change if something goes wrong
225
            conn.rollback()
226
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
227
        finally:
228
            conn.close()
229
            return (isUpdated, symbol.getType(), symbol.getName(), symbol.getPath())
230

    
231
    '''
232
        @brief      Get Detecting Target Symbol List (Field 'isExceptDetect' == False(0))
233
        @author     Jeongwoo
234
        @date       18.04.24
235
    '''
236
    def getTargetSymbolList(self):
237
        targetSymbolList = []
238

    
239
        try:
240
            dbPath = self.getCurrentProject().getDbFilePath() + "/ITI_PID.db"
241

    
242
            conn = sqlite3.connect(dbPath)
243
            cursor = conn.cursor()
244
            sql = 'SELECT * FROM Symbol WHERE isExceptDetect = 0'
245
            try:
246
                cursor.execute(sql)
247
                rows = cursor.fetchall()
248
                for row in rows:
249
                    sym = symbol.SymbolBase(row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8], row[9], row[10], row[11], row[12], row[13], row[14], row[0]) ## uid is last item
250
                    targetSymbolList.append(sym)
251
            except Exception as ex:
252
                print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
253
        finally:
254
            conn.close()
255

    
256
        return targetSymbolList
257

    
258
    '''
259
        @brief  build application database
260
        @author humkyung
261
        @date   2018.04.20
262
    '''
263
    def buildAppDatabase(self):
264
        try:
265
            path = os.path.join(os.getenv('ALLUSERSPROFILE'), 'Digital PID')
266
            appDatabaseFilePath = os.path.join(path, 'App.db')
267

    
268
            # Creates or opens a file called mydb with a SQLite3 DB
269
            conn = sqlite3.connect(appDatabaseFilePath)
270
            # Get a cursor object
271
            cursor = conn.cursor()
272

    
273
            sqlFiles = ['App.Configuration.sql', 'App.Styles.sql']
274
            for sqlFile in sqlFiles:
275
                filePath = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'Scripts', sqlFile)
276
                try:
277
                    file = QFile(filePath)
278
                    file.open(QFile.ReadOnly)
279
                    sql = file.readAll()
280
                    sql = str(sql, encoding='utf8')
281
                    cursor.executescript(sql)
282
                finally:
283
                    file.close()
284
            conn.commit()
285
        # Catch the exception
286
        except Exception as ex:
287
            # Roll back any change if something goes wrong
288
            conn.rollback()
289
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
290
        finally:
291
            # Close the db connection
292
            conn.close()
293

    
294
    '''
295
        @brief  load app style
296
        @author humkyung
297
        @date   2018.04.20
298
    '''
299
    def loadAppStyle(self):
300
        style = 'Fusion'
301

    
302
        path = os.path.join(os.getenv('ALLUSERSPROFILE'), 'Digital PID')
303
        if not os.path.exists(path): os.makedirs(path)
304

    
305
        self.buildAppDatabase()
306
        try:
307
            appDatabaseFilePath = os.path.join(path, 'App.db')
308
            # Creates or opens a file called mydb with a SQLite3 DB
309
            conn = sqlite3.connect(appDatabaseFilePath)
310
            # Get a cursor object
311
            cursor = conn.cursor()
312

    
313
            sql = "select Value from Configuration where Section='App' and Key='Style'" 
314
            cursor.execute(sql)
315
            rows = cursor.fetchall()
316
            style = rows[0][0] if 1 == len(rows) else 'Fusion'
317
        # Catch the exception
318
        except Exception as ex:
319
            # Roll back any change if something goes wrong
320
            conn.rollback()
321
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
322
        finally:
323
            # Close the db connection
324
            conn.close()
325

    
326
        return style
327

    
328
    '''
329
        @brief  load app styles and then return a list
330
        @author humkyung
331
        @date   2018.04.20
332
    '''
333
    def loadAppStyles(self):
334
        styles = []
335

    
336
        try:
337
            self.buildAppDatabase()
338

    
339
            path = os.path.join(os.getenv('ALLUSERSPROFILE'), 'Digital PID')
340
            appDatabaseFilePath = os.path.join(path, 'App.db')
341

    
342
            # Creates or opens a file called mydb with a SQLite3 DB
343
            conn = sqlite3.connect(appDatabaseFilePath)
344
            # Get a cursor object
345
            cursor = conn.cursor()
346

    
347
            sql = 'select UID,Value from Styles'
348
            cursor.execute(sql)
349
            rows = cursor.fetchall()
350
            for row in rows: styles.append(row[1])
351
            if 0 == len(rows): rows.append('fusion')
352
        # Catch the exception
353
        except Exception as ex:
354
            # Roll back any change if something goes wrong
355
            conn.rollback()
356
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
357
        finally:
358
            # Close the db connection
359
            conn.close()
360

    
361
        return styles
362

    
363
    '''
364
        @brief  Set current Project
365
    '''
366
    def setCurrentProject(self, project):
367
        self.project = project
368

    
369
        try:
370
            # Creates or opens a file called mydb with a SQLite3 DB
371
            dbPath = self.getCurrentProject().getDbFilePath() + "/ITI_PID.db"
372
            conn = sqlite3.connect(dbPath)
373
            # Get a cursor object
374
            cursor = conn.cursor()
375

    
376
            fileNames = os.listdir(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'Scripts'))
377
            for fileName in fileNames:
378
                if fileName.endswith(".sql") and (1 == len(os.path.splitext(fileName)[0].split('.'))):
379
                    try:
380
                        file = QFile(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'Scripts', fileName))
381
                        file.open(QFile.ReadOnly)
382
                        sql = file.readAll()
383
                        sql = str(sql, encoding='utf8')
384
                        cursor.executescript(sql)
385
                    finally:
386
                        file.close()
387
            conn.commit()
388
        # Catch the exception
389
        except Exception as ex:
390
            # Roll back any change if something goes wrong
391
            conn.rollback()
392
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
393
        finally:
394
            # Close the db connection
395
            conn.close()
396

    
397
    '''
398
        @brief  Get current Project
399
    '''
400
    def getCurrentProject(self):
401
        return self.project
402

    
403
    '''
404
        @brief      return project database path
405
        @history    humkyung 2018.04.19 return Project.db in Program Data folder instead of PROJECT_DB_PATH variable
406
    '''
407
    def getPrjDatabasePath(self):
408
        path = os.path.join(os.getenv('ALLUSERSPROFILE'), 'Digital PID')
409
        if not os.path.exists(path): os.makedirs(path)
410

    
411
        prjDatabaseFilePath = os.path.join(path, 'Project.db')
412
        try:
413
            # Creates or opens a file called mydb with a SQLite3 DB
414
            conn = sqlite3.connect(prjDatabaseFilePath)
415
            # Get a cursor object
416
            cursor = conn.cursor()
417

    
418
            filePath = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'Scripts', 'Project.Projects.sql')
419
            try:
420
                file = QFile(filePath)
421
                file.open(QFile.ReadOnly)
422
                sql = file.readAll()
423
                sql = str(sql, encoding='utf8')
424
                cursor.executescript(sql)
425
            finally:
426
                file.close()
427
            conn.commit()
428
        # Catch the exception
429
        except Exception as ex:
430
            # Roll back any change if something goes wrong
431
            conn.rollback()
432
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
433
        finally:
434
            # Close the db connection
435
            conn.close()
436
        
437
        return prjDatabaseFilePath
438

    
439
    '''
440
        @brief  return line properties
441
        @author humkyung
442
        @date   2018.04.09
443
    '''
444
    def getLineProperties(self):
445
        res = []
446
        try:
447
            # Creates or opens a file called mydb with a SQLite3 DB
448
            dbPath = os.path.join(self.getCurrentProject().getDbFilePath(), 'ITI_PID.db')
449
            db = sqlite3.connect(dbPath)
450
            # Get a cursor object
451
            cursor = db.cursor()
452

    
453
            sql = "select Name from LineProperties order by Name" 
454
            cursor.execute(sql)
455
            rows = cursor.fetchall()
456
            for row in rows:
457
                res.append(row[0])
458
        # Catch the exception
459
        except Exception as ex:
460
            # Roll back any change if something goes wrong
461
            db.rollback()
462
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
463
        finally:
464
            # Close the db connection
465
            db.close()
466

    
467
        return res
468

    
469
    '''
470
        @brief      Insert New Project Info
471
        @author     Jeongwoo
472
        @date       2018.04.06
473
        @history    humkyung 2018.04.19 use getPrjDatabasePath function instead of PROJECT_DB_PATH variable
474
    '''
475
    def insertProjectInfo(self, dir):
476
        try:
477
            prjDatabaseFilePath = self.getPrjDatabasePath()
478
            conn = sqlite3.connect(prjDatabaseFilePath)
479
            folderName = dir.split('/')[-1]
480
            if folderName:
481
                nowDate = datetime.datetime.now().strftime('%Y.%m.%d %H:%M')
482
                sql = "INSERT INTO Projects(Name, Path, CreatedDate, UpdatedDate) VALUES('" + folderName + "', '" + dir + "', '" + nowDate + "', '" + nowDate + "')"
483
                cur = conn.cursor()
484
                cur.execute(sql)
485
                conn.commit()
486
            else:
487
                print("Empty folder name")
488
        except Exception as ex:
489
            # Roll back any change if something goes wrong
490
            conn.rollback()
491
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
492
        finally:
493
            conn.close()
494

    
495
    '''
496
        @brief      Update Project UpdatedDate Field
497
        @author     Jeongwoo
498
        @date       2018.04.06
499
        @history    humkyung 2018.04.19 use getPrjDatabasePath function instead of PROJECT_DB_PATH variable
500
    '''
501
    def updateProjectUpdatedDate(self, id):
502
        try:
503
            prjDatabaseFilePath = self.getPrjDatabasePath()
504
            conn = sqlite3.connect(prjDatabaseFilePath)
505
            nowDate = datetime.datetime.now().strftime('%Y.%m.%d %H:%M')
506
            sql = '''
507
                UPDATE Projects
508
                SET UpdatedDate = ?
509
                WHERE Id = ?
510
            '''
511
            cur = conn.cursor()
512
            cur.execute(sql, (nowDate, id))
513
            conn.commit()
514
        except Exception as ex:
515
            # Roll back any change if something goes wrong
516
            conn.rollback()
517
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
518
        finally:
519
            conn.close()
520

    
521
    '''
522
        @brief  get project list from database
523
        @history    humkyung 2018.04.18 add only project which's project exists
524
    '''
525
    def getProjectList(self):
526
        from Project import Project
527

    
528
        projectList = []
529

    
530
        try:
531
            conn = sqlite3.connect(self.getPrjDatabasePath())
532
            cursor = conn.cursor()
533
            sql = 'SELECT id,name,path,createddate,updateddate  FROM Projects ORDER BY UpdatedDate DESC'
534
            try:
535
                cursor.execute(sql)
536
                rows = cursor.fetchall()
537
                for row in rows:
538
                    if os.path.isdir(row[2]):   # check if folder exists
539
                        projectList.append(Project(row[0], row[1], row[2], row[3], row[4]))
540
            except Exception as ex:
541
                print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
542
        finally:
543
            conn.close()
544

    
545
        return projectList
546

    
547
    '''
548
        @brief  get sliding window size
549
        @author humkyung
550
    '''
551
    def getSlidingWindowSize(self):
552
        res = [10,10]
553
        try:
554
            configs = self.getConfigs('Sliding Window')
555
            for config in configs:
556
                if config.key == 'Width':
557
                    res[0] = int(config.value)
558
                elif config.key == 'Height':
559
                    res[1] = int(config.value)
560
        # Catch the exception
561
        except Exception as ex:
562
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
563
        
564
        return res
565

    
566
    '''
567
        @brief  get line no configuration
568
        @author humkyung
569
        @date   2018.04.16
570
    '''
571
    def getLineNoConfiguration(self):
572
        res = None
573
        try:
574
            # Creates or opens a file called mydb with a SQLite3 DB
575
            dbPath = os.path.join(self.getCurrentProject().getDbFilePath(), 'ITI_PID.db')
576
            conn = sqlite3.connect(dbPath)
577
            # Get a cursor object
578
            cursor = conn.cursor()
579

    
580
            delimiter = None
581
            sql = "select * from configuration where section='Line No' and key='Delimiter"
582
            cursor.execute(sql)
583
            rows = cursor.fetchall()
584
            if len(rows) == 1:
585
                delimiter = rows[0][2]
586

    
587
            if delimiter is not None:
588
                sql = "select * from configuration where section='Line No' and key='Configuration'"
589
                cursor.execute(sql)
590
                rows = cursor.fetchall()
591
                if len(rows) == 1:
592
                    res = rows[0][2].split(delimiter)
593
        # Catch the exception
594
        except Exception as ex:
595
            # Roll back any change if something goes wrong
596
            conn.rollback()
597
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
598
        finally:
599
            # Close the db connection
600
            conn.close()
601
        
602
        return res
603

    
604
    '''
605
        @brief  get area list
606
        @author humkyung
607
    '''
608
    def getAreaList(self):
609
        if len(self._areas) == 0:
610
            try:
611
                # Creates or opens a file called mydb with a SQLite3 DB
612
                dbPath = self.getCurrentProject().getDbFilePath() + "/ITI_PID.db"
613
                conn = sqlite3.connect(dbPath)
614
                # Get a cursor object
615
                cursor = conn.cursor()
616

    
617
                sql = "select * from configuration where section='Area'"
618
                cursor.execute(sql)
619
                rows = cursor.fetchall()
620
                for row in rows:
621
                    area = Area()
622
                    area.name = row[1]
623
                    tokens = row[2].split(',')
624
                    area.x = float(tokens[0])
625
                    area.y = float(tokens[1])
626
                    area.width = float(tokens[2])
627
                    area.height = float(tokens[3])
628
                    self._areas.append(area)
629
            # Catch the exception
630
            except Exception as ex:
631
                # Roll back any change if something goes wrong
632
                conn.rollback()
633
                print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
634
            finally:
635
                # Close the db connection
636
                conn.close()
637
        
638
        return self._areas 
639

    
640
    '''
641
        @brief  get area of given name
642
        @author humkyung
643
        @date   2018.04.07
644
    '''
645
    def getArea(self, name):
646
        areas = self.getAreaList()
647
        matches = [area for area in areas if area.name==name]
648
        if 1 == len(matches): return matches[0]
649

    
650
        return None
651

    
652
    '''
653
        @brief  get configurations
654
        @author humkyung
655
        @date   2018.04.16
656
    '''
657
    def getConfigs(self, section, key=None):
658
        res = []
659

    
660
        try:
661
            # Creates or opens a file called mydb with a SQLite3 DB
662
            dbPath = os.path.join(self.getCurrentProject().getDbFilePath(), 'ITI_PID.db')
663
            conn = sqlite3.connect(dbPath)
664
            # Get a cursor object
665
            cursor = conn.cursor()
666

    
667
            if key is not None:
668
                sql = "select * from configuration where section='{}' and key='{}'".format(section, key)
669
            else:
670
                sql = "select * from configuration where section='{}'".format(section)
671

    
672
            cursor.execute(sql)
673
            rows = cursor.fetchall()
674
            for row in rows:
675
                res.append(Config(row[0], row[1], row[2]))
676
        # Catch the exception
677
        except Exception as ex:
678
            # Roll back any change if something goes wrong
679
            conn.rollback()
680
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
681
        finally:
682
            # Close the db connection
683
            conn.close()
684

    
685
        return res
686

    
687
    '''
688
        @brief  save configurations
689
        @author humkyung
690
        @date   2018.04.16
691
    '''
692
    def saveConfigs(self, configs):
693
        try:
694
            # Creates or opens a file called mydb with a SQLite3 DB
695
            dbPath = self.getCurrentProject().getDbFilePath() + "/ITI_PID.db"
696
            conn = sqlite3.connect(dbPath)
697
            # Get a cursor object
698
            cursor = conn.cursor()
699

    
700
            for config in configs:
701
                sql = "insert or replace into configuration values('{}','{}','{}')".format(config.section, config.key, config.value)
702
                cursor.execute(sql)
703
            conn.commit()
704
        # Catch the exception
705
        except Exception as ex:
706
            # Roll back any change if something goes wrong
707
            conn.rollback()
708
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
709
        finally:
710
            # Close the db connection
711
            conn.close()
712

    
713
    '''
714
        @brief  set area list
715
    '''
716
    def setAreaList(self, areas):
717
        for area in areas:
718
            matches = [x for x in self._areas if x.name==area.name]
719
            if 1 == len(matches):
720
                matches[0].x = area.x
721
                matches[0].y = area.y
722
                matches[0].width = area.width
723
                matches[0].height = area.height
724
            elif 0 == len(matches):
725
                self._areas.append(area)
726

    
727
        try:
728
            # Creates or opens a file called mydb with a SQLite3 DB
729
            dbPath = self.getCurrentProject().getDbFilePath() + "/ITI_PID.db"
730
            conn = sqlite3.connect(dbPath)
731
            # Get a cursor object
732
            cursor = conn.cursor()
733

    
734
            for area in self._areas:
735
                sql = "insert or replace into configuration values('Area','{}','{},{},{},{}')".format(area.name, area.x, area.y, area.width, area.height)
736
                cursor.execute(sql)
737

    
738
            conn.commit()
739
        # Catch the exception
740
        except Exception as ex:
741
            # Roll back any change if something goes wrong
742
            conn.rollback()
743
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
744
        finally:
745
            # Close the db connection
746
            conn.close()
747
            
748
    '''
749
        @brief  get symbol name list
750
    '''
751
    def getSymbolNameList(self):
752
        symbolNametList = []
753

    
754
        try:
755
            dbPath = self.getCurrentProject().getDbFilePath() + "/ITI_PID.db"
756

    
757
            conn = sqlite3.connect(dbPath)
758
            cursor = conn.cursor()
759
            sql = 'SELECT * FROM SymbolName'
760
            try:
761
                cursor.execute(sql)
762
                rows = cursor.fetchall()
763
                for row in rows:
764
                    symbolNametList.append(row[2]) # Name String
765
            except Exception as ex:
766
                print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
767
        finally:
768
            conn.close()
769

    
770
        return symbolNametList
771

    
772
    '''
773
        @brief      get symbol name list by symbol Type
774
        @author     Jeongwoo
775
        @date       18.04.06
776
        @history    .
777
    '''
778
    def getSymbolNameListByType(self, type):
779
        symbolNametList = []
780

    
781
        try:
782
            dbPath = self.getCurrentProject().getDbFilePath() + "/ITI_PID.db"
783

    
784
            conn = sqlite3.connect(dbPath)
785
            cursor = conn.cursor()
786
            sql = ''
787
            if type is not None:
788
                sql = 'SELECT * FROM SymbolName WHERE type = "' + type + '"'
789
                try:
790
                    cursor.execute(sql)
791
                    rows = cursor.fetchall()
792
                    for row in rows:
793
                        symbolNametList.append(row[2]) # Name String
794
                except Exception as ex:
795
                    print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
796
        finally:
797
            conn.close()
798

    
799
        return symbolNametList
800

    
801
    '''
802
        @brief  delete added symbol data
803
    '''
804
    def deleteSymbol(self, fileName):
805
        ret = False
806
        try:
807
            dbPath = self.getCurrentProject().getPath() + "/db/ITI_PID.db"
808
            conn = sqlite3.connect(dbPath)
809
            cursor = conn.cursor()
810
            sql = "DELETE FROM Symbol WHERE name = ?"
811
            try:
812
                cursor.execute(sql, (fileName,))
813
                conn.commit()
814
                ret = True
815
            except Exception as ex:
816
                print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
817
                ret = False
818
        finally:
819
            conn.close()
820
            return (ret, fileName)
821
        
822
    '''
823
        @brief  get symbol name
824
        @history    18.04.24    Jeongwoo    Add isExceptDetect Field
825
    '''
826
    def getSymbolByQuery(self, fieldName, param):
827
        ret = None
828

    
829
        try:
830
            dbPath = self.getCurrentProject().getDbFilePath() + "/ITI_PID.db"
831
            conn = sqlite3.connect(dbPath)
832
            cursor = conn.cursor()
833
            sql = 'SELECT * FROM Symbol WHERE ' + fieldName + ' = "' + param + '"'
834
            try:
835
                cursor.execute(sql)
836
                rows = cursor.fetchall()
837
                if rows is not None and len(rows) > 0:
838
                    symbolTuple = rows[0]
839
                    ret = symbol.SymbolBase(symbolTuple[1], symbolTuple[2], symbolTuple[3], symbolTuple[4]
840
                                            , symbolTuple[5], symbolTuple[6], symbolTuple[7], symbolTuple[8], symbolTuple[9]
841
                                            , symbolTuple[10], symbolTuple[11], symbolTuple[12], symbolTuple[13], symbolTuple[14], symbolTuple[0]) ## uid is last item
842
                    #ret = symbol.SymbolBase(symbolTuple[1], symbolTuple[2], symbolTuple[3], symbolTuple[4]
843
                    #                        , symbolTuple[5], symbolTuple[6], symbolTuple[7], symbolTuple[8], symbolTuple[9]
844
                    #                        , symbolTuple[10], symbolTuple[11], symbolTuple[12], symbolTuple[13], symbolTuple[14], symbolTuple[0]) ## uid is last item
845
            except Exception as ex:
846
                print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
847
        finally:
848
            conn.close()
849

    
850
        return ret
851

    
852
    '''
853
        @brief  get symbol name list
854
        @history    18.04.24    Jeongwoo    Add isExceptDetect Field
855
    '''
856
    def getSymbolListByQuery(self, fieldName=None, param=None):
857
        ret = []
858

    
859
        try:
860
            dbPath = self.getCurrentProject().getDbFilePath() + "/ITI_PID.db"
861
            conn = sqlite3.connect(dbPath)
862
            cursor = conn.cursor()
863
            if fieldName is not None and param is not None:
864
                sql = 'SELECT * FROM Symbol WHERE ' + fieldName + ' = "' + param + '"'
865
            else:
866
                sql = 'SELECT * FROM Symbol'
867
            try:
868
                cursor.execute(sql)
869
                rows = cursor.fetchall()
870
                if rows is not None and len(rows) > 0:
871
                    for symbolTuple in rows:
872
                        sym = symbol.SymbolBase(symbolTuple[1], symbolTuple[2], symbolTuple[3], symbolTuple[4]
873
                                                , symbolTuple[5], symbolTuple[6], symbolTuple[7], symbolTuple[8], symbolTuple[9]
874
                                                , symbolTuple[10], symbolTuple[11], symbolTuple[12], symbolTuple[13], symbolTuple[14], symbolTuple[0]) ## uid is last item
875
                        ret.append(sym)
876
            except Exception as ex:
877
                print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
878
        finally:
879
            conn.close()
880

    
881
        return ret
882

    
883
    '''
884
        @brief      get nominal pipe size
885
        @author     humkyung
886
        @date       2018.04.20
887
        @history    humkyung 2018.04.24 read MetricStr column and set size unit
888
    '''
889
    def getNomialPipeSizeData(self):
890
        res = []
891
        try:
892
            configs = self.getConfigs('Line No', 'Size Unit')
893
            sizeUnit = configs[0].value if 1 == len(configs) else 'Metric'
894

    
895
            # Creates or opens a file called mydb with a SQLite3 DB
896
            dbPath = os.path.join(self.getCurrentProject().getDbFilePath(), 'ITI_PID.db')
897
            conn = sqlite3.connect(dbPath)
898
            # Get a cursor object
899
            cursor = conn.cursor()
900

    
901
            sql = "select Code,Metric,Inch,InchStr,MetricStr from 'NOMINAL PIPE SIZE'"
902
            cursor.execute(sql)
903
            rows = cursor.fetchall()
904
            for row in rows:
905
                pipeSize = NominalPipeSize(row[0], float(row[1]) if row[1] is not None else -1, float(row[2]) if row[2] is not None else -1, row[3], row[4])
906
                pipeSize.sizeUnit = sizeUnit
907
                res.append(pipeSize)
908
        # Catch the exception
909
        except Exception as ex:
910
            # Roll back any change if something goes wrong
911
            conn.rollback()
912
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
913
        finally:
914
            # Close the db connection
915
            conn.close()
916

    
917
        return res
918
    
919
    '''
920
        @brief      get equipment data list
921
        @author     humkyung
922
        @date       2018.05.03
923
    '''
924
    def getEquipmentDataList(self):
925
        from EquipmentData import EquipmentData
926

    
927
        if not self.equipmentDataList:
928
            try:
929
                # Creates or opens a file called mydb with a SQLite3 DB
930
                dbPath = os.path.join(self.getCurrentProject().getDbFilePath(), 'ITI_PID.db')
931
                conn = sqlite3.connect(dbPath)
932
                # Get a cursor object
933
                cursor = conn.cursor()
934

    
935
                sql = 'select TAG_NO from EQUIPMENT_DATA_LIST'
936
                cursor.execute(sql)
937
                rows = cursor.fetchall()
938
                for row in rows:
939
                    data = EquipmentData(row[0])
940
                    self.equipmentDataList.append(data)
941
            # Catch the exception
942
            except Exception as ex:
943
                # Roll back any change if something goes wrong
944
                conn.rollback()
945
                print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
946
            finally:
947
                # Close the db connection
948
                conn.close()
949

    
950
        return self.equipmentDataList 
951

    
952
    '''
953
        @brief      set equipment data list
954
        @author     humkyung
955
        @date       2018.05.03
956
    '''
957
    def setEquipmentDataList(self, dataList):
958
        try:
959
            # Creates or opens a file called mydb with a SQLite3 DB
960
            dbPath = os.path.join(self.getCurrentProject().getDbFilePath(), 'ITI_PID.db')
961
            conn = sqlite3.connect(dbPath)
962
            # Get a cursor object
963
            cursor = conn.cursor()
964

    
965
            for data in dataList:
966
                sql = "insert or replace into EQUIPMENT_DATA_LIST(UID,TAG_NO) values(lower(hex(randomblob(16))),'{}')".format(data.tagNo)
967
                cursor.execute(sql)
968
            conn.commit()
969

    
970
            self.equipmentDataList = dataList
971
        # Catch the exception
972
        except Exception as ex:
973
            # Roll back any change if something goes wrong
974
            conn.rollback()
975
            print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
976
        finally:
977
            # Close the db connection
978
            conn.close()
979

    
980
    '''
981
        @brief  get IsOriginDetect ComboBox Items
982
    '''
983
    def getIsOriginDetectComboBoxItems(self):
984
        return [("원본 도면", 0), ("텍스트 제거 도면", 1)]
985

    
986
    '''
987
        @brief  get IsOriginDetect ComboBox Items
988
    '''
989
    def getOcrOptionComboBoxItems(self):
990
        return [("OCR 미적용", 0), ("일반 심볼", 1), ("Instrument 계통", 2)]
991
    
992
    '''
993
        @brief      Return Symbol Type Items
994
        @author     Jeongwoo
995
        @date       18.04.20
996
        @history    .
997
    '''
998
    def getSymbolTypeList(self):
999
        symbolTypeList = []
1000

    
1001
        try:
1002
            dbPath = self.getCurrentProject().getDbFilePath() + "/ITI_PID.db"
1003

    
1004
            conn = sqlite3.connect(dbPath)
1005
            cursor = conn.cursor()
1006
            sql = 'SELECT * FROM SymbolType ORDER BY type ASC'
1007
            try:
1008
                cursor.execute(sql)
1009
                rows = cursor.fetchall()
1010
                for row in rows:
1011
                    symbolTypeList.append(row[1]) # Type String
1012
            except Exception as ex:
1013
                print('error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno))
1014
        finally:
1015
            conn.close()
1016

    
1017
        return symbolTypeList
1018

    
1019
    '''
1020
        @brief      Return Symbol Type Items with "None"
1021
        @author     Jeongwoo
1022
        @date       18.04.06
1023
        @history    Seperate SymbolTypeList and "None"
1024
    '''
1025
    def getSymbolTypeComboBoxItems(self):
1026
        symbolTypeList = self.getSymbolTypeList()
1027
        symbolTypeList.insert(0, "None")
1028

    
1029
        return symbolTypeList
1030

    
1031
    '''
1032
        @brief  get Base Symbol ComboBox Items
1033
    '''
1034
    def getBaseSymbolComboBoxItems(self, type = None):
1035
        bsymbolNameList = self.getSymbolNameListByType(type)
1036
        bsymbolNameList.sort()
1037
        bsymbolNameList.insert(0, "None")
1038
        return bsymbolNameList
1039

    
1040
    '''
1041
        @brief  get Additional Symbol ComboBox Items
1042
    '''
1043
    def getAdditionalSymbolComboBoxItems(self):
1044
        asymbolNameList = self.getSymbolNameList()
1045
        asymbolNameList.sort()
1046
        asymbolNameList.insert(0, "None")
1047
        return asymbolNameList
1048

    
1049
    '''
1050
        @brief  get Additional Symbol's default direction ComboBox Items
1051
    '''
1052
    def getDefaultSymbolDirectionComboBoxItems(self):
1053
        return [("UP", 0), ("DOWN", 2), ("LEFT", 3), ("RIGHT", 1)]
1054
    
1055
    pass
클립보드 이미지 추가 (최대 크기: 500 MB)