
    OgyA                    L   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	jR                  d
      Z* G d d      Z+d4dZ,d5dZ-d6dZ.d7dZ/d8dZ0d9dZ1d9dZ2d9dZ3d:dZ4d;dZ5d<dZ6d=dZ7d<dZ8d<dZ9d<dZ:d<dZ;d>dZ<d?dZ=d@dZ>dAd Z?dBd!Z@dBd"ZAdCd#ZBdCd$ZCdAd%ZDdDd&ZEdAd'ZFeFZGdAd(ZHeHZIdEd)ZJdEd*ZKdAd+ZLdFd,ZMdGd-ZNdHd.ZOdId/ZPdJd0ZQdKd1ZRdAd2ZSdAd3ZTy)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                  4    e Zd ZdZdZddZd	dZd
dZddZy)DXFInfozDXF Info Record

    .. attribute:: release

    .. attribute:: version

    .. attribute:: encoding

    .. attribute:: handseed

    .. attribute:: insert_units

    .. attribute:: insert_base

       c                `    d| _         d| _        d| _        d| _        d| _        t
        | _        y )NR12AC1009cp12520r   )releaseversionencodinghandseedinsert_unitsr    insert_baseselfs    Z/var/www/html/public_html/myphp/venv/lib/python3.12/site-packages/ezdxf/lldxf/validator.py__init__zDXFInfo.__init__7   s.    !$% !"!(    c                @    dj                  | j                               S )N
)joindata_stringsr1   s    r3   __str__zDXFInfo.__str__?   s    yy**,--r5   c           
         ddl m} d| j                   d| j                   d| j                   d| j
                   d| j                   d|j                  | 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-   r.   r/   decoder0   )r2   r<   s     r3   r9   zDXFInfo.data_stringsB   s     ~&~&(dmm_-T../r%,,t?P?P2Q1RRST!$"2"2!34
 	
r5   c                b   |dk(  r,t        |      | _        t        j                  |d      | _        y|dk(  rt        |      | _        y|dk(  rt        |      | _        y|dk(  r	 t        |      | _	        y|dk(  r	 t        |      | _        yy# t        $ r Y yw xY w# t        t        f$ r Y yw xY w)	Nz$ACADVERr'   z$DWGCODEPAGEz	$HANDSEEDz	$INSUNITSz$INSBASEr   r
   )strr,   r   getr+   r   r-   r.   intr/   
ValueErrorr!   r0   	TypeError)r2   namevalues      r3   set_header_varzDXFInfo.set_header_varN   s    :u:DL'++E59DL" ! ^#&u-DM  [ JDM  [ $'J!  Z#'; 
     
 	*  	s$   $B ;B 	BBB.-B.N)returnNone)rH   r@   )rH   z	list[str])rE   r@   rH   rB   )	__name__
__module____qualname____doc__EXPECTED_COUNTr4   r:   r9   rG    r5   r3   r$   r$   $   s"      N).

r5   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   )streams    r3   dxf_inforS   e   s    
 -f566r5   c                *    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.
    )rQ   r   )datas    r3   binary_dxf_inforV   m   s    
 .t455r5   c                f   t               }t        |       dk7  r|S t        |       dk7  r|S t        }t        }d}|dk7  r|t        u rt        |       }n|}t        }|j                  t        k7  r5t        |j                        }t        |       \  }}|dk(  rjt        |      }t        t        |       j                        }	d}
t        |       }|j                  dk(  rt        |j                        }
n|}t        ||	|
      }||j                  ||      z  }|t         j                  k\  r	 |S |dk7  r|S )Nr   SECTION)   HEADERr   )r   ENDSEC
              )r$   nextr   coder   r@   rF   floatr!   rG   rN   )taggerinfotagundo_tagfoundvar_namera   rF   xyzs              r3   rQ   rQ   u   s$   9DF|~%F|}$ 
CHE

xv,CCH88((syy>6le2:eAd6l(()AAv,Cxx2~#))$AqME$$Xu55G***K/ 
. Kr5   c              #     K   d}| D ]M  }|\  }}|r>|t         k7  rt        d| d| d      |j                  d      st        d| d      d}nd}| O y	w)
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   )rc   variable_name_tagre   ra   rF   s        r3   header_validatorrq      s       e(('24&5'D  ##C(#4UG;RS  !& $	s   AA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|	 F|r|s|	j
                  dk  r/t        t        | d   j                        }t        d	| d
| d      |	j
                  dk(  r\t        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                        }
|
j                  d      r|rt        d| d
| d      d}|
dd dz   }n8|
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      |	  |rt        d| d
| d      |r/|dk  rt        d	| d
| d      |dkD  rt        d	| d
| d      yyw)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 rm   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   r@   rF   ra   r   r   r   ro   r   r   )tagsdxftype
is_xrecordhandleapp_dataxdataxdata_list_levelapp_data_closing_tagembedded_objectre   rF   s              r3   entity_structure_validatorr      sG    , dD!!!3Q&GI%JFHE #!O F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FP 3G9Bvh G/ 0
 	
 a4WIRx HB C  !4WIRx HB C  " s   II	c                r    t        j                  | d      5 }t        |      cddd       S # 1 sw Y   yxY w)z4Returns ``True`` if `filename` is an ASCII DXF file.ignoreerrorsN)ioopenis_dxf_stream)filenamefps     r3   is_dxf_filer   4  s/    	(	+ !rR ! ! !s   -6c                x    t        | d      5 }|j                  d      }ddd       |dk(  S # 1 sw Y   dk(  S xY w)z4Returns ``True`` if `filename` is a binary DXF file.rb   Ns   AutoCAD Binary DXF
 )r   read)r   r   sentinels      r3   is_binary_dxf_filer   :  sC    	h	 772;888888s   ,9c                    t        |       duS )z-Returns ``True`` if `filename` is a DWG file.N)dwg_version)r   s    r3   is_dwg_filer   A  s    x ,,r5   c                    t        t        |       d      5 }	 |j                  d      j                  d      }|t
        vr
	 ddd       y|cddd       S # t        $ r Y ddd       yw xY w# 1 sw Y   yxY w)z8Returns DWG version of `filename` as string or ``None``.r      r   r   N)r   r@   r   r>   IOErrorr   )r   r   r,   s      r3   r   r   F  s    	c(mT	" b	ggaj''x'8G ,&     		 	 s3   A-!A	A-A-	A*A-)A**A--A6c                    	 t        |       }	 |D ]  }|dk(  r y|j                  dkD  s y 	 y# t        $ r Y yw xY w# t        $ r Y yw xY w)NFrX   Ti  )r   r   ra   r   )rR   readerre   s      r3   r   r   R  so    "6* 	Cn$ xx#~	     s'   / > > > > 	;;	A
	A
c                    d| v r$| j                  dd      } | j                  dd      } t        |       }t        t        j                  |             S )N\z\U+ z\M+)replacesetboolr   intersection)rE   charss     r3   is_valid_table_namer   s  sN    t|||FB' ||FB'IE1>>uEFFFr5   c                p    t        | t              st        dt        |              | j	                         S )zMake unified table entry key.zname has to be a string, got )rv   r@   r   typelowerrE   s    r3   make_table_keyr     s/    dC :4:,GHH::<r5   c                0    t        |       ryt        |       S )NT)is_adsk_special_layerr   r   s    r3   is_valid_layer_namer     s    T"t$$r5   c                ^    | j                  d      rt        |       dkD  rt        | dd        S y)N*r
   F)ro   lenr   r   s    r3   r   r     s.    sD	A #48,,r5   c                V    | j                  d      rt        | dd        S t        |       S )Nr   r
   )ro   r   r   s    r3   is_valid_block_namer     s*    s"48,,"4((r5   c                `    | j                  d      r| j                         dk(  S t        |       S )Nr   z*ACTIVE)ro   upperr   r   s    r3   is_valid_vport_namer     s*    szz|y(("4((r5   c                    | t         v S N)r   )
lineweights    r3   is_valid_lineweightr     s    444r5   c                ~    | t         v r| S | dk  rt        S | dkD  ryt        j                  t        |       }t        |   S )N   )r   r   bisectr   )r   indexs     r3   fix_lineweightr     sE    00B!!CMM/<E ''r5   c                "    d| cxk  xr dk  S c S )Nr   i  rO   )acis    r3   is_valid_aci_colorr     s    ?s??r5   c                    t        | t              syt        |       dk7  ry| D ]  }t        |t              r|dk  s|dkD  s y y)NF   r      T)rv   r   r   rB   )rgbrF   s     r3   is_valid_rgbr     sJ    c8$
3x1} %%eck r5   c                     d fd}|S )z3Range of integer values, excluding the `end` value.c                $    | cxk  xr k  S c S r   rO   rF   endstarts    r3   
_validatorz'is_in_integer_range.<locals>._validator  s    #####r5   rF   rB   rH   r   rO   r   r   r   s   `` r3   is_in_integer_ranger     s    $ r5   c                     d fd}|S )Nc                6    t        t        |       dz
        S )Nr
   minmaxr   s    r3   _fixerz&fit_into_integer_range.<locals>._fixer  s    3ue$cAg..r5   rF   rB   rH   rB   rO   r   r   r   s   `` r3   fit_into_integer_ranger     s    / Mr5   c                     d fd}|S )Nc                0    t        t        |             S r   r   r   s    r3   r   z$fit_into_float_range.<locals>._fixer  s    3ue$c**r5   )rF   rb   rH   rb   rO   r   s   `` r3   fit_into_float_ranger     s    + Mr5   c                     d fd}|S )z1Range of float values, including the `end` value.c                $    | cxk  xr k  S c S r   rO   r   s    r3   r   z%is_in_float_range.<locals>._validator  s    $$$$$r5   )rF   rb   rH   r   rO   r   s   `` r3   is_in_float_ranger     s    % r5   c                .    t        j                  |        S r   )r    isclosevs    r3   is_not_null_vectorr     s    q!!!r5   c                4    t        j                  | dd       S )Nr^   g-q=)abs_tol)mathr   r   s    r3   is_not_zeror     s    ||AsE222r5   c                    | dk\  S Nr   rO   r   s    r3   is_not_negativer     s    6Mr5   c                    | dkD  S r   rO   r   s    r3   is_positiver     s    q5Lr5   c                     d fd}|S )Nc                $    t         | z         S r   )r   rF   masks    r3   r   z$is_valid_bitmask.<locals>._validator  s    &&&r5   r   rO   )r   r   s   ` r3   is_valid_bitmaskr     s    ' r5   c                     d fd}|S )Nc                    | z  S r   rO   r   s    r3   r   zfix_bitmask.<locals>._fixer  s    e|r5   r   rO   )r   r   s   ` r3   fix_bitmaskr     s     Mr5   c                
    | dv S )N)r   r
   rO   r   s    r3   is_integer_boolr     s    ;r5   c                    | rdS dS )Nr
   r   rO   r   s    r3   fix_integer_boolr   	  s    1qr5   c                     d fd}|S )Nc                    | v S r   rO   )r   valuess    r3   r   zis_one_of.<locals>._validator  s    F{r5   rH   r   rO   )r   r   s   ` r3   	is_one_ofr     s     r5   c                z    t        t        |       j                  ddh            }| xr | j                  d       S )Nr7   ^)r   r   r   endswith)texthas_line_breakss     r3   is_valid_one_line_textr    s9    3t9114,?@O9t}}S'9#99r5   c                d    | j                  dd      j                  dd      j                  d      S )Nr7   r   r   r   )r   rstrip)r   s    r3   fix_one_line_textr    s+    <<b!))$3::3??r5   c                    t        |       S r   )r  re   s    r3   is_valid_attrib_tagr    s    !#&&r5   c                    t        |       S r   )r  r  s    r3   fix_attrib_tagr
  !  s    S!!r5   c                H    	 t        | d       y# t        t        f$ r Y yw xY w)N   FT)rB   rC   rD   )r{   s    r3   	is_handler  %  s.    FB  	" s    !!c                V    t        | t              r| t        k(  xs t        | dz        S y)Ni   F)rv   rB   r   r   )rF   s    r3   is_transparencyr  -  s*    %,,HUZ5G0HHr5   )rR   r   rH   r$   )rU   bytesrH   r$   )rc   zIterator[DXFTag]rH   r$   )rc   Iterable[DXFTag]rH   r  )rx   zlist[DXFTag]rH   r  )r   r@   rH   r   )r   r@   rH   zOptional[str])rR   r   rH   r   )rE   r@   rH   r   )rE   r@   rH   r@   )r   rB   rH   r   )r   rB   rH   rB   )r   rB   rH   r   r   )r   rB   r   rB   )r   rb   r   rb   )r   rb   rH   r   )r   rB   )rH   rB   )r   r   )r   r@   rH   r   )r   r@   rH   r@   )re   r@   rH   r   )re   r@   rH   r@   )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   rc   r   r   typesr   r   r   ezdxf.tools.codepager   
ezdxf.mathr    r!   	getLoggerloggerr$   rS   rV   rQ   rq   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  rO   r5   r3   <module>r     s;   # G G  	      $ : > > + $			7	#> >B76$N>vr!9-
	B	G%))5("3 +  :
@'"r5   