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) # intersectionresult = boolean_or(square, triangle) # unionresult = boolean_xor(square, triangle) # exclusive ORresult = 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() | 現在のポリゴンの次の穴、または None。HolesMode.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.SplitOnB | A のポリゴンを B の境界で分割します |
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 | この演算では無効な穴モードです |