推荐:使用 NSDT场景设计器 快速搭建 3D场景。

2D草图是3D CAD的基础。本文介绍如何在CadQuery中使用不同的方法构建二维草图(Sketch)。

1、基于面的 API

构建2D草图的主要方法是基于构建面并使用布尔运算将它们组合起来。

import cadquery as cq

result = (
   cq.Sketch()
   .trapezoid(4,3,90)
   .vertices()
   .circle(.5, mode='s')
   .reset()
   .vertices()
   .fillet(.25)
   .reset()
   .rarray(.6,1,5,1).slot(1.5,0.4, mode='s', angle=90)
)

请注意上面代码中,选择器已实现,但选择集必须明确重置。 Sketch 类没有实现历史,所有修改都是就地发生。

2、模式

来自面 API 的每个操作都接受一个模式参数来定义如何将创建的对象与现有对象组合。 模式可以是融合 (mode='a')、剪切 (mode='s')、相交 (mode='i') 或仅存储用于构建 (mode='c')。 在最后一种情况下,必须指定一个标签以便以后能够引用该对象。 默认情况下,面融合在一起。 请注意上例中减法和加法模式的使用。 另外两个如下所示。

result = (
   cq.Sketch()
   .rect(1, 2, mode='c', tag='base')
   .vertices(tag='base')
   .circle(.7)
   .reset()
   .edges('|Y', tag='base')
   .ellipse(1.2, 1, mode='i')
   .reset()
   .rect(2, 2, mode='i')
   .clean()
)

3、基于边的 API

如果需要,可以通过放置单独的边来构建草图。

import cadquery as cq

result = (
    cq.Sketch()
    .segment((0.,0),(0.,2.))
    .segment((2.,0))
    .close()
    .arc((.6,.6),0.4,0.,360.)
    .assemble(tag='face')
    .edges('%LINE',tag='face')
    .vertices()
    .chamfer(0.2)
)

构造完成后,必须使用 assemble() 将其转换为基于面的表示。 之后,可以应用基于面的操作。

4、凸包

对于某些特殊用例,凸包可以由直线段和圆构成。

result = (
    cq.Sketch()
    .arc((0,0),1.,0.,360.)
    .arc((1,1.5),0.5,0.,360.)
    .segment((0.,2),(-1,3.))
    .hull()
   )

5、基于约束的草图

最后,如果需要,可以使用几何约束来构建草图。 到目前为止,在这种用例中只能使用线段和弧线。

import cadquery as cq

result = (
    cq.Sketch()
    .segment((0,0), (0,3.),"s1")
    .arc((0.,3.), (1.5,1.5), (0.,0.),"a1")
    .constrain("s1","Fixed",None)
    .constrain("s1", "a1","Coincident",None)
    .constrain("a1", "s1","Coincident",None)
    .constrain("s1",'a1', "Angle", 45)
    .solve()
    .assemble()
)

以下约束已实现。 参数在 constrain() 中作为一个元组传入。 在此表中, 0..1 指的是介于 0 和 1 之间的浮点数,其中 0 将创建相对于元素开头的约束,1 表示结尾。

  • 固定点约束:指定的点被固定
  • 重合约束:指定的两个点重合
  • 夹角约束:两个实体的夹角固定
  • 长度约束:指定的实体具有固定的长度
  • 距离约束:两点之间的距离固定
  • 半径约束:指定的实体具有固定的半径
  • 方向约束:指定的实体平行于 (x,y)
  • 弧角度:指定的实体具有固定的圆周角度

6、工作平面集成

创建后,二维草图可用于在工作平面上构造各种特征。 支持的操作包括 extrude()twistExtrude()revolve()sweep()cutBlind()cutThruAll() 和  loft()

二维草图可以创建为单独的实体并重复使用,但也可以在一个调用链中临时创建,如下所示。

请注意,2D草图放置在堆栈顶部的所有位置。就地构建草图可以按如下方式完成。

import cadquery as cq

result = (
    cq.Workplane()
    .box(5,5,1)
    .faces('>Z')
    .sketch()
    .regularPolygon(2,3,tag='outer')
    .regularPolygon(1.5,3,mode='s')
    .vertices(tag='outer')
    .fillet(.2)
    .finalize()
    .extrude(.5)
)

Sketch API 在 sketch() 调用和原始工作平面之后可用。

在构建草图之前选择多个元素时,将创建多个草图。

import cadquery as cq

result = (
    cq.Workplane()
    .box(5,5,1)
    .faces('>Z')
    .workplane()
    .rarray(2,2,2,2)
    .rect(1.5,1.5)
    .extrude(.5)
    .faces('>Z')
    .sketch()
    .circle(0.4)
    .wires()
    .distribute(6)
    .circle(0.1,mode='a')
    .clean()
    .finalize()
    .cutBlind(-0.5,taper=10)
)

有时需要重复使用现有草图并将它们按原样放置在工作平面上。

import cadquery as cq

s = (
     cq.Sketch()
     .trapezoid(3,1,110)
     .vertices()
     .fillet(0.2)
     )

result = (
    cq.Workplane()
    .box(5,5,5)
    .faces('>X')
    .workplane()
    .transformed((0,0,-90))
    .placeSketch(s)
    .cutThruAll()
    )

使用 loft() 时需要重用现有草图。

from cadquery import Workplane, Sketch, Vector, Location

s1 = (
     Sketch()
     .trapezoid(3,1,110)
     .vertices()
     .fillet(0.2)
     )

s2 = (
     Sketch()
     .rect(2,1)
     .vertices()
     .fillet(0.2)
     )

result = (
    Workplane()
    .placeSketch(s1, s2.moved(Location(Vector(0, 0, 3))))
    .loft()
    )

放样时仅考虑外线,而忽略内线。


原文链接:Sketch tutorial

BimAnt翻译整理,转载请标明出处