3D 打印·模型修复与切片·免费版
红线
- 不编造材料参数:温度、收缩率等必须来自材料厂商数据表;缺失时给「建议起始区间 + 需实测标定」。
- 功能件必须标注:受力、承压、食品接触、户外耐候件,必须提示「需实测验证,打印件性能与注塑件不等同」。
- 不保证可打印:本技能给出检查与参数建议,首件必须试打验证。
- 只用开源工具:MeshLab / trimesh / PrusaSlicer 等,不引用付费云端切片服务。
何时使用
- 拿到 STL/OBJ 要打印,先做模型体检与修复。
- 不知道层高、壁厚、填充、温度怎么设。
- 打印总是失败(翘边、掉层、堵头、粘不住)。
- 要估算打印时间和用料。
- 要做装配配合件(孔轴配合要留多少间隙)。
反触发:
- 要从零建参数化模型 → 用 CAD 建模技能。
- 金属 3D 打印(SLM)工艺 → 超出本技能范围。
职责边界
- 做:体检、修复建议、参数推导、摆放策略、缺陷归因、估算。
- 不做:替代实测标定、保证力学性能、提供厂商专有参数。
主流程
第 1 步:模型体检(质检闸 A)
pip install trimesh pymeshlab numpy-stl
# RUN: fixture=stl
import trimesh
m = trimesh.load("part.stl", force="mesh")
print("watertight(封闭):", m.is_watertight) # 打印前提
print("volume:", m.volume, "mm^3")
print("area:", m.area, "mm^2")
print("euler:", m.euler_number) # 2 = 单连通球体拓扑
print("bounds:", m.bounds)
print("faces:", len(m.faces))
体检判据:
| 指标 | 期望 | 不合格含义 |
|---|---|---|
is_watertight |
True | False 说明有洞/非流形,切片会出错 |
euler_number |
2(单壳体) | 偏离说明有多个壳/洞 |
volume > 0 |
是 | 为 0 说明面片退化 |
| 面数 | < 50 万(家用) | 过多会卡切片 |
| 最小壁厚 | ≥ 2×喷嘴直径 | 太薄打不出来 |
> 质检闸 A:is_watertight == False → 必须先修复,不许直接切片。
第 2 步:常见修复
# trimesh 基础修复
m.process(validate=True)
m.remove_unreferenced_vertices()
m.merge_vertices()
m.fix_normals() # 统一法线朝外
# 补洞(trimesh)
trimesh.repair.fill_holes(m)
trimesh.repair.fix_normals(m)
trimesh.repair.fix_winding(m)
# 严重损坏用 PyMeshLab
import pymeshlab
ms = pymeshlab.MeshSet()
ms.load_new_mesh("part.stl")
ms.apply_filter("meshing_repair_non_manifold_edges")
ms.apply_filter("meshing_close_holes", maxholesize=30)
ms.apply_filter("meshing_re_orient_faces_coherently")
ms.save_current_mesh("part_fixed.stl")
缺陷 → 修复方法:
| 缺陷 | 表现 | 修复 |
|---|---|---|
| 非流形边 | 一条边被 >2 个面共用 | meshing_repair_non_manifold_edges |
| 翻转法线 | 打印时内外判反,实体变空腔 | fix_normals / 重新定向面 |
| 孤立壳 | 打印出飞散碎片 | 只保留最大连通体 |
| 自交面 | 切片层错乱 | 布尔修复或回上游重出模型 |
| 退化面 | 体积为 0 | 删除零面积面 |
| 面数爆炸 | 软件卡死 | 减面(保留 0.05mm 精度) |
# 只保留最大连通体
parts = m.split(only_watertight=False)
m = max(parts, key=lambda p: p.volume)
第 3 步:摆放策略
原则:强度看摆放,外观也看摆放。
| 目标 | 摆放策略 |
|---|---|
| 强度最高 | 让层间结合面避开主受力方向(层间是弱面) |
| 表面最好 | 重要外观面朝上或朝侧面,避开支撑面 |
| 最快 | 降低 Z 高度(层数是时间主因) |
| 少支撑 | 大面朝下,避免大悬垂 |
| 孔要圆 | 圆孔轴线垂直于 Z(竖直孔比水平孔圆) |
# 估算不同摆放的 Z 高度,选最低
import numpy as np
for axis in ([0,0,1],[0,0,-1],[1,0,0],[0,1,0]):
r = trimesh.transformations.rotation_matrix(np.pi/2, axis)
bb = m.copy().apply_transform(r).bounds
print(axis, "Z高度:", round(bb[1][2]-bb[0][2], 2))
> ⚠️ 层间结合强度显著低于层内:受弯、受拉的件,摆放方向往往比填充率更关键。
第 4 步:支撑策略
| 悬垂角 | 处理 |
|---|---|
| < 45° | 通常不需要支撑 |
| 45°~60° | 需支撑或降低速度、加强散热 |
| > 60° | 必须支撑 |
支撑选择:
| 类型 | 优点 | 缺点 |
|---|---|---|
| 普通支撑 | 稳 | 接触面难看 |
| 树状支撑 | 接触点少、省料、易拆 | 细高件不稳 |
| 可溶性支撑 | 表面最好 | 需双喷头/耗材贵 |
减支撑技巧:
- 把孔改成「泪滴孔/菱形孔」(>45° 自支撑)。
- 把大平面悬垂改成 45° 斜角过渡。
- 拆件打印再装配(化整为零)。
第 5 步:切片参数推导
NOZZLE = 0.4 # 喷嘴直径 mm(先确认机器实际值)
params = {
"layer_height": round(NOZZLE * 0.5, 2), # 0.20 通用起始
"line_width": round(NOZZLE * 1.1, 2), # 0.44
"wall_count": max(2, int(1.2 / NOZZLE)), # ≥3 圈更稳,取 ≥1.2mm
"top_bottom": max(3, int(0.8 / (NOZZLE*0.5))),
"infill": "20% 网格", # 外观件 15%,功能件 30~50%
"first_layer_h": round(NOZZLE * 0.6, 2), # 首层略低,增强附着
"first_layer_speed": 20, # mm/s,首层慢
}
关键参数直觉表:
| 参数 | 影响 | 建议 |
|---|---|---|
| 层高 | 时间 ∝ 1/层高;表面质量 | 0.2 通用,0.12 精细,0.28 快速 |
| 壁厚圈数 | 强度主因(>填充率) | ≥3 圈,功能件 4~6 圈 |
| 填充率 | 强度次之,重量/时间 | 15~25% 通用;受力件 40%+ |
| 温度 | 层间结合、堵头 | 按耗材数据表,±5℃ 微调 |
| 热床温度 | 翘边 | PLA 50~60℃,ABS/ASA 90~100℃ |
| 冷却 | 悬垂、细节 | PLA 全开;ABS 关小防开裂 |
| 打印速度 | 质量 vs 时间 | 外壁降速,内壁可快 |
> ⚠️ 温度、流量(flow)、回抽必须用温度塔/流量标定件实测确定,
> 本表只给起始区间,不是推荐值。
第 6 步:公差与缩水补偿
# 配合间隙:孔轴配合经验留量(FDM,需试打验证)
def fit_gap(shaft_d, clearance=0.3):
"""孔实际直径 = 轴径 + 2*单边间隙"""
return shaft_d + 2 * clearance
# 收缩补偿(材料收缩率来自厂商数据,需实测标定)
def scale_for_shrink(dim, shrink_pct):
return dim * (1 + shrink_pct / 100)
| 材料 | 收缩特点 | 处理 |
|---|---|---|
| PLA | 小(~0.2~0.5%) | 一般可不补偿,精密件需试打 |
| ABS/ASA | 大(~0.7~1.5%) | 需补偿 + 恒温环境 |
| 光固化树脂 | 固化收缩 + 后固化变形 | 按树脂说明,注意支撑位变形 |
> 装配件必做试打:打一个配合试样再批量,比算公式可靠。
第 7 步:时间与用料估算
def estimate(m, layer_h=0.2, speed=50, infill=0.2, nozzle=0.4, dia=1.75):
height = m.bounds[1][2] - m.bounds[0][2]
layers = int(height / layer_h)
# 粗略:体积 * 填充折算 + 外壳体积,除以挤出截面流量
vol_solid = m.volume
vol_print = vol_solid * 0.35 + vol_solid * 0.65 * infill # 粗估壳+填充
length = vol_print / (layer_h * nozzle * 1.1) # 挤出长度 mm
time_s = length / speed
filament_g = vol_print / 1000 * 1.24 # PLA 密度 ~1.24 g/cm^3
return layers, round(time_s/60, 1), round(filament_g, 1)
print(estimate(m))
> 估算用于排产参考,实际以切片软件结果为准(含加速度、回抽更复杂)。
第 8 步:首件校验清单(质检闸 B)
- [ ] 模型
is_watertight通过了吗? - [ ] 摆放方向是否避开了受力弱面?
- [ ] 支撑接触面是否在非外观面?
- [ ] 首层附着良好、无翘边吗?
- [ ] 尺寸实测(关键配合尺寸必测卡尺)?
- [ ] 装配件试装通过吗?
- [ ] 功能件做过载荷/耐久实测吗?
- [ ] ⚠️ 若用于承载/承压/食品接触/户外:明确提示需实测验证
> 质检闸 B:关键尺寸未实测 → 不许批量生产。
缺陷归因表
| 现象 | 常见原因 | 排查顺序 |
|---|---|---|
| 翘边/开裂 | 床温低、冷却过强、首层不粘、ABS 无 enclosure | 床温→胶水/PEI→关冷却→加围挡 |
| 层间分离 | 温度低、层高过大、冷却过强 | 升温 5~10℃→降层高→降冷却 |
| 拉丝/漏料 | 回抽不足、温度过高 | 回抽距离/速度→降温 |
| 堵头 | 温度低、杂质、散热不良(喉管热 creep) | 清喉管→降温→检查散热风扇 |
| 丢步/错位 | 速度/加速度过高、皮带松 | 降速→紧皮带→查电流 |
| 表面条纹 | 挤出不稳、Z 轴抖动 | 流量标定→Z 轴丝杠检查 |
| 底面坑洼 | 首层间隙不对 | 重新调平→调首层高度 |
| 大象脚 | 首层过热/挤压过多 | 降温、调首层流量、加 chamfer |
| 孔打小了 | 挤出过量、孔水平摆放 | 水平孔改竖直→微调 flow |
失败降级
- 模型修复不好 → 回上游重新导出(提高 STL 精度、检查单位)。
- 反复打印失败 → 先打校准件(温度塔、回抽测试、立方体尺寸测试)定位变量。
- 没有 3D 打印机 → 只给模型体检与参数建议,说明无法验证实物。
依赖
trimesh、pymeshlab、numpy-stl(开源);PrusaSlicer / Cura(开源,支持命令行切片)。- 全部本地运行,不联网、不调用任何付费服务。
免责声明
打印件性能受设备、耗材、环境、参数共同影响,与注塑件/机加件不等同。
用于承重、承压、食品接触、医疗、户外耐候场景,必须做实物测试与合规确认。
致谢
- 原创免费技能,基于开源网格处理工具的公开用法与社区通用经验重新组织撰写。
- 采用 MIT 许可,不依赖任何专有实现或付费服务。