
    Og                    b   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j                  d      ZTdZU edi d eeej                  dd !      d" ed#ej                  e*$      d% ed&d'ej                  e(      d) ed*d+,      d- ed.d/0      d1 ed2d ej                  dd#      e(      d3 ed4dd+ ej                  h d5      e6      d7 ed8d9d+ej                  :      d; ed<ej                  e+d+ej                  e=      d> ed?ej                  e,d+ej                  e=      d@ edAd+,      dB edCd+,      dD edEd d+F      dG edHdd+ ej                  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j                  T       edUd/0       edVd/0       edWd/0      dX      Zb eeb      Zc G dY dZej                        Ze G d[ d\      Zf	 	 	 	 	 	 dfd]Zgdgd^Zhdhd_Zidid`ZjdjdaZkdkdbZle:j                   G dc dde?             ZndldeZoy)m    )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y)r>   r   r-   rm   N)__name__
__module____qualname__NONESTATICDYNAMIC     Y/var/www/html/public_html/myphp/venv/lib/python3.12/site-packages/ezdxf/entities/mtext.pyr>   r>      s    DFGr   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ddZddZy)r=   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.

    c                    t         j                  | _        d| _        d| _        d| _        d| _        d| _        d| _        d| _	        d| _
        d | _        g | _        g | _        y )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__   sg    '1'8'8
 
!&*/!%(
#&"%#&37+-$&r   c                    | j                         }| j                  D cg c]  }|j                          c}|_        |S c c}w N)shallow_copyr   copy)r   columnsmtexts      r   	deep_copyzMTextColumns.deep_copy  s:    ##%<@<O<O!P5%**,!P "Qs   A c                   t               }| j                  |_        | j                  |_        | j                  |_        | j                  |_        | j
                  |_        | j                  |_        | j                  |_        | j                  |_        | j                  |_	        t        | j                        |_        t        | j                        |_        |S r   )r=   r   r   r   r   rT   rQ   r   r   r   listr   r   )r   r   s     r   r   zMTextColumns.shallow_copy  s    .

".."..'+'@'@$!%!4!4

#00"..#00!%d&9&9!:t||,r   c                     |        }t         j                  |_        t        |      |_        t        |      |_        t        |      |_        t        |      |_        |j                          |j                          |S r   )r>   r~   r   intr   floatrQ   r   rT   update_total_widthupdate_total_heightclsr   rQ   r   heightr   s         r   new_static_columnszMTextColumns.new_static_columns  se     %(//E
e$\2!&v""$##%r   c                    |        }t         j                  |_        d|_        t	        |      |_        t        |      |_        t        |      |_        t        |      |_	        |j                          |j                          |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*  sm     %(00"E
e$\2!&v""$##%r   c                .    |        }t         j                  |_        d|_        t	        |      |_        t	        |      |_        d|_        t        |      |_	        t        |j                        |_        |j                          |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  sy     %(00#e$\2!$w-GOO,""$##%r   c                    | j                   }|dkD  r(|| j                  z  |dz
  | j                  z  z   | _        y d| _        y )Nr   r-   r   )r   rQ   r   r   )r   r   s     r   r   zMTextColumns.update_total_widthI  s?    

