
    'j1                       U d dl mZ d dl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mZ ddlmZ ddl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 d dlmZ ee         Zde d<    G d de          Z! e!ddd e"                      Z#e#ddfd9dZ$d:dZ%d;dZ& G d  d!e          Z' G d" d#e          Z( G d$ d%ee!                   Z)d<d)Z*d=d*Z+d>d-Z,d?d.Z-d?d/Z.d@d1Z/dAd4Z0dBd6Z1 G d7 d8e          Z2dS )C    )annotations)AnySequenceIteratorUnionListTYPE_CHECKINGOptional)	TypeAliasN)datetime   )const)ParsingErrorInvalidLinkStructure)
AcisHeader)AbstractEntityAbstractBuilder
DataLoaderDataExporterEntityExporter)
AcisEntity)Vec3r   	SatRecordc                  (    e Zd ZdZ	 	 	 dddZd ZdS )	SatEntityz2Low level representation of an ACIS entity (node).$-1Nnamestrattr_ptridintdataOptional[list[Any]]c                T    || _         || _        || _        ||ng | _        d | _        d S N)r   r    r!   r#   
attributes)selfr   r    r!   r#   s        H/DATA/AppData/hermes/venv/lib/python3.11/site-packages/ezdxf/acis/sat.py__init__zSatEntity.__init__&   s4     	 '+'7ttR	'+    c                &    | j          d| j         dS )N())r   r!   r(   s    r)   __str__zSatEntity.__str__3   s    )((dg((((r+   )r   r   N)r   r   r    r   r!   r"   r#   r$   )__name__
__module____qualname____doc__r*   r0    r+   r)   r   r   #   sM        <<
 $(, , , , ,) ) ) ) )r+   r   znull-ptrr   r   r   r   r#   r$   returnc                8    t          | d||          }||_        |S )zFactory to create new ACIS entities.

    Args:
        name: entity type
        attributes: reference to the entity attributes or :attr:`NULL_PTR`.
        id: unique entity id as integer or -1
        data: generic data container as list

    r   )r   r'   )r   r'   r!   r#   es        r)   
new_entityr9   :   s#     	$r4((AALHr+   sboolc                @    t          |           dk    o| d         dk    S )z@Returns ``True`` if the string `s` represents an entity pointer.r   $)len)r:   s    r)   is_ptrr?   N   s    q66A:%!A$#+%r+   entitieslist[SatEntity]c                    d fd} D ]t} ||j                   |_        d|_         g }|j        D ]E}t          |          r|                     ||                     0|                    |           F||_        u S )Nr:   r   r6   r   c                \    t          | dd                    }|dk    rt          S |         S )Nr   r   )r"   NULL_PTR)r:   numr@   s     r)   ptrz!resolve_str_pointers.<locals>.ptrT   s.    !ABB%jj"99O}r+   r   )r:   r   r6   r   )r    r'   r#   r?   append)r@   rF   entityr#   tokens   `    r)   resolve_str_pointersrJ   S   s           	 	C00[ 	# 	#Ee}} #CCJJ''''E""""Or+   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d	S )%SatDataLoaderr#   	list[Any]versionr"   c                0    || _         || _        d| _        d S )Nr   )rN   r#   index)r(   r#   rN   s      r)   r*   zSatDataLoader.__init__h   s    	


r+   r6   r;   c                <    | j         t          | j                  k    S r&   )rP   r>   r#   r/   s    r)   has_datazSatDataLoader.has_datam   s    zS^^++r+   Nskip_satOptional[int]c                    ||S | j         | j                 }	 t          |          }n # t          $ r t	          d|           w xY w| xj        dz  c_        |S )Nzexpected integer, got r   )r#   rP   r"   
ValueErrorr   )r(   rS   entryvalues       r)   read_intzSatDataLoader.read_intp   sx    O	$*%	AJJEE 	A 	A 	A???@@@	A

a

s	   ( Afloatc                    | j         | j                 }	 t          |          }n # t          $ r t	          d|           w xY w| xj        dz  c_        |S )Nzexpected double, got r   )r#   rP   rZ   rV   r   )r(   rW   rX   s      r)   read_doublezSatDataLoader.read_double|   sm    	$*%	@%LLEE 	@ 	@ 	@>u>>???	@

a

s	   $ Ac                r    |                      dd          }|r|                                 S t          j        S )NFI)	read_boolr\   mathinf)r(   finites     r)   read_intervalzSatDataLoader.read_interval   s6    S)) 	&##%%%xr+   tuple[float, float, float]c                    |                                  }|                                  }|                                  }|||fS r&   r\   )r(   xyzs       r)   	read_vec3zSatDataLoader.read_vec3   s@    !Qwr+   truer   falsec                    | j         | j                 }||k    r| xj        dz  c_        dS ||k    r| xj        dz  c_        dS t          d| d| d|           )Nr   TFzexpected bool string 'z' or 'z', got )r#   rP   r   )r(   rl   rm   rX   s       r)   r`   zSatDataLoader.read_bool   sw    	$*%D==JJ!OJJ4e^^JJ!OJJ5FTFFFFuFF
 
 	
r+   c                    | j         | j                 }| j        t          j        j        k     s|                    d          r%| xj        dz  c_        | j         | j        dz
           S t          d|           )N@   r   zexpected string, got )r#   rP   rN   r   FeaturesAT
startswithr   r(   rX   s     r)   read_strzSatDataLoader.read_str   sn    	$*%<%.+++u/?/?/D/D+JJ!OJJ9TZ!^,,:5::;;;r+   r   c                    | j         | j                 }t          |t                    r| xj        dz  c_        |S t	          dt          |                     )Nr   zexpected pointer, got )r#   rP   
isinstancer   r   type)r(   rH   s     r)   read_ptrzSatDataLoader.read_ptr   sS    4:&fn-- 	JJ!OJJMBDLLBBCCCr+   list[float]c                :      fdt          d          D             S )Nc                8    g | ]}                                 S r5   rg   ).0_r(   s     r)   
<listcomp>z0SatDataLoader.read_transform.<locals>.<listcomp>   s%    666q  ""666r+      )ranger/   s   `r)   read_transformzSatDataLoader.read_transform   s%    
 7666E"II6666r+   )r#   rM   rN   r"   )r6   r;   r&   )rS   rT   r6   r"   )r6   rZ   )r6   re   )rl   r   rm   r   r6   r;   )r6   r   )r6   r   )r6   r{   )r1   r2   r3   r*   rR   rY   r\   rd   rk   r`   rv   rz   r   r5   r+   r)   rL   rL   g   s           
, , , ,
 
 
 
 
         

 

 

 

< < < <D D D D7 7 7 7 7 7r+   rL   c                  *    e Zd ZdZddZddZdd	Zd
S )
SatBuilderz7Low level data structure to manage ACIS SAT data files.r6   Nonec                V    t                      | _        g | _        g | _        i | _        d S r&   )r   headerbodiesr@   _export_mappingr/   s    r)   r*   zSatBuilder.__init__   s)     ll'))+57r+   	list[str]c                   |                                   t          | j                  t          | j        j                  z   | j        _        | j        j        dk    rd| j        _        nt          | j	                  | j        _        | j        
                                }|                    t          | j	        | j        j                             |                    | j                                                   |S )zReturns the text representation of the ACIS file as list of strings
        without line endings.

        Raise:
            InvalidLinkStructure: referenced ACIS entity is not stored in
                the :attr:`entities` storage

          r   )reorder_recordsr>   r   r"   r   has_asm_header
