Last active
December 5, 2023 20:53
-
-
Save jmwright/b1f4e3cbcb2152a240b03a8779a202b4 to your computer and use it in GitHub Desktop.
Example of Creating a CadQuery Object With the Hylang Lisp Dialect
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env hy | |
; A port of the CadQuery example here: https://github.com/CadQuery/cadquery/blob/master/examples/Ex100_Lego_Brick.py | |
; Information about the Hylang Lisp dialect: http://hylang.org/ | |
(import cadquery :as cq) | |
(import cadquery.vis [show]) | |
; User parameters | |
(setv lbumps 2) ; number of bumps long | |
(setv wbumps 4) ; number of bumps wide | |
(setv thin True) ; True for thin, False for thick | |
; Parameters that make a Lego brick a Lego brick | |
(setv pitch 8.0) | |
(setv clearance 0.1) | |
(setv bumpDiam 4.8) | |
(setv bumpHeight 1.8) | |
; Whether or not the user wants a thick brick | |
(if thin | |
(setv height 3.2) | |
(setv height 9.6)) | |
; Derived parameters | |
(setv t | |
(% (- pitch (- (* 2.0 clearance) bumpDiam)) 2.0)) | |
(setv postDiam | |
(- pitch t)) ; works out to 6.5 | |
(setv total_length | |
(- (* lbumps pitch) (* 2.0 clearance))) | |
(setv total_width | |
(- (* wbumps pitch) (* 2.0 clearance))) | |
; Define the overall shape of the brick | |
(setv brick (cq.Workplane "XY")) | |
(setv brick (brick.box total_length total_width height)) | |
; Shell inwards not outwards | |
(setv brick (brick.faces "<Z")) | |
(setv brick (brick.shell (* -1.0 t))) | |
; make the bumps on the top | |
(setv brick (.workplane (brick.faces ">Z"))) | |
(setv brick (brick.rarray pitch pitch lbumps wbumps True)) | |
(setv brick (brick.circle (/ bumpDiam 2.0))) | |
(setv brick (brick.extrude bumpHeight)) | |
(defn multibumps [brick] | |
"Handles adding the tubes to a multi-bump brick" | |
(setv brick (.workplane (brick.faces "<Z") :invert True)) | |
(setv brick (brick.rarray pitch pitch (- lbumps 1) (- wbumps 1) :center True)) | |
(setv brick (.circle (brick.circle (/ postDiam 2.0)) (/ bumpDiam 2.0))) | |
(setv brick (brick.extrude (- height t))) | |
(return brick) | |
) | |
(defn lenbumps [brick] | |
"Handles adding studs to length >1 bricks with width 1" | |
(setv brick (.workplane (brick.faces "<Z") :invert True)) | |
(setv brick (brick.rarray pitch pitch (- lbumps 1) 1 :center True)) | |
(setv brick (.extrude (brick.circle t) (- height t))) | |
(return brick) | |
) | |
(defn widbumps [brick] | |
"Handles adding studs to width >1 bricks with length 1" | |
(setv brick (.workplane (brick.faces "<Z") :invert True)) | |
(setv brick (brick.rarray pitch pitch 1 (- wbumps 1) :center True)) | |
(setv brick (.extrude (brick.circle t) (- height t))) | |
(return brick) | |
) | |
; Add posts on the bottom. posts are different diameter depending on geometry | |
; Solid studs for 1 bump, tubes for multiple, none for 1x1 | |
(cond | |
(and (> lbumps 1) (> wbumps 1)) (setv brick (multibumps brick)) | |
(> lbumps 1) (setv brick (lenbumps brick)) | |
(> wbumps 1) (setv brick (widbumps brick)) | |
) | |
(show brick) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment