from build123d import * from b3dkit import dovetail from b3dkit import Point def split_with_b3dkit_point(): # 创建零件 part = Part() + Box(100, 50, 30) # 使用 b3dkit 的 Point 类 start_point = Point(0, -25) end_point = Point(0, 25) try: # 所以需要额外指定 Z 范围或者使用不同的调用方式 part1 = dovetail.dovetail_subpart(part=part, start=start_point, end=end_point, section=dovetail.DovetailPart.TAIL, style=dovetail.DovetailStyle.SNUGTAIL, slot_count=2, depth=3, tolerance=0.2) part2 = part - part1 export_stl(part1, "part1.stl") export_stl(part2, "part2.stl") return part1, part2 except Exception as e: print(f"Point 方式失败: {e}") return None if __name__ == "__main__": # 显示可用函数,帮助调试 print("\n可用的 dovetail 模块函数:") available_funcs = [f for f in dir(dovetail) if not f.startswith('_')] for func in available_funcs[:10]: # 只显示前10个 print(f" - {func}") print("\n开始拆件...\n") result = split_with_b3dkit_point() print("\n完成!")
生成卡扣:
from build123d import * from b3dkit import dovetail, Point # 1. 创建或导入你的模型 part = Part() + Box(100, 50, 30) # 2. 使用 dovetail 做基础切割(这里只是切开,不加榫卯) # 你可以调整 style 或参数来实现简单切割 start_point = Point(-50, -25) end_point = Point(50, 25) # 使用 dovetail 只是为了切开,这里可以不使用 SNUGTAIL,或者后续再调整 part1 = dovetail.dovetail_subpart( part=part, start=start_point, end=end_point, section=dovetail.DovetailPart.TAIL, style=dovetail.DovetailStyle.TRADITIONAL, # 用传统方式先切开 slot_count=1, depth=5, tolerance=0.2 ) part2 = part - part1 # 3. 手动为两个零件添加卡扣特征 # 获取切割面(这里需要根据你的零件实际情况调整面的选取逻辑) # 假设 part1 和 part2 的切割面是面索引为 0 的面 face1 = part1.faces()[0] face2 = part2.faces()[0] # 在面中心添加一个圆柱形卡扣(Pin) pin = Cylinder(radius=2, height=5, align=(Align.CENTER, Align.CENTER, Align.MIN)) pin = Cylinder(2, 5) # ✅ 正确写法:直接调用 locate 方法 pin_part = pin.locate(Location(face1.center())) part1_with_pin = part1 + pin_part # 在另一个零件上添加对应的孔(Socket) hole = Cylinder(radius=2.2, height=5, align=(Align.CENTER, Align.CENTER, Align.MAX)) hole_part = hole.locate(Location(face2.center())) part2_with_hole = part2 - hole_part # 导出最终带卡扣的零件 export_stl(part1_with_pin, 'part1_with_click.stl') export_stl(part2_with_hole, 'part2_with_click.stl')
![]()