19$tzz1UQY$BSBS4SSD"Dr   c                t    | j                   rt        | j                        | _        y | j                  | _        y r   )has_dynamic_manual_heightmaxr   r   rT   r   s    r   r   z MTextColumns.update_total_heightP  s*    )) #DLL 1D $ 3 3Dr   c                X    | j                   t        j                  k(  xr | j                  S r   r   r>   r   r   r   s    r   has_dynamic_auto_heightz$MTextColumns.has_dynamic_auto_heightV  s$    :#5#55J$:J:JJr   c                Z    | j                   t        j                  k(  xr | j                   S r   r   r   s    r   r   z&MTextColumns.has_dynamic_manual_heightZ  s'    :#5#55Nd>N>N:NNr   c                @   |j                   t        k\  s| j                  sy |j                  }|J d       g }| j                  D ]J  }t	        d|j                  |            }|r|j                  |       2t        j                  d| d       L d | _        || _	        y )Nzentity database not initializedr<   zLinked MTEXT column #z does not exist.)
rW   r   r   entitydbr
   getappendloggerdebugr   )r   docdbr   handler   s         r   link_columnszMTextColumns.link_columns^  s    >>W$D,?,?\\~@@@~)) 	OF"&&.1E%%e,4VH<LMN	O #,r   c                h   | xj                   |z  c_         | xj                  |z  c_        | xj                  |z  c_        | xj                  |z  c_        | xj                  |z  c_        | j
                  D cg c]  }||z  	 c}| _        | j                  D ]  }|j                  |        y c c}w r   )rQ   r   r   r   rT   r   r   	transform)r   mhscalevscalehr   s         r   r   zMTextColumns.transformn  s    

f
V#F"V#v%,0LL9qF
9(( 	EOOA	 :s   8B/c                   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                  r\|j                  t        dd      t        dt        | j                              g       |j                  d | j                  D               |j                  t        dd             |S )N  ACAD_MTEXT_COLUMN_INFO_BEGIN.  K   O   L   N   0     1   rj   c              3  4   K   | ]  }t        d |        yw)r   Nr   ).0r   s     r   	<genexpr>z<MTextColumns.acad_mtext_column_info_xdata.<locals>.<genexpr>  s     HtV,H   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  s%   t;<tR tS!1!123tR tS!1!123tR tTZZ(tR tS!:!:;<tR tTZZ(tR tT../
" ))KKb)6$DLL8I+JKLKKH4<<HHF4!=>?r   c                    t        t        dd      t        dd      t        d| j                        g      }|j                  d | j	                         D               |j                  t        dd             |S )Nr   ACAD_MTEXT_COLUMNS_BEGINr   /   c              3  4   K   | ]  }t        d |        yw)  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  ss    t78tR tTZZ(
 	 
/3/A/A/C
 	
 	F4!9:;r   c                   | j                   r| j                   S g }| j                  D ]a  }|j                  r?|j                  j                  }|t        j                  d      |j                  |       Nt        j                  d       |S )z+Returns a list of all linked MTEXT handles."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F**>112VWWv&--.LMM	N 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  sD    t>?tR tT001t<=	
 	
r   NreturnNone)r   r=   )
r   r   rQ   r   r   r   r   r   r   r=   )rQ   r   r   r   r   zIterable[float]r   r=   r   bool)r   r6   )r-   r-   )r   r   r   r   r   r   )r   r   )r   	list[str])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   '*
  %5:DI	   %5:DI	  ).9H	 #4 K K O O- 0
