
    'j                       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j'                  Z( G d dej'                  Z) G d dej'                  Z* e+            Z,d e-d!<   d"Z. e/            Z0d#e-d$<    e/            Z1 e2d%          Z3 e2d&          Z4ej5         G d' d(                      Z6djd,Z7 G d- d.          Z8dkd1Z9dld5Z:dld6Z;dmd:Z<dnd;Z=dnd<Z>dnd=Z?dnd>Z@ G d? d@          ZAdAZBdodCZCdpdEZDdFZEdndGZFdqdJZGdrdKZHh dLZIdsdtdMZJdudPZKdudQZLdvdSZM	 	 dwdxd]ZNg d^ZOg d_ZP G d` da          ZQdydeZRdzdgZS G dh die          ZTdS ){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dS )ShapeFileExceptionN__name__
__module____qualname__     O/DATA/AppData/hermes/venv/lib/python3.11/site-packages/ezdxf/fonts/shapefile.pyr   r   +           Dr   r   c                      e Zd ZdS )UnsupportedShapeFileNr   r   r   r   r"   r"   /   r    r   r"   c                      e Zd ZdS )UnsupportedShapeNumberNr   r   r   r   r$   r$   3   r    r   r$   c                      e Zd ZdS )InvalidFontDefinitionNr   r   r   r   r&   r&   7   r    r   r&   c                      e Zd ZdS )InvalidFontParametersNr   r   r   r   r(   r(   ;   r    r   r(   c                      e Zd ZdS )InvalidShapeRecordNr   r   r   r   r*   r*   ?   r    r   r*   c                      e Zd ZdS )FileStructureErrorNr   r   r   r   r,   r,   C   r    r   r,   c                      e Zd ZdS )StackUnderflowNr   r   r   r   r.   r.   G   r    r   r.   c                      e Zd ZdZdZdZdS )FontEmbeddingr   r      N)r   r   r   ALLOWED
DISALLOWEDREADONLYr   r   r   r0   r0   K   s        GJHHHr   r0   c                      e Zd ZdZdZdZdS )FontEncodingr   r   r1   N)r   r   r   UNICODEPACKED_MULTIBYTE_1
SHAPE_FILEr   r   r   r6   r6   Q   s        GJJJr   r6   c                      e Zd ZdZdZdS )FontModer   r1   N)r   r   r   
HORIZONTALBIDIRECTr   r   r   r;   r;   W   s        JHHHr   r;   Sequence[int]NO_DATAFzSet[int]DEBUG_CODES0-c                  F    e Zd ZU ded<   ded<   ded<   eZded<   dddZdS )Symbolintnumber
byte_countbytesnamer>   datar   as_numreturnlist[bytes]c                    |r|n| j         }d|dd| j         d                                | j        z   g}|                    t          | j                             |S )N*05X,)rF   rG   encoderI   extendformat_shape_data_stringrJ   )selfrK   numexports       r   
export_strzSymbol.export_strl   sg    /ffDK2c22222299;;diGH.ty99:::r   Nr   )rK   rE   rL   rM   )r   r   r   __annotations__r?   rJ   rX   r   r   r   rD   rD   e   s[         KKKOOOKKK!D!!!!      r   rD   rJ   rL   rM   c                    g }d}| D ]g}|| d                                 z   }t          |          dk     r|}2|                    |d d                    d| d                                 }h|r|                    |d d                    |S )Nr   rQ   P   )rR   lenappend)rJ   rW   srV   s2s        r   rT   rT   s   s    FA $ $C!!###r77R<<AAMM!CRC&!!!C


!!##AA 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d0dZd1d2dZd1d3d Zd1d4d#Zd5d6d(Zd)S )7	ShapeFilez+Low level representation of a SHX/SHP file.rI   rH   aboverE   belowc                    t                      | _        || _        || _        || _        || _        || _        || _        d S N)dictshapesrI   rd   re   modeencodingembed)rU   rI   rd   re   rj   rk   rl   s          r   __init__zShapeFile.__init__   s=     *.	

	 


r   rL   floatc                *    t          | j                  S rg   )rn   rd   rU   s    r   
cap_heightzShapeFile.cap_height       TZ   r   c                *    t          | j                  S rg   )rn   re   rp   s    r   	descenderzShapeFile.descender   rr   r   boolc                ,    | j         t          j        k    S rg   rk   r6   r9   rp   s    r   is_fontzShapeFile.is_font       } 777r   c                ,    | j         t          j        k    S rg   rw   rp   s    r   is_shape_filezShapeFile.is_shape_file   ry   r   Optional[Symbol]c                \    | j                                         D ]}||j        k    r|c S d S rg   )ri   valuesrI   )rU   rI   symbols      r   findzShapeFile.find   s?    k((** 	 	Fv{"" #tr   c                *    t          | j                  S rg   )r^   ri   rp   s    r   __len__zShapeFile.__len__   s    4;r   c                    | j         |         S rg   )ri   )rU   items     r   __getitem__zShapeFile.__getitem__   s    {4  r   recordsSequence[bytes]c                j   t          |           dk    rt          j        }d}d}t          j        }t
          j        }d}| \  }}	 |                    dd          \  }	}
}n# t          $ r t                      w xY w|	dk    r;	 |                    d          \  }}}}}}no# t          $ r t          |          w xY w|	dk    r@	 |                    d          ^}}}}|d         }n)# t          $ r t          |          w xY wt          j        }t          |          dk    sJ t          |                                t          |          t          |          t          t          |                    t          t          |                    t          t          |                              S d S )Nr1   r      ,maxsplit   *UNIFONT   *0r]   )r^   r6   r7   r0   r2   r;   r<   split
ValueErrorr&   r(   r9   rE   rc   strip)r   rk   rd   re   rl   rj   endheaderparamsspec_rI   rests                r   from_ascii_recordszShapeFile.from_ascii_records   s   w<<1#+HEE!)E&DC$NFF. &TA > >a . . .+---.{""8?E||D?Q?Q<E5$%! 8 8 8/7778806T0B0B-E5$r(CC! 8 8 8/7778 (2s88q====

E

E

T##S]]++c%jj))  9 s$   A! !A:B! !B;!C' 'DIterable[Sequence[bytes]]Nonec                   |D ]m}t          |          dk     rt          |          	 t          |d                   \  }}}n## t          $ r t	          |d                   w xY wt          |          dk    sJ |d         t
          k    rt          |dd          d          }nt          |dd          d          }t          |t          |          |          }d                    |dd                    }t          t          t          |                              |_        |j        d         dk    r|| j        |<   @|d                             d	          }	t	          d
|	 d          d S )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   ri   decode)
rU   r   recordrF   rG   rI   int_numr   rJ   r`   s
             r   parse_ascii_recordszShapeFile.parse_ascii_records   s    	R 	RF6{{Q(0004+;F1I+F+F(
DD 4 4 4(3334 v;;????ayH$$fQRRj"--fQRRj"--GS__d;;F88F122J''DL,>,> ? ?@@FK{2!##'-G$$1I$$H$55()PA)P)P)PQQQ+	R 	Rs   A A#rF   r>   c                f    | j                             |          }|t          |          |j        S rg   )ri   getr$   rJ   )rU   rF   r   s      r   	get_codeszShapeFile.get_codes   s0    ((>(000{r   Fr   c                2    t          |g| j        |          S N)stackedrender_shapesr   )rU   rF   r   s      r   render_shapezShapeFile.render_shape   s    fXt~wGGGGr   numbersc                0    t          || j        |          S r   r   )rU   r   r   s      r   r   zShapeFile.render_shapes   s    WdngFFFFr   textstrc                J    d |D             }t          || j        |d          S )Nc                ,    g | ]}t          |          S r   )ord).0chars     r   
<listcomp>z)ShapeFile.render_text.<locals>.<listcomp>   s    ...3t99...r   T)r   reset_to_baseliner   )rU   r   r   r   s       r   render_textzShapeFile.render_text   s7    .....T^W
 
 
 	
r   r   shape_numberrK   rM   c                B    | j         |                             |          S rg   )ri   rX   )rU   r   rK   s      r   shape_stringzShapeFile.shape_string  s    {<(33F;;;r   N)rI   rH   rd   rE   re   rE   )rL   rn   rL   ru   )rI   rH   rL   r|   )r   r   )r   r   rL   r   )rF   rE   rL   r>   F)rF   rE   rL   r   )r   r>   rL   r   )r   r   rL   r   rY   )r   rE   rK   rE   rL   rM   )r   r   r   __doc__r;   r<   r6   r7   r0   r2   rm   propertyrq   rt   rx   r{   r   r   r   staticmethodr   r   r   r   r   r   r   r   r   r   rc   rc      s       55  %#    " ! ! ! X! ! ! ! X! 8 8 8 X8 8 8 8 X8        ! ! ! $ $ $ \$LR R R R0   H H H H HG G G G G
 
 
 
 
< < < < < < <r   rc   filenamer   c                $   t          j        |                                           }|                                 } |                     d          rt          |          S |                     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"   )r   rJ   s     r   readfiler     s    
 <!!,,..D~~H   7~~			6	"	" 7~~"#5666r   r   rH   r   c                ^    t          d |                     dd          D                       S )Nc              3  >   K   | ]}|                                 V  d S rg   r   r   r`   s     r   	<genexpr>z#split_def_record.<locals>.<genexpr>  s*      CCqCCCCCCr   r   r1   r   r   r   r   s    r   r   r     s/    CCFLLL$B$BCCCCCCr   c                Z    t          d |                     d          D                       S )Nc              3  >   K   | ]}|                                 V  d S rg   r   r   s     r   r   zsplit_record.<locals>.<genexpr>  s*      77q777777r   r   r   r   s    r   r   r     s+    77FLL$6$6777777r   codesIterable[bytes]Iterator[int]c              #  "  K   | D ]}|                     d          }|dk    r|d         t          k    rt          |d          V  B|d         t          k    r$|d         t          k    rt          |d          V  wt          |d          V  d S )Ns   ()r   r   r   r   r   )r   r   rE   	ORD_MINUS)r   codes     r   r   r     s       	  	 zz%  3;;7hdB--!W	!!d1g&9&9dB--dB--	  	 r   c           	     l   t          t          t          |                     d                                        }d|v r|                    d          }nd|v r|                    d          }nd}t
                              |          }|                    |                                           |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<M/N/N#O#OPPGg!++k22	'		!++e,, *

