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'