개정판 edb51ab4
issue #663: line type detection, broken line testing, solid line ongoing, function disabled
Change-Id: Ibcde26d2b41be385053b4693f65a6ed59152df52
DTI_PID/DTI_PID/LineNoTracer.py | ||
---|---|---|
712 | 712 |
end_break_names = docdata.getSymbolListByType('type', 'End Break') |
713 | 713 |
if len(end_break_names) is not 0: |
714 | 714 |
svgFileName = end_break_names[0].sName |
715 |
symbol = docdata.getSymbolByQuery('name', svgFileName)
|
|
715 |
symbol = end_break_names[0]
|
|
716 | 716 |
svgFilePath = os.path.join(docdata.getCurrentProject().getSvgFilePath(), symbol.getType(), |
717 | 717 |
svgFileName + '.svg') |
718 | 718 |
|
... | ... | |
821 | 821 |
ratio *= 2 |
822 | 822 |
|
823 | 823 |
svgFileName = spec_break_names[0].sName |
824 |
symbol = docdata.getSymbolByQuery('name', svgFileName)
|
|
824 |
symbol = spec_break_names[0]
|
|
825 | 825 |
svgFilePath = os.path.join(docdata.getCurrentProject().getSvgFilePath(), symbol.getType(), |
826 | 826 |
svgFileName + '.svg') |
827 | 827 |
|
DTI_PID/DTI_PID/LineTypeRegistration_UI.py | ||
---|---|---|
1 |
# -*- coding: utf-8 -*- |
|
2 |
|
|
3 |
# Form implementation generated from reading ui file './UI/LineTypeRegistration.ui' |
|
4 |
# |
|
5 |
# Created by: PyQt5 UI code generator 5.11.3 |
|
6 |
# |
|
7 |
# WARNING! All changes made in this file will be lost! |
|
8 |
|
|
9 |
from PyQt5 import QtCore, QtGui, QtWidgets |
|
10 |
|
|
11 |
class Ui_Dialog(object): |
|
12 |
def setupUi(self, Dialog): |
|
13 |
Dialog.setObjectName("Dialog") |
|
14 |
Dialog.resize(513, 273) |
|
15 |
self.gridLayout = QtWidgets.QGridLayout(Dialog) |
|
16 |
self.gridLayout.setObjectName("gridLayout") |
|
17 |
self.verticalLayout = QtWidgets.QVBoxLayout() |
|
18 |
self.verticalLayout.setObjectName("verticalLayout") |
|
19 |
self.lineEdit = QtWidgets.QLineEdit(Dialog) |
|
20 |
self.lineEdit.setEnabled(False) |
|
21 |
self.lineEdit.setReadOnly(False) |
|
22 |
self.lineEdit.setObjectName("lineEdit") |
|
23 |
self.verticalLayout.addWidget(self.lineEdit) |
|
24 |
self.horizontalLayout = QtWidgets.QHBoxLayout() |
|
25 |
self.horizontalLayout.setObjectName("horizontalLayout") |
|
26 |
self.verticalLayout.addLayout(self.horizontalLayout) |
|
27 |
self.buttonBox = QtWidgets.QDialogButtonBox(Dialog) |
|
28 |
self.buttonBox.setOrientation(QtCore.Qt.Horizontal) |
|
29 |
self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Save) |
|
30 |
self.buttonBox.setObjectName("buttonBox") |
|
31 |
self.verticalLayout.addWidget(self.buttonBox) |
|
32 |
self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1) |
|
33 |
|
|
34 |
self.retranslateUi(Dialog) |
|
35 |
self.buttonBox.accepted.connect(Dialog.accept) |
|
36 |
self.buttonBox.rejected.connect(Dialog.reject) |
|
37 |
QtCore.QMetaObject.connectSlotsByName(Dialog) |
|
38 |
|
|
39 |
def retranslateUi(self, Dialog): |
|
40 |
_translate = QtCore.QCoreApplication.translate |
|
41 |
Dialog.setWindowTitle(_translate("Dialog", "Line Type Registration")) |
|
42 |
|
|
43 |
|
|
44 |
if __name__ == "__main__": |
|
45 |
import sys |
|
46 |
app = QtWidgets.QApplication(sys.argv) |
|
47 |
Dialog = QtWidgets.QDialog() |
|
48 |
ui = Ui_Dialog() |
|
49 |
ui.setupUi(Dialog) |
|
50 |
Dialog.show() |
|
51 |
sys.exit(app.exec_()) |
|
52 |
|
DTI_PID/DTI_PID/MainWindow.py | ||
---|---|---|
219 | 219 |
self.actionGroup.addAction(self.actionSave) |
220 | 220 |
self.actionGroup.addAction(self.actionValidate) |
221 | 221 |
self.actionGroup.addAction(self.actionVendor) |
222 |
self.actionGroup.addAction(self.actionLineRegistration) |
|
223 | 222 |
self.actionGroup.triggered.connect(self.actionGroupTriggered) |
224 | 223 |
|
225 | 224 |
# connect signals and slots |
... | ... | |
229 | 228 |
self.actionExportAsXML.triggered.connect(self.export_as_xml) |
230 | 229 |
self.actionExportAsImage.triggered.connect(self.export_as_image) |
231 | 230 |
self.actionLine.triggered.connect(self.onPlaceLine) |
232 |
self.actionLineRegistration.triggered.connect(self.onLineTypeRegistration) |
|
233 | 231 |
self.actionRecognition.triggered.connect(self.recognize) |
234 | 232 |
self.pushButtonRefreshDrawings.clicked.connect(self.load_drawing_list) |
235 | 233 |
self.actionLineRecognition.triggered.connect(self.connect_attributes) |
... | ... | |
1779 | 1777 |
for item in selected: |
1780 | 1778 |
item.setVisible(isChecked) |
1781 | 1779 |
|
1782 |
def onLineTypeRegistration(self): |
|
1783 |
''' register line type ''' |
|
1784 |
if not self.graphicsView.hasImage(): |
|
1785 |
self.showImageSelectionMessageBox() |
|
1786 |
return |
|
1787 |
|
|
1788 |
cmd = FenceCommand.FenceCommand(self.graphicsView) |
|
1789 |
cmd.onSuccess.connect(self.onLineType) |
|
1790 |
self.graphicsView.command = cmd |
|
1791 |
QApplication.setOverrideCursor(Qt.CrossCursor) |
|
1792 |
|
|
1793 |
def onLineType(self): |
|
1794 |
pass |
|
1795 |
|
|
1796 | 1780 |
''' |
1797 | 1781 |
@brief create a symbol |
1798 | 1782 |
@history 2018.05.02 Jeongwoo Change return value of QSymbolEditorDialog (Single variable → Tuple) |
DTI_PID/DTI_PID/MainWindow_UI.py | ||
---|---|---|
582 | 582 |
self.actionSymbol_Replace_Insert.setObjectName("actionSymbol_Replace_Insert") |
583 | 583 |
self.actionMake_Label_Data = QtWidgets.QAction(MainWindow) |
584 | 584 |
self.actionMake_Label_Data.setObjectName("actionMake_Label_Data") |
585 |
self.actionLineRegistration = QtWidgets.QAction(MainWindow) |
|
586 |
icon27 = QtGui.QIcon() |
|
587 |
icon27.addPixmap(QtGui.QPixmap(":/newPrefix/crop.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) |
|
588 |
self.actionLineRegistration.setIcon(icon27) |
|
589 |
self.actionLineRegistration.setObjectName("actionLineRegistration") |
|
590 | 585 |
self.menuExport.addAction(self.actionExportAsSVG) |
591 | 586 |
self.menuExport.addAction(self.actionExportAsXML) |
592 | 587 |
self.menuExport.addAction(self.actionExportAsImage) |
... | ... | |
652 | 647 |
self.toolBar.addAction(self.actionRedo) |
653 | 648 |
self.toolBar.addSeparator() |
654 | 649 |
self.toolBar.addAction(self.actionLine) |
655 |
self.toolBar.addAction(self.actionLineRegistration) |
|
656 | 650 |
self.toolBar.addAction(self.actionOCR) |
657 | 651 |
self.toolBar.addAction(self.actionVendor) |
658 | 652 |
self.toolBar.addAction(self.actionValidate) |
... | ... | |
790 | 784 |
self.actionRedo.setToolTip(_translate("MainWindow", "Redo")) |
791 | 785 |
self.actionSymbol_Replace_Insert.setText(_translate("MainWindow", "Symbol Replace/Insert")) |
792 | 786 |
self.actionMake_Label_Data.setText(_translate("MainWindow", "Make Label Data")) |
793 |
self.actionLineRegistration.setText(_translate("MainWindow", "Line Registration")) |
|
794 |
self.actionLineRegistration.setToolTip(_translate("MainWindow", "Line Registration")) |
|
795 | 787 |
|
796 | 788 |
import MainWindow_rc |
797 | 789 |
|
DTI_PID/DTI_PID/RecognitionDialog.py | ||
---|---|---|
1317 | 1317 |
|
1318 | 1318 |
# change line type using visual pattern |
1319 | 1319 |
try: |
1320 |
Worker.changeVisualLineType(app_doc_data.lines) |
|
1320 |
#Worker.changeVisualLineType(app_doc_data.lines) |
|
1321 |
pass |
|
1321 | 1322 |
|
1322 | 1323 |
except Exception as ex: |
1323 | 1324 |
message = f"error occurred({repr(ex)}) in {sys.exc_info()[-1].tb_frame.f_code.co_filename}:" \ |
... | ... | |
1359 | 1360 |
imgNot = np.ones(image.shape, np.uint8) * 255 |
1360 | 1361 |
image = cv2.bitwise_xor(image, imgNot) |
1361 | 1362 |
|
1362 |
electric = [137, [1,1,1,1,1,1,1,1,1], sys.maxsize] |
|
1363 |
software = [187, [0.948,1.081,0.932,1.081,0.932,1.068,0.932,1.081,0.929], sys.maxsize] |
|
1364 |
line_patterns = {'Electric':electric, 'Software':software } |
|
1363 |
#electric = [137, [1,1,1,1,1,1,1,1,1], sys.maxsize] |
|
1364 |
#software = [187, [0.948,1.081,0.932,1.081,0.932,1.068,0.932,1.081,0.929], sys.maxsize] |
|
1365 |
#line_patterns = {'Electric':electric, 'Software':software } |
|
1366 |
line_patterns = {} |
|
1367 |
line_shapes = {} |
|
1368 |
|
|
1369 |
line_names = app_doc_data.getSymbolListByType('type', 'Line') |
|
1370 |
if len(line_names) != 0: |
|
1371 |
for line_name in line_names: |
|
1372 |
line = line_name |
|
1373 |
line_path = line.getPath() |
|
1374 |
if not os.path.isfile(line_path): |
|
1375 |
continue |
|
1376 |
|
|
1377 |
line_img = cv2.cvtColor(cv2.imread(line_path), cv2.COLOR_BGR2GRAY) |
|
1378 |
imgNot = np.ones(line_img.shape, np.uint8) * 255 |
|
1379 |
line_img = cv2.bitwise_xor(line_img, imgNot) |
|
1380 |
|
|
1381 |
contours, _ = cv2.findContours(line_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) |
|
1382 |
|
|
1383 |
if len(contours) < 3: |
|
1384 |
max_x, max_y, min_x, min_y = 0, 0, sys.maxsize, sys.maxsize |
|
1385 |
for rect in [cv2.boundingRect(contours)]: |
|
1386 |
if rect[0] < min_x: |
|
1387 |
min_x = rect[0] |
|
1388 |
if rect[0] + rect[2] > max_x: |
|
1389 |
max_x = rect[0] + rect[2] |
|
1390 |
if rect[1] < min_y: |
|
1391 |
min_y = rect[1] |
|
1392 |
if rect[1] + rect[3] > max_y: |
|
1393 |
max_y = rect[1] + rect[3] |
|
1394 |
|
|
1395 |
line_shapes[line.getBaseSymbol()] = [line_img[min_y:max_y, min_x:max_x], sys.maxsize] |
|
1396 |
continue |
|
1397 |
|
|
1398 |
i = 1 if line_img.shape[0] > line_img.shape[1] else 0 |
|
1399 |
boundingBoxes = [cv2.boundingRect(contour) for contour in contours] |
|
1400 |
(contours, boundingBoxes) = zip(*sorted(zip(contours, boundingBoxes), key=lambda b:b[1][i], reverse=False)) |
|
1401 |
|
|
1402 |
avg_area = sum([cv2.contourArea(contour) for contour in contours]) / len(contours) |
|
1403 |
ratio_area = [cv2.contourArea(contour) / avg_area for contour in contours] |
|
1404 |
|
|
1405 |
line_patterns[line.getBaseSymbol()] = [avg_area, ratio_area, sys.maxsize] |
|
1406 |
else: |
|
1407 |
return |
|
1365 | 1408 |
|
1366 | 1409 |
lines_found = [] |
1410 |
lines_shape = [] |
|
1367 | 1411 |
|
1412 |
# detemine line type broken |
|
1368 | 1413 |
for line in lines: |
1369 |
vertical = LineDetector.is_vertical([line.start_point()[0], line.start_point()[1], line.end_point()[0], line.end_point()[1]]) |
|
1370 |
|
|
1371 | 1414 |
rect = line.boundingRect() |
1372 | 1415 |
image_line = image[round(rect.y()):round(rect.y() + rect.height()), round(rect.x()):round(rect.x() + rect.width())] |
1373 | 1416 |
contours, _ = cv2.findContours(image_line, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) |
1374 | 1417 |
|
1375 | 1418 |
# skip piping line |
1376 | 1419 |
if len(contours) < 3: |
1420 |
max_x, max_y, min_x, min_y = 0, 0, sys.maxsize, sys.maxsize |
|
1421 |
for rect in [cv2.boundingRect(contours)]: |
|
1422 |
if rect[0] < min_x: |
|
1423 |
min_x = rect[0] |
|
1424 |
if rect[0] + rect[2] > max_x: |
|
1425 |
max_x = rect[0] + rect[2] |
|
1426 |
if rect[1] < min_y: |
|
1427 |
min_y = rect[1] |
|
1428 |
if rect[1] + rect[3] > max_y: |
|
1429 |
max_y = rect[1] + rect[3] |
|
1430 |
|
|
1431 |
lines_shape.append([line, image_line[min_y:max_y, min_x:max_x]]) |
|
1377 | 1432 |
continue |
1378 | 1433 |
|
1434 |
vertical = LineDetector.is_vertical([line.start_point()[0], line.start_point()[1], line.end_point()[0], line.end_point()[1]]) |
|
1435 |
|
|
1379 | 1436 |
i = 1 if vertical else 0 |
1380 | 1437 |
boundingBoxes = [cv2.boundingRect(contour) for contour in contours] |
1381 | 1438 |
(contours, boundingBoxes) = zip(*sorted(zip(contours, boundingBoxes), key=lambda b:b[1][i], reverse=False)) |
... | ... | |
1405 | 1462 |
lines_found.append([line, line_type_found]) |
1406 | 1463 |
|
1407 | 1464 |
''' |
1465 |
# feature matching not work |
|
1408 | 1466 |
orb = cv2.ORB_create() |
1409 | 1467 |
kp1, des1 = orb.detectAndCompute(image_line, None) |
1410 | 1468 |
kp2, des2 = orb.detectAndCompute(image_line, None) |
... | ... | |
1431 | 1489 |
if m.distance < 0.75 * n.distance: |
1432 | 1490 |
good.append([m]) |
1433 | 1491 |
''' |
1492 |
# determine line type |
|
1493 |
for line, image_line in lines_shape: |
|
1494 |
for line_type, line_shape in line_shapes.items(): |
|
1495 |
shape = line_shape[0].copy() |
|
1496 |
line_shape[1] = sys.maxsize |
|
1497 |
|
|
1498 |
big = shape if max(shape.shape) > max(image_line.shape) else image_line |
|
1499 |
small = image_line if max(shape.shape) > max(image_line.shape) else shape |
|
1500 |
|
|
1501 |
if big.shape[0] == max(max(big.shape), max(small.shape)): |
|
1502 |
mask = np.ones([big.shape[0], max(big.shape[1], max(small.shape))], np.uint8) * 255 |
|
1503 |
else: |
|
1504 |
mask = np.ones([max(big.shape[0], max(small.shape)), big.shape[1]], np.uint8) * 255 |
|
1505 |
|
|
1506 |
mask[0:big.shape[0], 0:big.shape[1]] = big |
|
1507 |
|
|
1508 |
searchedInfos = [] |
|
1509 |
steps = [False, True] |
|
1510 |
for flipped in steps: |
|
1511 |
if flipped: |
|
1512 |
symGray = small |
|
1513 |
symGray = cv2.flip(symGray, 1) |
|
1514 |
|
|
1515 |
symbolRotatedAngle = 0 |
|
1516 |
for rc in range(4): |
|
1517 |
sw, sh = symGray.shape[::-1] |
|
1518 |
|
|
1519 |
r_w, r_h = big.shape[::-1] |
|
1520 |
if r_w < sw or r_h < sh: |
|
1521 |
symGray = cv2.rotate(symGray, cv2.ROTATE_90_CLOCKWISE) |
|
1522 |
symbolRotatedAngle = (symbolRotatedAngle + 90) % 360 |
|
1523 |
continue |
|
1524 |
|
|
1525 |
tmRes = cv2.matchTemplate(big, symGray, cv2.TM_CCOEFF_NORMED) |
|
1526 |
_, max_val, __, max_loc = cv2.minMaxLoc(tmRes) |
|
1527 |
|
|
1528 |
if max_val > 0.6: |
|
1529 |
searchedInfos.append(1 - max_val) |
|
1530 |
|
|
1531 |
symGray = cv2.rotate(symGray, cv2.ROTATE_90_CLOCKWISE) |
|
1532 |
symbolRotatedAngle = (symbolRotatedAngle + 90) % 360 |
|
1533 |
|
|
1534 |
if searchedInfos: |
|
1535 |
line_shape[1] = sorted(searchedInfos)[0] |
|
1536 |
|
|
1537 |
line_type_found = sorted([(line_type, line_shape[1]) for line_type, line_shape in line_shapes.items()], key=lambda error: error[1])[0] |
|
1538 |
if line_type_found[1] < 0.4: |
|
1539 |
lines_found.append([line, line_type_found]) |
|
1434 | 1540 |
|
1435 | 1541 |
line_runs = [] |
1436 | 1542 |
for line_found in lines_found: |
... | ... | |
1443 | 1549 |
if inserted: |
1444 | 1550 |
continue |
1445 | 1551 |
else: |
1446 |
line_runs.append(Worker.find_connected_line(line_found[0])) |
|
1552 |
run = [line_found[0]] |
|
1553 |
Worker.find_connected_line(run, line_found[0]) |
|
1554 |
line_runs.append(run) |
|
1447 | 1555 |
|
1448 | 1556 |
for line_run in line_runs: |
1449 | 1557 |
_lines_found = [] |
... | ... | |
1456 | 1564 |
Worker.changeConnectedLineType(_line_found[0], _line_found[1][0]) |
1457 | 1565 |
|
1458 | 1566 |
@staticmethod |
1459 |
def find_connected_line(line): |
|
1460 |
lines = [line] |
|
1461 |
|
|
1462 |
current_line = line |
|
1463 |
while True: |
|
1464 |
if type(current_line.connectors[0].connectedItem) is QEngineeringLineItem: |
|
1465 |
current_line = current_line.connectors[0].connectedItem |
|
1466 |
lines.append(current_line) |
|
1467 |
else: |
|
1468 |
break |
|
1469 |
|
|
1470 |
current_line = line |
|
1471 |
while True: |
|
1472 |
if type(current_line.connectors[1].connectedItem) is QEngineeringLineItem: |
|
1473 |
current_line = current_line.connectors[1].connectedItem |
|
1474 |
lines.append(current_line) |
|
1475 |
else: |
|
1476 |
break |
|
1477 |
|
|
1478 |
return lines |
|
1567 |
def find_connected_line(lines, line): |
|
1568 |
if type(line.connectors[0].connectedItem) is QEngineeringLineItem and line.connectors[0].connectedItem not in lines and\ |
|
1569 |
(line.connectors[0].connectedItem.connectors[0].connectedItem is line or |
|
1570 |
line.connectors[0].connectedItem.connectors[1].connectedItem is line): |
|
1571 |
current_line = line.connectors[0].connectedItem |
|
1572 |
lines.append(current_line) |
|
1573 |
Worker.find_connected_line(lines, current_line) |
|
1574 |
|
|
1575 |
if type(line.connectors[1].connectedItem) is QEngineeringLineItem and line.connectors[1].connectedItem not in lines and\ |
|
1576 |
(line.connectors[1].connectedItem.connectors[0].connectedItem is line or |
|
1577 |
line.connectors[1].connectedItem.connectors[1].connectedItem is line): |
|
1578 |
current_line = line.connectors[1].connectedItem |
|
1579 |
lines.append(current_line) |
|
1580 |
Worker.find_connected_line(lines, current_line) |
|
1479 | 1581 |
|
1480 | 1582 |
@staticmethod |
1481 | 1583 |
def changeConnectedLineType(line, lineType): |
... | ... | |
1485 | 1587 |
line.connectors[0].connectedItem.connectors[1].connectedItem is line) and \ |
1486 | 1588 |
line.connectors[0].connectedItem.lineType is not lineType: |
1487 | 1589 |
Worker.changeConnectedLineType(line.connectors[0].connectedItem, lineType) |
1590 |
|
|
1488 | 1591 |
if type(line.connectors[1].connectedItem) is QEngineeringLineItem and \ |
1489 | 1592 |
(line.connectors[1].connectedItem.connectors[0].connectedItem is line or |
1490 | 1593 |
line.connectors[1].connectedItem.connectors[1].connectedItem is line) and \ |
DTI_PID/DTI_PID/Scripts/MSSQL/ID2.sql | ||
---|---|---|
2106 | 2106 |
1071,37,'General','Notes','Note'); |
2107 | 2107 |
INSERT INTO SymbolName (UID,SymbolType_UID,Category,"Type",Name) VALUES ( |
2108 | 2108 |
1072,38,'Piping','End Break','End Break'); |
2109 |
INSERT INTO SymbolName (UID,SymbolType_UID,Category,"Type",Name) VALUES ( |
|
2110 |
1073,0,'Line','Line','Capillary'); |
|
2111 |
INSERT INTO SymbolName (UID,SymbolType_UID,Category,"Type",Name) VALUES ( |
|
2112 |
1074,0,'Line','Line','Connect To Process'); |
|
2113 |
INSERT INTO SymbolName (UID,SymbolType_UID,Category,"Type",Name) VALUES ( |
|
2114 |
1075,0,'Line','Line','Electric'); |
|
2115 |
INSERT INTO SymbolName (UID,SymbolType_UID,Category,"Type",Name) VALUES ( |
|
2116 |
1076,0,'Line','End Break','Electric Binary'); |
|
2117 |
INSERT INTO SymbolName (UID,SymbolType_UID,Category,"Type",Name) VALUES ( |
|
2118 |
1077,0,'Line','Line','Guided Electromagnetic'); |
|
2119 |
INSERT INTO SymbolName (UID,SymbolType_UID,Category,"Type",Name) VALUES ( |
|
2120 |
1078,0,'Line','Line','Hydraulic'); |
|
2121 |
INSERT INTO SymbolName (UID,SymbolType_UID,Category,"Type",Name) VALUES ( |
|
2122 |
1079,0,'Line','Line','Mechanical'); |
|
2123 |
INSERT INTO SymbolName (UID,SymbolType_UID,Category,"Type",Name) VALUES ( |
|
2124 |
1080,0,'Line','Line','Pneumatic'); |
|
2125 |
INSERT INTO SymbolName (UID,SymbolType_UID,Category,"Type",Name) VALUES ( |
|
2126 |
1081,0,'Line','Line','Pneumatic Binary'); |
|
2127 |
INSERT INTO SymbolName (UID,SymbolType_UID,Category,"Type",Name) VALUES ( |
|
2128 |
1082,0,'Line','Line','Software'); |
|
2129 |
INSERT INTO SymbolName (UID,SymbolType_UID,Category,"Type",Name) VALUES ( |
|
2130 |
1083,0,'Line','Line','Primary'); |
|
2131 |
INSERT INTO SymbolName (UID,SymbolType_UID,Category,"Type",Name) VALUES ( |
|
2132 |
1084,0,'Line','Line','Secondary'); |
|
2133 |
INSERT INTO SymbolName (UID,SymbolType_UID,Category,"Type",Name) VALUES ( |
|
2134 |
1085,39,'Package','Package','EQ Package'); |
|
2109 | 2135 |
|
2110 | 2136 |
|
2111 | 2137 |
CREATE TABLE Symbol ( |
DTI_PID/DTI_PID/SymbolEditorDialog.py | ||
---|---|---|
548 | 548 |
self.ui.treeViewSymbolCategory.expand(proxy_model.mapFromSource(index)) |
549 | 549 |
for row in range(category[0].rowCount()): |
550 | 550 |
child = category[0].child(row) |
551 |
if child.text() == 'None':
|
|
551 |
if child.text() == 'EQ Package':
|
|
552 | 552 |
index = self.ui.treeViewSymbolCategory.model().sourceModel().indexFromItem(child) |
553 | 553 |
self.ui.treeViewSymbolCategory.setCurrentIndex(proxy_model.mapFromSource(index)) |
554 | 554 |
|
DTI_PID/DTI_PID/UI/LineTypeRegistration.ui | ||
---|---|---|
1 |
<?xml version="1.0" encoding="UTF-8"?> |
|
2 |
<ui version="4.0"> |
|
3 |
<class>Dialog</class> |
|
4 |
<widget class="QDialog" name="Dialog"> |
|
5 |
<property name="geometry"> |
|
6 |
<rect> |
|
7 |
<x>0</x> |
|
8 |
<y>0</y> |
|
9 |
<width>513</width> |
|
10 |
<height>273</height> |
|
11 |
</rect> |
|
12 |
</property> |
|
13 |
<property name="windowTitle"> |
|
14 |
<string>Line Type Registration</string> |
|
15 |
</property> |
|
16 |
<layout class="QGridLayout" name="gridLayout"> |
|
17 |
<item row="0" column="0"> |
|
18 |
<layout class="QVBoxLayout" name="verticalLayout"> |
|
19 |
<item> |
|
20 |
<widget class="QLineEdit" name="lineEdit"> |
|
21 |
<property name="enabled"> |
|
22 |
<bool>false</bool> |
|
23 |
</property> |
|
24 |
<property name="readOnly"> |
|
25 |
<bool>false</bool> |
|
26 |
</property> |
|
27 |
</widget> |
|
28 |
</item> |
|
29 |
<item> |
|
30 |
<layout class="QHBoxLayout" name="horizontalLayout"/> |
|
31 |
</item> |
|
32 |
<item> |
|
33 |
<widget class="QDialogButtonBox" name="buttonBox"> |
|
34 |
<property name="orientation"> |
|
35 |
<enum>Qt::Horizontal</enum> |
|
36 |
</property> |
|
37 |
<property name="standardButtons"> |
|
38 |
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Save</set> |
|
39 |
</property> |
|
40 |
</widget> |
|
41 |
</item> |
|
42 |
</layout> |
|
43 |
</item> |
|
44 |
</layout> |
|
45 |
</widget> |
|
46 |
<resources/> |
|
47 |
<connections> |
|
48 |
<connection> |
|
49 |
<sender>buttonBox</sender> |
|
50 |
<signal>accepted()</signal> |
|
51 |
<receiver>Dialog</receiver> |
|
52 |
<slot>accept()</slot> |
|
53 |
<hints> |
|
54 |
<hint type="sourcelabel"> |
|
55 |
<x>248</x> |
|
56 |
<y>254</y> |
|
57 |
</hint> |
|
58 |
<hint type="destinationlabel"> |
|
59 |
<x>157</x> |
|
60 |
<y>274</y> |
|
61 |
</hint> |
|
62 |
</hints> |
|
63 |
</connection> |
|
64 |
<connection> |
|
65 |
<sender>buttonBox</sender> |
|
66 |
<signal>rejected()</signal> |
|
67 |
<receiver>Dialog</receiver> |
|
68 |
<slot>reject()</slot> |
|
69 |
<hints> |
|
70 |
<hint type="sourcelabel"> |
|
71 |
<x>316</x> |
|
72 |
<y>260</y> |
|
73 |
</hint> |
|
74 |
<hint type="destinationlabel"> |
|
75 |
<x>286</x> |
|
76 |
<y>274</y> |
|
77 |
</hint> |
|
78 |
</hints> |
|
79 |
</connection> |
|
80 |
</connections> |
|
81 |
</ui> |
DTI_PID/DTI_PID/UI/MainWindow.ui | ||
---|---|---|
195 | 195 |
<addaction name="actionRedo"/> |
196 | 196 |
<addaction name="separator"/> |
197 | 197 |
<addaction name="actionLine"/> |
198 |
<addaction name="actionLineRegistration"/> |
|
199 | 198 |
<addaction name="actionOCR"/> |
200 | 199 |
<addaction name="actionVendor"/> |
201 | 200 |
<addaction name="actionValidate"/> |
... | ... | |
1317 | 1316 |
<string>Make Label Data</string> |
1318 | 1317 |
</property> |
1319 | 1318 |
</action> |
1320 |
<action name="actionLineRegistration"> |
|
1321 |
<property name="icon"> |
|
1322 |
<iconset resource="../res/MainWindow.qrc"> |
|
1323 |
<normaloff>:/newPrefix/crop.png</normaloff>:/newPrefix/crop.png</iconset> |
|
1324 |
</property> |
|
1325 |
<property name="text"> |
|
1326 |
<string>Line Registration</string> |
|
1327 |
</property> |
|
1328 |
<property name="toolTip"> |
|
1329 |
<string>Line Registration</string> |
|
1330 |
</property> |
|
1331 |
</action> |
|
1332 | 1319 |
</widget> |
1333 | 1320 |
<resources> |
1334 | 1321 |
<include location="../res/MainWindow.qrc"/> |
DTI_PID/WebServer/run.py | ||
---|---|---|
1 | 1 |
from app import app |
2 | 2 |
|
3 | 3 |
if __name__ == '__main__': |
4 |
app.run(port=8080, debug=False, host='0.0.0.0') |
|
4 |
app.run(port=8080, debug=False)#, host='0.0.0.0')
|
|
5 | 5 |
#app.run(debug=False) |
내보내기 Unified diff