# 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')