
    OgF                    .   U d dl m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 d dlmZ d dlZd dlZd dlmZ d dlmZ ddlmZ dd	lmZmZmZ dd
lmZ ddlmZmZmZm Z m!Z! e
rddl"m#Z#  G d de      Z$ee$   Z%de&d<    G d d      Z' G d de      Z( e(ejR                  dd e*             Z+ G d de      Z, G d de      Z- G d de!e(         Z.	 	 	 	 	 	 d'dZ/d(dZ0d)dZ1 G d d e       Z2d*d!Z3d+d"Z4d,d#Z5 e6ejn                  jp                  g      Z9 e6ejt                  jp                  g      Z; e6ejx                  jp                  g      Z= e6ej|                  jp                  g      Z? e6ej                  jp                  g      ZAd$ZB G d% d&      ZCy)-    )annotations)
NamedTupleAnySequenceIteratorUnionIterablecastTYPE_CHECKINGListTupleOptional)	TypeAliasN)datetime)Vec3   )const)ParsingErrorTagsInvalidLinkStructure)
AcisHeader)AbstractEntity
DataLoaderAbstractBuilderDataExporterEntityExporter)
AcisEntityc                  ,    e Zd ZU dZded<   ded<   d Zy)Tokenz;Named tuple to store tagged value tokens of the SAB format.inttagr   valuec                P    d| j                   ddt        | j                         dS )Nz(0x02xz, ))r!   strr"   selfs    S/var/www/html/public_html/myphp/venv/lib/python3.12/site-packages/ezdxf/acis/sab.py__str__zToken.__str__,   s&    TXXcN"S_$5Q77    N)__name__
__module____qualname____doc____annotations__r*    r+   r)   r   r   &   s    E	HJ8r+   r   r   	SabRecordc                      e Zd Z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d
ZddZddZddZddZy)Decoderc                     || _         d| _        y Nr   )dataindexr(   r7   s     r)   __init__zDecoder.__init__4   s    	
r+   c                F    | j                   t        | j                        k  S Nr8   lenr7   r'   s    r)   has_datazDecoder.has_data8   s    zzC		N**r+   c                   t               }t        j                  D ]/  }| j                  j	                  |      st        |      | _         n t        d      | j                         |_	        | j                         |_
        | j                         |_        | j                         |_        | j                         |_        | j                         |_        | j                         }t!        j"                  |t        j$                        |_        | j)                         |_        | j)                         }| j)                         }|S )Nznot a SAB file)r   r   
SIGNATURESr7   
startswithr>   r8   r   read_intversion	n_records
n_entitiesflagsread_str_tag
product_idacis_versionr   strptimeDATE_FMTcreation_dateread_double_tagunits_in_mm)r(   header	signaturedate_s        r)   read_headerzDecoder.read_header<   s    )) 	1Iyy##I. ^
	1
 /00==? MMO}} --/"//1  "'00u~~F!113  "  "r+   c                H    | j                   }| xj                   |z  c_         |S r<   )r8   r(   countposs      r)   forwardzDecoder.forwardR   s    jj

e

