
    Og):                       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"y)    )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                "    | j                         S )zOAutoCAD uses case-insensitive layout names, but stores the name case-sensitive.)upper)names    Z/var/www/html/public_html/myphp/venv/lib/python3.12/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d#dZ	d$dZ
d%dZd	 Zd
 Zd&dZd'dZd(d)dZed*d       Zd+dZd,dZd-dZd.dZd/dZd0dZd1dZd/dZd2dZd3dZd Zd4dZd4dZd5dZd6dZ y)7Layoutsc                p    || _         i | _        t        d| j                   j                  d         | _        y)z#Default constructor. (internal API)r   ACAD_LAYOUTN)doc_layoutsr   rootdict_dxf_layouts)selfr%   s     r   __init__zLayouts.__init__!   s1    +-(,$((++M:)
r   c                \    t        |      }|j                          |j                          |S )z(Constructor from scratch. (internal API))r"   setup_modelspacesetup_paperspaceclsr%   layoutss      r   setupzLayouts.setup+   s*     #,  "  "r   c                ,    t        | j                        S )zKReturns count of existing layouts, including the modelspace
        layout.)lenr&   r)   s    r   __len__zLayouts.__len__3   s     4==!!r   c                x    t        |t              sJ t        t                     t        |      | j                  v S )z(Returns ``True`` if layout `name` exist.)
isinstancestrtyper   r&   r)   r   s     r   __contains__zLayouts.__contains__8   s.    $$/d3i/$4yDMM))r   c                H    t        | j                  j                               S )z|Returns iterable of all layouts as :class:`~ezdxf.layouts.Layout`
        objects, including the modelspace layout.
        )iterr&   valuesr4   s    r   __iter__zLayouts.__iter__=   s     DMM((*++r   c                    |j                   }||j                  _        | j                  j                  j                  |j                  _        || j                  t        |      <   || j                  |<   y N)
dxf_layoutdxfr   r(   handleownerr&   r   )r)   r   layoutrB   s       r   _add_layoutzLayouts._add_layoutC   sY    &&
"
#0044;;
#)c$i ",$r   c                ~    |j                   }| j                  j                  |       | j                  t	        |      = y rA   )r   r(   discardr&   r   )r)   rF   r   s      r   _discardzLayouts._discardJ   s/    {{!!$'MM#d)$r   c                    d}|j                   j                  }|}|| v r|dz  }|d| dz   }|| v rt        | j                        dz   |j                   _        | j                  ||       y)zAAppend an existing (copied) paperspace layout as last layout tab.r   z ()N)rC   r   r3   r&   taborderrG   )r)   rF   indexbase_layout_namelayout_names        r   append_layoutzLayouts.append_layoutO   ss    !::??&T!QJE*r%]:K T! "$--014

f-r   c                B    | j                  t        dt        ddi       y)z Modelspace setup. (internal API)r    rM   r   
dxfattribsN)_new_specialr   r   r4   s    r   r,   zLayouts.setup_modelspaceZ   s#    !2
A 	 	
r   c                B    | j                  t        dt        ddi       y)z"First layout setup. (internal API)Layout1rM   r   rS   N)rU   r   r   r4   s    r   r-   zLayouts.setup_paperspace`   s#    	#4*a 	 	
r   c                    || j                   v rt        d| d      | j                  j                  j                  |d<   |j                  ||| j                  |      }| j                  ||       |S )NLayout "z" already existsrE   rS   )r&   r	   r(   rC   rD   newr%   rG   )r)   r/   r   
block_namerT   rF   s         r   rU   zLayouts._new_specialf   sn    4== (4&0@ ABB"//33::
7z488
Kv&r   c                d    | j                   j                  }d}d|z  |v r|dz  }d|z  |v rd|z  S )z0Returns a unique paperspace name. (internal API)r   z*Paper_Space%dr   )r%   blocks)r)   r]   counts      r   unique_paperspace_namezLayouts.unique_paperspace_namen   sD    &&0QJE &&0%''r   Nc                   t        |t              sJ t        t                     t        |      st	        d      || v rt	        d| d      t        |xs i       }| j                  j                  j                  |d<   |j                  dt        | j                        dz          | j                         }t        j                  ||| j                  |      }|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.rY   " already exist.rE   rM   r   rS   )r7   r8   r9   r   r	   dictr(   rC   rD   
setdefaultr3   r&   r_   r   rZ   r%   reset_limitsrG   )r)   r   rT   r[   rF   s        r   rZ   zLayouts.newv   s     $$/d3i/$"4( JKK4<(4&0@ ABB**+
"//33::
7j#dmm*<q*@A002
j$((zR 	v&r   c                     | |      }|j                          t        |      dk  r0|j                  dt        d       |j                  dt        d       |S )z0Constructor if loading from file. (internal API)   r    r   )rM   rW   r   )setup_from_rootdictr3   restorer   r   r.   s      r   loadzLayouts.load   sR     c(##% w<!OOG%6OCOOI'81OEr   c                ~    || v ry| j                   j                  j                  |      }| j                  |||       y)zMRestore layout from block if DXFLayout does not exist.
        (internal API)N)r%   r]   get_new_from_block_layout)r)   r   block_record_namerM   block_layouts        r   rh   zLayouts.restore   s9     4<xx**+<=##D,Ar   c                   | j                   j                  j                  ||j                  |d}t	        d| j
                  j                  j                  d|            }t        |      t        k(  r!t        j                  || j
                        }n t        j                  || j
                        }| j                  ||       |S )N)rE   r   block_record_handlerM   r   LAYOUTrS   )r(   rC   rD   rp   r   r%   objects
new_entityr   MODELr   ri   r   rG   )r)   r   rn   rM   rT   rB   rF   s          r   rl   zLayouts._new_from_block_layout   s    &&**11#/#C#C 	

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

 t9__Z:F__Z:Fv&r   c                P   | j                   j                         D ]  \  }}t        |t              rt        j                  d| d| d       3t        |      t        k(  rt        || j                        }nt        || j                        }|| j                  t        |      <    y)z9Setup layout manager from root dictionary. (internal API)zignore missing LAYOUT(#z
) entity ''N)r(   itemsr7   r8   loggerdebugr   rt   r   r%   r   r&   )r)   r   rB   rF   s       r   rg   zLayouts.setup_from_rootdict   s     !% 1 1 7 7 9 		.D**c*6zl*TFRSTU4yE!#J9#J9'-DMM#d)$		.r   c                @    t        t        | j                  d            S )z6Returns the :class:`~ezdxf.layouts.Modelspace` layout.r    )r   r   rk   r4   s    r   
modelspacezLayouts.modelspace   s    J 122r   c                p    | j                   j                         D cg c]  }|j                   c}S c c}w )zNReturns a list of all layout names, all names in original case-sensitive form.)r&   r>   r   r)   rF   s     r   nameszLayouts.names   s'    *.--*>*>*@AAAAs   3c                `    |xs | j                         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   rk   zLayouts.get   s/     2t--/2}}SY''r   c                r   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      | j                  |      }| j                  |       | j                  ||       y)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.rY   ra   " does not exist.N)	r7   r8   r9   r   rt   r	   rk   rJ   rG   )r)   old_namenew_namerF   s       r   renamezLayouts.rename   s     (C(8$x.8((C(8$x.8(x=E! =>>t(8*4D EFF4(8*4E FGG(#f6*r   c                    | j                   j                         D cg c]$  }|j                  j                  |j                  f& }}t        |      D cg c]  \  }}|	 c}}S c c}w c c}}w )zSReturns all layout names in tab order as shown in :term:`CAD`
        applications.)r&   r>   rC   rM   r   sorted)r)   rF   r~   orderr   s        r   r   zLayouts.names_in_taborder   sd     >B]]=Q=Q=S
39VZZ  &++.
 
 )/u666
 7s   )A&A+c                    |j                   j                  }|t        d      | j                  |j                   j                        S )z,Returns the owner layout for a DXF `entity`.z$No associated layout, owner is None.)rC   rE   r   get_layout_by_key)r)   entityrE   s      r   get_layout_for_entityzLayouts.get_layout_for_entity   s=    

  =DEE%%fjj&6&677r   c                   t        |t              sJ t        |             d| d}	 | j                  j                  |   }t        |t              st        |      	 | j                  j                  |j                  j                     }| j                  |j                  j                        S # t
        $ r t        |      w xY w# t
        $ r t        |      w xY w)z4Returns a layout by its `layout_key`. (internal API)zLayout with key "r   )r7   r8   r9   r%   entitydbKeyErrorr   r   rC   rF   rk   r   )r)   
layout_key	error_msgblock_recordrB   s        r   r   zLayouts.get_layout_by_key  s    *c*<D,<<*'
|3DE		)88,,Z8L ,4i((	)**<+;+;+B+BCJ xx
++,,  	)i((	)  	)i((	)s   B/ -C /CCc                    | j                   j                  j                  t              }|j                  j
                  S )zKReturns layout kay for the active paperspace layout.
        (internal API))r%   block_recordsrk   r   rC   rD   )r)   active_layout_block_records     r   get_active_layout_keyzLayouts.get_active_layout_key  s2     &*XX%;%;%?%?@Q%R")--444r   c                   t        |t              sJ t        |             t        |      t        k(  rt        d      | j                  |      }| j                         }||j                  k(  ry| j                  j                  }|j                  }|j                  t        t               |j                  |t               |j                  t        |       y)z.Set layout `name` as active paperspace layout.z(Can not set model space as active layoutN)r7   r8   r9   r   rt   r	   rk   r   r   r%   r]   rm   rename_blockr   r   )r)   r   new_active_layoutold_active_layout_keyr]   new_active_paper_space_names         r   set_active_layoutzLayouts.set_active_layout  s    $$0d4j0$t9 JKK HHTN $ : : < $5$@$@@&7&I&I#-/CD79JK02MNr   c                   t        |t              sJ t        |             t        |      t        k(  rt        d      | j                  |      }t        |       dk  rt        d      |j                  | j                         k(  r7| j                  D ](  }|t        |      t        fvs| j                  |        n | j                  |       |j                          y)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)r7   r8   r9   r   rt   r	   rk   r3   r   r   r&   r   rJ   destroy)r)   r   rF   rP   s       r   deletezLayouts.delete0  s     $$0d4j0$t9 CDD$t9q= HII : : <<#}} s4y%&88**;7	
 	fr   c                b    | D ]   }|j                   st        t        |      c S  t        d      )z%Returns the active paperspace layout.z"No active paperspace layout found.)is_active_paperspacer   r   r
   r}   s     r   active_layoutzLayouts.active_layoutM  s5     	0F**J//	0   DEEr   c           	     J   ddl m} |j                  }d |j                  D        }|D ]j  }|j                  j                  d      }|| vs#|j                  |j                  dt        |       d| d       |j                  j                  |       l |j                  D ch c]K  }|j                  j                  j                         j                  d	      r|j                  j                  M }}| j                  j!                         D ch c]4  }t#        |j                        t$        k7  r|j                  j&                  6 }	}|j)                  |	      }
t+        |
      r|
D ]  }|j,                  j                  |      }|j                  j                  d      }|j                  |j.                  d
t        |       d| d       ||j0                  v r|j0                  j3                  |d       |j                  j5                  |        y y c c}w c c}w )Nr   )
AuditErrorc              3  H   K   | ]  }|j                         d k(  s|  yw)rq   N)dxftype).0os     r   	<genexpr>z Layouts.audit.<locals>.<genexpr>Z  s     EQYY[H-D1Es   ""r   zRemoved orphaned z "")codemessagez*paper_spacezRemoved orphaned layout F)safe)ezdxf.auditr   r%   rr   rC   rk   fixed_errorORPHANED_LAYOUT_ENTITYr8   delete_entityr   r   lower
startswithrD   r&   r>   r   rt   rp   
differencer3   r   (ORPHANED_PAPER_SPACE_BLOCK_RECORD_ENTITYr]   delete_blockremove)r)   auditorr   r%   r0   rF   r   brpsp_br_handlespsp_layout_br_handlesmismatchrD   s               r   auditzLayouts.auditT  s   *kk FckkE 	2F::>>&)D4###::/F}BtfAF $  ))&1	2 ''
vv{{  "--n= FFMM
 
 --..0!
6;;5( JJ**!
 !

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

!
s   #AH9H )r%   r   )returnint)r   r8   r   bool)r   zIterator[Layout])r   r8   rF   r   )rF   r   )rF   r   r   None)r   r8   r[   r8   rT   rb   r   r   )r   r8   rA   )r   r8   r   r   )r%   z	'Drawing'r   z	'Layouts')r   r8   rm   r8   rM   r   r   r   )rM   r   r   z'Layout')r   r   )r   r   )r   z	list[str])r   zOptional[str]r   r   )r   r8   r   r8   r   r   )r   r   r   r   )r   r8   r   r   )r   r8   r   r   )r   r   )r   r   )!__name__
__module____qualname__r*   classmethodr1   r5   r;   r?   rG   rJ   rQ   r,   r-   rU   r_   rZ   ri   rh   rl   rg   r{   r~   rk   r   r   r   r   r   r   r   r   r    r   r   r"   r"       s    
  "
*
,-%
	.

(> 
 
B$.3B	(+678-"5O$:F'3r   r"   )r   r8   r   r8   )#
__future__r   typingr   r   r   r   loggingezdxf.lldxf.constr   r	   r
   r   r   r   ezdxf.lldxf.validatorr   rF   r   r   r   ezdxf.entitiesr   r   r   r   ezdxf.documentr   r   r   	getLoggerrx   r   rt   r"   r   r   r   <module>r      sk    # : :  K K 
 6 2 2 1#&4			7	#
 	G[3 [3r   