Ë
    £èh™3  ã                  óð  — d dl mZ d dlmZmZmZ d dlZd dlZd dlm	Z	 d dl
mZ d dlZd dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZmZm Z m!Z! d dl"m#Z#m$Z$ d dl%m&Z& d dl%m'Z' d dl(m)Z)m*Z* d dl+m,Z, ddl-m.Z.  ej^                  d«      Z0dZ1ejd                  ejd                  ejd                  fZ3dZ4d d„Z5 G d„ de«      Z6d!d„Z7d"d„Z8ddddddddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d#d„Z9y)$é    )Úannotations)ÚIterableÚOptionalÚUnionN)ÚPathLike)ÚLineCollection)Ú	AxesImage)ÚLine2D)Ú	PathPatch)ÚPath)ÚAffine2D)Úto_matplotlib_path)ÚBackendÚBkPath2dÚ
BkPoints2dÚ	ImageData)ÚBackendPropertiesÚLayoutProperties)Ú
FilterFunc)ÚColor)ÚVec2ÚMatrix44)ÚLayouté   )ÚConfigurationÚezdxfgr;Ëp¢®@gš™™™™™¹?c                ó  — | j                   j                  d«       | j                  j                  d«       | j                  j	                  «       D ]  }|j                  d«       Œ | j                  d«       | j                  dd«       y )NFÚequalÚdatalim)ÚxaxisÚset_visibleÚyaxisÚspinesÚvaluesÚ	autoscaleÚ
set_aspect)ÚaxÚss     ú?lib/python3.12/site-packages/ezdxf/addons/drawing/matplotlib.pyÚ
setup_axesr*   *   se   € à‡H�H×Ñ˜ÔØ‡H�H×Ñ˜ÔØ�Y‰Y×ÑÖˆØ	�‰�eÕð  ð ‡L�L�ÔØ‡M�M�'˜9Õ%ó    c                  ó¸   ‡ — e Zd ZdZddœ	 	 	 dˆ fd„Zdˆ fd„Zdd„Zdd„Zdd„Zdd	„Z	dd
„Z
	 	 	 	 dd„Zdd„Z	 	 	 	 dd„Zdd„Z	 	 	 	 	 	 dd„Zd„ Zˆ fd„Zˆ xZS )ÚMatplotlibBackenda  Backend which uses the :mod:`Matplotlib` package for image export.

    Args:
        ax: drawing canvas as :class:`matplotlib.pyplot.Axes` object
        adjust_figure: automatically adjust the size of the parent
            :class:`matplotlib.pyplot.Figure` to display all content
    T)Úadjust_figurec               ób   •— t         ‰| �  «        t        |«       || _        || _        d| _        y )Nr   )ÚsuperÚ__init__r*   r'   Ú_adjust_figureÚ
_current_z)Úselfr'   r.   Ú	__class__s      €r)   r1   zMatplotlibBackend.__init__>   s-   ø€ ô 	‰ÑÔÜ�2ŒØˆŒØ+ˆÔØˆ�r+   c                ó²   •— |j                   €;| j                  j                  «       }|r|j                  d|j                  z  ¬«      }t
        ‰| �  |«       y )Ng      R@)Úmin_lineweight)r7   r'   Ú
get_figureÚwith_changesÚdpir0   Ú	configure)r4   ÚconfigÚfigurer5   s      €r)   r;   zMatplotlibBackend.configureJ   sM   ø€ Ø× Ñ Ð(à—W‘W×'Ñ'Ó)ˆFÙØ×,Ñ,¸DÀ6Ç:Á:Ñ<MÐ,ÓN�Ü‰Ñ˜&Õ!r+   c                óH   — | j                   }| xj                   dz  c_         |S )Nr   )r3   )r4   Úzs     r)   Ú_get_zzMatplotlibBackend._get_zS   s   € Ø�O‰OˆØ�Š˜1Ñ�Øˆr+   c                ó:   — | j                   j                  |«       y ©N)r'   Úset_facecolor)r4   Úcolors     r)   Úset_backgroundz MatplotlibBackend.set_backgroundX   s   € Ø�‰×Ñ˜eÕ$r+   c                ó¬   — |j                   }| j                  j                  |j                  g|j                  gt
        || j                  «       ¬«       y)z Draw a real dimensionless point.©r(   ÚcÚzorderN)rD   r'   ÚscatterÚxÚyÚSCATTER_POINT_SIZEr@   )r4   ÚposÚ
propertiesrD   s       r)   Ú
draw_pointzMatplotlibBackend.draw_point[   sC   € à× Ñ ˆØ�‰�‰Ø�U‰UˆGØ�U‰UˆGÜ ØØ—;‘;“=ð 	õ 	
r+   c                ó´   — | j                   j                  €J ‚t        |j                  | j                   j                  z  | j                   j                  «      S )z>Set lineweight_scaling=0 to use a constant minimal lineweight.)r<   r7   ÚmaxÚ
lineweightÚlineweight_scaling)r4   rO   s     r)   Úget_lineweightz MatplotlibBackend.get_lineweightf   sJ   € à�{‰{×)Ñ)Ð5Ð5Ð5ÜØ×!Ñ! D§K¡K×$BÑ$BÑBØ�K‰K×&Ñ&ó
ð 	
r+   c           
     óD  — |j                  |«      r| j                  ||«       y| j                  j                  t	        |j
                  |j
                  f|j                  |j                  f| j                  |«      |j                  | j                  «       ¬«      «       y)zeDraws a single solid line, line type rendering is done by the
        frontend since v0.18.1
        )Ú	linewidthrD   rI   N)
ÚiscloserP   r'   Úadd_liner
   rK   rL   rU   rD   r@   )r4   ÚstartÚendrO   s       r)   Ú	draw_linezMatplotlibBackend.draw_linen   sx   € ð �=‰=˜Ôà�O‰O˜E :Õ.à�G‰G×ÑÜØ—W‘W˜cŸe™eÐ$Ø—W‘W˜cŸe™eÐ$Ø"×1Ñ1°*Ó=Ø$×*Ñ*ØŸ;™;›=ôõr+   c           	     ó&  — |j                   }| j                  |«      }g }g }g }| j                  «       }|D ]Œ  \  }	}
|	j                  |
«      r7|j	                  |	j
                  «       |j	                  |	j                  «       ŒN|j	                  |	j
                  |	j                  f|
j
                  |
j                  ff«       ŒŽ | j                  j                  ||t        ||¬«       | j                  j                  t        ||||d¬«      «       y)zDFast method to draw a bunch of solid lines with the same properties.rG   Úbutt)Ú
linewidthsrD   rI   ÚcapstyleN)rD   rU   r@   rX   ÚappendrK   rL   r'   rJ   rM   Úadd_collectionr   )r4   ÚlinesrO   rD   rS   Ú_linesÚpoint_xÚpoint_yr?   r(   Úes              r)   Údraw_solid_linesz"MatplotlibBackend.draw_solid_lines€   sâ   € ð × Ñ ˆØ×(Ñ(¨Ó4ˆ
ØˆØˆØˆØ�K‰K‹MˆÛ‰DˆAˆqØ�y‰y˜Œ|Ø—‘˜qŸs™sÔ#Ø—‘˜qŸs™sÕ#à—‘ §¡ Q§S¡S˜z¨A¯C©C°·±¨:Ð6Õ7ð ð 	�‰�‰˜ Ô,>À%ÐPQˆÔRØ�‰×ÑÜØØ%ØØØôõ	
r+   c                ó0  — t        |g«      }	 t        || j                  |«      d|j                  | j	                  «       ¬«      }| j
                  j                  |«       y# t        $ r+}t        j                  dt        |«      › �«       Y d}~yd}~ww xY w)zbDraw a solid line path, line type rendering is done by the
        frontend since v0.18.1
        F)rW   ÚfillrD   rI   zignored matplotlib error: N)r   r   rU   rD   r@   r'   Ú	add_patchÚ
ValueErrorÚloggerÚinfoÚstr)r4   ÚpathrO   Úmpl_pathÚpatchrg   s         r)   Ú	draw_pathzMatplotlibBackend.draw_pathž   s†   € ô
 & t fÓ-ˆð	%ÜØØ×-Ñ-¨jÓ9ØØ ×&Ñ&Ø—{‘{“}ôˆEð �G‰G×Ñ˜eÕ$øô ò 	?Ü�K‰KÐ4´S¸³V°HÐ=×>Ñ>ûð	?ús   Ž7A! Á!	BÁ*!BÂBc                ó  — d}	 t        t        |d¬«      |j                  |d| j                  «       ¬«      }| j                  j                  |«       y # t        $ r+}t        j                  dt        |«      › �«       Y d }~y d }~ww xY w)Nr   T)Údetect_holes)rD   rW   rj   rI   z1ignored matplotlib error in draw_filled_paths(): )
r   r   rD   r@   r'   rk   rl   rm   rn   ro   )r4   ÚpathsrO   rW   rr   rg   s         r)   Údraw_filled_pathsz#MatplotlibBackend.draw_filled_paths±   s~   € ð ˆ	ð	%ÜÜ" 5°tÔ<Ø ×&Ñ&Ø#ØØ—{‘{“}ôˆEð �G‰G×Ñ˜eÕ$øô ò 	VÜ�K‰KÐKÌCÐPQËFÈ8ÐT×UÑUûð	Vús   „3A Á	BÁ!BÂBc                ó¦   —  | j                   j                  t        d„ |j                  «       D «       Ž |j                  d| j                  «       dœŽ y )Nc              3  óL   K  — | ]  }|j                   |j                  f–— Œ y ­wrB   )rK   rL   )Ú.0Úps     r)   Ú	<genexpr>z8MatplotlibBackend.draw_filled_polygon.<locals>.<genexpr>Å   s   è ø€ Ð9Ñ'8 !�A—C‘C˜Ÿ™”:Ñ'8ùs   ‚"$r   )rD   rW   rI   )r'   rj   ÚzipÚverticesrD   r@   )r4   ÚpointsrO   s      r)   Údraw_filled_polygonz%MatplotlibBackend.draw_filled_polygonÃ   s>   € Øˆ�‰�‰ÜÑ9 v§¡Ô'8Ó9Ð:Ø×"Ñ"ØØ—;‘;“=ô		
r+   c                ó&  — |j                   j                  \  }}}|dk(  sJ ‚t        | j                  d¬«      }|j	                  t        j                  |j                   d¬«      «       |j                  | j                  «       «       |j                  \  }}}	}
}}}}}}}}}}}}t        t        j                  |||g|||gg d¢g«      ¬«      }|j                  || j                  j                  z   «       | j                  j                  |«       y )Né   Úantialiased)Úinterpolationr   )Úaxis)r   r   r   )Úmatrix)ÚimageÚshaper	   r'   Úset_dataÚnpÚflipÚ
set_zorderr@   Ú	transformr   ÚarrayÚset_transformÚ	transDataÚ	add_image)r4   Ú
image_datarO   ÚheightÚwidthÚdepthÚhandleÚm11Úm12Úm13Úm14Úm21Úm22Úm23Úm24Úm31Úm32Úm33Úm34Úm41Úm42Úm43Úm44Úmatplotlib_transforms                           r)   Ú
draw_imagezMatplotlibBackend.draw_imageË   s  € ð  *×/Ñ/×5Ñ5Ñˆ��uØ˜ŠzÐˆzô ˜4Ÿ7™7°-Ô@ˆØ�‰œŸ™ 
× 0Ñ 0°qÔ9Ô:Ø×Ñ˜$Ÿ+™+›-Ô(ð& × Ñ ñ#	
ØØØØØØØØØØØØØØØØä'Ü—8‘8à˜#˜s�OØ˜#˜s�OÚðóô 
Ðð 	×ÑÐ1°D·G±G×4EÑ4EÑEÔFØ�‰×Ñ˜&Õ!r+   c                ó8   — | j                   j                  «        y rB   )r'   Úclear)r4   s    r)   rª   zMatplotlibBackend.clearø   s   € Ø�‰�‰�r+   c                ó¶  •— t         ‰	| �  «        | j                  j                  d«       | j                  r£| j                  j                  «       \  }}| j                  j                  «       \  }}||z
  ||z
  }}t        j                  |d«      sHt        j                  ||z  «      \  }}| j                  j                  «       j                  ||d¬«       y y y )NTr   )Úforward)r0   Úfinalizer'   r%   r2   Úget_xlimÚget_ylimÚmathrX   ÚpltÚ	figaspectr8   Úset_size_inches)
r4   ÚminxÚmaxxÚminyÚmaxyÚ
data_widthÚdata_heightr”   r“   r5   s
            €r)   r­   zMatplotlibBackend.finalizeû   s·   ø€ Ü‰ÑÔØ�‰×Ñ˜$ÔØ×ÒØŸ™×)Ñ)Ó+‰JˆD�$ØŸ™×)Ñ)Ó+‰JˆD�$Ø&*¨T¡k°4¸$±;˜ˆJÜ—<‘< 
¨AÔ.Ü #§¡¨k¸JÑ.FÓ G‘��vØ—‘×"Ñ"Ó$×4Ñ4°U¸FÈDÐ4ÕQð /ð	 r+   )r'   úplt.Axesr.   Úbool)r<   r   ÚreturnÚNone)r¼   Úint)rD   r   )rN   r   rO   r   )rO   r   r¼   Úfloat)rZ   r   r[   r   rO   r   )rc   zIterable[tuple[Vec2, Vec2]]rO   r   )rp   r   rO   r   )rv   zIterable[BkPath2d]rO   r   )r   r   rO   r   )r’   r   rO   r   r¼   r½   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r1   r;   r@   rE   rP   rU   r\   rh   rs   rw   r€   r¨   rª   r­   Ú__classcell__)r5   s   @r)   r-   r-   5   s§   ø„ ñð #ñ	
àð
ð õ	
õ"óó
%ó	
ó
óð$
à*ð
ð &ó
ó<%ð&%Ø'ð%Ø5Fó%ó$
ð+"Ø#ð+"Ø1Bð+"à	ó+"òZ÷	Rð 	Rr+   r-   c                óŠ   — | j                  «       \  }}| j                  «       \  }}||z
  ||z
  }}t        |«      dkD  r||z  S y)Ng•Ö&è.>g      ð?)r®   r¯   Úabs)r'   r´   rµ   r¶   r·   r¸   r¹   s          r)   Ú_get_aspect_ratiorÇ     sL   € Ø—‘“�J€Dˆ$Ø—‘“�J€Dˆ$Ø" T™k¨4°$©;�€JÜ
ˆ;Ó˜$ÒØ˜KÑ'Ð'Ør+   c                ód   — |dk(  r|dk(  rt        d«      ‚|dk(  r	|| z  }||fS |dk(  r|| z  }||fS )Ng        zinvalid (width, height) values)rl   )Úratior”   r“   s      r)   Ú_get_width_heightrÊ     sS   € Ø�‚|˜ #šÜÐ9Ó:Ð:Ø�‚|Ø˜‘ˆð �&ˆ=Ðð 
�3ŠØ˜‘ˆØ�&ˆ=Ðr+   i,  Úagg)ÚbgÚfgr:   Úbackendr<   Úfilter_funcÚsize_inchesc               ó¾  — ddl m}	 ddlm}
 ddl}|j                  «       }|j                  |«       |€
t        «       }	 t        j                  |¬«      }|j                  d«      } |	| j                  «      }t        j                  | «      }|�|j                  ||«       t        |«      } |
|||«      j!                  | d||¬	«       |�4t#        |«      }t%        ||d   |d   «      \  }}|j'                  ||d«       |j)                  |||j+                  «       d¬
«       t        j,                  |«       |j                  |«       y# |j                  |«       w xY w)at  Quick and simplified render export by matplotlib.

    Args:
        layout: modelspace or paperspace layout to export
        filename: export filename, file extension determines the format e.g.
            "image.png" to save in PNG format.
        bg: override default background color in hex format #RRGGBB or #RRGGBBAA,
            e.g. use bg="#FFFFFF00" to get a transparent background and a black
            foreground color (ACI=7), because a white background #FFFFFF gets a
            black foreground color or vice versa bg="#00000000" for a transparent
            (black) background and a white foreground color.
        fg: override default foreground color in hex format #RRGGBB or #RRGGBBAA,
            requires also `bg` argument. There is no explicit foreground color
            in DXF defined (also not a background color), but the ACI color 7
            has already a variable color value, black on a light background and
            white on a dark background, this argument overrides this (ACI=7)
            default color value.
        dpi: image resolution (dots per inches).
        size_inches: paper size in inch as `(width, height)` tuple, which also
            defines the size in pixels = (`width` * `dpi`) x (`height` * `dpi`).
            If `width` or `height` is 0.0 the value is calculated by the aspect
            ratio of the drawing.
        backend: the matplotlib rendering backend to use (agg, cairo, svg etc)
            (see documentation for `matplotlib.use() <https://matplotlib.org/3.1.1/api/matplotlib_configuration_api.html?highlight=matplotlib%20use#matplotlib.use>`_
            for a complete list of backends)
        config: drawing parameters
        filter_func: filter function which takes a DXFGraphic object as input
            and returns ``True`` if the entity should be drawn or ``False`` if
            the entity should be ignored

    r   )ÚRenderContext)ÚFrontendr   N)r:   )r   r   r   r   T)r­   rÏ   Úlayout_properties)r:   Ú	facecolorÚtransparent)rO   rÒ   ÚfrontendrÓ   Ú
matplotlibÚget_backendÚuser   r±   r=   Úadd_axesÚdocr   Úfrom_layoutÚ
set_colorsr-   Údraw_layoutrÇ   rÊ   r³   ÚsavefigÚget_facecolorÚclose)ÚlayoutÚfilenamerÌ   rÍ   r:   rÎ   r<   rÏ   rÐ   rÒ   rÓ   rØ   Úold_backendÚfigr'   ÚctxrÔ   ÚoutrÉ   ÚwÚhs                        r)   Úqsaverë     s=  € õV *Ý"Ûð ×(Ñ(Ó*€KØ‡N�N�7ÔØ€~Ü“ˆð$ÜŸ*™*¨Ô-ˆØ—|‘| LÓ1ˆÙ˜FŸJ™JÓ'ˆÜ,×8Ñ8¸Ó@ÐØˆ>Ø×(Ñ(¨¨RÔ0Ü Ó#ˆÙ��c˜6Ó"×.Ñ.ØØØ#Ø/ð	 	/ô 	
ð Ð"Ü% bÓ)ˆEÜ$ U¨K¸©N¸KÈ¹NÓK‰DˆAˆqØ×Ñ  1 dÔ+Ø�‰�H #°×1AÑ1AÓ1CÐQUˆÔVÜ�	‰	�#Œà�‰�{Õ#øˆ
�‰�{Õ#ús   ¿C8E	 Å	E)r'   rº   )r'   rº   r¼   r¿   )rÉ   r¿   r”   r¿   r“   r¿   r¼   ztuple[float, float])rã   r   rä   zUnion[str, PathLike]rÌ   úOptional[Color]rÍ   rì   r:   r¾   rÎ   ro   r<   zOptional[Configuration]rÏ   zOptional[FilterFunc]rÐ   zOptional[tuple[float, float]]r¼   r½   ):Ú
__future__r   Útypingr   r   r   r°   ÚloggingÚosr   Úmatplotlib.pyplotÚpyplotr±   ÚnumpyrŠ   Úmatplotlib.collectionsr   Úmatplotlib.imager	   Úmatplotlib.linesr
   Úmatplotlib.patchesr   Úmatplotlib.pathr   Úmatplotlib.transformsr   Úezdxf.npshapesr   Úezdxf.addons.drawing.backendr   r   r   r   Úezdxf.addons.drawing.propertiesr   r   Úezdxf.addons.drawing.type_hintsr   r   Ú
ezdxf.mathr   r   Úezdxf.layoutsr   r<   r   Ú	getLoggerrm   ÚPOINTSÚCURVE4ÚCURVE4x3rM   r*   r-   rÇ   rÊ   rë   © r+   r)   Ú<module>r     s*  ðõ #ß ,Ñ ,Û Û Ý å Û Ý 1Ý &Ý #Ý (Ý  Ý *å -ß QÓ Qß OÝ 6Ý 1ß %Ý  Ý !à	ˆ×	Ñ	˜7Ó	#€ð 
€Ø�K‰K˜Ÿ™ d§k¡kÐ2€ØÐ ó&ôOR˜ô ORódóð ØØØØ&*Ø(,Ø15ñO$ØðO$à"ðO$ð 	ð	O$ð
 	ðO$ð 
ðO$ð ðO$ð $ðO$ð &ðO$ð /ðO$ð 
ôO$r+   