跳转到内容

linkcad.libgraph

用于多边形运算的高性能布尔几何引擎。它封装了原生 libgraph 库。

from linkcad.v1.libgraph import (
ShapeProcessor, ShapeGroup, Operation, FillRule, HolesMode, Result,
boolean_and, boolean_or, boolean_xor, boolean_difference,
succeeded, failed,
)

便捷函数

对于简单的双多边形运算,可直接使用这些函数。每个函数都接受以 (x, y) 元组序列表示的顶点列表,并返回结果多边形列表(每个元素是 (x, y) 元组的列表)。运算失败时抛出 RuntimeError

from linkcad.v1.libgraph import boolean_and, boolean_or, boolean_xor, boolean_difference
square = [(0, 0), (10, 0), (10, 10), (0, 10)]
triangle = [(5, 5), (15, 5), (10, 15)]
result = boolean_and(square, triangle) # intersection
result = boolean_or(square, triangle) # union
result = boolean_xor(square, triangle) # exclusive OR
result = boolean_difference(square, triangle) # square minus triangle
函数说明
boolean_and(vtx1, vtx2, fill_rule=FillRule.EvenOdd)两个多边形的交集
boolean_or(vtx1, vtx2, fill_rule=FillRule.EvenOdd)两个多边形的并集
boolean_xor(vtx1, vtx2, fill_rule=FillRule.EvenOdd)两个多边形的对称差
boolean_difference(vtx1, vtx2, fill_rule=FillRule.EvenOdd)差集——在 vtx1 中但不在 vtx2 中的区域

坐标为整数。如果你的几何图形已经是数据库单位,那就已经满足要求。

ShapeProcessor

对于多多边形运算,或需要控制填充规则和孔处理方式时,请使用 ShapeProcessor

from linkcad.v1.libgraph import (
FillRule, HolesMode, Operation, ShapeGroup, ShapeProcessor, succeeded,
)
sp = ShapeProcessor()
sp.add_polygon(ShapeGroup.A, [(0, 0), (10, 0), (10, 10), (0, 10)])
sp.add_polygon(ShapeGroup.B, [(5, 5), (15, 5), (10, 15)])
result = sp.execute(Operation.And, FillRule.NonZero, HolesMode.Link)
if not succeeded(result):
raise RuntimeError(f"Boolean failed: {result}")
polygons = []
while sp.has_next_polygon():
poly = sp.get_next_polygon()
if poly is None:
break
polygons.append(poly)
属性 / 方法说明
ShapeProcessor(granularity=1)创建新的处理器
sp.add_polygon(group, vertices, combine_with_previous=False)向组 A、B 或 AB 添加多边形。返回内部形状 ID
sp.execute(operation, fill_mode=FillRule.NonZero, hole_mode=HolesMode.Link, process_vertically=False)执行运算;返回一个 Result
sp.has_next_polygon()是否还有结果多边形
sp.get_next_polygon()下一个结果多边形;取尽时返回 None
sp.get_next_hole()当前多边形的下一个孔,或 None。仅在 HolesMode.Extract 下有意义
sp.clear()丢弃所有多边形并为复用做准备
sp.empty处理器中没有多边形时为 True
sp.set_license(license)设置许可密钥;有效时返回 True

execute() 返回一个 Result;没有 sp.result 属性。请用模块级辅助函数判断:

函数说明
succeeded(result)结果为 SuccessModifiedSuccessNotModified 时为 True
failed(result)任何错误结果均为 True

add_polygon() 上设置 combine_with_previous=True,可把一条子路径——一个孔,或第二条轮廓——附加到紧邻其前添加的多边形上。

枚举

ShapeGroup

决定多边形属于哪个操作数。

说明
ShapeGroup.A第一个操作数
ShapeGroup.B第二个操作数
ShapeGroup.AB同时属于两个操作数

Operation

要执行的布尔运算。

说明
Operation.Or并集(A ∪ B)
Operation.And交集(A ∩ B)
Operation.Xor对称差(A △ B)
Operation.AMinusB差集(A − B)
Operation.BMinusA差集(B − A)
Operation.SplitOnB沿 B 的边界分割 A 中的多边形
Operation.Noop简化 A 中的多边形而不做合并
Operation.KeepInternalEdges求并集但保留内部边
Operation.OrNoMerge不合并内部边的并集
Operation.AndNoMerge不合并内部边的交集
Operation.XorNoMerge不合并内部边的 XOR
Operation.AMinusBNoMerge不合并内部边的 A − B
Operation.BMinusANoMerge不合并内部边的 B − A

FillRule

控制重叠的多边形边如何判定“内部”与“外部”。

说明
FillRule.NonZero非零环绕规则
FillRule.EvenOdd奇偶规则(最快)
FillRule.NonZeroGroup按组应用的非零环绕规则
FillRule.EvenOddGroup按组应用的奇偶规则
FillRule.OuterGroup只填充最外层区域

HolesMode

控制输出多边形中孔的表示方式。

说明
HolesMode.Extract通过 get_next_hole() 单独返回孔
HolesMode.Link用零宽桥接把孔连到外轮廓
HolesMode.Split把结果拆成没有孔的简单多边形
HolesMode.Keep把孔保留为独立多边形

Result

ShapeProcessor.execute() 返回的状态。

说明
Result.SuccessModified成功;几何图形发生了变化
Result.SuccessNotModified成功;几何图形本已是所要求的形式
Result.Failed运算失败
Result.Cancelled运算被取消
Result.NoLicense许可密钥无效
Result.InvalidFillRule该运算不支持此填充规则
Result.InvalidHolesMode该运算不支持此孔模式