Jump to content

PropertyLink: InList und OutList

From FreeCAD Documentation
This page is a translated version of the page PropertyLink: InList and OutList and the translation is 100% complete.

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 InList ist eine Liste aller Formelemte, die vom aktuellen Objekt abhängig sind. Somit ist dim.InList eine Liste, die unser box-Objekt enthält.
  • Analog dazu ist eine OutList eine Liste aller Formelemte, die vom aktuellen Objekt abhängig sind. Das heißt, box.OutList ist eine Liste, die unser dim-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.