&
&
7
7CGNN,,---Jr   c                @   |                      d          rt          |           S |                      d          rt          |           S |                      d          rt          |           S |                      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  s    /00 K&t,,,	1	2	2 K&t,,,	2	3	3 K(...	2	3	3 K"#IJJJ
:
;
;;r   c                ,   d}d}t           j        }d}t          |           }|                    d          }|rA|                    d           |j        }|d         }|d         }t          |d                   }t          ||||          }||_        |S )Nr   r   r   r1   )rd   re   rj   )r;   r<   parse_shx_shapesr   r   rJ   rc   ri   )	rJ   rd   re   rj   rI   ri   r   
shape_data
shape_files	            r   r   r   E  s    EEDDd##FjjmmO '

1$)
11
1&&4uEEEEJJr   c                     t          |           S rg   )r   r   s    r   r   r   X  s    "4(((r   c                  h    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dS )
DataReaderr   rJ   rH   c                "    || _         || _        d S rg   rJ   index)rU   rJ   r   s      r   rm   zDataReader.__init__^  s    	


r   rL   ru   c                <    | j         t          | j                  k     S rg   )r   r^   rJ   rp   s    r   has_datazDataReader.has_datab  s    zC	NN**r   nrE   r   c                &    | xj         |z  c_         d S rg   )r   )rU   r   s     r   skipzDataReader.skipf  s    

a



r   c                J    | j         }| xj         dz  c_         | j        |         S )Nr   r   rJ   rU   r   s     r   u8zDataReader.u8i  s%    


a

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

a

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

a

3; 	S[>!Lr   c                ~    t                      }	 |                                 }|r|                    |           n|S /rg   )	bytearrayr   r_   )rU   rJ   r   s      r   read_strzDataReader.read_str}  sD    {{	7799D D!!!!	r   c                T    | j         }| xj         |z  c_         | j        |||z            S rg   r   )rU   r   r   s      r   r   zDataReader.read_bytes  s.    


a

y*++r   c                r    | 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

y49UQY#71#<==r   NrY   )rJ   rH   r   )r   rE   rL   r   )rL   rE   )rL   rH   )r   rE   rL   rH   )r   r   r   rm   r   r   r   r   r  r  r  r   r  r   r   r   r   r   ]  s             + + + X+          
         , , , ,
> > > > > >r   r      dict[int, Symbol]c           
        t                      }t          | t                    }|                                dk    rt	          d          |                                }|                                }|                                }g }t          |          D ]A}|                                }|                                }	|                    ||	f           B|d         d         |k    rt	          d          |d         d         |k    rt	          d          |D ]\  }}
|                    |
          }	 t          |          \  }}n1# t          $ r$ t	          d|dd	t          |                     w xY w|
t          |          z
  d
z
  }t          ||||          ||<   |                    d          dk    rt	          d          |S )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 *rP   z: r      s   EOFzEOF marker not found)rh   r   SHX_SHAPES_START_INDEXr   r,   r  ranger_   r   parse_shx_data_record
IndexErrorr   r^   rD   )rJ   ri   readerfirst_numberlast_numbershape_countindex_tabler   r   	data_sizelengthr   rI   r   rG   s                  r   r   r     s    $F455Fyy{{d !@AAA::<<L**,,K**,,K)+K; 6 6zz||JJLL	L)455551~aL(( !EFFF2q[(( !DEEE + 	R 	Rf""6**	4V<<D** 	 	 	$MLMMMFMM  	 c$ii'!+
%lJjQQ|v%% !7888Ms   9E.E:tuple[bytes, Sequence[int]]c                n    t          |           }|                                }t          |          }||fS )z&Low level SHX/SHP shape record parser.)r   r  parse_shape_codes)rJ   r  rI   r   s       r   r  r    s5    F??Df%%E;r      c                    t          | t                    }t          |          \  }}}}}}t          ||||||          }	 t	          |          |_        n# t          $ r t          d          w xY w|S )N)rd   re   rj   rk   rl   zpre-mature end of file)r   SHX_UNIFONT_START_INDEXparse_shx_unifont_definitionrc   parse_shx_unifont_shapesri   r  r,   )	rJ   r  rI   rd   re   rj   rk   rl   r   s	            r   r   r     s    566F0LV0T0T-D%h  J;4V<<
 ; ; ; !9:::;s   A A1r  Sequence[Any]c                   |                                  dk    rt          d          |                     d           |                                 }|                                  }|                                  }t	          |                                            }t          |                                            }t          |                                            }|                     d           ||||||fS )Nr  r     r   )r   r,   r   r  r;   r6   r0   )r  rI   rd   re   rj   rk   rl   s          r   r'  r'    s    yy{{d !@AAA
KKNNN ??DIIKKEIIKKEFIIKK  DFIIKK((H&))++&&E
KKNNNtXu44r   c                p   t                      }| j        r|                                 }|                                 }|                                 }|t	          |          z
  dz
  }|                     |          }t          t          |          d          }t          ||||          ||<   | j        |S )Nr   T)unifont)	rh   r   r  r  r^   r   r#  r   rD   )r  ri   r   rG   rI   data_recordr   s          r   r(  r(    s     $F
/ Mzz||ZZ\\
  #d))+a/
''
33!*["9"94HHH%lJeLL| / M Mr   >   r   r1      r+     c                   g }	 |                                  }|                    |           |dk    rt          |          S |t          v s|dk    rO|dk    s|dk    r)|                    |                                             nD|dk    rT|r)|                    |                                            n|                    |                                             n|dk    rP|                    |                                            |                    |                                            n|dk    rad	\  }}|s|rV|                                 }|                                 }|                    |           |                    |           |T|Vn-|d
k    rP|                    |                                             |                    |                                            n|dk    r|                    |                                             |                    |                                             |                    |                                             |                    |                                             |                    |                                            n|dk    rv|                    |                                            |                    |                                            |                    |                                            n|dk    rd	\  }}|s|r|                                 }|                                 }|                    |           |                    |           |s|r'|                    |                                            ||)NTr   r0  r        r  	   )r   r   r            )r   r_   r   SINGLE_CODESr  r  r  )r  r-  r   r   xys         r   r#  r#    s=   E-.yy{{T199<<\!!TBYYQYY$!))LL%%%%QYY *VZZ\\****VYY[[))))QYYLL%%%LL%%%%QYYDAq  q  IIKKIIKKQQ	   q  
 RZZLL%%%LL))))RZZLL%%%LL%%%LL%%%LL%%%LL))))RZZLL%%%LL%%%LL%%%%RZZDAq .q .IIKKIIKKQQ . .LL---  .q .O-.r   linesIterator[bytes]c              #     K   | D ]b}|                     d           |                                }|r5|                    d          d         }|                                }|r|V  cd S )Ns   
   ;r   )rstripr   r   )r;  lines     r   r   r   *  s{        Gzz|| 	::d##A&D::<<D 


 r   c              #    K   d}| D ]z}|s|}|                     d          r"|                     d          r||z  }7|V  |}>|                    d          r||z  }Y|                     d          r||z  }t|V  |}{|r|V  d S d S )Nr      *r   )r   r   )r;  current	next_lines      r   r   r   5  s      G    	 	 GG%% 	 ##D)) $9$#d## 	 y GG!!$'' 	 y GGMMMGG  r   dict[bytes, Sequence[bytes]]c                   t                      }d }g }| D ]}|                    d          rt          d          |                    d          rE|t          |          ||<   |                    d          d                                         }|g}|                    |           |t          |          ||<   |S )Ns   *BIGFONTz)BIGFONT shape files are not supported yetrB  r   r   )rh   r   r"   r   r   r   r_   )r;  r   rI   r   r@  s        r   r   r   K  s     -1FFGDF 	  	 ??;'' 	T&'RSSS??4   	  %f::d##A&,,..DVFFMM$fNr   r   r   shape_numbersr   Callable[[int], Sequence[int]]r   ru   startr   r   c                   t          t          j        |          d||          }| D ]E}	 |                    ||           # t          $ r Y 't
          $ r t          d|           w xY wt          |j                  S )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)rH  r   r   rJ  r   ctxr   s          r   r   r   a  s     	%	  C &  	JJ|7HJIIII% 	 	 	D 	 	 	 NNN  	
 SUs   A
