
    ep                      b    d dl mZmZ d dlZddlmZ ddlmZ ddl	m	Z	 ddl
m
Z
  G d d	e	      Zy)
    )atan2degreesN   SRTTransform)QtGui)Transform3D)Vectorc                       e Zd ZdZddZd Z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dZd Zy)SRTTransform3Dz4x4 Transform matrix that can always be represented as a combination of 3 matrices: scale * rotate * translate
    This transform has no shear; angles are always preserved.
    Nc                    t        j                  |        | j                          |y |j                  t        j
                  u rt        j                  |      }t        |t              r| j                  |       y t        |t              rlt        |j                  d         t        |j                  d         |j                  d   t        |j                  d         d| _        | j                          y t        |t        j                        rst        |j                  d         t        |j                  d         |j                  d   t        ddd      d| _        d| j                  d   d	<   | j                          y t        |t        j                        r| j                  |       y t!        d
t#        |            )Nposscaleangleaxisr   r   r   r   r   r         ?   z/Cannot build SRTTransform3D from argument type:)r	   __init__reset	__class__r   
QTransformr   
isinstancedictrestoreStater   r
   _stateupdate
QMatrix4x4setFromMatrix	Exceptiontype)selfinits     :/usr/lib/python3/dist-packages/pyqtgraph/SRTTransform3D.pyr   zSRTTransform3D.__init__   sY   T"

<>>U---,,T2DdD!d#n-dkk%01G 45W-t{{623	DK KKMl778dkk%01G 45W-q!Q	DK '*DKK #KKMe../t$MtTXzZZ    c                 2    t        | j                  d         S )Nr   r
   r   r"   s    r$   getScalezSRTTransform3D.getScale0   s    dkk'*++r%   c                 P    | j                   d   t        | j                   d         fS )z Return (angle, axis) of rotationr   r   )r   r
   r(   s    r$   getRotationzSRTTransform3D.getRotation3   s$    {{7#VDKK,?%@@@r%   c                 2    t        | j                  d         S )Nr   r'   r(   s    r$   getTranslationzSRTTransform3D.getTranslation7   s    dkk%())r%   c                 h    t        ddd      t        ddd      ddd| _        | j                          y )Nr   r           r   r   r   r   r
   r   r   r(   s    r$   r   zSRTTransform3D.reset:   s2    !Aa=Aa]	
 	r%   c                 V    t        | }| j                  | j                  d   |z          y)z(Adjust the translation of this transformr   N)r
   setTranslater   )r"   argsts      r$   	translatezSRTTransform3D.translateC   s'    DM$++e,Q./r%   c                 N    t        | | j                  d<   | j                          y)z%Set the translation of this transformr   Nr1   r"   r4   s     r$   r3   zSRTTransform3D.setTranslateH   s    #T]Er%   c                     t        |      dk(  rt        |d   d      r|d   }t        |      dk(  r|dz   }t        | }| j                  | j                  d   |z         y)z"adjust the scale of this transformr   r   __len__r   r   r   N)lenhasattrr
   setScaler   )r"   r4   ss      r$   r   zSRTTransform3D.scaleM   s\     t9>gd1gy97Dt9>$;DDMdkk'*Q./r%   c                     t        |      dk(  rt        |d   d      r|d   }t        |      dk(  r|dz   }t        | | j                  d<   | j	                          y)zSet the scale of this transformr   r   r:   r   r;   r   N)r<   r=   r
   r   r   r8   s     r$   r>   zSRTTransform3D.setScaleX   sR    t9>gd1gy97Dt9>$;D%t}Gr%   c                    | j                   d   }|d   |d   k(  r8|d   |d   k(  r-|d   |d   k(  r"| j                  | j                   d   |z          yt        j                         } |j                  | j                   d      |j
                  | j                   d   g| j                   d      |j
                  |g|   |j                  | j                   d     | j                  |       y)	z%Adjust the rotation of this transformr   r   r   r   r   r   r   N)r   	setRotater   r   r6   rotater   r   )r"   r   r   origAxisms        r$   rC   zSRTTransform3D.rotatea   s    ;;v&7hqk!d1g!&<aHUVKAWNN4;;w/%78  "AAKKU+,AHHT[[)@DKK,?@AHHU"T"AGGT[[)*q!r%   c                 r    || j                   d<   t        |      | j                   d<   | j                          y)z5Set the transformation rotation to angle (in degrees)r   r   N)r   r
   r   )r"   r   r   s      r$   rB   zSRTTransform3D.setRotaten   s-      %G$TlFr%   c           	         ddl }t        d      D ]#  }| j                  ||j                  |             % | j	                         j                  dd      }|dddf   | j                  d<   |ddddf   dz  j                  d      dz  }t        j                  |dddf   |d	ddf         }t        j                  ||dddf         dk  r|d	xx   d
z  cc<   || j                  d<   |ddddf   |t        j                  ddf   z  }	 |j                  j                  |      \  }}t        j                   t        j"                  |d	z
        dk        }	t%        |	      d	k  r_t        dt        |      z         t        dt        |      z         t        dt        |	      dt        |d	z
               t'        d      |dd|	d   f   j(                  }
|
|
dz  j                         dz  z  }
|
| j                  d<   |j+                         d	z
  dz  }t        j,                  t        j"                  |
            }g d|   \  }}||j.                  z
  |   d|z  |
|   z  z  }t1        t3        ||            | j                  d<   | j                  d   dk(  rd| j                  d<   yy#  t        dt        |      z         t        dt        |      z         t        dt        |      z          xY w)z
        Set this transform based on the elements of *m*
        The input matrix must be affine AND have no shear,
        otherwise the conversion will most likely fail.
        r   N      r   r   )r   g      ?r   r   zRotation matrix: %sz	Scale: %szOriginal matrix: %sgư>zeigenvalues: %szeigenvectors: %szindex: z, z"Could not determine rotation axis.)r   r   r   )))r   r   rJ   ))r   r   r   ))r   r   rJ   g       @r   r0   )numpy.linalgrangesetRowrowmatrixreshaper   sumnpcrossdotnewaxislinalgeigprintstrargwhereabsr<   r    realtraceargmaxTr   r   )r"   rE   numpyir   zrevalsevecseigIndexr   cosaxisIndrIndsignsins                   r$   r   zSRTTransform3D.setFromMatrixu   s    	q 	%AKK1558$	%KKM!!!A&rr!tWE 2A2bqb51!!q!)3.HHQq"1"uXqBQBx(66!Qq"1"uX"!HNH$G bqb"1"fIbjj!m,,	 <<++A.LE5 ;;rvveAg56x=1#c%j01$s5z12S]CaLAB@AAQx}_%**$'3&&"F wwy{C ))BFF4L):7C	T udmrDy4=89  'uS#7G;;w1$")DKK %;	'#a&01+E
*+'#a&01s   J3 3AK;c                 ,    t        j                   |       S )zPReturn a QTransform representing the x,y portion of this transform (if possible)r   r(   s    r$   as2DzSRTTransform3D.as2D   s    ((..r%   c                     | j                   d   }| j                   d   }| j                   d   }|d   |d   |d   f|d   |d   |d   f| j                   d   |d   |d   |d   fdS )	Nr   r   r   r   r   r   r   r   )r   )r"   pr?   axs       r$   	saveStatezSRTTransform3D.saveState   s    KKKK [[  aD!A$!%dAaD!A$'[[)UBqE2a5)	
 	
r%   c                 ~   t        |j                  dd            | j                  d<   |j                  dd      }t        |      ddt	        |      z
  z  z   }t        |      | j                  d<   |j                  dd      | j                  d<   |j                  d	d
      | j                  d	<   | j                          y )Nr   )r/   r/   r/   r   )r   r   r   )r   rI   r   r/   r   r0   )r
   getr   tupler<   r   )r"   stater   s      r$   r   zSRTTransform3D.restoreState   s    #EIIeZ$@AE		':.eu#e*55%e}G$yy"5G#ii	:Fr%   c                    t        j                  |        t        j                  | g| j                  d     t        j                  | | j                  d   g| j                  d     t        j
                  | g| j                  d     y )Nr   r   r   r   )r	   setToIdentityr6   r   rC   r   r(   s    r$   r   zSRTTransform3D.update   so    !!$'d8T[[%784W!5LF8KL$6W!56r%   c                 4    t        | j                               S N)rY   rq   r(   s    r$   __repr__zSRTTransform3D.__repr__   s    4>>#$$r%   c                 >   |dk(  r3t        j                  | j                               j                  dd      S |dk(  rVt        j                  | j                               j                  dd      }|d   |d<   |d d df   |d d df<   |d dd df   S t	        d      )NrI   rH   r   zArgument 'nd' must be 2 or 3)rR   array
copyDataTorP   r    )r"   ndrE   s      r$   rO   zSRTTransform3D.matrix   s    788DOO-.66q;;1W*+33Aa8AQ4AaDqsVAacFRaRU8O:;;r%   c                 0    t         | j                         ffS ry   )r   rq   r(   s    r$   
__reduce__zSRTTransform3D.__reduce__   s     0222r%   ry   )r0   )rI   )__name__
__module____qualname____doc__r   r)   r+   r-   r   r6   r3   r   r>   rC   rB   r   rm   rq   r   r   rz   rO   r    r%   r$   r   r      sj    [B,A*0

	0"7*r/
7%	<3r%   r   )mathr   r   r`   rR    r   Qtr   r	   r
   r   r   r%   r$   <module>r      s%        $ [3[ [3r%   