
    'j                    l   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Zd dlZd dlmZmZ d dlmZmZmZmZmZmZmZ d dlmZmZmZ d dlmZm Z  d d	l!m"Z"m#Z#m$Z$ d d
l%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- d dl.m/Z/ d dl0m1Z1m2Z2 d dl3m4Z4m5Z5m6Z6m7Z7m8Z8 ddl9m:Z: ddl;m<Z<m=Z= ddl>m?Z?m@Z@ ddlAmBZB ddlCmDZD er&d dlEmFZF d dlGmHZH d dlImJZJmKZK d dlLmMZM d dlNmOZO d dlPmQZQ g dZR ejS        d          ZTdZU edi d eeejV        dd !          d" ed#ejW        e*$          d% ed&d'ejX        e(          d) ed*d+,          d- ed.d/0          d1 ed2d ejY        dd#          e(          d3 ed4dd+ ejZ        h d5          e6          d7 ed8d9d+ej[        :          d; ed<ejW        e+d+ej\        e=          d> ed?ejW        e,d+ej\        e=          d@ edAd+,          dB edCd+,          dD edEd d+F          dG edHdd+ ejZ        ddIh          e6          dJ edKdd+ ej]        dLdM           ej^        dLdM          6          dN edOd/0          dP edQd/ ej_        eU           ej`        eU          R           edSd/eja        T           edUd/0           edVd/0           edWd/0          dX          Zb eeb          Zc G dY dZejd                  Ze G d[ d\          ZfdtdbZgdudeZhdvdgZidwdiZjdxdlZkdydmZle:jm         G dn doe?                      ZndzdsZodS ){    )annotations)TYPE_CHECKINGUnionIterableIteratorOptionalCallablecast)SelfN)const	validator)DXFAttrDXFAttributesDefSubclassXTypeRETURN_DEFAULTgroup_code_mappingVIRTUAL_TAG)SUBCLASS_MARKERDXF2000DXF2018)DXFTagdxftag)Tags(find_begin_and_end_of_encoded_xdata_tagsNotFoundException)Vec3Matrix44OCSUCSNULLVECZ_AXISX_AXISUVec)transform_extrusion)rgb2intRGB)split_mtext_stringescape_dxf_line_endingsfast_plain_mtextplain_mtextscale_mtext_inline_commands   )factory)
base_classSubclassProcessor)
DXFGraphicacdb_entity)XData)default_copy)Auditor)Drawing)DXFNamespace	DXFEntity)AbstractTagWriter)EntityDB)xref)MTextMTextColumns
ColumnType
acdb_mtextacdb_mtext_group_codesexport_mtext_contentezdxf   	AcDbMTexttext	_get_text	_set_text)xtypegettersetterinsert
   )rH   defaultchar_height(   g      @)rM   r   fixerwidth)   T)optionaldefined_height.   AC1021)
dxfversionattachment_pointG   flow_directionH   >   r-         )rM   rS   r   rP   style   Standard)rM   rS   r   	extrusion   )rH   rM   rS   r   rP   text_direction   
rect_width*   rect_height+   rotation2   )rM   rS   line_spacing_styleI      line_spacing_factor,   g      ?g      @box_fill_scale-   bg_fillZ   )rW   r   rP   ?   )rW   r   i  i  i  )bg_fill_colorbg_fill_true_colorbg_fill_color_namebg_fill_transparencyc                      e Zd ZdZdZdZdS )r>   r   r-   rm   N)__name__
__module____qualname__NONESTATICDYNAMIC     N/DATA/AppData/hermes/venv/lib/python3.11/site-packages/ezdxf/entities/mtext.pyr>   r>      s        DFGGGr   r>   c                      e Zd ZdZd'dZd(dZd(dZed)d            Zed)d            Z	ed*d            Z
d Zd Zed+d            Zed+d            Zd,dZd-d.dZd/d!Zd/d"Zd0d$Zd/d%Zd&S )1r=   a  The column count is not stored explicit in the columns definition for
    DXF versions R2018+.

    If column_type is DYNAMIC and auto_height is True the column
    count is defined by the content. The exact calculation of the column count
    requires an accurate rendering of the MTEXT content like AutoCAD does!

    If the column count is not defined, ezdxf tries to calculate the column
    count from total_width, width and gutter_width, if these attributes are set
    properly.

    returnNonec                    t           j        | _        d| _        d| _        d| _        d| _        d| _        d| _        d| _	        d| _
        d | _        g | _        g | _        d S )Nr-   F        )r>   r~   column_typecountauto_heightreversed_column_flowrT   rQ   gutter_widthtotal_widthtotal_heightlinked_handleslinked_columnsheightsselfs    r   __init__zMTextColumns.__init__   sh    '1'8
 
!&*/!%(
#&"%#&37+-$&r   c                Z    |                                  }d | j        D             |_        |S )Nc                6    g | ]}|                                 S r   )copy).0mtexts     r   
<listcomp>z*MTextColumns.deep_copy.<locals>.<listcomp>
  s     !P!P!P5%**,,!P!P!Pr   )shallow_copyr   r   columnss     r   	deep_copyzMTextColumns.deep_copy  s1    ##%%!P!PD<O!P!P!Pr   c                ^   t                      }| j        |_        | j        |_        | j        |_        | j        |_        | j        |_        | j        |_        | j        |_        | j        |_        | j	        |_	        t          | j                  |_        t          | j                  |_        |S N)r=   r   r   r   r   rT   rQ   r   r   r   listr   r   r   s     r   r   zMTextColumns.shallow_copy  s    ..
".".'+'@$!%!4
#0".#0!%d&9!:!:t|,,r   r   intrQ   floatr   heightc                ,    |             }t           j        |_        t          |          |_        t          |          |_        t          |          |_        t          |          |_        |	                                 |
                                 |S r   )r>   r~   r   r   r   r   rQ   r   rT   update_total_widthupdate_total_heightclsr   rQ   r   r   r   s         r   new_static_columnszMTextColumns.new_static_columns  s{     #%%(/E

e$\22!&v""$$$##%%%r   c                :    |             }t           j        |_        d|_        t	          |          |_        t          |          |_        t          |          |_        t          |          |_	        |
                                 |                                 |S )NT)r>   r   r   r   r   r   r   rQ   r   rT   r   r   r   s         r   new_dynamic_auto_height_columnsz,MTextColumns.new_dynamic_auto_height_columns*  s     #%%(0"E

e$\22!&v""$$$##%%%r   r   Iterable[float]c                R    |             }t           j        |_        d|_        t	          |          |_        t	          |          |_        d|_        t          |          |_	        t          |j	                  |_        |                                 |                                 |S )NFr   )r>   r   r   r   r   rQ   r   rT   r   r   lenr   r   r   )r   rQ   r   r   r   s        r   !new_dynamic_manual_height_columnsz.MTextColumns.new_dynamic_manual_height_columns9  s     #%%(0#e$\22!$w--GO,,""$$$##%%%r   c                l    | j         }|dk    r|| j        z  |dz
  | j        z  z   | _        d S d| _        d S )Nr   r-   r   )r   rQ   r   r   )r   r   s     r   r   zMTextColumns.update_total_widthI  sF    
199$tz1UQY$BS4SSD"Dr   c                b    | j         rt          | j                  | _        d S | j        | _        d S r   )has_dynamic_manual_heightmaxr   r   rT   r   s    r   r   z MTextColumns.update_total_heightP  s6    ) 	4 #DL 1 1D $ 3Dr   boolc                :    | j         t          j        k    o| j        S r   r   r>   r   r   r   s    r   has_dynamic_auto_heightz$MTextColumns.has_dynamic_auto_heightV  s    :#55J$:JJr   c                <    | j         t          j        k    o| j         S r   r   r   s    r   r   z&MTextColumns.has_dynamic_manual_heightZ  s    :#55Nd>N:NNr   docr6   c                D   |j         t          k    s| j        sd S |j        }|
J d            g }| j        D ][}t	          d|                    |                    }|r|                    |           =t                              d| d           \d | _        || _	        d S )Nzentity database not initializedr<   zLinked MTEXT column #z does not exist.)
rW   r   r   entitydbr
   getappendloggerdebugr   )r   r   dbr   handler   s         r   link_columnszMTextColumns.link_columns^  s    >W$$D,?$F\~~@~~~) 	O 	OF"&&..11E O%%e,,,,MVMMMNNNN",r   r-   mr   hscalevscalec                   | xj         |z  c_         | xj        |z  c_        | xj        |z  c_        | xj        z  c_        | xj        z  c_        fd| j        D             | _        | j        D ]}|                    |           d S )Nc                    g | ]}|z  S r   r   )r   hr   s     r   r   z*MTextColumns.transform.<locals>.<listcomp>t  s    999qF
999r   )rQ   r   r   r   rT   r   r   	transform)r   r   r   r   r   s      ` r   r   zMTextColumns.transformn  s    

f

V#F"V#v%9999DL999( 	 	EOOA	 	r   r   c                Z   t          t          dd          t          dd          t          dt          | j                            t          dd          t          dt          | j                            t          dd          t          d| j                  t          dd          t          dt          | j                            t          dd          t          d	| j                  t          dd
          t          d	| j                  g          }| j	        ri|
                    t          dd          t          dt          | j                            g           |
                    d | j        D                        |                    t          dd                     |S )N  ACAD_MTEXT_COLUMN_INFO_BEGIN.  K   O   L   N   0     1   rj   c              3  6   K   | ]}t          d |          V  dS )r   Nr   )r   r   s     r   	<genexpr>z<MTextColumns.acad_mtext_column_info_xdata.<locals>.<genexpr>  s,      HHtV,,HHHHHHr   ACAD_MTEXT_COLUMN_INFO_END)r   r   r   r   r   r   r   rQ   r   r   extendr   r   r   r   tagss     r   acad_mtext_column_info_xdataz)MTextColumns.acad_mtext_column_info_xdatax  sp   t;<<tR  tS!12233tR  tS!12233tR  tTZ((tR  tS!:;;<<tR  tTZ((tR  tT.//
 
" ) 	IKKb))6$DL8I8I+J+JKLLLKKHH4<HHHHHHF4!=>>???r   c                0   t          t          dd          t          dd          t          d| j                  g          }|                    d |                                 D                        |                    t          dd                     |S )Nr   ACAD_MTEXT_COLUMNS_BEGINr   /   c              3  6   K   | ]}t          d |          V  dS )  Nr   )r   r   s     r   r   z8MTextColumns.acad_mtext_columns_xdata.<locals>.<genexpr>  s=       
 
%+F4  
 
 
 
 
 
r   ACAD_MTEXT_COLUMNS_END)r   r   r   r   mtext_handlesr   r   s     r   acad_mtext_columns_xdataz%MTextColumns.acad_mtext_columns_xdata  s    t788tR  tTZ((
 
 	 
 
/3/A/A/C/C
 
 
 	
 	
 	
 	F4!9::;;;r   	list[str]c                    | j         r| j         S g }| j        D ]T}|j        r8|j        j        }|t          j        d          |                    |           At          j        d          |S )z+Returns a list of all linked MTEXT handles.N"Linked MTEXT column has no handle.zLinked MTEXT column deleted!)r   r   is_alivedxfr   r   DXFStructureErrorr   )r   handlescolumnr   s       r   r   zMTextColumns.mtext_handles  s     	'&&) 	N 	NF N*>12VWWWv&&&&-.LMMMr   c           	         t          t          dd          t          dd          t          d| j                  t          dd          g          S )Nr   ACAD_MTEXT_DEFINED_HEIGHT_BEGINr   rU   r   ACAD_MTEXT_DEFINED_HEIGHT_END)r   r   rT   r   s    r   acad_mtext_defined_height_xdataz,MTextColumns.acad_mtext_defined_height_xdata  sR    t>??tR  tT011t<==	
 
 	
r   Nr   r   )r   r=   )
r   r   rQ   r   r   r   r   r   r   r=   )rQ   r   r   r   r   r   r   r=   r   r   )r   r6   )r-   r-   )r   r   r   r   r   r   )r   r   )r   r   )rz   r{   r|   __doc__r   r   r   classmethodr   r   r   r   r   propertyr   r   r   r   r   r   r   r   r   r   r   r=   r=      s        ' ' ' '*   
       [    [    [# # #4 4 4 K K K XK O O O XO- - - -        0      
 
 
 
 
 
r   r=   r   r7   embedded_objr   r   c                   t                      }|                     d          }|                     d          }|                     d          }|D ]2\  }}|dk    r,|*t          |          | _        |                     d           8|dk    r|t          |          | _        U|dk    r
||| _        e|dk    r||_        || _        z|d	k    r||_        |d
k    r||_	        |dk    r||_        |dk    r||_
        |dk    rt          |          |_        |dk    r||_        |dk    rt          |          |_        |dk    rt          |          |_        |dk    r|j                            |           4|j        dk    r||j        rt'          |j                  |_        n[|j        dk    rP|j
        }t)          |j        |z             }	|	dk    r,t+          t-          |j        |z   |	z                      |_        |S )NrK   rc   rQ   rL   ri   rd   rO   rR   rf   rh   ro   rq   rY   r[   rl   J   rU   r   ư>)r=   r   r   rc   discardrK   rQ   rT   r   r   r   r>   r   r   r   r   r   r   r   r   absr   round)
r   r   r   rK   rc   reference_column_widthcodevaluegwgs
             r   !load_columns_from_embedded_objectr    s1    nnGWWXFWW-..N WWW--# %* %*e2::.0!%eCKK
####RZZFNeCJJRZZ2:CIIRZZ%*G"!&CRZZ"'GRZZ#(G  RZZ!GMMRZZ#(G  RZZ",U"3"3GRZZ "GMMRZZ"&u++GRZZ+/;;G((RZZO""5))) }? 	K00GMM 1$$$AW]Q&''BDyy #E7+>+Bb*H$I$I J JNr   r   Optional[MTextColumns]c                l   	 t          d|           \  }}n# t          $ r Y d S w xY wt                      }d}d }| |dz   |         D ]\  }}|rB|dk    r |j                            |           |dz  }-t
                              d           d}||}N|dk    rt          |          |_        n|dk    rt          |          |_
        ng|dk    rt          |          |_        nL|d	k    rt          |          |_        n1|d
k    r||_        n#|dk    r||_        n|dk    rt          |          }d }|S )NACAD_MTEXT_COLUMN_INFOr   r-   r   z&missing column heights in MTEXT entityr   r   r   r   r   r   rj   )r   r   r=   r   r   r   errorr>   r   r   r   r   r   r   rQ   r   )r   startendr   height_count
group_coder   r   s           r   load_mtext_column_infor    s   =$d
 

ss    ttnnGLJEAIO,  e 	!t||&&u---!EFFF J",U"3"3G2"&u++G2JJGMM2+/;;G((2!GMM2#(G  2u::L

Ns    
$$r   c                    g }	 t          d|           \  }}n# t          $ r |cY S w xY w| ||         D ] \  }}|dk    r|                    |           !|S )NACAD_MTEXT_COLUMNSr   )r   r   r   )r   r   r  r	  r   r   s         r    load_mtext_linked_column_handlesr    s    G= $
 

ss    E#I " "e4<<NN5!!!N    ''r   c                    d}	 t          d|           \  }}n# t          $ r |cY S w xY w| ||         D ]\  }}|dk    r|}|S )Nr   ACAD_MTEXT_DEFINED_HEIGHTr   )r   r   )r   r   r  r	  r   r   s         r   load_mtext_defined_heightr  ,  s     F='
 

ss     E#I  e4<<FMr  xdatar3   c                   d|v r|                     d          }nd S d|                      d           d}	 t          |          }n3# t          j        $ r! t                              d|            Y d S w xY w|d S 	 t          |          |_        n2# t          j        $ r  t                              d|            Y nw xY w|                                 |j	        rt          |j	                  |_        nT	 t          |          |_        n2# t          j        $ r  t                              d|            Y nw xY w|j        |_        |S )NACADzMTEXT(#r   )z"Invalid ACAD_MTEXT_COLUMN_INFO in zInvalid ACAD_MTEXT_COLUMNS in z%Invalid ACAD_MTEXT_DEFINED_HEIGHT in )r   r  r   r   r   r  r  r   r   r   r   r   r  rT   )r   r  acadnamer   s        r   load_columns_from_xdatar  E  s    yy  t)SWWX&&)))D(.."   @$@@AAAtt t>!A$!G!G" > > ><d<<=====>     	6  #7?33	I%>t%D%DG""& 	I 	I 	ILLGGGHHHHH	I&5Ns5   A ,A76A7?B ,CC<D ,E ?E c                @   g }d| v r|                      d          }n|S 	 t          d|          \  }}n# t          $ r |cY S w xY w|||         D ] \  }}|dk    r|                    |           !|||= t	          |          dk     r|                     d           |S )Nr  ACAD_MTEXT_TEXT_BORDERSr   rm   )r   r   r   r   r   r   )r  r   r  r  r	  r   r   s          r    extract_mtext_text_frame_handlesr  k  s     Gyy  =%t
 

ss     E#I " "e4<<NN5!!! 	U3Y
4yy1}}fNs   4 AAc                      e Zd ZdZdZ eeee          Z	e
Zdb fdZd Zd Zedcd	            Zeddd            ZefdedZ	 dfdg fdZdh fdZdidZdj fdZdj fdZdkd Zdld!Zdld"Zd# Zd$ Zd% Zdmd'Zdnd)Z 	 	 dodpd0Z!	 	 dqdrd6Z"dsd9Z#e#Z$dtd;Z%d< Z&dud>Z'dvdAZ(dwdxdDZ)dydxdEZ*dzdFZ+d{ fdIZ,db fdJZ-d|dMZ.d}dPZ/dyd~dTZ0dbdUZ1dfd fdXZ2ddZZ3d fd]Z4d fdaZ5 xZ6S )r<   zDXF MTEXT entityMTEXTr   r   c                d    t                                                       d| _        d | _        d S )N )superr   rE   _columns)r   	__class__s    r   r   zMText.__init__  s+    	04r   c                    | j         S )a#  Getter for virtual Mtext.dxf.text attribute.

        The MText content is stored in multiple tags (1, 3, 3, ...) and cannot
        be supported as a simple DXF tag. The virtual MText.dxf.text attribute
        adds compatibility to other text based entities: TEXT, ATTRIB, ATTDEF

        rE   r   s    r   rF   zMText._get_text  s     yr   c                .    t          |          | _        dS )z,Setter for virtual Mtext.dxf.text attribute.N)strrE   )r   r   s     r   rG   zMText._set_text  s    JJ			r   r  c                F    | j         r| j                                         ndS )z+Returns a copy of the column configuration.N)r#  r   r   s    r   r   zMText.columns  s$    
 04}Ft}))+++$Fr   r   c                    | j         d uS r   )r#  r   s    r   has_columnszMText.has_columns  s    }D((r   entityr   c                    t          |t                    sJ | j        |_        | j        r | j                                        |_        d S d S r   )
isinstancer<   rE   r+  r#  r   )r   r,  copy_strategys      r   	copy_datazMText.copy_data  sO    &%(((((i 	8"m5577FOOO	8 	8r   N	processorOptional[SubclassProcessor]r7   c                   t                                          |          }|r|                    d          }|rt          |                     |                    }|                    |t          |d           |j        r#|j        d         }t          ||          | _	        n?| j
        rt          || j
                  | _	        nt          j        d|j         d          |S )Nrm   T)subclassrecoverr   z'missing 'AcDbMText' subclass in MTEXT(#r  )r"  load_dxf_attribssubclass_by_indexr   load_mtext_contentfast_load_dxfattribsr@   embedded_objectsr  r#  r  r  r   r   r   )r   r1  r   r   objr$  s        r   r6  zMText.load_dxf_attribs  s     gg&&y11 	..q11D D33D99::../$ /    - M#4Q7C$Ec3$O$ODMMZ M$;C$L$LDM-KcjKKK   
r   r   r6   Optional[Callable]c                      fd} fd}t                                                      j        r
 |              j        r j                                       |S d S )Nc                     j         } | rBt          j                  D ]/}|                     |          }|r|                                 .d S d S r   )r   r  r  r   destroy)r   r   
text_framer   r   s      r   destroy_text_frame_entityz7MText.post_load_hook.<locals>.destroy_text_frame_entity  sk    |H ->tzJJ - -F!)f!5!5J! -"**,,,	- -- -r   c                                                      } | &j        j        D ]}|                     |           dS j        j        D ]}d|j        _        dS )z1Unlinked MTEXT entities from layout entity space.N)
get_layoutr#  r   unlink_entityr   owner)layoutr   r   s     r    unlink_mtext_columns_from_layoutz>MText.post_load_hook.<locals>.unlink_mtext_columns_from_layout  sx    __&&F!!]9 0 0E((////0 0 "]9 + +E&*EIOO+ +r   )r"  post_load_hookr  r+  r#  r   )r   r   rA  rG  r$  s   ``  r   rH  zMText.post_load_hook  s    	- 	- 	- 	- 	- 	-	+ 	+ 	+ 	+ 	+ 	s###: 	(%%''' 	4 M&&s+++33tr   	tagwriterr9   c                   | j         }|r|j        t          j        k     r|j        t          |j                  dz   k    r*t                              t          |            d           t          d |j        D                       s,t                              t          |            d           dS |                                  dS )zPre requirement check and pre-processing for export.

        Returns False if MTEXT should not be exported at all.

        (internal API)
        r-   z,: column count does not match linked columnsc              3  $   K   | ]}|j         V  d S r   )r   )r   r   s     r   r   z*MText.preprocess_export.<locals>.<genexpr>  s$      LL6vLLLLLLr   z#: contains destroyed linked columnsFT)r#  rW   r   r   r   r   r   r   r   r(  all%sync_common_attribs_of_linked_columns)r   rI  r   s      r   preprocess_exportzMText.preprocess_export  s     - 	9y+em;;}G$: ; ;a ???D		WWWXXXLLW5KLLLLL D		NNNOOOu66888tr   c                    t                                          |           | j        r,|j        t          j        k     r|                     |           d S d S d S r   )r"  
export_dxfr+  rW   r   r   export_linked_entities)r   rI  r$  s     r   rP  zMText.export_dxf  s_    9%%% 	3	 4u} D D''	22222	3 	3 D Dr   c                   t                                          |           |                    t          t          j                   | j                            |g d           t          | j	        |           | j                            |g d           | j
        }||j        t          j        k    rdS |j        t          k    r|                     |           dS |                                  |                                  dS )z(Export entity specific data as DXF tags.)rK   rN   rQ   rT   rX   rZ   )r^   ra   rc   re   rg   ri   rk   rn   rp   rr   ru   rv   rw   rx   N)r"  export_entity
write_tag2r   r?   r  r   export_dxf_attribsrA   rE   r#  r   r>   r}   rW   r   export_embedded_objectset_column_xdataset_linked_columns_xdata)r   rI  r   r$  s      r   rS  zMText.export_entity  s   i(((_jo>>>##  
	
 
	
 
	
 	TY	222##  	
 	
 	
& -?g1Z_DDF7**''	22222!!###))+++++r   r   r   Iterator[DXFTag]c              #    K   d}g }|D ]?}|j         dk    r|j        }|j         dk    r|                    |j                   ;|V  @|                    |           t          d                    |                    | _        d S )Nr!  r-   r\   )r   r   r   r)   joinrE   )r   r   tailpartstags        r   r8  zMText.load_mtext_content/  s       	 	Cx1}}yQSY''''				T+BGGENN;;			r   c                   | j         }| j        }|J |                    dd           |                    dd           |                    t	          d|j                             |                    t	          d|j                             |                    d|j                   |                    d|j                   |                    d	|j	                   |                    d
|j
                   |                    dt          |j                             |j        rd}n|j        }|                    d|           |                    d|j                   |                    d|j                   |                    dt          |j                             |                    dt          |j                             |j        D ]}|                    d|           d S )Ne   zEmbedded ObjectF   r-   rL   rd   rO   rR   rf   rh   rY   r   r[   ro   rq   rl   r   rU   )r   r#  rT  	write_tagr   rc   rK   rQ   rT   r   r   r   r   r   r   r   r   r   r   )r   rI  r   colsr   r   s         r   rV  zMText.export_embedded_object<  s   h}S"3444R###F2s'9::;;;F2sz22333R+++R!4555R!1222R!2333RT%5!6!6777' 	EEJER'''R,,,R!2333RT%5!6!6777RT%>!?!?@@@l 	- 	-F  V,,,,	- 	-r   c                    | j         j        D ]7}|j        j        t	          j        d          |                    |           8d S )Nr   )r#  r   r   r   r   r   rP  )r   rI  r   s      r   rQ  zMText.export_linked_entitiesX  sT    ]1 	( 	(Ey'-.RSSSY''''		( 	(r   c                ~    |                      h d          }| j        j        D ]}|                    |           d S )N>   r   rK   re   rg   drop)
dxfattribsr#  r   update_dxf_attribs)r   common_attribsr   s      r   rM  z+MText.sync_common_attribs_of_linked_columns_  sZ    BBB ) 
 
 ]1 	5 	5E$$^4444	5 	5r   c                ~   | j         t                      | _         | j        }|                                }|                    |                                           |j        s'|                    |                                           | j         }|                    d           |	                    d|           d S Nr  )
r  r3   r#  r   r   r   r   r   r   add)r   rc  r  r  s       r   rW  zMText.set_column_xdataf  s    :DJ}0022D1133444- 	@KK<<>>???
 	f		&$r   c                    | j         }|j        D ]}|                    d           |j        s4|                                }|j        D ]}|                    d|           d S d S rl  )r#  r   discard_xdatar   r   	set_xdata)r   rc  r   r   s       r   rX  zMText.set_linked_columns_xdatau  s    }) 	) 	)F  ((((- 	/7799D- / /  ....	/ 	// /r   r   c                    | j                             d          rB| j         j        }t          j        |d         |d                   }t          j        |          }n| j                             dd          }|S )z%Returns the text rotation in degrees.rc   r-   r   ri   )r   hasattrrc   mathatan2degreesr   )r   vectorradiansri   s       r   get_rotationzMText.get_rotation~  si    8,-- 	3X,FjF1I66G|G,,HHx||J22Hr   anglec                R    | j                             d           || j         _        | S )zSets the attribute :attr:`rotation` to `angle` (in degrees) and deletes
        :attr:`dxf.text_direction` if present.
        rc   )r   r   ri   )r   ry  s     r   set_rotationzMText.set_rotation  s*    
 	)***!r   rK   r$   ri   Optional[float]rX   Optional[int]c                    t          |          | j        _        ||                     |           ||| j        _        | S )zSets the attributes :attr:`dxf.insert`, :attr:`dxf.rotation` and
        :attr:`dxf.attachment_point`, ``None`` for :attr:`dxf.rotation` or
        :attr:`dxf.attachment_point` preserves the existing value.

        )r   r   rK   r{  rX   )r   rK   ri   rX   s       r   set_locationzMText.set_location  sB     v,,h''''(8DH%r         ?FcolorUnion[int, str, RGB, None]scalec                B   d|cxk    rdk    rn n|| j         _        nt          d          |rt          j        nd}|| j                             d           | j                             d           | j                             d           | j                             d	           | j                             d
           |rd| j         _        n|dk    r&t          j        |z  | j         _        d| j         _        nt          j	        |z  | j         _        t          |t                    r|| j         _        nht          |t                    rd| j         _        || j         _        n:t          |t                    r%d| j         _        t          |          | j         _        | S )a  Sets the background color as :ref:`ACI` value, as name string or as
        (r, g, b) tuple.

        Use the special color name ``canvas``, to set the background color to the canvas
        background color.  Remove the background filling by setting argument `color` to
        ``None``.

        Args:
            color: color as :ref:`ACI`, string, (r, g, b) tuple or ``None``
            scale: determines how much border there is around the text, the
                value is based on the text height, and should be in the range
                of [1, 5], where 1 fits exact the MText entity.
            text_frame: draw a text frame in text color if ``True``

        r-   r]   z.argument scale has to be in range from 1 to 5.r   Nrr   rp   ru   rv   rw      canvas)r   rp   
ValueErrorr   MTEXT_TEXT_FRAMEr   rr   MTEXT_BG_CANVAS_COLORru   MTEXT_BG_COLORr.  r   r(  rw   tupler&   rv   )r   r  r  r@  s       r   set_bg_colorzMText.set_bg_color  s   * ?????????&+DH##MNNN/9@U++q
=HY'''H-...H_---H1222H1222 &#% h$:ZGDH%&DH""$3j@DH%%% =).&&E3'' =)*&.3++E5)) =)*&.5enn+r   rE   r(  c                &    | xj         |z  c_         | S )z;Append `text` to existing content (:attr:`text` attribute).r&  )r   rE   s     r   __iadd__zMText.__iadd__  s    		T		r   r   c                    | j         }|                    d          r|j        S |                    d          r>t          |j                                      t          j        |j                            S t          S )zReturns the horizontal text direction as :class:`~ezdxf.math.Vec3`
        object, even if only the text rotation is defined.

        rc   ri   )
r   rr  rc   r   ra   to_wcsr   from_deg_angleri   r#   r   r   s     r   get_text_directionzMText.get_text_direction  sp    
 h;;'(( 	&%%;;z"" 	P s}%%,,T-@-N-NOOOr   c                    | j         }|                    d          rE|                    d          s|                                 |_        |                    d           dS dS )zDConvert text rotation into text direction and discard text rotation.ri   rc   N)r   rr  r  rc   r   r  s     r   "convert_rotation_to_text_directionz(MText.convert_rotation_to_text_direction  sh    h;;z"" 	$;;/00 ?%)%<%<%>%>"KK
#####	$ 	$r   r    c                l    | j         }t          |j        |                                 |j                  S )zReturns the :class:`~ezdxf.math.UCS` of the :class:`MText` entity,
        defined by the insert location (origin), the text direction or rotation
        (x-axis) and the extrusion vector (z-axis).

        )originuxuz)r   r    rK   r  ra   r  s     r   ucsz	MText.ucs  s;     h:&&((}
 
 
 	
r   r   r   c                   | j         }t          |j                  }t          ||          \  }}|                                  t          |j                  }|                    |          }|                    |          }t          |j	                  }	|
                    |	          }
|                    |
          }|                    |          }|j        t          j        |          z  }||_	        t          j        |	|          s2t!          |	          dk    r||	z  }t#          | j        |          | _        |                    d          r9|
                    |j                  }|                    |          j        |_        |                    |j                  |_        ||_        ||_        | j        rt|                    |
                                          j        }|                    |
                                          j        }| j                            |||           |                     |           | S )z@Transform the MTEXT entity by transformation matrix `m` inplace.g-q=rQ   )r   r   ra   r%   r  rc   transform_directioncrossr   rN   	normalizeangle_between	magnituders  siniscloser   r,   rE   rr  rQ   r   rK   r+  r#  post_transform)r   r   r   old_extrusionnew_extrusion_old_text_directionnew_text_directionold_vertical_directionold_char_heightold_char_height_vecnew_char_height_vecobliquenew_char_heightfactor	width_vecr   r   s                     r   r   zMText.transform  s   hS]++.}a@@q//111!#"455223EFF!.!4!45G!H!H004>>OO334GHH$223FGG-7$(7:K:KK)_o>>	GO$$u,,$6F3DIvFFDI;;w 	C*44SY??I--i88BCI[[,,
/% 	7**+=+G+G+I+IJJTF**+A+K+K+M+MNNXFM##Avv666Ar   TUnion[list[str], str]c                ^    |rt          | j        |          S t          | j        |          S )a  Returns the text content without inline formatting codes.

        The "fast" mode is accurate if the DXF content was created by
        reliable (and newer) CAD applications like AutoCAD or BricsCAD.
        The "accurate" mode is for some rare cases where the content was
        created by older CAD applications or unreliable DXF libraries and CAD
        applications.

        Args:
            split: split content text at line breaks if ``True`` and
                returns a list of strings without line endings
            fast: uses the "fast" mode to extract the plain MTEXT content if
                ``True`` or the "accurate" mode if set to ``False``

        split)r*   rE   r+   )r   r  fasts      r   
plain_textzMText.plain_text)  s6       	7#DIU;;;;ty6666r   c                D      fd} fd}|r
 |            S  |            S )zReturns the text content of all columns without inline formatting
        codes.

        Args:
            split: split content text at line breaks if ``True`` and
                returns a list of strings without line endings

        c                     t          j        d          g} j        r8j        j        D ]+}|                     |                    d                     ,d                    |           S )NFr  r!  )r*   rE   r+  r#  r   r   r  r[  contentcr   s     r   merged_contentz4MText.all_columns_plain_text.<locals>.merged_contentH  sn    '	???@G >5 > >ANN1<<e<#<#<====777###r   c                 :   t          j        d          } j        r|| r | d         dk    r|                                  j        j        D ]M}|                     |                    d                     | r | d         dk    r|                                  N| S )NTr  r!  )r*   rE   r+  popr#  r   r   r  r  s     r   split_contentz3MText.all_columns_plain_text.<locals>.split_contentO  s    &ty===G & "wr{b00KKMMM5 & &ANN1<<d<#;#;<<< &72;"#4#4Nr   r   )r   r  r  r  s   `   r   all_columns_plain_textzMText.all_columns_plain_text>  sY    	$ 	$ 	$ 	$ 	$		 		 		 		 		  	$ =??"!>###r   c                    | j         g}| j        r)| j        j        D ]}|                    |j                    d                    |          S )zsReturns the text content of all columns as a single string
        including the inline formatting codes.

        r!  )rE   r+  r#  r   r   r[  )r   r  r   s      r   all_columns_raw_contentzMText.all_columns_raw_content_  sU    
 9+ 	,-6 , ,v{++++wwwr   auditorr5   c                    | j         sdS | j        j        "t                                          |           n	 |                    |            dS )zValidity check.N)r   r   rE  r"  auditcheck_text_style)r   r  r$  s     r   r  zMText.auditj  sT    } 	F8>%GGMM'""""   &&&&&r   c                    | j         sd S | j        r#| j        j        D ]}|                                 | `t                                                       d S r   )r   r+  r#  r   r?  r"  )r   r   r$  s     r   r?  zMText.destroyw  sc    } 	F 	!-6 ! !    Mr   r   r:   c                    | j         rG| j        rB| j        }| j        j        D ]0}|j         r#|j        r||_        |                    |           -dS dS dS )zsAdd linked columns (MTEXT) entities to entity database `db`,
        called from EntityDB. (internal API)

        N)r   r#  r   r   
