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 行选中块的最上边的面,并在其上创建一个工作平面,我们将用它来定义角落孔的中心。

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

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