Blender - Hotkeys für Identifiers mit verschiedenen Props

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Tiles

Blender - Hotkeys für Identifiers mit verschiedenen Props

Beitrag von Tiles »

Im Moment arbeite ich an einem Blender Plugin mit dem ich ein paar wichtige Hotkeys im Workspace anzeigen will. Damit der User nicht raten oder stundenlang rumgooglen muss um nur mal die einfachsten Sachen rauszufinden. Wie zum Beispiel wie man den Viewport dreht. Der Text wird schon mal angezeigt. So weit so gut. Das könnte ich nun auch einfach hardcoden für die verschiedenen Keymaps.

Besser wäre es natürlich wenn das Plugin den derzeitigen Hotkey erkennen würde. Damit der Text nicht unbrauchbar wird sobald jemand die Hotkeys ändert. Auch das funktioniert im Moment schon. Für jeweils einen Identifier in den Hotkey Nodes.

Nun werden in Blender viele Tools zwar durch den gleichen Identifier angesprochen. Aber sie unterscheiden sich in ein paar Properties. In meinem Beispiel zwei Knife Tools. Einmal Knife und einmal Select. Knife hat den Hotkey K. Select hat den Hotkey Shift K.

Identifier ist beides mal mesh.knife_tool. Unterschiedlich sind die Flags only_selected und use_occlude_geometry. Ich habe zwar inzwischen jeweils für sich Zugriff auf diese Properties, siehe weiter unten. Aber ich bekomme die zwei Tools einfach nicht sortiert. Egal was ich probiere, mir zeigt es immer nur den ersten Hotkey an. Was mir fehlt ist das Ganze dem Identifier zuzuweisen, damit dann auch wirklich das Tool mit dem richtigen Hotkey an der Strippe ist.

Bei einem Button ist das einfach. Da definierst du den Button. Und schreibst die entsprechenden Properties dahinter. Mit einem Gleichzeichen und dem Zustand zu definieren den die Flags oder die Values haben sollen. So zum Beispiel. Der Knife Button. Und dann findet Blender auch die richtige Input Node.

Code: Alles auswählen

props = row.operator("mesh.knife_tool", text="Knife")
        props.use_occlude_geometry = True
        props.only_selected = False
Für den Scripting Zugriff funktioniert das so leider nicht. Da stellt es mir stattdessen die Flags um. Wie gesagt, für sich genommen habe ich schon das Richtige Property an der Strippe. Nur eben nicht so dass ich auch die richtige Hotkey Node an die Strippe bekomme ^^

Ich habe inzwischen alles durch was mir so eingefallen ist. If, For, While, und noch viel weiteres ahnungsloses Rumgestümpere. Nichts hat geholfen. Google bringt mich auch kein Stück weiter. Vermutlich fehlt mir der richtige Suchbegriff. Und das Echo auf den Blenderforen ist derzeit Null. Ich hoffe ja immer noch dass das nur an den Feiertagen liegt und sich da doch noch was tut.

Hat vielleicht jemand eine Ahnung von Python, und eine Idee wie ich hier vorgehen müsste? Ich bin natürlich auch für jede andere Idee dankbar :)

Leider zertrümmert das Forum hier ja die Python Einrückungen. Im Anhang gibts die Script Version die die Flags umstellt ...
Dateianhänge
propertiesproblem.jpg
propertiesproblem.rar
(2.11 KiB) 425-mal heruntergeladen
Tiles

Re: Blender - Hotkeys für Identifiers mit verschiedenen Prop

Beitrag von Tiles »

Niemand? ^^

Im Moment versuche ich mittels eines Tuple ranzukommen. Aber irgendwas mache ich wohl auch hier wieder grottenfalsch.

Folgendes. Die Keymapdinger stecken in einem Tuple. Die kann ich mir auflisten lassen. Mit print(tuple(keymaps_3DV.keymap_items.keys()))

Sieht dann so aus in der Konsole:

Code: Alles auswählen

('mesh.loop_select', 'mesh.loop_select', 'mesh.edgering_select', 'mesh.edgering_
select', 'mesh.shortest_path_pick', 'mesh.select_all', 'mesh.select_all', 'mesh.
select_more', 'mesh.select_less', 'mesh.select_linked_pick', 'mesh.select_linked
_pick', 'mesh.hide', 'mesh.hide', 'mesh.reveal', 'view3d.edit_mesh_extrude_move_
normal', 'mesh.duplicate_move', 'mesh.dupli_extrude_cursor', 'mesh.dupli_extrude
_cursor', 'wm.call_menu', 'mesh.knife_tool', 'mesh.knife_tool', 'wm.call_menu',
'object.subdivision_set', 'object.subdivision_set', 'object.subdivision_set', 'o
bject.subdivision_set', 'object.subdivision_set', 'object.subdivision_set', 'mes
h.select_mode', 'mesh.select_mode', 'mesh.select_mode', 'mesh.select_mode', 'mes
h.delete', 'mesh.delete', 'mesh.delete')
Sou. Da hat es nun zwei mal das 'mesh.knife_tool' drin. Aaausgezeichnet. An die zwei Dinger will ich mittels einer for Schleife ran. Also zwei Variablen, und das Ganze per For Schleife abfragen.

x = 'mesh.loop_select'
tup = tuple(keymaps_3DV.keymap_items.keys())

for x in tup:
print("i am a mesh.loop_select item")
print("test")

Nach meinem Verständnis müsste es jetzt zweimal "i am a mesh.loop_select item" in der Konsole printen. Und zweimal "test". Das Item gibts ja zweimal im tuple. Es printet aber jeweils nur einmal. Und Fehler gibts keine aus. Sprich auch auf dem Wege habe ich wohl wieder nur eine Instanz des mesh.knife_tools an der Strippe :/

Wo liegt denn hier mein Denkfehler?

Script hängt an.
Dateianhänge
tupleproblem4.rar
(2.18 KiB) 429-mal heruntergeladen
Alexander Kornrumpf
Moderator
Beiträge: 2138
Registriert: 25.02.2009, 13:37

Re: Blender - Hotkeys für Identifiers mit verschiedenen Prop

Beitrag von Alexander Kornrumpf »

Wo liegt denn hier mein Denkfehler?
Du machst es falsch ;)

Auf eine so kreative art, dass ich es nicht in drei Sätzen erklären kann.

Was du machen musst ist in etwa das:

Code: Alles auswählen

for keymap_item_key in keymaps_3DV.keymap_items.keys():
~~~~if keymap_item_key ==  'mesh.loop_select':
~~~~~~~~~#was immer du eigentlich tun wolltest
Alexander Kornrumpf
Moderator
Beiträge: 2138
Registriert: 25.02.2009, 13:37

Re: Blender - Hotkeys für Identifiers mit verschiedenen Prop

Beitrag von Alexander Kornrumpf »

Alexander Kornrumpf hat geschrieben:
Wo liegt denn hier mein Denkfehler?
Du machst es falsch ;)

Auf eine so kreative art, dass ich es nicht in drei Sätzen erklären kann.

Was du machen musst ist in etwa das:

Code: Alles auswählen

for keymap_item_key in keymaps_3DV.keymap_items.keys():
~~~~if keymap_item_key ==  'mesh.loop_select':
~~~~~~~~~#was immer du eigentlich tun wolltest
EDIT: Aber die Keys sind wahrscheinlich keine strings, sonst wären sie nicht doppelt. Also ist das noch nicht ganz es. Aber vielleicht reicht es um dich zu starten.
Tiles

Re: Blender - Hotkeys für Identifiers mit verschiedenen Prop

Beitrag von Tiles »

Du machst es falsch ;)

Auf eine so kreative art, dass ich es nicht in drei Sätzen erklären kann.
Juhuu \o/

Verdammt, es gibt sooo viel zu lernen ^^

Strings sind es keine, nein. Das sind die Keymap items aus den Blender User Preferences. Da stecken die Hotkeys drin. Dein Hinweis gibt mir jedenfalls einen weiteren Denkansatz. Danke erst mal :)
Alexander Kornrumpf
Moderator
Beiträge: 2138
Registriert: 25.02.2009, 13:37

Re: Blender - Hotkeys für Identifiers mit verschiedenen Prop

Beitrag von Alexander Kornrumpf »

Tiles hat geschrieben:
Du machst es falsch ;)

Auf eine so kreative art, dass ich es nicht in drei Sätzen erklären kann.
Juhuu \o/

Verdammt, es gibt sooo viel zu lernen ^^

Strings sind es keine, nein. Das sind die Keymap items aus den Blender User Preferences. Da stecken die Hotkeys drin. Dein Hinweis gibt mir jedenfalls einen weiteren Denkansatz. Danke erst mal :)
Neuer Tag, neues Glück.

