-
Notifications
You must be signed in to change notification settings - Fork 0
/
SurfaceRenderers.py
117 lines (91 loc) · 3.5 KB
/
SurfaceRenderers.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
from PySide.QtGui import QGraphicsItem, QGraphicsEllipseItem, QGraphicsLineItem
from PySide.QtGui import QPen, QBrush
from PySide.QtCore import QRectF, QPointF, QLineF
from PySide.QtCore import Qt, QObject
from PySide import QtCore
class CentralSurfaceRenderer(QObject):
centralPointDragged = QtCore.Signal(QPointF)
def __init__(self, scene, surface):
super(CentralSurfaceRenderer, self).__init__()
self.scene = scene
self.surface = surface
self.items = []
self.lines = []
self.centre = QPointF()
self.edit_mode = True
def surfaceOrProjectionChanged(self, surface):
self.surface = surface
self.branches = self.surface.finiteBranchPoints()
self._recreateScene()
def setEditMode(self, editing):
self.edit_mode = editing
self._recreateScene()
def setCentralPoint(self, new_coords):
self.centre = QPointF(new_coords.real, new_coords.imag)
self._recreateScene()
def _recreateScene(self):
map(self.scene.removeItem, self.items)
self.items = []
self._addItems()
def _addItems(self):
cutPen = self._cutPen()
dotBrush = QBrush(Qt.black)
radius = self._branchRadius()
e = CentralPoint(self, self.centre, edit_mode=self.edit_mode)
self.scene.addItem(e)
self.items.append(e)
for branch in self.branches:
# FIXME: Arbitrary centre
l = self.scene.addLine(QLineF(self.centre,
QPointF(branch.real, branch.imag)))
l.setPen(cutPen)
self.items.append(l)
self.lines.append(l)
dot = self.scene.addEllipse(branch.real - radius,
branch.imag - radius,
2*radius, 2*radius)
dot.setBrush(dotBrush)
dot.setPen(QPen(QBrush(), 0))
self.items.append(dot)
def _cutPen(self):
if self.edit_mode:
pen = QPen()
pen.setWidthF(0.03)
return pen
else:
pen = QPen(Qt.gray)
pen.setWidthF(0.02)
return pen
def _branchRadius(self):
if self.edit_mode:
return 0.1
else:
return 0.05
class CentralPoint(QGraphicsEllipseItem):
def __init__(self, renderer, centre, edit_mode):
super(CentralPoint, self).__init__()
self.setFlag(QGraphicsItem.ItemSendsGeometryChanges)
self.setZValue(1)
self.renderer = renderer
self.setPos(self.renderer.centre)
self.setEditMode(edit_mode)
def setEditMode(self, editing):
if editing:
self._setRadius(0.15)
self.setBrush(QBrush(Qt.darkGreen))
self.setFlag(QGraphicsItem.ItemIsMovable)
else:
self._setRadius(0.075)
self.setBrush(QBrush(Qt.gray))
self.setFlag(QGraphicsItem.ItemIsMovable, False)
def itemChange(self, change, value):
if change == QGraphicsItem.ItemPositionHasChanged:
self.renderer.centre = self.pos()
self.renderer.centralPointDragged.emit(self.pos())
for line_item in self.renderer.lines:
l = line_item.line()
l.setP1(self.renderer.centre)
line_item.setLine(l)
return super(CentralPoint, self).itemChange(change, value)
def _setRadius(self, radius):
self.setRect(-radius, -radius, 2*radius, 2*radius)