Macro Chevauchement

From FreeCAD Documentation
Revision as of 08:35, 13 October 2016 by Mario52 (talk | contribs) (Created page with "==Utilisation:== # Sélectionnez trois ou plus d'objets pour créer un objet superposé. Vous pouvez aussi sélectionner un composé contenant plusieurs shapes. # Dans le men...")

File:Macro Overlap Boolean Overlap

Description
Boolean tool in between Part Union and Part Common. Parametric.

Version macro : 0.1
Auteur: DeepSOIC
Auteur
DeepSOIC
Téléchargement
None
Liens
Version Macro
0.1
Dernière modification
None
Version(s) FreeCAD
None
Raccourci clavier
None
Voir aussi
None


Boolean Overlap construit une forme qui couvre l'espace occupé par des formes superposées. 'OverlapIndex' est une propriété qui peut être modifié. La valeur 1 donne le même résultat que Part Union. Une valeur égale au nombre de formes rend les parties communes. La valeur par défaut est 2, ce qui signifie que le résultat va utiliser l'espace où il y a chevauchement.

Require FreeCAD v0.17+ built against OCC no less than 6.9.0 (tested on 7.0.0).

Installation:

téléchargez les deux macros et sauvez les dans votre répertoires de macros:

https://github.com/DeepSOIC/FreeCAD-Macros/raw/master/Overlap/Overlap.FCMacro

https://github.com/DeepSOIC/FreeCAD-Macros/raw/master/Overlap/MacroOverlap.py

Utilisation:

  1. Sélectionnez trois ou plus d'objets pour créer un objet superposé. Vous pouvez aussi sélectionner un composé contenant plusieurs shapes.
  2. Dans le menu: Macro -> Macros... -> double-cliquez sur Overlap.FCMacro . Un nouveau objet est créé.
  3. Sélectionnez le nouvel objet, et modifiez les propriétés de 'Overlap Index' dans les Propriétés onglet (Data), si nécessaire.
  • 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.


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.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 = Part.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()
Other languages: