class_docstr: 4x4 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.
class_docstr_tok: ["4x4","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","."]
code: def __init__(self, init=None):
      Transform3D.__init__(self)
      self.reset()
      if init is None:
          return
      if init.__class__ is QtGui.QTransform:
          init = SRTTransform.SRTTransform(init)
  
      if isinstance(init, dict):
          self.restoreState(init)
      elif isinstance(init, SRTTransform3D):
          self._state = {
              "pos": Vector(init._state["pos"]),
              "scale": Vector(init._state["scale"]),
              "angle": init._state["angle"],
              "axis": Vector(init._state["axis"]),
          }
          self.update()
      elif isinstance(init, SRTTransform.SRTTransform):
          self._state = {
              "pos": Vector(init._state["pos"]),
              "scale": Vector(init._state["scale"]),
              "angle": init._state["angle"],
              "axis": Vector(0, 0, 1),
          }
          self._state["scale"][2] = 1.0
          self.update()
      elif isinstance(init, QtGui.QMatrix4x4):
          self.setFromMatrix(init)
      else:
          raise Exception(
              "Cannot build SRTTransform3D from argument type:",
              type(init),
          )
  
imports: from math import atan2, degrees
  import numpy
  from .Qt import QtGui
  from .Transform3D import Transform3D
  from .Vector import Vector
  from .None import SRTTransform
label_desc: Use image node_id 1 to create a new SRTTransform3D object from inherited base classes: Transform3D with example: obj = SRTTransform3D(init)