PropertyLink: InList und OutList
Siehe Objekteigenschaften vor diesem Abschnitt.
PropertyLink
Zusätzlich zu den skalaren Eigenschaften eines Merkmals enthalten die Merkmale selbst Verweise aufeinander. Diese Verweise definieren einen gerichteten azyklischen Graphen, der die Menge und Reihenfolge der Objekte festlegt, die als Reaktion auf eine Änderung in einem Objekt neu berechnet werden. Es werden nur die Merkmale neu berechnet, die von einem geänderten Merkmal abhängen.
Die Abhängigkeiten werden über eine spezielle Klasse von Eigenschaftstypen ausgedrückt, nämlich PropertyLink:
- PropertyLink: Damit kann ein Formelement mit einem anderen einzelnen Formelement innerhalb desselben Dokuments verknüpft werden.
- PropertyLinkList: Damit kann ein Formelement mit mehreren Formelementen verknüpft werden.
- PropertyLinkSub: Damit kann ein Formelement ein einzelnes Formelement verknüpfen und zusätzlich auf Unterelemente verweisen. Beispiel: Wenn man eine Vertiefung für die benötigte Skizze modellieren möchte, ist es wichtig zu wissen, auf welches Unterelement (z. B. Face6) des verknüpften Formelements sie abgebildet werden muss.
- PropertyLinkSubList: Damit kann ein Formelement mit mehreren Unterelementen mehrerer Formelemente verknüpft werden.
Im Folgenden werden ähnliche Eigenschaften für die Verknüpfung von Merkmalen verschiedener Dokumente aufgeführt. Dies ist der Kernbereich für Baugruppen.
- PropertyXLink
- PropertyXLinkList
- PropertyXLinkSub
- PropertyXLinkSubList
- PropertyXLinkContainer
Beispiel
Betrachten wir eine Klasse BoxDimension, die grundlegende Abmessungen für eine andere Klasse Box bereitstellt. Wir möchten, dass ein Box-Objekt neu berechnet wird, wenn sich die zugehörige BoxDimension ändert:
import FreeCAD
import Part
class BoxDimension:
def __init__(self, obj):
obj.addProperty("App::PropertyLength", "Length").Length = 1
obj.addProperty("App::PropertyLength", "Width").Width = 1
obj.addProperty("App::PropertyLength", "Height").Height = 1
obj.Proxy = self
class Box:
def __init__(self, obj):
obj.addProperty("App::PropertyLink", "Dimensions").Dimensions = None
obj.Proxy = self
def execute(self, obj):
if obj.Dimensions is None:
return
l = obj.Dimensions.Length
w = obj.Dimensions.Width
h = obj.Dimensions.Height
obj.Shape = Part.makeBox(l, w, h)
Es ist zu beachten, dass es sich um ein Box-Objekt handelt, das den PropertyLink zum BoxDimension-Objekt enthält.
Die Verwendung ist wie folgt:
doc = App.newDocument()
dim = doc.addObject("App::FeaturePython", "BoxDimension")
box = doc.addObject("Part::FeaturePython", "Box")
dim_proxy = BoxDimension(dim)
box_proxy = Box(box)
box.ViewObject.Proxy = None
box.Dimensions = dim
dim.Length = 5
dim.Width = 3
dim.Height = 7
doc.recompute()
Da unsere box vom Objekt dim abhängt, wird sie neu berechnet.
InList und OutList
Auf PropertyLink-Objekte kann über eine Python-Eigenschaft zugegriffen werden, wobei der Name verwendet wird, unter dem sie mit .addObject() registriert wurden. Es gibt jedoch noch eine andere Möglichkeit. Jedes Feature verfügt über ein Paar von verzögert generierten Listen namens InList und OutList, die jeweils die ausgehenden und eingehenden Kanten des DAG beschreiben:
- Eine
InListist eine Liste aller Formelemte, die vom aktuellen Objekt abhängig sind. Somit istdim.InListeine Liste, die unserbox-Objekt enthält. - Analog dazu ist eine
OutListeine Liste aller Formelemte, die vom aktuellen Objekt abhängig sind. Das heißt,box.OutListist eine Liste, die unserdim-Objekt enthält.
Es ist zu beachten, dass InList und OutList nichts mit der Baumansicht des Dokumentmodells zu tun haben, die in der GUI dargestellt wird. Zu jedem Zeitpunkt kann ein übergeordnetes Element in dieser Baumansicht untergeordnete Elemente enthalten, die Teil der InList, der OutList oder keiner der beiden sind.