
    h):                       S SK Jr  S SKJrJrJrJr  S SKrS SKJ	r	J
r
Jr  S SKJrJrJr  S SKJr  SSKJrJrJr  S S	KJrJr  \(       a  S S
KJr  S SKJr  S SKJrJr  \R<                  " S5      rSS jr \ " S5      r! " S S5      r"g)    )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ezdxfc                "    U R                  5       $ )zOAutoCAD uses case-insensitive layout names, but stores the name case-sensitive.)upper)names    G/var/www/html/env/lib/python3.13/site-packages/ezdxf/layouts/layouts.pykeyr      s    ::<    Modelc                  B   \ rS rSrS!S jr\S!S j5       rS"S jrS#S jrS$S jr	S%S jr
S&S jrS'S	 jrS
 rS rS(S jrS)S jrS*S+S jjr\S,S j5       rS-S jrS.S jrS/S jrS0S jrS1S jrS2S jrS3S jrS1S jrS4S jrS5S jrS rS6S jrS6S jrS7S jr S8S jr!S r"g)9Layouts    c                n    Xl         0 U l        [        SU R                   R                  S   5      U l        g)z#Default constructor. (internal API)r   ACAD_LAYOUTN)doc_layoutsr   rootdict_dxf_layouts)selfr&   s     r   __init__Layouts.__init__!   s/    +-(,$((++M:)
r   c                \    [        U5      nUR                  5         UR                  5         U$ )z(Constructor from scratch. (internal API))r"   setup_modelspacesetup_paperspaceclsr&   layoutss      r   setupLayouts.setup+   s*     #,  "  "r   c                ,    [        U R                  5      $ )zCReturns count of existing layouts, including the modelspace
layout.)lenr'   r*   s    r   __len__Layouts.__len__3   s     4==!!r   c                    [        U[        5      (       d   [        [        5      5       e[        U5      U R                  ;   $ )z(Returns ``True`` if layout `name` exist.)
isinstancestrtyper   r'   r*   r   s     r   __contains__Layouts.__contains__8   s1    $$$/d3i/$4yDMM))r   c                H    [        U R                  R                  5       5      $ )zlReturns iterable of all layouts as :class:`~ezdxf.layouts.Layout`
objects, including the modelspace layout.
)iterr'   valuesr7   s    r   __iter__Layouts.__iter__=   s     DMM((*++r   c                    UR                   nXR                  l        U R                  R                  R                  UR                  l        X R                  [        U5      '   X0R                  U'   g N)
dxf_layoutdxfr   r)   handleownerr'   r   )r*   r   layoutrH   s       r   _add_layoutLayouts._add_layoutC   sS    &&
"#0044;;
#)c$i ",$r   c                ~    UR                   nU R                  R                  U5        U R                  [	        U5      	 g rG   )r   r)   discardr'   r   )r*   rL   r   s      r   _discardLayouts._discardJ   s/    {{!!$'MM#d)$r   c                    SnUR                   R                  nUnX@;   a  US-  nUSU S3-   nX@;   a  M  [        U R                  5      S-   UR                   l        U R                  XA5        g)zAAppend an existing (copied) paperspace layout as last layout tab.r   z ()N)rI   r   r6   r'   taborderrM   )r*   rL   indexbase_layout_namelayout_names        r   append_layoutLayouts.append_layoutO   sm    !::??&!QJE*r%]:K ! "$--014

-r   c                <    U R                  [        S[        SS0S9  g)z Modelspace setup. (internal API)r    rU   r   
dxfattribsN)_new_specialr   r   r7   s    r   r.   Layouts.setup_modelspaceZ   s#    !2
A 	 	
r   c                <    U R                  [        S[        SS0S9  g)z"First layout setup. (internal API)Layout1rU   r   r\   N)r^   r   r   r7   s    r   r/   Layouts.setup_paperspace`   s#    	#4*a 	 	
r   c                    X R                   ;   a  [        SU S35      eU R                  R                  R                  US'   UR                  X#U R                  US9nU R                  X%5        U$ )NLayout "z" already existsrK   r\   )r'   r	   r)   rI   rJ   newr&   rM   )r*   r1   r   
block_namer]   rL   s         r   r^   Layouts._new_specialf   sh    == (4&0@ ABB"//33::
7488
K&r   c                n    U R                   R                  nSnSU-  U;   a  US-  nSU-  U;   a  M  SU-  $ )z0Returns a unique paperspace name. (internal API)r   z*Paper_Space%dr   )r&   blocks)r*   ri   counts      r   unique_paperspace_nameLayouts.unique_paperspace_namen   sD    &&0QJE &&0%''r   Nc                   [        U[        5      (       d   [        [        5      5       e[        U5      (       d  [	        S5      eX;   a  [	        SU S35      e[        U=(       d    0 5      nU R                  R                  R                  US'   UR                  S[        U R                  5      S-   5        U R                  5       n[        R                  " XU R                  US9nUR!                  5         U R#                  X5        U$ )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.rd   " already exist.rK   rU   r   r\   )r;   r<   r=   r   r	   dictr)   rI   rJ   
setdefaultr6   r'   rk   r   re   r&   reset_limitsrM   )r*   r   r]   rf   rL   s        r   re   Layouts.newv   s     $$$/d3i/$"4(( JKK<(4&0@ ABB**+
"//33::
7j#dmm*<q*@A002
$((zR 	&r   c                    U " U5      nUR                  5         [        U5      S:  a*  UR                  S[        SS9  UR                  S[        SS9  U$ )z0Constructor if loading from file. (internal API)   r    r   )rU   ra   r   )setup_from_rootdictr6   restorer   r   r0   s      r   loadLayouts.load   sR     c(##% w<!OOG%6OCOOI'81OEr   c                ~    X;   a  gU R                   R                  R                  U5      nU R                  XU5        g)zERestore layout from block if DXFLayout does not exist.
(internal API)N)r&   ri   get_new_from_block_layout)r*   r   block_record_namerU   block_layouts        r   rv   Layouts.restore   s5     <xx**+<=##DAr   c                   U R                   R                  R                  UUR                  US.n[	        SU R
                  R                  R                  SUS95      n[        U5      [        :X  a!  [        R                  " XPR
                  5      nO [        R                  " XPR
                  5      nU R                  X5        U$ )N)rK   r   block_record_handlerU   r   LAYOUTr\   )r)   rI   rJ   r   r   r&   objects
new_entityr   MODELr   rw   r   rM   )r*   r   r}   rU   r]   rH   rL   s          r   r{   Layouts._new_from_block_layout   s    &&**11#/#C#C 	

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

 t9__Z:F__Z:F&r   c                Z   U R                   R                  5        H  u  p[        U[        5      (       a  [        R                  SU SU S35        M8  [        U5      [        :X  a  [        X R                  5      nO[        X R                  5      nX0R                  [        U5      '   M     g)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   rL   s       r   ru   Layouts.setup_from_rootdict   s     !% 1 1 7 7 9D*c**6zl*TFRSTU4yE!#J9#J9'-MM#d)$ !:r   c                @    [        [        U R                  S5      5      $ )z6Returns the :class:`~ezdxf.layouts.Modelspace` layout.r    )r   r   rz   r7   s    r   
modelspaceLayouts.modelspace   s    J 122r   c                t    U R                   R                  5        Vs/ s H  oR                  PM     sn$ s  snf )zNReturns a list of all layout names, all names in original case-sensitive form.)r'   rC   r   r*   rL   s     r   namesLayouts.names   s+    *.--*>*>*@A*@*@AAAs   5c                j    U=(       d    U R                  5       S   nU R                  [        U5         $ )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   rz   Layouts.get   s/     2t--/2}}SY''r   c                   [        U[        5      (       d   [        U5      5       e[        U[        5      (       d   [        U5      5       e[        U5      [        :X  a  [        S5      eX ;   a  [        SU S35      eX;  a  [        SU S35      eU R                  U5      nU R                  U5        U R                  X#5        g)aS  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.rd   rn   " does not exist.N)	r;   r<   r=   r   r   r	   rz   rQ   rM   )r*   old_namenew_namerL   s       r   renameLayouts.rename   s     (C((8$x.8((C((8$x.8(x=E! =>>(8*4D EFF(8*4E FGG(#f*r   c                    U R                   R                  5        Vs/ s H$  oR                  R                  UR                  4PM&     nn[        U5       VVs/ s H  u  p4UPM	     snn$ s  snf s  snnf )zKReturns all layout names in tab order as shown in :term:`CAD`
applications.)r'   rC   rI   rU   r   sorted)r*   rL   r   orderr   s        r   r   Layouts.names_in_taborder   sg     >B]]=Q=Q=S
=S6ZZ  &++.=S 	 
 )/u666
 7s   +A*A/c                    UR                   R                  nUc  [        S5      eU R                  UR                   R                  5      $ )z,Returns the owner layout for a DXF `entity`.z$No associated layout, owner is None.)rI   rK   r   get_layout_by_key)r*   entityrK   s      r   get_layout_for_entityLayouts.get_layout_for_entity   s=    

  =DEE%%fjj&6&677r   c                   [        U[        5      (       d   [        U5      5       eSU S3n U R                  R                  U   n[        U[        5      (       d  [        U5      e U R                  R                  UR                  R                     nU R                  UR                  R                  5      $ ! [
         a    [        U5      ef = f! [
         a    [        U5      ef = f)z4Returns a layout by its `layout_key`. (internal API)zLayout with key "r   )r;   r<   r=   r&   entitydbKeyErrorr   r   rI   rL   rz   r   )r*   
layout_key	error_msgblock_recordrH   s        r   r   Layouts.get_layout_by_key  s    *c**<D,<<*'
|3DE		)88,,Z8L ,44i((	)**<+;+;+B+BCJ xx
++,,  	)i((	)  	)i((	)s   B9 '-C 9CC(c                    U R                   R                  R                  [        5      nUR                  R
                  $ )zCReturns layout kay for the active paperspace layout.
(internal API))r&   block_recordsrz   r   rI   rJ   )r*   active_layout_block_records     r   get_active_layout_keyLayouts.get_active_layout_key  s2     &*XX%;%;%?%?@Q%R")--444r   c                   [        U[        5      (       d   [        U5      5       e[        U5      [        :X  a  [        S5      eU R                  U5      nU R                  5       nX2R                  :X  a  gU R                  R                  nUR                  nUR                  [        [        5        UR                  U[        5        UR                  [        U5        g)z.Set layout `name` as active paperspace layout.z(Can not set model space as active layoutN)r;   r<   r=   r   r   r	   rz   r   r   r&   ri   r|   rename_blockr   r   )r*   r   new_active_layoutold_active_layout_keyri   new_active_paper_space_names         r   set_active_layoutLayouts.set_active_layout  s    $$$0d4j0$t9 JKK HHTN $ : : < $@$@@&7&I&I#-/CD79JK02MNr   c                   [        U[        5      (       d   [        U5      5       e[        U5      [        :X  a  [        S5      eU R                  U5      n[        U 5      S:  a  [        S5      eUR                  U R                  5       :X  a;  U R                   H+  nU[        U5      [        4;  d  M  U R                  U5          O   U R                  U5        UR                  5         g)a,  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	   rz   r6   r   r   r'   r   rQ   destroy)r*   r   rL   rX   s       r   deleteLayouts.delete0  s     $$$0d4j0$t9 CDD$t9q= HII : : <<#}}s4y%&88**;7	  -
 	fr   c                p    U  H&  nUR                   (       d  M  [        [        U5      s  $    [        S5      e)z%Returns the active paperspace layout.z"No active paperspace layout found.)is_active_paperspacer   r   r
   r   s     r   active_layoutLayouts.active_layoutM  s3    F***J//    DEEr   c           	     r   SSK Jn  UR                  nS UR                   5       nU Hj  nUR                  R                  S5      nX`;  d  M%  UR                  UR                  S[        U5       SU S3S9  UR                  R                  U5        Ml     UR                   Vs1 s HS  nUR                  R                  R                  5       R                  S	5      (       d  M=  UR                  R                  iMU     nnU R                  R!                  5        Vs1 s H8  n[#        UR                  5      [$        :w  d  M"  UR                  R&                  iM:     n	nUR)                  U	5      n
[+        U
5      (       a  U
 H  nUR,                  R                  U5      nUR                  R                  S5      nUR                  UR.                  S
[        U5       SU S3S9  XcR0                  ;   a  UR0                  R3                  USS9  M  UR                  R5                  U5        M     g g s  snf s  snf )Nr   )
AuditErrorc              3  P   #    U  H  oR                  5       S :X  d  M  Uv   M     g7f)r   N)dxftype).0os     r   	<genexpr> Layouts.audit.<locals>.<genexpr>Z  s     EkYY[H-D11ks   &	&r   zRemoved orphaned z "")codemessagez*paper_spacezRemoved orphaned layout F)safe)ezdxf.auditr   r&   r   rI   rz   fixed_errorORPHANED_LAYOUT_ENTITYr<   delete_entityr   r   lower
startswithrJ   r'   rC   r   r   r   
differencer6   r   (ORPHANED_PAPER_SPACE_BLOCK_RECORD_ENTITYri   delete_blockremove)r*   auditorr   r&   r2   rL   r   brpsp_br_handlespsp_layout_br_handlesmismatchrJ   s               r   auditLayouts.auditT  s   *kk FckkEF::>>&)D###::/F}BtfAF $  ))&1  ''
'vv{{  "--n= BFFMM' 	 
 --..0!
06;;5( +FJJ**0 	 !

 ",,-BCx=="\\%%f-vvzz&)###LL6s2wir$qI $  ::%JJ++Du+=%%,,T2 # 

!
s   $<H/$H/!H4H4)r)   r'   r&   )r&   r   )returnint)r   r<   r   bool)r   zIterator[Layout])r   r<   rL   r   )rL   r   )rL   r   r   None)r   r<   rf   r<   r]   ro   r   r   )r   r<   rG   )r   r<   r   r   )r&   z	'Drawing'r   z	'Layouts')r   r<   r|   r<   rU   r   r   r   )rU   r   r   z'Layout')r   r   )r   r   )r   z	list[str])r   zOptional[str]r   r   )r   r<   r   r<   r   r   )r   r   r   r   )r   r<   r   r   )r   r<   r   r   )r   r   )r   r   )#__name__
__module____qualname____firstlineno__r+   classmethodr3   r8   r?   rD   rM   rQ   rY   r.   r/   r^   rk   re   rw   rv   r{   ru   r   r   rz   r   r   r   r   r   r   r   r   r   __static_attributes__ r   r   r"   r"       s    
  "
*
,-%
	.

(> 
 
B$.3B	(+678-"5O$:F'3r   r"   )r   r<   r   r<   )#
__future__r   typingr   r   r   r   loggingezdxf.lldxf.constr   r	   r
   r   r   r   ezdxf.lldxf.validatorr   rL   r   r   r   ezdxf.entitiesr   r   r   r   ezdxf.documentr   r   r   	getLoggerr   r   r   r"   r   r   r   <module>r      si    # : :  K K 
 6 2 2 1#&4			7	#
 	G[3 [3r   