FreeCAD参数化建模实战:用Python批量生成标准件
2026/9/3 22:22:17 网站建设 项目流程

FreeCAD参数化建模实战:用Python批量生成标准件

【免费下载链接】FreeCADOfficial source code of FreeCAD, a free and opensource multiplatform 3D parametric modeler.项目地址: https://gitcode.com/GitHub_Trending/fr/FreeCAD

当你需要为一个法兰系列出 12 个尺寸变体时,FreeCAD 参数化建模可以把"逐个改尺寸、导出 STEP"这件机械活压成一行循环。下面以仓库自带的示例代码为参照,给出可复用的完整做法。

FreeCAD 能力全景:建模、装配、仿真怎么分工

FreeCAD 的参数化能力集中在三个工作台:输入是草图、约束和属性,输出是可直接进下游流程的实体模型、装配体和仿真结果。

PartDesign 工作台:输入一个带约束的草图,通过凸台(Pad)、口袋(Pocket)、回转(Revolution)等特征叠加出实体;每个特征保留参数,改草图约束后全模型自动重算。

Assembly 工作台:输入是若干零件实体,通过关节(Joint)声明铰接、滑块、圆柱副等关系,输出是可拖动、可做运动检查的多体装配,左树可见 Joints 与各零件层级。

FEM 工作台:输入是模型、材料与载荷,输出是网格、边界条件和求解后的应力云图。对参数化零件来说,改完参数可以顺手把静力学校验也跑了,不用切软件。

5 个步骤跑通最小参数化对象

最小可运行的参数化对象分三步:建对象、写重算逻辑、触发计算。下面以法兰为例,完整代码可参考 src/Mod/TemplatePyMod/FeaturePython.py。

1. 在文档中创建 Python 特征对象,并给对象挂上自定义参数属性:

doc = FreeCAD.newDocument("FlangeSeries") fl = doc.addObject("Part::FeaturePython", "Flange") # 三个可改参数,属性名会成为对象的公开字段 fl.addProperty("App::PropertyInteger", "Holes", "Flange", "螺栓孔数") fl.addProperty("App::PropertyLength", "BoltHoleDia", "Flange", "螺栓孔直径") fl.addProperty("App::PropertyLength", "OuterDiam", "Flange", "法兰外径") fl.Holes, fl.BoltHoleDia, fl.OuterDiam = 8, "10.5 mm", "80 mm"

2. 定义 Proxy 类,其中execute()是必须实现的重算钩子——文档每次重算都会调用它,相当于 Excel 公式单元格:改一个源值,下游自动重算:

class FlangeProxy: def __init__(self, obj): self.obj = obj obj.Proxy = self def execute(self, fp): r_out = fp.OuterDiam.Value / 2 r_bolt = r_out - fp.BoltHoleDia.Value * 1.8 pts = [Base.Vector(r_out, 0, 0)] for i in range(fp.Holes): # 圆周均布螺栓孔 a = 2 * math.pi * i / fp.Holes pts.append(Base.Vector(r_bolt * math.cos(a), r_bolt * math.sin(a), 0)) pts.append(pts[0]) face = Part.Face(Part.makePolygon(pts)) fp.Shape = face.extrude(Base.Vector(0, 0, fp.Height.Value))

3. 把 Proxy 绑到对象上并重算。绑定后几何立即生成,之后任何参数修改都会触发重算:

FlangeProxy(fl) doc.recompute() fl.Holes = 12 # 改参数 doc.recompute() # 几何自动更新

4. 批量生成 12 个变体,把参数表记进电子表格,并逐个导出 STEP:

sheet = doc.addObject("Spreadsheet::Sheet", "Params") out_dir = "/tmp/flanges" for i in range(12): od = 40 + 8 * i # 外径 40~132 mm,步长 8 sheet.set(f"A{i+1}", str(od)) # 参数表留档 sheet.set(f"B{i+1}", str(i + 1)) name = f"Flange_{od:g}" f = doc.addObject("Part::FeaturePython", name) FlangeProxy(f) f.OuterDiam, f.Holes, f.BoltHoleDia = f"{od} mm", 8, "10.5 mm" doc.recompute() Part.export([f], f"{out_dir}/{name}.step")

5. 验证产物:打开导出的 STEP,确认孔位、外径与参数表一致。12 个变体从建模到出图全程无人工干预。

一个完整工作流:轴承座的参数、仿真与结果输出

