
    OgA                       U d Z ddlmZ ddlmZmZmZmZmZm	Z	m
Z
mZ ddlZddlZddlZddlZddlmZmZmZmZmZmZ ddlmZ ddlmZ dd	lmZmZ  G d
 de      Z G d de      Z  G d de      Z! G d de      Z" G d de      Z# G d de      Z$ G d de      Z% G d de      Z& G d dejN                        Z( G d dejN                        Z) G d dejN                        Z* e+       Z,d e-d!<   d"Z. e/       Z0d#e-d$<    e/       Z1 e2d%      Z3 e2d&      Z4ejj                   G d' d(             Z6dKd)Z7 G d* d+      Z8dLd,Z9dMd-Z:dMd.Z;dNd/Z<dOd0Z=dOd1Z>dOd2Z?dOd3Z@ G d4 d5      ZAd6ZBdPd7ZCdQd8ZDd9ZEdOd:ZFdRd;ZGdSd<ZHh d=ZIdTdUd>ZJdVd?ZKdVd@ZL	 	 	 	 dWdAZM	 	 dX	 	 	 	 	 	 	 	 	 dYdBZNg dCZOg dDZP G dE dF      ZQdZdGZRd[dHZS G dI dJe      ZTy)\aT  
This module provides support for fonts stored as SHX and SHP files.
(SHP is not the GIS file format!)

The documentation about the SHP file format can be found at Autodesk:
https://help.autodesk.com/view/OARX/2018/ENU/?guid=GUID-DE941DB5-7044-433C-AA68-2A9AE98A5713

Using bytes for strings because no encoding is defined in shape-files.

    )annotations)SequenceIterableIteratorCallableOptionalAnySetno_type_checkN)UVecVec2ConstructionEllipsebulge_to_arcBoundingBox2dMatrix44)path   )FontMeasurements)	GlyphPathGlyphsc                      e Zd Zy)ShapeFileExceptionN__name__
__module____qualname__     Z/var/www/html/public_html/myphp/venv/lib/python3.12/site-packages/ezdxf/fonts/shapefile.pyr   r   +       r   r   c                      e Zd Zy)UnsupportedShapeFileNr   r   r   r   r"   r"   /   r    r   r"   c                      e Zd Zy)UnsupportedShapeNumberNr   r   r   r   r$   r$   3   r    r   r$   c                      e Zd Zy)InvalidFontDefinitionNr   r   r   r   r&   r&   7   r    r   r&   c                      e Zd Zy)InvalidFontParametersNr   r   r   r   r(   r(   ;   r    r   r(   c                      e Zd Zy)InvalidShapeRecordNr   r   r   r   r*   r*   ?   r    r   r*   c                      e Zd Zy)FileStructureErrorNr   r   r   r   r,   r,   C   r    r   r,   c                      e Zd Zy)StackUnderflowNr   r   r   r   r.   r.   G   r    r   r.   c                      e Zd ZdZdZdZy)FontEmbeddingr   r      N)r   r   r   ALLOWED
DISALLOWEDREADONLYr   r   r   r0   r0   K   s    GJHr   r0   c                      e Zd ZdZdZdZy)FontEncodingr   r   r1   N)r   r   r   UNICODEPACKED_MULTIBYTE_1
SHAPE_FILEr   r   r   r6   r6   Q   s    GJr   r6   c                      e Zd ZdZdZy)FontModer   r1   N)r   r   r   
HORIZONTALBIDIRECTr   r   r   r;   r;   W   s    JHr   r;   Sequence[int]NO_DATAFzSet[int]DEBUG_CODES0-c                  D    e Zd ZU ded<   ded<   ded<   eZded<   d
ddZy	)Symbolintnumber
byte_countbytesnamer>   datac                    |r|n| j                   }d|dd| j                   dj                         | j                  z   g}|j	                  t        | j                               |S )N*05X,)rF   rG   encoderI   extendformat_shape_data_stringrJ   )selfas_numnumexports       r   
export_strzSymbol.export_strl   sZ    fDKKc#Ya0299;diiGH.tyy9:r   Nr   )rS   rE   returnlist[bytes])r   r   r   __annotations__r?   rJ   rV   r   r   r   rD   rD   e   s     KO
K!D-!r   rD   c                    g }d}| D ]Q  }|| dj                         z   }t        |      dk  r|}*|j                  |d d        d| dj                         }S |r|j                  |d d        |S )Nr   rN   P   )rO   lenappend)rJ   rU   srT   s2s        r   rQ   rQ   s   s    FA $C5!!##r7R<AMM!CR&!C5
!!#A$ 	afMr   c                     e Zd ZdZej
                  ej                  ej                  f	 	 	 	 	 ddZ
edd       Zedd       Zedd       Zedd       ZddZd Zd	 Zedd
       ZddZddZdddZdddZdddZdddZy)	ShapeFilez+Low level representation of a SHX/SHP file.c                v    t               | _        || _        || _        || _        || _        || _        || _        y N)dictshapesrI   abovebelowmodeencodingembed)rR   rI   rh   ri   rj   rk   rl   s          r   __init__zShapeFile.__init__   s7     *.	

	 
r   c                ,    t        | j                        S re   )floatrh   rR   s    r   
cap_heightzShapeFile.cap_height       TZZ  r   c                ,    t        | j                        S re   )ro   ri   rp   s    r   	descenderzShapeFile.descender   rr   r   c                <    | j                   t        j                  k7  S re   rk   r6   r9   rp   s    r   is_fontzShapeFile.is_font       }} 7 777r   c                <    | j                   t        j                  k(  S re   rv   rp   s    r   is_shape_filezShapeFile.is_shape_file   rx   r   c                h    | j                   j                         D ]  }||j                  k(  s|c S  y re   )rg   valuesrI   )rR   rI   symbols      r   findzShapeFile.find   s4    kk((* 	Fv{{"	 r   c                ,    t        | j                        S re   )r^   rg   rp   s    r   __len__zShapeFile.__len__   s    4;;r   c                     | j                   |   S re   )rg   )rR   items     r   __getitem__zShapeFile.__getitem__   s    {{4  r   c                   t        |       dk(  rt        j                  }d}d}t        j                  }t
        j                  }d}| \  }}	 |j                  dd      \  }	}
}|	dk(  r	 |j                  d      \  }}}}}}n1|	dk(  r	 |j                  d      ^}}}}|d   }nt        j                  }t        |      dk(  sJ t        |j                         t        |      t        |      t        t        |            t        t        |            t        t        |                  S y # t        $ r t               w xY w# t        $ r t        |      w xY w# t        $ r t        |      w xY w)Nr1   r      ,maxsplit   *UNIFONT   *0r]   )r^   r6   r7   r0   r2   r;   r<   split
ValueErrorr&   r(   r9   rE   rc   strip)recordsrk   rh   ri   rl   rj   endheaderparamsspec_rI   rests                r   from_ascii_recordszShapeFile.from_ascii_records   sv   w<1#++HEE!))E&&DC$NFF. &TA >a {"8?E||D?Q<E5$% 806T0B-E5$r(C (22s8q= =

E
E
T#S]+c%j) 9   .+--.
 " 8/778 " 8/778s$   D* )E E *D>EE.c                8   |D ]  }t        |      dk  rt        |      	 t        |d         \  }}}t        |      dkD  sJ |d   t
        k(  rt        |dd  d      }nt        |dd  d      }t        |t        |      |      }dj                  |dd        }t        t        t        |                  |_        |j                  d   dk(  r|| j                  |<   |d   j                  d	      }	t	        d
|	 d       y # t        $ r t	        |d         w xY w)Nr1   r   r      
   r   r]   ignore)errorsz file structure error at symbol <>)r^   r*   split_def_recordr   r,   ORD_NULLrE   rD   jointupleparse_codessplit_recordrJ   rg   decode)
