Macro Aperture

From FreeCAD Documentation
Revision as of 10:17, 23 May 2020 by FuzzyBot (talk | contribs) (Updating to match new version of source page)
Other languages:

Aperture

Descrizione
Permette di creare delle aperture nei contenitori in un modo molto pratico
This macro needs to be upgraded

Versione macro: 0.25
Ultima modifica: 2016-11-26
Versione FreeCAD: 0.16
Download: ToolBar Icon
Autore: maurice
Autore
maurice
Download
ToolBar Icon
Link
Versione macro
0.25
Data ultima modifica
2016-11-26
Versioni di FreeCAD
0.16
Scorciatoia
Nessuna
Vedere anche
Nessuno

Descrizione

Permette di creare delle aperture nei contenitori in un modo molto pratico

Basta selezionare una faccia dell'oggetto di base del ritaglio e la macro crea un clone del suo contorno esterno con un margine di 0,5 millimetri (impostato nella macro)

qui una demo con un contenitore Arduino Uno

Uso

Selezionare una faccia dell'oggetto di base del ritaglio e la macro crea un clone del suo contorno esterno con un margine di 0,5 millimetri (impostato nella macro)

Script

L'icona per la barra degli strumenti


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

Nel forum : Easy cutouts for Enclosure Design Macro