之前的文章介绍了怎么用AI来编程,这次再上升一个难度,利用AI来生成有限元的零件。运用到的工具是 Claude code,Matlab MCP和我的开源工具箱Baffalo。
Baffalo的工具箱,我很早就开始构思接入AI, 你可以理解为这个工具箱是一个 参数化 的零件库。我个人觉得参数化是AI通往各个垂直领域最便捷的途径,不同于通用模型的几十亿参数,参数化将问题的复杂度降到最低。也就是说,并不需要通过训练、微调来达到目的,只需要将过去企业所用的工具模板化、参数化,告诉AI怎么用即可。
形成 skills
首先我跟AI对话,让他学习 Baffalo 的代码风格和结构,同时针对 轴类零件,我让他测试代码,生成报告。
测试完成后,告诉AI当我要生成轴零件时,调用对应的代码
生成零件
形成skills后,我告诉AI, 生成一根长500mm, 直径为50mm的轴
% Create a 500mm long, 50mm diameter solid shaft
% 创建长500mm、直径50mm的实心轴
%
% Author: Generated by Claude Code
% Date: 2026-01-31
clc
clear
close all
%% 轴参数定义
fprintf('========================================\n');
fprintf('轴参数定义\n');
fprintf('========================================\n');
fprintf('长度: 500 mm\n');
fprintf('外径: 50 mm\n');
fprintf('内径: 0 mm (实心)\n\n');
%% 输入参数
% 定义轴的几何参数
inputShaft.Length = 500; % 总长度 [mm]
inputShaft.ID = [0, 0]; % 内径 [mm],0表示实心
inputShaft.OD = [50, 50]; % 外径 [mm],保持不变
%% 可选参数
paramsShaft = struct();
paramsShaft.Name = 'Shaft_500mm_D50mm'; % 轴名称
paramsShaft.Order = 1; % 单元阶次:1=一阶,2=二阶
paramsShaft.E_Revolve = 40; % 旋转划分数(圆周分段)
paramsShaft.Beam_N = 16; % 梁截面圆周分段数
paramsShaft.N_Slice = 50; % 切片数量
paramsShaft.Echo = 1; % 打印信息
%% 创建轴对象
fprintf('========================================\n');
fprintf('创建轴对象...\n');
fprintf('========================================\n');
obj = shaft.Commonshaft(paramsShaft, inputShaft);
%% 求解
fprintf('========================================\n');
fprintf('求解中...\n');
fprintf('========================================\n');
obj = obj.solve();
%% 绘图
fprintf('========================================\n');
fprintf('绘制图形...\n');
fprintf('========================================\n');
% 2D截面图
fprintf('绘制2D截面...\n');
Plot2D(obj);
% 3D图形
fprintf('绘制3D模型...\n');
Plot3D(obj);
%% 网格信息
fprintf('========================================\n');
fprintf('网格统计信息\n');
fprintf('========================================\n');
fprintf('节点数: %d\n', size(obj.output.SolidMesh.Vert, 1));
fprintf('面数: %d\n', size(obj.output.SolidMesh.Face, 1));
%% 获取材料信息
fprintf('========================================\n');
fprintf('材料信息\n');
fprintf('========================================\n');
fprintf('材料名称: %s\n', obj.params.Material.Name);
fprintf('密度: %.2e kg/mm^3\n', obj.params.Material.Dens);
fprintf('弹性模量: %.2e MPa\n', obj.params.Material.E);
fprintf('泊松比: %.3f\n', obj.params.Material.v);
fprintf('热膨胀系数: %.2e /K\n', obj.params.Material.a);
%% 边界标记说明
fprintf('========================================\n');
fprintf('边界标记说明\n');
fprintf('========================================\n');
fprintf('101: 外表面\n');
fprintf('201: 内表面(无,因为ID=0)\n');
fprintf('301: 左端面 (x=0mm)\n');
fprintf('302: 右端面 (x=500mm)\n\n');
%% 输出STL文件(可选)
fprintf('========================================\n');
fprintf('输出STL文件...\n');
fprintf('========================================\n');
OutputSTL(obj);
%% 完成信息
fprintf('========================================\n');
fprintf('轴创建完成!\n');
fprintf('========================================\n');
fprintf('文件名: %s.stl\n', obj.params.Name);
fprintf('实体装配: 已创建\n');
fprintf('梁装配: 已创建\n');
fprintf('========================================\n');
%% 可选:导出ANSYS文件(如果需要)
% fprintf('输出ANSYS文件...\n');
% ANSYS_Output(obj.output.Assembly);
% fprintf('ANSYS文件已生成\n');
%% 显示图形
figure('Position', [100, 100, 1200, 400]);
% 2D截面
subplot(1, 2, 1);
Plot(obj.output.Surface);
title('2D截面');
axis equal;
% 3D模型
subplot(1, 2, 2);
PlotFace(obj.output.SolidMesh);
title('3D实体模型');
axis equal;
同时令我意外的是,他还标注了如果要导出ANSYS,可以使用下列代码
%% 可选:导出ANSYS文件(如果需要)
% fprintf('输出ANSYS文件...\n');
% ANSYS_Output(obj.output.Assembly);
% fprintf('ANSYS文件已生成\n');
导出的轴如下,因为我之前专门对轴的网格进行了优化,导出轴的网格是非常好的。
依据图纸生成模型
这里我也测试了依据图纸来生成有限元模型,这部分功能需要你按照额外的图像识别的mcp, 我用的智谱的模型。

AI虽然给我了生成了模型,但是准确度不行,生成的是完全不一样的模型。我觉得这里也不用较真,这其实是通用模型的能力问题,之后有机会我会找更好的模型来测试。

我把相关的测试文件上传到了我的项目中。
https://github.com/FE-Berserker/Baffalo
位于Testing/001_Demo/001_Commonshaft的子路径下
同时我也将skills打包上传,也就是说你也可以基于我的skills生成零件。目前测试的零件还不多,后续我还会上传更多的skills。
大家帮忙给我点tokens钱,我的tokens不够了/(ㄒoㄒ)/~~
本网站基于Hexo 3-Hexz主题生成。如需转载请标注来源,如有错误请批评指正,欢迎邮件至 392176462@qq.com