프로젝트

일반

사용자정보

개정판 6642ad5b

ID6642ad5bde31ff2114281ed526c0892f3ccc6b6f
상위 565ec74a
하위 60ace834

백흠경이(가) 4년 이상 전에 추가함

issue #1445: support text element

Change-Id: If61c57741e84986caa47f60c2a531b2abe87c370

차이점 보기:

DTI_PID/DTI_PID/DEXPI/Equipment.py
8 8
from .Extent import Extent
9 9
from .Presentation import Presentation
10 10
from .Shape import Point, Line as DEXPI_Line, ConnectionPoints, GenericAttributes, BsplineCurve
11
from .Transform import Transform
12
from .Text import Text
11 13

  
12 14

  
13 15
class Equipment:
......
17 19
        pass
18 20

  
19 21
    @staticmethod
20
    def to_transform(matrix: str) -> QTransform:
21
        """convert given value to transform"""
22
        import sys
23
        import re
24

  
25
        res = None
26
        try:
27
            if 'matrix' in matrix:
28
                _str = matrix[len('matrix('):-1]
29
                tokens = _str.split(',')
30

  
31
                res = QTransform(float(tokens[0]), float(tokens[1]),
32
                                 float(tokens[2]), float(tokens[3]),
33
                                 float(tokens[4]), float(tokens[5]))
34
            else:
35
                float_re = '[+-]?(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?'
36

  
37
                translate_trans = None
38
                if 'translate' in matrix:
39
                    match = re.search(f"translate\({float_re},{float_re}\)", matrix)
40
                    if match:
41
                        _str = match.group()[len('translate('):-1]
42
                        tokens = _str.split(',')
43

  
44
                        translate_trans = QTransform()
45
                        translate_trans.translate(float(tokens[0]), float(tokens[1]))
46

  
47
                scale_trans = None
48
                if 'scale' in matrix:
49
                    match = re.search(f"scale\({float_re},{float_re}\)", matrix)
50
                    if match:
51
                        _str = match.group()[len('scale('):-1]
52
                        tokens = _str.split(',')
53

  
54
                        scale_trans = QTransform()
55
                        scale_trans.scale(float(tokens[0]), float(tokens[1]))
56

  
57
                if translate_trans and scale_trans:
58
                    res = scale_trans * translate_trans
59
                elif translate_trans:
60
                    res = translate_trans
61
                elif scale_trans:
62
                    res = scale_trans
63
        except Exception as ex:
64
            message = f"error occurred({repr(ex)}) in {sys.exc_info()[-1].tb_frame.f_code.co_filename}:" \
65
                      f"{sys.exc_info()[-1].tb_lineno}"
66
            print(message)
67

  
68
        return res
69

  
70
    @staticmethod
71
    def apply_transform(trans: QTransform, pos: complex) -> complex:
72
        """transform given pos and then return the result"""
73
        res = trans.map(QPointF(pos.real, pos.imag))
74
        return complex(res.x(), res.y())
75

  
76
    @staticmethod
77
    def to_xml(item) -> Element:
22
    def to_xml(texts: list, item) -> Element:
78 23
        """return element for equipment"""
79 24
        import sys
80 25
        from svg.path import Path, Line, Arc, CubicBezier, QuadraticBezier, parse_path
......
105 50
            _node.attrib['Identifier'] = str(item.uid)
106 51
            _node.attrib['Context'] = 'ID2'
107 52

  
53
            for text in texts:
54
                Text.to_xml(node, text, item)
55

  
108 56
            svg = item.to_svg(parent=None)
109 57
            matrix_trans = None
110 58
            if 'transform' in svg[0].attrib:
111
                matrix_trans = Equipment.to_transform(svg[0].attrib['transform'])
59
                matrix_trans = Transform.to_transform(svg[0].attrib['transform'])
112 60

  
113 61
            paths = svg[0].findall('path')
114 62
            for path in paths:
115
                _trans = Equipment.to_transform(path.attrib['transform'])
63
                _trans = Transform.to_transform(path.attrib['transform'])
116 64
                trans = _trans * matrix_trans