r   r=   c                   t               }| j                  d      }| j                  d      }| j                  d      }|D ]  \  }}|dk(  r$|"t        |      | _        | j	                  d       0|dk(  r|t        |      | _        H|dk(  r
||| _        W|dk(  r||_        || _        k|d	k(  r||_        x|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(  s|j"                  j%                  |        |j                  dk(  r|j"                  rt'        |j"                        |_        |S |j                  dkD  rR|j                  }t)        |j                  |z         }	|	dkD  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   embedded_objr   rK   rc   reference_column_widthcodevaluegwgs
             r   !load_columns_from_embedded_objectr     s    nGWWXFWW-.N WWW-# %*e2:.0!%eCKK
#RZFNeCJRZ2:CIRZ%*G"!&CRZ"'GRZ#(G RZ!GMRZ#(G RZ",U"3GRZ "GMRZ"&u+GRZ+/;G(RZOO""5)K%*P }}??0GM N   1$$$AW]]Q&'BDy #E7+>+>+Bb*H$I JNr   c                   	 t        d|       \  }}t               }d}d }| |dz   | D ]  \  }}|r=|dk(  r!|j                  j	                  |       |dz  }.t
        j                  d       d}||}J|dk(  rt        |      |_        nl|dk(  rt        |      |_
        nV|dk(  rt        |      |_        n@|d	k(  rt        |      |_        n*|d
k(  r||_        n|dk(  r||_        n|dk(  rt        |      }d } |S # t        $ r Y y w xY w)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    s5   =$d

s
 nGLJEAI, et|&&u-!EF J",U"3G2"&u+G2JGM2+/;G(2!GM2#(G 2u:L
;< NG  s   C9 9	DDc                    g }	 t        d|       \  }}| || D ]  \  }}|dk(  s|j                  |        |S # t        $ r |cY S w xY w)NACAD_MTEXT_COLUMNSr   )r   r   r   )r   r   r  r  r   r   s         r    load_mtext_linked_column_handlesr
    sj    G= $

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

s E# e4<F M  s   * 88c                x   d|v r|j                  d      }ny d| j                  d       d}	 t        |      }|y 	 t        |      |_        |j                          |j                  rt        |j                        |_        |S 	 t        |      |_        |j                  |_        |S # t        j                  $ r t        j                  d|        Y y w xY w# t        j                  $ r t        j                  d|        Y w xY w# t        j                  $ r t        j                  d|        Y w xY w)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   xdataacadnamer   s        r   load_columns_from_xdatar  E  s:    yy SWWX&'q)D(.
 >!A$!G    #7??3 N	I%>t%DG"  '55N1 "" 9$@A "" >5dV<=> && 	ILL@GH	Is4   B) C D )+CC+DD+D98D9c                   g }d| v r| j                  d      }n|S 	 t        d|      \  }}||| D ]  \  }}|dk(  s|j                  |        |||= t	        |      dk  r| j                  d       |S # t        $ r |cY S w xY w)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

s E# "e4<NN5!" 	U3Y
4y1}fN  s   A5 5BBc                      e Zd ZdZdZ eeee      Z	e
Zd* fdZd Zd Zed+d       Zed,d       Zefd-dZ	 d.	 	 	 d/ fd	Zd0 fd
Zd1dZd2 fdZd2 fdZd3dZd4dZd4dZd Zd Zd Zd5dZd6dZ 	 	 d7	 	 	 	 	 	 	 d8dZ!	 	 d9	 	 	 d:dZ"d;dZ#e#Z$d<dZ%d Z&d=dZ'd>dZ(d?d@dZ)dAd@dZ*dBdZ+dC fd Z,d* fd!Z-dDd"Z.dEd#Z/dAdFd$Z0d*d%Z1d.dG fd&Z2dHd'Z3dI fd(Z4dJ fd)Z5 xZ6S )Kr<   zDXF MTEXT entityMTEXTc                >    t         |           d| _        d | _        y )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     yyr   c                $    t        |      | _        y)z,Setter for virtual Mtext.dxf.text attribute.N)strrE   )r   r   s     r   rG   zMText._set_text  s    J	r   c                R    | j                   r| j                   j                         S dS )z+Returns a copy of the column configuration.N)r  r   r   s    r   r   zMText.columns  s"    
 04}}t}}))+F$Fr   c                    | j                   d uS r   )r  r   s    r   has_columnszMText.has_columns  s    }}D((r   c                    t        |t              sJ | j                  |_        | j                  r | j                  j                         |_        y y r   )
isinstancer<   rE   r%  r  r   )r   entitycopy_strategys      r   	copy_datazMText.copy_data  s?    &%(((ii"mm557FO r   c                   t         |   |      }|r|j                  d      }|rt        | j	                  |            }|j                  |t        |d       |j                  r"|j                  d   }t        ||      | _	        |S | j                  rt        || j                        | _	        |S 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   	processorr   r   objr  s        r   r.  zMText.load_dxf_attribs  s     g&y1..q1DD33D9:../$ /  --#44Q7C$Ec3$ODM 
 ZZ$;C$LDM
 
 --=cjj\K  
r   c                      fd} fd}t                    j                  r |         j                  r j                  j                         |S y )Nc                     j                   } | r?t        j                        D ]&  }| j                  |      }|s|j	                          ( y y 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  sI    ||H>tzzJ -F!)f!5J!"**,- r   c                     j                         } | -j                  j                  D ]  }| j                  |        yj                  j                  D ]  }d|j                  _         y)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  sb    __&F!!]]99 0E((/0 "]]99 +E&*EIIO+r   )r  post_load_hookr  r%  r  r   )r   r   r9  r?  r  s   ``  r   r@  zMText.post_load_hook  sO    	-	+ 	s#::%' MM&&s+33r   c                   | j                   }|r|j                  t        j                  k  r|j                  t        |j                        dz   k7  r!t        j                  t        |        d       t        d |j                  D              s"t        j                  t        |        d       y| j                          y)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  4   K   | ]  }|j                     y wr   )r   )r   r   s     r   r   z*MText.preprocess_export.<locals>.<genexpr>  s     L6vLr   z#: contains destroyed linked columnsFT)r  rW   r   r   r   r   r   r   r   r"  all%sync_common_attribs_of_linked_columns)r   	tagwriterr   s      r   preprocess_exportzMText.preprocess_export  s     --y++emm;}}G$:$: ;a ??D	{*VWXLW5K5KLLD	{*MNO668r   c                    t         |   |       | j                  r0|j                  t        j
                  k  r| j                  |       y y y r   )r  