A+A+)r   r   r         ?r         r]   r]   r]   r]   r]   rT  r   rS  r   r   )r   rS  r   r   r   r   r   rS  r   rT  r]   r]   r]   r]   r]   rT  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/d0dZ	d1dZ
d2dZd3d"Zd4d$Zd5d(Zd6d*Zd+S )7rO  z+Low level glyph renderer for SHX/SHP fonts.      ?TF)vector_lengthrM  r   rQ  	path.Pathr   rI  rW  rn   rM  ru   r   c                   || _         t          |          | _        || _        || _        g | _        || _        | j         j        j        | _	        d S rg   )
rQ  rn   rW  rM  r   _location_stack
_get_codesrJ  r:  _baseline_y)rU   rQ  r   rW  rM  r   s         r   rm   zShapeRenderer.__init__  sL     "=11 +-#6<>r   rL   r   c                4    t          | j        j                  S rg   )r   rQ  r   rp   s    r   current_locationzShapeRenderer.current_location  s    DFJr   r   c                D    | j                             | j                   d S rg   )rZ  r_   r^  rp   s    r   pushzShapeRenderer.push  s"    ##D$9:::::r   c                h    | j                             | j                                                   d S rg   )rQ  move_torZ  r   rp   s    r   r   zShapeRenderer.pop  s+    t+//1122222r   r   rE   c                	   d| _         |                     |          }d}d}|t          |          k     r||         }t          r%|t          v r|rt
                              |           |dz  }|dk    r|s|                     |           n|dk    rn|dk    r|s	d| _         nr|dk    r|s	d| _         na|dk    s|dk    r?||         }|dz  }|s.|dk    r| xj        |z  c_        n|dk    r| xj        |z  c_        ߐn|d	k    r|s| 	                                 n|d
k    r5|s3	 | 
                                 n# t          $ r t                      w xY w|dk    r&||         }|dz  }|s|                     |           n|dk    r2||         }	||dz            }
|dz  }|s|                     |	|
           nY|dk    rA	 ||         }	||dz            }
|dz  }|	dk    r|
dk    rn|s|                     |	|
           >n|dk    r||         }t          ||dz                      \  }}}|dk    rd}|dz  }|sJ|                     || 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
  }|sD|                     || j        z  t#          j        |          t#          j        |          |           n|dk    r=||         }	||dz            }
||dz            }|dz  }|s|                     |	|
|           nh|dk    rQ	 ||         }	||dz            }
|	dk    r|
dk    r|dz  }n*||dz            }|dz  }|s|                     |	|
|           On|dk    r| j        sd}d}|t          |          k     |r[t#          j        | j        j        j        | j                  s4| j                            | j        j        j        | j        f           d S d S d S )NTr   Fr      r1   r  r2  r/  r+  r3  r  r4  r   -   r5     g     ?g     F@r6  r7  r0  )rM  r[  r^   DEBUGr@   DEBUG_SHAPE_NUMBERSadddraw_vectorrW  r`  r   r  r.   rP  draw_displacementdecode_octant_specsdraw_arc_spanmathradiansdraw_arc_start_to_end
draw_bulger   iscloserQ  r   r:  r\  rb  r9  )rU   r   r   r   r   	skip_nextr   factorsub_shape_numberr9  r:  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   rP  zShapeRenderer.render  s   
 --	c%jj  <D 6$+--<-#''555QJEbyyy  &&&&9 $9 %daiiu
  qyy**f4*****f4** 9		9+HHJJJJ! + + +(***+#(< 
  2KK 0111%L%!)$
  1**1a0005eAeai(AQJEAvv!q&&$ 5..q!4445
  u1DU5ST9EU1V1V.k3!##"#K
  &&!33\B%677[2%566	     %U|"519-
	*a/53CC1DU5ST9EU1V1V.k3
??!$J)
%1J%>"#-
#:  E!-!;a!?J"."58J"JK *T 14D DII!-!;a!?J"."58J"JK *T 14D DI  ..!33[11Y//	   %L%!)$eai(
  1OOAq%000	5eAeai(AAvv!q&&
!%!),EQJE$ 51e444	5
 
 |  $IIo c%jj  r  	A<
d.>?? A
d.>?@@@@@	A 	AA As   )D? ?Er   c                    |dz  }|dz	  dz  }|                      t          |         |z  t          |         |z             d S )Nrd  r2  )rk  VEC_XVEC_Y)rU   r   angler   s       r   rj  zShapeRenderer.draw_vector&  sG    CZqyC'uU|f4eElV6KLLLLLr   r9  r:  c                    | j         }| j        t          ||z  ||z            z   }| j        r| j                            |           d S | j                            |           d S rg   )rW  r^  r   rM  rQ  line_torb  )rU   r9  r:  scaletargets        r   rk  zShapeRenderer.draw_displacement+  sg    "&a%iU)C)CC= 	#FNN6"""""FNN6"""""r   rv  r  
span_anglery  c                J    ||r|n| z   }|                      ||||           d S rg   )rp  )rU   rv  r  r  ry  r  s         r   rm  zShapeRenderer.draw_arc_span3  s9      #E:::+F	""6;	3GGGGGr   r  c                @   |dk    sJ t          |df|||          }|xj        | j        t          |r|j        n|j                  z
  z  c_        | j        rt          j        | j	        |d           d S | j	        
                    |r|j        n|j                   d S )N        r   )
major_axisstart_param	end_paramry  Freset)r   centerr^  r   start_point	end_pointrM  r   add_ellipserQ  rb  )rU   rv  r  r  ry  arcs         r   rp  z#ShapeRenderer.draw_arc_start_to_end:  s     ||||!{#	
 
 
 	

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


 = 	FTVS666666FNNCD3==S_EEEEEr   r  r  r  c                    t          ||df|||          }| j        rt          j        | j        |d           d S | j                            |r|j        n|j                   d S )Nr   )r  r  r  r  ry  Fr  )r   rM  r   r  rQ  rb  r  r  )rU   r  rv  r  r  ry  r  s          r   draw_arczShapeRenderer.draw_arcO  s     "{#
 
 
 = 	FTVS666666FNNCD3==S_EEEEEr   r  c                X   | j         r|r| j        }| j        }|dk    }|t          ||z  ||z            z   }t	          |          dz  }|rt          |||          \  }}	}
}nt          |||          \  }}	}
}|                     |||	|
d           d S |                     ||           d S )Nr   g     _@T)ry  )rM  r^  rW  r   absr   r  rk  )rU   r9  r:  r  r  r  ry  r  r  r  r  rv  s               r   rq  zShapeRenderer.draw_bulged  s    = 	)U 	)/K&E!)C#d1u9a%i&@&@@IJJ&E 9EE: :6Y :F{E: :6Y MM&&+ydMKKKKK""1a(((((r   N)
rQ  rX  r   rI  rW  rn   rM  ru   r   ru   )rL   r   )rL   r   r   )r   rE   rL   r   )r   rE   rL   r   )r9  rn   r:  rn   )rv  rn   r  rn   r  rn   ry  ru   )rv  rn   r  rn   r  rn   ry  ru   )
r  r   rv  rn   r  rn   r  rn   ry  ru   )r9  rn   r:  rn   r  rn   )r   r   r   r   rm   r   r^  r`  r   rP  rj  rk  rm  rp  r  rq  r   r   r   rO  rO    s<       55  #* * * * * *"       X ; ; ; ;3 3 3 3  EA EA EA EA EANM M M M
# # # #H H H HF F F F*F F F F*) ) ) ) ) )r   rO  specsrE   tuple[int, int, bool]c                @    d}| dk     rd}|  } | dz	  dz  }| dz  }|||fS )NTr   Fr2  rd  r   )r  ry  rw  rx  s       r   rl  rl  x  s@    
CqyyQJ#%L#+Kc))r   rI   c                    ddl m} ddlm}  || |j                  }d}	 t          |          }n# t          t          f$ r |cY S w xY w|                    |          }||j	        S |S )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   ri   
shx_symbols           r   find_shape_numberr    s     766666'''2FGGOE/**'(   T""J  Ls   1 AAc                  x    e Zd ZddZddZd d
Zd!d"dZd#dZd$dZd%dZ	e
d&d            Z	 d'd(dZ	 d)d*dZdS )+
GlyphCachefontrc   rL   r   c                   || _         t                      | _        t                      | _        |                     |j                  | _        |                                 | _        | 	                                | _
        dS )zCText render engine for SHX/SHP fonts with integrated glyph caching.)default_widthN)r  rh   _glyph_cache_advance_width_cachedetect_space_widthrq   space_widthget_empty_box	empty_box_get_font_measurementsfont_measurements)rU   r  s     r   rm   zGlyphCache.__init__  si    #	26&&6:ff!"&"9"9"9"X"X$($6$6$8$8373N3N3P3Pr   rq   rn   c                D    	 || j         j        z  S # t          $ r Y dS w xY w)NrV  )r  rq   ZeroDivisionError)rU   rq   s     r   get_scaling_factorzGlyphCache.get_scaling_factor  s:    	 6 AAA  	 	 	33	s    
r  c                    d| j         j        v r|                     d          j        j        S d| j         j        v r|                     d          j        j        S |S )N    A   )r  ri   	get_shaper   r9  )rU   r  s     r   r  zGlyphCache.detect_space_width  sX    !!!>>"%%)++!!!>>"%%)++r   r  r   rE   r   c                   | j         }|j        }| j        }t          dd          }t          |d          }||j        v r\|                     |          }t          |                                          }|j        j	        }|j        j
        }|j        }|j        }t          j        |          }	|	                    |t          |d          z              |	                    |t          ||          z              |	                    |t          d|          z              |	                                 |	                    |           t%          |	          S )zReturns the empty box (tofu) representation based on the size of the given
        character index.

        The given index may not exist and a default box based on cap-height and space
        width will be created.
        r   )r  rq   r  r   ri   r  r   control_verticessizer:  r9  rJ  r   r   r   r  closerb  r   )
rU   r   r  heightwidthrJ  r   glyphboxrQ  s
             r   r  zGlyphCache.get_empty_box  s!    y Q

5!nn4;NN4((E 6 6 8 899CXZFHJEKE)CIe			%$ua..()))			%$uf---...			%$q&//)***							#||r   c                    t          t          j                    dd| j        j                  }	 |                    |d           n# t          $ r Y nw xY wt          |j                  S )NTFrL  rN  )	rO  r   r   r  r   rP  r.   r   rQ  )rU   r   rR  s      r   _render_shapezGlyphCache._render_shape  s{    IKKi)	
 
 
	JJ|uJ==== 	 	 	D	s   A 
AAr   c                   	 | j         |                                         S # t          $ r Y nw xY w	 |                     |          }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        |<   |                                S Nr  )r  cloneKeyErrorr  r$   r   r  r   r9  r  r  r  )rU   r   r  r  s       r   r  zGlyphCache.get_shape  s    	$\288::: 	 	 	D		'&&|44EE% 	' 	' 	'b  !$		'
 +0,'	%IKEE 	% 	% 	%$EEE	%27!,/{{}}s/   ! 
..A 'A21A2 B B! B!c                    |dk    r| j         S 	 | j        |         S # t          $ r Y nw xY w|                     |          j        j        S r  )r  r  r  r  r   r9  )rU   r   s     r   get_advance_widthzGlyphCache.get_advance_width  sa    2##	,\:: 	 	 	D	~~l++/11s    
))r   c                   t          |                     t          d                                                    d d                   }|j        j        }|j        j        |z
  }| j        j        }|dk    rXt          |                     t          d                                                    d d                   }|j        j        |z
  }| j        j	        }|dk    rXt          |                     t          d                                                    d d                   }||j        j        z
  }t          ||||          S )Nr9  r]   r   ArQ  )baselinerq   x_heightdescender_height)r   r  r   r  extminr:  extmaxr  rd   re   r   )rU   bboxr  r  rq   r  s         r   r  z!GlyphCache._get_font_measurements  s    T^^CHH55FFHH"MNN;=;=8+Y_
?? C!9!9!J!J!L!LSbS!QRRD1J9?q   C!9!9!J!J!L!LSbS!QRRD'$+-7!-	
 
 
 	
r   rV  r   r   width_factorc                p                           |          |z  }t           fd|D                       |z  S )Nc              3  \   K   | ]&}                     t          |                    V  'd S rg   )r  r   )r   crU   s     r   r   z-GlyphCache.get_text_length.<locals>.<genexpr>  s7      @@a4))#a&&11@@@@@@r   )r  sum)rU   r   rq   r  scaling_factors   `    r   get_text_lengthzGlyphCache.get_text_length  sE     00<<|K@@@@4@@@@@>QQr   list[GlyphPath]c                `   g }|                      |          }||z  }t          j        ||d          }d}|D ]v}	t          |	          }
|
dk    rD|                     |
          }||d<   |                    |           |                    |           ||                     |
          |z  z  }w|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  )rU   r   rq   r  glyph_pathssysxmr^  r  r   r  s               r   get_text_glyph_pathszGlyphCache.get_text_glyph_paths  s     (*$$Z00,N2r1%% 	J 	JAq66Lb  |44*$''***""5))) 6 6| D Dr IIr   N)r  rc   rL   r   )rq   rn   rL   rn   )r  rn   rL   rn   )r  )r   rE   rL   r   )rL   r   )r   rE   rL   r   )r   rE   rL   rn   )rL   r   )rV  )r   r   rq   rn   r  rn   rL   rn   )rV  rV  )r   r   rq   rn   r  rn   rL   r  )r   r   r   rm   r  r  r  r  r  r  r   r  r  r  r   r   r   r  r    s       Q Q Q Q          >          (2 2 2 2 
 
 
 ]
. CFR R R R R IL      r   r  )rJ   r>   rL   rM   )r   r   rL   rc   )r   rH   rL   r   )r   r   rL   r   )rJ   rH   rL   rc   )rJ   rH   rL   r  )rJ   rH   rL   r!  )r  r   rL   r)  )r  r   rL   r  r   )r  r   rL   r>   )r;  r   rL   r<  )r;  r   rL   rE  )rG  F)
rH  r>   r   rI  r   ru   rJ  r   rL   r   )r  rE   rL   r  )r   r   rI   rH   rL   rE   )Ur   
__future__r   typingr   r   r   r   r   r	   r
   r   dataclassesenumrn  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   rg  setr@   rh  r   r   r   	dataclassrD   rT   rc   r   r   r   r   r   r   r   r   r   r  r   r  r&  r   r'  r(  r8  r#  r   r   r   r   r  r  rO  rl  r  r  r   r   r   <module>r     sl  	 	 	 # " " " " "	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	                             / / / / / / % % % % % % % %	 	 	 	 	 	 	 		 	 	 	 	- 	 	 		 	 	 	 	/ 	 	 		 	 	 	 	. 	 	 		 	 	 	 	. 	 	 		 	 	 	 	+ 	 	 		 	 	 	 	+ 	 	 		 	 	 	 	' 	 	 	    DL       4<       t|   
             cee 3s88CHH	 
 
 
 
 
 
 
 
   A< A< A< A< A< A< A< A<H7 7 7 7D D D D8 8 8 8
  
  
  
    	< 	< 	< 	<   &) ) ) )
2> 2> 2> 2> 2> 2> 2> 2>l     B        $5 5 5 5&
 
 
 
  /. /. /. /. /.d      ,   4     8 	HGGGGGs) s) s) s) s) s) s) s)l* * * *   .O O O O O O O O O Or   