Python参数化3D建模快速教程【CadQuery】

CadQuery是一个直观好用的参数化3D建模Python库,也是非常少见的面向软件工程师的3D建模工具。 和设计师常用的建模工具例如Revit等不同的是,你需要编写Python代码来创建模型,而不是在屏幕上 点点画画。因此,CadQuery非常适用于将参数化建模技术集成到你的应用程序中。

1、环境:Anaconda/Miniconda + CQ-editor

首先请按照安装CadQuery,的说明,安装Anaconda/Miniconda和CQ-editor。

安装后,运行 CQ 编辑器:

在左侧可以看到 CadQuery 代码编辑器。让我们从一个简单的代码块开始。

2、教程学习目标

我们将在这个快速教程中建造一个完全参数化的轴承座,成品看起来像这样:

我们希望这个构件具有以下功能:

  • 有足够的尺寸以保证在中心位置安装608(”滑板”)轴承
  • 在四周有M2螺丝沉头孔。
  • 构建的长度和宽度可以由用户配置任何合理的尺寸。

用自然语言描述的话则是:

一个矩形块 80mm x 60mm x 10mm,角落有 M2螺丝沉头孔,中间有直径为 22mm 的圆孔用于轴承。

人类的描述很优雅,对吧?希望我们将要完成的脚本不会比这个以人为本的描述复杂太多。

让我们看看用CadQuery该怎么实现。

3、从一个简单面板开始

让我们从一个简单的模型开始,它只制作一个矩形方块,但预留尺寸调整参数。将下面代码粘贴到 CQ编辑器中:

1
2
3
4
5
6
7
8
9
height = 60.0
width = 80.0
thickness = 10.0

# make the base
result = cq.Workplane("XY").box(height, width, thickness)

# Render the solid
show_object(result)

按工具栏中的绿色渲染按钮以运行脚本,应该可以看到我们的基本对象:

没什么特别的,但这是一个好的开始!

4、添加孔洞

我们的轴承座需要在中心位置为轴承预留一个直径为22毫米的孔。

下面的修改将实现这一目标:

1
2
3
4
5
6
7
8
9
10
11
height = 60.0
width = 80.0
thickness = 10.0
diameter = 22.0

# make the base
result = cq.Workplane("XY").box(height, width, thickness)\
.faces(">Z").workplane().hole(diameter)

# Render the solid
show_object(result)

通过单击”渲染”按钮重建模型。模型应该看起来像这样:

代码相当紧凑,让我们逐行说明。

第4行增加了一个新的参数,diameter,用来表示孔的直径

第8行,我们实现了打孔。cadquery.Workplane.faces()选中Z方向最上边的面, 然后cadquery.Workplane.workplane()在此之上创建一个新的工作平面。此工作 平面的中心位于几何形状的质心,在本例中,质心就是板的中心。最后, cadquery.Workplane.hole()在部件上钻贯穿孔,直径22毫米。

注意:现在不用担心CadQuery语法,你可以稍后访问CadQuery API了解相关信息。

5、创建更多孔洞

好吧,那个孔不是太难,但是四角的沉头孔怎么做?

M2 戴帽螺钉具有以下尺寸:

  • 头部直径: 3.8 毫米
  • 头部高度: 2.0 毫米
  • 间隙孔: 2.4 毫米
  • 沉头孔直径: 4.4 毫米

这些孔的中心应距离块边缘 6 毫米。并且我们希望,即使用户重新调整了块的大小也能正常工作。

不要告诉我,我们需要重复以上步骤8次,才能生成沉头孔?好消息!– 我们只需几行代码 就可以完成这一工作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
height = 60.0
width = 80.0
thickness = 10.0
diameter = 22.0
padding = 12.0

# make the base
result = cq.Workplane("XY").box(height, width, thickness)\
.faces(">Z").workplane().hole(diameter)\
.faces(">Z").workplane() \
.rect(height - padding,width - padding,forConstruction=True)\
.vertices()\
.cboreHole(2.4, 4.4, 2.1)

# Render the solid
show_object(result)

单击”渲染”按钮以重新执行模型后,你应该会看到类似的东西:

这里包含很多内容, 所以让我们分解说明一下。

第 5 行创建一个新的填充参数,该参数决定沉头孔离板的边缘有多远。

第 10 行选中块的最上边的面,并在其上创建一个工作平面,我们将用它来定义角落孔的中心。

关于这一行代码,有几件事需要注意:

  1. cadquery.Workplane.rect()功能绘制一个矩形。forConstruction=True告诉 CadQuery, 这个矩形不是实体的一部分,我们只是用它来帮助定义其他几何形状。
  2. 除非你另有说明,否则将在当前工作平面中心(在此例中为块的顶面中心)上绘制一个矩形。 因此,这个矩形将位于该平面的中心。

第11行绘制的矩形比块的总长度和宽度小 12 毫米,我们将用它来定位角孔。我们将使用这个 矩形的顶点(角)来定位孔。矩形的中心位于工作平面的中心,在这种情况下,工作平面与轴承孔的中心重合。

第 12 行选中矩形的顶点,我们将其用于定位孔的中心。cadquery.Workplane.vertices() 功能选择矩形的角。

第 13 行使用cboreHole函数来绘制孔。cadquery.Workplane.cboreHole()是一个创建沉头孔的方便的 CadQuery函数。与大多数其他 CadQuery 函数一样,它根据栈上的值运行。在这种情况下,由于我们在 调用函数之前选择了四个顶点,该功能在这些点中的每一个上都运行- 这会导致每个矩形角出现一个沉头孔。

6、倒圆角

差不多完成了。让我们给构建块稍微倒一下圆角。这很容易,我们只需要选择边缘,然后执行倒角处理:

我们可以使用参数定义中的预设字典:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
height = 60.0
width = 80.0
thickness = 10.0
diameter = 22.0
padding = 12.0

# make the base
result = cq.Workplane("XY").box(height, width, thickness)\
.faces(">Z").workplane().hole(diameter)\
.faces(">Z").workplane() \
.rect(height - padding, width - padding, forConstruction=True)\
.vertices().cboreHole(2.4, 4.4, 2.1)\
.edges("|Z").fillet(2.0)

# Render the solid
show_object(result)

第 13 行使用cadquery.Workplane.fillet()方法在边缘生成圆角。

为了捕捉正确的边缘,cadquery.Workplane.edges()选中与Z轴平行的所有边缘(”|Z”),

成品看起来像这样:

7、导出模型

如果你想要制作实体对象,则需要将结果导出到 STL 或 DXF。此外,也可以将其导出为STEP 格式以便在另一个 CAD 工具进行后续处理。

这可以使用 cadquery.exporters.export() 函数轻松完成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
height = 60.0
width = 80.0
thickness = 10.0
diameter = 22.0
padding = 12.0

# make the base
result = cq.Workplane("XY").box(height, width, thickness)\
.faces(">Z").workplane().hole(diameter)\
.faces(">Z").workplane() \
.rect(height - padding, width - padding, forConstruction=True)\
.vertices().cboreHole(2.4, 4.4, 2.1)\
.edges("|Z").fillet(2.0)

# Render the solid
show_object(result)

# Export
cq.exporters.export(result,'result.stl')
cq.exporters.export(result.section(),'result.dxf')
cq.exporters.export(result,'result.step')

好了!

你刚刚制作了一个轴承座的参数化模型,还不到20行代码!


原文链接:CadQuery快速教程 —— BimAnt