export_dxfr%  rW   r   r   export_linked_entities)r   rE  r  s     r   rH  zMText.export_dxf  sA    9%	 4 4u}} D''	2 !Er   c                   t         |   |       |j                  t        t        j
                         | j                  j                  |g d       t        | j                  |       | j                  j                  |g d       | j                  }||j                  t        j                  k(  ry|j                  t        k\  r| j!                  |       y| j#                          | j%                          y)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   rE  r   r  s      r   rK  zMText.export_entity  s    i(_joo>##
	
 	TYY	2##	
& --?g11Z__D7*''	2!!#))+r   c              #    K   d}g }|D ]M  }|j                   dk(  r|j                  }|j                   dk(  r|j                  |j                         J| O |j                  |       t        dj	                  |            | _        y w)Nr  r-   r\   )r   r   r   r)   joinrE   )r   r   tailpartstags        r   r0  zMText.load_mtext_content/  su      	Cxx1}yyQSYY'		 	T+BGGEN;	s   BB
c                   | j                   }| j                  }|J |j                  dd       |j                  dd       |j                  t	        d|j
                               |j                  t	        d|j                               |j                  d|j                         |j                  d|j                         |j                  d	|j                         |j                  d
|j                         |j                  dt        |j                               |j                  rd}n|j                  }|j                  d|       |j                  d|j                         |j                  d|j                         |j                  dt        |j                                |j                  dt        |j"                               |j$                  D ]  }|j                  d|        y )Ne   zEmbedded ObjectF   r-   rL   rd   rO   rR   rf   rh   rY   r   r[   ro   rq   rl   r   rU   )r   r  rL  	write_tagr   rc   rK   rQ   rT   r   r   r   r   r   r   r   r   r   r   )r   rE  r   colsr   r   s         r   rN  zMText.export_embedded_object<  s   hh}}S"34R#F2s'9'9:;F2szz23R+R!4!45R!1!12R!2!23RT%5%5!67''EJJER'R,R!2!23RT%5%5!67RT%>%>!?@ll 	-F  V,	-r   c                    | j                   j                  D ]>  }|j                  j                  t	        j
                  d      |j                  |       @ y )Nr   )r  r   r   r   r   r   rH  )r   rE  r   s      r   rI  zMText.export_linked_entitiesX  sK    ]]11 	(Eyy'--.RSSY'		(r   c                    | j                  h d      }| j                  j                  D ]  }|j                  |        y )N>   r   rK   re   rg   drop)
