
    'jyA                    P   d dl mZ d dl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mZmZmZmZmZmZmZmZmZ ddlmZmZ ddl m!Z!m"Z"m#Z# d dl$m%Z% d d	l&m'Z'm(Z(  e	j)        d
          Z* G d d          Z+dOdZ,dPdZ-dQdZ.dRdZ/dSdZ0dTdZ1dTd Z2dTd!Z3dUd#Z4dVd$Z5dWd&Z6dXd'Z7dWd(Z8dWd)Z9dWd*Z:dWd+Z;dYd.Z<dZd/Z=d[d1Z>d\d2Z?d]d5Z@d]d6ZAd^d8ZBd^d9ZCd\d:ZDd_d<ZEd\d=ZFeFZGd\d>ZHeHZId`d@ZJd`dAZKd\dBZLdadCZMdbdFZNdcdHZOdddIZPdedKZQdfdLZRd\dMZSd\dNZTdS )g    )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                  6    e Zd ZdZdZddZddZdd	ZddZdS )DXFInfozDXF Info Record

    .. attribute:: release

    .. attribute:: version

    .. attribute:: encoding

    .. attribute:: handseed

    .. attribute:: insert_units

    .. attribute:: insert_base

       returnNonec                d    d| _         d| _        d| _        d| _        d| _        t
          | _        d S )NR12AC1009cp12520r   )releaseversionencodinghandseedinsert_unitsr    insert_baseselfs    O/DATA/AppData/hermes/venv/lib/python3.11/site-packages/ezdxf/lldxf/validator.py__init__zDXFInfo.__init__7   s4    !$% !"!(    strc                P    d                     |                                           S )N
)joindata_stringsr3   s    r5   __str__zDXFInfo.__str__?   s     yy**,,---r7   	list[str]c           
         ddl m} d| j         d| j         d| j         d| j         d| j         d|                    | j                   d	d
| j         gS )Nr   )unitsz	release: z	version: z
encoding: znext handle: 0xzinsert units: z <>zinsert base point: )	r"   r@   r-   r.   r/   r0   r1   decoder2   )r4   r@   s     r5   r<   zDXFInfo.data_stringsB   s     '&&&&&(((-dm--TT.TT%,,t?P2Q2QTTT4$"244
 	
r7   nameintc                   |dk    r/t          |          | _        t          j        |d          | _        n|dk    rt          |          | _        n||dk    rt          |          | _        na|dk    r&	 t          |          | _	        nE# t          $ r Y n9w xY w|dk    r-	 t          |          | _        n# t          t          f$ r Y nw xY wdS dS )	Nz$ACADVERr)   z$DWGCODEPAGEz	$HANDSEEDz	$INSUNITSz$INSBASEr   r
   )r8   r.   r   getr-   r   r/   r0   rD   r1   
ValueErrorr!   r2   	TypeError)r4   rC   values      r5   set_header_varzDXFInfo.set_header_varN   s    :u::DL'+E599DLL^##&u--DMM[  JJDMM[  $'JJ!!   Z#';;  	*    1qs$   3B 
BBB4 4CCN)r&   r'   )r&   r8   )r&   r>   )rC   r8   r&   rD   )	__name__
__module____qualname____doc__EXPECTED_COUNTr6   r=   r<   rJ    r7   r5   r$   r$   $   su           N) ) ) ). . . .

 

 

 

     r7   r$   streamr   r&   c                :    t          t          |                     S )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   )rQ   s    r5   dxf_inforT   e   s    
 -f55666r7   databytesc                :    t          t          |                     S )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.
    )rS   r   )rU   s    r5   binary_dxf_inforX   m   s    
 .t44555r7   taggerIterator[DXFTag]c                   t                      }t          |           dk    r|S t          |           dk    r|S t          }t          }d}|dk    r|t          u rt          |           }n	|}t          }|j        t          k    r:t          |j                  }t          |           \  }}|dk    rtt          |          }t          t          |           j                  }	d}
