
    hT                    ^   S SK Jr  S SKJrJrJrJr  S SKrS SKrS SK	J
r
JrJr  S SKJr  S SKJr  S SKJrJrJrJrJr  S SKJrJrJrJr  S S	KJrJrJr  S S
K J!r!J"r"  S SK#J$r$J%r%J&r&J'r'J(r(  S SK)J*r*  \(       a  S SK	J+r+J,r,J-r-J.r.  / SQr/ " S S\R`                  5      r1 " S S\15      r2 " S S\15      r3 " S S\15      r4 " S S\15      r5 " S S\35      r6 " S S\15      r7 " S S\35      r8 " S S \35      r9 " S! S"\35      r: " S# S$\35      r;S%r<S&r= " S' S(\35      r> " S) S*\35      r?SIS+ jr@ " S, S-\35      rA " S. S/\35      rB0 S0\9_S1\4_S2\>_S3\>_S4\4_S5\4_S6\;_S7\;_S8\4_S9\A_S:\5_S;\6_S<\8_S=\?_S>\7_S?\:_S@\4_\9\>\9\B\ASA.ErC SJ   SKSB jjrDSLSC jrE SJ     SMSD jjrFSNSE jrGSOSF jrHSPSG jrISNSH jrJg)Q    )annotations)IterableOptionalcastTYPE_CHECKINGN)	DXFEntityInsertget_font_name)const)TextEntityAlignment)Vec3UCSZ_AXISX_AXISBoundingBox)Path	make_pathfrom_verticesprecise_bbox)MeshBuilderMeshVertexMergerTraceBuilder)SupportsVirtualEntitiesvirtual_entities)TextLineunified_alignment
plain_text	text_wrapestimate_mtext_content_extents)fonts)
LWPolylinePolylineMTextText)make_primitiverecursive_decomposeto_primitivesto_verticesto_control_verticesto_paths	to_meshesc                      \ rS rSr% SrSrS\S'    S   SS jjr\SS j5       r	\SS	 j5       r
\SS
 j5       r\R                  SS j5       rSSS jjrSrg)	Primitive'   a  It is not efficient to create the Path() or MeshBuilder() representation
by default. For some entities it's just not needed (LINE, POINT) and for
others the builtin flattening() method is more efficient or accurate than
using a Path() proxy object. (ARC, CIRCLE, ELLIPSE, SPLINE).

The `max_flattening_distance` defines the max distance between the
approximation line and the original curve. Use argument
`max_flattening_distance` to override the default value, or set the value
by direct attribute access.

g{Gz?floatmax_flattening_distanceNc                @    Xl         S U l        S U l        Ub  X l        g g N)entity_path_meshr0   )selfr3   r0   s      C/var/www/html/env/lib/python3.13/site-packages/ezdxf/disassemble.py__init__Primitive.__init__6   s*     "(%)
 -1
".+B( /    c                    U R                   (       a"  [        U R                   R                  5      S:H  $ U R                  SL $ )zRReturns `True` if represents an empty primitive which do not
yield any vertices.

r   N)r5   lenverticespathr6   s    r7   is_emptyPrimitive.is_emptyB   s4     ::tzz**+q00yyD  r:   c                    g)z:class:`~ezdxf.path.Path` representation or ``None``,
idiom to check if is a path representation (could be empty)::

    if primitive.path is not None:
        process(primitive.path)

N r?   s    r7   r>   Primitive.pathL        r:   c                    g)z:class:`~ezdxf.render.mesh.MeshBuilder` representation or ``None``,
idiom to check if is a mesh representation (could be empty)::

    if primitive.mesh is not None:
        process(primitive.mesh)

NrC   r?   s    r7   meshPrimitive.meshW   rE   r:   c                    g)z[Yields all vertices of the path/mesh representation as
:class:`~ezdxf.math.Vec3` objects.

NrC   r?   s    r7   r=   Primitive.verticesb   s     	r:   c                    U R                   (       a  [        U R                  5       5      $ U R                  nU(       a+  U(       a  [        UR	                  5       5      $ [        U5      $ [        5       $ )u   Returns the :class:`~ezdxf.math.BoundingBox` of the path/mesh
representation. Returns the precise bounding box for the path
representation if `fast` is ``False``, otherwise the bounding box for
Bézier curves is based on their control points.

)rG   r   r=   r>   control_verticesr   )r6   fastr>   s      r7   bboxPrimitive.bboxj   sR     99t}}//yy"4#8#8#:;;%%}r:   )r5   r4   r3   r0   r2   )r3   r   r0   Optional[float]returnboolrR   zOptional[Path]rR   zOptional[MeshBuilder]rR   Iterable[Vec3]FrR   r   )__name__
__module____qualname____firstlineno____doc__r0   __annotations__r8   propertyr@   r>   rG   abcabstractmethodr=   rN   __static_attributes__rC   r:   r7   r-   r-   '   s    
 &*U) MQ
C
C:I
C ! !     	  r:   r-   c                  2    \ rS rSr\SS j5       rSS jrSrg)EmptyPrimitive{   c                    g)NTrC   r?   s    r7   r@   EmptyPrimitive.is_empty|   s    r:   c                    / $ r2   rC   r?   s    r7   r=   EmptyPrimitive.vertices   s    	r:   rC   NrQ   rV   )rZ   r[   r\   r]   r`   r@   r=   rc   rC   r:   r7   re   re   {   s     r:   re   c                     ^  \ rS rSrSrS	U 4S jjr\R                  S 5       r\	S
S j5       r
\	SS j5       rSS jrSrU =r$ )ConvertedPrimitive   z\Base class for all DXF entities which store the path/mesh representation
at instantiation.

c                D   > [         TU ]  U5        U R                  5         g r2   )superr8   _convert_entity)r6   r3   	__class__s     r7   r8   ConvertedPrimitive.__init__   s     r:   c                    g)z1This method creates the path/mesh representation.NrC   r?   s    r7   rp   "ConvertedPrimitive._convert_entity   s     	r:   c                    U R                   $ r2   r4   r?   s    r7   r>   ConvertedPrimitive.path       zzr:   c                    U R                   $ r2   r5   r?   s    r7   rG   ConvertedPrimitive.mesh   rx   r:   c              #     #    U R                   (       a.  U R                  R                  U R                  5       S h  vN   g U R                  (       a  U R
                  R                   S h  vN   g g  N6 N7fr2   )r>   r4   
flatteningr0   rG   r5   r=   r?   s    r7   r=   ConvertedPrimitive.vertices   sR     99zz,,T-I-IJJJYYzz****  K*s!   :A7A3/A7,A5-A75A7rC   )r3   r   rT   rU   rV   )rZ   r[   r\   r]   r^   r8   ra   rb   rp   r`   r>   rG   r=   rc   __classcell__)rq   s   @r7   rl   rl      sY    
 	     + +r:   rl   c                  2    \ rS rSr\SS j5       rSS jrSrg)CurvePrimitive   c                h    U R                   c  [        U R                  5      U l         U R                   $ z%Create path representation on demand.r4   r   r3   r?   s    r7   r>   CurvePrimitive.path   (     ::"4;;/DJzzr:   c              #  j   #    U R                   R                  U R                  5       S h  vN   g  N7fr2   )r3   r}   r0   r?   s    r7   r=   CurvePrimitive.vertices   s%     
 ;;))$*F*FGGGs   )313rv   NrT   rV   )rZ   r[   r\   r]   r`   r>   r=   rc   rC   r:   r7   r   r      s     Hr:   r   c                  @    \ rS rSr\SS j5       rSS jrS	S
S jjrSrg)LinePrimitive   c                h    U R                   c  [        U R                  5      U l         U R                   $ r   r   r?   s    r7   r>   LinePrimitive.path   r   r:   c              #     #    U R                   nUR                  R                  v   UR                  R                  v   g 7fr2   )r3   dxfstartend)r6   es     r7   r=   LinePrimitive.vertices   s)     KKeekkeeiis   >A c                    U R                   n[        UR                  R                  UR                  R                  45      $ r2   )r3   r   r   r   r   )r6   rM   r   s      r7   rN   LinePrimitive.bbox   s+    KKAEEKK344r:   rv   NrT   rV   rX   rY   	rZ   r[   r\   r]   r`   r>   r=   rN   rc   rC   r:   r7   r   r      s#     
5 5r:   r   c                      \ rS rSrSS jrSrg)LwPolylinePrimitive   c                   [        SU R                  5      nUR                  (       a  UR                  5       nUR                  R
                  n[        R                  " U5      n[        5       nUR                  X#5       H  nUR                  U5        M     [        R                  " U5      U l        g [        U5      U l        g )Nr!   )r   r3   	has_widthocsr   	elevationr   from_polyliner   	faces_wcsadd_facer   from_builderr5   r   r4   )r6   r   r   r   tbmbfaces          r7   rp   #LwPolylinePrimitive._convert_entity   s    \4;;7;;%%'CI++A.B!#BS4D! 5$11"5DJ"1DJr:   r5   r4   NrR   NonerZ   r[   r\   r]   rp   rc   rC   r:   r7   r   r      s    &r:   r   c                  @    \ rS rSr\SS j5       rSS jrS	S
S jjrSrg)PointPrimitive   c                    U R                   c.  [        U R                  R                  R                  5      U l         U R                   $ )zCreate path representation on demand.

