FreeCAD二次开发案例:机械零件自动生成工具开发
在机械设计领域,工程师常常需要重复创建标准零件,如齿轮、链轮等,传统手动建模不仅耗时且易出错。本文将以FreeCAD为基础,通过开发一个机械零件自动生成工具,展示如何利用FreeCAD的Python API实现参数化建模,显著提升设计效率。
开发环境与项目结构
FreeCAD作为一款开源的3D参数化建模软件,提供了丰富的二次开发接口。本工具基于FreeCAD的PartDesign模块开发,主要涉及以下文件和目录:
- 核心模块:src/Mod/PartDesign/,包含零件设计相关的核心功能
- 齿轮生成示例:src/Mod/PartDesign/InvoluteGearFeature.py,提供渐开线齿轮的参数化生成实现
- 任务面板:src/Mod/PartDesign/TaskExtrudeParameters.h,定义了参数编辑界面
- 工作流管理:src/Mod/PartDesign/Workbench.cpp,实现自定义工作台
参数化建模基础
参数化建模是通过调整参数来驱动模型形状的技术。在FreeCAD中,可通过Python API创建自定义参数化对象。以下是创建基本参数化对象的框架:
def makeCustomPart(name):
# 创建Part2DObjectPython对象
obj = FreeCAD.ActiveDocument.addObject("Part::Part2DObjectPython", name)
# 附加自定义属性和行为
_CustomPart(obj)
if FreeCAD.GuiUp:
# 附加视图提供者
_ViewProviderCustomPart(obj.ViewObject)
return obj
class _CustomPart:
def __init__(self, obj):
# 设置对象类型
self.Type = "CustomPart"
# 添加自定义属性
obj.addProperty("App::PropertyLength", "Length", "Dimensions", "Length of the part")
obj.Length = "100 mm"
obj.Proxy = self
def execute(self, obj):
# 模型生成逻辑
shape = Part.makeBox(obj.Length.Value, 50, 20)
obj.Shape = shape
齿轮生成工具实现
以渐开线齿轮为例,分析自动生成工具的实现过程。FreeCAD的PartDesign模块已内置齿轮生成功能,其核心实现位于src/Mod/PartDesign/InvoluteGearFeature.py。
参数定义
在_InvoluteGear类的初始化方法中,定义了齿轮的关键参数:
def _ensure_properties(self, obj, is_restore):
# 添加齿轮参数
obj.addProperty("App::PropertyInteger", "NumberOfTeeth", "Gear", "Number of gear teeth")
obj.addProperty("App::PropertyLength", "Modules", "Gear", "Module of the gear")
obj.addProperty("App::PropertyAngle", "PressureAngle", "Gear", "Pressure angle of gear teeth")
# 设置默认值
obj.NumberOfTeeth = 26
obj.Modules = "2.5 mm"
obj.PressureAngle = "20 deg"
几何生成
execute方法是生成齿轮几何形状的核心,通过调用fcgear库实现渐开线齿轮的计算:
def 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,
split=obj.HighPrecision, addCoeff=obj.AddendumCoefficient, dedCoeff=obj.DedendumCoefficient,
filletCoeff=obj.RootFilletCoefficient, shiftCoeff=obj.ProfileShiftCoefficient)
# 创建齿轮轮廓
gearw = Part.Wire([o.toShape() for o in w.wire])
obj.Shape = gearw
用户界面
通过任务面板实现参数交互界面,src/Mod/PartDesign/TaskExtrudeParameters.cpp定义了参数编辑窗口,用户可实时调整参数并预览结果:
class _InvoluteGearTaskPanel:
def __init__(self, obj, mode):
self.obj = obj
# 加载UI文件
self.form=FreeCADGui.PySideUic.loadUi("InvoluteGearFeature.ui")
# 绑定参数变化事件
self.form.spinBox_NumberOfTeeth.valueChanged.connect(self.updateGear)
自定义零件生成工具开发
基于上述齿轮生成原理,开发一个自定义零件生成工具的步骤如下:
1. 创建FeaturePython对象
class _CustomPart:
def __init__(self, obj):
self.Type = "CustomPart"
# 添加自定义属性
obj.addProperty("App::PropertyLength", "Length", "Dimensions", "Length of the part")
obj.addProperty("App::PropertyLength", "Width", "Dimensions", "Width of the part")
obj.addProperty("App::PropertyLength", "Height", "Dimensions", "Height of the part")
obj.Length = "100 mm"
obj.Width = "50 mm"
obj.Height = "20 mm"
obj.Proxy = self
def execute(self, obj):
# 创建长方体
shape = Part.makeBox(obj.Length.Value, obj.Width.Value, obj.Height.Value)
obj.Shape = shape
2. 实现视图提供者
class _ViewProviderCustomPart:
def __init__(self, vobj):
vobj.Proxy = self
def getIcon(self):
return ":/icons/PartDesign_CustomPart.svg"
def attach(self, vobj):
self.ViewObject = vobj
self.Object = vobj.Object
3. 创建命令
class CommandCustomPart:
def GetResources(self):
return {'Pixmap': 'PartDesign_CustomPart',
'MenuText': "Custom Part",
'ToolTip': "Create a custom part"}
def Activated(self):
FreeCAD.ActiveDocument.openTransaction("Create custom part")
obj = makeCustomPart("CustomPart")
FreeCAD.ActiveDocument.recompute()
def IsActive(self):
return FreeCAD.ActiveDocument is not None
工具集成与扩展
添加到工作bench
修改src/Mod/PartDesign/Workbench.cpp,将自定义工具添加到PartDesign工作台:
void Workbench::Initialize()
{
// 添加命令到工具栏
Gui::ToolBarItem* partdesign = new Gui::ToolBarItem(Gui::ToolBarItem::getRoot(), "PartDesign");
partdesign->setCommand("PartDesign");
partdesign->addCommand("PartDesign_CustomPart");
}
支持更多零件类型
参考齿轮生成的实现,可扩展支持其他标准零件:
- 链轮:src/Mod/PartDesign/SprocketFeature.py
- 弹簧:src/Mod/PartDesign/Scripts/Spring.py
- 螺栓:src/Mod/PartDesign/Scripts/DistanceBolt.py
总结与展望
通过FreeCAD的二次开发接口,我们可以快速构建机械零件自动生成工具,显著提升设计效率。未来可进一步扩展:
- 参数化库:建立标准零件参数化库,如ISO标准件
- 批量生成:开发基于Excel表格的批量零件生成功能
- CAD标准检查:集成设计规则检查,确保零件符合行业标准
本案例展示了FreeCAD二次开发的基本流程和关键技术点,开发者可根据实际需求扩展更多功能。完整代码可参考src/Mod/PartDesign/目录下的相关文件。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust099- DDeepSeek-V4-ProDeepSeek-V4-Pro(总参数 1.6 万亿,激活 49B)面向复杂推理和高级编程任务,在代码竞赛、数学推理、Agent 工作流等场景表现优异,性能接近国际前沿闭源模型。Python00
MiMo-V2.5-ProMiMo-V2.5-Pro作为旗舰模型,擅⻓处理复杂Agent任务,单次任务可完成近千次⼯具调⽤与⼗余轮上 下⽂压缩。Python00
GLM-5.1GLM-5.1是智谱迄今最智能的旗舰模型,也是目前全球最强的开源模型。GLM-5.1大大提高了代码能力,在完成长程任务方面提升尤为显著。和此前分钟级交互的模型不同,它能够在一次任务中独立、持续工作超过8小时,期间自主规划、执行、自我进化,最终交付完整的工程级成果。Jinja00
Kimi-K2.6Kimi K2.6 是一款开源的原生多模态智能体模型,在长程编码、编码驱动设计、主动自主执行以及群体任务编排等实用能力方面实现了显著提升。Python00
MiniMax-M2.7MiniMax-M2.7 是我们首个深度参与自身进化过程的模型。M2.7 具备构建复杂智能体应用框架的能力,能够借助智能体团队、复杂技能以及动态工具搜索,完成高度精细的生产力任务。Python00