rR   r   recordrF   rG   rI   int_numr}   rJ   r`   s
             r   parse_ascii_recordszShapeFile.parse_ascii_records   s+    	RF6{Q(004+;F1I+F(
D v;?"?ayH$fQRj"-fQRj"-GS_d;F88F12J'DL,> ?@FK{{2!#'-G$1I$$H$5(+KA3a)PQQ+	R
  4(334s   DDc                j    | j                   j                  |      }|t        |      |j                  S re   )rg   getr$   rJ   )rR   rF   r}   s      r   	get_codeszShapeFile.get_codes   s.    (>(00{{r   c                4    t        |g| j                  |      S N)stackedrender_shapesr   )rR   rF   r   s      r   render_shapezShapeFile.render_shape   s    fXt~~wGGr   c                2    t        || j                  |      S r   r   )rR   numbersr   s      r   r   zShapeFile.render_shapes   s    WdnngFFr   c                n    |D cg c]  }t        |       }}t        || j                  |d      S c c}w )NT)r   reset_to_baseline)ordr   r   )rR   textr   charr   s        r   render_textzShapeFile.render_text   s8    )-.3t9..T^^W
 	
 /s   2c                >    | j                   |   j                  |      S re   )rg   rV   )rR   shape_numberrS   s      r   shape_stringzShapeFile.shape_string  s    {{<(33F;;r   N)rI   rH   rh   rE   ri   rE   rX   ro   rX   bool)rI   rH   rX   zOptional[Symbol])r   Sequence[bytes])r   zIterable[Sequence[bytes]]rX   None)rF   rE   rX   r>   F)rF   rE   rX   r   )r   r>   rX   r   )r   strrX   r   rW   )r   rE   rS   rE   rX   rY   )r   r   r   __doc__r;   r<   r6   r7   r0   r2   rm   propertyrq   rt   rw   rz   r~   r   r   staticmethodr   r   r   r   r   r   r   r   r   r   rc   rc      s    5   %%##  	" ! ! ! ! 8 8 8 8 ! $ $LR0HG
<r   rc   c                    t        j                  |       j                         }| j                         } | j	                  d      rt        |      S | j	                  d      rt        |      S t        d      )zLoad shape-file `filename`, the file type is detected by the file
    name extension and should be ".shp" or ".shx" otherwise rises an
    exception :class:`UnsupportedShapeFile`.
    z.shpz.shxzunknown filetype)pathlibPath
read_byteslowerendswithshp_loadshx_loadr"   )filenamerJ   s     r   readfiler     sc    
 <<!,,.D~~H ~			6	"~"#566r   c                H    t        d | j                  dd      D              S )Nc              3  <   K   | ]  }|j                           y wre   r   .0r`   s     r   	<genexpr>z#split_def_record.<locals>.<genexpr>  s     CqC   r   r1   r   r   r   r   s    r   r   r     s     CFLLL$BCCCr   c                D    t        d | j                  d      D              S )Nc              3  <   K   | ]  }|j                           y wre   r   r   s     r   r   zsplit_record.<locals>.<genexpr>  s     7q7r   r   r   r   s    r   r   r     s    7FLL$6777r   c              #     K   | D ]i  }|j                  d      }|dk(  r|d   t        k(  rt        |d       5|d   t        k(  r|d   t        k(  rt        |d       \t        |d       k y w)Ns   ()r   r   r   r   r   )r   r   rE   	ORD_MINUS)codescodes     r   r   r     st      	 zz% 3;7hdB-!W	!d1g&9dB-dB-	 s   A0A2c           	     "   t        t        t        | j                  d                        }d|v r|j	                  d      }nd|v r|j	                  d      }nd}t
        j                  |      }|j                  |j                                |S )N   
r   r   )s   _,_,_r   )	parse_string_recordsmerge_linesfilter_noiser   poprc   r   r   r|   )rJ   r   font_definitionshps       r   r   r   *  s|    ";|DJJu<M/N#OPGg!++k2	'	!++e, *

&
&
7CGNN,-Jr   c                    | j                  d      rt        |       S | j                  d      rt        |       S | j                  d      rt        |       S | j                  d      rt	        d      t	        d      )Ns   AutoCAD-86 shapes 1.0s   AutoCAD-86 shapes 1.1s   AutoCAD-86 unifont 1.0s   AutoCAD-86 bigfont 1.0z$BIGFONT shapes are not supported yetzunknown shape file format)
startswithload_shx_shape_file_1_0load_shx_shape_file_1_1load_shx_unifont_file_1_0r"   rJ   s    r   r   r   9  so    /0&t,,	1	2&t,,	2	3(..	2	3"#IJJ
:
;;r   c                   d}d}t         j                  }d}t        |       }|j                  d      }|r5|j	                  d       |j
                  }|d   }|d   }t        |d         }t        ||||      }||_        |S )Nr   r   r   r1   )rh   ri   rj   )r;   r<   parse_shx_shapesr   r   rJ   rc   rg   )	rJ   rh   ri   rj   rI   rg   r   
shape_data
shape_files	            r   r   r   E  s    EEDDd#FjjmO

1$))
11
1&4uEEJJr   c                    t        |       S re   )r   r   s    r   r   r   X  s    "4((r   c                  `    e Zd ZdddZedd       ZddZddZddZddZ	ddZ
ddZdd	Zy
)
DataReaderc                     || _         || _        y re   rJ   index)rR   rJ   r   s      r   rm   zDataReader.__init__^  s    	
r   c                F    | j                   t        | j                        k  S re   )r   r^   rJ   rp   s    r   has_datazDataReader.has_datab  s    zzC		N**r   c                .    | xj                   |z  c_         y re   )r   )rR   ns     r   skipzDataReader.skipf  s    

a
r   c                b    | j                   }| xj                   dz  c_         | j                  |   S )Nr   r   rJ   rR   r   s     r   u8zDataReader.u8i  s'    



a
yyr   c                |    | j                   | j                     }| xj                  dz  c_        |dkD  r|dz  dz
  S |S )Nr         r   rR   values     r   i8zDataReader.i8n  s<    		$**%

