Macro Easy cutouts for Enclosure Design: Difference between revisions

From FreeCAD Documentation
No edit summary
(Use {{MacroCode}})
 
(17 intermediate revisions by 5 users not shown)
Line 1: Line 1:
<languages/>
{{Macro|Icon=Macro_Easy_cutouts_for_Enclosures|Name=Easy cutouts for Enclosure Design|Description=This macro makes Cutouts for Enclosures in a very handy way|Author=maurice|Version=0.27 (11.2016)}}
<translate>
==Description==
<!--T:1-->
{{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)<br/>{{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== <!--T:2-->
This macro makes Cutouts for Enclosures in a very handy way
This macro makes Cutouts for Enclosures in a very handy way

<br />
<!--T:7-->
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)
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)
{{clear}}
[[File:easy-cutouts.gif ]]
{{clear}}


<!--T:8-->
==Use==
[[File:easy-cutouts.gif|1000px]]
{{Caption|Here a demo with an Arduino Uno enclosure}}

==Usage== <!--T:3-->
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)
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==
==Script== <!--T:4-->
The Icon for you ToolBar [[File:Macro_Easy_cutouts_for_Enclosure_Design_icon.png]]


</translate>
The Icon for you ToolBar [[File:Macro_Easy_Cutouts_for_Enclosures.png]]


'''Macro_Easy_cutouts_for_Enclosure_Design.FCMacro'''
Macro_Center Faces of Parts.FCMacro


{{Code|code=
{{MacroCode|code=
# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
# clone, enlarge & center clone-obj to selected obj

# evolution of Macro_CenterFace
# and some part of Macro WorkFeature
#
# center objs faces/closed_edges to first obj face/closed_edge
#
#
__title__ = "Center Faces of Parts"
__title__ = "Clone-Enlarge-Center Face for cutouts"
__author__ = "maurice"
__author__ = "maurice"
__url__ = "kicad stepup"
__url__ = "kicad stepup"
__version__ = "0.27"
__version__ = "0.25"
__date__ = "11.2016"
__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 Clone
margin = 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:
# stop
if 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


}}
}}


<translate>
==Link==


==Link== <!--T:6-->
Forum : [http://forum.freecadweb.org/viewtopic.php?f=22&t=18488 Easy cutouts for Enclosure Design Macro]
Forum : [http://forum.freecadweb.org/viewtopic.php?f=22&t=18488 Easy cutouts for Enclosure Design Macro]

</translate>
{{clear}}

Latest revision as of 01:14, 8 May 2020

Other languages:

Easy cutouts for Enclosure Design

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)
This macro needs to be upgraded

Macro version: 0.25
Last modified: 2016-11-26
FreeCAD version: 0.16
Download: ToolBar Icon
Author: maurice
Author
maurice
Download
ToolBar Icon
Links
Macro Version
0.25
Date last modified
2016-11-26
FreeCAD Version(s)
0.16
Default shortcut
None
See also
None

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

# -*- 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 Clone
    
    margin = 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:
    #    stop
    
    if 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