프로젝트

일반

사용자정보

개정판 edb51ab4

IDedb51ab456ba838f44327764a19dd7359fa2394c
상위 91a4b6c6
하위 de06897c

함의성이(가) 4년 이상 전에 추가함

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

클립보드 이미지 추가 (최대 크기: 500 MB)