U
    f»{jÚ²  ã                	   @   s  d Z ddlmZ ddlZddlZddlZddlZddlZddl	m
Z
mZ ddlmZmZmZmZ ddlmZmZmZmZ dd	lmZ dd
lmZmZmZmZ e ¡ �x ejded� ddl Z ddl m!Z!m"Z"m#Z#m$Z$m%Z% zddl&m'Z' W n" e(k
�r
   ddl m'Z' Y nX ddl)m*Z* W 5 Q R X ddl+m,Z,m-Z-m.Z. ddl/m0Z0m1Z1 ddl2m3Z3 ddl4m5Z5m6Z6 ddl7m8Z8m9Z9 ddl:m;Z; ddl<m=Z=m>Z>m?Z?m@Z@mAZAmBZB ddlCmDZD ddlEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZM ddlNmOZO ddlPmQZQ zddl+mRZR W n eSk
�r   dZRY nX eeRddƒZTeUƒ ZVG dd„ deƒZWG d d!„ d!eXƒZYeG d"d#„ d#e
ƒƒZZd$d%„ Z[d&d'„ Z\d(d)„ Z]d*d+„ Z^d,d-„ Z_d.d/„ Z`d0d1„ Zad2d3„ Zbd4d5„ Zcd6d7„ Zdd8d9„ ZedXd<d=„ZfdYd?d@„ZgdAdB„ ZhdCdD„ ZidZdFdG„ZjdHdI„ ZkdJdK„ ZldLdM„ Zmd[dRdS„ZnedTdU„ ƒZodVdW„ ZpdS )\zn
Core visualization operations based on PyVista.

Actual implementation of _Renderer and _Projection classes.
é    )ÚcontextmanagerNé   )Ú_AbstractRendererÚFigure3D)Ú_get_colormap_from_arrayÚ_alpha_blend_backgroundÚALLOWED_QUIVER_MODESÚ_init_mne_qtappé   )Ú	_get_argsÚ_point_dataÚ
_cell_dataÚ_compare_version)Úapply_trans)Úcopy_base_doc_to_subclass_docÚ_check_optionÚ_require_versionÚ_validate_typeÚignore©Úcategory)ÚPlotterÚPolyDataÚLineÚ	close_allÚUnstructuredGrid)ÚBackgroundPlotter)Ú_ALL_PLOTTERS)Ú
vtkCommandÚvtkLookupTableÚVTK_UNSIGNED_CHAR)Ú
VTK_VERTEXÚvtkPiecewiseFunction)ÚvtkTransform)ÚvtkCellDataToPointDataÚ
vtkGlyph3D)ÚvtkTransformPolyDataFilterÚvtkMarchingContourFilter)ÚvtkPolyDataSilhouette)ÚvtkSphereSourceÚvtkConeSourceÚvtkCylinderSourceÚvtkArrowSourceÚvtkPlatonicSolidSourceÚvtkGlyphSource2D)ÚvtkImageReslice)Ú	vtkMapperÚvtkActorÚvtkCellPickerÚvtkColorTransferFunctionÚvtkPolyDataMapperÚ	vtkVolumeÚvtkCoordinateÚvtkDataSetMapper)ÚvtkSmartVolumeMapper)Únumpy_to_vtk)ÚVTK_VERSIONz9.0z>=c                   @   s2   e Zd ZdZdd„ Zddd„Zdd„ Zdd„ ZdS )ÚPyVistaFigurez‰PyVista-based 3D Figure.

    This class is not meant to be instantiated directly, use
    :func:`mne.viz.create_3d_figure` instead.
    c                 C   s   d S ©N© ©Úselfr=   r=   úX/var/www/html/bwave/python/venv/lib/python3.8/site-packages/mne/viz/backends/_pyvista.pyÚ__init__L   s    zPyVistaFigure.__init__NFúPyVista Scene©éX  rD   ©r   r   ÚblackTc                 C   sø   || _ d | _|| _|| _|	| _|| _|
| _tƒ | _|| jd< || jd< || jd< d| jd< || jd< | jsÐ|| jd< || jd< d| jd	< d| jd
< d| jd< d| jd< t	| _
dtt	ƒkrÖddlm} || jd< nt| _
| jd \| _| _d  | _| _d S )NZwindow_sizeÚshapeÚ
off_screenFÚborderÚmulti_samplesÚshowÚtitleZauto_updateZmenu_barZtoolbarZupdate_app_iconZapp_window_classr   )Ú_MNEMainWindow)Ú_plotterÚdisplayÚbackground_colorÚsmooth_shadingÚnotebookrL   ÚsplashÚdictÚstorer   Ú_plotter_classr   Z_qtrM   r   Ú_nrowsÚ_ncolsÚ_azimuthÚ
_elevation)r?   ÚplotterrK   rL   ÚsizerG   rP   rQ   rH   rR   rS   rJ   rM   r=   r=   r@   Ú_initO   s6    










zPyVistaFigure._initc                 C   sœ   | j d krj| jsNtt| jdƒ| jd�}| jr@|d | _|d }n|}|| jd< | jf | jŽ}| j|_|| _| j j	d k	r‚| j j	 
¡  t| j ƒ t| j ƒ | j S )NZset_icon)Zenable_iconrS   r   r   Úapp)r[   rR   r	   ÚhasattrrV   rS   rU   rP   rN   ÚirenZ
initializeÚ_process_events)r?   Úoutr^   r[   r=   r=   r@   Ú_builds   s&    

þ




zPyVistaFigure._buildc                 C   s   | j d krdS t| j dƒS )NFÚren_win)r[   r_   r>   r=   r=   r@   Ú
_is_active‰   s    
zPyVistaFigure._is_active)NFrB   rC   rE   rF   TFFFN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rA   r]   rc   re   r=   r=   r=   r@   r;   E   s                 ý
$r;   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú_Projectionz±Class storing projection information.

    Attributes
    ----------
    xy : array
        Result of 2d projection of 3d data.
    pts : None
        Scene sensors handle.
    c                C   s   || _ || _|| _dS )z3Store input projection information into attributes.N©ÚxyÚptsr[   )r?   rl   rm   r[   r=   r=   r@   rA   š   s    z_Projection.__init__c                 C   s   | j  |¡ | j ¡  dS )z+Modify visibility attribute of the sensors.N)rm   ÚSetVisibilityr[   Úrender)r?   Ústater=   r=   r@   Úvisible    s    z_Projection.visibleN)rf   rg   rh   ri   rA   rq   r=   r=   r=   r@   rj   �   s   
rj   c                   @   s”  e Zd ZdZdod	d
„Zedd„ ƒZe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dpd"d#„Zdqd&d'„Zdrd(d)„Zdsd+d,„Zdtd-d.„Zdud0d1„Zdvd5d6„Zdwdd:œd;d<„Zdxd>d?„Zdyd@dA„ZdzdCdD„ZdEdF„ ZdGdH„ ZdIdJ„ Zd{dLdM„ZdNdO„ Zd|dQdR„Z dSdT„ Z!dUdV„ Z"dWdX„ Z#dYdZ„ Z$e%d[d\„ ƒZ&d}d]d^„Z'd_d`„ Z(dadb„ Z)dcdd„ Z*d~dedf„Z+dgdh„ Z,didj„ Z-dkdl„ Z.ddmdn„Z/dS )€Ú_PyVistaRendererz¥Class managing rendering scene.

    Attributes
    ----------
    plotter: Plotter
        Main PyVista access point.
    name: str
        Name of the window.
    NrC   rF   rB   FrE   Tc                 C   sZ  ddl m} tdddƒ |dƒ}
tjdkr.d}
tƒ }|j||||||||	|
d	�	 d
| _d| _|dƒ| _	|dƒ| _
|dƒ| _t|tƒr¸t |¡}|d k	r¦| ¡ r¦|| _qÎ|| _| jt|< n|d krÈ|| _n|| _tjràd| jjd< t ¡ �J tjdtd� tƒ � | j ¡ | _W 5 Q R X |  ¡  |  ¡  |  ¡  W 5 Q R X t| jdƒ�sNd | j_ |  !¡  d S )Né   )Ú_get_3d_optionÚpyvistazuse 3D renderingz0.32rJ   Údarwinr   )	rK   rL   r\   rG   rP   rR   rQ   rS   rJ   Zarialé   Ú	antialiasÚdepth_peelingrQ   TrH   r   r   r`   )"Z_3drt   r   ÚsysÚplatformr;   r]   Úfont_familyÚtube_n_sidesrx   ry   rQ   Ú
isinstanceÚintÚ_FIGURESÚgetre   Úfigureru   Z
OFF_SCREENrU   ÚwarningsÚcatch_warningsÚfilterwarningsÚFutureWarningÚ_disabled_depth_peelingrc   r[   Ú
_hide_axesÚ_enable_antialiasÚ_enable_depth_peelingr_   r`   Úupdate_lighting)r?   Zfigr\   ÚbgcolorÚnamerK   rG   rR   rQ   rS   rJ   rt   r‚   Z	saved_figr=   r=   r@   rA   ²   sV    
     ü





z_PyVistaRenderer.__init__c                 C   s    | j jd k	r| j jgS tƒ S d S r<   )r‚   r[   Úlistr>   r=   r=   r@   Ú_all_plottersé   s    
z_PyVistaRenderer._all_plottersc                 C   s    | j jd k	r| j jjS tƒ S d S r<   )r‚   r[   Z	renderersrŽ   r>   r=   r=   r@   Ú_all_renderersð   s    
z_PyVistaRenderer._all_renderersc                 C   s   | j D ]}| ¡  qd S r<   )r�   Z	hide_axes©r?   Úrendererr=   r=   r@   rˆ   ÷   s    
z_PyVistaRenderer._hide_axesc                 C   s   | j D ]}| ¡  qd S r<   )r�   Úupdate©r?   r[   r=   r=   r@   Ú_updateû   s    
z_PyVistaRenderer._updatec                 C   s    | j j}|| }|| }||fS r<   ©r‚   rX   )r?   ÚidxrX   ÚrowÚcolr=   r=   r@   Ú_index_to_locÿ   s    z_PyVistaRenderer._index_to_locc                 C   s   | j j}|d | |d  S ©Nr   r   r–   )r?   ÚlocrX   r=   r=   r@   Ú_loc_to_index  s    z_PyVistaRenderer._loc_to_indexc              	   C   st   t  dt  || jjd g¡g¡}t  dt  || jjd g¡g¡}t ¡ �" tjdt	d� | j
 ||¡ W 5 Q R X d S )Nr   r   r   r   )ÚnpÚmaxÚminr‚   rW   rX   rƒ   r„   r…   r†   r[   Úsubplot)r?   ÚxÚyr=   r=   r@   r¡   	  s
      
z_PyVistaRenderer.subplotc                 C   s   | j S r<   ©r‚   r>   r=   r=   r@   Úscene  s    z_PyVistaRenderer.scenec                 C   s¼   | j D ]°}t| ¡ ƒ}| d¡}| d¡ d}t|ƒD ]~\}}|t|ƒk r‚| d¡ | t|| d d… Ž ¡ | 	|| d ¡ n$| d¡ | tddƒ¡ | 	d¡ | 
ddd¡ q6qd S )Nr   F))r   iÓÿÿÿçffffffæ?)iÄÿÿÿé   r¦   )é<   r§   r¦   Trs   ç        ç      ð?)r�   rŽ   Z	GetLightsÚpopZ	SetSwitchÚ	enumerateÚlenZSetPositionÚ_to_posZSetIntensityÚSetColor)r?   r’   ZlightsZ	headlightZaz_el_inZliZlightr=   r=   r@   r‹     s    





z _PyVistaRenderer.update_lightingc                 C   sº   t | jdƒr| jjd krd S |dkrr| jD ]}| ¡  q*t | jdƒrP| j ¡  q¶ddlm} |ƒ }| jj 	|¡ nD| jD ]}| 
¡  qxtƒ }|dkrœd|d< t| jd	|› d
�ƒf |Ž d S )Nr`   Zrubber_band_2dÚenable_rubber_band_2d_styler   )ÚvtkInteractorStyleRubberBand2DZterrainTZmouse_wheel_zoomsZenable_Ú_style)r_   r[   r`   r�   Zenable_parallel_projectionr°   Zvtkmodules.vtkInteractionStyler±   Z
interactorZSetInteractorStyleZdisable_parallel_projectionrT   Úgetattr)r?   Zinteractionr’   r±   ÚstyleÚkwargsr=   r=   r@   Úset_interaction&  s     



z _PyVistaRenderer.set_interactionçš™™™™™¹?Útriangleú
upper leftc                 C   s   | j j|||f||d�S )N)r\   Úfacerœ   )r[   Z
add_legend)r?   ÚlabelsrI   r\   rº   rœ   r=   r=   r@   Úlegend;  s       ÿz_PyVistaRenderer.legendrª   Úsurfacec                 K   sn  t  ¡ ��Z t jdtd� d}|d k	rtt|ƒ|jkrt|jd dkrZtj|t 	|j¡f }n|}|d  
d¡}d }d}t|tjƒr°|jtjkrœ| 
tj¡d	 }d
dlm} ||ƒ}|d k	rÔ|t|ƒd< | ¡  d¡ nt|ƒ d|krö|d }| d¡ tf | j|||||||||	gd| j|
||dœ|—Ž}|d k	�rP| ¡ }| ¡  | ||¡ ||fW  5 Q R £ S Q R X d S )Nr   r   Fr   r
   éÿ   ZubyteTç     ào@r   )ÚListedColormapÚNormalsÚrgba)r[   ÚmeshÚcolorÚscalarsrÂ   ÚopacityÚcmapÚbackface_cullingÚrngÚshow_scalar_barrQ   Úinterpolate_before_mapr´   Ú
line_width)rƒ   r„   r…   r†   r­   Ún_pointsrG   rž   Úc_ÚonesÚastyper~   ZndarrayÚdtypeZuint8Úfloat64Zmatplotlib.colorsrÀ   r   ZGetPointDataZSetActiveNormalsÚ_compute_normalsr«   Ú	_add_meshr[   rQ   Ú	GetMapperZ+SetResolveCoincidentTopologyToPolygonOffsetZ4SetRelativeCoincidentTopologyPolygonOffsetParameters)r?   rÃ   rÄ   rÆ   ÚnormalsrÈ   rÅ   ÚcolormapÚvminÚvmaxrË   ÚrepresentationrÌ   Úpolygon_offsetrµ   rÂ   rÀ   ÚactorÚmapperr=   r=   r@   Úpolydata@  s`    
      øø
 ÿz_PyVistaRenderer.polydatac                 K   sˆ   t  ¡ �N t jdtd� tj|||f  t¡}tjt t	|ƒd¡|f }t
||ƒ}W 5 Q R X | jf ||||||	|
||||||dœ|—ŽS )Nr   r   r
   )rÃ   rÄ   rÆ   rÖ   rÈ   rÅ   r×   rØ   rÙ   rË   rÚ   rÌ   rÛ   )rƒ   r„   r…   r†   rž   rÎ   rÐ   ÚfloatÚfullr­   r   rÞ   )r?   r¢   r£   ÚzÚ	trianglesrÄ   rÆ   ZshadingrÈ   rÅ   r×   rØ   rÙ   rË   rÚ   rÌ   rÖ   rÛ   rµ   ÚverticesrÃ   r=   r=   r@   rÃ   p  s,    
óòz_PyVistaRenderer.meshÚlinec                 C   sæ   t  ¡ �Ô t jdtd� |d k	r*t||	ƒ}t |d ¡}t |d ¡}t|ƒ}tjt 	|d¡|f }t
||ƒ}|t|ƒd< |j|d�}|}|
dkr¦|j|| jd	�}d
}t| j|d||||g||| jd�	}||fW  5 Q R £ S Q R X d S )Nr   r   ÚrrÚtrisr
   rÅ   )ZisosurfacesÚtube)ÚradiusÚn_sidesrª   F)	r[   rÃ   rÊ   rÌ   rÄ   rÉ   rÇ   rÆ   rQ   )rƒ   r„   r…   r†   r   rž   Úarrayr­   rÎ   rà   r   r   Úcontourrç   r}   rÔ   r[   rQ   )r?   r½   rÅ   ZcontoursÚwidthrÆ   rØ   rÙ   r×   Únormalized_colormapÚkindrÄ   rã   râ   Zn_trianglesrÃ   rë   rÌ   rÜ   r=   r=   r@   rë   ‹  s:    
ÿ
÷z_PyVistaRenderer.contourc                 C   sª   t  ¡ �` t jdtd� | dd ¡}t |d ¡}t |d ¡}tjt t	|ƒd¡|f }t
||ƒ}W 5 Q R X t||ƒ}|d k	rŒ|t|ƒd< | j|||||	|||||
d�
S )	Nr   r   Únnrå   ræ   r
   rÅ   )
rÃ   rÄ   rÆ   rÖ   rÈ   rÅ   r×   rØ   rÙ   rÛ   )rƒ   r„   r…   r†   r�   rž   rê   rÎ   rà   r­   r   r   r   rÞ   )r?   r½   rÄ   rÆ   rØ   rÙ   r×   rí   rÅ   rÈ   rÛ   rÖ   rã   râ   rÃ   r=   r=   r@   r½   «  s,    

öz_PyVistaRenderer.surfaceé   c              
   C   sþ   ddl m} |d k	rdn|}	tj|td�}t|ƒdkr:dS td|jdƒ td|jd	 d
ƒ t	 
¡ �’ t	jdtd� |ƒ }
|
 |¡ |
 |¡ |d k	rž|
 |¡ |
 ¡  |
 ¡ }t|ƒ}|jdd|	|d�}t| j||||| jd�}||fW  5 Q R £ S Q R X d S )Nr   ©r)   rª   ©rÑ   )NNzcenter.ndim)r   rs   zcenter.shape[-1]éÿÿÿÿ)r
   r   r   F©ÚorientÚscaleÚfactorÚgeom)rÃ   rÄ   rÆ   rÈ   rQ   )Úvtkmodules.vtkFiltersSourcesr)   rž   rê   rß   r­   r   ÚndimrG   rƒ   r„   r…   r†   ÚSetThetaResolutionÚSetPhiResolutionÚ	SetRadiusÚUpdateÚ	GetOutputr   ÚglyphrÔ   r[   rQ   )r?   ÚcenterrÄ   rö   rÆ   Ú
resolutionrÈ   rè   r)   r÷   Úsphererø   rÃ   r   rÜ   r=   r=   r@   r  Æ  s<    



 ÿ  üz_PyVistaRenderer.sphereçü©ñÒMbP?ÚwhiteÚRdBuc                 C   s²   t  ¡ �œ t jdtd� t||	ƒ}t||ƒD ]r\}}t||ƒ}|d k	rh|dd d …f t|ƒd< d}d }nd }|j|| j	d�}t
| j|||
||g|d|| jd�	}q,W 5 Q R X ||fS )Nr   r   r   rÅ   )ré   F)	r[   rÃ   rÅ   Zflip_scalarsrÉ   rÄ   rÊ   rÇ   rQ   )rƒ   r„   r…   r†   r   Úzipr   r   rç   r}   rÔ   r[   rQ   )r?   ÚoriginZdestinationrè   rÄ   rÅ   rØ   rÙ   r×   rí   Zreverse_lutrÇ   ZpointaZpointbrä   rç   rÜ   r=   r=   r@   rç   ä  s.    


÷z_PyVistaRenderer.tubeÚnoneç       @ç333333Ã?)Úclimc          )      C   sà  t d|	tƒ t ¡ ��¼ tjdtd� |}tj|||f }t tj|||f ¡}t	|ƒ}t 
|t¡}tjt 
|d¡t|ƒf }|||f} ts t |¡d f|  } t| Ž }!|d kr¼t |f¡}t |¡t|!ƒd< |t|!ƒd< |	dk� rþt|!|ƒ|!fW  5 Q R £ S |	d	k�r*t|!dd|d
�}"t |" ¡ ¡}#�nˆd }$|	dk�rbtƒ }%|% ddd¡ |d k	�rº|% |¡ nX|	dk�rˆtƒ }%|d k	�rº|% |¡ n2|	dk�r¢tƒ }%|% ¡  n|	dk�s´t|	ƒ‚tƒ }%|	dk�r|d k	�rØ|%  |¡ |d k	�rì|% |¡ |d k	�r |% !|¡ t"ƒ }$|$ #dddd¡ n@|	dk�rX|d k	�rX|j$dk�s<t‚t"ƒ }$|$ %| &tj'¡ (¡ ¡ |$d k	�rŒ|% )¡  t*ƒ }&|& +|% ¡ ¡ |& ,|$¡ |&}%|% )¡  |% ¡ }'|!j-d|dk||'d�}#t.| j/|#||d |d||d�	}(W 5 Q R X |(|#fS )NÚmoder   r   r   r
   rÅ   ÚvecZ2darrowÚarrow)rõ   rÅ   r÷   Zconeç      à?r   ZcylinderÚoctr  éZ   ©é   r  Úvectorrô   F)rÃ   rÄ   rÆ   rÅ   r×   rÊ   rÈ   r  )0r   r   rƒ   r„   r…   r†   rž   rÎ   Zvstackr­   rà   r!   ÚrangeÚVTK9Zaranger   rÏ   rê   r   Ú_arrow_glyphÚ_glyphru   Úwraprÿ   r*   Ú	SetCenterrý   r+   r-   ZSetSolidTypeToOctahedronÚAssertionErrorr)   Z	SetHeightZSetResolutionr#   Z
RotateWXYZrG   Z	SetMatrixrÐ   rÒ   Zravelrþ   r&   ÚSetInputDataÚSetTransformr   rÔ   r[   ))r?   r¢   r£   rá   ÚuÚvÚwrÄ   rö   r  r  Zglyph_heightZglyph_centerZglyph_resolutionrÆ   Ú
scale_moderÅ   r×   rÈ   rÌ   r�   Zglyph_widthZglyph_depthZglyph_radiusZsolid_transformr  r÷   ZvectorsÚpointsrÍ   Z	cell_typeÚcellsÚargsÚgridÚalgrÃ   Útrr   Útrprø   rÜ   r=   r=   r@   Úquiver3d   s¤    


ü














ÿ

 ÿ÷z_PyVistaRenderer.quiver3dé   c           	   	   C   s¶   |d krdn|}||f}t  ¡ �„ t jdtd� | jj||||dd�}t|tƒr |dkrf| ¡  	¡  n:|dkr|| ¡  
