Advertisement
LocalBoy

setTransformOriginPoint

Jan 30th, 2013
320
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.29 KB | None | 0 0
  1. from PyQt4 import QtGui , QtCore
  2. import sys
  3. import math , time
  4.  
  5. class Window(QtGui.QWidget):
  6.     def __init__(self):
  7.         super(Window , self).__init__()
  8.         self.UI()  
  9.  
  10.     def UI(self):
  11.         layout = QtGui.QGridLayout()
  12.         button = QtGui.QPushButton('Rotate')
  13.         button.clicked.connect(self.polychange)
  14.         button.setCheckable(True)
  15.         self.view = Example()
  16.         layout.addWidget(button , 0 , 0)
  17.         layout.addWidget(self.view , 0 , 1)
  18.         self.setLayout(layout)
  19.         self.show()
  20.  
  21.     def polychange(self , sender):     
  22.         if sender:
  23.             self.view.polyrotate = 1
  24.             self.view.polyf.setFlag(QtGui.QGraphicsItem.ItemIsMovable , False)
  25.      
  26.         else:
  27.             self.view.degrees = 0
  28.             self.view.polyf.setFlag(QtGui.QGraphicsItem.ItemIsMovable)
  29.  
  30. class Example(QtGui.QGraphicsView):
  31.     def __init__(self):
  32.         super(Example , self).__init__()
  33.         self.setSceneRect(0 , 0 , 200 , 200)
  34.         self.degrees = 0
  35.         self.polyrotate = 0
  36.         self.polygon = QtGui.QPolygonF([QtCore.QPointF(50 , 50 ) , QtCore.QPointF(100 , 50) , QtCore.QPointF(100 , 100) , QtCore.QPointF(50 , 100)])
  37.         self.polyf = QtGui.QGraphicsPolygonItem(self.polygon)
  38.         self.polyf.setFlag(QtGui.QGraphicsItem.ItemIsMovable)
  39.         self.scene = QtGui.QGraphicsScene()
  40.         self.setScene(self.scene)
  41.         self.scene.addItem(self.polyf)        
  42.        
  43.     def mousePressEvent(self , e):
  44.         super(Example , self).mousePressEvent(e)
  45.         self.x = e.x()
  46.         self.y = e.y()
  47.         if self.polyrotate == 1:
  48.             self.Rotate()
  49.        
  50.     def Rotate(self):
  51.        
  52.         self.pverticesx = []
  53.         self.pverticesy = []
  54.         distances = []
  55.         for i in range(4):
  56.             self.pverticesx.append(self.polyf.mapToScene(self.polyf.polygon()[i]).x())
  57.             self.pverticesy.append(self.polyf.mapToScene(self.polyf.polygon()[i]).y())
  58.        
  59.         x1 = self.x
  60.         y1 = self.y
  61.        
  62.        
  63.        
  64.         for i in range(4):
  65.              distance = math.hypot(self.pverticesx[i] - x1 , self.pverticesy[i] - y1)
  66.              distances.append(distance)
  67.         midpointx = (self.pverticesx[0] +  self.pverticesx[2]) / 2
  68.         midpointy = (self.pverticesy[0] +  self.pverticesy[2]) / 2
  69.         index = distances.index(min(distances))          
  70.         pointx = self.pverticesx[index]                
  71.         pointy = self.pverticesy[index]
  72.         vector1 = [x1 - midpointx , y1 - midpointy]
  73.         vector2 = [pointx - midpointx , pointy - midpointy]
  74.         num = 0
  75.        
  76.         for i in [0 , 1]:
  77.             num = num + (vector1[i] * vector2[i])  
  78.         den = math.sqrt(sum(map(lambda x : x * x , vector1))) *  math.sqrt(sum(map(lambda x : x * x , vector2)))
  79.        
  80.         degree = math.degrees(math.acos(num / den))
  81.         self.degrees = degree + self.degrees
  82.         if self.degrees > 360:
  83.             rotation = self.degrees / 360
  84.             self.degrees = self.degrees - (rotation * 360)
  85.        
  86.         self.polyf.setTransformOriginPoint(midpointx , midpointy)
  87.         self.polyf.setRotation(self.degrees)
  88.            
  89.  
  90.  
  91. if __name__ == '__main__':
  92.     app = QtGui.QApplication(sys.argv)    
  93.     we = Window()
  94.     sys.exit(app.exec_())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement