Basic tag visualization and selection.
This commit is contained in:
parent
c2f2a25054
commit
e6c968cb79
|
@ -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):
|
||||||
|
|
Loading…
Reference in New Issue
Block a user