
1. 项目概述为什么程序化建模是下一个设计范式如果你和我一样在机械设计、产品原型开发或者3D打印领域摸爬滚打了好些年一定经历过这样的场景客户一个电话过来“这个零件的安装孔位置需要根据新版本的主板调整一下从原来的5个改成7个分布圆直径也要改”。你打开那个复杂的装配体文件找到那个零件进入草图开始一个个地删除约束、修改尺寸、重新阵列……一通操作下来半小时过去了还得祈祷别把其他关联特征搞崩了。这种基于图形界面GUI的“手工”建模在应对频繁变更和系列化设计时效率瓶颈和出错风险是显而易见的。这正是“程序化建模”要解决的核心痛点。它不再依赖于鼠标点击和菜单操作来“雕刻”模型而是通过编写代码来“描述”模型。CadQuery正是这个领域里一个强大而优雅的Python库。你可以把它理解为3D建模领域的“NumPy”或“Pandas”——用数据驱动几何体的生成。这次分享的“33个CadQuery程序化建模实例”不是一个简单的代码合集而是一套从入门到精通的实战路径图。它旨在通过具体、可运行的例子手把手带你跨越从理解概念到实际产出的鸿沟让你真正掌握用代码“创造”三维实体的能力。掌握CadQuery意味着你能将设计逻辑固化在脚本中。修改一个参数整个模型及其所有关联特征自动更新可以轻松实现参数化设计、系列化变体、基于算法的生成式设计还能无缝集成到你的CI/CD流程中实现设计的自动化测试与发布。无论你是想自动化繁琐的建模任务探索创成式设计还是构建属于自己的零件库和设计工具链这33个实例都将为你打下坚实的基础。接下来我将以一个从业者的视角为你深度拆解这些实例背后的设计哲学、核心技法以及那些只有踩过坑才知道的实操细节。2. 核心思路与实例架构解析2.1 设计哲学从“如何画”到“如何描述”传统CAD建模的思维是过程性的“先拉伸这个草图再在这里打个孔然后倒个圆角”。CadQuery倡导的是一种声明式与构建式结合的思维。你更多地是在描述模型的构成逻辑和约束关系。例如描述一个带法兰的管件你的代码逻辑可能是“创建一个圆柱体作为主管道在管道末端创建一个同心的、更大直径的薄圆盘作为法兰在法兰上以某个分布圆为参考生成一系列的通孔。” 在这个过程中你关注的是特征之间的几何关系同心、同轴、偏移而不是具体的鼠标操作步骤。这33个实例正是遵循这种思维演进的。它们不是随机堆砌而是有意识地构建了一个学习梯度基础几何体与布尔运算熟悉点、线、面、体的代码化创建与组合如立方体、圆柱、球体的并、交、差。草图与约束学习在二维平面上绘制轮廓并施加几何约束水平、垂直、相切和尺寸约束。特征操作掌握拉伸、旋转、扫掠、放样等核心造型方法以及倒角、圆角、抽壳等修饰操作。变换与阵列运用移动、旋转、镜像、线性阵列、环形阵列来高效复制和排列特征。高级引用与定位理解和工作平面Workplane的概念学习如何引用已有模型的边、面作为新特征的基准。参数化与程序逻辑将尺寸定义为变量引入循环、条件判断实现一个脚本生成多种变体。实战装配与工程图将多个零件组合成装配体并导出带尺寸标注的二维工程图。这个架构确保了学习者能够层层递进最终获得独立解决复杂建模问题的能力。2.2 工作平面CadQuery的“三维坐标纸”这是CadQuery中最核心也最需要理解的概念几乎所有实例都会用到。你可以把Workplane想象成一张无限大的、有方向的坐标纸。所有的草图绘制和特征创建都发生在这张“纸”所在的平面上。初始状态下CadQuery默认在XY平面Z0上创建了一个工作平面。当你执行cq.Workplane(“XY”)时就意味着你准备在这个平面上开始“作图”了。后续的circle()、rect()等草图命令其坐标都是相对于这个工作平面的。它的强大之处在于可传递性和可变换性。当你从一个实体上选取一个面faces()并基于它创建新的工作平面workplane()时你就将这张“坐标纸”贴在了那个面上。接下来在这个新平面上绘制的草图将自动垂直于该面并以其为基准进行拉伸等操作。这是构建复杂、关联特征的关键。注意新手常犯的错误是忽略了工作平面的当前状态。在一个倾斜的工作平面上画了一个圆然后直接拉伸结果发现拉伸方向不是自己预期的世界坐标轴方向。时刻清楚“我现在在哪张纸上画画”是写出正确代码的第一步。2.3 实例选取标准覆盖度与实用性并重这33个实例的选取充分考虑了实用性和教学性。它们大致可以归为以下几类标准机械零件如螺栓、螺母、齿轮、弹簧、轴承座。这些实例教你如何用参数驱动标准件的生成未来可以直接集成到你的零件库中。日常物品如杯子、手机支架、简单的花瓶。这些实例贴近生活有助于理解放样、扫掠等复杂操作。建筑与结构元素如桁架、蜂窝结构、简单的房屋框架。这类实例侧重于阵列、模式生成和空间结构描述。算法生成式设计如根据数学公式正弦曲线、螺旋线生成的曲面或实体。这展示了CadQuery在创意设计和探索性建模上的潜力。工作流实例如如何从CSV文件读取数据批量生成零件如何将多个零件组装并检查干涉。这体现了程序化建模与外部数据、自动化流程结合的价值。每一个实例都力求解决一个或多个特定的技术点同时其产出物本身也具有参考或使用价值。3. 关键技法深度剖析与避坑指南3.1 草图约束让设计“活”起来在图形界面中我们通过鼠标拖拽和约束工具来固定草图。在CadQuery中这一切通过代码完成更加精确和清晰。实例中会大量使用constrain参数或单独的约束方法。示例定义一个矩形板并在其中心打一个孔。import cadquery as cq # 定义参数 length 100 width 50 thickness 10 hole_dia 20 # 创建底板 # 1. 在XY平面创建草图 result (cq.Workplane(“XY”) # 2. 绘制矩形默认以原点为中心 .rect(length, width) # 3. 拉伸成实体 .extrude(thickness) # 4. 选择顶面上表面作为新的工作平面 .faces(“Z”).workplane() # 5. 在新的工作平面上绘制圆。此时原点(0,0)位于顶面中心。 .circle(hole_dia / 2) # 6. 向下切割通孔 .cutThruAll() )在这个简单的例子里矩形和圆的“同心”约束是通过工作平面的继承和定位天然实现的。因为我们在底板顶面的中心创建了新的工作平面那么在这个新平面上画的圆自然就位于顶面中心。对于更复杂的草图比如一个梯形我们需要明确各个边的关系# 假设我们需要一个上底20下底40高30的梯形且关于Y轴对称 points [ (-20, -15), # 左下角 (20, -15), # 右下角 (10, 15), # 右上角 (-10, 15) # 左上角 ] result (cq.Workplane(“XY”) .polyline(points) # 按顺序连接点 .close() # 连接首尾点闭合图形 .extrude(10) )这里的“对称”约束是通过精确计算并输入对称的坐标值来实现的。CadQuery本身也提供更高级的约束求解器通过add方法添加约束但对于大多数机械设计通过计算点坐标来定义几何关系更为直接和高效。实操心得对于复杂草图我习惯先在纸上或绘图软件中把尺寸和几何关系标清楚计算出关键点的坐标然后再翻译成CadQuery代码。这比试图在代码中直接“推演”约束要可靠得多。3.2 特征操作拉伸、旋转与扫掠这是从2D草图到3D实体的核心桥梁。拉伸 (extrude)最常用。需注意dir参数控制方向默认是工作平面法向both参数控制是否双向拉伸。对于薄壁零件extrude后配合faces(“|Z”)选择侧壁面再进行shell操作比直接用thicken更可控。旋转 (revolve)用于创建回转体。关键点是轴线的定义。实例中会教你如何用revolve(axisStart, axisEnd)来指定旋转轴。一个常见错误是草图轮廓与旋转轴相交导致生成自相交的无效实体。扫掠 (sweep)沿一条路径Path拉伸一个截面Profile。这是创建管道、线缆、弹簧配合扭曲参数的利器。最大的坑在于路径和截面的相对位置。截面必须位于路径的起点处且截面平面需要与路径在起点处垂直。通常需要先用workplane()和moveTo()等命令将工作平面精准定位到路径起点。放样 (loft)在多个截面之间创建平滑过渡的实体。要求所有截面必须都是闭合的草图且通常需要有相同数量的线段否则可能导致扭曲或失败。实例中制作花瓶或变截面连杆会详细演示。3.3 变换与阵列效率的倍增器程序化建模的优势在阵列和变换上体现得淋漓尽致。线性阵列 (rectArray,polarArray)rectArray(xCount, yCount, xSpacing, ySpacing)可以快速创建网格状的特征。这里有一个精度陷阱如果间距设置不当导致阵列后的特征边界恰好重合可能会引发后续布尔运算的奇异错误。通常建议预留一个微小的间隙如0.001mm或确保完全重叠/分离。环形阵列 (polarArray)polarArray(radius, count, angle360)。注意这里的radius是阵列圆的半径特征本身是沿着这个圆周分布的。起始角度可以通过先旋转工作平面来控制。镜像 (mirror)mirror(mirrorPlane“XZ”)。镜像操作依赖于一个基准平面。务必注意镜像操作复制的是特征如一个凸台或孔而不是对整个实体进行镜像。如果你想得到完全镜像的另一个零件需要对整个实体对象进行镜像这通常需要通过mirror结合union或直接对几何体进行变换来实现。一个综合示例创建散热鳍片fin_width 2 fin_height 20 fin_length 50 base_thickness 5 num_fins 10 # 创建基板 heat_sink cq.Workplane(“XY”).box(fin_length, fin_width * num_fins, base_thickness) # 循环创建每一个鳍片 for i in range(num_fins): # 计算每个鳍片的Y向中心位置 y_pos - (fin_width * num_fins) / 2 fin_width / 2 i * fin_width # 在每个位置创建鳍片 fin (cq.Workplane(“XY”) .moveTo(0, y_pos) # 移动到指定Y坐标X保持为0中心 .box(fin_length, fin_width, fin_height) # 创建鳍片实体 ) # 将鳍片合并到基板上 heat_sink heat_sink.union(fin) # 将所有鳍片和基板进行整体合并实际上循环中已经逐个合并了 # 更高效的做法是先将所有鳍片对象收集到列表最后一次性union但循环union对于简单模型也可接受。这个例子展示了如何用循环替代阵列在需要非均匀或条件性生成特征时循环提供了更大的灵活性。4. 从简单到复杂典型实例实现流程拆解4.1 实例1参数化螺栓——理解基准与螺纹让我们从一个经典的机械零件开始。目标是创建一个完全参数化的六角头螺栓包含螺纹部分用简化模型表示。import cadquery as cq def make_bolt(head_dia20, head_height13, shank_dia10, shank_length50, thread_length30): “”” 生成一个六角头螺栓。 :param head_dia: 螺栓头对边距离 :param head_height: 螺栓头高度 :param shank_dia: 螺杆直径 :param shank_length: 螺杆总长 :param thread_length: 螺纹段长度 “”” # 1. 创建六角螺栓头 # 使用 inscribedCircle 参数根据对边距离计算外接圆半径来画多边形 bolt (cq.Workplane(“XY”) .polygon(6, head_dia) # 6边形尺寸为对边距离 .extrude(head_height) ) # 2. 创建螺杆无螺纹部分 # 先移动到螺栓头的底面中心 bolt (bolt.faces(“Z”).workplane() # 选择底面Z负方向 .circle(shank_dia / 2) .extrude(shank_length) # 向下拉伸出螺杆 ) # 3. 简化创建螺纹段表示 # 在实际中真实螺纹建模非常复杂且没必要通常用纹理或标注表示。 # 这里我们用一段带沟槽的圆柱体示意。 thread_start_z -shank_length # 螺杆末端Z坐标 # 选择螺杆的末端面 bolt (bolt.faces(“Z”).workplane() # 此时是螺杆的底端面 .circle(shank_dia / 2) .extrude(thread_length) # 继续向下拉伸出螺纹段基础圆柱 ) # 4. 在螺纹段上切出沟槽简化螺纹 # 这里为了演示简单切一个螺旋槽。真实螺纹需要更复杂的扫掠。 # 创建一个矩形截面沿螺旋路径扫掠切除。此处省略复杂扫掠代码用环形阵列切槽代替。 for i in range(int(thread_length / 3)): # 每隔3mm切一个槽 groove_z thread_start_z - i * 3 - 1.5 # 计算槽的Z位置 groove (cq.Workplane(“XZ”) # 在XZ平面操作 .moveTo(shank_dia/2 1, groove_z) # 移动到圆柱外侧 .rect(1, 1.5) # 切一个矩形槽 .extrude(50, bothTrue) # 双向拉伸足够宽以切透 ) # 将沟槽从螺栓主体上切除 bolt bolt.cut(groove) return bolt # 生成一个M10x50的螺栓 my_bolt make_bolt(head_dia17, head_height10, shank_dia10, shank_length40, thread_length25)实现要点基准传递通过.faces(“Z”).workplane()将工作平面从螺栓头底面切换到螺杆起点确保了特征的准确定位。参数驱动所有尺寸都是函数参数改变任何一个参数螺栓模型自动更新。简化与示意真实螺纹建模计算量巨大在工程图中通常用标注和简化画法。这里用环形沟槽示意重在展示思路。对于需要真实螺纹的3D打印可以使用专门的螺纹库或特征。4.2 实例2参数化齿轮——数学与几何的结合齿轮建模是程序化建模的绝佳案例它完美结合了数学公式渐开线和几何构造。import cadquery as cq import math def make_spur_gear(module2, teeth20, pressure_angle20, thickness10): “”” 创建直齿圆柱齿轮。 :param module: 模数 :param teeth: 齿数 :param pressure_angle: 压力角度 :param thickness: 齿厚 “”” # 齿轮基本参数计算 pitch_dia module * teeth # 分度圆直径 addendum module # 齿顶高 dedendum 1.25 * module # 齿根高标准全齿高2.25*m base_dia pitch_dia * math.cos(math.radians(pressure_angle)) # 基圆直径 outer_dia pitch_dia 2 * addendum # 齿顶圆直径 root_dia pitch_dia - 2 * dedendum # 齿根圆直径 # 1. 生成单个齿的渐开线轮廓简化版使用圆弧近似 # 实际渐开线需要复杂计算这里用两段圆弧近似一个齿形。 points [] # 这里省略详细的渐开线坐标计算用一个简化轮廓代替 # 假设我们计算出了一系列构成半个齿廓的点... # points [(x0,y0), (x1,y1), ...] # 为演示我们创建一个简化齿形基于分度圆和压力角构造一个梯形齿 tooth_width_at_pitch math.pi * module / 2 # 分度圆上齿厚近似 # 构建一个齿的草图简化 tooth_points [ (root_dia/2 * math.cos(math.radians(-360/(teeth*4))), root_dia/2 * math.sin(math.radians(-360/(teeth*4)))), (outer_dia/2 * math.cos(math.radians(0)), outer_dia/2 * math.sin(math.radians(0))), (root_dia/2 * math.cos(math.radians(360/(teeth*4))), root_dia/2 * math.sin(math.radians(360/(teeth*4)))), ] # 2. 创建单个齿 a_tooth (cq.Workplane(“XY”) .polyline(tooth_points) .close() .extrude(thickness) ) # 3. 环形阵列生成所有齿 gear_body None for i in range(teeth): angle i * (360 / teeth) tooth_copy a_tooth.rotate((0,0,0), (0,0,1), angle) if gear_body is None: gear_body tooth_copy else: gear_body gear_body.union(tooth_copy) # 4. 创建齿轮坯一个圆柱体 gear_blank cq.Workplane(“XY”).circle(outer_dia/2).extrude(thickness) # 5. 将齿与齿轮坯合并实际上齿是在坯体上“长”出来的这里用合并 # 更合理的做法是先创建带齿廓的草图然后拉伸。这里为演示阵列和布尔运算。 final_gear gear_blank.union(gear_body) # 6. 添加轴孔和键槽 bore_dia 0.25 * outer_dia # 假设轴孔直径 final_gear (final_gear.faces(“Z”).workplane() .circle(bore_dia/2) .cutThruAll() ) # 添加键槽矩形切割 key_width bore_dia / 4 key_depth key_width final_gear (final_gear.faces(“Z”).workplane() .moveTo(key_depth/2, 0) .rect(key_depth, key_width) .cutThruAll() ) return final_gear # 生成一个模数220齿的齿轮 my_gear make_spur_gear(module2, teeth20)实现要点参数化计算所有几何尺寸都源于模数、齿数等基本参数确保了模型的正确性和可修改性。轮廓构建齿轮齿形是核心。实例中应包含真正的渐开线生成函数这里用简化轮廓示意。真正的实现需要根据渐开线方程计算一系列点。阵列成型通过旋转并合并单个齿的副本构建出完整的齿圈。这是程序化建模处理重复性图案的典型方式。布尔运算通过union并集、cut差集组合基本几何体形成最终复杂形状。4.3 实例3数据驱动的批量生成——从CSV到模型这是程序化建模在自动化生产中的高级应用。假设我们有一个parts.csv文件定义了要生成的一系列法兰盘的尺寸。CSV文件内容 (parts.csv):part_id, outer_dia, inner_dia, bolt_circle_dia, num_holes, hole_dia, thickness FL001, 100, 50, 80, 6, 10, 12 FL002, 150, 80, 120, 8, 12, 15 FL003, 200, 100, 160, 10, 15, 18Python脚本import cadquery as cq import csv import os def make_flange(outer_dia, inner_dia, bolt_circle_dia, num_holes, hole_dia, thickness): “””根据参数生成一个法兰盘””” # 1. 创建法兰盘主体一个圆环 flange (cq.Workplane(“XY”) .circle(outer_dia / 2) .circle(inner_dia / 2).cutThruAll() # 用内圆切割形成环 .extrude(thickness) ) # 2. 创建螺栓孔 # 在工作平面上移动到螺栓孔分布圆上的一点 flange (flange.faces(“Z”).workplane() .polarArray(bolt_circle_dia/2, num_holes, 360) .circle(hole_dia / 2) .cutThruAll() ) return flange # 读取CSV文件并批量生成 output_dir “generated_flanges” os.makedirs(output_dir, exist_okTrue) with open(‘parts.csv’, ‘r’) as csvfile: reader csv.DictReader(csvfile) for row in reader: # 转换数据类型 params {k: float(v) if k ! ‘part_id’ and k ! ‘num_holes’ else (int(v) if k ‘num_holes’ else v) for k, v in row.items()} print(f“Generating {params[‘part_id’]}...”) part make_flange(**{k: params[k] for k in params if k ! ‘part_id’}) # 导出为STEP文件文件名使用零件ID export_path os.path.join(output_dir, f“{params[‘part_id’]}.step”) part.val().exportStep(export_path) # 也可以导出为STL用于3D打印 # part.val().exportStl(os.path.join(output_dir, f“{params[‘part_id’]}.stl”)) print(“Batch generation complete.”)实现要点分离数据与逻辑设计逻辑封装在make_flange函数中尺寸数据来自外部CSV。这种模式非常清晰易于维护和扩展。自动化流水线脚本自动读取每一行数据调用函数生成模型并导出为通用格式如STEP, STL。这可以直接集成到PDM/PLM系统或自动化生产流程中。灵活的输出可以根据需要导出不同格式用于不同的下游应用数控加工、3D打印、仿真分析等。5. 实战中常见问题与解决方案实录即使思路清晰在实际编码中也会遇到各种“坑”。下面是我在大量使用CadQuery过程中总结的一些典型问题及其解决方法。5.1 几何体创建失败或布尔运算出错这是最常见的一类问题通常源于几何体的“奇异状态”。问题现象执行extrude、cut或union时程序报错如ValueError或OCCT底层错误或者生成的模型在渲染时出现破面、黑斑。根本原因零厚度几何体两个面完全重合或一个切割操作恰好切到边界上产生了理论上厚度为零的区域。CAD内核无法处理这种实体。自相交在旋转或扫掠操作中草图轮廓与旋转轴相交或路径曲率过大导致截面自交。数值精度问题浮点数计算带来的微小误差导致理论上应该接触的几何体有极小的间隙或重叠。排查与解决检查草图确保草图是封闭的close()且线段之间没有微小的缝隙。使用.val().isValid()检查生成的实体是否有效。引入安全间隙在进行布尔运算尤其是cut时故意让切割工具稍微“过切”一点。例如切割一个通孔时用extrude(厚度0.01)而不是extrude(厚度)确保完全穿透。避免奇异位置设计时让特征边缘之间留有明确的间隙或过盈。例如阵列特征时确保间距大于特征宽度或加上一个微小的偏移。简化复杂操作将一个复杂的布尔运算拆分成多个简单的步骤。有时先合并A和B再用结果去切割C比一次性对A、B、C进行复杂运算更稳定。使用clean()方法在经历一系列复杂操作后使用.clean()方法可以尝试修复一些细微的几何错误。实操心得遇到布尔运算报错我第一个反应是回退几步检查最近一次操作生成的几何体是否“干净”。单独显示那个实体看看有没有异常。很多时候问题出在之前某一步生成的、看似正常但实际上有瑕疵的中间体上。5.2 性能优化当模型变得复杂时当零件特征数量很多如成百上千个阵列孔或进行非常精细的曲面操作时可能会遇到性能下降、内存占用高、显示卡顿等问题。优化策略延迟求值最后合并对于大量相同的特征如散热鳍片、网格孔不要每生成一个就union一次。先将所有特征的对象保存在一个列表里最后使用compound或一次性的union操作进行合并。多次union会产生大量中间历史记录拖慢速度。简化不必要的细节在概念设计或初步验证阶段用圆柱体代替螺纹用方块代替复杂的倒圆角。等主要结构确定后再添加细节。利用对称性如果模型是对称的只创建一半或四分之一然后使用mirror操作复制可以节省一半以上的构建时间。分步导出和调试将复杂模型分成几个逻辑部分分别构建和导出最后在高级装配体软件中组装。这也有利于模块化设计。注意.val()的使用.val()方法会计算并返回当前的几何体CQ对象。在循环中频繁调用.val()进行非必要的计算会影响性能。尽量在循环外操作CQ的链式方法。5.3 与其他工具的协作流程CadQuery生成的模型最终需要用于制造、仿真或展示。导出格式选择STEP (.step, .stp)首选的工程交换格式。它包含完整的边界表示B-Rep信息能完美保留实体、曲面和精度几乎所有CAD/CAE/CAM软件都支持。用于与SolidWorks, CATIA, NX, Fusion 360等软件交互。STL (.stl)三角网格格式用于3D打印和部分渲染。导出时需注意分辨率公差设置。exportStl(tolerance)公差值越小网格越精细文件越大。对于3D打印通常0.01mm的精度已足够。IGES (.igs)较老的格式兼容性广但有时会丢失一些特征信息。除非下游系统只支持IGES否则优先用STEP。VRML/GLTF (.wrl, .gltf)用于网页或AR/VR场景下的轻量级可视化。在Fusion 360或SolidWorks中编辑虽然可以直接导入STEP文件但CadQuery生成的模型是“哑模型”Dumb Solid没有特征历史树。你无法像编辑原生特征那样修改一个孔的直径。正确的协作方式是将CadQuery脚本作为“单一特征”或“参考零件”导入。当需要修改时回到CadQuery脚本中修改参数重新生成并导出然后再更新导入。这强化了“设计即代码”的源头修改理念。生成二维工程图CadQuery本身不直接具备生成带尺寸标注、标题栏的2D工程图能力。通常的工作流是将CadQuery生成的模型导出为STEP。导入到专业的CAD软件如SolidWorks, Fusion 360, FreeCAD中。在CAD软件中创建工程图视图添加标注、公差、技术要求等。导出为PDF或DWG格式。 也有社区项目在探索直接用Python生成DXF或SVG格式的图纸但对于复杂的机械工程图目前仍推荐使用专业CAD软件完成。5.4 调试技巧让代码建模过程可视化调试图形代码比调试文本代码更抽象。以下技巧能帮你快速定位问题分步导出逐步检查在关键的步骤后面将当前结果导出为STEP或STL用查看器如FreeCAD、F3D打开确认模型状态是否符合预期。使用.objects和.vals()在链式操作中插入.objects可以获取当前工作平面上的所有草图对象.vals()可以获取所有生成的实体。打印它们的数量或简要信息有助于理解当前上下文。孤立显示特征在创建复杂特征如一个复杂的放样前先在一个单独的脚本中构建它确保其本身正确无误再集成到主模型中。简化重现当遇到一个诡异错误时尝试创建一个最小的、能重现该错误的代码片段。这不仅能帮你理清思路也方便在社区或论坛求助。善用FreeCAD的CadQuery工作台FreeCAD有一个优秀的CadQuery扩展工作台。它提供了一个交互式环境可以逐行执行CadQuery脚本并实时看到模型更新是学习和调试的利器。你可以看到每一步操作后工作平面和几何体的变化。掌握这33个实例并理解其背后的原理和这些实战中的“坑”你就能真正将CadQuery变为你设计工具箱中一件趁手的利器。它改变的不仅仅是建模方式更是你思考和解决设计问题的范式。从被动地修改模型到主动地定义规则这种转变带来的效率提升和创造性解放是传统CAD软件难以比拟的。