Zum Inhalt springen

linkcad.libgraph

Hochleistungs-Engine für boolesche Geometrie auf Polygonen. Umhüllt die native Bibliothek libgraph.

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

Hilfsfunktionen

Für einfache Operationen mit zwei Polygonen verwenden Sie diese Funktionen direkt. Jede nimmt Stützpunktlisten als Folgen von (x, y)-Tupeln entgegen und gibt eine Liste von Ergebnispolygonen zurück (jeweils eine Liste von (x, y)-Tupeln). Bei Fehlschlag lösen sie RuntimeError aus.

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
FunktionBeschreibung
boolean_and(vtx1, vtx2, fill_rule=FillRule.EvenOdd)Schnittmenge zweier Polygone
boolean_or(vtx1, vtx2, fill_rule=FillRule.EvenOdd)Vereinigung zweier Polygone
boolean_xor(vtx1, vtx2, fill_rule=FillRule.EvenOdd)Symmetrische Differenz zweier Polygone
boolean_difference(vtx1, vtx2, fill_rule=FillRule.EvenOdd)Differenz — Bereiche in vtx1, aber nicht in vtx2

Koordinaten sind ganze Zahlen. Wenn Ihre Geometrie in Datenbankeinheiten vorliegt, ist das bereits erfüllt.

ShapeProcessor

Für Operationen mit mehreren Polygonen oder wenn Sie Füllregel und Lochbehandlung steuern müssen, verwenden Sie 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)
Eigenschaft / MethodeBeschreibung
ShapeProcessor(granularity=1)Einen neuen Prozessor erzeugen
sp.add_polygon(group, vertices, combine_with_previous=False)Ein Polygon zu Gruppe A, B oder AB hinzufügen. Gibt eine interne Form-ID zurück
sp.execute(operation, fill_mode=FillRule.NonZero, hole_mode=HolesMode.Link, process_vertically=False)Die Operation ausführen; gibt ein Result zurück
sp.has_next_polygon()Ob weitere Ergebnispolygone verfügbar sind
sp.get_next_polygon()Nächstes Ergebnispolygon oder None, wenn erschöpft
sp.get_next_hole()Nächstes Loch des aktuellen Polygons oder None. Nur mit HolesMode.Extract sinnvoll
sp.clear()Alle Polygone verwerfen und für die Wiederverwendung vorbereiten
sp.emptyTrue, wenn der Prozessor keine Polygone enthält
sp.set_license(license)Einen Lizenzschlüssel setzen; gibt True zurück, wenn er gültig ist

execute() gibt ein Result zurück; ein Attribut sp.result gibt es nicht. Prüfen Sie es mit den Hilfsfunktionen des Moduls:

FunktionBeschreibung
succeeded(result)True bei SuccessModified oder SuccessNotModified
failed(result)True bei jedem Fehlerergebnis

Setzen Sie combine_with_previous=True bei add_polygon(), um einen Unterpfad — ein Loch oder eine zweite Kontur — an das unmittelbar zuvor hinzugefügte Polygon anzuhängen.

Enums

ShapeGroup

Bestimmt, zu welchem Operanden ein Polygon gehört.

WertBeschreibung
ShapeGroup.AErster Operand
ShapeGroup.BZweiter Operand
ShapeGroup.ABGehört gleichzeitig zu beiden Operanden

Operation

Die auszuführende boolesche Operation.

WertBeschreibung
Operation.OrVereinigung (A ∪ B)
Operation.AndSchnitt (A ∩ B)
Operation.XorSymmetrische Differenz (A △ B)
Operation.AMinusBDifferenz (A − B)
Operation.BMinusADifferenz (B − A)
Operation.SplitOnBDie Polygone in A entlang der Kontur von B teilen
Operation.NoopDie Polygone in A vereinfachen, ohne sie zu kombinieren
Operation.KeepInternalEdgesVereinigung unter Beibehaltung innerer Kanten
Operation.OrNoMergeVereinigung ohne Zusammenführen innerer Kanten
Operation.AndNoMergeSchnitt ohne Zusammenführen innerer Kanten
Operation.XorNoMergeXOR ohne Zusammenführen innerer Kanten
Operation.AMinusBNoMergeA − B ohne Zusammenführen innerer Kanten
Operation.BMinusANoMergeB − A ohne Zusammenführen innerer Kanten

FillRule

Bestimmt, wie überlappende Polygonkanten „innen“ und „außen“ festlegen.

WertBeschreibung
FillRule.NonZeroNon-Zero-Winding-Regel
FillRule.EvenOddEven-Odd-Regel (am schnellsten)
FillRule.NonZeroGroupNon-Zero-Winding-Regel je Gruppe
FillRule.EvenOddGroupEven-Odd-Regel je Gruppe
FillRule.OuterGroupNur den äußersten Bereich füllen

HolesMode

Bestimmt, wie Löcher in den Ausgabepolygonen dargestellt werden.

WertBeschreibung
HolesMode.ExtractLöcher separat über get_next_hole() zurückgeben
HolesMode.LinkLöcher mit der Außenkontur über Brücken der Breite null verbinden
HolesMode.SplitDas Ergebnis in einfache Polygone ohne Löcher zerlegen
HolesMode.KeepLöcher als separate Polygone beibehalten

Result

Von ShapeProcessor.execute() zurückgegebener Status.

WertBeschreibung
Result.SuccessModifiedErfolgreich; die Geometrie hat sich geändert
Result.SuccessNotModifiedErfolgreich; die Geometrie lag bereits in der gewünschten Form vor
Result.FailedOperation fehlgeschlagen
Result.CancelledOperation abgebrochen
Result.NoLicenseUngültiger Lizenzschlüssel
Result.InvalidFillRuleFüllregel für diese Operation nicht zulässig
Result.InvalidHolesModeLochmodus für diese Operation nicht zulässig