is_virtualrm  )r   r   r   r   s       r   add_sub_entities_to_entitydbz"MText.add_sub_entities_to_entitydb  s{    
 = 	#T] 	#(C-6 # #? #v'8 #!$FJFF6NNN	# 	# 	# 	## #r   funcCallable[[DXFEntity], None]c                l    | j         r(| j        r#| j        j        D ]}|j         r ||           dS dS dS )z.Call `func` for linked columns. (internal API)N)r   r#  r   )r   r  r,  s      r   process_sub_entitieszMText.process_sub_entities  s_    = 	!T] 	!-6 ! !? !DLLL	! 	! 	! 	!! !r   r   r=   linkedc                   |j         t          j        k    sJ |j        dk    s
J d            |j        dk    s
J d            |j        dk    s
J d            | j        rt          j        d          || _	        |j        | j
        _        |j        | j
        _        |j        dk     r|j        |_        |j        dk     r|                                 |r|                                  d S d S )Nr   zone or more columns requiredzcolumn width has to be > 0zgutter width has to be >= 0zColumn setup already exist.r   )r   r>   r}   r   rQ   r   r+  r   r   r#  r   rT   r   r   r   _create_linked_columns)r   r   r  s      r   setup_columnszMText.setup_columns  s   "jo5555}q   "@   }q   ">   #q(((*G((( 	I)*GHHH ")"8$&&#*#9G %%&&((( 	*'')))))	* 	*r   c                L   | j         }|                     ddh          }| j        }| j        }|J |                    dt                                }t          j        |                    dd                    }t          |                    d|                    }|                    |j        |j	        z             }|j
        }	t          |j        d	z
            D ]D}
