123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- # Created: 25.03.2011
- # Copyright (c) 2011-2018, Manfred Moitzi
- # License: MIT License
- from typing import TYPE_CHECKING, Tuple, Union
- from ezdxf.lldxf.const import DXFValueError
- from ezdxf.lldxf import const
- from .graphics import GraphicEntity, ExtendedTags, make_attribs, DXFAttr, XType
- if TYPE_CHECKING:
- from ezdxf.eztypes import Vertex
- _TEXT_TPL = """0
- TEXT
- 5
- 0
- 8
- 0
- 10
- 0.0
- 20
- 0.0
- 30
- 0.0
- 40
- 1.0
- 1
- TEXTCONTENT
- 50
- 0.0
- 51
- 0.0
- 7
- STANDARD
- 41
- 1.0
- 71
- 0
- 72
- 0
- 73
- 0
- 11
- 0.0
- 21
- 0.0
- 31
- 0.0
- """
- class Text(GraphicEntity):
- __slots__ = ()
- TEMPLATE = ExtendedTags.from_text(_TEXT_TPL)
- DXFATTRIBS = make_attribs({
- 'insert': DXFAttr(10, xtype=XType.any_point),
- 'height': DXFAttr(40),
- 'text': DXFAttr(1),
- 'rotation': DXFAttr(50, default=0.0), # in degrees (circle = 360deg)
- 'oblique': DXFAttr(51, default=0.0), # in degrees, vertical = 0deg
- 'style': DXFAttr(7, default='STANDARD'), # text style
- 'width': DXFAttr(41, default=1.0), # width FACTOR!
- 'text_generation_flag': DXFAttr(71, default=0), # 2 = backward (mirr-x), 4 = upside down (mirr-y)
- 'halign': DXFAttr(72, default=0), # horizontal justification
- 'valign': DXFAttr(73, default=0), # vertical justification
- 'align_point': DXFAttr(11, xtype=XType.any_point),
- })
- # horizontal align values
- LEFT = 0
- CENTER = 1
- RIGHT = 2
- # vertical align values
- BASELINE = 0
- BOTTOM = 1
- MIDDLE = 2
- TOP = 3
- # text generation flags
- MIRROR_X = 2
- MIRROR_Y = 4
- BACKWARD = MIRROR_X
- UPSIDE_DOWN = MIRROR_Y
- def set_pos(self, p1: 'Vertex', p2: 'Vertex' = None, align: str = None) -> 'Text':
- if align is None:
- align = self.get_align()
- align = align.upper()
- self.set_align(align)
- self.set_dxf_attrib('insert', p1)
- if align in ('ALIGNED', 'FIT'):
- if p2 is None:
- raise DXFValueError("Alignment '{}' requires a second alignment point.".format(align))
- else:
- p2 = p1
- self.set_dxf_attrib('align_point', p2)
- return self
- def get_pos(self) -> Tuple[str, 'Vertex', Union['Vertex', None]]:
- p1 = self.dxf.insert
- p2 = self.get_dxf_attrib('align_point', (0., 0., 0.))
- align = self.get_align()
- if align == 'LEFT':
- return align, p1, None
- if align in ('FIT', 'ALIGN'):
- return align, p1, p2
- return align, p2, None
- def set_align(self, align: str='LEFT') -> 'Text':
- align = align.upper()
- halign, valign = const.TEXT_ALIGN_FLAGS[align]
- self.set_dxf_attrib('halign', halign)
- self.set_dxf_attrib('valign', valign)
- return self
- def get_align(self) -> str:
- halign = self.get_dxf_attrib('halign', 0)
- valign = self.get_dxf_attrib('valign', 0)
- if halign > 2:
- valign = 0
- return const.TEXT_ALIGNMENT_BY_FLAGS.get((halign, valign), 'LEFT')
|