프로젝트

일반

사용자정보

개정판 d28da625

IDd28da625f4a9a7e7c1db8f73bdd95136ced0ff95
상위 20cce620
하위 91240927, 95b0044d

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

issue #000: add flow mark on going

Change-Id: I64053a79053e84ddfbbe46a0f38446cc9dfeeaac

차이점 보기:

DTI_PID/DTI_PID/ItemTreeWidget.py
27 27
from EngineeringUnknownItem import QEngineeringUnknownItem
28 28
from EngineeringErrorItem import QEngineeringErrorItem
29 29
from EngineeringEndBreakItem import QEngineeringEndBreakItem
30
from EngineeringFlowMarkItem import QEngineeringFlowMarkItem
30 31
from AppDocData import AppDocData
31 32
from Drawing import Drawing
32 33

  
......
504 505
    lastSceneItems = None
505 506
    def sceneChanged(self, sceneItems):
506 507
        try:
507
            changedSceneItems = [item for item in sceneItems if ((issubclass(type(item), SymbolSvgItem) and type(item) is not QEngineeringErrorItem and type(item) is not QEngineeringEndBreakItem) or (type(item) is QEngineeringNoteItem) or (type(item) is QEngineeringLineNoTextItem) 
508
            changedSceneItems = [item for item in sceneItems if ((issubclass(type(item), SymbolSvgItem) and type(item) is not QEngineeringErrorItem and type(item) is not QEngineeringEndBreakItem and type(item) is not QEngineeringFlowMarkItem) or (type(item) is QEngineeringNoteItem) or (type(item) is QEngineeringLineNoTextItem) 
508 509
                                or (type(item) is QEngineeringUnknownItem)) and (not hasattr(item, 'treeItem') or item.treeItem is None)] # Sublist includes SymbolSvgItem
509 510
            first = [item for item in changedSceneItems if item.owner is None]
510 511
            second = [item for item in changedSceneItems if item.owner is not None]
DTI_PID/DTI_PID/LineNoTracer.py
200 200
                    lineno.conns.clear()
201 201
                    minDist = None
202 202
                    startLine = None
203
                    for line in [line for line in lineno.runs[0].items if type(line) is QEngineeringLineItem and line._lineType == 'Primary']:
203
                    for line in [line for line in lineno.runs[0].items if type(line) is QEngineeringLineItem and (line._lineType == 'Primary' or line._lineType == 'Secondary')]:
204 204
                        dist = line.distanceTo((lineno.center().x(), lineno.center().y()))
205 205
                        if (minDist is None) or (dist < minDist):
206 206
                            minDist = dist
......
359 359
                kyouho  2018.09.14  clear Item's owner 
360 360
'''
361 361
def connectAttrImpl(worker, update_line_type):
362
    import os
362
    import os, math
363 363
    from App import App
364 364
    from LineNoTracer import LineNoTracer
365 365
    from AppDocData import AppDocData
......
371 371
    from EngineeringSpecBreakItem import QEngineeringSpecBreakItem
372 372
    from EngineeringVendorItem import QEngineeringVendorItem
373 373
    from EngineeringEndBreakItem import QEngineeringEndBreakItem
374
    from EngineeringFlowMarkItem import QEngineeringFlowMarkItem
374 375
    from EngineeringReservedWordTextItem import QEngineeringReservedWordTextItem
375 376
    from QEngineeringSizeTextItem import QEngineeringSizeTextItem
376 377
    from EngineeringValveOperCodeTextItem import QEngineeringValveOperCodeTextItem
......
378 379
    from QEngineeringTagNoTextItem import QEngineeringTagNoTextItem
379 380

  
380 381
    try:
382
        worker.displayMessage.emit('Initiating...')
381 383
        docdata = AppDocData.instance()
382 384
        symbols = []
383 385
        lines = []
......
386 388
        lineIndicator = []
387 389
        vendor_packages = [item for item in worker.graphicsView.scene.items() if type(item) is QEngineeringVendorItem]
388 390
        end_breaks = []
391
        flow_marks = []
392

  
389 393
        for end_break in [item for item in worker.graphicsView.scene.items() if type(item) is QEngineeringEndBreakItem]:
390 394
            if not end_break.prop('Freeze'):
391 395
                end_break.transfer.onRemoved.emit(end_break)
392 396
                #worker.graphicsView.scene.removeItem(end_break)
393 397
            else:
394 398
                end_breaks.append(end_break)
399
        
400
        for flow_mark in [item for item in worker.graphicsView.scene.items() if type(item) is QEngineeringFlowMarkItem]:
401
            if not flow_mark.prop('Freeze'):
402
                flow_mark.transfer.onRemoved.emit(flow_mark)
403
                #worker.graphicsView.scene.removeItem(end_break)
404
            else:
405
                flow_marks.append(flow_mark)
395 406

  
396 407
        configs = docdata.getConfigs('Supplied by Tag Rule', 'by Vendor')
397 408
        vendorTag = configs[0].value if configs else 'By Vendor'
......
435 446
        # up to here
436 447

  
437 448
        # connect attribute
449
        worker.displayMessage.emit('Connecting Attribute...')
438 450
        texts = [item for item in worker.graphicsView.scene.items() if issubclass(type(item), QEngineeringTextItem)]
439 451
        for text in texts:
440 452
            text.onwer = None
......
470 482

  
471 483
        """ update line type """
472 484
        if update_line_type == True:
485
            worker.displayMessage.emit('Updating Line Type...')
473 486
            #lines = [line for line in worker.graphicsView.scene.items() if type(line) is QEngineeringLineItem]
474 487
            #for line in lines: line.lineType = 'Primary'
475 488
            for line in lines: line.update_line_type()
......
534 547
                    if not end_break.prop('Freeze'):
535 548
                        end_break.transfer.onRemoved.connect(App.mainWnd().itemRemoved)
536 549
                        end_break.addSvgItemToScene(worker.graphicsView.scene)
550
        
551
        """make flow mark"""
552
        line_names = docdata.getSymbolListByType('type', 'Line')
553
        if len(line_names) is not 0:
554
                
555
            svgFileName = line_names[0].sName
556
            symbol = docdata.getSymbolByQuery('name', svgFileName)
557
            svgFilePath = os.path.join(docdata.getCurrentProject().getSvgFilePath(), symbol.getType(), svgFileName+'.svg')
558

  
559
            allowed_error = 0.000001
560

  
561
            for lineNo in lineNos + docdata.tracerLineNos:
562
                for run in lineNo.runs:
563
                    pre = None
564
                    preRadian = None
565
                    for item in run.items:
566
                        if pre is None and type(item) is QEngineeringLineItem and (item._lineType == 'Primary' or item._lineType == 'Secondary'):
567
                            pre = item
568
                            start = item.line().p1()
569
                            end = item.line().p2()
570
                            _dir = [(end.x() - start.x())/item.length(), (end.y() - start.y())/item.length()]
571
                            radian = math.atan2(_dir[0], _dir[1]) - math.pi / 2
572
                            preRadian = radian if radian >= 0 else radian + 2 * math.pi
573
                            preDir = _dir
574
                            #print(_dir)
575
                            continue
576
                        elif type(item) is QEngineeringLineItem and (item._lineType == 'Primary' or item._lineType == 'Secondary'):
577
                            pre._flowMark = []
578
                            start = item.line().p1()
579
                            end = item.line().p2()
580
                            _dir = [(end.x() - start.x())/item.length(), (end.y() - start.y())/item.length()]
581
                            radian = math.atan2(_dir[0], _dir[1]) - math.pi / 2
582
                            currRadian = radian if radian >= 0 else radian + 2 * math.pi
583
                            if abs(currRadian - preRadian) > allowed_error:
584
                                # insert flow mark at pre line
585
                                #print(currRadian)
586
                                flow_mark = SymbolSvgItem.createItem(symbol.getType(), svgFilePath)
587
                                pt = [pre.connectors[1].center()[0] - float(symbol.getOriginalPoint().split(',')[0]) - preDir[0] * 20, pre.connectors[1].center()[1] - float(symbol.getOriginalPoint().split(',')[1]) - preDir[1] * 20]
588
                                origin = [0,0]
589
                                if 2 == len(symbol.getOriginalPoint().split(',')):
590
                                    tokens = symbol.getOriginalPoint().split(',')
591
                                    origin = [pt[0] + float(tokens[0]), pt[1] + float(tokens[1])]
592
                                flow_mark.buildItem(svgFileName, symbol.getType(), preRadian, pt, [flow_mark.boundingRect().width(), flow_mark.boundingRect().height()], origin, [], symbol.getBaseSymbol(), symbol.getAdditionalSymbol(), symbol.getHasInstrumentLabel())
593
                                flow_mark.setToolTip('owner : ' + str(pre))
594
                                flow_mark.area = 'Drawing'
595
                                flow_mark.owner = pre
596
                                flow_mark.setParentItem(pre)
597
                                pre._flowMark.append(flow_mark)
598
                                flow_marks.append(flow_mark)
599

  
600
                                pre = item
601
                                preDir = _dir
602
                                preRadian = currRadian
603
            
604
            for flow_mark in flow_marks:
605
                if not flow_mark.prop('Freeze'):
606
                    flow_mark.transfer.onRemoved.connect(App.mainWnd().itemRemoved)
607
                    flow_mark.addSvgItemToScene(worker.graphicsView.scene)
537 608

  
538 609
    except Exception as ex:
539 610
        from App import App 
DTI_PID/DTI_PID/MainWindow.py
48 48
from EngineeringVendorItem import QEngineeringVendorItem
49 49
from EngineeringEndBreakItem import QEngineeringEndBreakItem
50 50
from EngineeringReducerItem import QEngineeringReducerItem
51
from EngineeringFlowMarkItem import QEngineeringFlowMarkItem
51 52
from AppDocData import *
52 53
import SymbolTreeWidget, SymbolPropertyTableWidget
53 54
import SymbolEditorDialog
......
1631 1632
                        break
1632 1633
                if done: break
1633 1634

  
1635
            if type(item) is QEngineeringFlowMarkItem and item.parentItem():
1636
                item.parentItem()._flowMark.pop(item.parent()._flowMark.index(item))
1637

  
1634 1638
            if item.scene() is not None: item.scene().removeItem(item)
1635 1639
        except Exception as ex:
1636 1640
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
......
2319 2323
            #self.graphicsView.scene.blockSignals(True)
2320 2324

  
2321 2325
            symbols = []
2326
            lines = []
2322 2327

  
2323 2328
            xml = parse(xmlPath)
2324 2329
            root = xml.getroot()
......
2395 2400

  
2396 2401
            for line in root.find('LINEINFOS').iter('LINE'):
2397 2402
                item = QEngineeringLineItem.fromXml(line)
2398
                item.transfer.onRemoved.connect(self.itemRemoved)
2399 2403
                if item:
2404
                    item.transfer.onRemoved.connect(self.itemRemoved)
2400 2405
                    self.graphicsView.scene.addItem(item)
2406
                    lines.append(item)
2401 2407

  
2402 2408
                self.progress.setValue(self.progress.value() + 1)
2403 2409
                
......
2482 2488
                    item = QEngineeringVendorItem.fromXml(vendor)
2483 2489
                    item.transfer.onRemoved.connect(self.itemRemoved)
2484 2490
                    self.graphicsView.scene.addItem(item)
2491

  
2485 2492
            # up to here
2486 2493

  
2487 2494
            """ update scene """
......
2489 2496
            for item in self.graphicsView.scene.items():
2490 2497
                item.setVisible(True)
2491 2498

  
2499
            # connect flow item to line
2500
            #for flowMark in [item for item in symbols if type(item) is QEngineeringFlowMarkItem]:
2501
            #    for line in lines:
2502
            #        if flowMark.owner is line:
2503
            #            line._flowMark.append(flowMark)
2504
            #            flowMark.setParentItem(line)
2505

  
2492 2506
        except Exception as ex:
2493 2507
            message = 'error occured({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename, sys.exc_info()[-1].tb_lineno)
2494 2508
            self.addMessage.emit(MessageType.Error, message)
DTI_PID/DTI_PID/RecognitionDialog.py
591 591
            for pts in connectedLines:
592 592
                processLine = QEngineeringLineItem(vertices=[(area.x + param[0], area.y + param[1]) for param in pts[:-1]], thickness=pts[2])
593 593
                processLine.area = 'Drawing'
594
                processLine.lineType = 'Primary'
594
                processLine.lineType = 'Secondary'
595 595

  
596 596
                appDocData.lines.append(processLine)
597 597
                appDocData.allItems.append(processLine)
DTI_PID/DTI_PID/Shapes/EngineeringFlowMarkItem.py
1
# coding: utf-8
2
"""
3
This is Engineering Flow Mark Item module
4
"""
5

  
6
import sys
7
import os
8
import math
9
from PyQt5.QtGui import *
10
from PyQt5.QtCore import *
11
from PyQt5.QtSvg import *
12
from PyQt5.QtWidgets import *
13

  
14
from SymbolSvgItem import SymbolSvgItem
15
from SymbolAttr import SymbolAttr
16

  
17
class QEngineeringFlowMarkItem(SymbolSvgItem):
18
    """
19
    This is Engineering Flow Mark Item class
20
    """
21
    clicked = pyqtSignal(QGraphicsSvgItem)
22

  
23
    '''
24
    '''
25
    ZVALUE = 99
26
    def __init__(self, path, uid=None, flip=0):
27
        from SymbolAttr import SymbolProp
28
        from EngineeringFreezeItem import QEngineeringFreezeItem
29

  
30
        SymbolSvgItem.__init__(self, path, uid, flip=flip)
31
        self.setZValue(QEngineeringFlowMarkItem.ZVALUE)
32

  
33
        self._properties = \
34
            {\
35
                SymbolProp(None, 'Freeze', 'Boolean'):False
36
            }
37

  
38
        """ create freeze control """
39
        #self.freeze_item = QEngineeringFreezeItem(-QEngineeringFreezeItem.FREEZE_SIZE*0.5, -QEngineeringFreezeItem.FREEZE_SIZE*0.5, QEngineeringFreezeItem.FREEZE_SIZE, QEngineeringFreezeItem.FREEZE_SIZE)
40
        #self.freeze_item.setParentItem(self)
41
        #self.freeze_item.setZValue(self.zValue() + 1)
42
        #self.freeze_item.setPen(Qt.black)
DTI_PID/DTI_PID/Shapes/EngineeringLineItem.py
48 48
            self.isCreated = True 
49 49

  
50 50
            self._owner = None
51
            self._flowMark = None
52
            self._lineType = 'Primary'  # defulat line type is 'Primary'
51
            self._flowMark = []
52
            self._lineType = 'Secondary'  # defulat line type is 'Secondary'
53 53
            self._properties = \
54 54
                {\
55 55
                    SymbolProp(None, 'Size', 'Size Text Item', Expression='self.EvaluatedSize'):None\
......
1162 1162

  
1163 1163
            item = QEngineeringLineItem(vertices=[startPoint, endPoint], uid=uid)
1164 1164
            item.setVisible(False)
1165
            item.lineType = node.find('TYPE').text if node.find('TYPE') is not None else 'Primary'
1165
            item.lineType = node.find('TYPE').text if node.find('TYPE') is not None else 'Secondary'
1166 1166
            ## assign area
1167 1167
            if node.find('AREA') is None:
1168 1168
                appDocData = AppDocData.instance()
......
1345 1345

  
1346 1346
    def update_arrow(self):
1347 1347
        """ update flow arrow """
1348
        import math
1348 1349
        from EngineeringArrowItem import QEngineeringArrowItem
1349 1350
        if self.length() is 0:
1350 1351
            return
......
1370 1371
        self._arrow.setBrush(Qt.blue)
1371 1372
        self._arrow.update()
1372 1373

  
1374
        if self._flowMark:
1375
            flowMark = self._flowMark[0]
1376
            flowMark.angle = math.atan2(_dir[0], _dir[1]) - math.pi / 2
1377
            flowMark.loc = [self.connectors[1].center()[0] - flowMark.symbolOrigin[0] - _dir[0] * 20, self.connectors[1].center()[1] - flowMark.symbolOrigin[1] - _dir[1] * 20]
1378
            flowMark.origin = [self.connectors[1].center()[0] - _dir[0] * 20, self.connectors[1].center()[1] - _dir[1] * 20]
1379
            scene = flowMark.scene()
1380
            scene.removeItem(flowMark)
1381
            flowMark.addSvgItemToScene(scene)
1382

  
1373 1383
    '''
1374 1384
        @brief      reshape line
1375 1385
        @author     humkyung
DTI_PID/DTI_PID/Shapes/SymbolSvgItem.py
1201 1201
        from EngineeringReducerItem import QEngineeringReducerItem
1202 1202
        from EngineeringErrorItem import QEngineeringErrorItem
1203 1203
        from EngineeringEndBreakItem import QEngineeringEndBreakItem
1204
        from EngineeringFlowMarkItem import QEngineeringFlowMarkItem
1204 1205
        from AppDocData import AppDocData
1205 1206
        import uuid
1206 1207

  
......
1224 1225
            item = QEngineeringErrorItem(path, uid, flip=flip)
1225 1226
        elif type == 'End Break':
1226 1227
            item = QEngineeringEndBreakItem(path, uid, flip=flip)
1228
        elif type == 'Line':
1229
            item = QEngineeringFlowMarkItem(path, uid, flip=flip)
1227 1230
        else:
1228 1231
            item = SymbolSvgItem(path, uid, flip=flip)
1229 1232

  

내보내기 Unified diff

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