o
    oÇh1  ã                   @   sn   d dl mZ d dlmZ d dlmZ d dlm  m  m	Z	 d dl
mZ dd„ Zdd	„ ZG d
d„ de	jƒZdS )é    )ÚCallable)ÚBasic)Úimport_moduleN)Úlatexc                 C   s   t | tƒrt| ddS t| ƒS )NÚinline)Úmode)Ú
isinstancer   r   Ústr)Úlabel© r   úˆ/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/sympy/plotting/backends/matplotlibbackend/matplotlib.pyÚ_str_or_latex   s   
r   c                 C   s†   g }g }t | ƒr5| D ]&}|d }|d }| |j|j|j|jdg¡ | |j|j|j|jdg¡ q
||fS | d¡ | d¡ ||fS )zi
    Returns lists for matplotlib ``fill`` command from a list of bounding
    rectangular intervals
    r   é   N)NNNN)ÚlenÚextendÚstartÚend)Úinterval_listÚxlistÚylistÚ	intervalsÚ	intervalxÚ	intervalyr   r   r   Ú_matplotlib_list   s    
ÿ
ÿ
þ
r   c                       s^   e Zd ZdZ‡ fdd„Zdd„ Zeddd„ƒZd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Z‡  ZS )ÚMatplotlibBackendzd This class implements the functionalities to use Matplotlib with SymPy
    plotting functions.
    c                    s    t ƒ j|i |¤Ž tddg d¢idtfd| _| jj| _| jj| _| jjj	| _	| 
dd¡| _| jdkr@t| jd ƒ| jd	  | _| d
d ¡| _| dd ¡| _d S )NÚ
matplotlibÚfromlist)ÚpyplotÚcmÚcollectionsz1.1.0)Úimport_kwargsÚmin_module_versionÚcatchÚaspect_ratioÚautor   r   ÚfigÚax)ÚsuperÚ__init__r   ÚRuntimeErrorr   r   Úpltr   r   ÚLineCollectionÚgetÚaspectÚfloatÚpopÚ_plotgrid_figÚ_plotgrid_ax)ÚselfÚseriesÚkwargs©Ú	__class__r   r   r(   0   s   
þ


zMatplotlibBackend.__init__c                 C   s¨   dd„ }| j d ur$| j | _| j| _tdd„ | jD ƒƒs"|| jƒ d S d S | jj| jd| _tdd„ | jD ƒƒrD| jj	ddddd	| _d S | j 	ddd¡| _|| jƒ d S )
Nc                 S   s\   | j d  d¡ | j d  d¡ | j d  d¡ | j d  d¡ | j d¡ | j d¡ d S )NÚleftÚzeroÚrightÚnoneÚbottomÚtop)ÚspinesÚset_positionÚ	set_colorÚxaxisÚset_ticks_positionÚyaxis)r&   r   r   r   Ú
set_spinesA   s   z4MatplotlibBackend._create_figure.<locals>.set_spinesc                 s   ó    | ]}|j V  qd S ©N©Úis_3D©Ú.0Úsr   r   r   Ú	<genexpr>L   ó   € z3MatplotlibBackend._create_figure.<locals>.<genexpr>)Úfigsizec                 s   rD   rE   rF   rH   r   r   r   rK   P   rL   r   Ú3d)Ú
projection)
r0   r%   r1   r&   ÚanyÚ_seriesr*   ÚfigureÚsizeÚadd_subplot)r2   rC   r   r   r   Ú_create_figure@   s   
ÿz MatplotlibBackend._create_figureNc                 C   sh   t dƒ}|durd}| ||f}nd}| |f}|j |¡j dd|¡}|jj|dd… |dd… gddS )a‡   Convert two list of coordinates to a list of segments to be used
        with Matplotlib's :external:class:`~matplotlib.collections.LineCollection`.

        Parameters
        ==========
            x : list
                List of x-coordinates

            y : list
                List of y-coordinates

            z : list
                List of z-coordinates for a 3D line.
        ÚnumpyNé   é   éÿÿÿÿr   )Úaxis)r   ÚmaÚarrayÚTÚreshapeÚconcatenate)ÚxÚyÚzÚnpÚdimÚpointsr   r   r   Úget_segmentsV   s   $zMatplotlibBackend.get_segmentsc           *   
   C   s  t dƒ}t dddgid}g g g }}}|D ]­}|jrd|jr(| ¡ \}	}
}n| ¡ \}	}
t|jttfƒs;t|jƒrS|  	|	|
¡}|  
|¡}| | ¡ ¡ | |¡ qt|jƒ}|j|	|
||jd\}q|jro|j| ¡ Ž  q|jrÇ| ¡ \}	}
}}t|jttfƒs‡t|jƒr¤|jj}|  	|	|
|¡}| |¡}| | ¡ ¡ | |¡ nt|jƒ}|j|	|
|||jd | |j¡ | |j¡ | |j¡ q|jr%|jrØ| ¡ \}	}
}}}n| ¡ \}	}
}|j|	|
|t| jd| jjƒddd	d
}t|j ttt!fƒr| ¡ }| "|j#¡}| |¡ n| $|j ¡ | |j¡ | |j¡ | |j¡ q|j%rr| ¡ }t&|ƒdkrGt'|d ƒ\}	}
|j(|	|
|jdd q| j)j*j+}|d|jgƒ}|\}}}}|dkrh|j||||d q|j,||||d q|j-r¿|j.dkr‡|j|j/i |j0¤Ž q|j.dkr˜|j1|j/i |j0¤Ž q|j.dkr©|j2|j/i |j0¤Ž q|j.dkr¾| 3| j)j4j5|j/i |j0¤Ž¡ qt6d 7|¡ƒ‚|jj8}t||ƒsÜ|j9| :¡ | ;¡ d n|r | <|¡}| =|d d …df ¡| >|d d …df ¡f}| ?|¡ n| ?ddg¡ |r+| <|¡}| =|d d …df ¡| >|d d …df ¡f}| @|¡ n| @ddg¡ |rV| <|¡}| =|d d …df ¡| >|d d …df ¡f}| A|¡ n| Addg¡ | jBrmt||ƒsm| C| jB¡ | jDr}t||ƒs}| E| jD¡ t||ƒrŠ| j)jFdkr| G| jH¡ | jIr| jI} t||ƒržnf| dkr´|jJd  Kd¡ |jJd  Kd¡ nP| dkrì| L¡ \}!}"| M¡ \}#}$|!|" dkrÎdnd}%|#|$ dkrÙdnd}&|jJd  K|%¡ |jJd  K|&¡ n|jJd  Kd| d f¡ |jJd  Kd| d f¡ | jNs| O¡  | jPr| P¡ r|jQ R| jP¡ | jSr,| T| jS¡ | U| jS¡ | jVr6| W| jV¡ | jXrFt| jXƒ}'|jY|'dd  | jZrVt| jZƒ}(|j[|(d!d  t||ƒrl| j\rlt| j\ƒ})|j]|)d!d  | j^rv| ?| j^¡ | j_r€| @| j_¡ | j` a| jb¡ d S )"NrV   Úmpl_toolkitsr   Úmplot3d)r    )r
   ÚcolorÚviridisr   gš™™™™™¹?)ÚcmapÚrstrideÚcstrideÚ	linewidthrX   r   ÚNone)Ú	facecolorÚ	edgecolorÚwhiteÚcontour)rk   ÚmarkersÚannotationsÚfillÚ
rectangleszc{} is not supported in the SymPy plotting module with matplotlib backend. Please report this issue.)ÚscalexÚscaleyz1.2.0Úcenterr7   r;   r$   )Údatar   r{   )r   r   )Úposition)r   r   )cr   Ú	is_2DlineÚis_parametricÚget_datar   Ú
line_colorÚintr.   Úcallablerf   r+   Ú	set_arrayÚget_color_arrayÚadd_collectionr   r
   ÚplotÚ
is_contourrs   Ú	is_3Dlinerh   Úart3dÚLine3DCollectionÚappendÚ_xlimÚ_ylimÚ_zlimÚis_3DsurfaceÚplot_surfaceÚgetattrr   ÚjetÚsurface_colorr   r^   rS   r?   Úis_implicitr   r   rv   r   ÚcolorsÚListedColormapÚcontourfÚ
is_genericÚtypeÚargsÚrendering_kwÚannotateÚfill_betweenÚ	add_patchÚpatchesÚ	RectangleÚNotImplementedErrorÚformatÚAxes3DÚautoscale_viewÚget_autoscalex_onÚget_autoscaley_onr\   ÚaminÚamaxÚset_xlimÚset_ylimÚset_zlimÚxscaleÚ
set_xscaleÚyscaleÚ
set_yscaleÚ__version__Úset_autoscale_onÚ	autoscaleÚaxis_centerr=   r>   Úget_xlimÚget_ylimrZ   Úset_axis_offÚlegendÚlegend_Úset_visibleÚmarginÚset_xmarginÚset_ymarginÚtitleÚ	set_titleÚxlabelÚ
set_xlabelÚylabelÚ
set_ylabelÚzlabelÚ
set_zlabelÚxlimÚylimr&   Ú
set_aspectr-   )*r2   r3   r&   rc   rg   ÚxlimsÚylimsÚzlimsrJ   r`   ra   ÚparamÚsegmentsÚ
collectionÚlblÚlinerb   r‰   ÚuÚvÚcolor_arrayre   r–   ÚcolormapÚxarrayÚyarrayÚzarrayÚ	plot_typer£   rÅ   rÆ   ÚzlimÚvalÚxlÚxhÚylÚyhÚpos_leftÚ
pos_bottomÚxlblÚylblÚzlblr   r   r   Ú_process_seriesp   s,  
ÿ
ÿ

ÿ


þ

ÿÿÿ€ýþ
,
,
,





z!MatplotlibBackend._process_seriesc                 C   s   |   ¡  |  | j| j¡ dS )za
        Iterates over every ``Plot`` object and further calls
        _process_series()
        N)rU   rã   rQ   r&   ©r2   r   r   r   Úprocess_series&  s   z MatplotlibBackend.process_seriesc                 C   s2   |   ¡  tjr| j ¡  | j ¡  d S |  ¡  d S rE   )rå   Úbase_backendÚ_showr%   Útight_layoutr*   ÚshowÚcloserä   r   r   r   ré   .  s
   
zMatplotlibBackend.showc                 C   s   |   ¡  | j |¡ d S rE   )rå   r%   Úsavefig)r2   Úpathr   r   r   Úsave9  s   zMatplotlibBackend.savec                 C   s   | j  | j¡ d S rE   )r*   rê   r%   rä   r   r   r   rê   =  s   zMatplotlibBackend.closerE   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r(   rU   Ústaticmethodrf   rã   rå   ré   rí   rê   Ú__classcell__r   r   r5   r   r   +   s     7r   )Úcollections.abcr   Úsympy.core.basicr   Úsympy.externalr   Ú$sympy.plotting.backends.base_backendÚplottingÚbackendsræ   Úsympy.printing.latexr   r   r   ÚPlotr   r   r   r   r   Ú<module>   s    