FreeCAD 二次开发实战:用 20 行 Python 搭一条参数化建模流水线

发布时间:2026/9/3 22:22:22
FreeCAD 二次开发实战:用 20 行 Python 搭一条参数化建模流水线 FreeCAD 二次开发实战用 20 行 Python 搭一条参数化建模流水线【免费下载链接】FreeCADOfficial source code of FreeCAD, a free and opensource multiplatform 3D parametric modeler.项目地址: https://gitcode.com/GitHub_Trending/fr/FreeCAD做机械结构的人应该都干过这种事同一块安装板按 6 孔、8 孔、10 孔各建一版每版改完尺寸还要在模型里手工挪孔位建到第三版就把孔径写错了推倒重来。这种参数变了、模型还得人肉跟着变的活恰恰最适合交给脚本。这篇带你用 FreeCAD 自带的 Part 模块 和属性系统写一个能批量生成参数化安装板的小工具全程不超过 20 行 Python。读完你能自己写一个挂在模型树里的参数化零件改一个数字整族零件自动重算。环境怎么备三分钟的事装一个 FreeCAD 官方发行版就够了Python 绑定随包附带不用额外配置依赖。想读源码的话拉一份下来git clone https://gitcode.com/GitHub_Trending/fr/freecad写代码时用 FreeCAD 内置的 Python 控制台View → Panels → Python consoleimport FreeCAD, Part之后就能直接交互。下面所有示例都在这条控制台上跑。先搞懂 Part::FeaturePython 的代理套路FreeCAD 模型树里的每个节点都是文档对象而Part::FeaturePython是其中最特别的一种它是个空壳允许你挂一个 Python 对象进去由这个对象决定形状长什么样——就像宜家柜体里预留的卡槽塞什么面板进去柜子就变成什么样子。被挂进去的 Python 对象叫proxy。proxy 的职责有三件在__init__里用addProperty声明参数实现execute(self, obj)生成几何把结果赋给obj.Shape。文档重算时 FreeCAD 会回调execute于是参数变了、模型自动跟着变就是这么发生的。仓库里的渐开线齿轮 InvoluteGearFeature.py 就是这个套路的完整示范它的execute只做了两件事按属性值算出齿形轮廓再赋给obj.Shapedef execute(self, obj): w fcgear.FCWireBuilder() generator_func ( involute.CreateExternalGear if obj.ExternalGear else involute.CreateInternalGear ) generator_func(w, obj.Modules.Value, obj.NumberOfTeeth, obj.PressureAngle.Value, ...) gearw Part.Wire([o.toShape() for o in w.wire]) obj.Shape gearw属性声明则是在__init__里一行行addProperty类型写App::PropertyLength默认值给2.5 mm这样的字符串。看懂这两个位置你就看懂了 PartDesign 里一半的 Python 功能对象它们的 C 侧底座在 PartDesign 模块。上面这张图是 PartDesign 工作台的界面左侧特征树里每个节点对应一次建模操作右下属性面板改数字、模型树即刻更新——你要做的就是用 Python 复刻这套数字驱动几何的体验。动手做一块参数化安装板按三步走每步都能在控制台里立刻看到结果。第一步建空壳。输入一个对象名动作import FreeCAD, Part doc FreeCAD.newDocument(MountPlate) obj doc.addObject(Part::FeaturePython, MountPlate)预期模型树里多出一个MountPlate3D 视区还是空的——形状还没生成这很正常。第二步声明参数。输入参数名、类型、默认值动作obj.addProperty(App::PropertyLength, BaseLength, Dimensions) obj.addProperty(App::PropertyLength, BaseWidth, Dimensions) obj.addProperty(App::PropertyLength, Height, Dimensions) obj.addProperty(App::PropertyInteger, HoleCount, Features) obj.BaseLength 150 mm obj.BaseWidth 100 mm obj.Height 30 mm obj.HoleCount 6预期属性面板里能看到四个参数单位换算、合法性检查都交给 FreeCAD你不用自己写。第三步写 proxy 并触发重算。输入一个生成几何的类动作class MountPlate: def __init__(self, obj): obj.Proxy self def execute(self, obj): box Part.makeBox(obj.BaseLength.Value, obj.BaseWidth.Value, obj.Height.Value) y obj.BaseWidth.Value / 2.0 for i in range(1, obj.HoleCount 1): x obj.BaseLength.Value * i / (obj.HoleCount 1) box box.cut(Part.makeCylinder(5, obj.Height.Value, FreeCAD.Vector(x, y, 0))) obj.Shape box MountPlate(obj) doc.recompute()预期一块 150×100×30、中间一排 6 个通孔的安装板出现在视区里。之后把参数包进函数改参数就是调函数obj.HoleCount 10 obj.BaseLength 200 mm obj.Proxy.execute(obj) # 脚本里改完参数要手动推一把预期孔位间距自动重排板长变成 200mm。这些板生成后可以直接丢进装配模块里做布局效果类似仓库自带示例data/examples/AssemblyExample.FCStd的样子。三个新手最容易踩的坑坑一单位对象直接当数字传。obj.BaseLength是个 QuantityPart.makeBox只吃 float。makeBox(obj.BaseLength, ...)会抛出莫名其妙的类型错误加上.Value就没事了——上文的代码里我处处带着它不是啰嗦。坑二改完参数模型纹丝不动。和 C 特征不同Part::FeaturePython不会在属性变化时自动重算。交互编辑面板里想实时预览就在赋值后手动调obj.Proxy.execute(obj)齿轮的任务面板就是这么做的而doc.recompute()是另一种更正式的触发方式两者都认。坑三改过属性结构老文件打不开。给对象改属性名、换分组旧文档里存的对象会缺属性。FreeCAD 在加载时会自动回调 proxy 的onDocumentRestored你在里面用hasattr补齐缺失属性即可仓库里齿轮的实现 InvoluteGearFeature.py 就带了这种迁移钩子def onDocumentRestored(self, obj): if not hasattr(obj, HoleCount): obj.addProperty(App::PropertyInteger, HoleCount, Features)再补一句脚本驱动的快速建模用 Part 模块最顺手要给用户看特征树这种体验再上 PartDesign 的 Body两者不冲突。手动建 10 版和跑一条脚本的差距把同一个需求做两种做法对比一下就很直观手动10 个规格的安装板每版进草图改尺寸、挪孔位、重画按每版 3 分钟算也要半小时中途写错一个数就得推倒重来脚本create_mount_plate(150,100,30,6)这样的调用循环一遍整族零件秒级生成尺寸零手输def create_mount_plate(spec): l, w, h, n (float(v) for v in spec.split(,)) o doc.addObject(Part::FeaturePython, fPlate_{int(n)}hole) o.BaseLength f{l} mm o.BaseWidth f{w} mm o.Height f{h} mm o.HoleCount int(n) MountPlate(o) return o for spec in [150,100,30,6, 150,100,30,8, 200,120,40,10]: create_mount_plate(spec)省下来的不只是时间参数和几何永远同源客户改需求时你只改一个字符串数组还可以顺手批量导出 STEP 给制造端。往哪儿延伸用属性表达式绑定把跨对象参数串起来一个总参数驱动整个装配生成的零件直接喂给 FEM 模块顺手跑一次壁厚和应力校验打通 CAM 模块从参数一路走到刀路选一个你最近反复改过三遍以上的零件把它最容易变的那 3 个参数变成addProperty再跑一次批量生成——这条流水线就算真正长在你手上了。【免费下载链接】FreeCADOfficial source code of FreeCAD, a free and opensource multiplatform 3D parametric modeler.项目地址: https://gitcode.com/GitHub_Trending/fr/FreeCAD创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考