leg.add(parts[name], name=name, color=C(links[name]["col"]), loc=L(0, 0, i * 10 - 50)) return leg leg = create_leg(x, y) # Mates for name in link_list: leg.mate(f"{name}?mate", name=name, origin=True) # Relocate relocate(leg) # Assemble the parts alpha = 0 joints = linkage(alpha, x, y, links) for name in link_list: v, a = link_loc(name, joints, links) abs_loc = cq.Location( cq.Workplane("YZ").plane.rotated((0, 0, a)), cq.Vector(*v)) # calculate the absolute location ... loc = abs_loc * leg.mates[ name].mate.loc.inverse # ... and center the mate of the link first leg.assemble(name, loc) cv = show(leg)
name="arm", color=C("orange"), loc=L(0, 10 * nr, 0))) disk_arm = create_disk_arm() disk_arm.mate("base?mate", name="disk_pivot", origin=True, transforms=odict(rz=180)) disk_arm.mate("base@faces@>Z", name="arm_pivot") disk_arm.mate("disk@faces@>Z[-2]", name="disk", origin=True) disk_arm.mate("arm?mate", name="arm", origin=True) relocate(disk_arm) # show(disk_arm) disk_arm.assemble("arm", "arm_pivot") disk_arm.assemble("disk", "disk_pivot") show(disk_arm, reset_camera=True) r_disk = 100 dist_pivot = 200 def angle_arm(angle_disk): ra = np.deg2rad(angle_disk) v = np.array((dist_pivot, 0)) - r_disk * np.array((cos(ra), sin(ra)))
for name in leg_names: lower, upper, angle = ("top", "bottom", -75) if "left" in name else ("bottom", "top", -75) hexapod.mate(f"{name}?{upper}", name=f"leg_{name}_hole", transforms=odict(rz=angle)) hexapod.mate(f"{name}@faces@<Y", name=f"leg_{name}_hinge", origin=True, transforms=odict(rx=180, rz=-90)) hexapod.mate(f"{name}/lower?{lower}", name=f"leg_{name}_lower_hole", origin=True) # show(hexapod, reset_camera=False) relocate(hexapod) # Assemble the parts for leg in leg_names: hexapod.assemble(f"leg_{leg}_lower_hole", f"leg_{leg}_hole") hexapod.assemble(f"leg_{leg}_hinge", f"{leg}_hole") hexapod.assemble("top", "bottom") for stand_name in stand_names: hexapod.assemble(f"{stand_name}", f"{stand_name}_bottom") show(hexapod) # Animation
("c/b", "cyl2"), ("c/b/a", "cyl3"), ): assy.mate( f"{obj}?{name}_m0", name=f"{name}_m0", transforms=odict(rx=180 if "c" in name else 0), origin=True, ) assy.mate( f"{obj}?{name}_m1", name=f"{name}_m1", transforms=odict(rx=0 if "b" in name else 180), ) relocate(assy) check_mates = False if check_mates: show(assy, render_mates=True) else: # Assemble the parts assy.assemble("cyl1_m0", "box0_m0") assy.assemble("box1_m1", "cyl1_m1") assy.assemble("cyl2_m0", "box1_m0") assy.assemble("box2_m1", "cyl2_m1") assy.assemble("cyl3_m0", "box2_m0") assy.assemble("box3_m1", "cyl3_m1") show(assy)