a
3;CK3&&r   c                x    | j                   | j                     }| xj                  dz  c_        |dz  r|dz   S |S )Nr   r   r   r   r   s     r   octantzDataReader.octantu  s9    		$**%

a
3;S[>!Lr   c                f    t               }	 | j                         }|r|j                  |       n|S 're   )	bytearrayr   r_   )rR   rJ   r   s      r   read_strzDataReader.read_str}  s0    {779DD! r   c                h    | j                   }| xj                   |z  c_         | j                  |||z    S re   r   )rR   r   r   s      r   r   zDataReader.read_bytes  s-    



a
yy++r   c                    | j                   }| xj                   dz  c_         | j                  |   | j                  |dz      dz  z   S )Nr1   r      r   r   s     r   u16zDataReader.u16  s>    



a
yy499UQY#71#<==r   NrW   )rJ   rH   r   )r   rE   rX   r   )rX   rE   )rX   rH   )r   rE   rX   rH   )r   r   r   rm   r   r   r   r   r  r  r  r   r  r   r   r   r   r   ]  s>     + + 
,
>r   r      c           
        t               }t        | t              }|j                         dk7  rt	        d      |j                         }|j                         }|j                         }g }t        |      D ]5  }|j                         }|j                         }	|j                  ||	f       7 |d   d   |k7  rt	        d      |d   d   |k7  rt	        d      |D ]G  \  }}
|j                  |
      }	 t        |      \  }}|
t        |      z
  d
z
  }t        ||||      ||<   I |j                  d      dk7  rt	        d      |S # t        $ r t	        d|dd	t        |             w xY w)zSHX/SHP shape parser.   signature byte 0x1A not foundr   z"invalid first entry in index tabler]   z!invalid last entry in index tablezSHX parsing error shape *rM   z: r      s   EOFzEOF marker not found)rf   r   SHX_SHAPES_START_INDEXr   r,   r  ranger_   r   parse_shx_data_record
IndexErrorr   r^   rD   )rJ   rg   readerfirst_numberlast_numbershape_countindex_tabler   r   	data_sizelengthr   rI   r   rG   s                  r   r   r     s    $F45Fyy{d !@AA::<L**,K**,K)+K; 6zz|JJL	L)456 1~aL( !EFF2q[( !DEE + 	Rf""6*	4V<D*
 c$i'!+
%lJjQ|	R v% !788M  	$+L+=RF}M 	s   4E%E,c                V    t        |       }|j                         }t        |      }||fS )z&Low level SHX/SHP shape record parser.)r   r  parse_shape_codes)rJ   r  rI   r   s       r   r  r    s,    F??Df%E;r      c                    t        | t              }t        |      \  }}}}}}t        ||||||      }	 t	        |      |_        |S # t        $ r t        d      w xY w)N)rh   ri   rj   rk   rl   zpre-mature end of file)r   SHX_UNIFONT_START_INDEXparse_shx_unifont_definitionrc   parse_shx_unifont_shapesrg   r  r,   )	rJ   r  rI   rh   ri   rj   rk   rl   r   s	            r   r   r     sy    56F0LV0T-D%hJ;4V<
   ; !9::;s   A Ac                   | j                         dk7  rt        d      | j                  d       | j                         }| j                         }| j                         }t	        | j                               }t        | j                               }t        | j                               }| j                  d       ||||||fS )Nr  r     r   )r   r,   r   r  r;   r6   r0   )r  rI   rh   ri   rj   rk   rl   s          r   r!  r!    s    yy{d !@AA
KKN ??DIIKEIIKEFIIK DFIIK(H&))+&E
KKNtXu44r   c                >   t               }| j                  r| j                         }| j                         }| j                         }|t	        |      z
  dz
  }| j                  |      }t        t        |      d      }t        ||||      ||<   | j                  r|S )Nr   T)unifont)	rf   r   r  r  r^   r   r  r   rD   )r  rg   r   rG   rI   data_recordr   s          r   r"  r"    s     $F
//zz|ZZ\
 #d)+a/
''
3!*["94H%lJeL| // Mr   >   r   r1      r$     c                2   g }	 | j                         }|j                  |       |dk(  rt        |      S |t        v s|dkD  r@|dk(  s|dk(  r!|j                  | j                                n|dk(  rD|r!|j                  | j	                                n|j                  | j                                n`|dk(  r@|j                  | j                                |j                  | j                                n|dk(  rTd\  }}|s|r| j                         }| j                         }|j                  |       |j                  |       |rE|rHn|d	k(  r@|j                  | j                                |j                  | j                                n}|d
k(  r|j                  | j                                |j                  | j                                |j                  | j                                |j                  | j                                |j                  | j                                n|dk(  r^|j                  | j                                |j                  | j                                |j                  | j                                ny|dk(  rtd\  }}|s|rk| j                         }| j                         }|j                  |       |j                  |       |s|r|j                  | j                                |rh|rk)Nr   r)  r        r
  	   )r   r   r            )r   r_   r   SINGLE_CODESr  r  r  )r  r&  r   r   xys         r   r  r    s3   E
yy{T19<\!TBYQY$!)LL%QYVZZ\*VYY[)QYLL%LL%QYDAqqIIKIIKQQ	 q
 RZLL%LL)RZLL%LL%LL%LL%LL)RZLL%LL%LL%RZDAqqIIKIIKQQLL- qO r   c              #     K   | D ]Q  }|j                  d       |j                         }|s'|j                  d      d   }|j                         }|sN| S y w)Ns   
   ;r   )rstripr   r   )lineslines     r   r   r   *  sU      Gzz|::d#A&D::<D
s   )A&AAc              #     K   d}| D ]j  }|s|}|j                  d      r|j                  d      r||z  }0| |}7|j                  d      r||z  }N|j                  d      r||z  }e| |}l |r| y y w)Nr      *r   )r   r   )r7  current	next_lines      r   r   r   5  s     G  	G%##D)9$#d#y G!!$'y GMG    s   A:A<c                8   t               }d }g }| D ]v  }|j                  d      rt        d      |j                  d      r6|t        |      ||<   |j	                  d      d   j                         }|g}f|j                  |       x |t        |      ||<   |S )Ns   *BIGFONTz)BIGFONT shape files are not supported yetr:  r   r   )rf   r   r"   r   r   r   r_   )r7  r   rI   r   r8  s        r   r   r   K  s     -1FGDF 	 ??;'&'RSS??4  %f::d#A&,,.DVFMM$	  fNr   c                    t        t        j                  |      d||      }| D ]  }	 |j                  ||        t        |j                        S # t        $ r Y 9t
        $ r t        d|       w xY w)z1Renders multiple shapes into a single glyph path.Tpen_downr   r   r   z-stack underflow while rendering shape number )ShapeRendererr   r   renderr$   r.   r   p)shape_numbersr   r   startr   ctxr   s          r   r   r   a  s     		%	C & 	JJ|7HJI SUU & 	 	 ?~N 	s   A	A5A5)r   r   r         ?r         r]   r]   r]   r]   r]   rI  r   rH  r   r   )r   rH  r   r   r   r   r   rH  r   rI  r]   r]   r]   r]   r]   rI  c                      e Zd ZdZdddd	 	 	 	 	 	 	 	 	 ddZedd       ZddZdd	Z	 d	 	 	 dd
Z	ddZ
ddZ	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 ddZddZy)rB  z+Low level glyph renderer for SHX/SHP fonts.      ?TF)vector_lengthr@  r   c                   || _         t        |      | _        || _        || _        g | _        || _        | j                   j                  j                  | _	        y re   )
rD  ro   rL  r@  r   _location_stack
_get_codesrF  r3  _baseline_y)rR   rD  r   rL  r@  r   s         r   rm   zShapeRenderer.__init__  sI     "=1 +-#66<<>>r   c                @    t        | j                  j                        S re   )r   rD  r   rp   s    r   current_locationzShapeRenderer.current_location  s    DFFJJr   c                N    | j                   j                  | j                         y re   )rN  r_   rR  rp   s    r   pushzShapeRenderer.push  s    ##D$9$9:r   c                j    | j                   j                  | j                  j                                y re   )rD  move_torN  r   rp   s    r   r   zShapeRenderer.pop  s!    t++//12r   c                l   d| _         | j                  |      }d}d}|t        |      k  rk||   }t        r|t        v r|rt
        j                  |       |dz  }|dkD  r|s| j                  |       n|dk(  rn|dk(  r|s	d| _         n|dk(  r|s	d| _         n|dk(  s|dk(  rC||   }|dz  }|s|dk(  r| xj                  |z  c_        n|dk(  r| xj                  |z  c_        |d	k(  r|s| j                          n|d
k(  r|s	 | j                          ni|dk(  r ||   }|dz  }|sW| j                  |       nD|dk(  r)||   }	||dz      }
|dz  }|s*| j                  |	|
       n|dk(  r4	 ||   }	||dz      }
|dz  }|	dk(  r|
dk(  rn|s| j                  |	|
       3|dk(  rx||   }t        ||dz            \  }}}|dk(  rd}|dz  }|s| j!                  || j                  z  t#        j$                  |dz        t#        j$                  |dz        |       n`|dk(  r||   }||dz      }||dz      dz  ||dz      z   }t        ||dz            \  }}}|d	z  }|dk(  rd}d}||z  }||z  }|r||z   dz
  }|dz  |z   }|dz  |z   }n||z
  dz   }|dz  |z
  }|dz  |z
  }|s| j'                  || j                  z  t#        j$                  |      t#        j$                  |      |       n|dk(  r0||   }	||dz      }
||dz      }|dz  }|so| j)                  |	|
|       n[|dk(  rA	 ||   }	||dz      }
|	dk(  r|
dk(  r|dz  }n8||dz      }|dz  }|s| j)                  |	|
|       @|dk(  r| j*                  sd}hd}|t        |      k  rk|rt#        j,                  | j.                  j0                  j2                  | j4                        sF| j.                  j7                  | j.                  j0                  j8                  | j4                  f       y y y # t        $ r t               w xY w)NTr   Fr      r1   r  r+  r(  r$  r,  r
  r-  r   -   r.     g     ?g     F@r/  r0  r)  )r@  rO  r^   DEBUGr@   DEBUG_SHAPE_NUMBERSadddraw_vectorrL  rT  r   r  r.   rC  draw_displacementdecode_octant_specsdraw_arc_spanmathradiansdraw_arc_start_to_end
draw_bulger   iscloserD  r   r3  rP  rV  r2  )rR   r   r   r   r   	skip_nextr   factorsub_shape_numberr2  r3  radiusstart_octantoctant_spanccwstart_offset
end_offset
binary_degstart_offset_angleend_offset_angle
end_octantstart_angle	end_anglebulges                           r   rC  zShapeRenderer.render  s   
 -	c%j <D$+-<#''5QJEby  &9 $9 %daiu
 qy**f4***f4*9		9+HHJ #(< 
 KK 01%L%!)$
 **1a0eAeai(AQJEAv!q&$..q!4  u1DU5ST9EU1V.k3!#"#K
 &&!3!33\B%67[2%56	   %U|"519-
	*a/53CC1DU5ST9EU1V.k3
?!$J)
%1J%>"#-
#: !-!;a!?J"."58J"JK *T 14D DI!-!;a!?J"."58J"JK *T 14D DI ..!3!33[1Y/	 %L%!)$eai(
 OOAq%0eAeai(AAv!q&
!%!),EQJE$1e4  || $IIo c%j r <<

d.>.>?

d.>.>?@ @ } " +(**+s   
P P3c                j    |dz  }|dz	  dz  }| j                  t        |   |z  t        |   |z         y )NrX  r+  )r_  VEC_XVEC_Y)rR   r   angler  s       r   r^  zShapeRenderer.draw_vector&  s;    CZqyC'uU|f4eElV6KLr   c                    | j                   }| j                  t        ||z  ||z        z   }| j                  r| j                  j                  |       y | j                  j                  |       y re   )rL  rR  r   r@  rD  line_torV  )rR   r2  r3  scaletargets        r   r_  zShapeRenderer.draw_displacement+  sS    ""&&a%iU)CC==FFNN6"FFNN6"r   c                @    ||r|n| z   }| j                  ||||       y re   )rd  )rR   rj  rt  
span_anglerm  ru  s         r   ra  zShapeRenderer.draw_arc_span3  s(      ::+F	""6;	3Gr   c                ~   |dkD  sJ t        |df|||      }|xj                  | j                  t        |r|j                  n|j
                        z
  z  c_        | j                  r#t        j                  | j                  |d       y | j                  j                  |r|j
                  n|j                         y )N        r   )
major_axisstart_param	end_paramrm  Freset)r   centerrR  r   start_point	end_pointr@  r   add_ellipserD  rV  )rR   rj  rt  ru  rm  arcs         r   rd  z#ShapeRenderer.draw_arc_start_to_end:  s     ||!{#	
 	

