개정판 d28da625
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