n_entitiesrN   	n_recordsr@   dumpsextendbuild_str_recordsrG   sat_end_markerr(   r#   s     r)   dump_satzSatBuilder.dump_sat   s     	!$T[!1!1CK&5
 5
 "
 ;#%%$%DK!!$'$6$6DK!{  ""%dmT[5HIIJJJDK..00111r+   r@   rA   c                6    d |D             | _         || _        dS )z.Reset entities and bodies list. (internal API)c                (    g | ]}|j         d k    |S )body)r   )r~   r8   s     r)   r   z+SatBuilder.set_entities.<locals>.<listcomp>   s$    ???Qaf.>.>q.>.>.>r+   N)r   r@   )r(   r@   s     r)   set_entitieszSatBuilder.set_entities   s"    ??(??? r+   N)r6   r   r6   r   )r@   rA   r6   r   )r1   r2   r3   r4   r*   r   r   r5   r+   r)   r   r      sV        AA8 8 8 8   ,! ! ! ! ! !r+   r   c                  &    e Zd ZddZddZdd
ZdS )SatExporterrH   r   r6   r   c                T    t          |j        |j                  }t          |_        |S )N)r!   )r   ry   r!   rD   r'   r(   rH   records      r)   make_recordzSatExporter.make_record   s%    6;69555$r+   r   r   c                ,    t          | |j                  S r&   )SatDataExporterr#   )r(   r   s     r)   make_data_exporterzSatExporter.make_data_exporter   s    tV[111r+   r   c                    t                      }| j        |_        |                    |                                            |                                S r&   )r   r   r   export_recordsr   )r(   builders     r)   r   zSatExporter.dump_sat   sF    ,,T0022333!!!r+   N)rH   r   r6   r   )r   r   r6   r   r   )r1   r2   r3   r   r   r   r5   r+   r)   r   r      sP           
2 2 2 2" " " " " "r+   r   rN   r"   Iterator[str]c              #     K   d	 fd} D ]}|j         g}|                     ||j                             |dk    r'|                    t          |j                             |j        D ]X}t          |t                    r|                     ||                     6|                    t          |                     Y|                    d           d                    |          V  d S )
Nr8   r   r6   r   c                    | t           u rdS 	 d                    |            S # t          $ r! t          dt	          |            d          w xY w)Nr   r=   zentity z not in record storage)rD   rP   rV   r   r   )r8   r@   s    r)   ptr_strz"build_str_records.<locals>.ptr_str   sp    ==5	Q*x~~a((*** 	Q 	Q 	Q&'OQ'O'O'OPPP	Qs	   & +Ar   # )r8   r   r6   r   )	r   rG   r'   r   r!   r#   rx   r   join)r@   rN   r   rH   tokensr#   s   `     r)   r   r      s     Q Q Q Q Q Q   +ggf/00111c>>MM#fi..)))K 	) 	)D$	** )ggdmm,,,,c$ii((((chhv r+   c              #     K   d}d}d}|                                  D ]I}|dk    r||z  }|dz  }|dk    r|V  d}|dk    r&|dv r||z  }0|dk    r|rt          |          }d}Jd S )N r   r   rp   
0123456789r   )rstripr"   )r:   rE   collectrI   cs        r)   parse_header_strr      s      
CGEXXZZ  Q;;QJEqLG!||#XX,1HCC#XX#X#hhGC r+   Sequence[str] tuple[AcisHeader, Sequence[str]]c                @   t                      }| d                                         }t          |d                   |_        	 t          |d                   |_        t          |d                   |_        t          |d                   |_        n# t          t          f$ r Y nw xY wt          t          | d                             }	 |d         |_        |d         |_        n# t          $ r Y nw xY wt          |          dk    r<	 t          j        |d         t           j                  |_        n# t          $ r Y nw xY w| d                                         }	 t'          |d                   |_        n# t          t          f$ r Y nw xY w|| dd          fS )Nr   r   rq      )r   splitr"   rN   r   r   flags
IndexErrorrV   listr   
product_idacis_versionr>   r   strptimer   DATE_FMTcreation_daterZ   units_in_mm)r#   r   r   s      r)   parse_headerr     s   \\F!W]]__F^^FNvay>>q	NN6!9~~
#   "47++,,F"1I$Qi    6{{Q	#+#4VAY#O#OF   	 	 	D	!W]]__F"6!9--
#   48sI   AB B'&B'C( (
C54C5*D7 7
EE"E= =FFc              #     K   | D ]G}|                     t          j                  s|                     t          j                  r d S |V  Hd S r&   )rt   r   END_OF_ACIS_DATA_SATBEGIN_OF_ACIS_HISTORY_DATA)r#   lines     r)   _filter_recordsr   1  se        ??5566 	$//,;
 ;
 	 FF



 r+   c              #     K   d                     t          |                     }|                    d          D ]}|                                }|r|V  d S )Nr   r   )r   r   r   strip)r#   merged_datar   s      r)   merge_record_stringsr   :  se      ((?40011K##C((   	LLL r+   list[SatRecord]c                `   d}g }t          |           D ]}|                                }|d                                         }|                    d          r:t	          |           }||k    rt          d          |                    d           |                    |           |dz  }|S )Nr   -z-non-continuous sequence numbers not supportedr   )r   r   r   rt   r"   r   poprG   )r#   expected_seq_numrecordsr   r   first_tokenrE   s          r)   parse_recordsr   B  s    !G$T**   JJLLQioo''!!#&& 	{###C&&&"C   JJqMMMvANr+   r   Sequence[SatRecord]c           	         g }| D ]i}|d         }|d         }d}|dk    r t          |d                   }|dd          }n
|dd          }|                    t          ||||                     j|S )Nr   r   r   r   rq   r   )r"   rG   r   )r   rN   r@   r   r   attrid_r#   s           r)   build_entitiesr   T  s     !#H 	: 	:ayayc>>fQi..C!"":DD!"":D	$c4889999Or+   Union[str, Sequence[str]]c                   t          | t                    r|                                 }n| }t          |t                    st	          d          t                      }t          |          \  }}||_        t          |          }t          ||j
                  }|                    t          |                     |S )zReturns the :class:`SatBuilder` for the ACIS :term:`SAT` file content
    given as string or list of strings.

    Raises:
        ParsingError: invalid or unsupported ACIS data structure

    z+expected as string or a sequence of strings)rx   r   