d++d"COO/
 
 	

 ==TVVS6FFNNC3==S__Er   c                    t        ||df|||      }| j                  r#t        j                  | j                  |d       y | j                  j                  |r|j                  n|j                         y )Nr   )r  r  r  r  rm  Fr  )r   r@  r   r  rD  rV  r  r  )rR   r  rj  r  r  rm  r  s          r   draw_arczShapeRenderer.draw_arcO  s\     "{#
 ==TVVS6FFNNC3==S__Er   c                @   | j                   r|r~| j                  }| j                  }|dkD  }|t        ||z  ||z        z   }t	        |      dz  }|rt        |||      \  }}	}
}nt        |||      \  }}	}
}| j                  |||	|
d       y | j                  ||       y )Nr   g     _@T)rm  )r@  rR  rL  r   absr   r  r_  )rR   r2  r3  rv  r  r}  rm  r  r  rt  ru  rj  s               r   re  zShapeRenderer.draw_bulged  s    ==U//K&&E!)C#d1u9a%i&@@IJ&E9EE:6Y :F{E:6Y MM&&+ydMK""1a(r   N)
rD  z	path.Pathr   Callable[[int], Sequence[int]]rL  ro   r@  r   r   r   )rX   r   )rX   r   r   )r   rE   rX   r   )r   rE   rX   r   )r2  ro   r3  ro   )rj  ro   rt  ro   r  ro   rm  r   )rj  ro   rt  ro   ru  ro   rm  r   )
r  r   rj  ro   r  ro   r  ro   rm  r   )r2  ro   r3  ro   rv  ro   )r   r   r   r   rm   r   rR  rT  r   rC  r^  r_  ra  rd  r  re  r   r   r   rB  rB    s%   5  #** 2*
 * * *"    ;3  EAEA 
	EANM
#HH*/H=BHIMHFF*/F<AFHLF*FF F 	F
 F F*)r   rB  c                >    d}| dk  rd}|  } | dz	  dz  }| dz  }|||fS )NTr   Fr+  rX  r   )specsrm  rk  rl  s       r   r`  r`  x  s>    
CqyQJ#%L#+Kc))r   c                    ddl m} ddlm}  || |j                        }d}	 t        |      }|j                  |      }||j                  S |S # t        t        f$ r |cY S w xY w)a@  Returns the shape number for shape `name` from the shape-file, returns -1 if not
    found.

    The filename can be an absolute path or the shape-file will be searched in the
    current directory and all directories stored in :attr:`ezdxf.options.support_dirs`.
    Supports shape files of type ".shx" and ".shp".
    r   )find_support_file)optionsr]   )
