python
复制代码
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完成!")
生成卡扣:
python
复制代码
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')