Basic tag visualization and selection.

This commit is contained in:
Markus Lampert 2017-01-03 18:01:16 -08:00
parent c2f2a25054
commit e6c968cb79

View File

@ -36,6 +36,7 @@ from DraftGui import todo
from PathScripts import PathUtils from PathScripts import PathUtils
from PathScripts.PathGeom import * from PathScripts.PathGeom import *
from PySide import QtCore, QtGui from PySide import QtCore, QtGui
from pivy import coin
"""Holding Tags Dressup object and FreeCAD command""" """Holding Tags Dressup object and FreeCAD command"""
@ -753,9 +754,10 @@ class TaskPanel:
DataX = QtCore.Qt.ItemDataRole.UserRole DataX = QtCore.Qt.ItemDataRole.UserRole
DataY = QtCore.Qt.ItemDataRole.UserRole + 1 DataY = QtCore.Qt.ItemDataRole.UserRole + 1
def __init__(self, obj, jvoVisibility=None): def __init__(self, obj, viewProvider, jvoVisibility=None):
self.obj = obj self.obj = obj
self.obj.Proxy.obj = obj self.obj.Proxy.obj = obj
self.viewProvider = viewProvider
self.form = FreeCADGui.PySideUic.loadUi(":/panels/HoldingTagsEdit.ui") self.form = FreeCADGui.PySideUic.loadUi(":/panels/HoldingTagsEdit.ui")
self.jvo = PathUtils.findParentJob(obj).ViewObject self.jvo = PathUtils.findParentJob(obj).ViewObject
if jvoVisibility is None: if jvoVisibility is None:
@ -779,6 +781,7 @@ class TaskPanel:
FreeCAD.ActiveDocument.recompute() FreeCAD.ActiveDocument.recompute()
def cleanup(self): def cleanup(self):
self.viewProvider.clearTaskPanel()
FreeCADGui.ActiveDocument.resetEdit() FreeCADGui.ActiveDocument.resetEdit()
FreeCADGui.Control.closeDialog() FreeCADGui.Control.closeDialog()
FreeCAD.ActiveDocument.recompute() FreeCAD.ActiveDocument.recompute()
@ -790,7 +793,7 @@ class TaskPanel:
print("closed") print("closed")
def open(self): def open(self):
self.s = SelObserver() self.s = SelObserver(self.viewProvider)
# install the function mode resident # install the function mode resident
FreeCADGui.Selection.addObserver(self.s) FreeCADGui.Selection.addObserver(self.s)
@ -836,6 +839,7 @@ class TaskPanel:
item.setFlags(flags) item.setFlags(flags)
self.form.lwTags.addItem(item) self.form.lwTags.addItem(item)
self.form.lwTags.blockSignals(False) self.form.lwTags.blockSignals(False)
self.whenTagSelectionChanged()
def cleanupUI(self): def cleanupUI(self):
print("cleanupUI") print("cleanupUI")
@ -868,10 +872,14 @@ class TaskPanel:
count = self.form.sbCount.value() count = self.form.sbCount.value()
self.form.pbGenerate.setEnabled(count) self.form.pbGenerate.setEnabled(count)
def selectTagWithId(self, index):
self.form.lwTags.setCurrentRow(index)
def whenTagSelectionChanged(self): def whenTagSelectionChanged(self):
print('whenTagSelectionChanged') print('whenTagSelectionChanged')
item = self.form.lwTags.currentItem() index = self.form.lwTags.currentRow()
self.form.pbDelete.setEnabled(not item is None) self.form.pbDelete.setEnabled(index != -1)
self.viewProvider.selectTag(index)
def deleteSelectedTag(self): def deleteSelectedTag(self):
self.obj.Proxy.setXyEnabled(self.getTags(False)) self.obj.Proxy.setXyEnabled(self.getTags(False))
@ -883,10 +891,8 @@ class TaskPanel:
tags = self.tags tags = self.tags
tags.append((point.x, point.y, True)) tags.append((point.x, point.y, True))
self.obj.Proxy.setXyEnabled(tags) self.obj.Proxy.setXyEnabled(tags)
panel = TaskPanel(self.obj, self.jvoVisible) panel = TaskPanel(self.obj, self.viewProvider, self.jvoVisible)
todo.delay(FreeCADGui.Control.closeDialog, None) todo.delay(self.viewProvider.setupTaskPanel, panel)
todo.delay(FreeCADGui.Control.showDialog, panel)
todo.delay(panel.setupUi, None)
def addNewTag(self): def addNewTag(self):
self.tags = self.getTags(True) self.tags = self.getTags(True)
@ -938,47 +944,94 @@ class TaskPanel:
self.form.pbDelete.clicked.connect(self.deleteSelectedTag) self.form.pbDelete.clicked.connect(self.deleteSelectedTag)
self.form.pbAdd.clicked.connect(self.addNewTag) self.form.pbAdd.clicked.connect(self.addNewTag)
self.viewProvider.turnMarkerDisplayOn(True)
class SelObserver: class SelObserver:
def __init__(self): def __init__(self, viewProvider):
import PathScripts.PathSelection as PST FreeCADGui.Selection.addSelectionGate(self)
PST.eselect() self.viewProvider = viewProvider
def __del__(self): def __del__(self):
import PathScripts.PathSelection as PST FreeCADGui.Selection.removeSelectionGate()
PST.clear()
def allow(self, doc, obj, sub):
return self.viewProvider.allowSelection(obj, sub)
def addSelection(self, doc, obj, sub, pnt): def addSelection(self, doc, obj, sub, pnt):
self.viewProvider.addSelection(pnt)
#FreeCADGui.doCommand('Gui.Selection.addSelection(FreeCAD.ActiveDocument.' + obj + ')') #FreeCADGui.doCommand('Gui.Selection.addSelection(FreeCAD.ActiveDocument.' + obj + ')')
FreeCADGui.updateGui() FreeCADGui.updateGui()
class HoldingTagMarker:
def __init__(self, p):
self.point = p
self.sep = coin.SoSeparator()
self.pos = coin.SoTranslation()
self.pos.translation = (p.x, p.y, p.z)
self.sphere = coin.SoSphere()
self.material = coin.SoMaterial()
self.sep.addChild(self.pos)
self.sep.addChild(self.material)
self.sep.addChild(self.sphere)
def setSelected(self, select):
self.selected = select
self.sphere.radius = 1.5 if select else 1.0
def setEnabled(self, enabled):
self.enabled = enabled
if enabled:
print("green")
self.material.diffuseColor = coin.SbColor(0.0, 1.0, 0.0)
self.material.transparency = 0.0
else:
print("gray")
self.material.diffuseColor = coin.SbColor(0.8, 0.8, 0.8)
self.material.transparency = 0.6
class ViewProviderDressup: class ViewProviderDressup:
def __init__(self, vobj): def __init__(self, vobj):
vobj.Proxy = self vobj.Proxy = self
def attach(self, vobj): def attach(self, vobj):
self.Object = vobj.Object self.obj = vobj.Object
return self.tags = []
self.switch = coin.SoSwitch()
vobj.RootNode.addChild(self.switch)
self.turnMarkerDisplayOn(False)
def turnMarkerDisplayOn(self, display):
sw = coin.SO_SWITCH_ALL if display else coin.SO_SWITCH_NONE
self.switch.whichChild = sw
def claimChildren(self): def claimChildren(self):
for i in self.Object.Base.InList: for i in self.obj.Base.InList:
if hasattr(i, "Group"): if hasattr(i, "Group"):
group = i.Group group = i.Group
for g in group: for g in group:
if g.Name == self.Object.Base.Name: if g.Name == self.obj.Base.Name:
group.remove(g) group.remove(g)
i.Group = group i.Group = group
print i.Group print i.Group
#FreeCADGui.ActiveDocument.getObject(obj.Base.Name).Visibility = False #FreeCADGui.ActiveDocument.getObject(obj.Base.Name).Visibility = False
return [self.Object.Base] return [self.obj.Base]
def setEdit(self, vobj, mode=0): def setEdit(self, vobj, mode=0):
panel = TaskPanel(vobj.Object, self)
self.setupTaskPanel(panel)
return True
def setupTaskPanel(self, panel):
self.panel = panel
FreeCADGui.Control.closeDialog() FreeCADGui.Control.closeDialog()
panel = TaskPanel(vobj.Object)
FreeCADGui.Control.showDialog(panel) FreeCADGui.Control.showDialog(panel)
panel.setupUi() panel.setupUi()
return True
def clearTaskPanel(self):
self.panel = None
self.turnMarkerDisplayOn(False)
def __getstate__(self): def __getstate__(self):
return None return None
@ -992,6 +1045,41 @@ class ViewProviderDressup:
PathUtils.addToJob(arg1.Object.Base) PathUtils.addToJob(arg1.Object.Base)
return True return True
def updateData(self, obj, propName):
if 'Disabled' == propName:
for tag in self.tags:
self.switch.removeChild(tag.sep)
tags = []
for i, p in enumerate(obj.Positions):
tag = HoldingTagMarker(p)
tag.setEnabled(not i in obj.Disabled)
tags.append(tag)
self.switch.addChild(tag.sep)
self.tags = tags
def selectTag(self, index):
print("selectTag(%s)" % index)
for i, tag in enumerate(self.tags):
tag.setSelected(i == index)
def allowSelection(self, obj, sub):
if obj == self.obj:
print("allowSelection(%s, %s)" % (obj.Name, sub))
return True
return False
def tagAtPoint(self, point):
p = FreeCAD.Vector(point[0], point[1], point[2])
for i, tag in enumerate(self.tags):
if PathGeom.pointsCoincide(p, tag.point, tag.sphere.radius.getValue() * 1.1):
return i
return -1
def addSelection(self, point):
i = self.tagAtPoint(point)
if self.panel:
self.panel.selectTagWithId(i)
class CommandPathDressupHoldingTags: class CommandPathDressupHoldingTags:
def GetResources(self): def GetResources(self):