Description |
---|
Cette macro permet de réaliser des découpes pour les boîtiers de manière très pratique. Cette macro doit être mise à jour |
Auteur |
maurice |
Téléchargement |
Icône de la barre d'outils |
Liens |
Page des macros Comment installer une macro Comment créer une barre d'outils |
Version Macro |
0.25 |
Dernière modification |
2016-11-26 |
Version(s) FreeCAD |
0.16 |
Raccourci clavier |
None |
Voir aussi |
None |
Cette macro crée un logement d'un objet sur un support de façon très aisée
Ici une démonstration avec Arduino Uno enclosure
Vous devez juste sélectionner la face qui servira de support et l'objet à encastrer la macro s'occupe de créer le logement avec un espace de 0.5 mm (programmé dans la macro)
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")