Initial import
This commit is contained in:
commit
f7f20ae656
1 changed files with 52 additions and 0 deletions
52
create-bom/CreateBOM.FCMacro.py
Normal file
52
create-bom/CreateBOM.FCMacro.py
Normal file
|
@ -0,0 +1,52 @@
|
|||
##
|
||||
## CreateBOM: A Macro for FreeCAD
|
||||
##
|
||||
## The goal of this macro is to generate a Bill of Materials (BOM)
|
||||
## from the active FreeCAD document.
|
||||
##
|
||||
# Build BOM from document objects
|
||||
doc = FreeCAD.ActiveDocument
|
||||
objects = doc.Objects
|
||||
# variant: FreeCADGui.Selection.getSelection()
|
||||
|
||||
# Get spreadsheet with name BOM
|
||||
boms = App.activeDocument().getObjectsByLabel("BOM")
|
||||
filtered = list(filter(lambda obj: obj.TypeId == "Spreadsheet::Sheet", boms))
|
||||
if len(filtered) > 0:
|
||||
bom = filtered[0]
|
||||
else:
|
||||
bom = App.activeDocument().addObject('Spreadsheet::Sheet','BOM')
|
||||
|
||||
# clean and set titles
|
||||
bom.clearAll()
|
||||
bom.set("A1", "Name")
|
||||
bom.set("B1", "Length (cm)")
|
||||
bom.set("C1", "Width (cm)")
|
||||
bom.set("D1", "Height (cm)")
|
||||
|
||||
# fill with objects
|
||||
cell = 1
|
||||
for obj in objects:
|
||||
# Extract dimensions of the object, if available
|
||||
length = getattr(obj, "Length", 0)
|
||||
width= getattr(obj, "Width", 0)
|
||||
height = getattr(obj, "Height", 0)
|
||||
|
||||
# Sort dimensions in descending order
|
||||
values = sorted([length, width, height], reverse=True)
|
||||
length = values[0]
|
||||
width = values[1]
|
||||
height = values[2]
|
||||
|
||||
# Skip objects without dimensions
|
||||
if (length == 0) and (width == 0) and (height == 0):
|
||||
continue
|
||||
|
||||
# Write object details to the BOM spreadsheet
|
||||
cell = cell + 1
|
||||
bom.set("A" + str(cell), obj.Label)
|
||||
bom.set("B" + str(cell), str(length))
|
||||
bom.set("C" + str(cell), str(width))
|
||||
bom.set("D" + str(cell), str(height))
|
||||
|
||||
App.ActiveDocument.recompute()
|
Loading…
Reference in a new issue