NOTE: FreeCAD versions tested: 0.19 and 0.20.
At line 298 I copy the templateobject
Code: Select all
usb = App.getDocument(documentName).copyObject( App.getDocument(documentName).SHAPE_USB, "USBs" )
At line 339 I try to reference USBs but that fails. It turns out 'usb' is referenced by name="SHAPE_USB001", and label="USBs". The next commented line is a substitute, but it's clumsy.
Code: Select all
App.getDocument(documentName).addObject("Part::Cut","tray003")
App.getDocument(documentName).tray003.Base = App.getDocument(documentName).tray002
[b] App.getDocument(documentName).tray002.Tool = App.getDocument(documentName).USBs[/b]
#App.getDocument(documentName).tray003.Tool = App.getDocument(documentName).getObjectsByLabel("USBs")[0]
#In the case of only one instance of USB, the name was already created during copyObject and cannot be changed. So using label
The script generates a tray with slots for an SD, SDmini, and USB adapters. I've tried attaching as well but there's an error. It only wants FCStd and screenshots as attachments.
Cheers,
GROG
The full python code:
Code: Select all
#### INSTRUCTIONS #############################################################
# 1. open me as a file from within FreeCAD
# 2. set desired rows and columns
# 3. run me by clicking the play icon
#
# RESOURCES:
# http://free-cad.sourceforge.net/SrcDocu/d8/d3e/classApp_1_1Document.html
#
#### VARIABLES ################################################################
freecadFolder="D:/Program Files/FreeCAD 0.19/bin"
documentName='sd_scripted4'
gap='0.20'
space_x='3.00'
space_y='9.00'
floor='.50'
wall='2.40'
micro_x='0.8'
micro_y='11.0'
micro_z='13.0'
sd_x='2.1'
sd_y='24.0'
sd_z='32.0'
usb_x='4.5'
usb_y='12.0'
usb_z=micro_z
rows='2.'
micro_cols='6.'
sd_cols='6.'
usb_cols='1.'
base_x= '=2*wall + (micro_cols*(micro_x + 2*gap )+(micro_cols-1)*space_x+space_x) + (sd_cols*(sd_x+2*gap)+(sd_cols-1)*space_x+space_x) + (usb_cols*(usb_x+2*gap)+(usb_cols-1)*space_x)'
base_y= '=2*wall + rows*(micro_y + 2*gap) + (rows-1) * space_y'
base_z= '=micro_z + floor'
#### IMPORT MODULES ############################################################
import PySide
from PySide import QtGui ,QtCore
from PySide.QtGui import *
from PySide.QtCore import *
import FreeCAD
import Draft
import FreeCADGui
import math
import sys
#### FUNCTIONS ################################################################
from PySide import QtGui
from PySide.QtCore import *
mw=Gui.getMainWindow()
c=mw.findChild(QtGui.QPlainTextEdit, "Python console")
c.clear()
r=mw.findChild(QtGui.QTextEdit, "Report view")
r.clear()
def clear_views():
#Clear Report View and Python Console. Cleans up old run information
mw=Gui.getMainWindow()
c=mw.findChild(QtGui.QPlainTextEdit, "Python console")
c.clear()
r=mw.findChild(QtGui.QTextEdit, "Report view")
r.clear()
def setup_environment(freecadFolder,documentName):
# add folder containing FreeCAD.pyd, FreeCADGui.pyd to sys.path
sys.path.append(freecadFolder) # example for Windows
doc = App.newDocument(documentName)
#App.setActiveDocument(documentName)
#App.ActiveDocument=App.getDocument(documentName)
#Gui.ActiveDocument=Gui.getDocument(documentName)
#Gui.activeDocument().activeView().viewDefaultOrientation()
App.getDocument(documentName).recompute() # updates GUI
return(doc)
def set_spreadsheet():
Gui.activateWorkbench("SpreadsheetWorkbench")
App.activeDocument().addObject('Spreadsheet::Sheet','s1')
#Unit Dimensions
cell = 1
App.getDocument(documentName).s1.set( 'A'+str(cell), 'gap')
App.getDocument(documentName).s1.set( 'B'+str(cell), gap)
App.getDocument(documentName).s1.setAlias('B'+str(cell), 'gap')
cell+=1
App.getDocument(documentName).s1.set( 'A'+str(cell), 'floor')
App.getDocument(documentName).s1.set( 'B'+str(cell), floor)
App.getDocument(documentName).s1.setAlias('B'+str(cell), 'floor')
cell+=1
App.getDocument(documentName).s1.set( 'A'+str(cell), 'wall')
App.getDocument(documentName).s1.set( 'B'+str(cell), wall)
App.getDocument(documentName).s1.setAlias('B'+str(cell), 'wall')
cell+=1
App.getDocument(documentName).s1.set( 'A'+str(cell),'space_x')
App.getDocument(documentName).s1.set( 'B'+str(cell), space_x)
App.getDocument(documentName).s1.setAlias('B'+str(cell),'space_x')
cell+=1
App.getDocument(documentName).s1.set( 'A'+str(cell),'space_y')
App.getDocument(documentName).s1.set( 'B'+str(cell), space_y)
App.getDocument(documentName).s1.setAlias('B'+str(cell),'space_y')
cell+=1
App.getDocument(documentName).s1.set( 'A'+str(cell), 'rows')
App.getDocument(documentName).s1.set( 'B'+str(cell), rows)
App.getDocument(documentName).s1.setAlias('B'+str(cell), 'rows')
cell+=1
App.getDocument(documentName).s1.set( 'A'+str(cell), 'micro_cols')
App.getDocument(documentName).s1.set( 'B'+str(cell), micro_cols)
App.getDocument(documentName).s1.setAlias('B'+str(cell), 'micro_cols')
cell+=1
App.getDocument(documentName).s1.set( 'A'+str(cell), 'sd_cols')
App.getDocument(documentName).s1.set( 'B'+str(cell), sd_cols)
App.getDocument(documentName).s1.setAlias('B'+str(cell), 'sd_cols')
cell+=1
App.getDocument(documentName).s1.set( 'A'+str(cell), 'usb_cols')
App.getDocument(documentName).s1.set( 'B'+str(cell), usb_cols)
App.getDocument(documentName).s1.setAlias('B'+str(cell), 'usb_cols')
#Rectangular Dimensions
#Set column names
cell+=1
cell+=1
App.getDocument(documentName).s1.set( 'B'+str(cell), 'x')
App.getDocument(documentName).s1.set( 'C'+str(cell), 'y')
App.getDocument(documentName).s1.set( 'D'+str(cell), 'z')
App.getDocument(documentName).s1.set( 'E'+str(cell), 'dx')
App.getDocument(documentName).s1.set( 'F'+str(cell), 'dy')
App.getDocument(documentName).s1.set( 'G'+str(cell), 'dz')
#The base
cell+=1
App.getDocument(documentName).s1.set( 'A'+str(cell), 'base_')
App.getDocument(documentName).s1.set( 'B'+str(cell), base_x)
App.getDocument(documentName).s1.setAlias('B'+str(cell),'base_x')
App.getDocument(documentName).s1.set( 'C'+str(cell), base_y)
App.getDocument(documentName).s1.setAlias('C'+str(cell),'base_y')
App.getDocument(documentName).s1.set( 'D'+str(cell), base_z)
App.getDocument(documentName).s1.setAlias('D'+str(cell),'base_z')
#micro SD card
cell+=1
App.getDocument(documentName).s1.set( 'A'+str(cell), 'micro_')
App.getDocument(documentName).s1.set( 'B'+str(cell), micro_x )
App.getDocument(documentName).s1.setAlias('B'+str(cell),'micro_x')
App.getDocument(documentName).s1.set( 'C'+str(cell), micro_y )
App.getDocument(documentName).s1.setAlias('C'+str(cell),'micro_y')
App.getDocument(documentName).s1.set( 'D'+str(cell), micro_z )
App.getDocument(documentName).s1.setAlias('D'+str(cell),'micro_z')
App.getDocument(documentName).s1.set( 'G'+str(cell), floor )
App.getDocument(documentName).s1.setAlias('G'+str(cell),'micro_dz')
#SD_
cell+=1
App.getDocument(documentName).s1.set( 'A'+str(cell), 'sd_')
App.getDocument(documentName).s1.set( 'B'+str(cell), sd_x )
App.getDocument(documentName).s1.setAlias('B'+str(cell),'sd_x')
App.getDocument(documentName).s1.set( 'C'+str(cell), sd_y )
App.getDocument(documentName).s1.setAlias('C'+str(cell),'sd_y')
App.getDocument(documentName).s1.set( 'D'+str(cell), sd_z )
App.getDocument(documentName).s1.setAlias('D'+str(cell),'sd_z')
App.getDocument(documentName).s1.set( 'G'+str(cell), floor )
App.getDocument(documentName).s1.setAlias('G'+str(cell),'sd_dy')
App.getDocument(documentName).s1.set( 'G'+str(cell), floor )
App.getDocument(documentName).s1.setAlias('G'+str(cell),'sd_dz')
#USB
cell+=1
App.getDocument(documentName).s1.set( 'A'+str(cell), 'usb_')
App.getDocument(documentName).s1.set( 'B'+str(cell), usb_x )
App.getDocument(documentName).s1.setAlias('B'+str(cell),'usb_x')
App.getDocument(documentName).s1.set( 'C'+str(cell), usb_y )
App.getDocument(documentName).s1.setAlias('C'+str(cell),'usb_y')
App.getDocument(documentName).s1.set( 'D'+str(cell), usb_z )
App.getDocument(documentName).s1.setAlias('D'+str(cell),'usb_z')
App.getDocument(documentName).s1.set( 'G'+str(cell), floor )
App.getDocument(documentName).s1.setAlias('G'+str(cell),'usb_dz')
#Circular dimensions
cell+=1
cell+=1
App.getDocument(documentName).s1.set( 'B'+str(cell), 'd')
App.getDocument(documentName).s1.set( 'C'+str(cell), 'r')
App.getDocument(documentName).s1.set( 'D'+str(cell), 'h')
App.getDocument(documentName).s1.set( 'E'+str(cell), 'dx')
App.getDocument(documentName).s1.set( 'F'+str(cell), 'dy')
App.getDocument(documentName).s1.set( 'G'+str(cell), 'dz')
App.getDocument(documentName).recompute() # updates GUI
def draw_base():
print("draw_base()")
App.getDocument(documentName).addObject("Part::Box","Base")
App.getDocument(documentName).ActiveObject.Label = "Base" # Give it a name
App.getDocument(documentName).getObject("Base").setExpression('Length', u's1.base_x')
App.getDocument(documentName).getObject("Base").setExpression('Width', u's1.base_y')
App.getDocument(documentName).getObject("Base").setExpression('Height', u's1.base_z')
Gui.ActiveDocument.ActiveView.viewIsometric()
Gui.ActiveDocument.ActiveView.getViewDirection()
Gui.SendMsgToActiveView("ViewSelection")
Gui.SendMsgToActiveView("ViewFit")
App.getDocument(documentName).recompute() # updates GUI
##### Make a grid of rounds #################################################
def draw_shape_object_micro():
#Gui.ActivateWorkbench("PartWorkbench")
print("draw_shape_object_micro()")
App.getDocument(documentName).addObject("Part::Box","SHAPE_MICRO")
App.getDocument(documentName).ActiveObject.Label = "SHAPE_MICRO" # Give it a name
App.getDocument(documentName).getObject("SHAPE_MICRO").setExpression('Length', u's1.micro_x + s1.gap * 2')
App.getDocument(documentName).getObject("SHAPE_MICRO").setExpression('Width', u's1.micro_y + s1.gap * 2')
App.getDocument(documentName).getObject("SHAPE_MICRO").setExpression('Height', u's1.micro_z')
App.getDocument(documentName).recompute() # updates GUI
# Hide micro template shape
App.getDocument(documentName).getObject("SHAPE_MICRO").ViewObject.Visibility = False
def draw_shape_object_sd():
#Gui.ActivateWorkbench("PartWorkbench")
print("draw_shape_object_sd()")
App.getDocument(documentName).addObject("Part::Box","SHAPE_SD")
App.getDocument(documentName).ActiveObject.Label = "SHAPE_SD" # Give it a name
App.getDocument(documentName).getObject("SHAPE_SD").setExpression('Length', u's1.sd_x + s1.gap * 2')
App.getDocument(documentName).getObject("SHAPE_SD").setExpression('Width', u's1.sd_y + s1.gap * 2')
App.getDocument(documentName).getObject("SHAPE_SD").setExpression('Height', u's1.sd_z')
App.getDocument(documentName).recompute() # updates GUI
# Hide micro template shape
App.getDocument(documentName).getObject("SHAPE_SD").ViewObject.Visibility = False
def draw_shape_object_usb():
#Gui.ActivateWorkbench("PartWorkbench")
print("draw_shape_object_usb()")
App.getDocument(documentName).addObject("Part::Box","SHAPE_USB")
App.getDocument(documentName).ActiveObject.Label = "SHAPE_USB" # Give it a name
App.getDocument(documentName).getObject("SHAPE_USB").setExpression('Length', u's1.usb_x + s1.gap * 2')
App.getDocument(documentName).getObject("SHAPE_USB").setExpression('Width', u's1.usb_y + s1.gap * 2')
App.getDocument(documentName).getObject("SHAPE_USB").setExpression('Height', u's1.usb_z')
App.getDocument(documentName).recompute() # updates GUI
#App.getDocument(documentName).getObject("SHAPE_USB").ViewObject.Visibility = False
# Hide micro template shape
def create_shape_matrix_micro():
# https://www.freecadweb.org/wiki/Draft_PointArray
print("create_shape_matrix_micro()")
merge = FreeCADGui.Selection.getSelection()
App.getDocument(documentName).recompute()
#These Commented lines get numerical values from expressions
#micro_x = App.getDocument(documentName).s1.get("micro_x")
#micro_y = App.getDocument(documentName).s1.get("micro_y")
#micro_z = App.getDocument(documentName).s1.get("micro_z")
#micro_dz= App.getDocument(documentName).s1.get("micro_dz")
#space_x = App.getDocument(documentName).s1.get('space_x')
#space_y = App.getDocument(documentName).s1.get('space_y')
#wall = App.getDocument(documentName).s1.get('wall')
#gap = App.getDocument(documentName).s1.get('gap')
rows = App.getDocument(documentName).s1.get('rows')
micro_cols = App.getDocument(documentName).s1.get('micro_cols')
for r in range ( 1 , math.floor(rows) + 1 ):
for c in range ( 1 , math.floor(micro_cols) + 1 ):
micro = App.getDocument(documentName).copyObject( App.getDocument(documentName).SHAPE_MICRO );
dxStr = ('s1.wall + (%s - 1) * (s1.micro_x + 2 * s1.gap + s1.space_x)' % c)
dyStr = ('s1.wall + (%s - 1) * (s1.micro_y + 2 * s1.gap + s1.space_y)' % r)
#This commented line will set placement but as fixed numbers, not expressions
#dx = wall + (c - 1) * (micro_x + 2 * gap + space_x);
#dy = wall + (r - 1) * (micro_y + 2 * gap + space_y);
#micro.Placement = App.Placement(App.Vector(dx,dy,micro_dz),App.Rotation(App.Vector(1,0,0),0));
micro.setExpression('.Placement.Base.x' , dxStr )
micro.setExpression('.Placement.Base.y' , dyStr )
micro.setExpression('.Placement.Base.z' , u's1.micro_dz' )
merge.append(micro)
App.getDocument(documentName).recompute()
App.getDocument(documentName).addObject("Part::MultiFuse","MICROs")
App.getDocument(documentName).MICROs.Shapes = merge
def create_shape_matrix_sd ():
print("create_shape_matrix_sd()")
merge = FreeCADGui.Selection.getSelection()
App.getDocument(documentName).recompute()
sd_cols = App.getDocument(documentName).s1.get('sd_cols')
for c in range ( 1 , math.floor(sd_cols) + 1 ):
sd = App.getDocument(documentName).copyObject( App.getDocument(documentName).SHAPE_SD );
dxStr = ('s1.wall + s1.micro_cols*(s1.micro_x + s1.space_x) + s1.space_x + (%s - 1) * (s1.sd_x + s1.space_x)' % c)
dyStr = ('(s1.base_y - s1.sd_y) / 2')
sd.setExpression('.Placement.Base.x' , dxStr )
sd.setExpression('.Placement.Base.y' , dyStr )
sd.setExpression('.Placement.Base.z' , u's1.sd_dz' )
merge.append(sd)
App.getDocument(documentName).recompute()
App.getDocument(documentName).addObject("Part::MultiFuse","SDs")
App.getDocument(documentName).SDs.Shapes = merge
return App.getDocument(documentName).SDs
def create_shape_matrix_usb ():
print("create_shape_matrix_usb()")
merge = FreeCADGui.Selection.getSelection()
App.getDocument(documentName).recompute()
usb_cols = App.getDocument(documentName).s1.get('usb_cols')
if (usb_cols == 1):
usb = App.getDocument(documentName).copyObject( App.getDocument(documentName).SHAPE_USB, "USBs" );
#usb.Name = "USBs" # nope, this property is read only
usb.Label = "USBs"
# Set Location
dxStr = ('s1.wall + (s1.micro_cols*(s1.micro_x+s1.space_x)+s1.space_x) + (s1.sd_cols*(s1.sd_x+s1.space_x)+s1.space_x)')
dyStr = ('(s1.base_y - s1.usb_y) / 2')
usb.setExpression('.Placement.Base.x' , dxStr )
usb.setExpression('.Placement.Base.y' , dyStr )
usb.setExpression('.Placement.Base.z' , u's1.sd_dz' )
App.getDocument(documentName).recompute() # updates GUI
App.getDocument(documentName).getObject("SHAPE_USB").ViewObject.Visibility = False
#App.getDocument(documentName).getObject("USBs").ViewObject.Visibility = True
else:
for c in range ( 1 , math.floor(usb_cols) + 1 ):
usb = App.getDocument(documentName).copyObject( App.getDocument(documentName).SHAPE_USB );
dxStr = ('s1.wall + (s1.micro_cols*(s1.micro_x+s1.space_x)+s1.space_x) + (s1.sd_cols*(s1.sd_x+s1.space_x)) + ((%s - 1) * (s1.usb_x+4))' % c)
dyStr = ('(s1.base_y - s1.usb_y) / 2')
print(dxStr)
usb.setExpression('.Placement.Base.x' , dxStr )
usb.setExpression('.Placement.Base.y' , dyStr )
usb.setExpression('.Placement.Base.z' , u's1.sd_dz' )
merge.append(usb)
App.getDocument(documentName).recompute()
App.getDocument(documentName).addObject("Part::MultiFuse","USBs")
App.getDocument(documentName).USBs.Shapes = merge
# return App.getDocument(documentName).USBs
#def create_base():
# print("create_base()")
# App.getDocument(documentName).tray001.Base = App.getDocument(documentName).Base
def cut_objects():
print("cut_objects()")
App.getDocument(documentName).addObject("Part::Cut","tray001")
App.getDocument(documentName).tray001.Base = App.getDocument(documentName).Base
App.getDocument(documentName).tray001.Tool = App.getDocument(documentName).MICROs
App.getDocument(documentName).addObject("Part::Cut","tray002")
App.getDocument(documentName).tray002.Base = App.getDocument(documentName).tray001
App.getDocument(documentName).tray002.Tool = App.getDocument(documentName).SDs
App.getDocument(documentName).addObject("Part::Cut","tray003")
App.getDocument(documentName).tray003.Base = App.getDocument(documentName).tray002
App.getDocument(documentName).tray002.Tool = App.getDocument(documentName).USBs
#App.getDocument(documentName).tray003.Tool = App.getDocument(documentName).getObjectsByLabel("USBs")[0]
#In the case of only one instance of USB, the name was already created during copyObject and cannot be changed. So using label
#### MAIN #########################################################
clear_views()
doc = setup_environment(freecadFolder,documentName)
set_spreadsheet()
draw_base()
draw_shape_object_micro()
draw_shape_object_sd()
draw_shape_object_usb()
create_shape_matrix_micro()
create_shape_matrix_sd()
create_shape_matrix_usb()
cut_objects()
App.getDocument(documentName).recompute() # updates GUI
Gui.ActiveDocument.ActiveView.viewIsometric()
#filename = documentName + '.FCStd'
#doc.saveCopy(filename)