dxfattribsr  r   update_dxf_attribs)r   common_attribsr   s      r   rD  z+MText.sync_common_attribs_of_linked_columns_  sA    B ) 
 ]]11 	5E$$^4	5r   c                d   | j                   t               | _         | j                  }|j                         }|j	                  |j                                |j                  s|j	                  |j                                | j                   }|j                  d       |j                  d|       y Nr  )
r  r3   r  r   r   r   r   r   r   add)r   rZ  r  r  s       r   rO  zMText.set_column_xdataf  s    ::DJ}}002D1134--KK<<>?

 	f		&$r   c                    | j                   }|j                  D ]  }|j                  d        |j                  s4|j	                         }|j                  D ]  }|j                  d|        y y rc  )r  r   discard_xdatar   r   	set_xdata)r   rZ  r   r   s       r   rP  zMText.set_linked_columns_xdatau  so    }})) 	)F  (	)--779D-- /  ./ .r   c                   | j                   j                  d      rI| j                   j                  }t        j                  |d   |d         }t        j
                  |      }|S | j                   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~  sl    88,-XX,,FjjF1I6G||G,H  xx||J2Hr   c                ^    | j                   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   angles     r   set_rotationzMText.set_rotation  s(    
 	)*!r   c                    t        |      | j                  _        || 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   rr  rX   )r   rK   ri   rX   s       r   set_locationzMText.set_location  s>     v,h''(8DHH%r   c                   d|cxk  rdk  rn t        d      || j                   _        nt        d      |rt        j                  nd}|| j                   j                  d       | j                   j                  d       | j                   j                  d       | j                   j                  d       | j                   j                  d	       |rd
| j                   _        | S |dk(  r5t        j                  |z  | j                   _        d| j                   _        | S t        j                  |z  | j                   _        t        |t              r|| j                   _        | S t        |t              r$d| j                   _        || j                   _        | S 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   rr   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   colorscaler8  s       r   set_bg_colorzMText.set_bg_color  s   * ?? MNN ',DHH#MNN/9U++q
=HHY'HH-.HH_-HH12HH12#%   h$::ZGDHH%&DHH"   %33j@DHH%%).&  E3')*&.3+  E5))*&.5en+r   c                0    | 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   c                   | j                   }|j                  d      r|j                  S |j                  d      rAt        |j                        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   ri  rc   r   ra   to_wcsr   from_deg_angleri   r#   r   r   s     r   get_text_directionzMText.get_text_direction  sb    
 hh;;'(%%%;;z" s}}%,,T-@-@-NOOr   c                    | j                   }|j                  d      r8|j                  d      s| j                         |_        |j	                  d       yy)zDConvert text rotation into text direction and discard text rotation.ri   rc   N)r   ri  r  rc   r   r  s     r   "convert_rotation_to_text_directionz(MText.convert_rotation_to_text_direction  sF    hh;;z";;/0%)%<%<%>"KK
# #r   c                z    | j                   }t        |j                  | 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  s4     hh::&&(}}
 	
r   c                j   | j                   }t        |j                        }t        ||      \  }}| j	                          t        |j
                        }|j                  |      }|j                  |      }t        |j                        }	|j                  |	      }
|j                  |
      }|j                  |      }|j                  t        j                  |      z  }||_	        t        j                  |	|      s.t!        |	      dkD  r ||	z  }t#        | j$                  |      | _        |j'                  d      r;|j                  |j(                        }|j                  |      j                  |_        |j+                  |j,                        |_        ||_        ||_        | j.                  ro|j                  |j                               j                  }|j                  |j                               j                  }| j0                  j+                  |||       | j3                  |       | 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	magnituderj  siniscloser   r,   rE   ri  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   hhS]]+.}a@q//1!#"4"45223EF!.!4!45G!H04>>O334GH$223FG-77$((7:KK)_o>O$u,$6F3DIIvFDI;;w*44SYY?I--i8BBCI[[,
