Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import FreeCAD,FreeCADGui
- from PySide import QtCore,QtGui,QtSvg
- import Draft
- from Draft import _ViewProviderDraft, _DraftObject
- class EdgebinderTaskPanel:
- '''A TaskPanel for the edgebinder'''
- def __init__(self):
- self.obj = None
- self.form = QtGui.QWidget()
- self.form.setObjectName("EdgebinderTaskPanel")
- self.grid = QtGui.QGridLayout(self.form)
- self.grid.setObjectName("grid")
- self.title = QtGui.QLabel(self.form)
- self.grid.addWidget(self.title, 0, 0, 1, 2)
- # tree
- self.tree = QtGui.QTreeWidget(self.form)
- self.grid.addWidget(self.tree, 1, 0, 1, 2)
- self.tree.setColumnCount(2)
- self.tree.setHeaderLabels(["Name","Subelement"])
- # buttons
- self.addButton = QtGui.QPushButton(self.form)
- self.addButton.setObjectName("addButton")
- self.addButton.setIcon(QtGui.QIcon(":/icons/Arch_Add.svg"))
- self.grid.addWidget(self.addButton, 3, 0, 1, 1)
- self.delButton = QtGui.QPushButton(self.form)
- self.delButton.setObjectName("delButton")
- self.delButton.setIcon(QtGui.QIcon(":/icons/Arch_Remove.svg"))
- self.grid.addWidget(self.delButton, 3, 1, 1, 1)
- QtCore.QObject.connect(self.addButton, QtCore.SIGNAL("clicked()"), self.addElement)
- QtCore.QObject.connect(self.delButton, QtCore.SIGNAL("clicked()"), self.removeElement)
- self.update()
- def isAllowedAlterSelection(self):
- return True
- def isAllowedAlterView(self):
- return True
- def getStandardButtons(self):
- return int(QtGui.QDialogButtonBox.Ok)
- def update(self):
- 'fills the treewidget'
- self.tree.clear()
- if self.obj:
- for f in self.obj.Edges:
- item = QtGui.QTreeWidgetItem(self.tree)
- item.setText(0,f[0].Name)
- item.setIcon(0,QtGui.QIcon(":/icons/Tree_Part.svg"))
- item.setText(1,f[1])
- self.retranslateUi(self.form)
- def addElement(self):
- if self.obj:
- for sel in FreeCADGui.Selection.getSelectionEx():
- if sel.HasSubObjects:
- obj = sel.Object
- for elt in sel.SubElementNames:
- if "Edge" in elt:
- flist = self.obj.Edges
- found = False
- for edge in flist:
- if (edge[0] == obj.Name) and (edge[1] == elt):
- found = True
- if not found:
- flist.append((obj,elt))
- self.obj.Edges = flist
- FreeCAD.ActiveDocument.recompute()
- self.update()
- def removeElement(self):
- if self.obj:
- it = self.tree.currentItem()
- if it:
- obj = FreeCAD.ActiveDocument.getObject(str(it.text(0)))
- elt = str(it.text(1))
- flist = []
- for edge in self.obj.Edges:
- if (edge[0].Name != obj.Name) or (edge[1] != elt):
- flist.append(edge)
- self.obj.Edges = flist
- FreeCAD.ActiveDocument.recompute()
- self.update()
- def accept(self):
- FreeCAD.ActiveDocument.recompute()
- FreeCADGui.ActiveDocument.resetEdit()
- return True
- def retranslateUi(self, TaskPanel):
- TaskPanel.setWindowTitle(QtGui.QApplication.translate("draft", "Edges", None, QtGui.QApplication.UnicodeUTF8))
- self.delButton.setText(QtGui.QApplication.translate("draft", "Remove", None, QtGui.QApplication.UnicodeUTF8))
- self.addButton.setText(QtGui.QApplication.translate("draft", "Add", None, QtGui.QApplication.UnicodeUTF8))
- self.title.setText(QtGui.QApplication.translate("draft", "Edgebinder elements", None, QtGui.QApplication.UnicodeUTF8))
- def makeEdgebinder(selectionset,name="Edgebinder"):
- """makeEdgebinder(selectionset,[name]): creates a Edgebinder object from a selection set.
- Only edges will be added."""
- if not isinstance(selectionset,list):
- selectionset = [selectionset]
- fb = FreeCAD.ActiveDocument.addObject("Part::FeaturePython",name)
- _Edgebinder(fb)
- #if gui:
- #_ViewProviderEdgebinder(fb.ViewObject)
- _ViewProviderEdgebinder(fb.ViewObject)
- edges = []
- fb.Proxy.addSubobjects(fb,selectionset)
- return fb
- class _Edgebinder(_DraftObject):
- "The Path Edgebinder object"
- def __init__(self,obj):
- _DraftObject.__init__(self,obj,"Edgebinder")
- obj.addProperty("App::PropertyLinkSubList","Edges","Draft","Linked edges")
- def execute(self,obj):
- pl = obj.Placement
- if not obj.Edges:
- return
- edges = []
- for f in obj.Edges:
- if "Edge" in f[1]:
- try:
- fnum = int(f[1][4:])-1
- edges.append(f[0].Shape.Edges[fnum])
- except(IndexError,Part.OCCError):
- print("Draft: wrong edge index")
- return
- if not edges:
- return
- import Part
- try:
- if len(edges) > 1:
- sh = edges.pop()
- sh = sh.multiFuse(edges)
- sh = sh.removeSplitter()
- else:
- sh = edges[0]
- sh.transformShape(sh.Matrix, True)
- except Part.OCCError:
- print("Path: error building Edgebinder")
- return
- obj.Shape = sh
- obj.Placement = pl
- def addSubobjects(self,obj,edgelinks):
- "adds edges to this edgebinder"
- objs = obj.Edges
- for o in edgelinks:
- if isinstance(o,tuple) or isinstance(o,list):
- if o[0].Name != obj.Name:
- objs.append(tuple(o))
- else:
- for el in o.SubElementNames:
- if "Edge" in el:
- if o.Object.Name != obj.Name:
- objs.append((o.Object,el))
- obj.Edges = objs
- self.execute(obj)
- class _ViewProviderEdgebinder(_ViewProviderDraft):
- def __init__(self,vobj):
- _ViewProviderDraft.__init__(self,vobj)
- def setEdit(self,vobj,mode):
- taskd = EdgebinderTaskPanel()
- taskd.obj = vobj.Object
- taskd.update()
- FreeCADGui.Control.showDialog(taskd)
- return True
- def unsetEdit(self,vobj,mode):
- FreeCADGui.Control.closeDialog()
- return False
- '''
- import sys
- sys.path.append("/home/danfalck/Documents/freecad/taskpanel_experiments/")
- from edgebinder import *
- selectionset=FreeCADGui.Selection.getSelectionEx()
- makeEdgebinder(selectionset,name="Edgebinder")
- '''
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement