comparison python/apps/diagrameditor.py @ 76:1084b433c278

Line reduction
author windel
date Sun, 11 Nov 2012 11:53:52 +0100
parents ba11d99b1d4a
children a5f3959bcab7
comparison
equal deleted inserted replaced
75:ba11d99b1d4a 76:1084b433c278
13 $ python [thisfile.py] 13 $ python [thisfile.py]
14 """ 14 """
15 15
16 def buildPath(pts): 16 def buildPath(pts):
17 path = QPainterPath(pts[0]) 17 path = QPainterPath(pts[0])
18 for pt in pts[1:]: 18 for pt in pts[1:]: path.lineTo(pt)
19 path.lineTo(pt)
20 return path 19 return path
21 20
22 def equalSpace(n, l): 21 def equalSpace(n, l):
23 offset = 15 22 offset = 15
24 if n == 1: 23 if n == 1:
26 elif n > 1: 25 elif n > 1:
27 return [offset + (l - offset*2)/(n - 1)*i for i in range(n)] 26 return [offset + (l - offset*2)/(n - 1)*i for i in range(n)]
28 return [] 27 return []
29 28
30 def uniqify(name, names): 29 def uniqify(name, names):
31 newname = name 30 newname, i = name, 1
32 i = 1
33 while newname in names: 31 while newname in names:
34 newname = name + str(i) 32 newname, i = name + str(i), i + 1
35 i += 1
36 return newname 33 return newname
37 34
38 class Connection(QGraphicsPathItem): 35 class Connection(QGraphicsPathItem):
39 """ Implementation of a connection between blocks """ 36 """ Implementation of a connection between blocks """
40 def __init__(self, fromPort, toPort): 37 def __init__(self, fromPort, toPort):
41 super(Connection, self).__init__() 38 super(Connection, self).__init__()
42 self.pos2 = self.fromPort = self.toPort = None 39 self.pos2 = self.fromPort = self.toPort = None
43 self.setFlag(self.ItemIsSelectable, True) 40 self.setFlags(self.ItemIsSelectable | self.ItemClipsToShape)
44 self.setFlag(self.ItemClipsToShape, True) 41 pen = QPen(Qt.blue, 2, cap=Qt.RoundCap)
45 pen = QPen(Qt.blue, 2)
46 pen.setCapStyle(Qt.RoundCap)
47 self.setPen(pen) 42 self.setPen(pen)
48 self.arrowhead = QGraphicsPathItem(self) 43 self.arrowhead = QGraphicsPathItem(self)
49 self.arrowhead.setPath(buildPath([QPointF(0.0, 0.0), QPointF(-6.0, 10.0), QPointF(6.0, 10.0), QPointF(0.0, 0.0)])) 44 self.arrowhead.setPath(buildPath([QPointF(0.0, 0.0), QPointF(-6.0, 10.0), QPointF(6.0, 10.0), QPointF(0.0, 0.0)]))
50 self.arrowhead.setPen(pen) 45 self.arrowhead.setPen(pen)
51 self.arrowhead.setBrush(QBrush(pen.color())) 46 self.arrowhead.setBrush(QBrush(pen.color()))
64 d = l2.length() + l3.length() - l1.length() 59 d = l2.length() + l3.length() - l1.length()
65 if d < 5: 60 if d < 5:
66 tidx = idx 61 tidx = idx
67 idx += 1 62 idx += 1
68 self.addHandle(pos, tidx) 63 self.addHandle(pos, tidx)
69
70 def addHandle(self, pos, idx=None): 64 def addHandle(self, pos, idx=None):
71 hi = HandleItem(self) 65 hi = HandleItem(self)
72 if idx: 66 if idx:
73 self.vias.insert(idx, hi) 67 self.vias.insert(idx, hi)
74 else: 68 else:
104 self.toPort.connection = self 98 self.toPort.connection = self
105 self.toPort.posCallbacks.append(self.setEndPos) 99 self.toPort.posCallbacks.append(self.setEndPos)
106 def getPos1(self): 100 def getPos1(self):
107 if self.fromPort: 101 if self.fromPort:
108 return self.fromPort.scenePos() 102 return self.fromPort.scenePos()
109 def setBeginPos(self, pos1): 103 def setBeginPos(self, pos1): self.updateLineStukken()
110 self.updateLineStukken()
111 def setEndPos(self, endpos): 104 def setEndPos(self, endpos):
112 self.pos2 = endpos 105 self.pos2 = endpos
113 self.updateLineStukken() 106 self.updateLineStukken()
114 def itemChange(self, change, value): 107 def itemChange(self, change, value):
115 if change == self.ItemSelectedHasChanged: 108 if change == self.ItemSelectedHasChanged:
116 for via in self.vias: 109 for via in self.vias:
117 via.setVisible(value) 110 via.setVisible(value)
118 return super(Connection, self).itemChange(change, value) 111 return super(Connection, self).itemChange(change, value)
119 def shape(self): 112 def shape(self): return self.myshape
120 return self.myshape
121 def updateLineStukken(self): 113 def updateLineStukken(self):
122 """ 114 """
123 This algorithm determines the optimal routing of all signals. 115 This algorithm determines the optimal routing of all signals.
124 TODO: implement nice automatic line router 116 TODO: implement nice automatic line router
125 """ 117 """
162 def __init__(self, name, block, direction): 154 def __init__(self, name, block, direction):
163 super(PortItem, self).__init__(block) 155 super(PortItem, self).__init__(block)
164 self.connection = None 156 self.connection = None
165 d = 10.0 157 d = 10.0
166 if direction == 'input': 158 if direction == 'input':
167 path = buildPath([QPointF(-d, -d), QPointF(0, 0), QPointF(-d, d)]) 159 self.setPath(buildPath([QPointF(-d, -d), QPointF(0, 0), QPointF(-d, d)]))
168 else: 160 else:
169 path = buildPath([QPointF(0.0, -d), QPointF(d, 0), QPointF(0.0, d)]) 161 self.setPath(buildPath([QPointF(0.0, -d), QPointF(d, 0), QPointF(0.0, d)]))
170 self.setPath(path)
171 self.direction = direction 162 self.direction = direction
172 self.block = block 163 self.block = block
173 self.setCursor(QCursor(Qt.CrossCursor)) 164 self.setCursor(QCursor(Qt.CrossCursor))
174 pen = QPen(Qt.blue, 2) 165 self.setPen(QPen(Qt.blue, 2, cap=Qt.RoundCap))
175 pen.setCapStyle(Qt.RoundCap)
176 self.setPen(pen)
177 self.textItem = QGraphicsTextItem(self) 166 self.textItem = QGraphicsTextItem(self)
178 self.name = name 167 self.name = name
179 self.posCallbacks = [] 168 self.posCallbacks = []
180 self.setFlag(self.ItemSendsScenePositionChanges, True) 169 self.setFlag(self.ItemSendsScenePositionChanges, True)
181 def getName(self): return self.textItem.toPlainText() 170 def getName(self): return self.textItem.toPlainText()
182 def setName(self, name): 171 def setName(self, name):
183 self.textItem.setPlainText(name) 172 self.textItem.setPlainText(name)
184 rect = self.textItem.boundingRect() 173 rect = self.textItem.boundingRect()
185 lw, lh = rect.width(), rect.height() 174 lw, lh = rect.width(), rect.height()
186 if self.direction == 'input': 175 lx = 3 if self.direction == 'input' else -3 - lw
187 lx = 3
188 else:
189 lx = -3 - lw
190 self.textItem.setPos(lx, -lh / 2) 176 self.textItem.setPos(lx, -lh / 2)
191 name = property(getName, setName) 177 name = property(getName, setName)
192 def itemChange(self, change, value): 178 def itemChange(self, change, value):
193 if change == self.ItemScenePositionHasChanged: 179 if change == self.ItemScenePositionHasChanged:
194 for cb in self.posCallbacks: 180 for cb in self.posCallbacks:
209 def __init__(self, parent=None): 195 def __init__(self, parent=None):
210 dx = 13.0 196 dx = 13.0
211 super(HandleItem, self).__init__(QRectF(-0.5*dx,-0.5*dx,dx,dx), parent) 197 super(HandleItem, self).__init__(QRectF(-0.5*dx,-0.5*dx,dx,dx), parent)
212 self.posChangeCallbacks = [] 198 self.posChangeCallbacks = []
213 self.setBrush(QBrush(Qt.white)) 199 self.setBrush(QBrush(Qt.white))
214 self.setFlag(self.ItemSendsScenePositionChanges, True) 200 self.setFlags(self.ItemSendsScenePositionChanges | self.ItemIsMovable)
215 self.setFlag(self.ItemIsMovable, True)
216 self.setVisible(False) 201 self.setVisible(False)
217 self.setCursor(QCursor(Qt.SizeFDiagCursor)) 202 self.setCursor(QCursor(Qt.SizeFDiagCursor))
218 def mouseMoveEvent(self, event): 203 def mouseMoveEvent(self, event):
219 """ Move function without moving the other selected elements """ 204 """ Move function without moving the other selected elements """
220 p = self.mapToParent(event.pos()) 205 p = self.mapToParent(event.pos())
486 x = int(viaElement.getAttribute('x')) 471 x = int(viaElement.getAttribute('x'))
487 y = int(viaElement.getAttribute('y')) 472 y = int(viaElement.getAttribute('y'))
488 connection.addHandle(QPointF(x, y)) 473 connection.addHandle(QPointF(x, y))
489 self.addItem(connection) 474 self.addItem(connection)
490 def findPort(self, blockname, portname): 475 def findPort(self, blockname, portname):
491 items = self.items() 476 block = self.findBlock(blockname)
492 blocks = [item for item in items if type(item) is BlockItem] 477 if block:
493 for block in [b for b in blocks if b.name == blockname]:
494 for port in block.inputs + block.outputs: 478 for port in block.inputs + block.outputs:
495 if port.name == portname: 479 if port.name == portname:
496 return port 480 return port
481 def findBlock(self, blockname):
482 items = self.items()
483 blocks = [item for item in items if type(item) is BlockItem]
484 for block in blocks:
485 if block.name == blockname:
486 return block
497 def addNewBlock(self, pos, name): 487 def addNewBlock(self, pos, name):
498 blocknames = [item.name for item in self.items() if type(item) is BlockItem] 488 blocknames = [item.name for item in self.items() if type(item) is BlockItem]
499 b1 = BlockItem(uniqify(name, blocknames)) 489 b1 = BlockItem(uniqify(name, blocknames))
500 b1.setPos(pos) 490 b1.setPos(pos)
501 self.addItem(b1) 491 self.addItem(b1)