Advertisement
danfalck

edgebinder.py

Feb 6th, 2016
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.88 KB | None | 0 0
  1. import FreeCAD,FreeCADGui
  2.  
  3.  
  4. from PySide import QtCore,QtGui,QtSvg
  5.  
  6. import Draft
  7. from Draft import _ViewProviderDraft, _DraftObject
  8.  
  9. class EdgebinderTaskPanel:
  10.     '''A TaskPanel for the edgebinder'''
  11.     def __init__(self):
  12.        
  13.         self.obj = None
  14.         self.form = QtGui.QWidget()
  15.         self.form.setObjectName("EdgebinderTaskPanel")
  16.         self.grid = QtGui.QGridLayout(self.form)
  17.         self.grid.setObjectName("grid")
  18.         self.title = QtGui.QLabel(self.form)
  19.         self.grid.addWidget(self.title, 0, 0, 1, 2)
  20.  
  21.         # tree
  22.         self.tree = QtGui.QTreeWidget(self.form)
  23.         self.grid.addWidget(self.tree, 1, 0, 1, 2)
  24.         self.tree.setColumnCount(2)
  25.         self.tree.setHeaderLabels(["Name","Subelement"])
  26.  
  27.         # buttons
  28.         self.addButton = QtGui.QPushButton(self.form)
  29.         self.addButton.setObjectName("addButton")
  30.         self.addButton.setIcon(QtGui.QIcon(":/icons/Arch_Add.svg"))
  31.         self.grid.addWidget(self.addButton, 3, 0, 1, 1)
  32.  
  33.         self.delButton = QtGui.QPushButton(self.form)
  34.         self.delButton.setObjectName("delButton")
  35.         self.delButton.setIcon(QtGui.QIcon(":/icons/Arch_Remove.svg"))
  36.         self.grid.addWidget(self.delButton, 3, 1, 1, 1)
  37.  
  38.         QtCore.QObject.connect(self.addButton, QtCore.SIGNAL("clicked()"), self.addElement)
  39.         QtCore.QObject.connect(self.delButton, QtCore.SIGNAL("clicked()"), self.removeElement)
  40.         self.update()
  41.  
  42.     def isAllowedAlterSelection(self):
  43.         return True
  44.  
  45.     def isAllowedAlterView(self):
  46.         return True
  47.  
  48.     def getStandardButtons(self):
  49.         return int(QtGui.QDialogButtonBox.Ok)
  50.  
  51.     def update(self):
  52.         'fills the treewidget'
  53.         self.tree.clear()
  54.         if self.obj:
  55.             for f in self.obj.Edges:
  56.                 item = QtGui.QTreeWidgetItem(self.tree)
  57.                 item.setText(0,f[0].Name)
  58.                 item.setIcon(0,QtGui.QIcon(":/icons/Tree_Part.svg"))
  59.                 item.setText(1,f[1])
  60.         self.retranslateUi(self.form)
  61.  
  62.     def addElement(self):
  63.         if self.obj:
  64.             for sel in FreeCADGui.Selection.getSelectionEx():
  65.                 if sel.HasSubObjects:
  66.                     obj = sel.Object
  67.                     for elt in sel.SubElementNames:
  68.                         if "Edge" in elt:
  69.                             flist = self.obj.Edges
  70.                             found = False
  71.                             for edge in flist:
  72.                                 if (edge[0] == obj.Name) and (edge[1] == elt):
  73.                                     found = True
  74.                             if not found:
  75.                                 flist.append((obj,elt))
  76.                                 self.obj.Edges = flist
  77.                                 FreeCAD.ActiveDocument.recompute()
  78.             self.update()
  79.  
  80.     def removeElement(self):
  81.         if self.obj:
  82.             it = self.tree.currentItem()
  83.             if it:
  84.                 obj = FreeCAD.ActiveDocument.getObject(str(it.text(0)))
  85.                 elt = str(it.text(1))
  86.                 flist = []
  87.                 for edge in self.obj.Edges:
  88.                     if (edge[0].Name != obj.Name) or (edge[1] != elt):
  89.                         flist.append(edge)
  90.                 self.obj.Edges = flist
  91.                 FreeCAD.ActiveDocument.recompute()
  92.             self.update()
  93.  
  94.     def accept(self):
  95.         FreeCAD.ActiveDocument.recompute()
  96.         FreeCADGui.ActiveDocument.resetEdit()
  97.         return True
  98.  
  99.     def retranslateUi(self, TaskPanel):
  100.         TaskPanel.setWindowTitle(QtGui.QApplication.translate("draft", "Edges", None, QtGui.QApplication.UnicodeUTF8))
  101.         self.delButton.setText(QtGui.QApplication.translate("draft", "Remove", None, QtGui.QApplication.UnicodeUTF8))
  102.         self.addButton.setText(QtGui.QApplication.translate("draft", "Add", None, QtGui.QApplication.UnicodeUTF8))
  103.         self.title.setText(QtGui.QApplication.translate("draft", "Edgebinder elements", None, QtGui.QApplication.UnicodeUTF8))
  104.  
  105.  
  106.  
  107. def makeEdgebinder(selectionset,name="Edgebinder"):
  108.     """makeEdgebinder(selectionset,[name]): creates a Edgebinder object from a selection set.
  109.    Only edges will be added."""
  110.     if not isinstance(selectionset,list):
  111.         selectionset = [selectionset]
  112.     fb = FreeCAD.ActiveDocument.addObject("Part::FeaturePython",name)
  113.     _Edgebinder(fb)
  114.     #if gui:
  115.         #_ViewProviderEdgebinder(fb.ViewObject)
  116.     _ViewProviderEdgebinder(fb.ViewObject)
  117.     edges = []
  118.     fb.Proxy.addSubobjects(fb,selectionset)
  119.     return fb
  120.  
  121. class _Edgebinder(_DraftObject):
  122.     "The Path Edgebinder object"
  123.     def __init__(self,obj):
  124.         _DraftObject.__init__(self,obj,"Edgebinder")
  125.         obj.addProperty("App::PropertyLinkSubList","Edges","Draft","Linked edges")
  126.  
  127.     def execute(self,obj):
  128.         pl = obj.Placement
  129.         if not obj.Edges:
  130.             return
  131.         edges = []
  132.         for f in obj.Edges:
  133.             if "Edge" in f[1]:
  134.                 try:
  135.                     fnum = int(f[1][4:])-1
  136.                     edges.append(f[0].Shape.Edges[fnum])
  137.                 except(IndexError,Part.OCCError):
  138.                     print("Draft: wrong edge index")
  139.                     return
  140.         if not edges:
  141.             return
  142.         import Part
  143.         try:
  144.             if len(edges) > 1:
  145.                 sh = edges.pop()
  146.                 sh = sh.multiFuse(edges)
  147.                 sh = sh.removeSplitter()
  148.             else:
  149.                 sh = edges[0]
  150.                 sh.transformShape(sh.Matrix, True)
  151.         except Part.OCCError:
  152.             print("Path: error building Edgebinder")
  153.             return
  154.         obj.Shape = sh
  155.         obj.Placement = pl
  156.        
  157.     def addSubobjects(self,obj,edgelinks):
  158.         "adds edges to this edgebinder"
  159.         objs = obj.Edges
  160.         for o in edgelinks:
  161.             if isinstance(o,tuple) or isinstance(o,list):
  162.                 if o[0].Name != obj.Name:
  163.                     objs.append(tuple(o))
  164.             else:
  165.                 for el in o.SubElementNames:
  166.                     if "Edge" in el:
  167.                         if o.Object.Name != obj.Name:
  168.                             objs.append((o.Object,el))
  169.         obj.Edges = objs
  170.         self.execute(obj)
  171.        
  172.        
  173. class _ViewProviderEdgebinder(_ViewProviderDraft):
  174.     def __init__(self,vobj):
  175.         _ViewProviderDraft.__init__(self,vobj)
  176.        
  177.     def setEdit(self,vobj,mode):
  178.        
  179.         taskd = EdgebinderTaskPanel()
  180.         taskd.obj = vobj.Object
  181.         taskd.update()
  182.         FreeCADGui.Control.showDialog(taskd)
  183.         return True
  184.  
  185.     def unsetEdit(self,vobj,mode):
  186.         FreeCADGui.Control.closeDialog()
  187.         return False
  188.  
  189. '''
  190. import sys
  191. sys.path.append("/home/danfalck/Documents/freecad/taskpanel_experiments/")
  192. from edgebinder import *
  193.  
  194. selectionset=FreeCADGui.Selection.getSelectionEx()
  195.  
  196. makeEdgebinder(selectionset,name="Edgebinder")
  197. '''
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement