U
    9%e,                     @   sx   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 d dlZG dd	 d	eZdS )
    N)S)ColorScheme)PlotMode)is_sequence)sleep)ThreadEventRLockc                   @   s  e Zd ZdZd\ZZg Zg ZdZddddZ	dZ
d	Zd
ZdZdd Zdd Zdd Zdd Zdd ZddddZdd Zedd Zedd Zd d! Zd"d# Zd$d% Zd&d' Zed(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Z d4d5 Z!d6d7 Z"d8d9 Z#d:d; Z$d<d= Z%d>d? Z&d@dA Z'edBdC Z(dDdE Z)edFdG Z*e+e'e(Z,e+e)e*Z-e+e!Z.e+e"Z/e+e#Z0e+e$Z1e+e%Z2e+e&Z3dHdI Z4dJdK Z5dS )LPlotModeBasez
    Intended parent class for plotting
    modes. Provides base functionality
    in conjunction with its parent,
    PlotMode.
    ) r   F         )Z	wireframesolidbothr   )333333?r   r   )333333?r   g?Zxyc                 C   s<   | j r4z|  }|W S  tk
r2   td Y nX |  S )NzQ
Warning: creating lambda evaluator failed. Falling back on SymPy subs evaluator.)use_lambda_eval_get_lambda_evaluator	Exceptionwarningswarn_get_sympy_evaluator)selfe r   g/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/sympy/plotting/pygletplot/plot_mode_base.py_get_evaluatorm   s    zPlotModeBase._get_evaluatorc                 C   s
   t  d S NNotImplementedErrorr   r   r   r   r   w   s    z!PlotModeBase._get_sympy_evaluatorc                 C   s
   t  d S r   r   r!   r   r   r   r   z   s    z"PlotModeBase._get_lambda_evaluatorc                 C   s
   t  d S r   r   r!   r   r   r   _on_calculate_verts}   s    z PlotModeBase._on_calculate_vertsc                 C   s
   t  d S r   r   r!   r   r   r   _on_calculate_cverts   s    z!PlotModeBase._on_calculate_cvertsN)bounds_callbackc                O   s  g | _ g | _tjtjdgtjtjdgtjtjdgg| _tjtjdgtjtjdgtjtjdgg| _t | _t	 | _
t	 | _d| _d| _d| _d| _d| _dg| _dg| _d | _d | _g | _g | _| jdd d k| _| jdd| _| jdd	| _|| _|   d S )
Nr   g        r   Zuse_sympy_evalstyler   colorrainbow)ZvertsZcvertsr   InfinityNegativeInfinityZboundsZcboundsr	   
_draw_lockr   _calculating_verts_calculating_cverts_calculating_verts_pos_calculating_verts_len_calculating_cverts_pos_calculating_cverts_len_max_render_stack_size_draw_wireframe_draw_solid_style_colorpredrawpostdrawoptionspopr   r&   r'   r$   _on_calculate)r   r$   argskwargsr   r   r   __init__   s:    zPlotModeBase.__init__c                    s    fdd}|S )Nc                    s4   | j   z | f||}|W S | j   X d S r   )r+   acquirerelease)r   r<   r=   rfr   r   w   s
    
z$PlotModeBase.synchronized.<locals>.wr   )rC   rD   r   rB   r   synchronized   s    zPlotModeBase.synchronizedc                 C   s4   t |st| j| t| j| jkr0| jd= dS z
        Push a function which performs gl commands
        used to build a display list. (The list is
        built outside of the function)
        r   N)callableAssertionErrorr3   appendlenr2   r   functionr   r   r   push_wireframe   s    zPlotModeBase.push_wireframec                 C   s4   t |st| j| t| j| jkr0| jd= dS rF   )rG   rH   r4   rI   rJ   r2   rK   r   r   r   
push_solid   s    zPlotModeBase.push_solidc                 C   s*   t d}t |t j |  t   |S )Nr   )pglZ
glGenListsZ	glNewListZ
GL_COMPILEZ	glEndList)r   rL   dlr   r   r   _create_display_list   s
    
z!PlotModeBase._create_display_listc                 C   s   |d }|dkrdS t |r6| |}||f|d< |S t|dkrtjt|d kr^|d S | |d }||d f|d< |S d S )Nr%   r   r   r   )rG   rQ   rJ   rO   GL_TRUEglIsList)r   Zrender_stacktoprP   r   r   r   _render_stack_top   s    
zPlotModeBase._render_stack_topc                 C   s8   t t jt jB  t t jt j t | t   d S r   )	rO   glPushAttribGL_ENABLE_BITGL_POLYGON_BITglPolygonModeGL_FRONT_AND_BACKZGL_FILL
glCallListglPopAttribr   rP   r   r   r   _draw_solid_display_list   s    
z%PlotModeBase._draw_solid_display_listc                 C   sP   t t jt jB  t t jt j t t j t 	dd t 
| t   d S )Ng{Gztg      I)rO   rV   rW   rX   rY   rZ   ZGL_LINEZglEnableZGL_POLYGON_OFFSET_LINEZglPolygonOffsetr[   r\   r]   r   r   r   _draw_wireframe_display_list   s    
z)PlotModeBase._draw_wireframe_display_listc                 C   s   | j D ]}t|r|  q| jr.| j| j }n| j| j }|d@ rp| | j}|dkrptjt	|krp| 
| |d@ r| | j}|dkrtjt	|kr| | | jD ]}t|r|  qd S )Nr   r   r   )r7   rG   style_overridestylesr5   rU   r4   rO   rR   rS   r^   r3   r_   r8   )r   rC   r&   rP   r   r   r   draw   s"    