||z  }t                              ||
          }||j         _        |	                    |           EdS )z:Create linked MTEXT columns for DXF versions before R2018.r   rE  rf  NrK   ri   r   rc   r-   )rh  r   )r   rh  r   r#  r   r   r  r  rQ   r   r   ranger   r<   newrK   r   )r   r   attribsr   rc  rK   default_directionrc   offsetr   r  r   s               r   r  zMText._create_linked_columns  s    h//'':/;;h}466** /
A0F0FGGcgg&68IJJKK))$*t7H*HII,tzA~&& 	* 	*AfFYY'sY;;F &FJ!!&))))		* 	*r   otherOptional[Drawing]c                   | j         sd S t                                                       t          |          o| j        j        |j        v }|sd| j        _        | j        r$| j        j	        D ]}|                    |           d S d S )Nr`   )
r   r"  remove_dependenciesr   r   r^   stylesr+  r#  r   )r   r  style_existr   r$  s       r   r  zMText.remove_dependencies  s    } 	F##%%%5kkDdhn&D 	('DHN 	2-6 2 2**51111	2 	22 2r   r   c                    t                      S r   )r   r   s    r   ocsz	MText.ocs  s     uur   registryxref.Registryc                   t                                          |           | j                            d          r|                    | j        j                   | j        r$| j        j        D ]}|                    |           dS dS )z5Register required resources to the resource registry.r^   N)r"  register_resourcesr   rr  add_text_styler^   r#  r   )r   r  r   r$  s      r   r  zMText.register_resources  s    ""8,,,8G$$ 	4##DHN333= 	35 3 3((2222	3 	33 3r   clonemappingxref.ResourceMapperc                   t          |t                    sJ t                                          ||           |j                            d          r)|                    |j        j                  |j        _        | j        rG|j        rBt          | j        j
        |j        j
                  D ]\  }}|                    ||           dS dS dS )z3Translate resources from self to the copied entity.r^   N)r.  r<   r"  map_resourcesr   rr  get_text_styler^   r#  zipr   )r   r  r  col_self	col_cloner$  s        r   r  zMText.map_resources  s    %'''''eW---9W%% 	F%44UY_EEEIO= 	;U^ 	;'*,en.K( ( ; ;#) &&y'::::		; 	; 	; 	;; ;r   r   )r   r  r   )r,  r   r   r   r   )r1  r2  r   r7   )r   r6   r   r<  )rI  r9   r   r   rI  r9   r   r   )r   r   r   rY  )rI  r9   )r   r   )ry  r   r   r<   )NN)rK   r$   ri   r|  rX   r}  r   r<   )r  F)r  r  r  r   )rE   r(  r   r<   )r   r   )r   r    )r   r   r   r<   )FT)r   r  )F)r   r(  )r  r5   )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   )7rz   r{   r|   r   DXFTYPEr   r/   r2   r?   
