如何使用Python将装配体STEP文件的每个零件单独导出为STL文件
实现方案
核心思路
利用FreeCAD内置的Python API,加载装配体STEP文件后递归遍历所有子零件,应用零件在装配体中的全局位置变换后单独导出为STL文件,天然保留装配全局坐标,完全适配你现有的自动化流程需求。
完整可运行代码
import FreeCAD import Import import Mesh import os # 配置参数,根据实际路径修改 STEP_FILE_PATH = "你的装配体文件路径/xxx.step" OUTPUT_FOLDER = "STL输出目录路径" LINEAR_DEVIATION = 0.01 # STL三角化精度,数值越小精度越高、文件越大 ANGULAR_DEVIATION = 0.5 # 初始化输出目录 if not os.path.exists(OUTPUT_FOLDER): os.makedirs(OUTPUT_FOLDER) # 加载STEP装配体 doc = FreeCAD.newDocument() Import.open(STEP_FILE_PATH) doc.recompute() # 重名计数器,避免同名零件覆盖 name_counter = {} def export_part(obj, parent_placement=FreeCAD.Placement()): # 合并父级装配的位置变换,得到当前零件的全局坐标位置 current_placement = parent_placement * obj.Placement if hasattr(obj, "Shape") and obj.Shape.isValid() and not obj.Shape.isNull(): if obj.Shape.Solids: # 判定为有效零件,排除装配组等非实体对象 # 应用全局位置变换到零件形状 global_shape = obj.Shape.copy() global_shape.Placement = current_placement # 处理文件名特殊字符和重名问题 base_name = obj.Label.replace(" ", "_").replace("/", "_").replace("\\", "_") if base_name in name_counter: name_counter[base_name] += 1 file_name = f"{base_name}_{name_counter[base_name]}.stl" else: name_counter[base_name] = 0 file_name = f"{base_name}.stl" output_path = os.path.join(OUTPUT_FOLDER, file_name) # 导出STL Mesh.export([global_shape], output_path, LinearDeflection=LINEAR_DEVIATION, AngularDeflection=ANGULAR_DEVIATION) print(f"已导出: {output_path}") # 递归遍历子对象,处理多层嵌套装配 if hasattr(obj, "Group"): for child in obj.Group: export_part(child, current_placement) # 遍历根对象启动导出流程 for root_obj in doc.Objects: export_part(root_obj) FreeCAD.closeDocument(doc.Name) print("所有零件STL导出完成")
使用方法
- 确保已安装FreeCAD,可直接在FreeCAD软件内的Python控制台运行上述代码,也可将FreeCAD的Python解释器路径加入系统环境变量后直接执行脚本
- 修改代码开头的
STEP_FILE_PATH和OUTPUT_FOLDER为实际的文件路径 - 可根据仿真精度需求调整
LINEAR_DEVIATION和ANGULAR_DEVIATION参数
注意事项
- 导出的STL默认保留装配体的全局坐标系位置,和手动通过FreeCAD导出的效果一致
- 自动适配多层嵌套装配、同名零件场景,不会出现坐标偏移或文件覆盖问题
- 如需导出OBJ格式,仅需把导出代码里的文件后缀改成
.obj即可,FreeCAD的Mesh模块原生支持OBJ格式导出
内容的提问来源于stack exchange,提问作者Newfarmer
相关产品推荐
相关产品推荐

