|
Descrizione |
---|
Strumento booleano intermedio tra Part Union e Part Common. Parametrico. |
Autore |
DeepSOIC |
Link |
Esempi di macro Come installare le Macro Personalizzare la barra degli strumenti |
Versione |
0.1 |
Data ultima modifica |
2016-10-12 |
Sovrapposizione Booleana costruisce una forma che copre lo spazio occupato da non meno del 'OverlapIndex' forme. 'OverlapIndex' è una proprietà che può essere modificata. Il valore 1 fornisce il risultato equivalente a Part Union. Il valore pari al numero di forme rende lo strumento equivalente a Part Union. Il valore predefinito è 2, vale a dire il risultato riempie lo spazio in cui non vi è alcuna sovrapposizione.
Richiede FreeCAD v0.17+ costruito su OCC non inferiore a 6.9.0 (provato con 7.0.0).
Scaricare questi due file e salvarli nella directory macro:
https://github.com/DeepSOIC/FreeCAD-Macros/raw/master/Overlap/Overlap.FCMacro
https://github.com/DeepSOIC/FreeCAD-Macros/raw/master/Overlap/MacroOverlap.py
MacroOverlap.py:
import FreeCAD as App if App.GuiUp: import FreeCADGui as Gui import Part def makeOverlapFeature(): '''makeOverlapFeature(): makes a Overlap parametric feature object. Returns the new object.''' selfobj = App.ActiveDocument.addObject("Part::FeaturePython","Overlap") Overlap(selfobj) ViewProviderOverlap(selfobj.ViewObject) return selfobj class Overlap: "The Overlap feature object" def __init__(self,selfobj): selfobj.addProperty("App::PropertyLinkList","Objects","Overlap","Input shape") selfobj.addProperty("App::PropertyInteger", "OverlapIndex", "Overlap", "minimum overlap order to output") selfobj.OverlapIndex = 2 selfobj.Proxy = self def execute(self,selfobj): import BOPTools import BOPTools.Utils as Utils from BOPTools.GeneralFuseResult import GeneralFuseResult list_of_shapes = [obj.Shape for obj in selfobj.Objects] if len(list_of_shapes) == 1 and list_of_shapes[0].ShapeType == "Compound": list_of_shapes = list_of_shapes[0].childShapes() list_of_shapes = Utils.upgradeToAggregateIfNeeded(list_of_shapes) pieces, map = list_of_shapes[0].generalFuse(list_of_shapes[1:]) gr = GeneralFuseResult(list_of_shapes, (pieces,map)) gr.explodeCompounds() gr.splitAggregates() pieces_to_keep = [] for piece in gr.pieces: if len(gr.sourcesOfPiece(piece)) >= selfobj.OverlapIndex: pieces_to_keep.append(piece) selfobj.Shape = BOPTools.ShapeMerge.mergeShapes(pieces_to_keep) class ViewProviderOverlap: def __init__(self,vobj): vobj.Proxy = self def getIcon(self): return ":/icons/Part_Overlap.svg" def attach(self, vobj): self.ViewObject = vobj self.Object = vobj.Object def setEdit(self,vobj,mode): return False def unsetEdit(self,vobj,mode): return def __getstate__(self): return None def __setstate__(self,state): return None def claimChildren(self): return self.Object.Objects def onDelete(self, feature, subelements): # subelements is a tuple of strings try: for f in self.Object.Objects: f.ViewObject.show() except Exception as err: App.Console.PrintError("Error in onDelete: " + err.message) return True class CommandMacroOverlap: "Command to create Overlap feature" def GetResources(self): return {'Pixmap' : ":/icons/Part_Overlap.svg", 'MenuText': "Overlap", 'Accel': "", 'ToolTip': "Macro_Overlap: alternative implementation of Part Overlap tool"} def Activated(self): run() def IsActive(self): if App.ActiveDocument: return True else: return False if App.GuiUp: Gui.addCommand("Macro_Overlap", CommandMacroOverlap()) def run(): sel = Gui.Selection.getSelectionEx() try: if len(sel) < 1: raise Exception("Select two shapes to compute Overlap between, first! Then run this macro.") try: App.ActiveDocument.openTransaction("Macro Overlap") selfobj = makeOverlapFeature() selfobj.Objects = [it.Object for it in sel] for f in selfobj.Objects: f.ViewObject.hide() selfobj.Proxy.execute(selfobj) finally: App.ActiveDocument.commitTransaction() except Exception as err: from PySide import QtGui mb = QtGui.QMessageBox() mb.setIcon(mb.Icon.Warning) mb.setText(err.message) mb.setWindowTitle("Macro Overlap") mb.exec_()
Overlap.FCMacro:
__Title__ = "Macro Overlap" __Author__ = "DeepSOIC" __Version__ = "0.1" __Date__ = "12/10/2016" __Comment__ = "Extension of Part Common boolean operation" __Web__ = "http://forum.freecadweb.org/viewtopic.php?f=8&t=17755" __Wiki__ = "http://www.freecadweb.org/wiki/index.php?title=Macro_Boolean_Overlap" __Status__ = "experimental" __Requires__ = "freecad 0.17.8053 with OCC 6.9.0+" __Communication__ = "http://www.freecadweb.org/wiki/index.php?title=User:DeepSOIC" __Help__ = ''' Macro Overlap. Requires FreeCAD v0.17.8053+ and OCC 6.9.0+ Instructions: Select three or more shapes to compute Overlap between. A single compound will do, too. Then, run this macro. Parametric Overlap object is created. ''' import MacroOverlap MacroOverlap.run()