¡  n$|dkr’| ¡  ¡  ntd	 |¡ƒ‚W 5 Q R X t|ƒ |S )
Nr+  r   r   T)ÚpositionÚ	font_sizerÄ   ZviewportÚleftr  ÚrightzVExpected values for `justification`are `left`, `center` or `right` but got {} instead.)rƒ   r„   r…   r†   r[   Úadd_textr~   ÚstrZGetTextPropertyZSetJustificationToLeftZSetJustificationToCenteredZSetJustificationToRightÚ
ValueErrorÚformatÚ_hide_testing_actor)	r?   Zx_windowZy_windowÚtextr\   rÄ   Zjustificationr,  rÜ   r=   r=   r@   Útext2dY  s*    

ý
þz_PyVistaRenderer.text2dc           	   
   C   s€   t  ¡ �f t jdtd� tt |||g¡ t¡|g||| j	|dd�}dt
| jjƒkr\d|d< | jjf |Ž}W 5 Q R X t|ƒ |S )Nr   r   r   )r#  r»   Z
point_sizeZ
text_colorr|   r�   Zshape_opacityZalways_visibleT)rƒ   r„   r…   r†   rT   rž   rê   rÐ   rß   r|   r   r[   Zadd_point_labelsr4  )	r?   r¢   r£   rá   r5  rö   rÄ   rµ   rÜ   r=   r=   r@   Útext3dq  s     
ù	z_PyVistaRenderer.text3dr  c           
      K   s”   t |tƒr|}nt |tƒr$| ¡ }nd }t ¡ �R tjdtd� t|||dddddddd	| j	||d
�}| 
|¡ | jjf |Ž}	W 5 Q R X t|	ƒ |	S )Nr   r   Fé   r  gš™™™™™©?r¦   Té   )rÄ   rL   Ún_labelsZuse_opacityZn_colorsZ
position_xZ
position_yrì   ZshadowÚboldZlabel_font_sizer|   rP   rÝ   )r~   r0   r1   rÕ   rƒ   r„   r…   r†   rT   r|   r“   r[   Zadd_scalar_barr4  )
r?   ÚsourcerÄ   rL   r:  rŒ   Úextra_kwargsrÝ   rµ   rÜ   r=   r=   r@   Ú	scalarbarƒ  s0    



       ü
z_PyVistaRenderer.scalarbarc                 C   s   | j  ¡  d S r<   )r[   rK   r>   r=   r=   r@   rK   —  s    z_PyVistaRenderer.showc                 C   s   t | jd� d S )Nr¤   )Ú_close_3d_figurer‚   r>   r=   r=   r@   Úcloseš  s    z_PyVistaRenderer.closec                 C   s
   t | jƒS r<   )Ú_get_3d_viewr‚   r>   r=   r=   r@   Ú
get_camera�  s    z_PyVistaRenderer.get_cameraÚautoc	           	      C   s    t | j||||||||d�	 d S )N)ÚazimuthÚ	elevationÚdistanceÚ
focalpointÚrollÚreset_cameraÚrigidr“   )Ú_set_3d_viewr‚   )	r?   rD  rE  rF  rG  rH  rI  rJ  r“   r=   r=   r@   Ú
set_camera   s    
    þz_PyVistaRenderer.set_camerac                 C   s   | j  ¡  d S r<   )r[   rI  r>   r=   r=   r@   rI  §  s    z_PyVistaRenderer.reset_cameraÚrgbc                 C   s   t | j||d�S )N©r‚   r  Úfilename)Ú_take_3d_screenshotr‚   )r?   r  rO  r=   r=   r@   Ú
screenshotª  s    ÿz_PyVistaRenderer.screenshotc                 C   s:   t | j|ƒ}tt||ƒƒ}| jj ¡  ¡ }t||| jd�S )Nrk   )Ú	_3d_to_2dr[   rT   r  r’   Z	GetActorsZGetLastItemrj   )r?   ÚxyzZch_namesrl   rm   r=   r=   r@   Úproject®  s    z_PyVistaRenderer.projectc                 C   s.   | j s
d S | jjd s*| jD ]}| ¡  qd S )NrH   )ry   r‚   rU   r�   Zenable_depth_peelingr‘   r=   r=   r@   rŠ   ¶  s
    
z&_PyVistaRenderer._enable_depth_peelingc                 C   sr   | j s
dS | j ¡ rntjdkp0t dd¡ ¡ dk}|t| j	ƒO }|sX| j
D ]}| ¡  qJ| jD ]}|j ¡  q^dS )z"Enable it everywhere except Azure.Nrv   ZAZURE_CI_WINDOWSÚfalseÚtrue)rx   r‚   re   rz   r{   ÚosÚgetenvÚlowerÚ_is_mesar[   r�   Zenable_anti_aliasingr�   rd   ZLineSmoothingOn)r?   Z
bad_systemr’   r[   r=   r=   r@   r‰   ½  s    

þ


z"_PyVistaRenderer._enable_antialiasc                 C   s   |\}}| j  |¡ d S r<   )r[   Zremove_actor)r?   Z	mesh_datarÜ   Ú_r=   r=   r@   Úremove_meshÓ  s    z_PyVistaRenderer.remove_meshc                 c   s:   | j j ¡ sd V  n"| j  ¡  z
d V  W 5 | j  ¡  X d S r<   )r[   r’   ZGetInteractiveÚdisableÚenabler>   r=   r=   r@   Ú_disabled_interaction×  s    

z&_PyVistaRenderer._disabled_interactionc                 C   s$   t ƒ }|d k	r| |¡ t|ƒ |S r<   )r1   Ú	SetMapperr4  )r?   rÝ   rÜ   r=   r=   r@   Ú_actorâ  s
    
