#!/usr/bin/env python3 # Copyright (C) 2025 Thomas Kolb (cfr34k) # This model is licensed under CC BY-SA 4.0. To view a copy of this license, # visit https://creativecommons.org/licenses/by-sa/4.0/ from build123d import * from math import sin, cos, tan, pi ALIGN_BOTTOM = (Align.CENTER, Align.CENTER, Align.MIN) ALIGN_TOP = (Align.CENTER, Align.CENTER, Align.MAX) plug_base_d = 60.8 plug_clip_d = 62 plug_clip_offset = 12 plug_clip_l = 2.5 plug_l = 21 plug_wall_t = 2.5 plug_notch_w = 3 plug_notch_offset = 3 plug_notch_depth = plug_l - plug_notch_offset adapter_outer_d = 65 adapter_l = 30 nozzle_l = 100 nozzle_d = 62 clip = Pos(Z=plug_clip_offset) * Cylinder(plug_clip_d/2, plug_clip_l, align=ALIGN_BOTTOM) notches = [ \ Pos(Z=plug_notch_offset) * Box(plug_clip_d, plug_notch_w, plug_notch_depth, align=ALIGN_BOTTOM), Rot(Z=90) * Pos(Z=plug_notch_offset) * Box(plug_clip_d, plug_notch_w, plug_notch_depth, align=ALIGN_BOTTOM), ] overall_l = plug_l + adapter_l + nozzle_l duct = Pos(Z=plug_l) * Cylinder(plug_base_d/2 - plug_wall_t, overall_l, align=ALIGN_TOP) plug = Cylinder(plug_base_d/2, plug_l, align=ALIGN_BOTTOM) + clip - notches adapter = Cylinder(adapter_outer_d/2, adapter_l, align=ALIGN_TOP) angle = 50 cutoff_l = nozzle_d / cos(angle*pi/180) cutoff_h = nozzle_d cutoff_box = \ Pos(X=nozzle_d/2, Z=-nozzle_l-adapter_l) * \ Rot(Y=angle) * \ Pos(X=-cutoff_l/2) * \ Box(cutoff_l, nozzle_d, cutoff_h, align=ALIGN_TOP) nozzle = Pos(Z=-adapter_l) * Cylinder(nozzle_d/2, nozzle_l, align=ALIGN_TOP) \ - cutoff_box device = plug + adapter + nozzle - duct show_object(device, "device", options={"alpha":0.0, "color": (192, 192, 192)}) #show_object(cutoff_box, "cutoff_box", options={"alpha":0.7, "color": (255, 0, 0)})