r+   c                B    | j                  d      }| j                  |   S )Nr   rY   r7   r(   rX   s     r)   	read_bytezDecoder.read_byteW   s    ll1oyy~r+   c                H    | j                  |      }| j                  |||z    S r<   r[   rV   s      r)   
read_byteszDecoder.read_bytes[   s%    ll5!yysU{++r+   c                p    | j                  d      }t        j                  d| j                  |      d   }|S )N   z<ir   rY   structunpack_fromr7   )r(   rX   valuess      r)   rC   zDecoder.read_int_   s1    ll1o##D$))S9!<r+   c                l    | j                  d      }t        j                  d| j                  |      d   S )N   z<dr   rb   r\   s     r)   
read_floatzDecoder.read_floatd   s-    ll1o!!$		37::r+   c                t    | j                  d|z        }t        j                  d| d| j                  |      S )Nrg   <drb   rV   s      r)   read_floatszDecoder.read_floatsh   s5    ll1u9%!!AeWA,		3??r+   c                D    | j                  |      }|j                         S r<   )r_   decode)r(   lengthtexts      r)   read_strzDecoder.read_strl   s    v&{{}r+   c                    | j                         }|t        j                  k7  rt        d      | j	                  | j                               S )Nzstring tag (7) not found)r]   r   STRr   rq   r(   r!   s     r)   rH   zDecoder.read_str_tagp   s;    nn$((?9::}}T^^-..r+   c                ~    | j                         }|t        j                  k7  rt        d      | j	                         S )Nzdouble tag (6) not found)r]   r   DOUBLEr   rh   rt   s     r)   rN   zDecoder.read_double_tagv   s3    nn$++9::  r+   c           	        fd}g }g d}	 | j                   s0|r#|d   }|j                  t        j                  v r|S t	        d      | j                         }|t        j                  k(  r+|j                  t        || j                                      n|t        j                  k(  r+|j                  t        || j                                      n|t        j                  k(  r:|j                  t        || j                  | j                                            n9|t        j                  k(  r+|j                  t        || j                                      n|t        j                   k(  r|j                  t        |d             n|t        j"                  k(  r|j                  t        |d             n|t        j$                  k(  r:|j                  t        || j                  | j                                            nN|t        j&                  k(  r0j                  | j                  | j                                      n|t        j(                  k(  r`j                  | j                  | j                                      |j                  t        | |                    j+                          n|t        j,                  k(  r,|j                  t        || j/                  d                   nY|t        j0                  k(  r,|j                  t        || j/                  d                   n|t        j2                  k(  r*|j                  t        || j                                      n|t        j4                  k(  r*|j                  t        || j                                      n|t        j6                  k(  r!|dz  }|j                  t        ||             nl|t        j8                  k(  r!|j                  t        ||             |dz  }n8|t        j:                  k(  r|S t	        d|d	d
| d|d   j                   d      P)Nc                 &    dj                         S )N-)join)entity_types   r)   entity_namez(Decoder.read_record.<locals>.entity_name}   s    88K((r+   r   Tzpre-mature end of dataF   r   zunknown SAB tag: 0xxz (z) in entity '')r?   r"   r   DATA_END_MARKERSr   r]   r   INTappendr   rC   rv   rh   rs   rq   POINTER	BOOL_TRUE
BOOL_FALSELITERAL_STRENTITY_TYPE_EXENTITY_TYPEclearLOCATION_VECrl   DIRECTION_VECENUMUNKNOWN_0x17SUBTYPE_STARTSUBTYPE_END
RECORD_END)r(   r|   re   subtype_leveltokenr!   r{   s         @r)   read_recordzDecoder.read_record|   s%   	) !#=="1IE{{e&<&<<%"#;<<.."CdhheC9:#eC):;<eCt~~7G)HIJ$eC9:&eC./'eC/0(((eCt}})GHI+++""4==1A#BC(((""4==1A#BCeC78!!#)))eC)9)9!)<=>***eC)9)9!)<=>		!eC9:)))eC):;<***"eC78(((eC78"'")#a3%}VAY__DUUVW [ r+   c              #  p   K   	 	 | j                   r| j                          ny 	 ## t        $ r Y y w xY wwr<   )r?   r   
IndexErrorr'   s    r)   read_recordszDecoder.read_records   sD     ==**,, -   s   6' 6	3636N)r7   bytesreturnbool)r   r   )rW   r    )r   r    )rW   r    r   r   r   float)rW   r    r   zSequence[float]r   r&   )r   r2   )r   Iterator[SabRecord])r,   r-   r.   r:   propertyr?   rT   rY   r]   r_   rC   rh   rl   rq   rH   rN   r   r   r1   r+   r)   r4   r4   3   sY     + +,
,
;@/!6pr+   r4   c                  4    e Zd ZdZ	 	 	 d	 	 	 	 	 	 	 ddZd Zy)	SabEntityz2Low level representation of an ACIS entity (node).Nc                R    || _         || _        || _        ||ng | _        d | _        y r<   )nameattr_ptridr7   
attributes)r(   r   r   r   r7   s        r)   r:   zSabEntity.__init__   s.     	 '+'7tR	'+r+   c                :    | j                    d| j                   dS )N(r%   )r   r   r'   s    r)   r*   zSabEntity.__str__   s    ))AdggYa((r+   )r   N)r   r&   r   r    r   r    r7   zOptional[SabRecord])r,   r-   r.   r/   r:   r*   r1   r+   r)   r   r      s@    <
 $(,, , 	,
 ",)r+   r   r   c                  ^    e Zd ZddZddZdddZddZddZddZddZ	dd	Z
dd
ZddZy)SabDataLoaderc                .    || _         || _        d| _        y r6   )rD   r7   r8   )r(   r7   rD   s      r)   r:   zSabDataLoader.__init__   s    	
r+   c                F    | j                   t        | j                        k  S r<   r=   r'   s    r)   r?   zSabDataLoader.has_data   s    zzS^++r+   Nc                    | j                   | j                     }|j                  t        j                  k(  r/| xj                  dz  c_        t        t        |j                        S t        d|       )Nr   zexpected int token, got )	r7   r8   r!   r   r   r
   r    r"   r   )r(   skip_satr   s      r)   rC   zSabDataLoader.read_int   sU    		$**%99 JJ!OJU[[))5eW=>>r+   c                    | j                   | j                     }|j                  t        j                  k(  r/| xj                  dz  c_        t        t        |j                        S t        d|       )Nr   zexpected double token, got )	r7   r8   r!   r   rv   r
   r   r"   r   r(   r   s     r)   read_doublezSabDataLoader.read_double   sU    		$**%99#JJ!OJu{{++8@AAr+   c                j    | j                  dd      }|r| j                         S t        j                  S )NFI)	read_boolr   mathinf)r(   finites     r)   read_intervalzSabDataLoader.read_interval   s-    S)##%%xxr+   c                *   | j                   | j                     }|j                  t        j                  t        j
                  fv rA| xj                  dz  c_        t        t        t        t        t        f   |j                        S t        d|       )Nr   zexpected vector token, got )r7   r8   r!   r   r   r   r
   r   r   r"   r   r   s     r)   	read_vec3zSabDataLoader.read_vec3   sn    		$**%99**D,>,>??JJ!OJeUE12EKK@@8@AAr+   c                   | j                   | j                     }|j                  t        j                  k(  r| xj                  dz  c_        y|j                  t        j
                  k(  r| xj                  dz  c_        yt        d|       )Nr   TFzexpected bool token, got )r7   r8   r!   r   r   r   r   )r(   truefalser   s       r)   r   zSabDataLoader.read_bool   sg    		$**%99&JJ!OJYY$//)JJ!OJ6ug>??r+   c                   | j                   | j                     }|j                  t        j                  t        j
                  fv r/| xj                  dz  c_        t        t        |j                        S t        d|       )Nr   zexpected str token, got )
r7   r8   r!   r   rs   r   r
   r&   r"   r   r   s     r)   rq   zSabDataLoader.read_str  s`    		$**%994#3#344JJ!OJU[[))5eW=>>r+   c                    | j                   | j                     }|j                  t        j                  k(  r/| xj                  dz  c_        t        t        |j                        S t        d|       )Nr   zexpected pointer token, got )	r7   r8   r!   r   r   r
   r   r"   r   r   s     r)   read_ptrzSabDataLoader.read_ptr  sU    		$**%99$JJ!OJ449%ABBr+   c                    | j                         j                  d      }|d d D cg c]  }t        |       c}S c c}w )N    )rq   splitr   )r(   re   vs      r)   read_transformzSabDataLoader.read_transform  s8     &&s+"("+.Qa...s   <)r7   r2   rD   r    r   r<   )r   zOptional[int]r   r    r   )r   ztuple[float, float, float])r   r&   r   r&   r   r   r   )r   r   )r   zlist[float])r,   r-   r.   r:   r?   rC   r   r   r   r   rq   r   r   r1   r+   r)   r   r      s8    
,?BB@?C/r+   r   c                  (    e Zd ZdZddZddZddZy)	
SabBuilderz7Low level data structure to manage ACIS SAB data files.c                >    t               | _        g | _        g | _        y r<   )r   rP   bodiesentitiesr'   s    r)   r:   zSabBuilder.__init__  s     l'))+r+   c                8   | j                          t        | j                        t        | j                  j
                        z   | j                  _        d| j                  _        d| j                  _        | j                  j                         g}t               }t        | j                        D ]  }|j                  |        |j                  |j                         |j!                  | j                  j#                                dj%                  |      S )z9Returns the SAB representation of the ACIS file as bytes.r   r   r+   )reorder_recordsr>   r   r    rP   has_asm_headerrF   rE   rG   dumpbEncoderbuild_sab_recordsr   write_recordextendbufferr   sab_end_markerrz   )r(   r7   encoderrecords       r)   dump_sabzSabBuilder.dump_sab$  s    !$T[[!1CKK&&5
 "
 !"![[..01)'6 	)F  (	)GNN#DKK..01xx~r+   c                f    |D cg c]  }|j                   dk(  s| c}| _        || _        yc c}w )z.Reset entities and bodies list. (internal API)bodyN)r   r   r   )r(   r   es      r)   set_entitieszSabBuilder.set_entities4  s,    "*?Qaff.>q?  @s   ..Nr   Noner   r   )r   list[SabEntity]r   r   )r,   r-   r.   r/   r:   r   r   r1   r+   r)   r   r     s    A,
 !r+   r   c                  $    e Zd ZddZddZddZy)SabExporterc                ^    t        |j                  |j                        }t        |_        |S )N)r   )r   typer   NULL_PTRr   r(   entityr   s      r)   make_recordzSabExporter.make_record;  s#    6;;6995$r+   c                .    t        | |j                        S r<   )SabDataExporterr7   )r(   r   s     r)   make_data_exporterzSabExporter.make_data_exporter@  s    tV[[11r+   c                    t               }| j                  |_        |j                  | j                                |j	                         S r<   )r   rP   r   export_recordsr   )r(   builders     r)   r   zSabExporter.dump_sabC  s:    ,T0023!!r+   N)r   r   r   r   )r   r   r   r   r   )r,   r-   r.   r   r   r   r1   r+   r)   r   r   :  s    
2"r+   r   c              #    K   | D ]  }|d   j                   t        j                  k(  sJ d       |d   j                  }|t        j
                  v rt        |        y |d   j                   t        j                  k(  sJ d       |d   j                  }d}|dk\  r<|d   j                   t        j                  k(  sJ d       |d   j                  }|d	d  }n|dd  }t        ||||        y w)
Nr   zinvalid entity-name tagr   zinvalid attribute pointer tagr   i     zinvalid id tagr}   )	r!   r   r   r"   r   r   r   r   r   )recordsrD   r   r   attrid_r7   s          r)   build_entitiesr   J  s       /ay}} 0 00K2KK0ay5)))D/!ay}},M.MM,ayc>!9==DHH,>.>>,)//C!":D!":DdC../s   C.C0c                :    d fd} D ]  } ||j                         |_        d|_         t        |j                        D ]V  \  }}|j                  t
        j                  k(  s$t        |j                   ||j                              |j                  |<   X   S )Nc                $    | dk(  rt         S |    S )Nr   )r   )numr   s    r)   ptrzresolve_pointers.<locals>.ptr`  s    "9O}r+   r   )r   r    r   r   )	r   r   	enumerater7   r!   r   r   r   r"   )r   r   r   r8   r   s   `    r)   resolve_pointersr   _  s    
  H0%fkk2 	HLE5yyDLL(%*599c%++6F%GE"	HH Or+   c                >   t        | t        t        f      st        d      t	               }t        |       }|j                         |_        t        t        |j                         |j                  j                              }|j                  t        |             |S )zReturns the :class:`SabBuilder` for the ACIS :term:`SAB` file content
    given as string or list of strings.

    Raises:
        ParsingError: invalid or unsupported ACIS data structure

    zexpected bytes, bytearray)
