コンテンツにスキップ

linkcad.libgraph

ポリゴン演算のための高性能なブール演算ジオメトリエンジンです。ネイティブの libgraph ライブラリをラップしています。

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

便利関数

2 つのポリゴンに対する単純な演算には、これらの関数を直接使用します。いずれも (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)2 つのポリゴンの積
boolean_or(vtx1, vtx2, fill_rule=FillRule.EvenOdd)2 つのポリゴンの和
boolean_xor(vtx1, vtx2, fill_rule=FillRule.EvenOdd)2 つのポリゴンの対称差
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()現在のポリゴンの次の穴、または NoneHolesMode.Extract のときのみ意味があります
sp.clear()すべてのポリゴンを破棄し、再利用に備えます
sp.emptyプロセッサーがポリゴンを保持していなければ True
sp.set_license(license)ライセンスキーを設定します。有効なら True を返します

execute()Result を返します。sp.result という属性はありません。モジュールレベルのヘルパーで判定してください。

関数説明
succeeded(result)SuccessModified または SuccessNotModified のとき True
failed(result)いずれかのエラー結果のとき True

add_polygon()combine_with_previous=True を指定すると、直前に追加したポリゴンにサブパス——穴、または 2 つ目の輪郭——を結び付けられます。

列挙型

ShapeGroup

ポリゴンがどのオペランドに属するかを決めます。

説明
ShapeGroup.A第 1 オペランド
ShapeGroup.B第 2 オペランド
ShapeGroup.AB両方のオペランドに同時に属します

Operation

実行するブール演算です。

説明
Operation.Or和(A ∪ B)
Operation.And積(A ∩ B)
Operation.Xor対称差(A △ B)
Operation.AMinusB差(A − B)
Operation.BMinusA差(B − A)
Operation.SplitOnBA のポリゴンを B の境界で分割します
Operation.NoopA のポリゴンを結合せずに単純化します
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この演算では無効な穴モードです