FreeCAD-Doc/localwiki/Macro_Overlap.html
2018-07-08 12:11:49 -05:00

225 lines
9.3 KiB
HTML

<html><head><title>Macro Overlap</title><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><link type='text/css' href='wiki.css' rel='stylesheet'></head><body><h1>Macro Overlap</h1></div>
<div id="mw-content-text" lang="en" dir="ltr" class="mw-content-ltr"><div class="mw-parser-output"><table class="fcinfobox wikitable ct" width="100%" style="float: right; width: 230px; margin-left: 10px;">
<tr>
<td class="ctTitle">
<h3><span class="mw-headline" id="Boolean_Overlap"><a href="https://www.freecadweb.org/wiki/index.php?title=File:Macro_Overlap.png" class="image"><img alt="Macro Overlap.png" src="32px-Macro_Overlap.png" width="32" height="32" srcset="/wiki/images/thumb/a/ac/Macro_Overlap.png/48px-Macro_Overlap.png 1.5x, /wiki/images/thumb/a/ac/Macro_Overlap.png/64px-Macro_Overlap.png 2x" /></a> Boolean Overlap</span></h3>
</td></tr>
<tr>
<th class="ctOdd">Description
</th></tr>
<tr>
<td class="ctEven left macro-description">Boolean tool in between <a href="Part_Union.html" title="Part Union">Part Union</a> and <a href="Part_Common.html" title="Part Common">Part Common</a>. Parametric.
</td></tr>
<tr>
<th class="ctOdd">Author
</th></tr>
<tr>
<td class="ctEven macro-author"><a href="https://www.freecadweb.org/wiki/index.php?title=User:DeepSOIC" title="User:DeepSOIC">DeepSOIC</a>
</td></tr>
<tr>
<th class="ctOdd">Links
</th></tr>
<tr>
<td class="ctEven"><a href="Macros_recipes.html" title="Macros recipes">Macros recipes</a><br /><a href="How_to_install_macros.html" title="How to install macros">How to install macros</a><br /><a href="Customize_Toolbars.html" title="Customize Toolbars">How to customize toolbars</a>
</td></tr>
<tr>
<th class="ctOdd">Version
</th></tr>
<tr>
<td class="ctEven macro-version">0.1
</td></tr>
<tr>
<th class="ctOdd">Date last modification
</th></tr>
<tr>
<td class="ctEven macro-date">2016-10-12
</td></tr>
<tr>
<th class="ctOdd">
</th></tr>
<tr>
<td class="ctToc"><br /><div id="toc" class="toc"><div class="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1"><a href="#Boolean_Overlap"><span class="tocnumber">1</span> <span class="toctext">Boolean Overlap</span></a></li>
<li class="toclevel-1 tocsection-1"><a href="#Installation:"><span class="tocnumber">2</span> <span class="toctext">Installation:</span></a></li>
<li class="toclevel-1 tocsection-2"><a href="#How_to_use:"><span class="tocnumber">3</span> <span class="toctext">How to use:</span></a></li>
</ul>
</div>
</td></tr>
</table><a href="https://www.freecadweb.org/wiki/index.php?title=File:Macro_Boolean_Overlap_Screenshot.png" class="image"><img alt="Macro Boolean Overlap Screenshot.png" src="1000px-Macro_Boolean_Overlap_Screenshot.png" width="1000" height="470" srcset="/wiki/images/8/87/Macro_Boolean_Overlap_Screenshot.png 1.5x" /></a>
<p><br />
Boolean Overlap constructs a shape that covers the space occupied by no less than 'OverlapIndex' shapes. 'OverlapIndex' is a property that can be modified. Value of 1 gives the result equivalent to Part Union. Value equal to number of shapes makes the tool equivalent to Part Common. Default value is 2, meaning the result will fill space where there is any overlap.
</p><p>Requires FreeCAD v0.17+ built against OCC no less than 6.9.0 (tested on 7.0.0).
</p>
<h2><span class="mw-headline" id="Installation:">Installation:</span></h2>
<p>download these two files and save them in macro directory:
</p><p><a rel="nofollow" class="external free" href="https://github.com/DeepSOIC/FreeCAD-Macros/raw/master/Overlap/Overlap.FCMacro">https://github.com/DeepSOIC/FreeCAD-Macros/raw/master/Overlap/Overlap.FCMacro</a>
</p><p><a rel="nofollow" class="external free" href="https://github.com/DeepSOIC/FreeCAD-Macros/raw/master/Overlap/MacroOverlap.py">https://github.com/DeepSOIC/FreeCAD-Macros/raw/master/Overlap/MacroOverlap.py</a>
</p>
<h2><span class="mw-headline" id="How_to_use:">How to use:</span></h2>
<ol><li> Select three* or more shapes to compute overlap between. You can also select a single compound containing the argument shapes.</li>
<li> In FreeCAD menu: Macro -&gt; Macros... -&gt; double-click Overlap.FCMacro . A new object will be created.</li>
<li> Select the new object, and modify 'Overlap Index' property in property editor (Data tab), if necessary.</li></ol>
<ul><li> two shapes will do, too, but the action of tool will be equivalent to either Part Common or Part Fuse, and so it is recommended to use Part tools instead.</li></ul>
<p><br />
</p>
<div style="clear:both"></div>
<p><br />
MacroOverlap.py:
</p>
<pre>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)) &gt;= 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' &#160;: ":/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) &lt; 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_() </pre>
<p>Overlap.FCMacro:
</p>
<pre>__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&amp;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() </pre>
</div>
</div>
</div><div class="printfooter">
Online version: "<a dir="ltr" href="https://www.freecadweb.org/wiki/index.php?title=Macro_Overlap&amp;oldid=240892">http://www.freecadweb.org/wiki/index.php?title=Macro_Overlap&amp;oldid=240892</a>"</div>
<div id="catlinks" class="catlinks" data-mw="interface"></div><div class="visualClear"></div>
</div>
</div>
<div id="mw-navigation">
<h2>Navigation menu</h2>
</body></html>