选仓库自带的 data/examples/FEMExample.FCStd 为参照,走一遍"参数准备 → 核心处理 → 结果输出"的完整链路。

参数准备:把几何参数集中成一张表,后续所有对象都引用这些源值:

P = dict( BoreDiam=FreeCAD.Quantity(30, "mm"), # 轴承内孔直径 Wall=FreeCAD.Quantity(5, "mm"), # 壁厚 Width=FreeCAD.Quantity(20, "mm"), # 座体宽度 )

核心处理:实体生成后交给 FEM 工作台,加材料、约束、接触力,再网格化求解。相关 API 可查 src/Mod/Fem/:

analysis = doc.addObject("Fem::Analysis", "Analysis") material = doc.addObject("Fem::MaterialSolid", "Material") material.YoungsModulus = "210 GPa" fixed = doc.addObject("Fem::ConstraintFixed", "Fixed") fixed.References = [(doc.Body.Origin.OriginFeatures[0], "Vertex1")] load = doc.addObject("Fem::ConstraintContact", "Load") load.Magnitude = "10000 N" mesh = doc.addObject("Fem::FemMeshCcxTools", "Mesh") doc.recompute() # 网格化 + 求解

结果输出:求解完成后,场景里直接显示应力分布,色标从蓝到红对应 3e-11 到 6e+02 帕,右侧图例可直接读取数值,截图或导出结果即可进评审文档。

效率进阶:三处非显而易见的配置

🔧场景:同一参数被 5 个零件引用,手改容易漏做法:把参数写进电子表格(Spreadsheet)单元格,各对象的属性用表达式(Expression)绑定到该单元格效果:改一个单元格,所有引用它的零件、图纸同步更新,零遗漏

场景:参数批量变更需要在流水线里自动验证做法:用无头模式执行脚本:FreeCADCmd -P check_flanges.py效果:CI 上跑通即说明参数区间内几何全部可解算,无需人工打开 GUI

场景:改一个参数后全模型重算太慢做法:只重算依赖链上的对象:obj.touch(); doc.recompute([obj])效果:跳过无关特征,大装配下的参数调整从整分钟级降到秒级

接入现有工作流:从源码到 CI 的四步

  1. 获取源码:git clone https://gitcode.com/GitHub_Trending/fr/freecad
  2. 安装构建依赖与编译器(CMake、Qt、Python、OCC 等),用cmake配置并构建,产物为FreeCAD与命令行版FreeCADCmd
  3. 把自定义参数化脚本放入模块目录,参考 src/Mod/TemplatePyMod/ 的组织方式(Init.py注册模块、特征类与 Proxy 分离),即可作为可复用的私有模块加载
  4. 在 CI/CD 流水线中加入校验任务:每次提交执行FreeCADCmd -P <脚本>,脚本内断言 12 个变体全部生成且可重算,失败即拦截合并

文档侧可直接复用 data/examples/ 内的样例文档作为验收基线。

高频问题速查:四个最常踩的坑

现象:树里对象带 Touched 标记,视图里的几何是旧值原因:只改了参数没触发重算,或 Proxy 里漏写了execute()解法:改完参数显式调用doc.recompute(),并确认类中实现了execute(self, fp)且赋值给fp.Shape

现象"80 mm"字符串赋值后,计算结果和裸数字 80 不一致原因:FreeCAD 的长度属性是数量(Quantity)类型,80 被解释为 80 米解法:比较、运算时统一用obj.OuterDiam.Value取米制数值;带单位字符串只做显示用途

现象:保存重开后文档里对象显示"Cannot find Proxy class"原因:Proxy 所在的 Python 模块没被加载,C++ 侧找不到类定义解法:把模块放到 FreeCAD 的模块目录并在Init.py中注册,或脚本执行前import该模块再doc.recompute()

现象:批量循环里改了 12 个对象,最后只有第一个变了原因:循环中未触发重算,多个对象挤在同一次重算里互相覆盖缓存解法:循环体内每个对象改完立即doc.recompute(),或循环结束后整体重算并逐个校验obj.Shape.BoundBox

12 个法兰变体现在只差一个循环。下一步:把上面的 Proxy 脚本存为.py文件,用FreeCADCmd -P跑一次,验证产物齐全。

【免费下载链接】FreeCADOfficial source code of FreeCAD, a free and opensource multiplatform 3D parametric modeler.项目地址: https://gitcode.com/GitHub_Trending/fr/FreeCAD

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询