Verwenden Sie ein Objekt als Treibervariable

Dec 04 2020

Ich habe eine Funktion für einen Treiber, der 2 Objekte als Argumente erwartet, und ich kann keine Möglichkeit finden, die Variable als Objekt-ID festzulegen, sondern nur eine einzige Eigenschaft dieses Objekts. Ist das möglich?

Antworten

3 lemon Dec 05 2020 at 14:37

Sie können den Treiber auf Datenpfad setzen und "Name" als Pfad verwenden, auf Kosten des Abrufs des Objekts aus seinem Namen.

Mit dieser Einstellung kann das Objekt vom Benutzer umbenannt werden und der Treiber wird nicht beschädigt.

4 batFINGER Dec 05 2020 at 17:50

Verwenden des Depsgraphen

Seit dem Upgrade auf 2.8 gehört der Depsgraph ebenso wie die Variablen zu den Einheimischen eines Treibers. Siehe Antwort auf

Wie verwende ich verschiedene Arten von Datenblöcken für Treibervariablen?

Einrichten eines Testtreibers.

Der Treiber befindet sich beispielsweise in "Cube". Das Objekt "Lampe" befindet sich in der Szene und wird als ausgewertetes Objekt über den Depsgraph an den Fahrer übergeben. Der Depsgraph kann auch verwendet werden.

def test(*args, depsgraph=None, **kwargs):
    for arg in args:
        print(arg)
    print(depsgraph)   
    return -1 # a simple val to indicate working

<bpy_struct, Object("Cube") at 0x7f62fcbefa08, evaluated>
<bpy_struct, Object("Lamp") at 0x7f62fcbf0008, evaluated>
<bpy_struct, Depsgraph at 0x7f62faba6c08>

Ein Beispiel für die Rückgabe des minimalen globalen z aller anderen Objekte im Depsgraph. Die Methode von @lemon kann für die Objektnamen verwendet werden. Andere Optionen könnten darin bestehen, sie über eine benutzerdefinierte Eigenschaft oder ein Namenspräfix-Suffix zu kennzeichnen.

def test(self, *args, depsgraph=None, **kwargs):

    z = min(o.matrix_world.translation.z for o in depsgraph.objects
    if o != self)

    return z  

Zeigeeigenschaften.

IMO Der beste Weg, ein Objekt einem anderen zuzuordnen, ist über eine Zeigereigenschaft

bpy.types.Object.driver_obj1 = bpy.props.PointerProperty(type=bpy.types.Object)

die über Skript oder UI zugewiesen werden kann.

context.object.driver_object1 = context.scene.objects.get("Lamp")