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
|