Macro Cabinets32

Description
This macro creates Top/Bottom and sidewalls for a cabinet with System32 specification. The defaults in the Macro are for parts of manufacturer Hettich.

Use

 * Launch the macro and change length, height and width of your cabinet-board.
 * The Gui ask to drill one or two-hole connectors.
 * You can drill the hole board with holes in 32 mm distance.
 * You can drill holes for top/bottom boards of your cabinet.

Script
Cabinets32.FCMacro
 * 1) !/usr/bin/env python
 * 2) -*- coding: utf-8 -*-
 * 3) *   Copyright (c) 2015 Bruno Bueckmann reset12 at gmx.de                  *
 * 4) *                      http://home.bb-24.net                              *
 * 5) *   This program is free software; you can redistribute it and/or modify  *
 * 6) *   it under the terms of the GNU Lesser General Public License (LGPL)    *
 * 7) *   as published by the Free Software Foundation; either version 2 of     *
 * 8) *   the License, or (at your option) any later version.                   *
 * 9) *   for detail see the LICENCE text file.                                 *
 * 10) *   This program is distributed in the hope that it will be useful,       *
 * 11) *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 * 12) *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 * 13) *   GNU Library General Public License for more details.                  *
 * 14) *   You should have received a copy of the GNU Library General Public     *
 * 15) *   License along with this program; if not, write to the Free Software   *
 * 16) *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  *
 * 17) *   USA                                                                   *
 * 1) *   You should have received a copy of the GNU Library General Public     *
 * 2) *   License along with this program; if not, write to the Free Software   *
 * 3) *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  *
 * 4) *   USA                                                                   *


 * 1) Macro Begin: cabinets32.FCMacro ++++++++++++++++++++++++++++++++++++++++++++++
 * 2) This Macro generates holes and a groove for the side Base cabinet
 * 3) Top and Bottom Wall are OUTSIDE the side base
 * 4) like :

from __future__ import division

import FreeCAD as App import FreeCADGui as Gui from PySide import QtGui

debug = False # debugging on guiok = True  # flag for abort input
 * 1) GUI

width, ok = QtGui.QInputDialog.getDouble(   QtGui.QWidget, 'Thickness', 'Thickness of cabinet-side', 19, 0, 50, 2) if ok: length, ok = QtGui.QInputDialog.getDouble(       QtGui.QWidget, 'Depth', 'Depth of cabinet-side', 600, 0, 2000, 2) else: guiok = False

if ok and guiok: height, ok = QtGui.QInputDialog.getDouble(       QtGui.QWidget, 'Height', 'Height of cabinet-side', 2000, 0, 3000, 2) else: guiok = False

if ok and guiok: bradius, ok = QtGui.QInputDialog.getDouble(       QtGui.QWidget, 'Bradius', 'Radius of drill holes in cabinet-side',        2.5, 0, 50, 2) else: guiok = False

if ok: bdeep, ok = QtGui.QInputDialog.getDouble(       QtGui.QWidget, 'Bdeep', 'Depth of drill holes in cabinet-side',        12, 0, 50, 2) else: guiok = False

if ok: fdist, ok = QtGui.QInputDialog.getDouble(       QtGui.QWidget, 'Fdist', 'Distance to Front of cabinet-side',        37, 0, 50, 2) else: guiok = False

if ok: hole1, ok = QtGui.QInputDialog.getDouble(       QtGui.QWidget, 'Hole1',        'Distance first hole from top or bottom of cabinet-side', 10, 0, 50, 2) else: guiok = False

if ok: holedistance, ok = QtGui.QInputDialog.getDouble(       QtGui.QWidget, 'Holedistance',        'Distance from hole to hole (System 32)', 32, 1, 50, 2) else: guiok = False

if ok: groovethickness, ok = QtGui.QInputDialog.getDouble(       QtGui.QWidget, 'Groovethickness', 'Thickness of backpanel',        3, 1, 50, 2) else: guiok = False

if ok: groovedeep, ok = QtGui.QInputDialog.getDouble(       QtGui.QWidget, 'Groovedeep',        'Overlapping of backpanel in cabinet-side', 12, 1, 50, 2) else: guiok = False

if guiok: # VB 35 / 18 or VB 36 M /19 from Hettich connector, ok = QtGui.QInputDialog.getInt(       QtGui.QWidget, 'Connectortype',        'Zerohole(0) Singlehole(1) or Doublehole(2) Connector', 2, 0, 2, 1)

if ok: fillwithholes, ok = QtGui.QInputDialog.getItem(None,           "Fillwithholes",            "Fill Board with holes?",            ["no", "yes"],            editable=False) else: guiok = False

endhole = 9.5

if ok and guiok: endholes, ok = QtGui.QInputDialog.getItem(None,           "Endholes",            "Drill Holes on Top/Bottom vertical for Connectors",            ['no', 'yes'],            editable=False)

if ok and guiok and endholes == 'yes': endhole, ok = QtGui.QInputDialog.getDouble(       QtGui.QWidget, 'Endhole',        'Endhole distance from inner cabinet-side', 9.5, 1, 50, 2) if debug: App.Console.PrintMessage("ok?: {}\n".format(ok)) App.Console.PrintMessage("width = {}\n".format(width)) App.Console.PrintMessage("length = {}\n".format(length)) App.Console.PrintMessage("bradius = {}\n".format(bradius)) App.Console.PrintMessage("bdeep = {}\n".format(bdeep)) App.Console.PrintMessage("fdist = {}\n".format(fdist)) App.Console.PrintMessage("hole1 = {}\n".format(hole1)) App.Console.PrintMessage("holedistance = {}\n".format(holedistance)) App.Console.PrintMessage("groovethickness = {}\n".format(groovethickness)) App.Console.PrintMessage("groovedeep = {}\n".format(groovedeep)) App.Console.PrintMessage("connector = {}\n".format(connector)) App.Console.PrintMessage("fillwithholes = {}\n".format(fillwithholes)) App.Console.PrintMessage("endholes = {}\n".format(endholes)) App.Console.PrintMessage("endhole = {}\n".format(endhole)) App.Console.PrintMessage("guiok = {}\n".format(guiok))
 * 1) End GUI

if guiok: # width= 19	# thickness of korpus # length= 600	# width of korpus # height= 2000	# height of korpus #   # bradius = 2.5  	# Radius drill hole # bdeep = 12    	# deepness of drill hole # fdist = 37   	# Distance to Front # hole1 = 9.5	# Distance first hole from top or bottom of korpus # holedistance = 32 # System 32 # groovethickness = 3 # 3 mm backpanel # groovedeep = width-8 # deep of groovedeep if int(width) > 16: # First hole depends on specs for VB36 M / 19 for 19 mm boards from # Hettich. holetop = 9.5 # holedistance for screw of vb36 hole1 = 9.5 + 0.5 # distance hole 1 from end of board hole1r = 10 # radius first hole hole1d = 14 # deepness first hole hole2r = 5 # radius 2. hole hole2d = 10.5 # deepness 2. hole else: # First hole depends on specs for VB36 M / 16 for 16 mm boards from # Hettich. holetop = 9.5 # holedistance for screw of vb36 hole1 = 9.5 + 0.5 # distance hole 1 from end of board hole1r = 10 # radius first hole hole1d = 12.5 # deepness first hole hole2r = 5 # radius 2. hole hole2d = 10.5 # deepness 2. hole

if debug: App.Console.PrintMessage("hole1d = {}\n".format(hole1d))