ezdxf.filemanagementr  ezdxfr  support_dirsr   IOErrorr   r~   rF   )r   rI   r  r  shape_file_namer   rg   
shx_symbols           r   find_shape_numberr    ss     7''2F2FGOE/* T"J   L '( s   A A#"A#c                      e Zd ZddZddZddZddZddZddZddZ	e
dd       Z	 d	 	 	 	 	 	 	 dd	Z	 d	 	 	 	 	 	 	 dd
Zy)
GlyphCachec                    || _         t               | _        t               | _        | j	                         | _        | j                         | _        | j                         | _	        y)zCText render engine for SHX/SHP fonts with integrated glyph caching.N)
fontrf   _glyph_cache_advance_width_cachedetect_space_widthspace_widthget_empty_box	empty_box_get_font_measurementsfont_measurements)rR   r  s     r   rm   zGlyphCache.__init__  sO    #	26&6:f!"&"9"9";$($6$6$8373N3N3Pr   c                T    	 || j                   j                  z  S # t        $ r Y yw xY w)NrK  )r  rq   ZeroDivisionError)rR   rq   s     r   get_scaling_factorzGlyphCache.get_scaling_factor  s0    	 6 6 A AAA  		s    	''c                    d| j                   j                  vr%| j                  d      j                  j                  S | j                  d      }|j                  j                  S )N    A   )r  rg   	get_shaper   r2  )rR   spaces     r   r  zGlyphCache.detect_space_width  sK    TYY%%%>>"%))+++r"yy{{r   c                   | j                  d      }t        |j                               }|j                  j                  }|j                  j
                  }|j                  }t        j                  |      }|j                  |t        |d      z          |j                  |t        ||      z          |j                  |t        d|      z          |j                          |j                  |j                         t        |      S )Nr  r   )r  r   control_verticessizer3  r2  rF  r   r   r|  r   closerV  r   r   )rR   glyph_AboxheightwidthrF  rD  s          r   r  zGlyphCache.get_empty_box  s    ..$G4467

IIe			%$ua.()			%$uf--.			%$q&/)*					'++|r   c                    t        t        j                         dd| j                  j                        }	 |j                  |d       t        |j                        S # t        $ r Y  w xY w)NTFr?  rA  )	rB  r   r   r  r   rC  r.   r   rD  )rR   r   rG  s      r   _render_shapezGlyphCache._render_shape  sb    IIKii))	
	JJ|uJ=   		s   A 	A+*A+c                   	 | j                   |   j                         S # t        $ r Y nw xY w	 | j                  |      }n,# t        $ r  |dk  rt        d       }n| j                  }Y nw xY w|| j                   |<   	 |j                  j                  }n# t        $ r | j                  }Y nw xY w|| j                  |<   |j                         S Nr  )r  cloneKeyErrorr  r$   r   r  r   r2  r  r  r  )rR   r   glyphr  s       r   r  zGlyphCache.get_shape  s    	$$\288:: 			'&&|4E% 	'b !$		'
 +0,'	%IIKKE 	%$$E	%27!!,/{{}s/    	++A &A*)A*=B B,+B,c                    |dk(  r| j                   S 	 | j                  |   S # t        $ r Y nw xY w| j                  |      j                  j
                  S r  )r  r  r  r  r   r2  )rR   r   s     r   get_advance_widthzGlyphCache.get_advance_width  sY    2###	,,\:: 		~~l+//111s   " 	..c                   t        | j                  t        d            j                         d d       }|j                  j
                  }|j                  j
                  |z
  }| j                  j                  }|dk(  rMt        | j                  t        d            j                         d d       }|j                  j
                  |z
  }| j                  j                  }|dk(  rMt        | j                  t        d            j                         d d       }||j                  j
                  z
  }t        ||||      S )Nr2  r]   r   ArD  )baselinerq   x_heightdescender_height)r   r  r   r  extminr3  extmaxr  rh   ri   r   )rR   bboxr  r  rq   r  s         r   r  z!GlyphCache._get_font_measurements  s     T^^CH5FFH"MN;;==;;==8+YY__
? C!9!J!J!LSb!QRD1J99??q  C!9!J!J!LSb!QRD'$++--7!-	
 	
r   c                Z      j                  |      |z  }t         fd|D              |z  S )Nc              3  R   K   | ]  }j                  t        |               y wre   )r  r   )r   crR   s     r   r   z-GlyphCache.get_text_length.<locals>.<genexpr>  s      @a4))#a&1@s   $')r  sum)rR   r   rq   width_factorscaling_factors   `    r   get_text_lengthzGlyphCache.get_text_length  s0     00<|K@4@@>QQr   c                4   g }| j                  |      }||z  }t        j                  ||d      }d}|D ]a  }	t        |	      }
|
dkD  r8| j	                  |
      }||d<   |j                  |       |j                  |       || j                  |
      |z  z  }c |S )zFReturns the glyph paths of string `s` as a list, scaled to cap height.r   r  r  )r  r   )r  r   r}  r   r  transform_inplacer_   r  )rR   r   rq   r  glyph_pathssysxmrR  r  r   r  s               r   get_text_glyph_pathszGlyphCache.get_text_glyph_paths  s     (*$$Z0,NN2r1% 	JAq6Lb |4*$''*""5) 6 6| Dr II	J r   N)r  rc   rX   r   )rq   ro   rX   ro   r   )rX   r   )r   rE   rX   r   )r   rE   rX   ro   )rX   r   )rK  )r   r   rq   ro   r  ro   rX   ro   )rK  rK  )r   r   rq   ro   r  ro   rX   zlist[GlyphPath])r   r   r   rm   r  r  r  r  r  r  r   r  r  r  r   r   r   r  r    s    Q (2 
 
. CFRR%*R:?R	R IL%*@E	r   r  )rJ   r>   rX   rY   )r   r   rX   rc   )r   rH   rX   r   )r   Iterable[bytes]rX   zIterator[int])rJ   rH   rX   rc   )rJ   rH   rX   dict[int, Symbol])rJ   rH   rX   ztuple[bytes, Sequence[int]])r  r   rX   zSequence[Any])r  r   rX   r  r   )r  r   rX   r>   )r7  r  rX   zIterator[bytes])r7  r  rX   zdict[bytes, Sequence[bytes]]))r   r   F)
rE  r>   r   r  r   r   rF  r   rX   r   )r  rE   rX   ztuple[int, int, bool])r   r   rI   rH   rX   rE   )Ur   
__future__r   typingr   r   r   r   r   r	   r
   r   dataclassesenumrb  r   
ezdxf.mathr   r   r   r   r   r   r  r   r  r   glyphsr   r   	Exceptionr   r"   r$   r&   r(   r*   r,   r.   IntEnumr0   r6   r;   r   r?   rZ   r[  setr@   r\  r   r   r   	dataclassrD   rQ   rc   r   r   r   r   r   r   r   r   r   r  r   r  r   r   r!  r"  r1  r  r   r   r   r   rx  ry  rB  r`  r  r  r   r   r   <module>r     s9  	 #	 	 	       / %	 		- 		/ 		. 		. 		+ 		+ 		' 	DLL 4<< t|| 
   X e s8H	 
 
 
A< A<H7D8
 	<&)
2> 2>l  B  $5&
  /.d,!4  -  	 8 	HGs) s)l*.| |r   