这次要从哪几张图开始
先打开零件图。左边的正视轮廓告诉你沿轴看过去是什么形状,右边的厚度示意补上第三个方向。转子看起来像一块圆角三角形;壳体的内腔则有自己的轮廓,不能直接画一个椭圆代替。
图中有四类零件:壳体、转子、侧板和轴套。侧板在装配时用两件,所以最终模型里会有五件零件。下面是完成核心建模后可以观察到的结构:隐藏前侧板和外侧轴套,就能看见转子与壳体内腔的关系。
下载图纸输入包,解压到一个新建的练习文件夹,再让你使用的本地智能体把这个文件夹作为工作区。这里需要能读取文件、编写并执行脚本的智能体。开始前,让它确认能读取图纸,并检查本机的建模环境。
输入包中的材料一起使用:
左右滑动,查看完整表格
| 材料 | 用来回答什么问题 |
|---|---|
core-parts.svg | 零件长什么样,厚度、孔径是多少? |
assembly-layout.svg | 各零件沿轴放在哪里,哪些中心需要对齐? |
dimensions.json | 图上标注的数值,供程序直接读取。 |
contours.json | 壳体和转子的复杂轮廓,供程序准确建立曲线。 |
后两份是保存结构化数据的 JSON 文件。你可以直接把它们交给智能体,不必手工抄数。曲线附件很关键:只有厚度和外框大小,还不足以确定转子和内腔的完整形状。
本例用 build123d 根据尺寸生成三维实体,再用 Blender 查看装配。build123d 是由 Python 脚本调用的建模工具;读者负责说明目标和检查结果,脚本由智能体处理。配套参考实现已在 Python 3.12、build123d 0.13.0、Blender 5.2 环境运行。
可以先发这段准备请求:
把这个文件夹作为本次转子发动机建模的工作区。 检查四份输入文件是否能读取,并检查现有 Python、build123d 和 Blender 环境。 本例参考实现使用 build123d 0.13.0。缺少它时,在练习文件夹内创建独立 Python 环境,安装这个版本并确认可以导入。 Blender 若已安装,找到它的可执行文件。先告诉我环境是否就绪、还缺什么。
这段安装请求是跟练建议;本次制作复用了已有环境,未在全新电脑上验证安装。若工具只回复了安装说明,仍需要它实际执行并确认可用。环境卡住时,把真实报错留在同一任务中继续处理;材料说明也提供了参考脚本的运行方法。
材料说明与参考脚本的运行方法
转子发动机教学材料
本包的二维图纸和装配图为2026-10-24补绘,依据本聊天原创名义核心模型整理,用于练习从图纸建模。数值不是厂家尺寸,未指定制造公差。
先读 core-parts.svg 和 assembly-layout.svg。dimensions.json 保存标注数值;contours.json 保存四条复杂封闭轮廓,避免从图片猜曲线。四者共同组成输入。图片的“侧向厚度示意”不应被当作同一比例的正式三视图。
build_from_drawings.py 是可检查、可修改的参考实现。使用已有的 Python 3.12 与 build123d 0.13.0 环境,在本目录运行:
python build_from_drawings.py --output ./output/base
python build_from_drawings.py --output ./output/plate9 --plate-depth 9没有 build123d 时,让你使用的本地智能体在这个练习文件夹创建独立Python环境,安装并核对 build123d==0.13.0,确认能导入后再执行。此安装请求为教学建议;本次实际复用了已有环境,未验证全新机器安装。
每次得到四类STEP及STL、五件组成的 core-assembly.step 和 result.json。前后侧板共享一个零件定义,在装配中使用两次。脚本使用输入文件中的尺寸,侧板厚度可用参数覆盖;修改曲线或其它尺寸前先另存材料副本。JSON图纸给出的是基线7毫米的装配坐标,9毫米变体由脚本按厚度重新计算坐标。
Blender 5.2中可用本机可执行文件运行:
blender --background --factory-startup --disable-autoexec --python-exit-code 12 --python preview_in_blender.py -- ./output/base若 blender 命令找不到,让智能体定位本机已经安装的可执行文件,再运行同一脚本。macOS本次使用 /Applications/Blender.app/Contents/MacOS/Blender;其他平台没有在本次重测。
输出 core-assembly.blend 保存装配姿态;两张PNG为另外生成的展开图和同时隐藏前侧板与外侧轴套的内部观察图。网格使用毫米坐标;工程设置为一个Blender单位对应1毫米。打开工程后,可在对象列表选 front-plate 和 outer-sleeve,按H临时隐藏查看转子,Alt+H恢复显示。
要改尺寸,修改参数并重建STEP,再重新导入生成预览。Blender中移动网格适合观察装配位置,不会自动改变STEP或原参数。源脚本保留本课参数修改方式,STEP保存交换实体,BLEND保存预览与材质。
素材与脚本均为本案例自编教学材料。原始来源与新执行记录保存在教程证据目录;本包不包含第三方厂家图纸。完整首页成品中的装饰细节和动画未打包为这次核心建模的自动输出。
先让 AI 把图纸读成建模要求
先把尺寸和形状读清楚,后面的建模才有依据。不要只发一张成品照片,再要求它“做成一样的”;这次手里已经有图纸,可以让每个关键尺寸对应到具体零件。
先读零件图、装配图以及两份数据附件,暂时不要建模。 按零件整理:外轮廓依据、厚度、孔的直径,以及装配时的位置。 把明确给出的信息和仍不清楚的地方分开列出。尺寸单位统一用毫米。 复杂轮廓使用曲线附件,不要根据图片比例猜尺寸。若图和数据不一致,指出具体位置,等我处理。
下面是依据这套材料整理的读图示范,可以用它核对智能体的理解;它是作者编写的对照表。
左右滑动,查看完整表格
| 零件 | 应读出的信息 | 容易看错的地方 |
|---|---|---|
| 转子 | 厚 42,中心通孔直径 52,外轮廓使用 rotor 曲线 | 52 是孔径,不能当成零件厚度。 |
| 壳体 | 厚 48,外轮廓用 outer,内腔用 housing | 内腔贯穿整个厚度;复杂曲线不能换成椭圆。 |
| 侧板 | 厚 7,中心通孔直径 24.6,外轮廓用 flange | 同一零件定义会用于前、后两处。 |
| 轴套 | 外径 38,内径 20,长度 9 | 两个直径共同决定环形截面,中心要留空。 |
“通孔”意味着孔贯穿零件。本例的四种厚度、三个中心孔和轴套外径都已经明确;图中没有给出螺纹、密封槽和螺栓孔的位置,可以先把它们列为未定义细节。
检查时重点看理解是否影响下一步。例如,AI 若把壳体写成“外轮廓拉伸后封底”,就需要在建模前纠正:图上的内腔贯穿壳体,前后由独立侧板覆盖。若把曲线理解成椭圆,则让它回到附件中的 housing 轮廓。
从轮廓和厚度做出四类零件
这里最容易理解的动作是“拉伸”:先在平面上画出封闭区域,再给它一个厚度。转子使用外轮廓和中心孔围成的区域,拉伸 42 毫米;壳体则使用外轮廓与内腔之间的区域,拉伸 48 毫米。
你不需要先学会编写几何代码,但要让 AI 保留尺寸的来源。把 42 散落在很多行代码里,下一次改厚度就容易漏改;从统一的参数文件读取,修改会更清楚。
核对完读图结果后,在同一任务中发出这份建模请求:
按核对后的尺寸,用 build123d 建立四类独立实体,并实际运行构建脚本。前后侧板使用同一个零件定义。 本轮先完成图纸已经定义的外轮廓、内腔和孔;未标注的螺纹、密封槽和螺栓孔先不添加。 尺寸从 dimensions.json 读取,轮廓从 contours.json 读取。 曲线按附件约定每4点取样,建立闭合插值样条;孔按标注直径建立圆形通孔。 分别导出转子、壳体、侧板和轴套的 STEP 文件,同时保留 Python 源脚本。 导出后重新读取文件,检查每个零件是否为一个有效实体,列出实际厚度和孔径。结果放到 output/base。
STEP 用于在建模软件之间交换三维实体。拿到回复后,要能找到真正的文件,并能打开检查;一句“模型已经完成”还不能说明文件已生成。
本次配套脚本实际生成了四类 STEP,重新读取后,每类均为一个有效实体。进一步从导出文件测量,得到下面的结果:
左右滑动,查看完整表格
| 实际导出文件 | 实测厚度 / 长度 | 实测圆孔与外径 |
|---|---|---|
rotor-blank.step | 42 mm | 中心孔直径 52 mm |
trochoid-housing.step | 48 mm | 内腔沿给定曲线生成 |
side-plate-blank.step | 7 mm | 中心孔直径 24.6 mm |
bearing-sleeve.step | 9 mm | 内径 20 mm,外径 38 mm |
这是配套脚本的真实构建结果,文中的教学请求与它分别保留。如果你的智能体执行失败,继续交代:
这是刚才执行的完整报错。请结合当前脚本和输入文件定位原因,保留原输入,修复后重新构建到新目录。 重新检查实际生成的文件,再告诉我哪些零件完成了、哪些仍失败。
查看参考脚本 build_from_drawings.py
"""教学材料的可复跑构建脚本;参数、轮廓和输出分离。"""
from pathlib import Path
import argparse, json, math
from build123d import Vector, Wire, Face, Spline, extrude, export_step, import_step, export_stl, Compound, Pos
p=argparse.ArgumentParser()
p.add_argument('--materials', type=Path, default=Path(__file__).resolve().parent)
p.add_argument('--output',type=Path,required=True)
p.add_argument('--plate-depth',type=float)
a=p.parse_args(); a.output.mkdir(parents=True,exist_ok=True)
d=json.loads((a.materials/'dimensions.json').read_text())
c=json.loads((a.materials/'contours.json').read_text())
assert d['units']==c['units']=='mm'
pd=a.plate_depth if a.plate_depth is not None else d['side_plate']['depth']
assert 0<pd<40
def curve(key):
return Wire([Spline(*[Vector(x,y,0) for x,y in c[key][::4]],periodic=True)])
def annulus(outer,inner,depth):
return extrude(Face(Wire.make_circle(outer/2),[Wire.make_circle(inner/2)]),amount=depth)
rotor=extrude(Face(curve('rotor'),[Wire.make_circle(d['rotor']['bore_diameter']/2)]),amount=d['rotor']['depth'])
housing=extrude(Face(curve('outer'),[curve('housing')]),amount=d['housing']['depth'])
plate=extrude(Face(curve('flange'),[Wire.make_circle(d['side_plate']['bore_diameter']/2)]),amount=pd)
bearing=annulus(d['bearing_sleeve']['outer_diameter'],d['bearing_sleeve']['bore_diameter'],d['bearing_sleeve']['depth'])
parts={'rotor-blank':rotor,'trochoid-housing':housing,'side-plate-blank':plate,'bearing-sleeve':bearing}
rows=[]
for name,part in parts.items():
export_step(part,a.output/f'{name}.step'); back=import_step(a.output/f'{name}.step')
export_stl(part,a.output/f'{name}.stl',tolerance=.05,angular_tolerance=.1)
dim=part.bounding_box().size
row={'name':name,'valid':bool(part.is_valid),'solids':len(part.solids()),'readback_valid':bool(back.is_valid),'readback_solids':len(back.solids()),'depth_mm':dim.Z,'volume_mm3':part.volume,'roundtrip_volume_difference_mm3':abs(part.volume-back.volume)}
assert row['valid'] and row['readback_valid'] and row['solids']==row['readback_solids']==1 and row['roundtrip_volume_difference_mm3']<.001
rows.append(row)
h=d['housing']['depth']/2;r=d['rotor']['depth']/2;e=d['assembly']['eccentric_offset_x']
placements=[{'name':'housing','part':'trochoid-housing','xyz':[0,0,-h]}, {'name':'rotor','part':'rotor-blank','xyz':[e,0,-r]}, {'name':'rear-plate','part':'side-plate-blank','xyz':[0,0,-h-pd]}, {'name':'front-plate','part':'side-plate-blank','xyz':[0,0,h]}, {'name':'outer-sleeve','part':'bearing-sleeve','xyz':[0,0,h+pd]}]
assembly=Compound(children=[Pos(*i['xyz'])*parts[i['part']] for i in placements]);export_step(assembly,a.output/'core-assembly.step')
back=import_step(a.output/'core-assembly.step');assert len(back.solids())==5 and back.is_valid
report={'identity':'本次教学补绘材料的实际脚本执行;非历史智能体回复或制造验收','units':'mm','plate_depth_mm':pd,'parts':rows,'placements':placements,'assembly_readback_solids':len(back.solids()),'assembly_readback_valid':bool(back.is_valid),'scope':'四类核心实体和静态装配;未包含运动、齿轮、密封与外观装饰','passed':True}
(a.output/'result.json').write_text(json.dumps(report,ensure_ascii=False,indent=2)+'\n')
print(json.dumps(report,ensure_ascii=False,indent=2))
按同一基准把零件装起来
四个零件文件各自打开正常,还需要明确它们相对于彼此的位置。看装配关系图:本例把壳体厚度的中面设为 z=0,轴向前后位置都从这个面计算。
壳体厚 48,因此沿轴占据 z=-24 到 z=24。前侧板接在前端,厚 7,占据 24 到 31;后侧板接在后端,占据 -31 到 -24。这样建立位置关系,改厚度时才知道应该往哪边延伸。
转子的中心还有一个容易忽略的区别:在图示初始姿态下,它相对壳体中心向右偏了 8 毫米。这个距离叫偏心距。若只要求“把所有零件居中”,就会把这项关系抹掉。
按装配图建立五件组成的核心模型,保存装配 STEP,并生成 Blender 预览工程。 以壳体中面为 z=0,壳体范围为 -24到24;转子范围为 -21到21,中心放到(x=8,y=0)。 前侧板范围为24到31,后侧板为-31到-24,外侧轴套为31到40;壳体、两块侧板和轴套的中心对齐到(x=0,y=0)。 保留独立零件及清楚的名称。先保存完整装配姿态,再另输出一张沿轴分开的展开图和一张同时隐藏前侧板与外侧轴套、观察内部的图。
本次生成的展开图如下。沿轴分开只是为了看清层次;保存的 Blender 工程仍保留装配位置。
打开参考工程中的 core-assembly.blend,可以在对象列表中选中 front-plate 和 outer-sleeve,按 H 临时隐藏它们,观察内部转子;按 Alt+H 恢复显示。这里观察的是静态装配关系。转子能否完整运行,还需要另外建立运动关系并检查全过程。
对照图纸检查,再改一个尺寸
先让程序核对可以计算的项目:文件能否重新读取、实体是否有效、厚度与孔径是否符合参数。你再对照图纸判断形状有没有理解错,例如孔是否贯穿、壳体内腔是否被封住、前后侧板是否放反。
要修改时,点名对象、依据和预期变化,比“这个地方不太对”更容易执行。下面用一个教学修改来练习:把前后两块侧板从 7 毫米加厚到 9 毫米,内部空间保持原样。
另存一个新版本,把前后侧板厚度都从7毫米改为9毫米。 保留壳体和转子的尺寸及位置。侧板与壳体接触的面保持不动,新增厚度向外延伸;外侧轴套随前侧板向外移动。 重新导出四类零件和装配 STEP,并回读测量。列出实际改变和保持不变的尺寸,以及前后侧板和轴套的新位置。结果放到 output/plate9。
本次参考脚本已执行这项修改,回读结果是:侧板厚度为 9 毫米,中心孔仍为 24.6 毫米;壳体、转子和轴套本身的尺寸保持不变。装配位置也随之更新:
左右滑动,查看完整表格
| 部件 | 原来沿轴的位置 | 改厚后的位置 |
|---|---|---|
| 前侧板 | 24 到 31 | 24 到 33 |
| 后侧板 | -31 到 -24 | -33 到 -24 |
| 外侧轴套 | 31 到 40 | 33 到 42 |
这里有两个判断。第一,侧板加厚后,壳体内部空间没有被挤占;第二,轴套跟随前侧板外表面移动,没有留在旧位置。只检查“厚度变成 9”会漏掉后一个问题。
如果你的结果只改了零件厚度,装配位置还停在旧值,就把上表对应的关系交给 AI,要求重新计算位置并导出。原版本保留在 output/base,新版本放在 output/plate9,方便随时回到上一个可用结果。
保留能继续修改的工程
完成后,把图纸、尺寸与曲线文件、构建脚本和输出工程一起保存。它们各有用途:参数文件记录本次尺寸,Python 脚本保留建模步骤,STEP 传递实体,Blender 工程用来观察装配与调整展示效果。
以后要改孔径或厚度,先改参数并重新生成实体,再更新预览。只在 Blender 里拉大一个网格,不会自动修改原来的 STEP 和建模参数。
我们首页的转子发动机,后来还增加了散热片、螺栓、接口、材质和连续镜头,形成了下面的展示效果。
从本课核心模型走到这个外观,需要继续补充细节设计。可以把工作交代成:“保留已经核对的壳体、转子和装配基准,参考这张成品图列出还需要补充的外部零件;分别说明哪些已有尺寸,哪些需要设计后确定。”拿到清单后再逐项补建,避免把没有标注的细节误当成图纸事实。
这次练习完成时,你应当已经能打开核心装配、对回图纸中的关键尺寸,并让侧板改厚后的零件和位置一起更新。再换成自己的图纸时,先沿用这三个动作:读清形状与尺寸,建立共同基准,改动后检查相邻部件。