
    hyA                       S SK Jr  S SKJrJrJrJrJrJr  S SK	r	S SK
r
S SKrS SKrSSKJrJrJrJrJrJrJrJrJrJrJrJrJrJrJr  SSKJrJr  SSK J!r!J"r"J#r#  S SK$J%r%  S S	K&J'r'J(r(  \	RR                  " S
5      r* " S S5      r+S4S jr,S5S jr-S6S jr.S7S jr/S8S jr0S9S jr1S9S jr2S9S jr3S:S jr4S;S jr5S<S jr6S=S jr7S<S jr8S<S jr9S<S jr:S<S jr;S>S jr<S?S jr=S@S jr>SAS  jr?SBS! jr@SBS" jrASCS# jrBSCS$ jrCSAS% jrDSDS& jrESAS' jrF\FrGSAS( jrH\HrISES) jrJSES* jrKSAS+ jrLSFS, jrMSGS- jrNSHS. jrOSIS/ jrPSJS0 jrQSKS1 jrRSAS2 jrSSAS3 jrTg)L    )annotations)TextIOIterableOptionalcastSequenceIteratorN   )DXFStructureErrorDXFErrorDXFValueErrorDXFTypeErrorDXFAppDataErrorDXFXDataErrorAPP_DATA_MARKERHEADER_VAR_MARKERXDATA_MARKERINVALID_LAYER_NAME_CHARACTERSacad_releaseVALID_DXF_LINEWEIGHT_VALUESVALID_DXF_LINEWEIGHTSLINEWEIGHT_BYLAYERTRANSPARENCY_BYBLOCK)ascii_tags_loaderbinary_tags_loader)is_embedded_object_markerDXFTagNONE_TAG)
toencoding)NULLVECVec3ezdxfc                  D    \ rS rSrSrSrS
S jrSS jrSS jrSS jr	Sr
g	)DXFInfo$   zDXF Info Record

.. attribute:: release

.. attribute:: version

.. attribute:: encoding

.. attribute:: handseed

.. attribute:: insert_units

.. attribute:: insert_base

   c                `    SU l         SU l        SU l        SU l        SU l        [
        U l        g )NR12AC1009cp12520r   )releaseversionencodinghandseedinsert_unitsr    insert_baseselfs    G/var/www/html/env/lib/python3.13/site-packages/ezdxf/lldxf/validator.py__init__DXFInfo.__init__7   s.    !$% !"!(    c                @    SR                  U R                  5       5      $ )N
)joindata_stringsr2   s    r4   __str__DXFInfo.__str__?   s    yy**,--r7   c           
         SSK Jn  SU R                   3SU R                   3SU R                   3SU R
                   3SU R                   SUR                  U R                  5       S	3S
U R                   3/$ )Nr   )unitsz	release: z	version: z
encoding: znext handle: 0xzinsert units: z <>zinsert base point: )	r"   r?   r,   r-   r.   r/   r0   decoder1   )r3   r?   s     r4   r;   DXFInfo.data_stringsB   s     ~&~&(dmm_-T../r%,,t?P?P2Q1RRST!$"2"2!34
 	
r7   c                r   US:X  a-  [        U5      U l        [        R                  " US5      U l        gUS:X  a  [        U5      U l        gUS:X  a  [        U5      U l        gUS:X  a   [        U5      U l	        gUS:X  a   [        U5      U l        gg! [         a     gf = f! [        [        4 a     gf = f)	Nz$ACADVERr(   z$DWGCODEPAGEz	$HANDSEEDz	$INSUNITSz$INSBASEr   r
   )strr-   r   getr,   r   r.   r/   intr0   
ValueErrorr!   r1   	TypeError)r3   namevalues      r4   set_header_varDXFInfo.set_header_varN   s    :u:DL'++E59DL" ! ^#&u-DM  [ JDM  [ $'J!  Z#'; 
     
 	*  	s$   )B B# 
B B #B65B6)r.   r/   r1   r0   r,   r-   N)returnNone)rM   rD   )rM   z	list[str])rI   rD   rM   rF   )__name__
__module____qualname____firstlineno____doc__EXPECTED_COUNTr5   r<   r;   rK   __static_attributes__ r7   r4   r$   r$   $   s"      N).

r7   r$   c                *    [        [        U 5      5      $ )zScans the HEADER section of an ASCII DXF document and returns a :class:`DXFInfo`
object, which contains information about the DXF version, text encoding, drawing
units and insertion base point.
)_detect_dxf_infor   )streams    r4   dxf_inforZ   e   s    
 -f566r7   c                *    [        [        U 5      5      $ )zScans the HEADER section of a binary DXF document and returns a :class:`DXFInfo`
object, which contains information about the DXF version, text encoding, drawing
units and insertion base point.
)rX   r   )datas    r4   binary_dxf_infor]   m   s    
 .t455r7   c                t   [        5       n[        U 5      S:w  a  U$ [        U 5      S:w  a  U$ [        n[        nSnUS:w  a  U[        L a  [        U 5      nOUn[        nUR                  [        :w  a  M9  [        UR                  5      n[        U 5      u  pgUS:X  aj  [        U5      n[        [        U 5      R                  5      n	Sn
[        U 5      nUR                  S:X  a  [        UR                  5      n
OUn[        XU
5      nXAR                  XW5      -  nU[         R                  :  a   U$ US:w  a  M  U$ )Nr   SECTION)   HEADERr   )r   ENDSEC
              )r$   nextr   coder   rD   rJ   floatr!   rK   rT   )taggerinfotagundo_tagfoundvar_namerh   rJ   xyzs              r4   rX   rX   u   s   9DF|~%F|}$ 
CHE

xv,CCH88((syy>6l2:eAd6l(()AAv,Cxx2~#))$qME$$X55G***K/ 
. Kr7   c              #     #    SnU  HX  nUu  p4U(       aD  U[         :w  a  [        SU SU S35      eUR                  S5      (       d  [        SU S35      eSnOSnUv   MZ     g	7f)
a7  Checks the tag structure of the content of the header section.

Do not feed (0, 'SECTION') (2, 'HEADER') and (0, 'ENDSEC') tags!

Args:
    tagger: generator/iterator of low level tags or compiled tags

Raises:
    DXFStructureError() -> invalid group codes
    DXFValueError() -> invalid header variable name

TzInvalid header variable tag z, ).$zInvalid header variable name "z", missing leading "$".FN)r   r   
startswithr   )rj   variable_name_tagrl   rh   rJ   s        r4   header_validatorrx      s      (('24&5'D  ##C((#4UG;RS  !& $	 s   A"A$c           
   #  .  #    [        U [        5      (       d   e[        [        U S   R                  5      nUS:H  nSnSnSnSnSnSnU  GH  n	U	R
                  S:X  a   US:X  a  [        [        U	R                  5      n[        U	5      (       a  SnU(       a  U	v   MS  U(       a  U(       d  U	R
                  S:  a/  [        [        U S   R                  5      n[        S	U S
U S35      eU	R
                  S:X  a_  [        [        U	R                  5      n
U
S:X  a  US-  nO!U
S:X  a  US-  nO[        SU
 SU S
U S35      eUS:  a  [        S	U S
U S35      eU	R
                  [        :X  a  U(       d  [        [        U	R                  5      n
U
R                  S5      (       a$  U(       a  [        SU S
U S35      eSnU
SS S-   nO>U
S:X  d  X:X  a  U(       d  [        SU S
U S35      eSnSnO[        SU
 SU S
U S35      eU	R
                  [        :X  a   USL a  SnU(       a  [        SU S
U S35      eU	v   GM     U(       a  [        SU S
U S35      eU(       a1  US:  a  [        S	U S
U S35      eUS:  a  [        S	U S
U S35      egg7f)a_  Checks for valid DXF entity tag structure.

- APP DATA can not be nested and every opening tag (102, '{...') needs a
  closing tag (102, '}')
- extended group codes (>=1000) allowed before XDATA section
- XDATA section starts with (1001, APPID) and is always at the end of an
  entity
- XDATA section: only group code >= 1000 is allowed
- XDATA control strings (1002, '{') and (1002, '}') have to be balanced
- embedded objects may follow XDATA

XRECORD entities will not be checked.

Args:
    tags: list of DXFTag()

Raises:
    DXFAppDataError: for invalid APP DATA
    DXFXDataError: for invalid XDATA

r   XRECORDz???F}r&   Ti  z"Invalid XDATA structure in entity z(#z2), only group code >=1000 allowed in XDATA sectioni  {r
   z%Invalid XDATA control string (1002, "z
") entity rt   z1), unbalanced list markers, missing  (1002, "{").z%Invalid APP DATA structure in entity z), APP DATA can not be nested.Nz,), found (102, "}") tag without opening tag.z&Invalid APP DATA structure tag (102, "z") in entity z"), missing closing tag (102, "}").z1), unbalanced list markers, missing  (1002, "}").)
isinstancelistr   rD   rJ   rh   r   r   r   rv   r   r   )tagsdxftype
is_xrecordhandleapp_dataxdataxdata_list_levelapp_data_closing_tagembedded_objectrl   rJ   s              r4   entity_structure_validatorr      sE    , dD!!!!3Q&GI%JFHE #!O88q=Vu_#syy)F$S))"OIxx$sDGMM2#8	F8 LF G  xx4S#)),C<$)$c\$)$'?w G#9Bvhb2  $a''<WIRx PJ K 
 88&zcii(E$$)?yVH$BD   ',QRy3$#!>)?yVH$QS  !'*$%<UG D%Yb4  88|#E%;G9 CE  	M P 3G9Bvh G/ 0
 	
 a4WIRx HB C  !4WIRx HB C  " s   JJc                x    [         R                  " U SS9 n[        U5      sSSS5        $ ! , (       d  f       g= f)z4Returns ``True`` if `filename` is an ASCII DXF file.ignoreerrorsN)ioopenis_dxf_stream)filenamefps     r4   is_dxf_filer   4  s&    	(	+rR  
,	+	+s   +
9c                    [        U S5       nUR                  S5      nSSS5        US:H  $ ! , (       d  f       WS:H  $ = f)z4Returns ``True`` if `filename` is a binary DXF file.rb   Ns   AutoCAD Binary DXF
 )r   read)r   r   sentinels      r4   is_binary_dxf_filer   :  sA    	h	772; 
888 
	888s   ,
>c                    [        U 5      SL$ )z-Returns ``True`` if `filename` is a DWG file.N)dwg_version)r   s    r4   is_dwg_filer   A  s    x ,,r7   c                    [        [        U 5      S5       n UR                  S5      R                  SS9nU[
        ;  a
   SSS5        gUsSSS5        $ ! [         a     SSS5        gf = f! , (       d  f       g= f)z8Returns DWG version of `filename` as string or ``None``.r      r   r   N)r   rD   r   rA   IOErrorr   )r   r   r-   s      r4   r   r   F  sy    	c(mT	"b	ggaj''x'8G ,& 
#	"  
#	"  		 
#	"	 
#	"s3   A-AA-
A-
A*A-)A**A--
A;c                     [        U 5      n U H  nUS:X  a    gUR                  S:  d  M    g   g! [         a     gf = f! [         a     gf = f)NFr_   Ti  )r   r   rh   r   )rY   readerrl   s      r4   r   r   R  sj    "6*Cn$ xx#~      s,   2 A A A A 
??
AAc                    SU ;   a$  U R                  SS5      n U R                  SS5      n [        U 5      n[        [        R                  " U5      5      (       + $ )N\z\U+ z\M+)replacesetboolr   intersection)rI   charss     r4   is_valid_table_namer   s  sN    t|||FB' ||FB'IE1>>uEFFFr7   c                z    [        U [        5      (       d  [        S[        U 5       35      eU R	                  5       $ )zMake unified table entry key.zname has to be a string, got )r}   rD   r   typelowerrI   s    r4   make_table_keyr     s2    dC  :4:,GHH::<r7   c                :    [        U 5      (       a  g[        U 5      $ )NT)is_adsk_special_layerr   r   s    r4   is_valid_layer_namer     s    T""t$$r7   c                j    U R                  S5      (       a  [        U 5      S:  a  [        U SS  5      $ g)N*r
   F)rv   lenr   r   s    r4   r   r     s1    sD	A #48,,r7   c                `    U R                  S5      (       a  [        U SS  5      $ [        U 5      $ )Nr   r
   )rv   r   r   s    r4   is_valid_block_namer     s-    s"48,,"4((r7   c                j    U R                  S5      (       a  U R                  5       S:H  $ [        U 5      $ )Nr   z*ACTIVE)rv   upperr   r   s    r4   is_valid_vport_namer     s-    szz|y(("4((r7   c                    U [         ;   $ N)r   )
lineweights    r4   is_valid_lineweightr     s    444r7   c                    U [         ;   a  U $ U S:  a  [        $ U S:  a  g[        R                  " [        U 5      n[        U   $ )N   )r   r   bisectr   )r   indexs     r4   fix_lineweightr     sE    00B!!CMM/<E ''r7   c                ,    SU s=:*  =(       a    S:*  $ s  $ )Nr   i  rV   )acis    r4   is_valid_aci_colorr     s    ??s??r7   c                    [        U [        5      (       d  g[        U 5      S:w  a  gU  H&  n[        U[        5      (       a  US:  d  US:  d  M&    g   g)NF   r      T)r}   r   r   rF   )rgbrJ   s     r4   is_valid_rgbr     sK    c8$$
3x1}%%%eck  r7   c                   ^ ^ SUU 4S jjnU$ )z3Range of integer values, excluding the `end` value.c                .   > TU s=:*  =(       a    T:  $ s  $ r   rV   rJ   endstarts    r4   
_validator'is_in_integer_range.<locals>._validator  s    ######r7   rJ   rF   rM   r   rV   r   r   r   s   `` r4   is_in_integer_ranger     s    $ $ r7   c                   ^ ^ SUU 4S jjnU$ )Nc                6   > [        [        U T5      TS-
  5      $ )Nr
   minmaxr   s    r4   _fixer&fit_into_integer_range.<locals>._fixer  s    3ue$cAg..r7   rJ   rF   rM   rF   rV   r   r   r   s   `` r4   fit_into_integer_ranger     s    / / Mr7   c                   ^ ^ SUU 4S jjnU$ )Nc                0   > [        [        U T5      T5      $ r   r   r   s    r4   r   $fit_into_float_range.<locals>._fixer  s    3ue$c**r7   )rJ   ri   rM   ri   rV   r   s   `` r4   fit_into_float_ranger     s    + + Mr7   c                   ^ ^ SUU 4S jjnU$ )z1Range of float values, including the `end` value.c                .   > TU s=:*  =(       a    T:*  $ s  $ r   rV   r   s    r4   r   %is_in_float_range.<locals>._validator  s    $$$$$$r7   )rJ   ri   rM   r   rV   r   s   `` r4   is_in_float_ranger     s    % % r7   c                8    [         R                  " U 5      (       + $ r   )r    isclosevs    r4   is_not_null_vectorr     s    q!!!r7   c                8    [         R                  " U SSS9(       + $ )Nre   g-q=)abs_tol)mathr   r   s    r4   is_not_zeror     s    ||AsE222r7   c                    U S:  $ Nr   rV   r   s    r4   is_not_negativer     s    6Mr7   c                    U S:  $ r   rV   r   s    r4   is_positiver     s    q5Lr7   c                   ^  SU 4S jjnU$ )Nc                ,   > [        T) U -  5      (       + $ r   )r   rJ   masks    r4   r   $is_valid_bitmask.<locals>._validator  s    &&&r7   r   rV   )r   r   s   ` r4   is_valid_bitmaskr     s    ' r7   c                   ^  SU 4S jjnU$ )Nc                   > TU -  $ r   rV   r   s    r4   r   fix_bitmask.<locals>._fixer  s    e|r7   r   rV   )r   r   s   ` r4   fix_bitmaskr     s     Mr7   c                    U S;   $ )N)r   r
   rV   r   s    r4   is_integer_boolr    s    ;r7   c                    U (       a  S$ S$ )Nr
   r   rV   r   s    r4   fix_integer_boolr  	  s    1qr7   c                   ^  SU 4S jjnU$ )Nc                   > U T;   $ r   rV   )r   valuess    r4   r   is_one_of.<locals>._validator  s    F{r7   rM   r   rV   )r  r   s   ` r4   	is_one_ofr	    s     r7   c                    [        [        U 5      R                  SS15      5      nU(       + =(       a    U R                  S5      (       + $ )Nr9   ^)r   r   r   endswith)texthas_line_breakss     r4   is_valid_one_line_textr    s9    3t9114,?@O9t}}S'9#99r7   c                d    U R                  SS5      R                  SS5      R                  S5      $ )Nr9   r   r  r  )r   rstrip)r  s    r4   fix_one_line_textr    s+    <<b!))$3::3??r7   c                    [        U 5      $ r   )r  rl   s    r4   is_valid_attrib_tagr    s    !#&&r7   c                    [        U 5      $ r   )r  r  s    r4   fix_attrib_tagr  !  s    S!!r7   c                J     [        U S5        g! [        [        4 a     gf = f)N   FT)rF   rG   rH   )r   s    r4   	is_handler  %  s.    FB  	" s    ""c                j    [        U [        5      (       a  U [        :H  =(       d    [        U S-  5      $ g)Ni   F)r}   rF   r   r   )rJ   s    r4   is_transparencyr  -  s-    %,,HUZ5G0HHr7   )rY   r   rM   r$   )r\   bytesrM   r$   )rj   zIterator[DXFTag]rM   r$   )rj   Iterable[DXFTag]rM   r  )r   zlist[DXFTag]rM   r  )r   rD   rM   r   )r   rD   rM   zOptional[str])rY   r   rM   r   )rI   rD   rM   r   )rI   rD   rM   rD   )r   rF   rM   r   )r   rF   rM   rF   )r   rF   rM   r   r  )r   rF   r   rF   )r   ri   r   ri   )r   ri   rM   r   )r   rF   )rM   rF   )r  r   )r  rD   rM   r   )r  rD   rM   rD   )rl   rD   rM   r   )rl   rD   rM   rD   )U
__future__r   typingr   r   r   r   r   r	   loggingr   r   r   constr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rj   r   r   typesr   r   r   ezdxf.tools.codepager   
ezdxf.mathr    r!   	getLoggerloggerr$   rZ   r]   rX   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   is_greater_or_equal_zeror   is_greater_zeror   r   r  r  r	  r  r  r  r  r  r  rV   r7   r4   <module>r+     s9   # G G  	      $ : > > + $			7	#> >B76$N>vr!9-
	B	G%))5("3 +  :
@'"r7   