
    'j):                       d dl mZ d dlmZmZmZmZ d dlZd dlm	Z	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mZ d d	lmZmZ erd d
lmZ d dlmZ d dlmZmZ  ej        d          ZddZ  e d          Z! G d d          Z"dS )    )annotations)TYPE_CHECKINGIteratorcastOptionalN)DXFKeyErrorDXFValueErrorDXFStructureError)MODEL_SPACE_R2000PAPER_SPACE_R2000TMP_PAPER_SPACE_NAME)is_valid_table_name   )Layout
Modelspace
Paperspace)	DXFEntityBlockRecord)Auditor)Drawing)
Dictionary	DXFLayoutezdxfnamestrreturnc                *    |                                  S )zOAutoCAD uses case-insensitive layout names, but stores the name case-sensitive.)upperr   s    O/DATA/AppData/hermes/venv/lib/python3.11/site-packages/ezdxf/layouts/layouts.pykeyr!      s    ::<<    Modelc                     e Zd Zd=dZed=d            Zd>dZd?dZd@dZdAdZ	dBdZ
dCdZd Zd ZdDdZdEdZdFdGdZedHd             ZdId#ZdJd%ZdKd&ZdLd(ZdMd*ZdNd,ZdOd/ZdMd0ZdPd3ZdQd5Zd6 ZdRd7ZdRd8ZdSd9ZdTd<Z dS )ULayoutsdocr   c                l    || _         i | _        t          d| j         j        d                   | _        dS )z#Default constructor. (internal API)r   ACAD_LAYOUTN)r&   _layoutsr   rootdict_dxf_layouts)selfr&   s     r    __init__zLayouts.__init__!   s7    +-(,$(+M:)
 )