zPlotModeBase.drawc                 C   s   t | jd  d S N)target)r   _calculate_cvertsstart)r   r'   r   r   r   _on_change_color  s    zPlotModeBase._on_change_colorc                 C   s   t | jd  d S rc   )r   _calculate_allrf   r!   r   r   r   r;     s    zPlotModeBase._on_calculatec                 C   s   |    |   d S r   )_calculate_vertsre   r!   r   r   r   rh     s    zPlotModeBase._calculate_allc                 C   sH   | j  rd S | j   z|   W 5 | j   X t| jrD|   d S r   )r,   is_setsetclearr"   rG   r$   r!   r   r   r   ri     s    


zPlotModeBase._calculate_vertsc                 C   sJ   | j  rd S | j r"td q| j  z|   W 5 | j  X d S )Nr   )r,   rj   r-   r   rk   rl   r#   r!   r   r   r   re     s    



zPlotModeBase._calculate_cvertsc                 C   s
   | j  S r   )r,   rj   r!   r   r   r   _get_calculating_verts%  s    z#PlotModeBase._get_calculating_vertsc                 C   s   | j S r   )r.   r!   r   r   r   _get_calculating_verts_pos(  s    z'PlotModeBase._get_calculating_verts_posc                 C   s   | j S r   )r/   r!   r   r   r   _get_calculating_verts_len+  s    z'PlotModeBase._get_calculating_verts_lenc                 C   s
   | j  S r   )r-   rj   r!   r   r   r   _get_calculating_cverts.  s    z$PlotModeBase._get_calculating_cvertsc                 C   s   | j S r   )r0   r!   r   r   r   _get_calculating_cverts_pos1  s    z(PlotModeBase._get_calculating_cverts_posc                 C   s   | j S r   )r1   r!   r   r   r   _get_calculating_cverts_len4  s    z(PlotModeBase._get_calculating_cverts_lenc                 C   s   | j S r   )r5   r!   r   r   r   
_get_style8  s    zPlotModeBase._get_stylec                 C   s|   |d krd S |dkrRd}| j D ]"}|jd kr.qt|t|jg}qddg|dk }|| jkrdtd|| jkrrd S || _d S )Nr   r   r   r   (   z v should be there in self.styles)	intervalsZv_stepsmaxintra   
ValueErrorr5   )r   vZstep_maxir   r   r   
_set_style;  s    



zPlotModeBase._set_stylec                 C   s   | j S r   )r6   r!   r   r   r   
_get_colorL  s    zPlotModeBase._get_colorc              
   C   s   zN|d k	r$t |rt| }nt|}t|t| jkr<W d S | | || _W n2 tk
r } ztdt| W 5 d }~X Y nX d S )NzColor change failed. Reason: %s)r   r   reprr6   rg   r   RuntimeErrorstr)r   ry   r   r   r   r   
_set_colorO  s    


zPlotModeBase._set_colorc                 C   s.   d dd | jD }d| j }d ||gS )N, c                 s   s   | ]}t |V  qd S r   r   .0dr   r   r   	<genexpr>m  s     z'PlotModeBase.__str__.<locals>.<genexpr>z	'mode=%s')joind_varsprimary_alias)r   rC   or   r   r   __str__l  s    
zPlotModeBase.__str__c                 C   sx   d dd | jD }d dd | jD }d| jfdt| jfdt| jfg}dd	 d
d |D  }d |||gS )Nr   c                 s   s   | ]}t |V  qd S r   r   r   r   r   r   r   r  s     z(PlotModeBase.__repr__.<locals>.<genexpr>c                 s   s   | ]}t |V  qd S r   r   )r   rz   r   r   r   r   s  s     moder'   r&   z'%s'z; c                 s   s&   | ]\}}|d krd||f V  qdS )Nonez%s=%sNr   )r   kry   r   r   r   r   x  s    )r   r   ru   r   r   r'   r&   )r   rC   rz   r   r   r   r   r   __repr__q  s    
zPlotModeBase.__repr__)6__name__
__module____qualname____doc__Zi_varsr   ru   aliases
is_defaultra   r`   Zdefault_wireframe_colorZdefault_solid_colorZdefault_rot_presetr   r   r   r"   r#   r>   rE   rM   rN   rQ   rU   r^   r_   rb   rg   r;   rh   ri   re   rm   rn   ro   rp   rq   rr   rs   r{   r|   r   propertyr&   r'   Zcalculating_vertsZcalculating_verts_posZcalculating_verts_lenZcalculating_cvertsZcalculating_cverts_posZcalculating_cverts_lenr   r   r   r   r   r   r
      sl   	


$







r
   )Z	pyglet.glglrO   Z
sympy.corer   Z&sympy.plotting.pygletplot.color_schemer   Z#sympy.plotting.pygletplot.plot_moder   Zsympy.utilities.iterablesr   timer   	threadingr   r   r	   r   r
   r   r   r   r   <module>   s   