
    tjF                         d Z ddlZddlZddlZddlmZmZmZ ddlZ G d dej                        Z
 G d de
      Zd Zed	k(  r e        yy)
a  
Description:

  Provides a simple VTK widget for pyGtk.  This embeds a
  vtkRenderWindow inside a GTK widget.  This is based on
  vtkTkRenderWidget.py.  The GtkVTKRenderWindowBase class provides the
  abstraction necessary for someone to use their own interaction
  behaviour.  The method names are similar to those in
  vtkInteractorStyle.h.

  The class uses the gtkgl.GtkGLArea widget (gtkglarea).  This avoids
  a lot of problems with flicker.

  There is a working example at the bottom.

Credits:

  Thanks to Dave Reed for testing the code under various platforms and
  for his suggestion to use the GtkGLArea widget to avoid flicker
  related issues.

Created by Prabhu Ramachandran, March 2001.

Using GtkGLArea, March, 2002.

Bugs:

  (*) There is a focus related problem.  Tkinter has a focus object
  that handles focus events.  I don't know of an equivalent object
  under GTK.  So, when an 'enter_notify_event' is received on the
  GtkVTKRenderWindow I grab the focus but I don't know what to do when
  I get a 'leave_notify_event'.

  (*) Will not work under Win32 because it uses the XID of a window in
  OnRealize.  Suggestions to fix this will be appreciated.

    N)vtkCellPickervtkPropertyvtkRenderWindowc                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd ZddZd ZddZd Zd Zd Zd Zd Zd Zd Zy)GtkVTKRenderWindowBasea|   A base class that enables one to embed a vtkRenderWindow into
    a pyGTK widget.  This class embeds the RenderWindow correctly.
    Provided are some empty methods that can be overloaded to provide
    a user defined interaction behaviour.  The event handling
    functions have names that are somewhat similar to the ones in the
    vtkInteractorStyle class included with VTK. c                    t        |      }t        j                  t        j                  f}|j	                  d|        |j	                  d|       t        t        j                  j                  |       t               | _	        d| _
        d| _        d| _        | j                          | j                  t        j                          | j#                  dd       y )Nr         g-C6?i,  )listgtkglRGBADOUBLEBUFFERinsertapply	GtkGLArea__init__r   _RenderWindow _GtkVTKRenderWindowBase__Created_DesiredUpdateRate_StillUpdateRateConnectSignals	set_flagsgtk	CAN_FOCUS	set_usize)selfargslattrs       N/DATA/.local/lib/python3.12/site-packages/vtkmodules/gtk/GtkVTKRenderWindow.pyr   zGtkVTKRenderWindowBase.__init__5   s    J

E../	D	Deoo&&*,.  #% & 	s}}%sC     c                 `   | j                  d| j                         | j                  d| j                         | j                  d| j                         | j                  d| j                         | j                  d| j
                         | j                  d| j                         | j                  d| j                         | j                  d| j                         | j                  d	| j                         | j                  d
| j                         | j                  t        j                  t        j                  z  t        j                  z  t        j                   z  t        j"                  z  t        j$                  z  t        j&                  z  t        j(                  z         y )Nrealizeexpose_eventconfigure_eventbutton_press_eventbutton_release_eventmotion_notify_evententer_notify_eventleave_notify_eventkey_press_eventdelete_event)connect	OnRealizeOnExposeOnConfigureOnButtonDown
OnButtonUpOnMouseMoveOnEnterOnLeave
OnKeyPress	OnDestroy
add_eventsGDKEXPOSURE_MASKBUTTON_PRESS_MASKBUTTON_RELEASE_MASKKEY_PRESS_MASKPOINTER_MOTION_MASKPOINTER_MOTION_HINT_MASKENTER_NOTIFY_MASKLEAVE_NOTIFY_MASKr   s    r    r   z%GtkVTKRenderWindowBase.ConnectSignalsK   s@   Y/^T]]3&(8(89)4+<+<=+T__=*D,<,<=)4<<8)4<<8&8^T^^4))3+@+@@//0**+ //0 44	5
 --.
 140E0EF 	Gr!   c                     | j                   S N)r   rB   s    r    GetRenderWindowz&GtkVTKRenderWindowBase.GetRenderWindow]   s    !!!r!   c                     | j                   j                         j                          | j                   j                         j                         S rD   )r   GetRenderersInitTraversalGetNextItemrB   s    r    GetRendererz"GtkVTKRenderWindowBase.GetRenderer`   s;    '')779!!..0<<>>r!   c                     || _         yKMirrors the method with the same name in
        vtkRenderWindowInteractor.Nr   r   rates     r    SetDesiredUpdateRatez+GtkVTKRenderWindowBase.SetDesiredUpdateRated   s     #'r!   c                     | j                   S rM   rN   rB   s    r    GetDesiredUpdateRatez+GtkVTKRenderWindowBase.GetDesiredUpdateRatei   s     &&&r!   c                     || _         yrL   r   rO   s     r    SetStillUpdateRatez)GtkVTKRenderWindowBase.SetStillUpdateRaten   s     !%r!   c                     | j                   S rS   rV   rB   s    r    GetStillUpdateRatez)GtkVTKRenderWindowBase.GetStillUpdateRates   s     $$$r!   c                 R    | j                   r| j                  j                          y y rD   )r   r   RenderrB   s    r    r[   zGtkVTKRenderWindowBase.Renderx   s     >>%%' r!   c                     | j                   dk(  rU| j                          t        | j                         j                        }| j
                  j                  |       d| _         t        j                  S Nr   r	   )	r   r#   str
