29 from python_qt_binding
import loadUi
30 from python_qt_binding.QtCore
import Qt, Signal, Slot, QRectF, QPointF, QSize, QRect, QPoint
31 from python_qt_binding.QtWidgets
import QDialog, QGraphicsView, QGraphicsScene, QGraphicsPathItem, QGraphicsPolygonItem
32 from python_qt_binding.QtGui
import QColor, QPen, QBrush, QPainterPath, QPolygonF, QTransform, QPainter
38 b = QBrush(QColor(0,0,255))
40 b = QBrush(QColor(255,255,255))
41 elif state ==
'R': # running 42 b = QBrush(QColor(0,255,0)) 44 b = QBrush(QColor(255,0,0))
46 b = QBrush(QColor(255,127,127))
48 b = QBrush(QColor(0,255,255))
52 b = QPen(QColor(0,0,255))
54 b = QPen(QBrush(QColor(255,0,0)), 5)
56 b = QPen(QBrush(QColor(0,0,0)), 1)
61 super(GraphScene, self).
__init__(rect)
65 comp_select_signal = Signal(str)
68 super (GraphView, self).__init__ (parent)
72 self.setTransformationAnchor(QGraphicsView.NoAnchor)
73 self.setResizeAnchor(QGraphicsView.NoAnchor)
82 oldPos = self.mapToScene(event.pos())
83 self.translate(oldPos.x(),oldPos.y())
86 if event.angleDelta().y() < 0 :
88 self.scale(factor, factor)
91 newPos = self.mapToScene(event.pos())
93 delta = newPos - oldPos
94 self.translate(delta.x(), delta.y())
101 if event.button() == Qt.MidButton:
107 for item
in self.items():
108 if type(item)
is QGraphicsPolygonItem:
109 if item.contains( self.mapToScene(event.pos()) ):
113 elif type(item)
is QGraphicsPathItem:
114 if item.contains( self.mapToScene(event.pos()) ):
115 print "connections: ", item.data(0)
120 if event.buttons() == Qt.MidButton:
121 mouseMovePos = event.pos()
124 scene_diff = view_diff
125 new_tf = QTransform(tf.m11(), tf.m12(), tf.m21(), tf.m22(), tf.dx()+view_diff.x(), tf.dy()+view_diff.y())
126 self.setTransform(new_tf)
131 if event.button() == Qt.MidButton:
154 e.setPen( QPen(QBrush(QColor(0,0,0)), 1) )
160 for conn
in self.
parent.all_component_connections:
163 for graph_name
in self.
edges:
164 for e
in self.
edges[graph_name]:
166 if (data[0] == conn[0]
and data[1] == conn[2])
or \
167 (data[0] == conn[2]
and data[1] == conn[0]):
168 e.setPen( QPen(QBrush(QColor(255,0,0)), 5) )
173 self.comboBoxConnections.clear()
177 self.labelSelectedComponent.setText(
'')
180 self.labelSelectedComponent.setText(name)
181 for comp
in self.
parent.subsystem_info.components:
182 if comp.name == name:
191 port_str +=
' ' + p.name
193 port_str +=
' <conncected>' 195 port_str +=
' <not conncected>' 197 for tn
in p.type_names:
199 if len(type_str) == 0:
200 type_str =
'unknown type' 201 port_str +=
', type:' + type_str
202 self.comboBoxConnections.addItem(port_str)
205 for graph_name
in self.
nodes:
206 for comp_name
in self.
nodes[graph_name]:
208 if name
in self.
nodes[graph_name]:
214 graph_name = self.comboBoxGraphs.itemText(index)
218 super(BehaviorGraphDialog, self).
__init__(parent)
222 self.setWindowFlags(Qt.Window)
224 rp = rospkg.RosPack()
225 ui_file = os.path.join(rp.get_path(
'rqt_agent'),
'resource',
'BehaviorVis.ui')
226 loadUi(ui_file, self)
228 self.setWindowTitle(subsystem_name +
" - transition function")
232 self.pushButton_export.clicked.connect(self.
exportClick)
235 self.pushButton_close.clicked.connect(self.
closeClick)
236 self.pushButton_zoom_in.clicked.connect(self.
zoomInClick)
237 self.pushButton_zoom_out.clicked.connect(self.
zoomOutClick)
240 self.comboBoxConnections.highlighted.connect(self.
portSelected)
251 angle = 0.5*i/9.0 * math.pi
252 self.
quater.append( QPointF(math.cos(angle), math.sin(angle)) )
255 if not graph_name
in self.
scene:
256 print "could not show graph " + graph_name
274 poly.append(QPointF(x + w - radius, y + h - radius) + pt * radius)
277 poly.append(QPointF(x + radius, y + h - radius) + QPointF(-pt.y(), pt.x()) * radius)
280 poly.append(QPointF(x + radius, y + radius) + -pt * radius)
283 poly.append(QPointF(x + w - radius, y + radius) + QPointF(pt.y(), -pt.x()) * radius)
289 self.comboBoxGraphs.addItem(graph_name)
291 graph = graph_str.splitlines()
293 header = graph[0].split()
294 if header[0] !=
'graph':
295 raise Exception(
'wrong graph format',
'header is: ' + graph[0])
300 print "QGraphicsScene size:", self.
width, self.
height 304 self.
nodes[graph_name] = {}
305 self.
edges[graph_name] = []
311 elif items[0] ==
'stop':
313 elif items[0] ==
'node':
316 raise Exception(
'wrong number of items in line',
'line is: ' + l)
320 w = self.
scX(items[4])
321 h = self.
scY(items[5])
322 x = self.
tfX(items[2])
323 y = self.
tfY(items[3])
326 self.
nodes[graph_name][name].setData(0, name)
327 text_item = self.
scene[graph_name].addSimpleText(name)
328 br = text_item.boundingRect()
329 text_item.setPos(x - br.width()/2, y - br.height()/2)
331 elif items[0] ==
'edge':
337 line_len = int(items[3])
340 if (line_len * 2 + 6) == len(items):
343 elif (line_len * 2 + 9) == len(items):
345 label_text = items[4 + line_len*2]
346 label_pos = QPointF(self.
tfX(items[4 + line_len*2 + 1]), self.
tfY(items[4 + line_len*2 + 2]))
348 raise Exception(
'wrong number of items in line',
'should be: ' + str(line_len * 2 + 6) +
" or " + str(line_len * 2 + 9) +
', line is: ' + l)
351 for i
in range(line_len):
352 line.append( (self.
tfX(items[4+i*2]), self.
tfY(items[5+i*2])) )
353 control_points_idx = 1
354 path = QPainterPath(QPointF(line[0][0], line[0][1]))
356 q1 = line[control_points_idx]
357 q2 = line[control_points_idx+1]
358 p2 = line[control_points_idx+2]
359 path.cubicTo( q1[0], q1[1], q2[0], q2[1], p2[0], p2[1] )
360 control_points_idx = control_points_idx + 3
361 if control_points_idx >= len(line):
363 edge = self.
scene[graph_name].addPath(path)
364 edge.setData(0, (items[1], items[2]))
365 self.
edges[graph_name].append(edge)
367 end_p = QPointF(line[-1][0], line[-1][1])
368 p0 = end_p - QPointF(line[-2][0], line[-2][1])
369 p0_norm = math.sqrt(p0.x()*p0.x() + p0.y()*p0.y())
372 p1 = QPointF(p0.y(), -p0.x()) * 0.25
376 poly.append(p0+end_p)
377 poly.append(p1+end_p)
378 poly.append(p2+end_p)
379 poly.append(p0+end_p)
384 self.
scene[graph_name].addPolygon(poly)
386 if label_text
and label_pos:
387 if label_text[0] ==
"\"":
388 label_text = label_text[1:]
389 if label_text[-1] ==
"\"":
390 label_text = label_text[:-1]
391 label_text = label_text.replace(
"\\n",
"\n")
392 label_item = self.
scene[graph_name].addSimpleText(label_text)
393 br = label_item.boundingRect()
394 label_item.setPos(label_pos.x() - br.width()/2, label_pos.y() - br.height()/2)
400 self.
parent.exportBehaviorGraphs()
426 scaleFactor = 1.0/1.1
438 if comp_name
in components_state
and self.
components_state[comp_name] != components_state[comp_name]:
444 for graph_name
in self.
nodes:
445 for comp_name
in self.
nodes[graph_name]:
449 self.
nodes[graph_name][comp_name].setBrush(QBrush(QColor(200,200,200)))
def wheelEvent(self, event)
def graphSelected(self, index)
prev_selected_connections
def mousePressEvent(self, event)
def getComponentPen(state)
def portSelected(self, index)
def getComponentBrush(state)
def selectComponent(self, name)
def showGraph(self, graph_name)
def addGraph(self, graph_name, graph_str)
def updateState(self, components_state)
def generateRoundedBox(self, x, y, w, h)
def mouseMoveEvent(self, event)
def __init__(self, parent=None)
def __init__(self, subsystem_name, parent=None)
selected_component_port_names
def reset_viewClick(self)
def componentSelected(self, name)
def mouseReleaseEvent(self, event)