t          |           }|j        dk    rt          |j                  }
n|}t          ||	|
          }||	                    ||          z  }|t           j
        k    rn|dk    |S )Nr   SECTION)   HEADERr   )r   ENDSEC
              )r$   nextr   coder   r8   rI   floatr!   rJ   rO   )rY   infotagundo_tagfoundvar_namere   rI   xyzs              r5   rS   rS   u   sK   99DF||~%%F||}$$ 
CHE


xv,,CCCH8(((sy>>6lle2::eAd6ll())AAv,,Cx2~~#)$$AqMME$$Xu555G***- 

. Kr7   Iterable[DXFTag]c              #     K   d}| D ][}|\  }}|rL|t           k    rt          d| d| d          |                    d          st          d| d          d}nd}|V  \d	S )
aS  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   )rY   variable_name_tagrh   re   rI   s        r5   header_validatorru      s         e 	%((('D4DD5DDD   ##C(( #SUSSS   !& $				 r7   tagslist[DXFTag]c           
   #     K   t          | t                    sJ t          t          | d         j                  }|dk    }d}d}d}d}d}d}| D ]}	|	j        dk    r |dk    rt          t          |	j                  }t          |	          rd}|r|	V  F|r|s|	j        dk     r6t          t          | d         j                  }t          d	| d
| d          |	j        dk    rgt          t          |	j                  }
|
dk    r|dz  }n%|
dk    r|dz  }nt          d|
 d| d
| d          |dk     rt          d	| d
| d          |	j        t          k    r|st          t          |	j                  }
|
	                    d          r(|rt          d| d
| d          d}|
dd         dz   }nB|
dk    s|
|k    r|st          d| d
| d          d}d}nt          d|
 d| d
| d          |	j        t          k    r|du rd}|rt          d| d
| d          |	V  |rt          d| d
| d          |r8|dk     rt          d	| d
| d          |dk    rt          d	| d
| d          dS dS )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 rq   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   r8   rI   re   r   r   r   rs   r   r   )rv   dxftype
is_xrecordhandleapp_dataxdataxdata_list_levelapp_data_closing_tagembedded_objectrh   rI   s              r5   entity_structure_validatorr      s     , dD!!!!!3Q&&GI%JFHE #!O F F8q==Vu__#sy))F$S)) 	#"O 	III 	 	x$sDGM22#G G GF G G G   x4S#),,C<<$)$$c\\$)$$'2 2 2#2 2'-2 2 2   $a'''KW K K K K K  
 8&&z&ci((E$$  )D D D#D D D    ',QRRy3$$#*>!>!> )S S S#S S S   !'*$$%4U 4 4%4 4)/4 4 4   8|##E %EG E EE E E   				 
0G 0 0v 0 0 0
 
 	
  
aCW C C C C C   !!CW C C C C C  
 
 "!r7   filenamer8   boolc                    t          j        | d          5 }t          |          cddd           S # 1 swxY w Y   dS )z4Returns ``True`` if `filename` is an ASCII DXF file.ignoreerrorsN)ioopenis_dxf_stream)r   fps     r5   is_dxf_filer   4  s    	(	+	+	+ !rR  ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !s   377c                    t          | d          5 }|                    d          }ddd           n# 1 swxY w Y   |dk    S )z4Returns ``True`` if `filename` is a binary DXF file.rb   Ns   AutoCAD Binary DXF
 )r   read)r   r   sentinels      r5   is_binary_dxf_filer   :  s    	h		 772;;              888s   377c                $    t          |           duS )z-Returns ``True`` if `filename` is a DWG file.N)dwg_version)r   s    r5   is_dwg_filer   A  s    x  ,,r7   Optional[str]c                0   t          t          |           d          5 }	 |                    d                              d          }n# t          $ r Y ddd           dS w xY w|t
          vr	 ddd           dS |cddd           S # 1 swxY w Y   dS )z8Returns DWG version of `filename` as string or ``None``.r      r   r   N)r   r8   r   rB   IOErrorr   )r   r   r.   s      r5   r   r   F  s!   	c(mmT	"	" b	ggajj''x'88GG 	 	 		       	,&&                         s:   B)A
	B

A#B"A##B=BBBc                    	 t          |           }n# t          $ r Y dS w xY w	 |D ]}|dk    r dS |j        dk    r dS n# t          $ r Y nw xY wdS )NFr\   Ti  )r   r   re   r   )rQ   readerrh   s      r5   r   r   R  s    "6**   uu 	 	Cn$$tt x#~~uu 	    5s'    
  A A A 
AArC   c                    d| v r,|                      dd          } |                      dd          } t          |           }t          t          j        |                     S )N\z\U+ z\M+)replacesetr   r   intersection)rC   charss     r5   is_valid_table_namer   s  s[    t||||FB'' ||FB''IIE1>uEEFFFFr7   c                    t          | t                    st          dt          |                      |                                 S )zMake unified table entry key.zname has to be a string, got )r|   r8   r   typelowerrC   s    r5   make_table_keyr     s@    dC   IG4::GGHHH::<<r7   c                B    t          |           rdS t          |           S )NT)is_adsk_special_layerr   r   s    r5   is_valid_layer_namer     s%    T"" tt$$$r7   c                    |                      d          r*t          |           dk    rt          | dd                    S dS )N*r
   F)rs   lenr   r   s    r5   r   r     sA    s -D		A #48,,,5r7   c                x    |                      d          rt          | dd                    S t          |           S )Nr   r
   )rs   r   r   s    r5   is_valid_block_namer     s:    s )"48,,,"4(((r7   c                z    |                      d          r|                                 dk    S t          |           S )Nr   z*ACTIVE)rs   upperr   r   s    r5   is_valid_vport_namer     s7    s )zz||y(("4(((r7   
lineweightrD   c                    | t           v S N)r   )r   s    r5   is_valid_lineweightr     s    444r7   c                    | t           v r| S | dk     rt          S | dk    rdS t          j        t          |           }t          |         S )N   )r   r   bisectr   )r   indexs     r5   fix_lineweightr     sP    000B!!CsM/<<E ''r7   acic                "    d| cxk    odk    nc S )Nr   i  rP   )r   s    r5   is_valid_aci_colorr     s    ????s????r7   c                    t          | t                    sdS t          |           dk    rdS | D ]&}t          |t                    r|dk     s|dk    r dS 'dS )NF   r      T)r|   r   r   rD   )rgbrI   s     r5   is_valid_rgbr     sp    c8$$ u
3xx1}}u  %%% 	eckk55 7B4r7   startendc                     d fd}|S )z3Range of integer values, excluding the `end` value.rI   rD   r&   r   c                $    | cxk    ok     nc S r   rP   rI   r   r   s    r5   
_validatorz'is_in_integer_range.<locals>._validator  s%    #########r7   rI   rD   r&   r   rP   r   r   r   s   `` r5   is_in_integer_ranger     s/    $ $ $ $ $ $ $ r7   c                     d fd}|S )NrI   rD   r&   c                F    t          t          |           dz
            S )Nr
   minmaxr   s    r5   _fixerz&fit_into_integer_range.<locals>._fixer  s!    3ue$$cAg...r7   rI   rD   r&   rD   rP   r   r   r   s   `` r5   fit_into_integer_ranger     s.    / / / / / / / Mr7   rf   c                     d fd}|S )NrI   rf   r&   c                @    t          t          |                     S r   r   r   s    r5   r   z$fit_into_float_range.<locals>._fixer  s    3ue$$c***r7   )rI   rf   r&   rf   rP   r   s   `` r5   fit_into_float_ranger     s.    + + + + + + + Mr7   c                     d fd}|S )z1Range of float values, including the `end` value.rI   rf   r&   r   c                $    | cxk    ok    nc S r   rP   r   s    r5   r   z%is_in_float_range.<locals>._validator  s%    $$$$$$$$$r7   )rI   rf   r&   r   rP   r   s   `` r5   is_in_float_ranger     s/    % % % % % % % r7   c                ,    t          j        |            S r   )r    isclosevs    r5   is_not_null_vectorr     s    q!!!!r7   r   c                2    t          j        | dd           S )Nrb   g-q=)abs_tol)mathr   r   s    r5   is_not_zeror     s    |AsE22222r7   c                    | dk    S Nr   rP   r   s    r5   is_not_negativer     s    6Mr7   c                    | dk    S r   rP   r   s    r5   is_positiver     s    q5Lr7   maskc                     d fd}|S )NrI   rD   r&   r   c                ,    t           | z             S r   )r   rI   r   s    r5   r   z$is_valid_bitmask.<locals>._validator  s    &&&&r7   r   rP   )r   r   s   ` r5   is_valid_bitmaskr     s)    ' ' ' ' ' ' r7   c                     d fd}|S )NrI   rD   r&   c                    | z  S r   rP   r   s    r5   r   zfix_bitmask.<locals>._fixer  s    e|r7   r   rP   )r   r   s   ` r5   fix_bitmaskr     s(          Mr7   c                
    | dv S )N)r   r
   rP   r   s    r5   is_integer_boolr     s    ;r7   c                    | rdndS )Nr
   r   rP   r   s    r5   fix_integer_boolr   	  s    =11qr7   valuesr   c                     d fd}|S )Nr&   r   c                    | v S r   rP   )r   r   s    r5   r   zis_one_of.<locals>._validator  s    F{r7   r&   r   rP   )r   r   s   ` r5   	is_one_ofr    s)          r7   textc                    t          t          |                               ddh                    }| o|                     d           S )Nr:   ^)r   r   r   endswith)r  has_line_breakss     r5   is_valid_one_line_textr    sD    3t99114,??@@O9t}}S'9'9#99r7   c                |    |                      dd                               dd                              d          S )Nr:   r   r  r  )r   rstrip)r  s    r5   fix_one_line_textr    s4    <<b!!))$33::3???r7   rh   c                     t          |           S r   )r  rh   s    r5   is_valid_attrib_tagr    s    !#&&&r7   c                     t          |           S r   )r  r  s    r5   fix_attrib_tagr  !  s    S!!!r7   c                Z    	 t          | d           n# t          t          f$ r Y dS w xY wdS )N   FT)rD   rG   rH   )r   s    r5   	is_handler  %  sB    FB	"   uu4s    ((c                j    t          | t                    r| t          k    pt          | dz            S dS )Ni   F)r|   rD   r   r   )rI   s    r5   is_transparencyr  -  s8    % I,,HUZ5G0H0HH5r7   )rQ   r   r&   r$   )rU   rV   r&   r$   )rY   rZ   r&   r$   )rY   ro   r&   ro   )rv   rw   r&   ro   )r   r8   r&   r   )r   r8   r&   r   )rQ   r   r&   r   )rC   r8   r&   r   )rC   r8   r&   r8   )r   rD   r&   r   )r   rD   r&   rD   )r   rD   r&   r   r   )r   rD   r   rD   )r   rf   r   rf   )r   rf   r&   r   )r   rD   )r&   rD   )r   r   )r  r8   r&   r   )r  r8   r&   r8   )rh   r8   r&   r   )rh   r8   r&   r8   )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   rY   r   r   typesr   r   r   ezdxf.tools.codepager   
ezdxf.mathr    r!   	getLoggerloggerr$   rT   rX   rS   ru   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  rP   r7   r5   <module>r!     s   # " " " " " G G G G G G G G G G G G G G G G  				                                   $ : 9 9 9 9 9 9 9 > > > > > > > > > > + + + + + + $ $ $ $ $ $ $ $		7	#	#> > > > > > > >B7 7 7 76 6 6 6$ $ $ $N   >v v v vr! ! ! !9 9 9 9- - - -
	 	 	 	   B	G 	G 	G 	G   % % % %   ) ) ) )) ) ) )5 5 5 5( ( ( (                  " " " "3 3 3 3    +                    : : : :
@ @ @ @' ' ' '" " " "        r7   