Makro Einfache Ausschnitte für Gehäusedesign
Appearance
| 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 |
Beschreibung
Dieses Makro erstellt Ausschnitte für Gehäuse auf sehr praktische Weise
Hier eine Demo mit einem Arduino Uno-Gehäuse
Anwendung
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).
Skript
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__ = 'CC-BY-3.0'
__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")