get_windowxidr   SetWindowInfor   TRUE)r   r   win_ids      r    r.   z GtkVTKRenderWindowBase.OnRealize|   sR    >>QLLN*../F,,V4DNxxr!   Nc                     | j                   j                         }|j                  |d   k7  s|j                  |d   k7  r0| j                   j	                  |j                  |j                         t
        j                  S r]   )r   GetSizewidthheightSetSizer   rb   )r   wideventszs       r    r0   z"GtkVTKRenderWindowBase.OnConfigure   s\    '')KK2a5 ellbe&;&&u{{ELLAxxr!   c                 B    | j                          t        j                  S rD   )r[   r   rb   )r   r   s     r    r/   zGtkVTKRenderWindowBase.OnExpose   s    xxr!   c                 f    | j                          | `| j                          t        j                  S rD   )hider   destroyr   rb   )r   rj   s     r    r7   z GtkVTKRenderWindowBase.OnDestroy   s#    		xxr!   c                 l    | j                   j                  | j                         t        j                  S )zMouse button pressed.)r   rQ   r   r   rb   r   ri   rj   s      r    r1   z#GtkVTKRenderWindowBase.OnButtonDown   s%    //0G0GHxxr!   c                 l    | j                   j                  | j                         t        j                  S )zMouse button released.)r   rQ   r   r   rb   rq   s      r    r2   z!GtkVTKRenderWindowBase.OnButtonUp   s%    //0E0EFxxr!   c                 "    t         j                  S )zMouse has moved.r   rb   rq   s      r    r3   z"GtkVTKRenderWindowBase.OnMouseMove       xxr!   c                 "    t         j                  S )zEntering the vtkRenderWindow.rt   rq   s      r    r4   zGtkVTKRenderWindowBase.OnEnter   ru   r!   c                 "    t         j                  S )zLeaving the vtkRenderWindow.rt   rq   s      r    r5   zGtkVTKRenderWindowBase.OnLeave   ru   r!   c                 "    t         j                  S )zKey pressed.rt   rq   s      r    r6   z!GtkVTKRenderWindowBase.OnKeyPress   ru   r!   c                 "    t         j                  S )zKey released.rt   rq   s      r    OnKeyReleasez#GtkVTKRenderWindowBase.OnKeyRelease   ru   r!   rD   )__name__
__module____qualname____doc__r   r   rE   rJ   rQ   rT   rW   rY   r[   r.   r0   r/   r7   r1   r2   r3   r4   r5   r6   rz    r!   r    r   r   ,   sl    4!,G$"?'
'
%
%
(

r!   r   c                       e Zd ZdZd Zd Zd ZddZddZd Z	dd	Z
d
 Zd Zd Zd Zd Zd ZddZddZd Zd Zd Zd Zd Zd Zd Zy)GtkVTKRenderWindowz An example of a fully functional GtkVTKRenderWindow that is
    based on the vtkRenderWidget.py provided with the VTK sources.c                    t        |      }|j                  d|        t        t        j                  |       d | _        d | _        d| _        d | _        d| _	        d| _
        t               | _        d | _        t               | _        | j                  j!                  ddd       d | _        d | _        d| _        d| _        y )Nr         ?r	   )r   r   r   r   r   _CurrentRenderer_CurrentCamera_CurrentZoom_CurrentLight_ViewportCenterX_ViewportCenterYr   _Picker_PickedAssemblyr   _PickedPropertySetColor_PrePickedProperty	_OldFocus_LastX_LastY)r   r   r   s      r    r   zGtkVTKRenderWindow.__init__   s    J	D$--q1 $"! ! !$#*}%%aA."& r!   c                 p    | j                   j                  | j                         | j                  ||      S rD   )r   rQ   r   StartMotionrq   s      r    r1   zGtkVTKRenderWindow.OnButtonDown   s/    //0G0GHU++r!   c                 p    | j                   j                  | j                         | j                  ||      S rD   )r   rQ   r   	EndMotionrq   s      r    r2   zGtkVTKRenderWindow.OnButtonUp   s-    //0E0EF~~c5))r!   Nc                 R   |j                   t        j                  z  t        j                  k(  r|j                   t        j                  z  t        j                  k(  r8| j	                         }| j                  |d   |d          t        j                  S | j	                         }| j                  |d   |d          t        j                  S |j                   t        j                  z  t        j                  k(  r8| j	                         }| j                  |d   |d          t        j                  S |j                   t        j                  z  t        j                  k(  r8| j	                         }| j                  |d   |d          t        j                  S t        j                  S r]   )stater9   BUTTON1_MASK
SHIFT_MASKget_pointerPanr   rb   RotateBUTTON2_MASKBUTTON3_MASKZoomFALSEr   ri   rj   ms       r    r3   zGtkVTKRenderWindow.OnMouseMove   s0   [[3+++0@0@@s~~-#..@$$&1qt$xx$$&AaD!A$'xx{{S---#2B2BB  "AHHQqT1Q4 88O{{S---#2B2BB  "AIIadAaD!88O99r!   c                     | j                          | j                         }| j                  |d   |d          t        j                  S r]   )
grab_focusr   UpdateRendererr   rb   )r   ri   rj   ws       r    r4   zGtkVTKRenderWindow.OnEnter   s;    AaD!A$'xxr!   c                 "    t         j                  S rD   rt   rq   s      r    r5   zGtkVTKRenderWindow.OnLeave   s    xxr!   c                 "   |j                   t        j                  k(  s|j                   t        j                  k(  r | j	                          t
        j                  S |j                   t        j                  k(  s|j                   t        j                  k(  r | j                          t
        j                  S |j                   t        j                  k(  s|j                   t        j                  k(  r | j                          t
        j                  S |j                   t        j                  k(  s|j                   t        j                  k(  r8| j                         }| j!                  |d   |d          t
        j                  S t
        j"                  S r]   )keyvalr9   rRResetr   rb   r   W	WireframesSSurfacepPr   	PickActorr   r   s       r    r6   zGtkVTKRenderWindow.OnKeyPress   s    LLCEE!u||suu'<JJL88Ollcee#)>NN88Ollcee#)>LLN88Ollcee#)>  "ANN1Q41&88O99r!   c                     | j                   S rD   r   rB   s    r    GetZoomFactorz GtkVTKRenderWindow.GetZoomFactor	  s       r!   c                     || _         y rD   r   )r   zfs     r    SetZoomFactorz GtkVTKRenderWindow.SetZoomFactor  s
    r!   c                     | j                   S rD   )r   rB   s    r    	GetPickerzGtkVTKRenderWindow.GetPicker  s    ||r!   c                    | j                   r^| j                   }|j                  | j                  j                                |j	                  | j                  j                                t        j                  |        y rD   )r   SetPositionr   GetPositionSetFocalPointGetFocalPointr   r[   )r   lights     r    r[   zGtkVTKRenderWindow.Render  s^    &&Ed11==?@ 3 3 A A CD%%d+r!   c                 R   | j                         j                  }| j                         j                  }| j                  j	                         }|j                         }d| _        |j                          t        d|      D ]  }|j                         }d\  }	}
|dkD  rt        |      |dz
  z  }	|dkD  r|t        |      z
  dz
  |dz
  z  }