DXFATTRIBSr   MIN_DXF_VERSION_FOR_EXPORTr   rF   rG   r   r   r+  r4   r0  r6  rH  rN  rP  rS  r8  rV  rQ  rM  rW  rX  rx  r{  r  r  r  r   r  r  r  r   r  r  r  r  r?  r  r  r  r  r  r  r  r  __classcell__)r$  s   @r   r<   r<     s       Gz;
CCJ!(5 5 5 5 5 5     G G G XG ) ) ) X) 5A 8 8 8 8 8 8<      ,     <   $3 3 3 3 3 3+, +, +, +, +, +,Z< < < <- - - -8( ( ( (5 5 5     / / /       %)*.	    * 	1 1 1 1 1f   
 F    $ $ $
 
 
 
% % % %N7 7 7 7 7*$ $ $ $ $B	  	  	  	 
' 
' 
' 
' 
' 
'	 	 	 	 	 	
# 
# 
# 
#! ! ! !* * * * *$* * * *(2 2 2 2 2 2 2   
3 3 3 3 3 3; ; ; ; ; ; ; ; ; ;r   r<   rI  r9   r   c                l   t          |           }t          |d          }t          |          dk    r|                    d           t          |          dk    r<|                    d|                    d                     t          |          dk    <|                    d|d                    d S )N   )sizer   r!  r-   r\   )r)   r(   r   r   rT  r  )rE   rI  txt
str_chunkss       r   rA   rA     s    
!$
'
'C#Cc222J
:!"
j//A