/%**+=+G+G+IJTTF**+A+K+K+MNXXFMM##Avv6Ar   c                b    |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)  s)      #DIIU;;tyy66r   c                8      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                  r<j                  j                  D ]#  }| j                  |j                  d             % dj                  |       S )NFr  r  )r*   rE   r%  r  r   r   r  rR  contentcr   s     r   merged_contentz4MText.all_columns_plain_text.<locals>.merged_contentH  s^    '		?@G55 >ANN1<<e<#<=>777##r   c                 2   t        j                  d      } j                  rr| r| d   dk(  r| j                          j                  j
                  D ]?  }| j                  |j                  d             | s'| d   dk(  s0| j                          A | S )NTr  r  )r*   rE   r%  popr  r   r   r  r  s     r   split_contentz3MText.all_columns_plain_text.<locals>.split_contentO  s    &tyy=Gwr{b0KKM55 &ANN1<<d<#;<72;"#4& Nr   r   )r   r  r  r  s   `   r   all_columns_plain_textzMText.all_columns_plain_text>  s#    	$		  ?"!##r   c                    | j                   g}| j                  r6| j                  j                  D ]  }|j	                  |j                           dj                  |      S )zsReturns the text content of all columns as a single string
        including the inline formatting codes.

        r  )rE   r%  r  r   r   rR  )r   r  r   s      r   all_columns_raw_contentzMText.all_columns_raw_content_  sP    
 99+--66 ,v{{+,wwwr   c                    | j                   sy| j                  j                  t        |   |       n	 |j                  |        y)zValidity check.N)r   r   r=  r  auditcheck_text_style)r   auditorr  s     r   r  zMText.auditj  s:    }}88>>%GM'"   &r   c                    | j                   sy | j                  r+| j                  j                  D ]  }|j	                           | `t
        |           y r   )r   r%  r  r   r7  r  )r   r   r  s     r   r7  zMText.destroyw  sJ    }}--66 ! ! Mr   c                    | j                   rg| j                  rZ| j                  }| j                  j                  D ]4  }|j                   s|j                  s||_        |j                  |       6 yyy)zsAdd linked columns (MTEXT) entities to entity database `db`,
        called from EntityDB. (internal API)

        N)r   r  r   r   
is_virtualrd  )r   r   r   r   s       r   add_sub_entities_to_entitydbz"MText.add_sub_entities_to_entitydb  s[    
 ==T]]((C--66 #??v'8'8!$FJFF6N# +=r   c                    | j                   r>| j                  r1| j                  j                  D ]  }|j                   s ||        yyy)z.Call `func` for linked columns. (internal API)N)r   r  r   )r   funcr(  s      r   process_sub_entitieszMText.process_sub_entities  s=    ==T]]--66 !??L! +=r   c                &   |j                   t        j                  k7  sJ |j                  dkD  sJ d       |j                  dkD  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|j                          |r| j                          y y )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   linkeds      r   setup_columnszMText.setup_columns  s    ""joo555}}q @"@@ }}q >">> ##q(G*GG())*GHH ")"8"8$&#*#9#9G %&&('') r   c                N   | j                   }| j                  ddh      }| j                  }| j                  }|J |j	                  dt                     }t        j                  |j	                  dd            }t        |j	                  d|            }|j                  |j                  |j                  z         }|j                  }	t        |j                  d	z
        D ]@  }
||z  }t        j                  ||
      }||j                   _        |	j!                  |       B y)z:Create linked MTEXT columns for DXF versions before R2018.r   r=  r]  NrK   ri   r   rc   r-   )r_  r   )r   r_  r   r  r   r   r  r  rQ   r   r   ranger   r<   newrK   r   )r   r   attribsr   rZ  rK   default_directionrc   offsetr   r  r   s               r   r  zMText._create_linked_columns  s    hh//'':/;hh}}46* //