|j                         \  }}}}|	|k\  sf|	|k  sl|
|k\  sr|
|k  sx|| _        t        |      ||z
  z  dz  |z   | _        t        |      ||z
  z  dz  |z   | _        | j                  j                         | _        | j                  j!                         }|j                          |j                         | _         n || _        || _        y)z
        UpdateRenderer will identify the renderer under the mouse and set
        up _CurrentRenderer, _CurrentCamera, and _CurrentLight.
        Nr   )r   r   r	   g       @)r_   rf   rg   r   rG   GetNumberOfItemsr   rH   rangerI   floatGetViewportr   r   GetActiveCamerar   	GetLightsr   r   r   )r   xywindowXwindowY	renderersnumRenderersirenderervxvyvpxminvpyminvpxmaxvpymaxlightss                   r    r   z!GtkVTKRenderWindow.UpdateRenderer  s   
 //#))//#**&&335	 113 $!q&A ,,.HEBr!1Xwqy)!eAh&q(7195,4,@,@,B)VF6&fvfv(0%(-gv(Fs(J)/)0%(-gv(Fs(J)/)0%&*&;&;&K&K&M#..88:$$&%+%7%7%9") ', r!   c                     | j                   S rD   )r   rB   s    r    GetCurrentRendererz%GtkVTKRenderWindow.GetCurrentRenderer@  s    $$$r!   c                 v    |j                   }|j                  }| j                  ||       t        j                  S rD   )r   r   r   r   rb   )r   ri   rj   r   r   s        r    r   zGtkVTKRenderWindow.StartMotionC  s-    GGGGAa xxr!   c                 Z    | j                   r| j                          t        j                  S rD   )r   r[   r   rb   rq   s      r    r   zGtkVTKRenderWindow.EndMotionI  s      KKMxxr!   c                 b   | j                   r| j                  j                  | j                  |z
         | j                  j	                  || j
                  z
         | j                  j                          || _        || _        | j                   j                          | j                          y y rD   )	r   r   Azimuthr   	Elevationr   OrthogonalizeViewUpResetCameraClippingRanger[   )r   r   r   s      r    r   zGtkVTKRenderWindow.RotateN  s      ''a8))!dkk/:335DKDK!!::<KKM !r!   c                    | j                   r| j                   }| j                  }|j                         \  }}}|j                         \  }}	}
|j	                         rH|j                  ||	|
d       |j                          |j                         \  }}}|j                  ||z
  | j                  z   ||z   | j                  z
  |       |j                          |j                         \  }}}}|j                  |||       |j                  |||d       |j                          |j                         \  }}}|j                  ||z
  | j                  z   ||z   | j                  z
  |       |j                          |j                         \  }}}}|j                  |||       n|j                         \  }}	}
|j                  ||	|
d       |j                          |j                         }|d   }| j                  || j                  z
  z   }| j                   || j                  z
  z
  }|j                  |||       |j                          |j                         \  }}}}|dk7  r||z  }||z  }||z  }|j                  ||z
  |z   |	|z
  |	z   |
|z
  |
z          |j                  ||z
  |z   |	|z
  |z   |
|z
  |z          || _	        || _
        | j#                          y y )Nr              )r   r   r   r   GetParallelProjectionSetWorldPointWorldToDisplayGetDisplayPointSetDisplayPointr   r   DisplayToWorldGetWorldPointr   r   r   r   r[   )r   r   r   r   camerapPoint0pPoint1pPoint2fPoint0fPoint1fPoint2fxfyfzfwdPoint
focalDepthaPoint0aPoint1rPoint0rPoint1rPoint2rPoint3s                          r    r   zGtkVTKRenderWindow.Pan[  s     ,,H((F(.(:(:(<%WWW(.(<(<(>%WWW,,.&&wwwsC'')#3352b((Adkk)9)+Adkk)9)+- '')&4462b$$R2.&&wwwsC'')#3352b((Adkk)9)+Adkk)9)+- '')&4462b""2b, -3,@,@,B)&&wwwsC'')!113#AY
//1t{{?C//1t{{?C((D'')4<4J4J4L1sN%goG%goG%goG$$g&77%B&-&77%B&-&77%BD ""Gg$5#@$+g$5#@$+g$5#@B DKDKKKMy !r!   c                    | j                   r| j                   }| j                  }t        j                  dd| j                  |z
  z        }| j
                  |z  | _        |j                         r%|j                         |z  }|j                  |       n!|j                  |       |j                          || _        || _        | j                          y y )NgRQ?      ?)r   r   mathpowr   r   r   GetParallelScaleSetParallelScaleDollyr   r   r[   )r   r   r   r   r   
zoomFactorparallelScales          r    r   zGtkVTKRenderWindow.Zoom  s      ,,H((F$T[[1_(=?J $ 1 1J >D++- & 7 7 9* D''6Z(113DKDKKKM% !r!   c                 p    | j                   r| j                   j                          | j                          y rD   )r   ResetCamerar[   rB   s    r    r   zGtkVTKRenderWindow.Reset  s&      !!--/r!   c                    | j                   j                         }|j                         }|j                          t	        d|      D ]0  }|j                         }|j                         j                          2 | j                          y Nr   )	r   	GetActorsr   rH   r   rI   GetPropertySetRepresentationToWireframer[   r   actors	numActorsr   actors        r    r   zGtkVTKRenderWindow.Wireframe  so    &&002++-	q#A&&(E<<> $ 	r!   c                    | j                   j                         }|j                         }|j                          t	        d|      D ]0  }|j                         }|j                         j                          2 | j                          y r  )	r   r  r   rH   r   rI   r  SetRepresentationToSurfacer[   r  s        r    r   zGtkVTKRenderWindow.Surface  so    &&002++-	q#A&&(E::< $ 	r!   c                    | j                   rQ| j                   }| j                  }| j                         j                  }|j	                  |||z
  dz
  d|       |j                         }| j                  d k7  r`| j                  d k7  rQ| j                  j                  | j                         | j                  j                  | j                         d | _        |d k7  rp|| _        | j                  j                         | _        | j                  j                  | j                         | j                  j                  | j                         | j                          y y )Nr	   r   )r   r   r_   rg   PickGetAssemblyr   r   SetProperty
UnRegisterr  Registerr   r[   )r   r   r   r   pickerr   assemblys          r    r   zGtkVTKRenderWindow.PickActor  s     ,,H\\Foo'..GKK7Q;?C9))+H$$,''4/$$001H1HI''2243J3JK*.'D '/$*.*>*>*J*J*L'''001H1HI$$001E1EFKKM/ !r!   rD   )r{   r|   r}   r~   r   r1   r2   r3   r4   r5   r6   r   r   r   r[   r   r   r   r   r   r   r   r   r   r   r   r   r!   r    r   r      sx    F2,**"!,$L%
=~*r!   r   c                  v   ddl m}  ddlm}m}m} dd l}dd l}t        j                  t        j                        }|j                  d       |j                  dt        j                         |j                  dt        j                         |j                  d       t        j                  d	      }|j!                  |       |j#                          t%               }|j'                  d
d
       |j)                  |       |j#                           |        }|j+                  d        |       }	|	j-                  |j/                                 |       }
|
j1                  |	       |
j3                         j5                  ddd        |       }|j7                         j9                  |       |j;                  |
       t        j<                  d      }|j                  dt        j                         |j)                  |       |j#                          |j#                          t        j>                          y )Nr   )vtkConeSource)vtkActorvtkPolyDataMappervtkRendererzA GtkVTKRenderWindow Demo!ro   r,   
      )spacingi  P   r   r   zQuit!clicked) vtkmodules.vtkFiltersSourcesr  vtkmodules.vtkRenderingCorer  r   r!  vtkmodules.vtkRenderingOpenGL2vtkmodules.vtkInteractionStyler   	GtkWindowWINDOW_TOPLEVEL	set_titler-   mainquitset_border_widthGtkVBoxaddshowr   r   
pack_startSetResolutionSetInputConnectionGetOutputPort	SetMapperr  r   rE   AddRendererAddActor	GtkButtonmainloop)r  r  r   r!  
vtkmoduleswindowvboxgvtkcone
coneMapper	coneActorrenquits                r    mainrE    s   :TT)) ]]3../F
12
NN9cll+
NN>3<<0
B ;;q!D
JJtIIK DNN3OODIIK ?Dr"$J!!$"4"4"67
I
#$$S#s3
-C&&s+LL ==!DLLCLL)OODIIK KKMLLNr!   __main__)r~   r   r9   r   r(  r   r   r   r  r   r   r   rE  r{   r   r!   r    <module>rG     sY   $L   S S EU__ EPm/ m`	/d zF r!   