Source code for director.measurementpanel

from PythonQt import QtCore, QtGui

from director import uipanel
from director import pointpicker
from director import applogic
from director import objectmodel as om
from director import vieweventfilter
from director import visualization as vis
from director import vtkAll as vtk
from director.debugVis import DebugData
import numpy as np

[docs]class MyEventFilter(vieweventfilter.ViewEventFilter): def __init__(self, view, panel): vieweventfilter.ViewEventFilter.__init__(self, view) self.panel = panel
[docs] def onMouseMove(self, event): displayPoint = self.getMousePositionInView(event) self.panel.onMouseMove(displayPoint)
[docs] def onLeftClick(self, event): displayPoint = self.getMousePositionInView(event) if event.modifiers() == QtCore.Qt.ShiftModifier: self.panel.onShiftMouseClick(displayPoint)
[docs]class MeasurementPanel(uipanel.UiPanel): def __init__(self, app, view): uipanel.UiPanel.__init__(self, 'ddMeasurementPanel.ui') self.view = view self.ui.enabledCheck.connect('toggled(bool)', self.onEnabledCheckBox) self.ui.clearButton.connect('clicked()', self.onClear) #self.snapshotTextShortcut = applogic.addShortcut(app.mainWindow, ' ', self.snapshotText) #self.snapshotGeometryShortcut = applogic.addShortcut(app.mainWindow, 'Shift+ ', self.snapshotGeometry) self.eventFilter = MyEventFilter(view, self) self.annotation = vis.PolyDataItem('annotation', self.makeSphere((0,0,0)), view) self.annotation.setProperty('Color', [0,1,0]) self.annotation.actor.SetPickable(False) self.annotation.actor.SetUserTransform(vtk.vtkTransform()) self.pickPoints = [] self.setEnabled(False)
[docs] def onEnabledCheckBox(self): self.setEnabled(self.isEnabled())
[docs] def isEnabled(self): return bool(self.ui.enabledCheck.checked)
[docs] def setEnabled(self, enabled): self.ui.enabledCheck.checked = enabled self.annotation.setProperty('Visible', False) folder = self.getRootFolder(create=False) if folder: for obj in folder.children(): obj.actor.SetPickable(not enabled) #self.snapshotTextShortcut.enabled = self.isEnabled() #self.snapshotGeometryShortcut.enabled = self.isEnabled() if self.isEnabled(): self.eventFilter.installEventFilter() else: self.eventFilter.removeEventFilter() self.ui.panelContents.setEnabled(enabled)
[docs] def onClear(self): self.ui.textEdit.clear() om.removeFromObjectModel(self.getRootFolder()) self.pickPoints = []
[docs] def pickIsValid(self): return self.ui.objName.text != 'none'
[docs] def getRootFolder(self, create=True): name = 'measurements' if create: return om.getOrCreateContainer(name) else: return om.findObjectByName(name)
[docs] def makeSphere(self, position, radius=0.0075): d = DebugData() d.addSphere(position, radius=radius) return d.getPolyData()
[docs] def snapshotGeometry(self): if not self.pickIsValid(): return p = np.array([float(x) for x in self.ui.pickPt.text.split(', ')]) self.pickPoints.append(p) polyData = self.makeSphere(p) folder = self.getRootFolder() i = len(folder.children()) obj = vis.showPolyData(polyData, 'point %d' % i, color=[1,0,0], parent=folder) obj.actor.SetPickable(False)
[docs] def snapshotText(self): if not self.pickIsValid(): return if len(self.pickPoints) > 1: dist = np.linalg.norm(self.pickPoints[-1] - self.pickPoints[-2]) else: dist = 0.0 s = 'pick_point ' + self.ui.pickPt.text + '\n' s += 'pick_normal ' + self.ui.pickNormal.text + '\n' s += 'dist_to_previous_point ' + '%f' % dist + '\n' s += '\n' self.ui.textEdit.append(s.replace('\n','<br/>'))
[docs] def onShiftMouseClick(self, displayPoint): self.updatePick(displayPoint) self.snapshotGeometry() self.snapshotText() self.annotation.setProperty('Visible', False)
[docs] def onMouseMove(self, displayPoint): self.updatePick(displayPoint)
[docs] def updatePick(self, displayPoint): pickType = str(self.ui.pickTypeCombo.currentText) if 'render' in pickType: pickType = 'render' elif 'vertex' in pickType: pickType = 'points' elif 'surface' in pickType: pickType = 'cells' else: raise Exception('unknown pick type') tolerance = self.ui.toleranceSpinBox.value pickPointFields = vis.pickPoint( displayPoint, self.view, pickType=pickType, tolerance=tolerance) worldPoint = pickPointFields.pickedPoint prop = pickPointFields.pickedProp dataset = pickPointFields.pickedDataset normal = pickPointFields.pickedNormal if not prop: worldPoint = np.zeros(3) normal = np.zeros(3) obj = vis.getObjectByProp(prop) self.ui.displayPt.text = '%d, %d' % tuple(displayPoint) self.ui.worldPt.text = '%.5f, %.5f, %.5f' % tuple(worldPoint) self.ui.pickPt.text = '%.5f, %.5f, %.5f' % tuple(worldPoint) self.ui.pickNormal.text = '%.5f, %.5f, %.5f' % tuple(normal) self.annotation.setProperty('Visible', prop is not None) t = vtk.vtkTransform() t.Translate(worldPoint) self.annotation.actor.SetUserTransform(t) self.annotation._renderAllViews() if obj: self.ui.objName.text = obj.getProperty('Name') else: self.ui.objName.text = 'none' if dataset: self.ui.numPts.text = dataset.GetNumberOfPoints() self.ui.numCells.text = dataset.GetNumberOfCells() else: self.ui.numPts.text = '0' self.ui.numCells.text = '0'