Mercurial > lcfOS
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) |