r"   c                t    t          |          }|                                 |                                 |S )z(Constructor from scratch. (internal API))r%   setup_modelspacesetup_paperspaceclsr&   layoutss      r    setupzLayouts.setup+   s8     #,,  """  """r"   r   intc                *    t          | j                  S )zKReturns count of existing layouts, including the modelspace
        layout.)lenr)   r,   s    r    __len__zLayouts.__len__3   s     4=!!!r"   r   r   boolc                    t          |t                    sJ t          t                                t          |          | j        v S )z(Returns ``True`` if layout `name` exist.)
isinstancer   typer!   r)   r,   r   s     r    __contains__zLayouts.__contains__8   s9    $$$//d3ii//$4yyDM))r"   Iterator[Layout]c                N    t          | j                                                  S )z|Returns iterable of all layouts as :class:`~ezdxf.layouts.Layout`
        objects, including the modelspace layout.
        )iterr)   valuesr8   s    r    __iter__zLayouts.__iter__=   s      DM((**+++r"   layoutr   c                    |j         }||j        _        | j        j        j        |j        _        || j        t          |          <   || j        |<   d S N)
dxf_layoutdxfr   r+   handleownerr)   r!   )r,   r   rE   rH   s       r    _add_layoutzLayouts._add_layoutC   sL    &
"
#04;
#)c$ii ",$r"   c                r    |j         }| j                            |           | j        t	          |          = d S rG   )r   r+   discardr)   r!   )r,   rE   r   s      r    _discardzLayouts._discardJ   s6    {!!$'''M#d))$$$r"   Nonec                    d}|j         j        }|}|| v r|dz  }|d| dz   }|| v t          | j                  dz   |j         _        |                     ||           dS )zAAppend an existing (copied) paperspace layout as last layout tab.r   z ()N)rI   r   r7   r)   taborderrL   )r,   rE   indexbase_layout_namelayout_names        r    append_layoutzLayouts.append_layoutO   s    !:?&T!!QJE*]%]]]:K T!! "$-0014
f-----r"   c                P    |                      t          dt          ddi           dS )z Modelspace setup. (internal API)r#   rS   r   
dxfattribsN)_new_specialr   r   r8   s    r    r/   zLayouts.setup_modelspaceZ   s7    !2
A 	 	
 	
 	
 	
 	
r"   c                P    |                      t          dt          ddi           dS )z"First layout setup. (internal API)Layout1rS   r   rY   N)r[   r   r   r8   s    r    r0   zLayouts.setup_paperspace`   s7    	#4*a 	 	
 	
 	
 	
 	
r"   
block_namerZ   dictc                    || j         v rt          d| d          | j        j        j        |d<   |                    ||| j        |          }|                     ||           |S )NLayout "z" already existsrK   rY   )r)   r	   r+   rI   rJ   newr&   rL   )r,   r2   r   r^   rZ   rE   s         r    r[   zLayouts._new_specialf   sr    4=   A4 A A ABBB"/3:
7z48
KKv&&&r"   c                N    | j         j        }d}d|z  |v r|dz  }d|z  |v d|z  S )z0Returns a unique paperspace name. (internal API)r   z*Paper_Space%dr   )r&   blocks)r,   rd   counts      r    unique_paperspace_namezLayouts.unique_paperspace_namen   sF    &&00QJE &&00%''r"   Nr   c                (   t          |t                    sJ t          t                                t          |          st	          d          || v rt	          d| d          t          |pi           }| j        j        j        |d<   |	                    dt          | j                  dz              |                                 }t          j        ||| j        |          }|                                 |                     ||           |S )a  Returns a new :class:`~ezdxf.layouts.Paperspace` layout.

        Args:
            name: layout name as shown in tabs in :term:`CAD` applications
            dxfattribs: additional DXF attributes for the
                :class:`~ezdxf.entities.layout.DXFLayout` entity

        Raises:
            DXFValueError: Invalid characters in layout name.
            DXFValueError: Layout `name` already exist.

        z(Layout name contains invalid characters.ra   " already exist.rK   rS   r   rY   )r<   r   r=   r   r	   r_   r+   rI   rJ   
setdefaultr7   r)   rf   r   rb   r&   reset_limitsrL   )r,   r   rZ   r^   rE   s        r    rb   zLayouts.newv   s    $$$//d3ii//$"4(( 	L JKKK4<< A4 A A ABBB**++
"/3:
7j#dm*<*<q*@AAA0022
j$(zRRR 	v&&&r"   	'Drawing'	'Layouts'c                     | |          }|                                  t          |          dk     r:|                    dt          d           |                    dt          d           |S )z0Constructor if loading from file. (internal API)   r#   r   )rS   r]   r   )setup_from_rootdictr7   restorer   r   r1   s      r    loadzLayouts.load   sm     #c((##%%% w<<!OOG%6OCCCOOI'81OEEEr"   block_record_namerS   c                ~    || v rdS | j         j                            |          }|                     |||           dS )zMRestore layout from block if DXFLayout does not exist.
        (internal API)N)r&   rd   get_new_from_block_layout)r,   r   rr   rS   block_layouts        r    rp   zLayouts.restore   sH     4<<Fx**+<==##D,AAAAAr"   'Layout'c                `   | j         j        j        ||j        |d}t	          d| j        j                            d|                    }t          |          t          k    rt          j        || j                  }nt          j        || j                  }|                     ||           |S )N)rK   r   block_record_handlerS   r   LAYOUTrY   )r+   rI   rJ   ry   r   r&   objects
new_entityr!   MODELr   rq   r   rL   )r,   r   rv   rS   rZ   rH   rE   s          r    ru   zLayouts._new_from_block_layout   s    &*1#/#C 	
 

 H''Z'HH
 

 t99_Z::FF_Z::Fv&&&r"   c                f   | j                                         D ]\  }}t          |t                    r"t                              d| d| d           <t          |          t          k    rt          || j	                  }nt          || j	                  }|| j        t          |          <   dS )z9Setup layout manager from root dictionary. (internal API)zignore missing LAYOUT(#z
) entity ''N)r+   itemsr<   r   loggerdebugr!   r}   r   r&   r   r)   )r,   r   rH   rE   s       r    ro   zLayouts.setup_from_rootdict   s     !% 1 7 7 9 9 		. 		.D**c** TzTTTTTTUUU4yyE!!#J99#J99'-DM#d))$$		. 		.r"   r   c                R    t          t          |                     d                    S )z6Returns the :class:`~ezdxf.layouts.Modelspace` layout.r#   )r   r   rt   r8   s    r    
modelspacezLayouts.modelspace   s    J 1 1222r"   	list[str]c                H    d | j                                         D             S )zNReturns a list of all layout names, all names in original case-sensitive form.c                    g | ]	}|j         
S  r   .0rE   s     r    
<listcomp>z!Layouts.names.<locals>.<listcomp>   s    AAAAAAr"   )r)   rC   r8   s    r    nameszLayouts.names   s$    AA$-*>*>*@*@AAAAr"   Optional[str]c                n    |p|                                  d         }| j        t          |                   S )zReturns :class:`~ezdxf.layouts.Layout` by `name`, case-insensitive
        "Model" == "MODEL".

        Args:
            name: layout name as shown in tab, e.g. ``'Model'`` for modelspace

        r   )names_in_taborderr)   r!   r>   s     r    rt   zLayouts.get   s2     2t--//2}SYY''r"   old_namenew_namec                   t          |t                    sJ t          |                      t          |t                    sJ t          |                      t          |          t          k    rt          d          || v rt          d| d          || vrt          d| d          |                     |          }|                     |           |                     ||           dS )a  Rename a layout from `old_name` to `new_name`.
        Can not rename layout ``'Model'`` and the new name of a layout must
        not exist.

        Args:
            old_name: actual layout name, case-insensitive
            new_name: new layout name, case-insensitive

        Raises:
            DXFValueError: try to rename ``'Model'``
            DXFValueError: Layout `new_name` already exist.

        zCan not rename model space.ra   rh   " does not exist.N)	r<   r   r=   r!   r}   r	   rt   rO   rL   )r,   r   r   rE   s       r    renamezLayouts.rename   s     (C((88$x..88((C((88$x..88(x==E!! =>>>t E8 E E EFFF4 F8 F F FGGG(##f6*****r"   c                z    d | j                                         D             }d t          |          D             S )zSReturns all layout names in tab order as shown in :term:`CAD`
        applications.c                4    g | ]}|j         j        |j        fS r   )rI   rS   r   r   s     r    r   z-Layouts.names_in_taborder.<locals>.<listcomp>   s1     
 
 
39VZ &+.
 
 
r"   c                    g | ]\  }}|S r   r   )r   orderr   s      r    r   z-Layouts.names_in_taborder.<locals>.<listcomp>   s    666666r"   )r)   rC   sorted)r,   r   s     r    r   zLayouts.names_in_taborder   sJ    
 
=A]=Q=Q=S=S
 
 
 76u6666r"   entityr   c                z    |j         j        }|t          d          |                     |j         j                  S )z,Returns the owner layout for a DXF `entity`.Nz$No associated layout, owner is None.)rI   rK   r   get_layout_by_key)r,   r   rK   s      r    get_layout_for_entityzLayouts.get_layout_for_entity   s9    
 =DEEE%%fj&6777r"   
layout_keyc                   t          |t                    sJ t          |                      d| d}	 | j        j        |         }n# t
          $ r t          |          w xY wt          |t                    st          |          	 | j        j        |j        j	                 }n# t
          $ r t          |          w xY w| 
                    |j        j                  S )z4Returns a layout by its `layout_key`. (internal API)zLayout with key "r   )r<   r   r=   r&   entitydbKeyErrorr   r   rI   rE   rt   r   )r,   r   	error_msgblock_recordrH   s        r    r   zLayouts.get_layout_by_key  s    *c**<<D,<,<<<*E
EEE		)8,Z8LL 	) 	) 	)i(((	),44 	)i(((	)*<+;+BCJJ 	) 	) 	)i(((	)xx
+,,,s   A A!	B& &C c                b    | j         j                            t                    }|j        j        S )zKReturns layout kay for the active paperspace layout.
        (internal API))r&   block_recordsrt   r   rI   rJ   )r,   active_layout_block_records     r    get_active_layout_keyzLayouts.get_active_layout_key  s*     &*X%;%?%?@Q%R%R")-44r"   c                   t          |t                    sJ t          |                      t          |          t          k    rt          d          |                     |          }|                                 }||j        k    rdS | j	        j
        }|j        }|                    t          t                     |                    |t                     |                    t          |           dS )z.Set layout `name` as active paperspace layout.z(Can not set model space as active layoutN)r<   r   r=   r!   r}   r	   rt   r   r   r&   rd   rr   rename_blockr   r   )r,   r   new_active_layoutold_active_layout_keyrd   new_active_paper_space_names         r    set_active_layoutzLayouts.set_active_layout  s    $$$00d4jj00$t99 JKKK HHTNN $ : : < < $5$@@@F&7&I#-/CDDD79JKKK02MNNNNNr"   c                   t          |t                    sJ t          |                      t          |          t          k    rt          d          |                     |          }t          |           dk     rt          d          |j        | 	                                k    r9| j
        D ]1}|t          |          t          fvr|                     |            n2|                     |           |                                 dS )ad  Delete layout `name` and destroy all entities in that layout.

        Args:
            name (str): layout name as shown in tabs

        Raises:
            DXFKeyError: if layout `name` do not exist
            DXFValueError: deleting modelspace layout is not possible
            DXFValueError: deleting last paperspace layout is not possible

        z!Can not delete modelspace layout.   z&Can not delete last paperspace layout.N)r<   r   r=   r!   r}   r	   rt   r7   r   r   r)   r   rO   destroy)r,   r   rE   rV   s       r    deletezLayouts.delete0  s     $$$00d4jj00$t99 CDDD$t99q== HIII : : < <<<#}  s4yy%&888**;777E 9 	fr"   c                f    | D ] }|j         rt          t          |          c S !t          d          )z%Returns the active paperspace layout.z"No active paperspace layout found.)is_active_paperspacer   r   r
   )r,   rE   s     r    active_layoutzLayouts.active_layoutM  sF     	0 	0F* 0J/////0 DEEEr"   auditorr   c           	     "   ddl m} |j        }d |j        D             }|D ]j}|j                            d          }|| vrJ|                    |j        dt          |           d| d           |j        	                    |           kd	 |j
        D             }d
 | j                                        D             }|                    |          }	t          |	          r|	D ]}
|j                            |
          }|j                            d          }|                    |j        dt          |           d| d           ||j        v r|j                            |d           |j
                            |           d S d S )Nr   )
AuditErrorc              3  J   K   | ]}|                                 d k    |V  dS )rz   N)dxftype)r   os     r    	<genexpr>z Layouts.audit.<locals>.<genexpr>Z  s4      EEQYY[[H-D-D1-D-D-D-DEEr"   r   zRemoved orphaned z "")codemessagec                    h | ]?}|j         j                                                            d           3|j         j        @S )z*paper_space)rI   r   lower
startswithrJ   )r   brs     r    	<setcomp>z Layouts.audit.<locals>.<setcomp>e  sP     
 
 
v{  ""--n==
FM
 
 
r"   c                `    h | ]+}t          |j                  t          k    |j        j        ,S r   )r!   r   r}   rI   ry   r   s     r    r   z Layouts.audit.<locals>.<setcomp>j  s<     !
 !
 !
6;5(( J*(((r"   zRemoved orphaned layout F)safe)ezdxf.auditr   r&   r{   rI   rt   fixed_errorORPHANED_LAYOUT_ENTITYr   delete_entityr   r)   rC   
differencer7   r   (ORPHANED_PAPER_SPACE_BLOCK_RECORD_ENTITYrd   delete_blockremove)r,   r   r   r&   r3   rE   r   psp_br_handlespsp_layout_br_handlesmismatchrJ   r   s               r    auditzLayouts.auditT  s   ******k FEckEEE 	2 	2F:>>&))D4###:FFFFtFFF $    ))&111
 
'
 
 

!
 !
-..00!
 !
 !

 ",,-BCCx== 	3" 
3 
3\%%f--vzz&))###LIs2wwII$III $    3:%%J++Du+====%,,T2222	3 	3
3 
3r"   )r&   r   )r   r5   )r   r   r   r:   )r   r@   )r   r   rE   r   )rE   r   )rE   r   r   rP   )r   r   r^   r   rZ   r_   r   r   )r   r   rG   )r   r   r   r   )r&   rk   r   rl   )r   r   rr   r   rS   r5   r   rP   )rS   r5   r   rw   )r   rP   )r   r   )r   r   )r   r   r   r   )r   r   r   r   r   rP   )r   r   r   r   )r   r   r   r   )r   r   r   rP   )r   r   )r   r   )!__name__
__module____qualname__r-   classmethodr4   r9   r?   rD   rL   rO   rW   r/   r0   r[   rf   rb   rq   rp   ru   ro   r   r   rt   r   r   r   r   r   r   r   r   r   r   r"   r    r%   r%       sv       
 
 
 
    [" " " "
* * * *
, , , ,- - - -% % % %
	. 	. 	. 	.
 
 

 
 
   ( ( ( (    > 
 
 
 [
B B B B   $. . . .3 3 3 3B B B B	( 	( 	( 	(+ + + +67 7 7 78 8 8 8- - - -"5 5 5O O O O$   :F F F F'3 '3 '3 '3 '3 '3r"   r%   )r   r   r   r   )#
__future__r   typingr   r   r   r   loggingezdxf.lldxf.constr   r	   r
   r   r   r   ezdxf.lldxf.validatorr   rE   r   r   r   ezdxf.entitiesr   r   r   r   ezdxf.documentr   r   r   	getLoggerr   r!   r}   r%   r   r"   r    <module>r      s   # " " " " " : : : : : : : : : : : :  K K K K K K K K K K         
 6 5 5 5 5 5 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 5######&&&&&&44444444		7	#	#   
 	G[3 [3 [3 [3 [3 [3 [3 [3 [3 [3r"   