A0FGcgg&68IJK))$**t7H7H*HI,,tzzA~& 	*AfFYY'sY;F &FJJ!!&)		*r   c                2   | j                   sy t        | 	          t        |      xr" | j                  j
                  |j                  v }|sd| j                  _        | j                  r-| j                  j                  D ]  }|j                  |        y y )Nr`   )
r   r  remove_dependenciesr   r   r^   stylesr%  r  r   )r   otherstyle_existr   r  s       r   r  zMText.remove_dependencies  sz    }}#%5kDdhhnn&D'DHHN--66 2**512 r   c                    t               S r   )r   r   s    r   ocsz	MText.ocs  s     ur   c                   t         |   |       | j                  j                  d      r%|j	                  | j                  j
                         | j                  r-| j                  j                  D ]  }|j                  |        yy)z5Register required resources to the resource registry.r^   N)r  register_resourcesr   ri  add_text_styler^   r  r   )r   registryr   r  s      r   r  zMText.register_resources  sk    "8,88G$##DHHNN3==55 3((23 r   c                   t        |t              sJ t        |   ||       |j                  j                  d      r4|j                  |j                  j                        |j                  _        | j                  r\|j                  rOt        | j                  j                  |j                  j                        D ]  \  }}|j                  ||        yyy)z3Translate resources from self to the copied entity.r^   N)r'  r<   r  map_resourcesr   ri  get_text_styler^   r  zipr   )r   clonemappingcol_self	col_cloner  s        r   r  zMText.map_resources  s    %'''eW-99W%%44UYY__EEIIO==U^^'*,,enn.K.K( ;#) &&y':; ,=r   r   )r   Optional[MTextColumns]r   )r(  r   r   r   r   )r3  zOptional[SubclassProcessor]r   r7   )r   r6   r   zOptional[Callable])rE  r9   r   r   rE  r9   r   r   )r   r   r   zIterator[DXFTag])rE  r9   )r   r   )rq  r   r   r<   )NN)rK   r$   ri   zOptional[float]rX   zOptional[int]r   r<   )g      ?F)r}  zUnion[int, str, RGB, None]r~  r   )rE   r"  r   r<   )r   r   )r   r    )r   r   r   r<   )FT)r   zUnion[list[str], str])F)r   r"  )r  r5   )r   r:   r   r   )r  zCallable[[DXFEntity], None])r   r=   r  r   r   r   )r  zOptional[Drawing]r   r   )r   r   )r  zxref.Registryr   r   )r  r   r  zxref.ResourceMapperr   r   )7rz   r{   r|   r   DXFTYPEr   r/   r2   r?   
DXFATTRIBSr   MIN_DXF_VERSION_FOR_EXPORTr   rF   rG   r   r   r%  r4   r*  r.  r@  rF  rH  rK  r0  rN  rI  rD  rO  rP  ro  rr  rt  r  r  r   r  r  r  r   r  r  r  r  r7  r  r  r  r  r  r  r  r  __classcell__)r  s   @r   r<   r<     su   Gz;
CJ!(5 G G ) ) 5A 8 8<4	,<$3+,Z<-8(5 / %)*.	 " (	
 
* 	1)1 1f
 F $
%N7*$B	 
'	
#!*$*(2
3; ;r   r<   c                   t        |       }t        |d      }t        |      dk(  r|j                  d       t        |      dkD  r0|j	                  d|j                  d             t        |      dkD  r0|j	                  d|d          y )N   )sizer   r  r-   r\   )r)   r(   r   r   rL  r  )rE   rE  txt
str_chunkss       r   rA   rA     sy    
!$
'C#Cc2J
:!"
j/A
Q
q 1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   enumrj  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 9 %   4 +  #&67' 
		7	#G 	..	
G 	'"EMM7CG 	w// 	
G$ 	d+%G( 	'":)G> 	G3i33Ar: 	
?GT 	')i)))4 
UGj 	33	
kGv 	W--22 
wGJ 	'--22 
KG` 	gb40aGd 	wrD1eGh 	GBD9iGp 	g)i))1a&1 
qGB 	w1i11$=0)00t< 
CGT 	'":UGf 	70i00>')''5	
gGt !22
 &ch? &ch? ' AMGJ
V ,J7  P
 P
f8	8%)88v(V2#L: 	Z	;J Z	; Z	;z+r   