;i_ddlTddlmcmZddlmZmZmZm Z ddl Z ddl m Z ddl mZddl mZddlmZmZmZGd d ZGd d eejZdS) )*N)cosradianssintan)Vector) functions)getConfigOption)QtCoreQtGui QtWidgetsceZdZddfd ZdZdZdZdZdZd Z d Z d Z d Z d)dZ d)dZdZdZd)dZd*dZd+dZd,dZdZdZdZdZd-dZdZdZdZd Zd!Zd"Zd#Z d$Z!d%Z"e#e$d&d'fd(Z%xZ&S). GLViewMixineuler)rotationMethodc tj|i||dvrtdtdddt jddddddddd |d |_|g|_tj j j tj j j tj j jtj j jtj j jtj j jg|_i|_tj|_|jj|jd S) a Mixin class providing functionality for GLViewWidget ================ ============================================================== **Arguments:** rotationMethod (str): Mechanism to drive the rotation method, options are 'euler' and 'quaternion'. Defaults to 'euler'. ================ ============================================================== )r quaternionz8Rotation method should be either 'euler' or 'quaternion'r$@<-N)centerrotationdistancefov elevationazimuthviewportr)super__init__ ValueErrorr r QQuaternionoptsresetitemsr QtKey Key_RightKey_LeftKey_UpKey_Down Key_PageUp Key_PageDown noRepeatKeys keysPressedQTimerkeyTimertimeoutconnect evalKeyState)selfrargskwargs __class__s QC:\PYTHON\MyICR_Workspace\venv\Lib\site-packages\pyqtgraph/opengl/GLViewWidget.pyr"zGLViewMixin.__init__ s7 $)&))) !8 8 8WXX XQqmm*1Qq33,      #Y]4fim6LfimNbdjdmdqdz}C}F}J}UW]W`WdWqr   %%d&788888cr|}t||zSN)devicePixelRatioFintwidthr7dprs r; deviceWidthzGLViewMixin.deviceWidth0s.$$&&4::<<#%&&&r<cr|}t||zSr>)r?r@heightrBs r; deviceHeightzGLViewMixin.deviceHeight4s.$$&&4;;==3&'''r<ctddd|jd<d|jd<d|jd<d|jd<d |jd <d |jd <|td d S)z_ Initialize the widget state or reset the current state to the original state. rrrrrrrrrrNr background)r r%setBackgroundColorr r7s r;r&zGLViewMixin.reset8sx%Qqmm ( $ * %!# +! ) $ *  = =>>>>>r<c|j||r||||dSr>)r'appendisValid initialize_setViewupdater7items r;addItemzGLViewMixin.addItemEs[ $ <<>>  OO    d r<c|j||d|dS)z1 Remove the item from the scene. N)r'removerPrQrRs r; removeItemzGLViewMixin.removeItemNs= $ d r<cz|jD]}|dg|_|dS)z2 Remove all items from the scene. N)r'rPrQrRs r;clearzGLViewMixin.clearVsBJ  D MM$      r<c^|}|}|s|dkr&t t }t d|z|jD]*}|s| +dS)zN Initialize items that were not initialized during addItem(). )rrz;pyqtgraph.opengl: Requires >= OpenGL 2.0 (not ES); Found %sN) contextformat isOpenGLESversion glGetString GL_VERSION RuntimeErrorr' isInitializedrO)r7ctxfmt verStringrSs r; initializeGLzGLViewMixin.initializeGL_sllnnjjll >>   s{{}}v55#J//IMPYY J " "D%%'' "!!! " "r<ctj|i||jd<|dS)z{ Set the background color of the widget. Accepts the same arguments as :func:`~pyqtgraph.mkColor`. bgcolorN)fnmkColorgetRgbFr%rQ)r7r8kwdss r;rJzGLViewMixin.setBackgroundColoros< "z48488@@BB ) r<cx|jd}|*dd||fS|S)Nr r)r%rDrG)r7vps r; getViewportzGLViewMixin.getViewportws? Yz " :q$**,,d.?.?.A.AB BIr<Nc||}tttt j|tjdSNdtype)projectionMatrix glMatrixMode GL_PROJECTION glLoadMatrixfnparraydatafloat32)r7regionms r; setProjectionzGLViewMixin.setProjection~sP  ! !& ) )]###bhqvvxxrz:::;;;;;r<cb|*dd||f}|\}}}}|jd}|jd}|dz}|dz} |t dt |zz} | |z|z } | |d|z d|z zdz z} | |d|d z|z d|z zdz z} | |d|z d|z zdz z}| |d|d z|z d|z zdz z}t j}|| | |||| |S) NrrrgMbP?g@@?@rr) rDrGror%rrr QMatrix4x4frustum)r7r|x0y0whdistrnearClipfarCliprtleftrightbottomtoptrs r;rtzGLViewMixin.projectionMatrixs_ >D,,..0A0A0C0CDF'')) B1y$i%<, s3-.. . EAIfQils1u-12fQiq )",Q7!;<vay|A.23vay*2-#a%81<=     4Xw??? r<c|}tttt j|tjdSrq) viewMatrixru GL_MODELVIEWrwrxryrzr{)r7r}s r; setModelviewzGLViewMixin.setModelviewsL OO  \"""bhqvvxxrz:::;;;;;r<c(tj}|dd|jd |jddkr!||jdnL||jddz dd d ||jd dzd d d |jd }|| | | |S) NgrrrrrZrrrr)r r translater%rotatexyz)r7rrs r;rzGLViewMixin.viewMatrixs     c3:!6 6777 9% &, 6 6 IIdi + , , , , IIdi ,R/Aq 9 9 9 IIdi *2-q!R 8 8 88$ fhhjj[688::+ {;;; r<c|d|d|dzz |d|df}td} ttt t di_|dtt}n#tt}wxYwd|D}| d fd |DS) zy Return a list of the items displayed in the region (x, y, w, h) relative to the widget. rrrriT)r| useItemNamesc6g|]}|j|jdfS)r)nearnames).0rs r; z'GLViewMixin.itemsAt..s%444!!&!'!*%444r<c|dS)Nr)is r;z%GLViewMixin.itemsAt..s 1r<keyc6g|]}j|dSr) _itemNames)rrr7s r;rz'GLViewMixin.itemsAt..s$555!!%555r<) rGglSelectBuffer glRenderMode GL_SELECT glInitNames glPushNamerpaintGL GL_RENDERsort)r7r|bufhitsr's` r;itemsAtzGLViewMixin.itemsAts )T..00&)F1I2EFq SYZ[S\]V$$ +  # # # MMM qMMM DO LLTL : : : **DD< **D * * * *44t444 ~~ &&&5555u5555s AB22CFc8|t|n t|||||jd}t |t ttz| |dS)a viewport specifies the arguments to glViewport. If None, then we use self.opts['viewport'] region specifies the sub-region of self.opts['viewport'] that should be rendered. Note that we may use viewport != self.opts['viewport'] when exporting. N)r|rhr) glViewportror~rr% glClearColorglClearGL_DEPTH_BUFFER_BITGL_COLOR_BUFFER_BIT drawItemTree)r7r|r rrhs r;rzGLViewMixin.paintGLs   ((** + + +  ! ! &))) )I&g$'::<<< |44444r<c|d|jD}n)|}|||d|D]}|s||ur t t |r#t|j||j |j<| n@#ddl m }| tdt|zYnxYwt!#t!wxYwt#t$t' |}t+t-j|t,j|||t#t$t7~#t#t$t7wxYwdS) Nc:g|]}||Sr>) parentItem)rrs r;rz,GLViewMixin.drawItemTree..s%EEE1allnn.DQ.D.D.Dr<c*|Sr>) depthValue)as r;rz*GLViewMixin.drawItemTree..sr<rr)debugzError while drawing item %s.rrr)r' childItemsrMrvisible glPushAttribGL_ALL_ATTRIB_BITS glLoadName_idrpaintrprintExcprintstr glPopAttribrur glPushMatrix transform glMultMatrixfrxryrzr{r glPopMatrix)r7rSrr'rrrs r;rzGLViewMixin.drawItemTrees <EE EEEEEOO%%E LL    // 000 " "A99;; Dyy " !3444#3"15)))12.GGIIIIF((((((NN$$$83t99DEEEEE MMMMKMMMM\***"B!"(27799BJ"G"G"GHHH%%al%CCC ...MMMM!...MMMM5 " "s,4A CD;C?=DD!A*G$G9c|"|td|td| ||jd<| ||jd<|jddkr||{|jd}||| dz |||dz t j||jd<| ||jd<nm| ||jd <| ||jd <|S|}|dz|jd <| dz |jd <| dS) Nz&cannot set both rotation and elevationz$cannot set both rotation and azimuthrrrrrrrr) r#r% toEulerAnglessetZsetXr r$fromEulerAnglesrrrQ)r7posrrrreus r;setCameraPositionzGLViewMixin.setCameraPositionsu  $ !IJJJ" !GHHH ?"%DIh   $,DIj ! 9% &, 6 6$(;Yz*88::&GGWHRK((((GGIbL)))(-(9(I(I"(M(M *%#(0 *%$)2 +&"'. )$#++--)+" +&(*w| )$ r<c |jd}|jd}|jddkr@t||jdtdd|z }nt|jd}t|jd}t||t |zt |zz||t |zt|zz||t|zz}|S) zOReturn current position of camera based on center, dist, elevation, and azimuthrrrrrrrr) r%r rotatedVectorrrrrrr)r7rrrelevazims r;cameraPositionzGLViewMixin.cameraPositions 8$y$ 9% &, 6 6$)J"7"E"EfQqQUFVFV"X"XXYYCC49[122D49Y/00D TCII-D 99 TCII-D 99 TCII--C  r<c zhd}||std|||d|d|d|d|dd |vr|d |jd <dSdS) N>rrrrrrzvalid keywords are rrrrr)rrrrrr) issupersetr#rgetr%)r7rl valid_keyss r;setCameraParamszGLViewMixin.setCameraParams-sVVV $$T** A?:??@@ @ 488H#5#5@T@T)-+)>)>QZH[H[(,(<(<  > > > D==#E{DIe    =r<c(hd}fd|DS)N>rrrrrrc,i|]}|j|Sr)r%)rkr7s r; z,GLViewMixin.cameraParams..:s!777aTYq\777r<r)r7rs` r; cameraParamszGLViewMixin.cameraParams8s(VVV 7777:7777r<cL|jddkr=tj|| d}||jdz}||jd<nA|jdxx|z cc<t j|jd|zdd|jd<|d S) zUOrbits the camera around the center position. *azim* and *elev* are given in degrees.rrrrrrgVgV@N)r%r r$rri clip_scalarrQ)r7rrqs r;orbitzGLViewMixin.orbit<s 9% &, 6 6!114%A :& &A$%DIj ! ! Ii D ( %'^DIk4JT4QSWY\%]%]DIk " r<globalc|dkr+|jdxxtj|||z cc<n|dkr+|}|jd|z }|}|dzt dt |jdzz}||z } tjddd} tj| | } tj| |  } |jd| | z|zz| | z|zz| | z|zz|jd<n]|d krG|jd d kr|jd  } | tddd}| tddd}| tddd}| |jd}|jdxx||| z||zz||zzzz cc<npt |jd }t |jd}t |jd}|jd|z }t |dz dz}||z|z }|t|z|z}|t||zt|t|z|zz z}|t||zt|t|z|zzz}|jdxxtj|| |z cc<nt!d|dS)a Moves the center (look-at) position while holding the camera in place. ============== ======================================================= **Arguments:** *dx* Distance to pan in x direction *dy* Distance to pan in y direction *dz* Distance to pan in z direction *relative* String that determines the direction of dx,dy,dz. If "global", then the global coordinate system is used. If "view", then the z axis is aligned with the view direction, and x and y axes are in the plane of the view: +x points right, +y points up. If "view-upright", then x is in the global xy plane and points to the right side of the view, y is in the global xy plane and orthogonal to x, and z points in the global z direction. ============== ======================================================= Distances are scaled roughly such that a value of 1.0 moves by one pixel on screen. rr view-uprightrrrrrviewrrrrrrz7relative argument must be global, view, or view-uprightN)r%r QVector3DrlengthrrrA crossProduct normalized conjugatedrr pixelSizerrr#rQ)r7dxdydzrelativecPoscVecrxDistxScalezVecxVecyVecqcxvyvzv scale_factorrrr fov_factorrrrs r;panzGLViewMixin.panIs. x   Ih   5?2r2#>#> >      ' '&&((D9X&-D;;==D2IC'$)E2B*C*C$C D DDETZZ\\)F?1Qq))D?//d;;FFHHD?//d;;FFHHD"&)H"5v 8J"JTTZ]]_M_"_bfiobortbt"tDIh     y)*l::Yz*5577%%va!}}66%%va!}}66%%va!}}66#~~ty/BDD  (###|r2#v2~27M'NN####ty566ty344di.// (+d.A.A.C.CCKKMM q\\A- #j04::<<?  3t99,r1 CIINSYYT5JR5O$OP CIINSYYT5JR5O$OP (###uq1"a'@'@@####VWW W r<c|}t|tjrUtj|d|jdz zdz}||z dzddz}n||z }|dztdt|j d zz}|| z S) z Return the approximate size of a screen pixel at the location pos Pos may be a Vector or an (N,3) array of locations rr)rrr)axisrrr) r isinstancerxndarrayryreshapendimsumrrrr%rA)r7rcamrrs r;rzGLViewMixin.pixelSizes !!## c2: & & &(3--''chqj(9$(>??CWqL%%2%..3DDG##%%Dr Cgdi.>&?&? ?@@@tzz||##r<ct|dr|n|}||_dS)Nposition)hasattrrlocalPosmousePos)r7evlposs r;mousePressEventzGLViewMixin.mousePressEvents5 'J 7 7Jr{{}}}R[[]] r<ct|dr|n|}t|ds||_||jz }||_|t jjjkr| t jj j zr?| | |dddS|| |dS|t jjjkr| t jj j zr?| | d|ddS| | |dddSdS)Nrrrr)rr)rrrrbuttonsr r( MouseButton LeftButton modifiersKeyboardModifierControlModifierrrrr MiddleButton)r7rrdiffs r;mouseMoveEventzGLViewMixin.mouseMoveEvents 'J 7 7Jr{{}}}R[[]]tZ(( ! DMdm# ::<<690; ; ; !;!KK 046688Q@@@@@ DFFHH9dffhh///// ZZ\\VY2? ? ? !;!KK I1dffhhHHHHH46688QHHHHH @ ?r<cdSr>rr7rs r;mouseReleaseEventzGLViewMixin.mouseReleaseEvents r<c|}|dkr&|}|tjjjzr|jdxxd|zzcc<n|jdxxd|zzcc<| dS)Nrrg+?r) angleDeltarrr$r r(r%r&r%rQ)r7rdeltas r; wheelEventzGLViewMixin.wheelEvents !!## A::MMOO%%''E LLNNVY7G G 2 Ie   u ,     Ij ! ! !UE\ 1 ! ! ! r<c||jvr\||rdSd|j|<|dSdS)Nr)rr0accept isAutoRepeatr1r6r+s r; keyPressEventzGLViewMixin.keyPressEventsq 6688t( ( ( IIKKK   )*D RVVXX &         ) (r<c"||jvrs||rdS |j|=n#t $r i|_YnwxYw|dSdSr>)rr0r2r3r1KeyErrorr6r+s r;keyReleaseEventzGLViewMixin.keyReleaseEvents 6688t( ( ( IIKKK    &$RVVXX.. & & &#%    &         ) (sA""A65A6cd}t|jdkr(|jD]}|tjjjkr|| dn|tjjjkr||dn|tjjjkr|d| nh|tjjj kr|d|n6|tjjj krn|tjjj kr |j ddS|j dS)Nrr)rr)lenr1r r(r)r*rr+r,r-r.r/r3startstop)r7speedrs r;r6zGLViewMixin.evalKeyStatesH t 1 $ $' ( (&)-111JJUFJ3333FIM222JJEJ2222FIM000JJAUFJ3333FIM222JJAEJ2222FIM444FIM666 ##B'''' ( ( M   r<c*|S)zA Read the current buffer pixels out as a QImage. )grabFramebufferrKs r; readQImagezGLViewMixin.readQImages##%%%r<ic tt|\}}|d}d} d} tj||dftj} t jd} t jt j | tttd}tt||} tj| | dftj} tt dt"| | dt"t$d t't dt(dkrt+d| jddzttdt"| | dt"t$| t/d} t1t2| t5t2t6| | t9tt:t2| dd||f|jd<d|z}t?| ||z | |z D]C}t?| ||z | |z D]&}tA|| z||z}tA|| z||z}||z }||z }t j!t j t j"t|d|#|||z |z ||fdd||ftt|tItd||} tj%| tj&| | dddd d f} | ||z | |||z f| ||z||z ||z||z f<(E d|jd<t jt j dttd|tO|g| t j(| g| tSd| gn#d|jd<t jt j dttd|tO|g| t j(| g| tSd| gwwxYw| S) NrrrrzHOpenGL failed to create 2D texture (%dx%d); too large for this hardware.rr )r|r r.)*mapr@ makeCurrentrxemptyubyteglfboglGenFramebuffersglBindFramebufferGL_FRAMEBUFFERglEnable GL_TEXTURE_2D glGenTextures glBindTexturezeros glTexImage2DGL_PROXY_TEXTURE_2DGL_RGBAGL_UNSIGNED_BYTEglGetTexLevelParameterivGL_TEXTURE_WIDTHrashapeglGenRenderbuffersglBindRenderbufferGL_RENDERBUFFERglRenderbufferStorageGL_DEPTH_COMPONENTglFramebufferRenderbufferGL_DEPTH_ATTACHMENTr%rangeminglFramebufferTexture2DGL_COLOR_ATTACHMENT0r glGetTexImage frombufferrglDeleteTexturesglDeleteFramebuffersglDeleteRenderbuffers)r7sizer\type textureSizepaddingrrtexfb depth_bufoutputtexwidthrzp2rrx2y2w2h2s r; renderToArrayzGLViewMixin.renderToArrays_#tnn!   6 6Xq!Qirx888F(++B  #E$8" > > > ] # # #""C - - - -"H8Xhq1BBBD ,a(HaQXZjlp q q q'(;Q@PQQUVVV"#mptpz{}|}{}p~#~ 7Hh7Tdfj k k k+1--I  : : : !/3ExQY Z Z Z %n6I?\e f f f%&1aLDIj !WBG8QwY << z zx7HRK@@zzAQxZ733BQxZ733BABAB01EuGacpruwxyyyLLAaCFB(;q!RQSnLUUU!-555)64HHD=RX>>>FFxPXYZ[[\`\`^`\`be\efDIMPRSZPZm]d\dNdfmnpqxnxfxNxIyF1W9RZ/72g:1EEFFz z&%)DIj !  #E$8! < < < - + + + #'''~*B4000$%a)555%)DIj !  #E$8! < < < - + + + #'''~*B4000$%a)5555% s LOA=Qr>)NNF)NF)NNNNN)r)'__name__ __module__ __qualname__r"rDrGr&rTrWrYrfrJror~rtrrrrrrrrrrrrrr)r,r0r4r7r6r@GL_BGRArTrv __classcell__r:s@r;rr sb-4!9!9!9!9!9!9!9F'''((( ? ? ?""" <<<< .<<<   6666.5555"!"!"!"!"F####J" + + +888   ????B $ $ $III$          !!!(&&& *17GUYcf????????r<rc$eZdZddfd ZxZS) GLViewWidgetN)devicePixelRatioctj|i||tjjjdS)a Basic widget for displaying 3D data - Rotation/scale controls - Axis/grid display - Export options ================ ============================================================== **Arguments:** parent (QObject, optional): Parent QObject. Defaults to None. devicePixelRatio No longer in use. High-DPI displays should automatically detect the correct resolution. rotationMethod (str): Mechanism to drive the rotation method, options are 'euler' and 'quaternion'. Defaults to 'euler'. ================ ============================================================== N)r!r"setFocusPolicyr r( FocusPolicy ClickFocus)r7rr8r9r:s r;r"zGLViewWidget.__init__5sC $)&))) FI1<=====r<)rwrxryr"r{r|s@r;r~r~4sE/3>>>>>>>>>>>r<r~) OpenGL.GLOpenGL.GL.framebufferobjectsGLframebufferobjectsrHmathrrrrnumpyrxrr r rir r(r r rr QOpenGLWidgetr~rr<r;rs,,,,,,,,,''''''''''''))))))))))eeeeeeeeP>>>>>; 7>>>>>r<