isinstancer   	bytearray	TypeErrorr   r4   rT   rP   listr   r   rD   r   r   )r7   r   decoderr   s       r)   	parse_sabr  n  s     dUI./344lGdmG((*GNw++-w~~/E/EFH )(34Nr+   c                  f    e Zd ZddZdddZddZddZddZddZddZ	ddZ
dd	Zdd
ZddZy)r   c                B    |j                   | _         || _        || _        y r<   )rD   exporterr7   )r(   r  r7   s      r)   r:   zSabDataExporter.__init__  s    '' 	r+   c                j    | j                   j                  t        t        j                  |             y)zThere are sometimes additional int values in SAB files which are
        not present in SAT files, maybe reference counters e.g. vertex, coedge.
        N)r7   r   r   r   r   )r(   r"   r   s      r)   	write_intzSabDataExporter.write_int  s!     			txx/0r+   c                j    | j                   j                  t        t        j                  |             y r<   )r7   r   r   r   rv   r(   r"   s     r)   write_doublezSabDataExporter.write_double  s    		t{{E23r+   c                   t        j                  |      r4| j                  j                  t	        t
        j                  d             y | j                  j                  t	        t
        j                  d             | j                  |       y )NFT)	r   isinfr7   r   r   r   r   r   r  r
  s     r)   write_intervalzSabDataExporter.write_interval  sV    ::eIIU4??E:;IIU4>>489e$r+   c                j    | j                   j                  t        t        j                  |             y r<   )r7   r   r   r   r   r
  s     r)   write_loc_vec3zSabDataExporter.write_loc_vec3  s!    		t00%89r+   c                j    | j                   j                  t        t        j                  |             y r<   )r7   r   r   r   r   r
  s     r)   write_dir_vec3zSabDataExporter.write_dir_vec3  s!    		t1159:r+   c                    |r4| j                   j                  t        t        j                  d             y | j                   j                  t        t        j
                  d             y )NTF)r7   r   r   r   r   r   )r(   r"   r   r   s       r)   
write_boolzSabDataExporter.write_bool  s?    IIU4>>489IIU4??E:;r+   c                j    | j                   j                  t        t        j                  |             y r<   )r7   r   r   r   rs   r
  s     r)   	write_strzSabDataExporter.write_str  s    		txx/0r+   c                j    | j                   j                  t        t        j                  |             y r<   )r7   r   r   r   r   r
  s     r)   write_literal_strz!SabDataExporter.write_literal_str  s!    		t//78r+   c                    t         }|j                  s| j                  j                  |      }| j                  j                  t        t        j                  |             y r<   )	r   is_noner  
