目录

  • 草图教程
  •       Face-based API
  •             Modes
  •       Edge-based API
  •       Convex hull
  •       Constraint-based sketches
  • Workplane integration
  • 草图教程

    本节的目的是演示如何使用不同的方法构建草图。

    Face-based API

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

    import cadquery as cq
    
    result = (
        cq.Sketch()
        .trapezoid(4, 3, 90)
        .vertices()
        .circle(0.5, mode="s")
        .reset()
        .vertices()
        .fillet(0.25)
        .reset()
        .rarray(0.6, 1, 5, 1)
        .slot(1.5, 0.4, mode="s", angle=90)
    )

    请注意,选择器已实现,但必须显式重置选择。Sketch 类不实现历史记录,所有修改都就地发生。

    Modes

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

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

    Edge-based API

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

    import cadquery as cq
    
    result = (
        cq.Sketch()
        .segment((0.0, 0), (0.0, 2.0))
        .segment((2.0, 0))
        .close()
        .arc((0.6, 0.6), 0.4, 0.0, 360.0)
        .assemble(tag="face")
        .edges("%LINE", tag="face")
        .vertices()
        .chamfer(0.2)
    )

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

    Convex hull

    警告

    凸面功能目前处于实验阶段。
    对于某些特殊用例,凸面可以由直线段和圆构造。

    result = (
        cq.Sketch()
        .arc((0, 0), 1.0, 0.0, 360.0)
        .arc((1, 1.5), 0.5, 0.0, 360.0)
        .segment((0.0, 2), (-1, 3.0))
        .hull()
    )

    Constraint-based sketches

    警告

    2D 草图约束和求解器目前处于实验阶段。
    最后,如果需要,可以使用几何约束来构建草图。

    到目前为止,在此类用例中只能使用线段和圆弧。

    import cadquery as cq
    
    result = (
        cq.Sketch()
        .segment((0, 0), (0, 3.0), "s1") # 线段
        .arc((0.0, 3.0), (1.5, 1.5), (0.0, 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 将创建相对于元素结尾的约束。

    名称数量实体参数描述
    Fixed1全部None 表示圆弧中心
    0..1 表示线段/圆弧上的点
    指定点是固定的
    FixedPoint2全部没有任何固定点
    Coincident2全部没有任何指定点重合
    Angle2全部角度两个实体的切线之间的角度是固定的
    Length1全部长度指定实体具有固定长度
    Distance2全部无或 0..1、无或 0..1、距离两点之间的距离是固定的
    Radius1半径指定实体具有固定半径
    Orientation1部分x,y指定实体平行于(x,y)
    ArcAngle1角度指定实体为固定角度跨度

    Workplane integration

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

    草图可以作为单独的实体创建并重复使用,也可以在一个流畅的调用链中临时创建,如下所示。
    请注意,草图放置在堆栈顶部的所有位置。
    就地构建草图可以按如下方式完成。

    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(0.2)
        .finalize()
        .extrude(0.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(0.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()

    放样时仅考虑外部线,而忽略内部线。请注意,当前操作仅考虑堆栈顶部的草图(即没有待处理的草图),因此在放样或扫描时,必须将所有相关草图添加到一个地方草图调用中。

     

    作者:码峰  创建时间:2023-12-20 17:48
    最后编辑:码峰  更新时间:2024-01-12 17:58