Macro Easy cutouts for Enclosure Design/fr

Easy cutouts for Enclosure Design

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

Version macro : 0.25
Date dernière modification : 2016-11-26
Version FreeCAD : 0.16
Téléchargement : Icône de la barre d'outils
Auteur: maurice

Auteur
maurice
Téléchargement
Icône de la barre d'outils
Liens
Version Macro
0.25
Dernière modification
2016-11-26
Version(s) FreeCAD
0.16
Raccourci clavier
None
Voir aussi
None

Description

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

Utilisation

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)

Script

Icône de la barre d'outils

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")

Link