get_recordr7   r   r   r   r   r   s      r)   	write_ptrzSabDataExporter.write_ptr  s?    ~~]]--f5F		t||V45r+   c                J    | j                  dj                  |      dz          y )Nr   )r  rz   r9   s     r)   write_transformzSabDataExporter.write_transform  s    sxx~34r+   N)r  r   r7   list[Token])F)r"   r    r   r   )r"   r   r   r   )r"   r   r   r   )r"   r   r   r&   r   r&   r   r   )r"   r&   r   r   )r   r   r   r   )r7   z	list[str]r   r   )r,   r-   r.   r:   r  r  r  r  r  r  r  r  r  r  r1   r+   r)   r   r     s9    
14%:;<1965r+   r   c                <   | t         j                  k(  rt        dt         j                         | j                  d      }|d d D cg c]  }t	        t
        j                  |       }}|j                  t	        t
        j                  |d                |S c c}w )Nzinvalid record type: ry   r   )	r   NULL_PTR_NAMEr   r   r   r   r   r   r   )r   partsparttokenss       r)   encode_entity_typer%    s    u""""#E$7$7#89
 	
 JJsOE;@":F4eD''.FFF
MM%((%)45M Gs   !Bc                    | j                   rt        t        j                  d      S 	 t        t        j                  |j	                  |             S # t
        $ r t        dt        |        d      w xY w)Nr   zentity z not in record storage)is_null_ptrr   r   r   r8   
ValueErrorr   r&   )r   r   s     r)   encode_entity_ptrr)    sh    T\\2&&
T\\8>>&#9:: 
"c&k]"89
 	

s   (A "A3c              #  p  K   | D ],  }g }|j                  t        |j                               |j                  t	        |j
                  |              |j                  t        t        j                  |j                               |j                  D ]  }|j                  t        j                  k(  r&|j                  t	        |j                  |              F|j                  t        j                  k(  r%|j                  t        |j                               |j                  |        | / y wr<   )r   r%  r   r   r)  r   r   r   r   r   r7   r!   r   r"   r   )r   r   r   r   s       r)   r   r     s       (56'(9(98DEeDHHfii01[[ 	%EyyDLL(/XFGd...0=>e$	% s   D4D6utf8c                  $    e Zd ZddZddZddZy)r   c                    g | _         y r<   )r   r'   s    r)   r:   zEncoder.__init__  s	    #%r+   c                r    |D ]  }| j                  |        | j                  j                  t               y r<   )write_tokenr   r   END_OF_RECORD)r(   r   r   s      r)   r   zEncoder.write_record  s1     	$EU#	$=)r+   c           	     :   |j                   }|t        j                  t        j                  t        j                  fv rWt        |j                  t              sJ | j                  j                  t        j                  d||j                               y |t        j                  k(  rWt        |j                  t              sJ | j                  j                  t        j                  d||j                               y |t        j                  k(  ryt        |j                  t              sJ |j                  j!                  t"              }| j                  j                  t        j                  d|t%        |            |z          y |t        j&                  k(  ryt        |j                  t              sJ |j                  j!                  t"              }| j                  j                  t        j                  d|t%        |            |z          y |t        j(                  t        j*                  fv ryt        |j                  t              sJ |j                  j!                  t"              }| j                  j                  t        j                  d|t%        |            |z          y |t        j,                  t        j.                  fv ro|j                  }t        |t0              sJ | j                  j                  t        j                  d||j2                  |j4                  |j6                               y |t        j8                  k(  r | j                  j                  t:               y |t        j<                  k(  r | j                  j                  t>               y |t        j@                  k(  r | j                  j                  tB               y |t        jD                  k(  r | j                  j                  tF               y tI        d|       )Nz<Biz<Bd)encodingz<BBz<B3dzinvalid tag in token: )%r!   r   r   r   r   r   r"   r    r   r   rc   packrv   r   rs   r&   encodeSAB_ENCODINGr>   r   r   r   r   r   r   r~   yzr   TRUE_RECORDr   FALSE_RECORDr   SUBTYPE_START_RECORDr   SUBTYPE_END_RECORDr(  )r(   r   r!   r7   r   s        r)   r/  zEncoder.write_token  s   ii488T\\49955ekk3///KKv{{5#u{{CDDKKekk5111KKv{{5#u{{CDDHH_ekk3///;;%%|%<DKKv{{5#s4yADHID$$$ekk3///;;%%|%<DKKv{{5#s4yADHIT%%t':':;;ekk3///;;%%|%<DKKv{{5#s4yADHIT&&(:(:;;Aa&&&KKv{{63QSS!##FGDNN"KK{+DOO#KK|,D&&&KK34D$$$KK125eW=>>r+   Nr   )r   r2   r   r   )r   r   r   r   )r,   r-   r.   r:   r   r/  r1   r+   r)   r   r     s    &*
!?r+   r   )r   zIterable[SabRecord]rD   r    r   zIterator[SabEntity])r   r   r   r   )r7   zUnion[bytes, bytearray]r   r   )r   r&   r   r  )r   r   r   r   r   r   )r   r   r   r   )D
__future__r   typingr   r   r   r   r   r	   r
   r   r   r   r   typing_extensionsr   r   rc   r   
ezdxf.mathr    r   r   r   r   hdrr   abstractr   r   r   r   r   r   r   r   r2   r0   r4   r   r!  tupler   r   r   r   r   r   r  r   r%  r)  r   r   r   r"   r0  r   r8  r   r9  r   r:  r   r;  r5  r   r1   r+   r)   <module>rD     s   #    (      ; ;   $8J 8 E{	9 "I IX) )( U(("b%':C/J C/L! !<".+ " / /+.//*(05l 05f
$ t,,-.T^^))*+doo++,-d006678 D,,2234 *? *?r+   