o
    GZh,                     @   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 rz|  }|W S  ty   td Y |  S w |  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   W/var/www/auris/lib/python3.10/site-packages/sympy/plotting/pygletplot/plot_mode_base.py_get_evaluatorm   s   zPlotModeBase._get_evaluatorc                 C      t  NNotImplementedErrorr   r   r   r   r   w      z!PlotModeBase._get_sympy_evaluatorc                 C   r   r   r    r"   r   r   r   r   z   r#   z"PlotModeBase._get_lambda_evaluatorc                 C   r   r   r    r"   r   r   r   _on_calculate_verts}   r#   z PlotModeBase._on_calculate_vertsc                 C   r   r   r    r"   r   r   r   _on_calculate_cverts   r#   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 u | _| 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                    s>   | j   z | g|R i |}|W | j   S | j   w r   )r-   acquirerelease)r   r>   r?   rfr   r   w   s
   
z$PlotModeBase.synchronized.<locals>.wr   )rE   rF   r   rD   r   synchronized   s   zPlotModeBase.synchronizedc                 C   8   t |sJ | j| t| j| jkr| jd= dS 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)callabler5   appendlenr4   r   functionr   r   r   push_wireframe   
   zPlotModeBase.push_wireframec                 C   rH   rI   )rJ   r6   rK   rL   r4   rM   r   r   r   
push_solid   rP   zPlotModeBase.push_solidc                 C   s*   t d}t |t j |  t   |S )Nr   )pglZ
glGenListsZ	glNewListZ
GL_COMPILEZ	glEndList)r   rN   dlr   r   r   _create_display_list   s
   
z!PlotModeBase._create_display_listc                 C   s   |d }|dkr
dS t |r| |}||f|d< |S t|dkr@tjt|d kr/|d S | |d }||d f|d< |S d S )Nr'   r   r   r   )rJ   rT   rL   rR   GL_TRUEglIsList)r   Zrender_stacktoprS   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   )	rR   glPushAttribGL_ENABLE_BITGL_POLYGON_BITglPolygonModeGL_FRONT_AND_BACKZGL_FILL
glCallListglPopAttribr   rS   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)rR   rY   rZ   r[   r\   r]   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@ r8| | j}|dkr8tjt	|kr8| 
| |d@ rS| | j}|dkrStjt	|krS| | | jD ]	}t|r_|  qVd S )Nr   r   r   )r9   rJ   style_overridestylesr7   rX   r6   rR   rU   rV   ra   r5   rb   r:   )r   rE   r(   rS   r   r   r   draw   s(   



zPlotModeBase.drawc                 C      t | jd  d S N)target)r   _calculate_cvertsstart)r   r)   r   r   r   _on_change_color     zPlotModeBase._on_change_colorc                 C   rf   rg   )r   _calculate_allrj   r"   r   r   r   r=     rl   zPlotModeBase._on_calculatec                 C   s   |    |   d S r   )_calculate_vertsri   r"   r   r   r   rm     s   zPlotModeBase._calculate_allc                 C   sV   | j  rd S | j   z|   W | j   n| j   w t| jr)|   d S d S r   )r.   is_setsetr$   clearrJ   r&   r"   r   r   r   rn     s   



zPlotModeBase._calculate_vertsc                 C   sZ   | j  rd S | j rtd | j s| j  z|   W | j  d S | j  w )Nr   )r.   ro   r/   r   rp   r%   rq   r"   r   r   r   ri     s   




zPlotModeBase._calculate_cvertsc                 C   
   | j  S r   )r.   ro   r"   r   r   r   _get_calculating_verts%     
z#PlotModeBase._get_calculating_vertsc                 C      | j S r   )r0   r"   r   r   r   _get_calculating_verts_pos(  r#   z'PlotModeBase._get_calculating_verts_posc                 C   ru   r   )r1   r"   r   r   r   _get_calculating_verts_len+  r#   z'PlotModeBase._get_calculating_verts_lenc                 C   rr   r   )r/   ro   r"   r   r   r   _get_calculating_cverts.  rt   z$PlotModeBase._get_calculating_cvertsc                 C   ru   r   )r2   r"   r   r   r   _get_calculating_cverts_pos1  r#   z(PlotModeBase._get_calculating_cverts_posc                 C   ru   r   )r3   r"   r   r   r   _get_calculating_cverts_len4  r#   z(PlotModeBase._get_calculating_cverts_lenc                 C   ru   r   )r7   r"   r   r   r   
_get_style8  r#   zPlotModeBase._get_stylec                 C   s|   |d u rd S |dkr)d}| j D ]}|jd u rqt|t|jg}qddg|dk }|| jvr2td|| jkr9d S || _d S )Nr   r   r   r   (   z v should be there in self.styles)	intervalsZv_stepsmaxintrd   
ValueErrorr7   )r   vZstep_maxir   r   r   
_set_style;  s   




zPlotModeBase._set_stylec                 C   ru   r   )r8   r"   r   r   r   
_get_colorL  r#   zPlotModeBase._get_colorc              
   C   sz   z(|d urt |rt| }nt|}t|t| jkrW d S | | || _W d S  ty< } ztdt| d }~ww )NzColor change failed. Reason: %s)r   r   reprr8   rk   r   RuntimeErrorstr)r   r   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       | ]}t |V  qd S r   r   .0dr   r   r   	<genexpr>m      z'PlotModeBase.__str__.<locals>.<genexpr>z	'mode=%s')joind_varsprimary_alias)r   rE   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   r   r   r   r   r   r   r   r   r  r   z(PlotModeBase.__repr__.<locals>.<genexpr>c                 s   r   r   r   )r   r   r   r   r   r   s  r   moder)   r(   z'%s'z; c                 s   s(    | ]\}}|d krd||f V  qdS )Nonez%s=%sNr   )r   kr   r   r   r   r   x  s    
)r   r   r}   r   r   r)   r(   )r   rE   r   r   r   r   r   r   __repr__q  s   
zPlotModeBase.__repr__)6__name__
__module____qualname____doc__Zi_varsr   r}   aliases
is_defaultrd   rc   Zdefault_wireframe_colorZdefault_solid_colorZdefault_rot_presetr   r   r   r$   r%   r@   rG   rO   rQ   rT   rX   ra   rb   re   rk   r=   rm   rn   ri   rs   rv   rw   rx   ry   rz   r{   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
      s    
$







r
   )Z	pyglet.glglrR   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    