| Beschreibung |
|---|
| Dieses Makro erstellt Ausschnitte für Gehäuse auf sehr praktische Weise. Versionsmakro : 0.26 Datum der letzten Änderung : 2025.08 FreeCAD version : 0.16 Herunterladen : Werkzeugleisten-Symbol Autor: maurice |
| Autor |
| maurice |
| Herunterladen |
| Werkzeugleisten-Symbol |
| Links |
| Makros Rezepte Wie man Makros installiert Symbolleisten anpassen |
| Macro-Version |
| 0.26 |
| Datum der letzten Änderung |
| 2025.08 |
| FreeCAD-Version(s) |
| 0.16 |
| Standardverknüpfung |
| None |
| Siehe auch |
| None |
Dieses Makro erstellt Ausschnitte für Gehäuse auf sehr praktische Weise
Hier eine Demo mit einem Arduino Uno-Gehäuse
Wähle eine Fläche des Objekts aus, die als Grundlage für den Ausschnitt dient, und das Makro erstellt einen Klon der Außenkontur mit einem Rand von 0,5 mm (im Makro festgelegt).
Macro_Easy_cutouts_for_Enclosure_Design.FCMacro
# -*- coding: utf-8 -*-
#
__Name__ = 'Easy cutouts for Enclosure Design'
__Comment__ = 'This macro makes Cutouts for Enclosures in a very handy way.'
__Author__ = 'easyyw-fc'
__Date__ = '08.2025'
__Version__ = '0.26'
__License__ = ''
__Web__ = ''
__Wiki__ = 'https://wiki.freecad.org/Macro_Easy_cutouts_for_Enclosure_Design'
__Status__ = 'original 11.2016, updated 08.2025 by drmacro'
__Communication__ = 'https://forum.freecad.org/viewtopic.php?t=4625'
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:
#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:# -*- coding: utf-8 -*-
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[0].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")