Du hast zwei Probleme. Das eine ist wie gesagt, dass du Python auf eine echt krative Weise benutzt, die zeigt, dass du keine Ahnung hast was du tust. Da kann ich dir nicht so sehr helfen. Naja, du sagst es ja selbst, es gibt viel zu lernen.

Das andere ist, dass ein key im Sinne wie "keymap_items.key()", nicht zu verwechseln mit einem Hotkey, natürlich einmalig sein muss, weil du ja genau eine Antwort bekommen willst, wenn du nach dem key fragst. Genau das ist ja eben dein Problem. D.h. entweder die Strings die du angezeigt bekommst (doppelt) sind gar nicht die keys, dann musst du "nur" den tatsächlichen Key rausfinden und nach dem fragen, oder das Blender-API hat es total verkackt.
Tiles

Re: Blender - Hotkeys für Identifiers mit verschiedenen Prop

Beitrag von Tiles »

Natürlich habe ich meine Lücken. Wenn ich wüsste was ich tue müsste ich ja hier nicht fragen. Ich fange hier eben bei Python fast bei Null an. Das ist halt doch was anderes als Unity :)

Im Grunde hängt es ja "nur noch" am Hotkeys auslesen. Der Rest vom Plugin tut inzwischen was es soll. Und für jeweils ein Keymapitem im tuple tut es ja auch schon. Ich hoffe also mal dass da nicht sämtlicher Hopfen und Malz verloren ist ;)

Zur Not könnte ich auch einfach das Auslesen bleiben lassen. Und die Hotkeys im Plugin hardcoden. Das Plugin soll ohnehin nur Anfängern den Einstieg erleichtern. Damit sie eben nicht schon für die simpelsten Dinger wie Navigation gleich ein Tutorial brauchen. Aber nun habe ich schon mal angefangen die Hotkeys doch auszulesen. Und was ich anfange bringe ich in der Regel auch zum Abschluss.
Das andere ist, dass ein key im Sinne wie "keymap_items.key()", nicht zu verwechseln mit einem Hotkey, natürlich einmalig sein muss, weil du ja genau eine Antwort bekommen willst, wenn du nach dem key fragst. Genau das ist ja eben dein Problem. D.h. entweder die Strings die du angezeigt bekommst (doppelt) sind gar nicht die keys, dann musst du "nur" den tatsächlichen Key rausfinden und nach dem fragen, oder das Blender-API hat es total verkackt.
Ja natürlich. Das Problem ist doch klar. Das hatte ich ja schon gleich zu Anfang definiert. Wie bekomme ich diese richtige einmalige Instanz an die Strippe, denn es gibt ja manchmal zwei oder sogar noch mehr davon, und wie komme ich dann an den Hotkey ran. Der erste Schritt war mal überhaupt an die zwei unterschiedlichen Instanzen ranzukommen. Das ging über das tuple bei dem du mir hier nun geholfen hast. Funzt übrigens. Nun wird der Key zweimal geprintet. Wenn auch immer noch falsch. Aber schon mal zwei mal anstatt nur einmal.

Könnte natürlich auch sein dass die Blender API querschiesst. Ich denke aber nicht dass da die API vermurkst ist. Für eine Instanz geht es ja. Und wie ich an den Key für diese eine Instanz rankomme habe ich ja auch schon gelöst. Es geht wirklich nur darum die richtige Instanz an die Strippe zu bekommen.

Nächster Schritt in der Problemlösung ist die zwei mesh.loop_select Instanzen auseinanderzuklabüsern, um endlich den richtigen Hotkey an die Strippe zu bekommen. Diese zwei Instanzen unterscheiden sich durch Properties. Leider komme ich auch hier mal wieder nicht zum Ziel. Vermutlich mache ich es wieder kreativ falsch. Wie gesagt, es printet immer noch nur den ersten Key aus, zweimal ^^

Du hast nicht zufällig noch eine Idee? :)

Code: Alles auswählen

    tup = tuple(keymaps_3DV.keymap_items.keys())
    for item in tup:
        ~~~~km = keymaps_3DV.keymap_items['mesh.knife_tool'] 
        ~~~~if item == 'mesh.loop_select' and km.properties.use_occlude_geometry == True and km.properties.only_selected == False: 
            ~~~~~~~~print(km.type) # the main key. This one is K
        ~~~~elif item == 'mesh.loop_select' and km.properties.use_occlude_geometry == False and km.properties.only_selected == True:
            ~~~~~~~~print(km.type) # the main key. This one should display the other hotkey. There are two mesh.knife_tools in the tuple.
Dateianhänge
secondhotkeyproblem.jpg
Alexander Kornrumpf
Moderator
Beiträge: 2138
Registriert: 25.02.2009, 13:37

Re: Blender - Hotkeys für Identifiers mit verschiedenen Prop

Beitrag von Alexander Kornrumpf »

Tiles hat geschrieben:
Du hast nicht zufällig noch eine Idee? :)

Code: Alles auswählen

    tup = tuple(keymaps_3DV.keymap_items.keys())
    for item in tup:
        ~~~~km = keymaps_3DV.keymap_items['mesh.knife_tool'] 
        ~~~~if item == 'mesh.loop_select' and km.properties.use_occlude_geometry == True and km.properties.only_selected == False: 
            ~~~~~~~~print(km.type) # the main key. This one is K
        ~~~~elif item == 'mesh.loop_select' and km.properties.use_occlude_geometry == False and km.properties.only_selected == True:
            ~~~~~~~~print(km.type) # the main key. This one should display the other hotkey. There are two mesh.knife_tools in the tuple.
Du hast es doch schon fast. Möglicherweise funktioniert das hier:

Code: Alles auswählen

for (item, km) in keymaps_3DV.keymap_items.items(): # beachte: items() statt keys()
    if item == 'mesh.loop_select' and km.properties.use_occlude_geometry == True and km.properties.only_selected == False: 
        print(km.type, km.shift) # the main key. This one is K
    elif item == 'mesh.loop_select' and km.properties.use_occlude_geometry == False and km.properties.only_selected == True:
        print(km.type, km.shift) # the main key. This one should display the other hotkey. There are two mesh.knife_tools in the tuple.
Nachtrag: Unabhängig davon printeste du gar nicht ob shift zum Key gehört?! das steht in km.shift und nicht in km.type (https://www.blender.org/api/blender_pyt ... pItem.html) Also kannst du K und Shift-K gar nicht unterscheiden nach deiner Methode. Vielleicht hat es ja schon vorher funktioniert und du hast es nicht gemerkt (obwohl ich das nicht glaube).
Zuletzt geändert von Alexander Kornrumpf am 08.01.2016, 12:48, insgesamt 3-mal geändert.
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4275
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: Blender - Hotkeys für Identifiers mit verschiedenen Prop

Beitrag von Chromanoid »

Sorry bin auf "Ändern" statt zitieren gekommen und habe alles kaputt gemacht.

Also Chromanoid hatte dakenswerterweise darauf hingewiesen dass

Code: Alles auswählen

 die whitespaces nicht frisst.

Tut mir echt leid

--Alex

Kein Problem :D ist mir auch schon mal fast passiert. Ich hatte es damals bei der Vorschau gemerkt...

--Christian
Zuletzt geändert von Chromanoid am 08.01.2016, 13:17, insgesamt 2-mal geändert.
Tiles

Re: Blender - Hotkeys für Identifiers mit verschiedenen Prop

Beitrag von Tiles »

Danke für den Hinweis mit dem Code Tag. Das machts doch einiges leichter :)

Erst mal, ich hatte da nen Copy n Paste Fehler drin. Ich brauche ja mesh.knife_tool, und nicht mesh.loop_select. Der Codeschnipsel muss also so aussehen. Gute Gelegenheit den Codetag zu testen:

Code: Alles auswählen

    for (item, km) in keymaps_3DV.keymap_items.items(): # beachte: items() statt keys()
        if item == 'mesh.knife_tool' and km.properties.use_occlude_geometry == True and km.properties.only_selected == False:
            print(km.type) # the main key. This one is K
        elif item == 'mesh.knife_tool' and km.properties.use_occlude_geometry == False and km.properties.only_selected == True:
            print(km.type) # the main key. This one should display the other hotkey. There are two mesh.knife_tools in the tuple.  
Und es funktioniert perfekt. Ich habe endlich den zweiten Hotkey an der Strippe \o/ . Und ich denke ich verstehe sogar den Codeschnipsel. Das ist fast wichtiger ^^

Nun muss ich das nur noch im Plugin umsetzen. Danke für die Ideen und die Hilfe :)
Alexander Kornrumpf
Moderator
Beiträge: 2138
Registriert: 25.02.2009, 13:37

Re: Blender - Hotkeys für Identifiers mit verschiedenen Prop

Beitrag von Alexander Kornrumpf »

Freut mich. Und gerne.
Antworten