splitlinesr   	TypeErrorr   r   r   r   r   rN   r   rJ   )r:   r#   r   r   r   r@   s         r)   	parse_satr   e  s     !S ||~~dH%% GEFFFllG%%LFDGND!!Ggv~66H-h77888Nr+   c                  h    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dS )(r   exporterr   r#   rM   c                :    |j         | _         || _        || _        d S r&   )rN   r   r#   )r(   r   r#   s      r)   r*   zSatDataExporter.__init__~  s    ' 			r+   FrX   r"   r6   r   c                \    |s)| j                             t          |                     dS dS )zThere are sometimes additional int values in SAB files which are
        not present in SAT files, maybe reference counters e.g. vertex, coedge.
        N)r#   rG   r   )r(   rX   rS   s      r)   	write_intzSatDataExporter.write_int  s8      	)ISZZ(((((	) 	)r+   rZ   c                >    | j                             |d           d S )Ngr#   rG   ru   s     r)   write_doublezSatDataExporter.write_double  s"    	E&&&&&r+   c                    t          j        |          r| j                            d           d S | j                            d           |                     |           d S )Nr_   r^   )ra   isinfr#   rG   r   ru   s     r)   write_intervalzSatDataExporter.write_interval  s`    :e 	%IS!!!!!IS!!!e$$$$$r+   r   c                    |                      |j                   |                      |j                   |                      |j                   d S r&   r   rh   ri   rj   ru   s     r)   write_loc_vec3zSatDataExporter.write_loc_vec3  J    %'"""%'"""%'"""""r+   c                    |                      |j                   |                      |j                   |                      |j                   d S r&   r   ru   s     r)   write_dir_vec3zSatDataExporter.write_dir_vec3  r   r+   r;   rl   r   rm   c                B    | j                             |r|n|           d S r&   r   )r(   rX   rl   rm   s       r)   
write_boolzSatDataExporter.write_bool  s'    	1E22222r+   c                    | j                             dt          |                      | j                             t          |                     d S )Nrp   )r#   rG   r>   r   ru   s     r)   	write_strzSatDataExporter.write_str  sI    	)SZZ))***	U$$$$$r+   c                0    |                      |           d S r&   )r   ru   s     r)   write_literal_strz!SatDataExporter.write_literal_str  s    ur+   rH   r   c                    t           }|j        s| j                            |          }| j                            |           d S r&   )rD   is_noner   
get_recordr#   rG   r   s      r)   	write_ptrzSatDataExporter.write_ptr  sB    ~ 	6]--f55F	     r+   r   c                :    | j                             |           d S r&   )r#   r   r   s     r)   write_transformzSatDataExporter.write_transform  s    	r+   N)r   r   r#   rM   )F)rX   r"   r6   r   )rX   rZ   r6   r   )rX   r   r6   r   )rX   r;   rl   r   rm   r   r6   r   )rX   r   r6   r   )rH   r   r6   r   )r#   r   r6   r   )r1   r2   r3   r*   r   r   r   r   r   r   r   r   r   r   r5   r+   r)   r   r   }  s           
) ) ) ) )' ' ' '% % % %# # # #
# # # #
3 3 3 3% % % %   ! ! ! !     r+   r   )r   r   r#   r$   r6   r   )r:   r   r6   r;   )r@   rA   r6   rA   )r@   rA   rN   r"   r6   r   )r:   r   r6   r   )r#   r   r6   r   )r#   r   r6   r   )r#   r   r6   r   )r   r   rN   r"   r6   rA   )r:   r   r6   r   )3
__future__r   typingr   r   r   r   r   r	   r
   typing_extensionsr   ra   r   r   r   r   r   hdrr   abstractr   r   r   r   r   r@   r   
ezdxf.mathr   r   r   __annotations__r   tuplerD   r9   r?   rJ   rL   r   r   r   r   r   r   r   r   r   r   r   r5   r+   r)   <module>r     s^   # " " " " " "                  ( ' ' ' ' '              5 5 5 5 5 5 5 5                      $$$$$$Cy	        ) ) ) ) ) ) ) )( 9ZEEGG44
 	 $	    (& & & &
   (I7 I7 I7 I7 I7J I7 I7 I7X"! "! "! "! "! "! "! "!J" " " " ".+ " " "    .   (   <         $   "   02 2 2 2 2l 2 2 2 2 2r+   