
    Og02                       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     d/var/www/html/public_html/myphp/venv/lib/python3.12/site-packages/ezdxf/addons/drawing/matplotlib.py
setup_axesr*   *   sj    HHHHYY 	e LLMM'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      (WW'')F,,D6::<M,N&!r+   c                H    | j                   }| xj                   dz  c_         |S )Nr   )r3   )r4   zs     r)   _get_zzMatplotlibBackend._get_zS   s    OO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      UUGUUG ;;= 	 	
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!!DKK$B$BBKK&&
 	
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     ==OOE:.GGWWcee$WWcee$"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
KKM 	8DAqyy|qss#qss#QSSzACC:67	8 	,>%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    
 &tf-	%--j9 &&{{}E GGe$  	?KK4SVH=>>	?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~     		%"5t< &&#{{}E GGe$  	VKKKCPQF8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!ACC:9s   "$r   )rD   rW   rI   )r'   rj   zipverticesrD   r@   )r4   pointsrO   s      r)   draw_filled_polygonz%MatplotlibBackend.draw_filled_polygon   s>    9v'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 477-@
 0 0q9:$++-(&   #	
'88#sO#sO 
 	1DGG4E4E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    $))+JD$))+JD$&*Tk4$;J<<
A. #kJ.F Gv""$44UFD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    JD$JD$"Tk4$;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NN7~$**-||L1FJJ',88@>((R0#c6"..#/	 	/ 	
 "%b)E$UKNKNKDAq1d+H#1A1A1CQU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	# 
KKdkk2 &OR ORd &*(,15O$O$"O$ 		O$
 	O$ 
O$ O$ $O$ &O$ /O$ 
O$r+   