Q
q 1 1222 j//A

JqM*****r   )r   r7   r   r   r   r=   )r   r   r   r  )r   r   r   r   )r   r   r   r   )r   r7   r  r3   r   r  )r  r3   r   r   r  )p
__future__r   typingr   r   r   r   r   r	   r
   typing_extensionsr   enumrs  loggingezdxf.lldxfr   r   ezdxf.lldxf.attributesr   r   r   r   r   r   r   ezdxf.lldxf.constr   r   r   ezdxf.lldxf.typesr   r   ezdxf.lldxf.tagsr   r   r   
ezdxf.mathr   r   r   r    r!   r"   r#   r$   ezdxf.math.transformtoolsr%   ezdxf.colorsr&   r'   ezdxf.tools.textr(   r)   r*   r+   r,   r!  r.   	dxfentityr/   r0   dxfgfxr1   r2   r  r3   r   r4   ezdxf.auditr5   ezdxf.documentr6   ezdxf.entitiesr7   r8   ezdxf.lldxf.tagwriterr9   ezdxf.entitydbr:   rB   r;   __all__	getLoggerr   BG_FILL_MASKcallbackpoint3dis_greater_zerois_in_integer_range	is_one_ofis_valid_table_nameis_not_null_vectoris_in_float_rangefit_into_float_rangeis_valid_bitmaskfix_bitmaskis_valid_aci_colorr?   r@   IntEnumr>   r=   r  r  r  r  r  r  register_entityr<   rA   r   r   r   <module>r      s'   # " " " " "                  # " " " " "    ( ( ( ( ( ( ( (                  @ ? ? ? ? ? ? ? ? ? , , , , , , , ,          O N N N N N N N N N N N N N N N N N N N 9 9 9 9 9 9 % % % % % % % %                    4 4 4 4 4 4 4 4 + + + + + + + +             ######&&&&&&66666666777777''''''   
	7	#	#[G 	.	
 
 
G 	''"EM7CCCG 	ww/ 	
 
 
G$ 	d+++%G( 	''":::)G> 	GG3i3Ar:: 	
 
 
?GT 	'')i))))44 
 
 
UGj 	3	
 
 
kGv 	WW-2 
 
 
wGJ 	''-2 
 
 
KG` 	ggb4000aGd 	wwrD111eGh 	GGBD999iGp 	gg)i)1a&11 
 
 
qGB 	ww1i1$==0)0t<< 
  
  
CGT 	''":::UGf 	770i0>>')'55	
 
 
gGt !2
 
 
 &gch??? &gch??? ' A A AMG G GJ J
V ,+J77        P
 P
 P
 P
 P
 P
 P
 P
f8 8 8 8v( ( ( (V      2# # # #L   : 	Z	; Z	; Z	; Z	; Z	;J Z	; Z	; Z	;z+ + + + + +r   