Source code for director.affordancepanel

from director import applogic as app
from director.debugVis import DebugData
from director import transformUtils
from director import objectmodel as om
from director import affordanceitems
from director import affordanceurdf
from director.uuidutil import newUUID
import director.vtkAll as vtk
import numpy as np

import PythonQt
from PythonQt import QtCore, QtGui, QtUiTools



[docs]def addWidgetsToDict(widgets, d): for widget in widgets: if widget.objectName: d[str(widget.objectName)] = widget addWidgetsToDict(widget.children(), d)
[docs]class WidgetDict(object): def __init__(self, widgets): addWidgetsToDict(widgets, self.__dict__)
[docs]class AffordancePanel(object): def __init__(self, view, affordanceManager, jointController=None, raycastDriver=None): self.view = view self.affordanceManager = affordanceManager self.jointController = jointController self.raycastDriver = raycastDriver loader = QtUiTools.QUiLoader() uifile = QtCore.QFile(':/ui/ddAffordancePanel.ui') assert uifile.open(uifile.ReadOnly) self.widget = loader.load(uifile) self.ui = WidgetDict(self.widget.children()) self.ui.affordanceListWidget.hide() self.ui.spawnBoxButton.connect('clicked()', self.onSpawnBox) self.ui.spawnSphereButton.connect('clicked()', self.onSpawnSphere) self.ui.spawnCylinderButton.connect('clicked()', self.onSpawnCylinder) self.ui.spawnCapsuleButton.connect('clicked()', self.onSpawnCapsule) self.ui.spawnRingButton.connect('clicked()', self.onSpawnRing) self.ui.spawnMeshButton.connect('clicked()', self.onSpawnMesh) self.ui.getRaycastTerrainButton.connect('clicked()', self.onGetRaycastTerrain) if not self.raycastDriver: self.ui.getRaycastTerrainButton.hide() self.eventFilter = PythonQt.dd.ddPythonEventFilter() self.ui.scrollArea.installEventFilter(self.eventFilter) self.eventFilter.addFilteredEventType(QtCore.QEvent.Resize) self.eventFilter.connect('handleEvent(QObject*, QEvent*)', self.onEvent)
[docs] def onEvent(self, obj, event): minSize = self.ui.scrollArea.widget().minimumSizeHint.width() + self.ui.scrollArea.verticalScrollBar().width self.ui.scrollArea.setMinimumWidth(minSize)
[docs] def getSpawnFrame(self): if self.jointController: # get spawn frame in front of robot pos = self.jointController.q[:3] rpy = np.degrees(self.jointController.q[3:6]) frame = transformUtils.frameFromPositionAndRPY(pos, rpy) frame.PreMultiply() frame.Translate(0.5, 0.0, 0.3) else: frame = vtk.vtkTransform() return frame
[docs] def onGetRaycastTerrain(self): affs = self.affordanceManager.getCollisionAffordances() xy = self.jointController.q[:2] self.raycastDriver.requestRaycast(affs, xy-2, xy+2)
[docs] def onSpawnBox(self): pose = transformUtils.poseFromTransform(self.getSpawnFrame()) desc = dict(classname='BoxAffordanceItem', Name='box', uuid=newUUID(), pose=pose) return self.affordanceManager.newAffordanceFromDescription(desc)
[docs] def onSpawnSphere(self): pose = transformUtils.poseFromTransform(self.getSpawnFrame()) desc = dict(classname='SphereAffordanceItem', Name='sphere', uuid=newUUID(), pose=pose) return self.affordanceManager.newAffordanceFromDescription(desc)
[docs] def onSpawnCylinder(self): pose = transformUtils.poseFromTransform(self.getSpawnFrame()) desc = dict(classname='CylinderAffordanceItem', Name='cylinder', uuid=newUUID(), pose=pose) return self.affordanceManager.newAffordanceFromDescription(desc)
[docs] def onSpawnCapsule(self): pose = transformUtils.poseFromTransform(self.getSpawnFrame()) desc = dict(classname='CapsuleAffordanceItem', Name='capsule', uuid=newUUID(), pose=pose) return self.affordanceManager.newAffordanceFromDescription(desc)
[docs] def onSpawnRing(self): pose = transformUtils.poseFromTransform(self.getSpawnFrame()) desc = dict(classname='CapsuleRingAffordanceItem', Name='ring', uuid=newUUID(), pose=pose) return self.affordanceManager.newAffordanceFromDescription(desc)
[docs] def onSpawnMesh(self): d = DebugData() d.addArrow((0,0,0), (0,0,0.3)) pd = d.getPolyData() meshId = affordanceitems.MeshAffordanceItem.getMeshManager().add(pd) pose = transformUtils.poseFromTransform(self.getSpawnFrame()) desc = dict(classname='MeshAffordanceItem', Name='mesh', Filename=meshId, uuid=newUUID(), pose=pose) return self.affordanceManager.newAffordanceFromDescription(desc)
def _getAction(): return None
[docs]def init(view, affordanceManager, jointController, raycastDriver): global panel global dock panel = AffordancePanel(view, affordanceManager, jointController, raycastDriver) dock = app.addWidgetToDock(panel.widget, action=_getAction()) dock.hide() return panel