:class:`Path` can not represent a point, a :class:`Path` with only a
start point yields not vertices!

)r4   r   r3   r   locationr?   s    r7   r>   PointPrimitive.path   s2     ::dkkoo667DJzzr:   c              #  P   #    U R                   R                  R                  v   g 7fr2   )r3   r   r   r?   s    r7   r=   PointPrimitive.vertices   s     kkoo&&&s   $&c                V    [        U R                  R                  R                  45      $ r2   )r   r3   r   r   )r6   rM   s     r7   rN   PointPrimitive.bbox   s    DKKOO44677r:   rv   NrT   rV   rX   rY   r   rC   r:   r7   r   r      s#    	 	'8 8r:   r   c                      \ rS rSrS rSrg)MeshPrimitive   c                N    [         R                  " U R                  5      U l        g r2   )r   	from_meshr3   r5   r?   s    r7   rp   MeshPrimitive._convert_entity   s     **4;;7
r:   rz   Nr   rC   r:   r7   r   r      s    8r:   r   c                      \ rS rSrS rSrg)QuadrilateralPrimitive   c                8    [        U R                  5      U l        g r2   r   r3   r4   r?   s    r7   rp   &QuadrilateralPrimitive._convert_entity       t{{+
r:   rv   Nr   rC   r:   r7   r   r      s    ,r:   r   c                      \ rS rSrSS jrSrg)PolylinePrimitive   c                f   [        SU R                  5      nUR                  (       a  UR                  (       a  UR	                  5       nUR
                  R                  R                  n[        R                  " U5      n[        5       nUR                  X#5       H  nUR                  U5        M     [        R                  " U5      U l        g UR                  (       d  UR                   (       a  [#        U5      U l        g [        R&                  " U5      n[        R                  " U5      U l        g )Nr"   )r   r3   is_2d_polyliner   r   r   r   zr   r   r   r   r   r   r   r5   is_3d_polyliner   r4   from_polyface)r6   r   r   r   r   r   r   ms           r7   rp   !PolylinePrimitive._convert_entity   s    :t{{3%%'C))I++A.B!#BS4D! 5$11"5DJ!1!1"1DJ ..q1A$11!4DJr:   r   Nr   r   rC   r:   r7   r   r      s    5r:   r   c                      \ rS rSrS rSrg)HatchPrimitivei	  c                8    [        U R                  5      U l        g r2   r   r?   s    r7   rp   HatchPrimitive._convert_entity
  r   r:   rv   Nr   rC   r:   r7   r   r   	      ,r:   r   gZd;O?gZd;O?c                      \ rS rSrSS jrSrg)TextLinePrimitivei  c           	       ^^^^ UUUU4S jnUUU4S jn[        SU R                  5      mTR                  5       S:X  a  TR                  R                  nOTR                  R
                  n[        U5      n[        U5      S:X  a  [        5       U l	        g[        R                  " [        T5      TR                  R                  TR                  R                  5      n[        X45      nTR!                  5       u  nmmTc  TmU["        R$                  :H  =(       d    U["        R&                  :H  mTR                  R(                  S:  a  UR+                  UTT5        [-        T5      u  pxTR.                  (       a  SOS	n	TR0                  (       a  SOS	n
[2        R4                  " TR                  R6                  5      nUR9                  U" 5       UUU" 5       X4US
9nTR;                  5       n[=        UR?                  U5      SS9U l	        g)zCalculates the rough border path for a single line text.

Calculation is based on a monospaced font and therefore the border
path is just an educated guess.

Vertical text generation and oblique angle is ignored.

c                    > T (       a%  TR                  T5      (       d  TT-
  R                  $ [        R                  " TR                  R
                  5      $ r2   )iscloseanglemathradiansr   rotation)fit_or_alignedp1p2texts   r7   text_rotation8TextLinePrimitive._convert_entity.<locals>.text_rotation  s9    bjjnnR&||DHH$5$566r:   c                 6   > T (       a  TR                  TSS9$ T$ )N      ?)factor)lerp)r   r   r   s   r7   r   3TextLinePrimitive._convert_entity.<locals>.location#  s    wwr#w..Ir:   r$   ATTDEFr   N      )r   scaleobliqueTclose) r   r3   dxftyper   tagr   r   r<   r   r4   r    	make_fontr
   heightwidthr   get_placementr   FITALIGNEDhalignstretchr   is_backwardis_upside_downr   r   r   corner_verticesr   r   points_to_wcs)r6   r   r   contentfont	text_line	alignmentr   valignmirror_xmirror_yr   r   r   r   r   r   r   s                 @@@@r7   rp   !TextLinePrimitive._convert_entity  s   	7 	7	
 FDKK(<<>X%hhllGhhmmGW%w<1DJ$$((..
 W+	 ..0	2r:B,000 8/777 	 88??QiR0*40))2q,,2!dhh&6&67#33J/& 4 
 hhj"o.

r:   rv   Nr   r   rC   r:   r7   r   r     s    @
r:   r   c                      \ rS rSrSS jrSrg)MTextPrimitiveiV  c                &  ^^^^	^
^^^^ SUU	U4S jjnSU4S jjm
SUU	U
4S jjmSUU	U4S jjmSU4S jjnU4S jmSUUUUU4S jjn[        SU R                  5      mTR                  mTcw  TR                  R	                  S
S5      m[
        R                  " [        T5      TR                  R                  S5      m	U" 5       m[        T5      S:X  a  [        5       U l        g	U" 5       nU" 5       n[        UR                  U5      SS9U l        g	)zCalculates the rough border path for a MTEXT entity.

Calculation is based on a mono-spaced font and therefore the border
path is just an educated guess.

Most special features of MTEXT is not supported.

c                 P   > TR                  SS9n [        U TTR                  5      $ )NF)split)r   r   
text_width)r   	box_widthr   mtexts    r7   get_content3MTextPrimitive._convert_entity.<locals>.get_contenta  s)    ##%#0DT9doo>>r:   c                    > [        T S S9$ )Nc                    [        U 5      $ r2   r<   )ss    r7   <lambda>EMTextPrimitive._convert_entity.<locals>.get_max_str.<locals>.<lambda>f  s    c!fr:   key)max)r   s   r7   get_max_str3MTextPrimitive._convert_entity.<locals>.get_max_stre  s    w$455r:   c                 h   > T(       a  T$ T" 5       n [        U 5      S:X  a  Sn TR                  U 5      $ )Nr    )r<   r  )r  r	  r   r  s    r7   get_rect_width6MTextPrimitive._convert_entity.<locals>.get_rect_widthh  s2      A1v{??1%%r:   c                    > TR                   R                  n TR                   R                  nUTR                  R                  -  S-  nX -
  n[        T5      nX-  X4S-
  -  -   $ )NgQ?r   )measurementstotal_height
cap_heightr   line_spacing_factorr<   )line_heightr  line_spacingspacing
line_countr   r   r
  s        r7   get_rect_height7MTextPrimitive._convert_entity.<locals>.get_rect_heightp  sf    ++88K**55J &		(E(EELL"0GWJ+ga.HHHr:   c                   > TR                   R                  n TR                   R                  n[        nTR                   R	                  S5      (       a  TR                   R
                  nOPTR                   R	                  S5      (       a0  [        R                  " TR                   R                  5      n[        n[        XUS9$ )zCreate local coordinate system:
origin = insertion point
z-axis = extrusion vector
x-axis = text_direction or text rotation, text rotation requires
    extrusion vector == (0, 0, 1) or treatment like an OCS?

text_directionr   )originuxuz)r   insert	extrusionr   hasattrr(  r   from_deg_angler   r   r   )r)  z_axisx_axisr
  s      r7   get_ucs/MTextPrimitive._convert_entity.<locals>.get_ucs~  s     YY%%FYY((FFyy  !12211"":..,,UYY-?-?@fF;;r:   c                    > [        T5      u  pSnSnU [        R                  :X  a  SnOU [        R                  :X  a  SnU[        R                  :X  a  SnX#4$ U[        R
                  :X  a  SnX#4$ )Nr   g      g      r         ?)r   r   CENTERRIGHTMIDDLEBOTTOM)r   r   shift_xshift_yr
  s       r7   get_shift_factors9MTextPrimitive._convert_entity.<locals>.get_shift_factors  ss    .u5NFGG%5;;&% ## 5<<'##r:   c                   >^ T(       aB  TR                   n TR                  nU S:X  d  US:X  a  [        T5      u  p#U S:X  a  Un US:X  a  UnOBTR                  R	                  ST
" 5       5      n TR                  R	                  ST	" 5       5      n[        SS5      [        U S5      [        X* 5      [        SU* 5      /nT" 5       u  pV[        XP-  Xa-  5      mU4S jU 5       $ )z[Create corner vertices in the local working plan, where
the insertion point is the origin.
g        
rect_widthrect_heightr   c              3  ,   >#    U  H	  oT-   v   M     g 7fr2   rC   ).0vshifts     r7   	<genexpr>NMTextPrimitive._convert_entity.<locals>.get_corner_vertices.<locals>.<genexpr>  s     0x!Ixs   )total_widthr  _estimate_column_extentsr   getr   )r?  r@  whr=   sxsyrD  columnsr%  r  r<  r
  s          @r7   get_corner_vertices;MTextPrimitive._convert_entity.<locals>.get_corner_vertices  s     $00
%22$s(: 4E:DA!S(%&
"c)&'"YY]]<9IJ
#iimmM?;LM Q
Z#Z.Q%	H '(FB"*:;E0x00r:   r#   Nr   r   r5  Tr   )rR   z	list[str])rR   str)rR   r/   )rR   r   rV   )r   r3   rN  r   rI  r    r   r
   char_heightr<   r   r4   r   r   )r6   r  r2  rO  ucsr   r	  rN  r   r   r  r%  r  r<  r
  s         @@@@@@@@@r7   rp   MTextPrimitive._convert_entityW  s    	? 	?	6	& 	&	I 	I	<&	$	1 	1: GT[[1--?		gq1I??e$eii&;&;SD "-G7|q !V
i-/"o.

r:   rv   Nr   r   rC   r:   r7   r  r  V  s    v
r:   r  c                b   U R                   nUc   eU R                  nUR                  S:  a+  UR                  S5      n[	        U5      S:  a  [        US S9n[        U[        R                  " U R                  R                  S5      UR                  U R                  R                  S5      S9$ )Nr   z\Nc                    [        U 5      $ r2   r  )ts    r7   r  *_estimate_column_extents.<locals>.<lambda>  s    3q6r:   r  r5  r   )r   r   column_widthr   )rN  r   countr  r<   r  r   r    MonospaceFontr   rR  r   get_default)r
  rN  _content_columns_contents       r7   rH  rH    s    mmGzzH}}q#>>%0 1$+1ABH)  !6!6<]]!II112GH	 r:   c                      \ rS rSrS rSrg)ImagePrimitivei  c                8    [        U R                  5      U l        g r2   r   r?   s    r7   rp   ImagePrimitive._convert_entity  r   r:   rv   Nr   rC   r:   r7   r`  r`    r   r:   r`  c                      \ rS rSrS rSrg)ViewportPrimitivei  c                r    U R                   nUR                  R                  S:X  a  g [        U5      U l        g )Nr   )r3   r   statusr   r4   )r6   vps     r7   rp   !ViewportPrimitive._convert_entity  s)    [[66==Ar]
r:   rv   Nr   rC   r:   r7   rd  rd    s    #r:   rd  3DFACEARCATTRIBr   CIRCLEELLIPSEHATCHMPOLYGONHELIXIMAGELINE
LWPOLYLINEMESHMTEXTPOINTPOLYLINESPLINE)SOLIDTEXTTRACEVIEWPORTWIPEOUTc                    [         R                  U R                  5       [        5      nU" U 5      nU(       a  Xl        U$ )a  Factory to create path/mesh primitives. The `max_flattening_distance`
defines the max distance between the approximation line and the original
curve. Use `max_flattening_distance` to override the default value.

Returns an **empty primitive** for unsupported entities. The `empty` state
of a primitive can be checked by the property :attr:`is_empty`.
The :attr:`path` and the :attr:`mesh` attributes of an empty primitive
are ``None`` and the :meth:`vertices` method  yields no vertices.

)_PRIMITIVE_CLASSESrI  r   re   r0   )r3   r0   cls	primitives       r7   r%   r%   
  s5     
 
 !1>
BCFI,C)r:   c              #    #    U  H  n[        U[        5      (       ae  UR                  S:  a#  [        UR	                  5       5       Sh  vN   MK  UR
                   Sh  vN   [        [        U5      5       Sh  vN   M}  [        U[        5      (       a  [        [        U5      5       Sh  vN   M  Uv   M     g Nt N` NF N7f)aF  Recursive decomposition of the given DXF entity collection into a flat
stream of DXF entities. All block references (INSERT) and entities which provide
a :meth:`virtual_entities` method will be disassembled into simple DXF
sub-entities, therefore the returned entity stream does not contain any
INSERT entity.

Point entities will **not** be disassembled into DXF sub-entities,
as defined by the current point style $PDMODE.

These entity types include sub-entities and will be decomposed into
simple DXF entities:

    - INSERT
    - DIMENSION
    - LEADER
    - MLEADER
    - MLINE

Decomposition of XREF, UNDERLAY and ACAD_TABLE entities is not supported.

This function does not apply the clipping path created by the XCLIP command. 
The function returns all entities and ignores the clipping path polygon and no 
entity is clipped.

r   N)
isinstancer	   mcountr&   multi_insertattribsr   r   )entitiesr3   s     r7   r&   r&     s     4 ff%%}}q .v/B/B/DEEE!>>))./?/GHHH 788*+;F+CDDDL  F)H EsH   AC	B>
CC  C;C<2C.C/C CCCc              #  8   #    U  H  n[        X!5      v   M     g7f)zYields all DXF entities as path or mesh primitives. Yields
unsupported entities as empty primitives, see :func:`make_primitive`.

Args:
    entities: iterable of DXF entities
    max_flattening_distance: override the default value

N)r%   )r  r0   r   s      r7   r'   r'   H  s      Q88 s   c              #  R   #    U  H  nUR                  5        Sh  vN   M     g N	7f)zYields all vertices from the given `primitives`. Paths will be flattened
to create the associated vertices. See also :func:`to_control_vertices` to
collect only the control vertices from the paths without flattening.

N)r=   )
primitivesps     r7   r(   r(   X  s#      ::< s   '%
'c              #  X   #    U  H   nUR                   c  M  UR                   v   M"     g7f)zvYields all :class:`~ezdxf.path.Path` objects from the given
`primitives`. Ignores primitives without a defined path.

N)r>   r  prims     r7   r*   r*   b  $     
 99 ))O    **c              #  X   #    U  H   nUR                   c  M  UR                   v   M"     g7f)zYields all :class:`~ezdxf.render.MeshBuilder` objects from the given
`primitives`. Ignores primitives without a defined mesh.

N)rG   r  s     r7   r+   r+   l  r  r  c              #     #    U  HP  nUR                   (       a$  UR                   R                  5        Sh  vN   M8  UR                  5        Sh  vN   MR     g N# N7f)zYields all path control vertices and all mesh vertices from the given
`primitives`. Like :func:`to_vertices`, but without flattening.

N)r>   rL   r=   r  s     r7   r)   r)   v  sE     
 99yy11333}}&&  4&s!   4AAAA
AA)r
  r#   r2   )r3   r   rR   r-   )r  Iterable[DXFEntity]rR   r  )r  r  r0   rP   rR   Iterable[Primitive])r  r  rR   rW   )r  r  rR   zIterable[Path])r  r  rR   zIterable[MeshBuilder])K
__future__r   typingr   r   r   r   ra   r   ezdxf.entitiesr   r	   r
   ezdxf.lldxfr   ezdxf.enumsr   
ezdxf.mathr   r   r   r   r   
ezdxf.pathr   r   r   r   ezdxf.renderr   r   r   ezdxf.protocolsr   r   ezdxf.tools.textr   r   r   r   r   ezdxf.fontsr    r!   r"   r#   r$   __all__ABCr-   re   rl   r   r   r   r   r   r   r   r   DESCENDER_FACTORX_HEIGHT_FACTORr   r  rH  r`  rd  r  r%   r&   r'   r(   r*   r+   r)   rC   r:   r7   <module>r     sw   # : : 
  ; ;  + = = C C D D E  @@Q QhY + +<HY H 5I 5&&, &"8Y 8(8& 8
,/ ,5* 5(,' ,
  A
* A
Hw
' w
t ,' ,
#* #$	>
   n ~ ^  ^ ^ M % M  ^!" ^#$ !%& n'( $#!1 : 04('X 049!9,9 9  
'r:   