117 65
                path_ele = parse_path(path.attrib['d'])
118 66
                for idx, ele in enumerate(path_ele):
119 67
                    if type(ele) is Move:
120 68
                        continue
121 69
                    elif type(ele) is Line:
122
                        line = DEXPI_Line(Equipment.apply_transform(trans, ele.start),
123
                                          Equipment.apply_transform(trans, ele.end))
124
                        node.append(line.to_xml())
70
                        line = DEXPI_Line(Transform.apply_transform(trans, ele.start),
71
                                          Transform.apply_transform(trans, ele.end))
72
                        node.append(line.to_xml(item.scene().sceneRect()))
125 73
                    elif type(ele) is Arc:
126 74
                        continue
127 75
                    elif type(ele) is CubicBezier:
76
                        _node = DEXPI_Line(Transform.apply_transform(trans, ele.start),
77
                                           Transform.apply_transform(trans, ele.control1))
78
                        node.append(_node.to_xml(item.scene().sceneRect()))
79

  
80
                        _node = DEXPI_Line(Transform.apply_transform(trans, ele.control1),
81
                                           Transform.apply_transform(trans, ele.control2))
82
                        node.append(_node.to_xml(item.scene().sceneRect()))
83

  
84
                        _node = DEXPI_Line(Transform.apply_transform(trans, ele.control2),
85
                                           Transform.apply_transform(trans, ele.end))
86
                        node.append(_node.to_xml(item.scene().sceneRect()))
87
                        """
128 88
                        bspline_curve_node = BsplineCurve.to_xml(controls=[Equipment.apply_transform(trans, ele.start),
129 89
                                                                           Equipment.apply_transform(trans, ele.control1),
130 90
                                                                           Equipment.apply_transform(trans, ele.control2),
131 91
                                                                           Equipment.apply_transform(trans, ele.end)],
132 92
                                                                 _type='BsplineCurve', knots=[])
133 93
                        node.append(bspline_curve_node)
94
                        """
134 95
                    elif type(ele) is QuadraticBezier:
135 96
                        continue
136 97
                    else:
DTI_PID/DTI_PID/DEXPI/PipingComponent.py
8 8
from .Extent import Extent
9 9
from .Presentation import Presentation
10 10
from .Shape import Point, Line as DEXPI_Line, ConnectionPoints, GenericAttributes, BsplineCurve
11
from .Transform import Transform
12
from .Text import Text
11 13

  
12 14

  
13 15
class PipingComponent:
......
17 19
        pass
18 20

  
19 21
    @staticmethod
20
    def to_transform(matrix: str) -> QTransform:
21
        """convert given value to transform"""
22
        import sys
23
        import re
24

  
25
        res = None
26
        try:
27
            if 'matrix' in matrix:
28
                _str = matrix[len('matrix('):-1]
29
                tokens = _str.split(',')
30

  
31
                res = QTransform(float(tokens[0]), float(tokens[1]),
32
                                 float(tokens[2]), float(tokens[3]),
33
                                 float(tokens[4]), float(tokens[5]))
34
            else:
35
                float_re = '[+-]?(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?'
36

  
37
                translate_trans = None
38
                if 'translate' in matrix:
39
                    match = re.search(f"translate\({float_re},{float_re}\)", matrix)
40
                    if match:
41
                        _str = match.group()[len('translate('):-1]
42
                        tokens = _str.split(',')
43

  
44
                        translate_trans = QTransform()
45
                        translate_trans.translate(float(tokens[0]), float(tokens[1]))
46

  
47
                scale_trans = None
48
                if 'scale' in matrix:
49
                    match = re.search(f"scale\({float_re},{float_re}\)", matrix)
50
                    if match:
51
                        _str = match.group()[len('scale('):-1]
52
                        tokens = _str.split(',')
53

  
54
                        scale_trans = QTransform()
55
                        scale_trans.scale(float(tokens[0]), float(tokens[1]))
56

  
57
                if translate_trans and scale_trans:
58
                    res = scale_trans * translate_trans
59
                elif translate_trans:
60
                    res = translate_trans
61
                elif scale_trans:
62
                    res = scale_trans
63
        except Exception as ex:
64
            message = f"error occurred({repr(ex)}) in {sys.exc_info()[-1].tb_frame.f_code.co_filename}:" \
65
                      f"{sys.exc_info()[-1].tb_lineno}"
66
            print(message)
67

  
68
        return res
69

  
70
    @staticmethod
71
    def apply_transform(trans: QTransform, pos: complex) -> complex:
72
        """transform given pos and then return the result"""
73
        res = trans.map(QPointF(pos.real, pos.imag))
74
        return complex(res.x(), res.y())
75

  
76
    @staticmethod
77
    def to_xml(item) -> Element:
22
    def to_xml(texts: list, item) -> Element:
78 23
        """return element for equipment"""
79 24
        import sys
80 25
        from svg.path import Path, Line, Arc, CubicBezier, QuadraticBezier, parse_path
......
92 37
            Presentation.to_xml(node, layer='0', color='0', line_type='0', line_weight=1, r=0, g=0, b=0)
93 38
            Extent.to_xml(node, item=item)
94 39

  
40
            for text in texts:
41
                Text.to_xml(node, text, item)
42

  
95 43
            _node = SubElement(node, 'Position')
96 44
            pt = item.pos()
97 45
            _node.append(Point.to_xml('Location', pt.x(), pt.y()))
......
107 55
            svg = item.to_svg(parent=None)
108 56
            matrix_trans = None
109 57
            if 'transform' in svg[0].attrib:
110
                matrix_trans = PipingComponent.to_transform(svg[0].attrib['transform'])
58
                matrix_trans = Transform.to_transform(svg[0].attrib['transform'])
111 59

  
112 60
            paths = svg[0].findall('path')
113 61
            for path in paths:
114
                _trans = PipingComponent.to_transform(path.attrib['transform'])
62
                _trans = Transform.to_transform(path.attrib['transform'])
115 63
                trans = _trans * matrix_trans
116 64
                path_ele = parse_path(path.attrib['d'])
117 65
                for idx, ele in enumerate(path_ele):
118 66
                    if type(ele) is Move:
119 67
                        continue
120 68
                    elif type(ele) is Line:
121
                        line = DEXPI_Line(PipingComponent.apply_transform(trans, ele.start),
122
                                          PipingComponent.apply_transform(trans, ele.end))
123
                        node.append(line.to_xml())
69
                        line = DEXPI_Line(Transform.apply_transform(trans, ele.start),
70
                                          Transform.apply_transform(trans, ele.end))
71
                        node.append(line.to_xml(item.scene().sceneRect()))
124 72
                    elif type(ele) is Arc:
125 73
                        continue
126 74
                    elif type(ele) is CubicBezier:
75
                        _node = DEXPI_Line(Transform.apply_transform(trans, ele.start),
76
                                           Transform.apply_transform(trans, ele.control1))
77
                        node.append(_node.to_xml(item.scene().sceneRect()))
78

  
79
                        _node = DEXPI_Line(Transform.apply_transform(trans, ele.control1),
80
                                           Transform.apply_transform(trans, ele.control2))
81
                        node.append(_node.to_xml(item.scene().sceneRect()))
82

  
83
                        _node = DEXPI_Line(Transform.apply_transform(trans, ele.control2),
84
                                           Transform.apply_transform(trans, ele.end))
85
                        node.append(_node.to_xml(item.scene().sceneRect()))
86

  
87
                        """
127 88
                        bspline_curve_node = BsplineCurve.to_xml(controls=[PipingComponent.apply_transform(trans, ele.start),
128 89
                                                                           PipingComponent.apply_transform(trans, ele.control1),
129 90
                                                                           PipingComponent.apply_transform(trans, ele.control2),
130 91
                                                                           PipingComponent.apply_transform(trans, ele.end)],
131 92
                                                                 _type='BsplineCurve', knots=[])
132 93
                        node.append(bspline_curve_node)
94
                        """
133 95
                    elif type(ele) is QuadraticBezier:
134 96
                        continue
135 97
                    else:
DTI_PID/DTI_PID/DEXPI/PipingNetworkSegment.py
3 3

  
4 4
from xml.etree.ElementTree import Element, SubElement, dump, ElementTree, parse, tostring
5 5
from PyQt5.QtWidgets import *
6
from PyQt5.QtGui import *
7
from PyQt5.QtCore import *
8
from EngineeringTextItem import QEngineeringTextItem
6 9
from .Extent import Extent
7
from .Shape import Point
10
from .Shape import Point, Line as DEXPI_Line
8 11
from .Presentation import Presentation
9 12
from .PipingComponent import PipingComponent
13
from .Transform import Transform
10 14

  
11 15

  
12 16
class PipingNetworkSegment:
......
16 20
        pass
17 21

  
18 22
    @staticmethod
19
    def to_xml(parent: Element, run) -> Element:
23
    def to_xml(parent: Element, run, scene) -> Element:
20 24
        """return element for PipingNetworkSegment"""
21 25

  
22 26
        from EngineeringLineItem import QEngineeringLineItem
......
31 35

  
32 36
        for item in run.items:
33 37
            if type(item) is QEngineeringLineItem:
34
                PipingNetworkSegment.line_to_xml(node, item)
38
                line = DEXPI_Line(Transform.apply_transform(QTransform(),
39
                                                            complex(item.start_point()[0], item.start_point()[1])),
40
                                  Transform.apply_transform(QTransform(),
41
                                                            complex(item.end_point()[0], item.end_point()[1])))
42
                node.append(line.to_xml(scene.sceneRect()))
35 43
            elif issubclass(type(item), SymbolSvgItem):
36
                comp_node = PipingComponent.to_xml(item)
44
                texts = [child for child in scene.items() if type(child) is QEngineeringTextItem and
45
                         str(child.owner) == str(item.uid)]
46

  
47
                comp_node = PipingComponent.to_xml(texts, item)
37 48
                if comp_node:
38 49
                    node.append(comp_node)
39 50

  
......
54 65
        x, y = line.end_point()[0], line.end_point()[1]
55 66
        node.append(Point.to_xml('Coordinate', x=x, y=y))
56 67

  
57
        return node
68
        return node
DTI_PID/DTI_PID/DEXPI/PipingNetworkSystem.py
14 14
        pass
15 15

  
16 16
    @staticmethod
17
    def to_xml(parent: Element, line_no) -> Element:
17
    def to_xml(parent: Element, line_no, scene) -> Element:
18 18
        """return element for PipingNetworkSystem"""
19 19

  
20 20
        node = SubElement(parent, 'PipingNetworkSystem')
......
25 25
        node.attrib['Status'] = 'Current'
26 26

  
27 27
        for run in line_no.runs:
28
            PipingNetworkSegment.to_xml(node, run)
28
            PipingNetworkSegment.to_xml(node, run, scene)
29 29

  
30 30
        return node
DTI_PID/DTI_PID/DEXPI/Shape.py
2 2
""" This is Shape module """
3 3

  
4 4
from xml.etree.ElementTree import Element, SubElement, dump, ElementTree, parse, tostring
5
from PyQt5.QtCore import *
5 6
from .Presentation import Presentation
6 7

  
7 8

  
......
26 27
        self.start = start
27 28
        self.end = end
28 29

  
29
    def to_xml(self):
30
    def to_xml(self, rect: QRectF):
30 31
        node = Element('Line')
31 32
        Presentation.to_xml(node, layer='125', color='0', line_type='1', line_weight=0.35, r=0, g=0, b=0)
32 33
        extent_node = SubElement(node, 'Extent')
......
40 41
        max_node.attrib['Z'] = '0'
41 42
        coordinate_node = SubElement(node, 'Coordinate')
42 43
        coordinate_node.attrib['X'] = str(self.start.real)
43
        coordinate_node.attrib['Y'] = str(self.start.imag)
44
        coordinate_node.attrib['Y'] = str(rect.height() - self.start.imag)
44 45
        coordinate_node.attrib['Z'] = '0'
45 46
        coordinate_node = SubElement(node, 'Coordinate')
46 47
        coordinate_node.attrib['X'] = str(self.end.real)
47
        coordinate_node.attrib['Y'] = str(self.end.imag)
48
        coordinate_node.attrib['Y'] = str(rect.height() - self.end.imag)
48 49
        coordinate_node.attrib['Z'] = '0'
49 50

  
50 51
        return node
DTI_PID/DTI_PID/DEXPI/Text.py
1
# coding: utf-8
2
""" This is Text module """
3

  
4
from xml.etree.ElementTree import Element, SubElement, dump, ElementTree, parse, tostring
5
from PyQt5.QtWidgets import *
6
from PyQt5.QtGui import *
7
from PyQt5.QtCore import *
8
from .Extent import Extent
9
from .Presentation import Presentation
10
from .Shape import Point, Line as DEXPI_Line, ConnectionPoints, GenericAttributes, BsplineCurve
11
from .Transform import Transform
12

  
13

  
14
class Text:
15
    def __init__(self):
16
        pass
17

  
18
    @staticmethod
19
    def to_xml(parent: Element, item, owner: str) -> Element:
20
        """return element for equipment"""
21
        import sys
22
        from svg.path import Path, Line, Arc, CubicBezier, QuadraticBezier, parse_path
23
        from svg.path.path import Move
24

  
25
        node = None
26
        try:
27
            svg = item.to_svg(owner)
28

  
29
            if svg:
30
                node = SubElement(parent, 'Text')
31
                node.attrib['Font'] = svg[0].attrib['font-family']
32
                node.attrib['Width'] = svg[0].attrib['font-size']
33
                node.attrib['Height'] = svg[0].attrib['font-size']
34
                node.attrib['String'] = svg[0].find('text').text
35
                node.attrib['Justification'] = 'LeftTop'
36
                node.attrib['TextAngle'] = '0'
37
                node.attrib['SlantAngle'] = '0'
38

  
39
                Presentation.to_xml(node, layer='22', color='0', line_type='0', line_weight=1, r=0, g=0, b=0)
40
                Extent.to_xml(node, item=item)
41

  
42
                _node = SubElement(node, 'Position')
43
                _node.append(Point.to_xml('Location', item.loc[0], item.scene().sceneRect().height() - item.loc[1] -
44
                                          float(node.attrib['Height'])))
45
                _node.append(Point.to_xml('Axis', 0, 0, 1))
46
                _node.append(Point.to_xml('Reference', 1, 0, 0))
47
        except Exception as ex:
48
            message = f"error occurred({repr(ex)}) in {sys.exc_info()[-1].tb_frame.f_code.co_filename}:" \
49
                      f"{sys.exc_info()[-1].tb_lineno}"
50
            print(message)
51

  
52
        return None
53

  
54

  
55
class Nozzle:
56
    def __init__(self):
57
        pass
58

  
59
    @staticmethod
60
    def to_xml(item) -> Element:
61
        """return element for nozzle"""
62

  
63
        node = Element('Nozzle')
64
        node.attrib['ID'] = ''
65
        node.attrib['TagName'] = ''
66
        node.attrib['ComponentClass'] = 'Nozzle'
67
        node.attrib['ComponentName'] = ''
68
        node.attrib['ComponentType'] = 'Explicit'
69
        node.attrib['Status'] = 'Current'
70

  
71
        Presentation.to_xml(node, layer='30', color='0', line_type='0', line_weight=0.1, r=0, g=0, b=0)
72

  
73
        return node
DTI_PID/DTI_PID/DEXPI/Transform.py
1
# coding: utf-8
2
""" This is Transform module """
3

  
4
from xml.etree.ElementTree import Element, SubElement, dump, ElementTree, parse, tostring
5
from PyQt5.QtGui import *
6
from PyQt5.QtCore import *
7

  
8

  
9
class Transform:
10
    def __init__(self):
11
        pass
12

  
13
    @staticmethod
14
    def to_transform(matrix: str) -> QTransform:
15
        """convert given value to transform"""
16
        import sys
17
        import re
18

  
19
        res = None
20
        try:
21
            if 'matrix' in matrix:
22
                _str = matrix[len('matrix('):-1]
23
                tokens = _str.split(',')
24

  
25
                res = QTransform(float(tokens[0]), float(tokens[1]),
26
                                 float(tokens[2]), float(tokens[3]),
27
                                 float(tokens[4]), float(tokens[5]))
28
            else:
29
                float_re = '[+-]?(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?'
30

  
31
                translate_trans, reverse_trans = None, None
32
                if 'translate' in matrix:
33
                    match = re.search(f"translate\({float_re},{float_re}\)", matrix)
34
                    if match:
35
                        _str = match.group()[len('translate('):-1]
36
                        tokens = _str.split(',')
37

  
38
                        translate_trans = QTransform()
39
                        translate_trans.translate(float(tokens[0]), float(tokens[1]))
40

  
41
                        reverse_trans = QTransform()
42
                        reverse_trans.translate(-float(tokens[0]), -float(tokens[1]))
43

  
44
                scale_trans = None
45
                if 'scale' in matrix:
46
                    match = re.search(f"scale\({float_re},{float_re}\)", matrix)
47
                    if match:
48
                        _str = match.group()[len('scale('):-1]
49
                        tokens = _str.split(',')
50

  
51
                        scale_trans = QTransform()
52
                        scale_trans.scale(float(tokens[0]), float(tokens[1]))
53

  
54
                if translate_trans and scale_trans:
55
                    res = scale_trans * translate_trans
56
                elif translate_trans:
57
                    res = translate_trans
58
                elif scale_trans:
59
                    res = scale_trans
60
        except Exception as ex:
61
            message = f"error occurred({repr(ex)}) in {sys.exc_info()[-1].tb_frame.f_code.co_filename}:" \
62
                      f"{sys.exc_info()[-1].tb_lineno}"
63
            print(message)
64

  
65
        return res
66

  
67
    @staticmethod
68
    def apply_transform(trans: QTransform, pos: complex) -> complex:
69
        """transform given pos and then return the result"""
70
        res = trans.map(QPointF(pos.real, pos.imag))
71
        return complex(res.x(), res.y())
DTI_PID/DTI_PID/DEXPI/formatter.py
7 7
from PyQt5.QtWidgets import *
8 8
from EngineeringEquipmentItem import QEngineeringEquipmentItem
9 9
from EngineeringLineNoTextItem import QEngineeringLineNoTextItem
10
from EngineeringTextItem import QEngineeringTextItem
10 11

  
11 12
from .Drawing import Drawing
12 13
from .Extent import Extent
......
63 64
            """equipment nodes"""
64 65
            equipments = [item for item in scene.items() if type(item) is QEngineeringEquipmentItem]
65 66
            for equipment in equipments:
66
                node = Equipment.to_xml(equipment)
67
                texts = [item for item in scene.items() if type(item) is QEngineeringTextItem and
68
                         str(item.owner) == str(equipment.uid)]
69
                node = Equipment.to_xml(texts, equipment)
67 70
                xml.append(node)
68 71

  
69 72
            """piping network system"""
70 73
            line_nos = [item for item in scene.items() if type(item) is QEngineeringLineNoTextItem]
71 74
            for line_no in line_nos:
72
                PipingNetworkSystem.to_xml(xml, line_no)
75
                PipingNetworkSystem.to_xml(xml, line_no, scene)
73 76

  
74 77
            for item in scene.items():
75 78
                formatter(item)
DTI_PID/DTI_PID/Shapes/EngineeringTextItem.py
853 853
                res.append(node)
854 854
        except Exception as ex:
855 855
            from App import App
856
            message = 'error occurred({}) in {}:{}'.format(ex, sys.exc_info()[-1].tb_frame.f_code.co_filename,
857
                                                          sys.exc_info()[-1].tb_lineno)
856
            message = f"error occurred({repr(ex)}) in {sys.exc_info()[-1].tb_frame.f_code.co_filename}:" \
857
                      f"{sys.exc_info()[-1].tb_lineno}"
858 858
            App.mainWnd().addMessage.emit(MessageType.Error, message)
859 859

  
860 860
        return res

내보내기 Unified diff

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