Constraint()
是 cadquery
库中的一个类,用于在构建 Solid
对象时,限制对象的几何间关系,实现约束建模。
from cqmore.constraints import Constraint
Constraint(entity1, entity2, distance=None, offset=None, direction=None, angle=None, symmetry=None)
entity1
和 entity2
:约束的两个实体,可以是 Workplane
对象、Face
对象、Edge
对象或者 Vertex
对象。distance
:实体的距离上限或下限。offset
:实体之间的偏移值。direction
:实体之间的方向关系,可以是 "X"、"Y"、"Z" 或者 "+/-"。angle
:实体之间的角度关系,可以是 "horizontal"、"vertical" 或者 "at_angle".symmetry
:实体是否对称。entity1
和 entity2
:约束的两个实体,可以是 Workplane
对象、Face
对象、Edge
对象或者 Vertex
对象。
Workplane
对象是基本的几何结构,可以看做二维平面上的一个基准面。其他的几何实体都是在 Workplane
上创建的。
Face
对象是一个二维的封闭几何形状。一般情况下,Face
对象可以通过从 Workplane
上创建一个平面然后使用 extrude
或 revolve
函数将其变为一个立体形状。
Edge
对象一般由两个 Vertex
对象组成。可以通过 Edge
对象创建一个完整的 Wire
几何形状。
Vertex
对象是一个具有空间坐标的点,是构成 Edge
和 Face
对象的基础。
distance
:实体的距离上限或下限。
如果 distance
等于 None
,则没有距离限制。
offset
:实体之间的偏移值。
如果 offset
等于 None
,则没有偏移量限制。
direction
:实体之间的方向关系,可以是 "X"、"Y"、"Z" 或者 "+/-"。
如果 direction
等于 None
,则没有方向限制。
angle
:实体之间的角度关系,可以是 "horizontal"、"vertical" 或者 "at_angle"。
如果 angle
等于 None
,则没有角度限制。
symmetry
:实体是否对称。
如果 symmetry
等于 None
,则没有对称限制。
根据两个矩形的重心连线,实现它们的对称约束:
import cadquery as cq
from cqmore import Constraints
r1 = cq.Workplane("XY").rect(50, 30).translate((20, 20, 0))
r2 = cq.Workplane("XY").rect(30, 20).translate((50, 50, 0))
c = Constraints(r1.rectCenter(), r2.rectCenter(), symmetry=True)
result = r1.union(r2).cut(cq.Workplane("XY").rect(80, 60))
将两个矩形的重心连接起来,在连接线的垂直方向上形成两个等高点,实现它们的垂直距离约束:
import math
import cadquery as cq
from cqmore import Constraints
r1 = cq.Workplane("XY").rect(50, 30).translate((20, 20, 0))
r2 = cq.Workplane("XY").rect(30, 20).translate((50, 50, 0))
line = cq.Workplane("XY").lineTo(r1.rectCenter()).lineTo(r2.rectCenter()).close()
c = Constraints(line, None, distance=20)
result = r1.union(r2).cut(cq.Workplane("XY").rect(80, 60))
利用正方体边缘上两个面的共线,实现它们在横向与竖向上的对齐:
import cadquery as cq
from cqmore import Constraints
s = cq.Workplane("XY").box(10, 20, 30)
face1 = s.faces(">X and <Y and <Z")
face2 = s.faces(">Y and <Z")
c = Constraints(face1, face2, direction="X")
result = s.cut(cq.Workplane("XY").box(20, 30, 40))