z_PyVistaRenderer._actorc                 C   s   | j D ]}t|ƒ qd S r<   )r�   ra   r”   r=   r=   r@   ra   é  s    
z _PyVistaRenderer._process_eventsc                 C   s\   | j jj}|tj|ƒ |tj|ƒ |tj|ƒ tƒ | j _| j j 	tj
|¡ | j j d¡ d S )Nr©   )r[   r`   Zadd_observerr   ZRenderEventZLeftButtonPressEventZEndInteractionEventr2   ZpickerÚAddObserverZEndPickEventZSetVolumeOpacityIsovalue)r?   Zon_mouse_moveZon_button_pressZon_button_releaseZon_pickZadd_obsr=   r=   r@   Ú_update_picking_callbackí  s    

þz)_PyVistaRenderer._update_picking_callbackc              	   C   s2   t  ¡ �  t jdtd� |t|ƒ|< W 5 Q R X d S ©Nr   r   )rƒ   r„   r…   r†   r   )r?   rÃ   rÅ   r�   r=   r=   r@   Ú_set_mesh_scalarsý  s    
z"_PyVistaRenderer._set_mesh_scalarsc                 C   s€   |d k	r0|  ¡ }|j|Ž  | ¡ }| t|ƒ¡ |d k	r|| ¡ }|d k	r`t |¡d }t||ƒ}| t|td�¡ |j	|Ž  d S )Nr¾   )Z
array_type)
rÕ   ZSetScalarRangeZGetLookupTableÚSetTabler9   rž   rê   r   r    ÚSetRange)r?   rÜ   ÚctableÚ
scalar_barrÉ   rP   rÝ   Úlutr=   r=   r@   Ú_set_colormap_range  s    

z$_PyVistaRenderer._set_colormap_rangec                 C   sÔ   t ƒ }tƒ }ttj|dt|ƒiŽ|ƒD ]<\}}	|j|f|	d d… d žŽ  | ||	d | d ¡ q&| ¡  | ¡  | 	¡ }
|
 
|¡ |
 |¡ |
 ¡  |
 ¡  |d k	rÐtƒ }|j|Ž  | t|ƒ¡ | |¡ d S )NÚnumró   r¿   )r3   r"   r  rž   Zlinspacer­   ZAddRGBPointZAddPointZ
ClampingOnÚGetPropertyr¯   ZSetScalarOpacityZShadeOnZSetInterpolationTypeToLinearr   rg  rf  r9   ZSetLookupTable)r?   Úvolumerh  Úalphari  rÉ   Zcolor_tfZ
opacity_tfrœ   rÄ   Úproprj  r=   r=   r@   Ú_set_volume_range  s"    "


z"_PyVistaRenderer._set_volume_rangec                 C   sh   ddl m} |ƒ }| d¡ | d¡ | |¡ | |¡ | ¡  t | 	¡ ¡}t
| j||d�}||fS )Nr   rñ   rð   )rÃ   rÄ   )rù   r)   rû   rü   rý   r  rþ   ru   r  rÿ   rÔ   r[   )r?   r  rÄ   rè   r)   r  rÃ   rÜ   r=   r=   r@   Ú_sphere&  s    



ýz_PyVistaRenderer._spherec	                 C   sì  t  ¡ }	|d |	_||	_||	_|t|	ƒd< |dks:|d k	r^tƒ }
|
 |	¡ |
 d¡ |
 	¡  nd }
|dkr¸t
ƒ }| ¡  | ¡  | |
 ¡ ¡ | dd¡ | 	¡  tƒ }| | ¡ ¡ nd }tƒ }|d krÞ| ¡  | |	¡ n:tƒ }| ¡  |j|gd Ž  | |
 ¡ ¡ | | ¡ ¡ tddd	�}t|d
|| › �ƒƒ  tƒ }| |¡ |	jt |	j¡d  }| ¡   |¡ |d k	�rÜ|dk�rÜtƒ }|d k�r¦| ¡  | |	¡ n| | ¡ ¡ | !¡  tƒ }| |¡ | ¡   |¡ nd }|	|||fS )Nr   Úvaluesr   Fr·   r
   Z	CompositeZMaximumIntensity)Z	compositeÚmipZSetBlendModeTort  )"ru   ZUniformGridÚ
dimensionsr  Úspacingr   r$   ZSetInputDataObjectZSetPassCellDatarþ   r'   ZComputeNormalsOnZComputeScalarsOffr  rÿ   ÚSetValuer4   r8   ZSetScalarModeToUseCellDatar/   ZSetInterpolationModeToLinearZSetOutputSpacingÚSetInputConnectionÚGetOutputPortrT   r³   r5   r`  Úlengthrž   Zmeanrm  ZSetScalarOpacityUnitDistanceZSetBlendModeToMinimumIntensity)r?   ru  r  rv  rÅ   Zsurface_alphar  Zblendingr  r&  Zgrid_algZgrid_surfaceZ	grid_meshrÝ   Z	upsamplerZremapZ
volume_posÚdistZ
mapper_negZ
volume_negr=   r=   r@   Ú_volume6  s`    






z_PyVistaRenderer._volumec           
      C   s´   |d k	r|  |¡n|}tƒ }| |¡ | | jj ¡ ¡ | d¡ tƒ }| 	| 
¡ ¡ | jj|dd dddd�\}}	|d k	r„|	j|Ž  |d k	r–|	 |¡ |d k	r¨|	 |¡ t|ƒ |S )Nr   F)rI  r�   ZcullingZpickablero   )Údecimater(   r  Z	SetCamerar[   r’   ZGetActiveCameraZSetEnableFeatureAngler4   rx  ry  Z	add_actorr¯   Z
SetOpacityZSetLineWidthr4  )
r?   rÃ   rÄ   rÌ   ro  r}  Zsilhouette_filterZsilhouette_mapperrÜ   rp  r=   r=   r@   Ú_silhouettev  s2    

ÿ    þ



z_PyVistaRenderer._silhouette)
NrC   rF   rB   FrE   NTFN)Fr·   r¸   r¹   )Nrª   NFNNNNTr½   rª   N)rª   FFNNNNTr½   rª   NN)rª   rª   NNNFrä   N)	Nrª   NNNFNFN)rª   rð   FN)r  r  NNNr  FF)rð   NNNrª   r	  NNFr
  NNNr  N)r+  r  N)r  )r  Nr  N)NNNrC  NTNT)rM  N)N)NN)NNNN)0rf   rg   rh   ri   rA   Úpropertyr�   r�   rˆ   r•   rš   r�   r¡   r¥   r‹   r¶   r¼   rÞ   rÃ   rë   r½   r  rç   r*  r6  r7  r>  rK   r@  rB  rL  rI  rQ  rT  rŠ   r‰   r\  r   r_  ra  ra   rc  re  rk  rq  rr  r|  r~  r=   r=   r=   r@   rr   ¦   s  
            ý
7

  ÿ
               ü
0                 ü
           þ
             ý
     þ
           þ
                        ûûY  ÿ

  ÿ
         þ




  ÿ
@  ÿrr   c                 C   s"   dt | ƒkr| jddddd� dS )zPatch PyVista compute_normals.rÁ   FT)Zcell_normalsZconsistent_normalsZnon_manifold_traversalZinplaceN)r   Zcompute_normals)rÃ   r=   r=   r@   rÓ   �  s    ürÓ   c                 O   sj   |  d¡}d|kr| d¡}nd}d|kr2d|d< | j||Ž}|r^dt|ƒkr^| ¡ }| ¡  t|ƒ |S )zPatch PyVista add_mesh.rÃ   rQ   Tro   FrÁ   )r�   r«   Zadd_meshr   rm  ZSetInterpolationToPhongr4  )r[   r%  rµ   rÃ   rQ   rÜ   rp  r=   r=   r@   rÔ   ˜  s    
rÔ   c                 C   s    ddl m} |jr|  d¡ d S )Nr   )r’   F)Ú r’   ZMNE_3D_BACKEND_TESTINGrn   )rÜ   r’   r=   r=   r@   r4  «  s    r4  c                 C   s   | t j d S ©Nç     €f@©rž   Úpi)Údegr=   r=   r@   Ú_deg2rad±  s    r†  c                 C   s   | d t j S r�  rƒ  )Zradr=   r=   r@   Ú_rad2degµ  s    r‡  c                 C   s\   | t j d }d| t j d }t  |¡t  |¡ }t  |¡}t  |¡t  |¡ }|||fS )Nr‚  g     €V@)rž   r„  ÚsinÚcos)rD  rE  ÚthetaÚphir¢   r£   rá   r=   r=   r@   r®   ¹  s    
r®   c                    s.   ‡ fdd„t dƒD ƒ}tj|td�}d|_|S )Nc                    s&   g | ]}t d ƒD ]}ˆ  ||¡‘qqS )r  )r  Z
GetElement)Ú.0ÚiÚj©Úvtk_matr=   r@   Ú
<listcomp>Ã  s     
  z!_mat_to_array.<locals>.<listcomp>r  rò   r  )r  rž   rê   rß   rG   )r�  ÚeZarrr=   r�  r@   Ú_mat_to_arrayÂ  s    r“  c                 C   sR   t ƒ }| ¡  tƒ }|D ] }|j|Ž  | | | j¡¡ qt |t	¡ 
dd¡}|S )Nró   rs   )r6   ZSetCoordinateSystemToWorldrŽ   rw  ÚappendZGetComputedLocalDisplayValuer’   rž   rê   rß   Zreshape)r[   rS  Z
coordinaterl   Zcoordr=   r=   r@   rR  É  s    
rR  c                	   C   s4   t  ¡ � t jdtd� tƒ  W 5 Q R X t ¡  d S rd  )rƒ   r„   r…   ÚDeprecationWarningr   r€   Úclearr=   r=   r=   r@   Ú
_close_allÕ  s    
r—  c                 C   sP   ||  \}}}t  || ||  ||  ¡}t  || ¡}t  ||¡}|||fS r<   )rž   ÚsqrtZarccosZarctan2)rG  r,  r¢   r£   rá   ÚrrŠ  r‹  r=   r=   r@   Ú_get_camera_directionÜ  s
    rš  c                 C   sd   t  | jjd ¡}t  | jjd ¡}t||ƒ\}}}t|ƒt|ƒ }}| jj ¡ | jj ¡ |||fS r›   )	rž   rê   r[   Úcamera_positionrš  r‡  ÚcameraÚGetRollZGetDistance)r‚   r,  rG  r[  rŠ  r‹  rD  rE  r=   r=   r@   rA  ä  s    

  þrA  rC  Tc	                 C   s*  |d krt  d¡n|}t  | jjd ¡}	t  | jj ¡ ¡}
|rH| j ¡  t|t	ƒr„t
d|ddd� |
dd d… |
d d d…  d	 }n&|d kr t  | jjd ¡}n
t  |¡}t||	ƒ}	t||ƒ}t||	ƒ\}}}|d k	rÞt|ƒ}|d k	rît|ƒ}|d k�rt|
dd d… |
d d d…  ƒd
 }|d k�sFdt|ƒ  k�rBdk�rRn ndddg}n
dddg}|t  |¡ t  |¡ |t  |¡ t  |¡ |t  |¡ g}	t|ƒ| _t|ƒ| _t j |¡}t||	ƒ}	t||ƒ}t||dd�}|	||g| j_|d k	�r| jj | jj ¡ | ¡ |�r&| j ¡  t| jƒ d S )Nr  r   rG  )rC  zwhen a string)Úextrar   rs   r  r
  g      @g     àe@F)Úmove)rž   Úeyerê   r[   r›  r’   ZComputeVisiblePropBoundsrI  r~   r1  r   Zasarrayr   rš  r†  rŸ   Úabsr‰  rˆ  r‡  rY   rZ   ZlinalgÚinvrœ  ZSetRollr�  r“   ra   )r‚   rD  rE  rG  rF  rH  rI  rJ  r“   r,  Zboundsr[  rŠ  r‹  Zview_upr=   r=   r@   rK  î  sX    

ÿ"



$*
ý



  ÿ

rK  é   c              	   C   sN   t  ¡ �( t jdtd� | jj||ddd� W 5 Q R X | j ¡  t| jƒ d S )Nr   r   r  rL   )r-  rÄ   r�   )rƒ   r„   r…   r†   r[   r0  r“   ra   )r‚   rL   r\   r=   r=   r@   Ú_set_3d_title2  s    
ÿ
r¤  c                 C   s   t | tdƒ d S )Nr‚   )r   r;   r¤   r=   r=   r@   Ú_check_3d_figure;  s    r¥  c              	   C   sT   t  ¡ �B t jdtd� | j}| ¡  t|ƒ | ¡  t|j	= t|ƒ W 5 Q R X d S rd  )
rƒ   r„   r…   r†   r[   r@  ra   Z
deep_cleanr   Z_id_name)r‚   r[   r=   r=   r@   r?  ?  s    
r?  rM  c              
   C   sL   t  ¡ �: t jdtd� t| jƒ | jj|dk|d�W  5 Q R £ S Q R X d S )Nr   r   rÂ   )Útransparent_backgroundrO  )rƒ   r„   r…   r†   ra   r[   rQ  rN  r=   r=   r@   rP  M  s    

þrP  c              	   C   s<   t | dƒr8tjdd�� t dd¡ | j ¡  W 5 Q R X d S )Nr^   T)Úrecordr   Zconstrained_layout)r_   rƒ   r„   r…   r^   ZprocessEvents)r[   r=   r=   r@   ra   V  s    
ra   c                 C   s   |   tj|¡ d S r<   )rb  r   ZModifiedEvent)rœ  Úcallbackr=   r=   r@   Ú_add_camera_callback]  s    r©  c                 C   sˆ   t ƒ }| ¡  | ¡  | ¡  tƒ }| ddd¡ tƒ }| | ¡ ¡ | 	|¡ | ¡  t
| ddd|| ¡ d�}tƒ }| | ¡ ¡ |S )Nr  r©   r  Fr  )r"  rÅ   rõ   r÷   rø   )r.   ZSetGlyphTypeToArrowZ	FilledOffrþ   r#   Z	Translater&   rx  ry  r  r  r7   )r&  r÷   r   r(  r)  r'  rÝ   r=   r=   r@   r  a  s*    
úr  Úscalarrª   r©   Fc
                 C   sÄ   |d krt ƒ }
|
 ¡  |
 ¡ }tƒ }| |¡ t|tƒr>|| _t|tƒrR|| _d}|dkrd| 	¡  n|dkrv| 
¡  n| ¡  |	d k	r�| |	¡ | |¡ | | ¡ | |¡ | |¡ | ¡  |S )NTrª  r  )r,   rþ   ry  r%   ZSetSourceConnectionr~   r1  Zactive_scalars_nameZactive_vectors_nameZSetScaleModeToScaleByScalarZSetScaleModeToScaleByVectorZSetScaleModeToDataScalingOffrg  Z	SetOrientr  ZSetScaleFactorZSetClamping)Zdatasetr"  rõ   rÅ   r÷   rø   Z	toleranceÚabsoluteZclampingrÉ   r  r'  r=   r=   r@   r  |  s0    









r  c               	   c   sj   zddl m}  W n( tk
r8   ddl m} |d }Y nX | j}|d }d|d< z
d V  W 5 ||d< X d S )Nr   )Úglobal_theme)ÚrcParamsry   ZenabledF)ru   r¬  Ú	Exceptionr­  ry   )r¬  r­  ry   Zdepth_peeling_enabledr=   r=   r@   r‡   ™  s    
r‡   c                 C   s,   | j  ¡ }t d|¡}dd |¡ ¡  ¡ kS )NzOpenGL renderer string:(.+)
z mesa ú )rd   ZReportCapabilitiesÚreÚfindallÚjoinrY  Úsplit)r[   Zgpu_infor=   r=   r@   rZ  ª  s    
rZ  )NNrC  NNTNT)r£  )rM  N)	rª  TTrª   Nr©   FFN)qri   Ú
contextlibr   rW  r°  rz   rƒ   Únumpyrž   Z	_abstractr   r   Z_utilsr   r   r   r	   Úfixesr   r   r   r   Z
transformsr   Úutilsr   r   r   r   r„   r…   r•  ru   r   r   r   r   r   Z	pyvistaqtr   ÚImportErrorZpyvista.plotting.plottingr   Zvtkmodules.vtkCommonCorer   r   r    Zvtkmodules.vtkCommonDataModelr!   r"   Zvtkmodules.vtkCommonTransformsr#   Zvtkmodules.vtkFiltersCorer$   r%   Zvtkmodules.vtkFiltersGeneralr&   r'   Zvtkmodules.vtkFiltersHybridr(   rù   r)   r*   r+   r,   r-   r.   Zvtkmodules.vtkImagingCorer/   Zvtkmodules.vtkRenderingCorer0   r1   r2   r3   r4   r5   r6   r7   Z$vtkmodules.vtkRenderingVolumeOpenGL2r8   Zvtkmodules.util.numpy_supportr9   r:   r®  r  rT   r€   r;   Úobjectrj   rr   rÓ   rÔ   r4  r†  r‡  r®   r“  rR  r—  rš  rA  rK  r¤  r¥  r?  rP  ra   r©  r  r  r‡   rZ  r=   r=   r=   r@   Ú<module>   s¢   
 (
J     k	
         þ
D
	
	          ÿ

