Skip to content

Latest commit

 

History

History
264 lines (222 loc) · 11 KB

Macro_Easy_cutouts_for_Enclosure_Design.md

File metadata and controls

264 lines (222 loc) · 11 KB

Macro Easy cutouts for Enclosure Design

{{Macro |Name=Easy cutouts for Enclosure Design |Icon=Macro_Easy_cutouts_for_Enclosure_Design_icon.png |Description=This macro makes Cutouts for Enclosures in a very handy way. Just select a face of the object that is the base for the cutout and the macro will create a clone of the external outline with a margin of 0.5mm (set in the macro)
{{ColoredText|#ff0000|This macro needs to be upgraded}} |Author=maurice |Version=0.25 |Date=2016-11-26 |FCVersion=0.16 |Download=[https://www.freecadweb.org/wiki/images/7/71/Macro_Easy_cutouts_for_Enclosure_Design_icon.png ToolBar Icon] }}

Description

This macro makes Cutouts for Enclosures in a very handy way

Just select a face of the object that is the base for the cutout and the macro will create a clone of the external outline with a margin of 0.5mm (set in the macro)

*Here a demo with an Arduino Uno enclosure*

Usage

Just select a face of the object that is the base for the cutout and the macro will create a clone of the external outline with a margin of 0.5mm (set in the macro)

Script

The Icon for you ToolBar

Macro_Easy_cutouts_for_Enclosure_Design.FCMacro

{{MacroCode|code=

-- coding: utf-8 --

clone, enlarge & center clone-obj to selected obj

title = "Clone-Enlarge-Center Face for cutouts" author = "maurice" url = "kicad stepup" version = "0.25" date = "11.2016"

import FreeCAD, FreeCADGui, Draft, Part, DraftTools from FreeCAD import Base

def say(msg): FreeCAD.Console.PrintMessage(msg) FreeCAD.Console.PrintMessage('\n')

def sayw(msg): FreeCAD.Console.PrintWarning(msg) FreeCAD.Console.PrintWarning('\n')

def getNormal(self): return self.Object.Shape.Faces[0].normalAt(0,0)

#Init
if Gui.ActiveDocument <> None: #say (Gui.ActiveDocument)

cx = 1  # center x -> 1  
cy = 1  # center y -> 1 
cz = 1  # center z -> 1 # scaleX = 1.1 # scale factor for Clone
# scaleY = 1.1 # scale factor for Clone
# scaleZ = 1.1 # scale factor for Clonemargin = 0.5 #margin in mm
extrudeLenght = 10 #10mm    
#selEx = FreeCADGui.Selection.getSelectionEx()
sel = FreeCADGui.Selection.getSelection()#print sel[0].Label
#objs = [selobj.Object for selobj in selEx]
selF = FreeCADGui.Selection.getSelectionEx()#if len(Gui.Selection.getSelectionEx()[0].SubElementNames) <1:
#    stopif len(sel) > 0:
    FreeCADGui.Selection.removeSelection(sel[0])
#for o in FreeCADGui.ActiveDocument.getObjects():
#    FreeCADGui.Selection.removeSelection(o.Name)
coords = []
j = 0
#if len(sel) == 1: # only 1 object selected
#if len(selF) == 1: # only 1 object selected
if len(sel) > 0:
    if len(selF[0].SubElementNames) ==1:
        f_names=[]
        f = Draft.makeFacebinder(selF)
        f1=App.ActiveDocument.getObject(f.Name)
        face=0
        try:
            norm = f1.Shape.Faces[0].normalAt(0,0)
            say (norm)
            face=1
        except:
            App.Console.PrintMessage("Select ONLY one single Face of object!"+"\n")
            # stop
        if face==1:
            l = Draft.downgrade(f,delete=False)
            k = 0; bbM = 0
            for o in l:
                for w in o:
                    #print w.Name
                    f_names.append (w.Name)
                    say(w.Name)
                    if "Facebinder" not in w.Name:
                        bb=w.Shape.BoundBox
                        bbX=float(bb.XLength)
                        bbY=float(bb.YLength)
                        bbZ=float(bb.ZLength)
                        say (str(bbX)+";"+str(bbY)+";"+str(bbZ))
                        if bbX > bbM:
                            bbM = bbX; m = k
                        if bbY > bbM:
                            bbM = bbY; m = k
                        if bbZ > bbM:
                            bbM = bbZ; m = k
                    k=k+1
            print f_names
            k = 0
            #f_names=[]
            for o in l:
                for w in o:
                    say(w.Name)
                    #f_names.append (w.Name)
                    if k!=m:
                        say ( "deleting "+f_names[k] )
                        FreeCAD.ActiveDocument.removeObject(f_names[k])
                    else:
                        FreeCADGui.ActiveDocument.getObject(f_names[k]).Visibility=False
                        f = FreeCAD.ActiveDocument.addObject('Part::Extrusion', 'Extrude_for_cut')
                        f = FreeCAD.ActiveDocument.getObject(f.Name)
                        f.Base = FreeCAD.ActiveDocument.getObject(f_names[k])
                        f.Dir = norm * extrudeLenght * -1
                        f.Solid = (True)
                        f.TaperAngle = (0)
                    k=k+1        
            #FreeCAD.ActiveDocument.removeObject(f_names[len(l)])
            say( f_names )
            say( f_names[m] )
            say( bbM )
            
            FreeCADGui.Selection.addSelection(FreeCAD.ActiveDocument.getObject(f.Name))
            FreeCAD.ActiveDocument.recompute()
            
            sel = FreeCADGui.Selection.getSelection()   
            #objs = [selobj.Object for selobj in selEx]
            
            coords = []
            j = 0
            s = sel[0].Shape
            
            bb=s.BoundBox
            
            bbX=float(bb.XLength)
            bbY=float(bb.YLength)
            bbZ=float(bb.ZLength)
            # boundBox
            boundBox_ = s.BoundBox
            
            a = str(boundBox_)
            a,b = a.split('(')
            c = b.split(',')
            oripl_X = float(c[0])
            oripl_Y = float(c[1])
            oripl_Z = float(c[2])
            coords.append ([oripl_X+bbX/2, oripl_Y+bbY/2, oripl_Z+bbZ/2])
            App.Console.PrintMessage(str(boundBox_)+"\r\n")
            App.Console.PrintMessage("BBox           : "+str(bbX)+" x "+str(bbY)+" x "+str(bbZ)+"\r\n")
            App.Console.PrintMessage("Base Pos       : "+str(oripl_X)+" x "+str(oripl_Y)+" x "+str(oripl_Z)+"\r\n")
            App.Console.PrintMessage("Center Pos     : "+str(oripl_X+bbX/2)+" x "+str(oripl_Y+bbY/2)+" x "+str(oripl_Z+bbZ/2)+"\r\n")
            App.Console.PrintMessage("Coords         : "+str(coords[j])+"\r\n")
        
            #objC = FreeCAD.ActiveDocument.addObject('Part::AttachableObjectPython', 'Clone_for_cut')
            #objC = FreeCAD.ActiveDocument.getObject(objC.Name)
            objC=Draft.clone(sel)
            if bbX!=0:
                scaleX = (bbX + 2*margin) / bbX
            else:
                scaleX = 1
            if bbY!=0:
                scaleY = (bbY + 2*margin) / bbY
            else:
                scaleY = 1
            if bbZ!=0:
                scaleZ = (bbZ + 2*margin) / bbZ
            else:
                scaleZ = 1
            objC.Scale = (scaleX,scaleY,scaleZ)
            #Draft.scale(objC,delta=App.Vector(scaleX,scaleY,scaleZ),center=App.Vector(0,0,0),copy=True,legacy=True)
            
            oL = sel[0].Label + "_enlarged"
            objC.Label = oL
            FreeCADGui.Selection.addSelection(objC)
            
            FreeCAD.ActiveDocument.recompute()
        
            selEx = FreeCADGui.Selection.getSelectionEx()
            objs = [selobj.Object for selobj in selEx]
            coords = []
            j = 0
            if len(objs) >= 1:
                for obj in objs:
                    #s = objs[0].Shape
                    s = obj.Shape
                    
                    # boundBox
                    boundBox_ = s.BoundBox
                    boundBoxLX = boundBox_.XLength
                    boundBoxLY = boundBox_.YLength
                    boundBoxLZ = boundBox_.ZLength
                    
                    a = str(boundBox_)
                    a,b = a.split('(')
                    c = b.split(',')
                    oripl_X = float(c[0])
                    oripl_Y = float(c[1])
                    oripl_Z = float(c[2])
                    coords.append ([oripl_X+boundBox_.XLength/2, oripl_Y+boundBox_.YLength/2, oripl_Z+boundBox_.ZLength/2])
                    App.Console.PrintMessage(str(boundBox_)+"\r\n")
                    App.Console.PrintMessage("BBox           : "+str(boundBox_.XLength)+" x "+str(boundBox_.YLength)+" x "+str(boundBox_.ZLength)+"\r\n")
                    App.Console.PrintMessage("Base Pos       : "+str(oripl_X)+" x "+str(oripl_Y)+" x "+str(oripl_Z)+"\r\n")
                    App.Console.PrintMessage("Center Pos     : "+str(oripl_X+boundBox_.XLength/2)+" x "+str(oripl_Y+boundBox_.YLength/2)+" x "+str(oripl_Z+boundBox_.ZLength/2)+"\r\n")
                    App.Console.PrintMessage("Coords         : "+str(coords[j])+"\r\n")
                    if j>0:
                        if cx==1:
                            coordNx=coords[0][0]-coords[j][0]
                        else:
                            coordNx=0
                        if cy==1:
                            coordNy=coords[0][1]-coords[j][1]
                        else:
                            coordNy=0
                        if cz==1:
                            coordNz=coords[0][2]-coords[j][2]
                        else:
                            coordNz=0
                        obj.Placement.move(App.Vector(coordNx,coordNy,coordNz))
                        App.Console.PrintMessage("Moved     : "+str(coordNx)+" "+str(coordNy)+" "+str(coordNz)+"\r\n")
                    j=j+1
                
                    App.Console.PrintMessage("_____________________"+"\r\n")
                    
                FreeCADGui.Selection.removeSelection(objs[0])
                FreeCADGui.ActiveDocument.getObject(objs[0].Name).Visibility=False
                FreeCADGui.ActiveDocument.getObject(objs[1].Name).Transparency=70
                App.ActiveDocument.recompute() 
        
    else:
        App.Console.PrintMessage("Select ONLY one single Face of object!"+"\n")
else:
    App.Console.PrintMessage("Select ONLY one single Face of object!"+"\n")

else: sayw("no document to work with")
#http://forum.freecadweb.org/viewtopic.php?t=4625

}}

Link

Forum : Easy cutouts for Enclosure Design Macro


documentation index > Macro Easy cutouts for Enclosure Design