Script zum Gewichte-Zuweisen funktioniert nicht

Blenders Funktionsumfang mit Python-Scripten erweitern.

Script zum Gewichte-Zuweisen funktioniert nicht

Beitragvon 51423benam » 21.12.2016, 20:39

Hallo,

ich habe mir neulich ein Enterprise-3D-Modell heruntergeladen, eine Armature hinzugefügt(da die Enterprise, wenn sie auf Warp geht, sich ein wenig verbiegt) und den Armature-Modifier auf die Enterprise angewendet. Jetzt wollte ich allen Vertices ein Gewicht zuordnen, welches abhängig ist von der Entfernung zum Bone. Dazu habe ich folgendes Python-Script geschrieben:

Code: Alles auswählen
import bpy
import math
zaehler = 0
bpy.context.scene.objects.active = bpy.data.objects["group_0.007"]
verts = bpy.context.active_object.data.vertices
bpy.ops.object.mode_set(mode='WEIGHT_PAINT')
bpy.data.meshes["ID84"].use_paint_mask_vertex
for vert in verts:
    if zaehler > 5000:
        break
    position_vert = vert.co
    position_bone = bpy.data.objects["Armature"].location
    position_diff = position_vert - position_bone
    xy_diff = math.sqrt(position_diff[0] + position_diff[1])
    xyz_diff = math.sqrt(xy_diff + position_diff[2])
    weight = 2 / xyz_diff
    vert.select = True
    bpy.data.scenes["Scene"].tool_settings.unified_paint_settings.weight = weight
    print(weight)
    bpy.ops.paint.weight_set()
    vert.select = False
    zaehler += 1


Allerdings gibt die Konsole mir immer, wenn ich das Script starte, folgenden Fehler aus:
RunTimeError: Operator bpy.ops.paint.weight_set.poll() failed, context is incorrect.

Ich habe bereits nach ähnlichen Fehlern gesucht und herausgefunden, dass dieser Fehler z.Bsp. auftritt, wenn man im falschen Modus ist, der Cursor nicht im richtigen Bereich ist etc.

Edit: Wie kann man eigentlich Code einfügen, ohne dass die Einrückungen verschwinden, außer es als Anhang zu speichern?

Bitte um Hilfe!
Gruß
51423benam
Zuletzt geändert von 51423benam am 22.12.2016, 14:00, insgesamt 1-mal geändert.
51423benam
 
Registriert:
21.12.2016, 16:18

Re: Script zum Gewichte-Zuweisen funktioniert nicht

Beitragvon Flegel » 22.12.2016, 13:34

Edit: Wie kann man eigentlich Code einfügen, ohne dass die Einrückungen verschwinden, außer es als Anhang zu speichern?


Code: Alles auswählen
Vor den Code [code] und danach [/code] setzen. Dann übernimmt er die Einrückungen.


Test
    Test
    Test
Flegel
 
Registriert:
13.11.2015, 11:53

Re: Script zum Gewichte-Zuweisen funktioniert nicht

Beitragvon beta-tester » 23.12.2016, 19:02

51423benam hat geschrieben:
Code: Alles auswählen
...
bpy.data.meshes["ID84"].use_paint_mask_vertex


Allerdings gibt die Konsole mir immer, wenn ich das Script starte, folgenden Fehler aus:
RunTimeError: Operator bpy.ops.paint.weight_set.poll() failed, context is incorrect.

Ich habe bereits nach ähnlichen Fehlern gesucht und herausgefunden, dass dieser Fehler z.Bsp. auftritt, wenn man im falschen Modus ist, der Cursor nicht im richtigen Bereich ist etc.

oops, da fehlt doch was
Code: Alles auswählen
bpy.context.blend_data.meshes["ID84"].use_paint_mask_vertex = True
...oder?

PS.: bitte benutz NICHT bpy.data.objects["myObject"]
sondern bpy.context.blend_data.objects["myObject"], wenn du mit context bezogene daten arbeitest.
(zu blender 2.6x gab es mal die anweisung, dass man bpy.data in add-ons nicht mehr benutzen soll/darf, oder ist die anweisung wieder zurückgezogen worden?)
Ich gebe nur negatives Feedback - ist nur konstruktive Kritik! Rechtschreibung und Grammatik - ohne mich!
Dieser absolut überflüssige Beitrag stammt aus der Reihe: Klugscheißen mit beta-tester
Add-On Autor von: MilkShape3D (.ms3d) importer/exporter, FuturePinball (.fpx) importer
Benutzeravatar
beta-tester
1 Wettbewerbssieg
1 Wettbewerbssieg
 
Registriert:
30.07.2013, 21:10

Re: Script zum Gewichte-Zuweisen funktioniert nicht

Beitragvon 51423benam » 24.12.2016, 15:00

@betatester:
Wo in Code kann ich denn bpy.context.blend data benutzen? Z.B. in Zeile 4, ist das Objekt doch gar nicht im Context enthalten?

Bitte um Antwort
Gruß
51423benam
51423benam
 
Registriert:
21.12.2016, 16:18

Re: Script zum Gewichte-Zuweisen funktioniert nicht

Beitragvon beta-tester » 24.12.2016, 15:50

51423benam hat geschrieben:@betatester:
Wo in Code kann ich denn bpy.context.blend data benutzen? Z.B. in Zeile 4, ist das Objekt doch gar nicht im Context enthalten?

"bpy.context.blend data" nirgens! ;) (der unterstrich fehlt :P )
überall wo "bpy.data..." steht machst du ein "bpy.context.blend_data..." draus.
(in deinem originalcode, dann in den zeilen 4, 7, 12, 18)

aber der hauptfehler in deinem originalcode war, dass du die zuweisung von "True" bei deiner "bpy.data.meshes["ID84"].use_paint_mask_vertex" codzeile vergessen hattest.
Ich gebe nur negatives Feedback - ist nur konstruktive Kritik! Rechtschreibung und Grammatik - ohne mich!
Dieser absolut überflüssige Beitrag stammt aus der Reihe: Klugscheißen mit beta-tester
Add-On Autor von: MilkShape3D (.ms3d) importer/exporter, FuturePinball (.fpx) importer
Benutzeravatar
beta-tester
1 Wettbewerbssieg
1 Wettbewerbssieg
 
Registriert:
30.07.2013, 21:10

Re: Script zum Gewichte-Zuweisen funktioniert nicht

Beitragvon 51423benam » 24.12.2016, 18:54

@betatester:
Danke für die Antworten!
Aber wenn ich bpy.data... durch bpy.context.blend_data... ersetze, gibt Blender mir den Fehler "Location: unknown location" aus. Warum erkennt Blender das nicht?

Gruß
51423benam
51423benam
 
Registriert:
21.12.2016, 16:18

Re: Script zum Gewichte-Zuweisen funktioniert nicht

Beitragvon beta-tester » 25.12.2016, 09:24

51423benam hat geschrieben:Aber wenn ich bpy.data... durch bpy.context.blend_data... ersetze, gibt Blender mir den Fehler "Location: unknown location" aus. Warum erkennt Blender das nicht?
weiß nicht, bei mir kommt die meldung nicht.

wie genau sieht denn die ganze meldung aus?
wie sieht dein code jetzt aus
in welcher zeile
bei welchem befehl

ich tippe mal auf einen anderen fehler in deinem code.
z.b. wenn du einen einrückungsfehler hast
oder "falsche" SPACEs benutzt hast (sehen aus wie spaces, sind aber keine, wie z.B. in deinem beispielcode den du gepostet hast - ich dachte nur, dass die "falschen" spaces von der webseite oder vom copy'n'paste her kommen)
IndentationError: unexpected indent
location: <unknown location>:-1

oder wenn du TABs und SPACEs gemischt hast
oder unterschiedlich weit eingerückt hast (z.b. wenn du immer 4'er einrückungen benutzt und dann mal nur ne 3'er einrückung hast)
Ich gebe nur negatives Feedback - ist nur konstruktive Kritik! Rechtschreibung und Grammatik - ohne mich!
Dieser absolut überflüssige Beitrag stammt aus der Reihe: Klugscheißen mit beta-tester
Add-On Autor von: MilkShape3D (.ms3d) importer/exporter, FuturePinball (.fpx) importer
Benutzeravatar
beta-tester
1 Wettbewerbssieg
1 Wettbewerbssieg
 
Registriert:
30.07.2013, 21:10

Re: Script zum Gewichte-Zuweisen funktioniert nicht

Beitragvon 51423benam » 25.12.2016, 13:35

Hallo,

hier mein Code:
Code: Alles auswählen
import bpy
import math
zaehler = 0
bpy.ops.object.mode_set(mode = "OBJECT")
bpy.context.scene.objects.active = bpy.context.blend_data.objects["group_0.007"]
verts = bpy.context.active_object.data.vertices
bpy.ops.object.mode_set(mode='WEIGHT_PAINT')
bpy.context.blend_data.meshes["ID84"].use_paint_mask_vertex = True
for vert in verts:
    if zaehler > 1000:
        break
    position_vert = vert.co
    position_bone = bpy.context.blend_data["Armature"].data.bones["Bone.002"].head
    position_diff = position_vert - position_bone
    xy_diff = math.sqrt(position_diff[0] + position_diff[1])
    xyz_diff = math.sqrt(xy_diff + position_diff[2])
    weight = 1 / xyz_diff
    if weight > 1:
        weight = 1
    vert.select = True
    bpy.data.scenes["Scene"].tool_settings.unified_paint_settings.weight = weight
    print("Eingestelltes Gewicht" + str(bpy.context.blend_data.scenes["Scene"].tool_settings.unified_paint_settings.weight))
    print(weight)
    bpy.ops.paint.weight_set()
    vert.select = False
    zaehler += 1

Die Konsole gibt mir jetzt diesen Fehler aus (ich hatte bei dem Fehler davor einen Syntaxfehler, die öffnende eckige Klammer vor "Armature" in Zeile 13 hat gefehlt, warum auch immer):
File "Enterprise 2_einheitlich.blend\Code", line 13, in <module>
TypeError: this type doesn't support IDProperties

Wird bei bpy.context.blend_data das Objekt anders angesprochen?

Gruß
51423benam
51423benam
 
Registriert:
21.12.2016, 16:18

Re: Script zum Gewichte-Zuweisen funktioniert nicht

Beitragvon beta-tester » 25.12.2016, 16:22

51423benam hat geschrieben:
Code: Alles auswählen
    position_bone = bpy.context.blend_data["Armature"].data.bones["Bone.002"].head
oh oh, na dann schau mal genauer hin...
du hast dein code von
Code: Alles auswählen
bpy.data.objects["Armature"]...
nach
Code: Alles auswählen
bpy.context.blend_data["Armature"]...
geändern...
was ist dann dort falsch.
(paar zeilen weiter oben hast du es richtig geändert)

vorher hatte ich doch geschrieben:
beta-tester hat geschrieben:überall wo "bpy.data..." steht machst du ein "bpy.context.blend_data..." draus.
Ich gebe nur negatives Feedback - ist nur konstruktive Kritik! Rechtschreibung und Grammatik - ohne mich!
Dieser absolut überflüssige Beitrag stammt aus der Reihe: Klugscheißen mit beta-tester
Add-On Autor von: MilkShape3D (.ms3d) importer/exporter, FuturePinball (.fpx) importer
Benutzeravatar
beta-tester
1 Wettbewerbssieg
1 Wettbewerbssieg
 
Registriert:
30.07.2013, 21:10

Re: Script zum Gewichte-Zuweisen funktioniert nicht

Beitragvon 51423benam » 26.12.2016, 01:45

Ups, Entschuldigung, danke für die Korrektur!
Gruß
51423benam
51423benam
 
Registriert:
21.12.2016, 16:18

Re: Script zum Gewichte-Zuweisen funktioniert nicht

Beitragvon 51423benam » 26.12.2016, 01:50

Hallo,

nein, die Datei ist zu groß.
Das Script funktioniert jetzt, ich muss nur noch die Berechnungsmethode optimieren und das Script über alle Vertices laufen lassen. Danke!
Ich habe im Weight-Paint Modus eine Option namens "Assign automatic from bones" gefunden. Sie weist jeder Vertex-Group ein Gewicht zu, welches abhängig ist zur Entfernung zum Bone. Kann man das nicht auch auf einzelne Vertices anwenden? Oder gibt es ansonsten noch irgend eine Option in Blender, mit der man nahe Vertices stark beeinflussen kann, aber weit entfernte weniger stark? Und ich habe noch nie mit Bone Envelopes gearbeitet, beeinflussen sie nur die Vertices im angezeigten Radius oder was? Könnte ich vielleicht die benutzen?
EDIT: Dieser Beitrag war auch für https://www.blendpolis.de/viewtopic.php?f=16&t=54452 gedacht.

Gruß
51423benam
Zuletzt geändert von 51423benam am 26.12.2016, 14:11, insgesamt 1-mal geändert.
51423benam
 
Registriert:
21.12.2016, 16:18

Re: Script zum Gewichte-Zuweisen funktioniert nicht

Beitragvon beta-tester » 26.12.2016, 09:52

51423benam hat geschrieben:Und ich habe noch nie mit Bone Envelopes gearbeitet, beeinflussen sie nur die Vertices im angezeigten Radius oder was? Könnte ich vielleicht die benutzen?
einfach ausprobieren!
(das soll heißen, ich weiss es jetzt nicht so genau)
das ist ja das tolle an computern, man kann verschiedene sachen ausprobieren, und was nicht passt, verwirft man und was gut ist benutzt man weiter :wink:
Ich gebe nur negatives Feedback - ist nur konstruktive Kritik! Rechtschreibung und Grammatik - ohne mich!
Dieser absolut überflüssige Beitrag stammt aus der Reihe: Klugscheißen mit beta-tester
Add-On Autor von: MilkShape3D (.ms3d) importer/exporter, FuturePinball (.fpx) importer
Benutzeravatar
beta-tester
1 Wettbewerbssieg
1 Wettbewerbssieg
 
Registriert:
30.07.2013, 21:10


Zurück zu Blender Python


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron