# Make center assembly
p = cq.Workplane().cylinder(height=10, radius=2)
n = cq.Workplane().lineTo(0,2).lineTo(4,3).lineTo(4,0).close().revolve(axisStart=(0,0,0), axisEnd=(1,0,0))
b = cq.Assembly().add(p, name="p").add(n, name="n").constrain("n@edges@<X", "p@edges@>Z", "Plane", param=0).solve()
# Make side assembly
s = cq.Workplane().cylinder(height=20, radius=3)
t = cq.Workplane().lineTo(0,3).lineTo(3,1.5).lineTo(3,0).close().revolve(axisStart=(0,0,0), axisEnd=(1,0,0))
v = cq.Assembly().add(s, name="s").add(t, name="t").constrain("t@edges@<X", "s@edges@>Z", "Plane", param=0).solve()
# Create assembly from subassemblies
all = (cq.Assembly()
.add(v, name="v", loc=cq.Location((0,0,0),(1,0,0),0))
.add(b, name="b1", loc=cq.Location((0,5,0),(1,0,0),0))
.add(b, name="b2", loc=cq.Location((0,-5,0),(0,0,1),0))
)