# functions def cut(tool): global cutsnr global cuts # cuts objects defined in string cuts if debug: App.Console.PrintMessage("cuts = {}, cutsnr = {}\n".format( cuts, cutsnr)) data = 'App.activeDocument.addObject("Part::Cut","' + str(cuts.split(" ")[cutsnr + 1]) + '")' if debug: App.Console.PrintMessage(str(data) + "\n") exec(data) data = "App.activeDocument." + str(cuts.split(" ")[cutsnr + 1]) data = data + ".Base = App.activeDocument." + str(cuts.split(" ")[cutsnr]) if debug: App.Console.PrintMessage(str(data) + "\n") exec(data) data = "App.activeDocument." + str(cuts.split(" ")[cutsnr + 1]) data = data + ".Tool = App.activeDocument." + str(tool) if debug: App.Console.PrintMessage(str(data) + "\n") exec(data) cutsnr = cutsnr + 1 cuts = cuts + " Cut%03d" % cutsnr return 0

# end functions

doc = App.activeDocument

# Korpus box = doc.addObject("Part::Box", "Box") box.Label = "Cube" box.Length = length box.Width = width box.Height = height # Change Color of Object. box.ViewObject.DiffuseColor = (0.67, 0.67, 0.0) if debug: doc.recompute # Groove groove = doc.addObject("Part::Box", "Groove") groove.Label = "Groove" groove.Length = groovethickness groove.Width = groovedeep groove.Height = height - (2 * groovedeep) groove.ViewObject.DiffuseColor = (0.67, 0.67, 0.0) groove.Placement = App.Placement(       App.Vector(length - groovethickness, 0, groovedeep),        App.Rotation) if debug: doc.recompute

# make endholes cylinders = "" # labels of cylinders to cut if endholes == 'y': # Bottom holes cylendl = doc.addObject("Part::Cylinder", "Cylinderendl") cylendl.Label = "Cylinderendl001" cylendl.Radius = bradius cylendl.Height = bdeep cylendl.Angle = 360 cylinders = cylinders + " " + cylendl.Name cylendl.ViewObject.DiffuseColor = (0.0, 0.0, 0.0) doc.ActiveObject.Placement = App.Placement(           App.Vector(fdist, bdeep, holetop),            App.Rotation(App.Vector(1, 0, 0), 90)) if debug: doc.recompute cylendr = doc.addObject("Part::Cylinder", "Cylinderendr") cylendr.Label = "Cylinderendr001" cylendr.Radius = bradius cylendr.Height = bdeep cylendr.Angle = 360 cylinders = cylinders + " " + cylendr.Name cylendr.ViewObject.DiffuseColor = (0.0, 0.0, 0.0) cylendr.Placement = App.Placement(           App.Vector(length - fdist, bdeep, holetop),            App.Rotation(App.Vector(1, 0, 0), 90)) if debug: doc.recompute

# Top holes cylendl = doc.addObject("Part::Cylinder", "Cylinderendl") cylendl.Label = "Cylinderendl002" cylendl.Radius = bradius cylendl.Height = bdeep cylendl.Angle = 360 cylinders = cylinders + " " + cylendl.Name cylendl.ViewObject.DiffuseColor = (0.0, 0.0, 0.0) cylendl.Placement = App.Placement(           App.Vector(fdist, bdeep, height - holetop),            App.Rotation(App.Vector(1, 0, 0), 90)) if debug: doc.recompute cylendr = doc.addObject("Part::Cylinder", "Cylinderendr") cylendr.Label = "Cylinderendr002" cylendr.Radius = bradius cylendr.Height = bdeep cylendr.Angle = 360 cylinders = cylinders + " " + cylendr.Name cylendr.ViewObject.DiffuseColor = (0.0, 0.0, 0.0) cylendr.Placement = App.Placement(           App.Vector(length - fdist, bdeep, height-holetop),            App.Rotation(App.Vector(1, 0, 0), 90)) if debug: doc.recompute

if fillwithholes == 'no': n = 0 else: n = int(height / 2 / holedistance)

# drill holes from bottom to half height # reduce holes for test to 2 alternative use n   # Holes for Hettich VB36 # Bohrloecher x = -1 # init value if connector >= 1: x = 0 App.Console.PrintMessage("x="+str(x) + " " + "\n") cyll = doc.addObject("Part::Cylinder", "Cylinderl") cyll.Label = "Cylinderl%03d" % x       cyll.Radius = hole1r cyll.Height = hole1d cyll.Angle = 360 cylinders = cylinders + " " + cyll.Name cyll.ViewObject.DiffuseColor = (0.0, 0.0, 0.0) cyll.Placement = App.Placement(           App.Vector(fdist, hole1d, hole1 + x * holedistance),            App.Rotation(App.Vector(1, 0, 0), 90)) if debug: doc.recompute

cylr = doc.addObject("Part::Cylinder", "Cylinderr") cylr.Label = "Cylinderr%03d" % x       cylr.Radius = hole1r cylr.Height = hole1d cylr.Angle = 360 cylinders = cylinders + " " + cylr.Name cylr.ViewObject.DiffuseColor = (0.0, 0.0, 0.0) cylr.Placement = App.Placement(           App.Vector(length - fdist, hole1d, hole1 + x * holedistance),            App.Rotation(App.Vector(1, 0, 0), 90))

if connector == 2: x = 1 cyll = doc.addObject("Part::Cylinder", "Cylinderl") cyll.Label = "Cylinderl%03d" % x       cyll.Radius = hole2r cyll.Height = hole2d cyll.Angle = 360 cylinders = cylinders + " " + cyll.Name cyll.ViewObject.DiffuseColor = (0.0, 0.0, 0.0) cyll.Placement = App.Placement(           App.Vector(fdist, hole2d, hole1 + x * holedistance),            App.Rotation(App.Vector(1, 0, 0), 90)) if debug: doc.recompute

cylr = doc.addObject("Part::Cylinder", "Cylinderr") cylr.Label = "Cylinderr%03d" % x       cylr.Radius = hole2r cylr.Height = hole2d cylr.Angle = 360 cylinders = cylinders + " " + cylr.Name cylr.ViewObject.DiffuseColor = (0.0, 0.0, 0.0) cylr.Placement = App.Placement(           App.Vector(length - fdist, hole2d, hole1 + x * holedistance),            App.Rotation(App.Vector(1, 0, 0), 90)) if debug: doc.recompute

xs = x + 1 for x in range(xs, n): # Bohrloecher cyll = doc.addObject("Part::Cylinder", "Cylinderl") cyll.Label = "Cylinderl%03d" % x       cyll.Radius = bradius cyll.Height = bdeep cyll.Angle = 360 cylinders = cylinders + " " + cyll.Name cyll.ViewObject.DiffuseColor = (0.0, 0.0, 0.0) cyll.Placement = App.Placement(           App.Vector(fdist, bdeep, hole1 + x * holedistance),            App.Rotation(App.Vector(1, 0, 0), 90)) if debug: doc.recompute

cylr = doc.addObject("Part::Cylinder", "Cylinderr") cylr.Label = "Cylinderr%03d" % x       cylr.Radius = bradius cylr.Height = bdeep cylr.Angle = 360 cylinders = cylinders + " " + cylr.Name cylr.ViewObject.DiffuseColor = (0.0, 0.0, 0.0) cylr.Placement = App.Placement(           App.Vector(length - fdist, bdeep, hole1 + x * holedistance),            App.Rotation(App.Vector(1, 0, 0), 90)) if debug: doc.recompute

# drill holes from Top to half height # # Holes for Hettich VB36 x = -1 # init value if connector >= 1: x = 0 cyll = doc.addObject("Part::Cylinder", "Cylinderl") cyll.Label = "Cylinderl%03d" % x       cyll.Radius = hole1r cyll.Height = hole1d cyll.Angle = 360 cylinders = cylinders + " " + cyll.Name cyll.ViewObject.DiffuseColor = (0.0, 0.0, 0.0) cyll.Placement = App.Placement(           App.Vector(fdist, hole1d, height - hole1 - x * holedistance),            App.Rotation(App.Vector(1, 0, 0), 90)) if debug: doc.recompute

cylr = doc.addObject("Part::Cylinder", "Cylinderr") cylr.Label = "Cylinderr%03d" % x       cylr.Radius = hole1r cylr.Height = hole1d cylr.Angle = 360 cylinders = cylinders + " " + cylr.Name cylr.ViewObject.DiffuseColor = (0.0, 0.0, 0.0) cylr.Placement = App.Placement(           App.Vector(length - fdist, hole1d, height-hole1 - x * holedistance),            App.Rotation(App.Vector(1, 0, 0), 90)) if debug: doc.recompute

if connector == 2: x = 1 cyll = doc.addObject("Part::Cylinder", "Cylinderl") cyll.Label = "Cylinderl%03d" % x       cyll.Radius = hole2r cyll.Height = hole2d cyll.Angle = 360 cylinders = cylinders + " " + cyll.Name cyll.ViewObject.DiffuseColor = (0.0, 0.0, 0.0) cyll.Placement = App.Placement(           App.Vector(fdist, hole2d, height - hole1 - x * holedistance),            App.Rotation(App.Vector(1, 0, 0), 90)) if debug: doc.recompute

cylr = doc.addObject("Part::Cylinder", "Cylinderr") cylr.Label = "Cylinderr%03d" % x       cylr.Radius = hole2r cylr.Height = hole2d cylr.Angle = 360 cylinders = cylinders + " " + cylr.Name cylr.ViewObject.DiffuseColor = (0.0, 0.0, 0.0) cylr.Placement = App.Placement(           App.Vector( length - fdist, hole2d, height - hole1 - x * holedistance),           App.Rotation(App.Vector(1, 0, 0), 90)) if debug: doc.recompute

xs = x + 1 for x in range(xs, n): # Drillholes cyll = doc.addObject("Part::Cylinder", "Cylinderl") cyll.Label = "Cylinderl%03d" % x       cyll.Radius = bradius cyll.Height = bdeep cyll.Angle = 360 cylinders = cylinders + " " + cyll.Name cyll.ViewObject.DiffuseColor = (0.0, 0.0, 0.0) cyll.Placement = App.Placement(           App.Vector(fdist, bdeep, height - hole1 - x * holedistance),            App.Rotation(App.Vector(1, 0, 0), 90)) if debug: doc.recompute

cylr = doc.addObject("Part::Cylinder", "Cylinderr") cylr.Label = "Cylinderr%03d" % x       cylr.Radius = bradius cylr.Height = bdeep cylr.Angle = 360 cylinders = cylinders + " " + cylr.Name cylr.ViewObject.DiffuseColor = (0.0, 0.0, 0.0) cylr.Placement = App.Placement(           App.Vector( length - fdist, bdeep, height - hole1 - x * holedistance),           App.Rotation(App.Vector(1, 0, 0), 90)) if debug: doc.recompute

if debug: App.Console.PrintMessage("cylinders = ") App.Console.PrintMessage(cylinders + "\n")

# cut all holes cuts = "Box Cut" # cut labels cutsnr = 0    	# index number in cuts # cut groove cut("Groove") cyls = cylinders.split # number of words if debug: App.Console.PrintMessage("n=" + str(cyls) + "\n") for x in cyls: if debug: App.Console.PrintMessage("cylinder(" + x + ")=" + str(x) + "\n") cut(str(x)) doc.recompute Gui.SendMsgToActiveView('ViewFit')


 * OS: Ubuntu 14.04.1 LTS
 * 1) Word size of OS: 32-bit
 * 2) Word size of FreeCAD: 32-bit
 * 3) Version: 0.15.4410 (Git)
 * 4) Branch: master
 * 5) Hash: 9ee08a97ea81304e2690694f76ee2dc013556a5d
 * 6) Python version: 2.7.6
 * 7) Qt version: 4.8.6
 * 8) Coin version: 4.0.0a

Links

 * Macro_PartsLibrary FreeCAD Library