import cadquery as cq
cone = cq.Solid.makeCone(1, 0, 2)
assy = cq.Assembly()
assy.add(
cone,
loc=cq.Location(cq.Vector(0, 0, 0), cq.Vector(1, 0, 0), 180),
name="cone0",
color=cq.Color("green")
)
assy.add(cone, name="cone1", color=cq.Color("blue"))
show_object(assy)
作为用户计算位置的替代方法,约束的 solve() 方法可用于在装配结果中定位对象。
如果同时使用初始位置和 solve() 方法,求解器将用它的解覆盖这些初始位置,但是初始位置仍然会影响最终解。 在欠约束系统中,如果对象对成本函数没有贡献,或者如果存在多个解决方案(即成本函数最小的多个实例),求解器可能不会移动对象,初始位置可能导致求解器收敛于一个特定的解决方案。 对于非常复杂的组件,设置近似正确的初始位置也可以减少所需的计算时间。
8、约束约束通常比直接提供位置更好地表示用户想要建模的现实世界关系。 在上面的例子中,真实世界的关系是每个圆锥体的底面应该接触,这可以用平面约束建模。 当用户提供明确的位置(而不是约束)时,也会进行更新,例如,当 cone1 的位置发生变化时。
当至少提供一个约束并运行方法 solve() 时,就定义了一个优化问题。 每个约束都提供一个成本函数,该函数取决于创建约束时指定的两个对象的位置和方向(由 Location 表示)。 解算器改变装配子项的位置并尝试最小化所有成本函数的总和。 因此,通过阅读下面的成本函数公式,你可以准确理解每个约束的作用。
9、点约束点约束是一种经常使用的约束,它可以最小化两点之间的距离。 一些示例用途是居中面或对齐顶点,但它也可用于虚拟顶点以在两个部件之间创建偏移。
成本函数是:
其中:
- param是约束的参数,默认为0,
- ci是第 i 个对象的中心,并且
- |vi|是 vi 的模,即其长度
创建点约束时, param 参数可用于指定两个中心之间的所需偏移量。 这个偏移量没有与之关联的方向,如果你想指定一个特定方向的偏移量,那么你应该使用一个虚拟顶点。
点约束使用 Center() 来查找参数的中心。 因此它适用于 Shape 的所有子类。
import cadquery as cq
# Use the Point constraint to position boxes relative to an arc
line = cq.Edge.makeCircle(radius=10, angle1=0, angle2=90)
box = cq.Workplane().box(1, 1, 1)
assy = cq.Assembly()
assy.add(line, name="line")
# position the red box on the center of the arc
assy.add(box, name="box0", color=cq.Color("red"))
assy.constrain("line", "box0", "Point")
# position the green box at a normalized distance of 0.8 along the arc
position0 = line.positionAt(0.8)
assy.add(box, name="box1", color=cq.Color("green"))
assy.constrain(
"line", cq.Vertex.makeVertex(*position0.toTuple()), "box1", box.val(), "Point",
)
# position the orange box 2 units in any direction from the green box
assy.add(box, name="box2", color=cq.Color("orange"))
assy.constrain(
"line",
cq.Vertex.makeVertex(*position0.toTuple()),
"box2",
box.val(),
"Point",
param=2,
)
# position the blue box offset 2 units in the x direction from the green box
position1 = position0 cq.Vector(2, 0, 0)
assy.add(box, name="box3", color=cq.Color("blue"))
assy.constrain(
"line", cq.Vertex.makeVertex(*position1.toTuple()), "box3", box.val(), "Point",
)
assy.solve()
show_object(assy)
10、轴约束
轴约束最小化两个向量之间的角度。 它经常用于对齐面和控制对象的旋转。
成本函数是:
其中:
- kdir是方向约束的比例因子,
- param是约束的参数,默认为弧度,
- di是从第 i 个对象参数创建的方向,如下所述,并且
- d1<d2是 d1 和 d2之间的弧度角
参数 param默认为π弧度,它将两个方向设置为彼此相反。 这代表了通常所说的“配对”关系,即两个物体的外表面接触。