Python Menü und If

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Tiles
Establishment
Beiträge: 1990
Registriert: 11.01.2003, 13:21
Kontaktdaten:

Python Menü und If

Beitrag von Tiles »

Ich stochere derzeit im Blender Menü rum. Und will ein bestimmtes Menüteil nur dann anzeigen wenn das entsprechende Objekt ausgewähl ist. Leider schiesst mir das Ding hier quer. Und ich komme nicht drauf wieso.

Das Problem ist, sobald ein If in diesem speziellen Menü steht wird der Rest abgesäbelt wenn die If Abfrage gar kein Objekt findet. Ist auch irgendwie logisch und nachvollziehbar. Null Objekt eben.

Also konkret:

Code: Alles auswählen

 if obj.type == 'CAMERA':
            layout.menu("VIEW3D_MT_object_specials")
Es kann ein Würfel in der Szene drin sein. Dann ist halt das If falsch weil es keine Kamera ist. Aber das Menü wird trotzdem komplett angezeigt. Wenn aber gar kein Objekt in der Szene ist wird einfach alles nach dem If abgesäbelt.

Ich brauche also wohl eine Abfrage ob überhaupt ein Objekt in der Szene ist. Probiert habe ich schon ein if obj.type != None: . Geholfen hat es leider nichts. Das Menüteil nach dem If fehlt weiterhin ^^

Lustigerweise funktioniert das mit den if statements in dem submenü das ich hier anzeigen will tadellos. Da ist allerdings auch immer ein Objekt vorhanden wenn das aufgerufen wird.

Jemand ne Idee was ich hier falsch mache?

Mein Einbau sieht im Moment so aus:

Code: Alles auswählen

class VIEW3D_MT_object(Menu):
    bl_context = "objectmode"
    bl_label = "Object"

    def draw(self, context):
        layout = self.layout
        scene = context.scene
        obj = context.object

        layout.operator("ed.undo")
        layout.operator("ed.redo")
        layout.operator("ed.undo_history")

        if obj.type != None:
            if obj.type == 'CAMERA':
                layout.menu("VIEW3D_MT_object_specials")

        layout.separator()

        layout.menu("VIEW3D_MT_transform_object")
        layout.menu("VIEW3D_MT_mirror")
        layout.menu("VIEW3D_MT_object_clear")
        layout.menu("VIEW3D_MT_object_apply")
        layout.menu("VIEW3D_MT_snap")

        layout.separator()
Und hier das If Zeug aus dem Submenü, auszugsweise:

Code: Alles auswählen

class VIEW3D_MT_object_specials(Menu):
    bl_label = "Specials"

    @classmethod
    def poll(cls, context):
        # add more special types
        return context.object

    def draw(self, context):
        layout = self.layout

        scene = context.scene
        obj = context.object

        if obj.type == 'CAMERA':
            layout.operator_context = 'INVOKE_REGION_WIN'

            if obj.data.type == 'PERSP':
                props = layout.operator("wm.context_modal_mouse", text="Camera Lens Angle")
                props.data_path_iter = "selected_editable_objects"
                props.data_path_item = "data.lens"
                props.input_scale = 0.1
                if obj.data.lens_unit == 'MILLIMETERS':
                    props.header_text = "Camera Lens Angle: %.1fmm"
                else:
                    props.header_text = "Camera Lens Angle: %.1f\u00B0"

            else:
                props = layout.operator("wm.context_modal_mouse", text="Camera Lens Scale")
                props.data_path_iter = "selected_editable_objects"
                props.data_path_item = "data.ortho_scale"
                props.input_scale = 0.01
                props.header_text = "Camera Lens Scale: %.3f"

            if not obj.data.dof_object:
                view = context.space_data
                if view and view.camera == obj and view.region_3d.view_perspective == 'CAMERA':
                    props = layout.operator("ui.eyedropper_depth", text="DOF Distance (Pick)")
                else:
                    props = layout.operator("wm.context_modal_mouse", text="DOF Distance")
                    props.data_path_iter = "selected_editable_objects"
                    props.data_path_item = "data.dof_distance"
                    props.input_scale = 0.02
                    props.header_text = "DOF Distance: %.3f"
                del view
           layout.separator()
Doof ist halt dass hier der Code Tag das Python zertrümmert ^^

Wenn jemand von euch rumspielen will, das Script ist das space_view3d.py in scripts/startup/bl_ui, ab Zeile 1025 gehts los.
Dateianhänge
ifinpythonmenu.jpg
Free Gamegraphics, Freeware Games https://www.reinerstilesets.de
Die deutsche 3D Community: https://www.3d-ring.de
Benutzeravatar
Schrompf
Moderator
Beiträge: 4838
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Python Menü und If

Beitrag von Schrompf »

Fehlen auch überall im Orginal die Einrückungen, oder ist das nur ein lokales Copy&Paste-Problem? Weil: bei Python sind Einrückungen Teil des Syntax, die geben u.A. an, wieviel zu dem if gehört und ab wann es wieder normaler unbedingter Code ist.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Tiles
Establishment
Beiträge: 1990
Registriert: 11.01.2003, 13:21
Kontaktdaten:

Re: Python Menü und If

Beitrag von Tiles »

Nene. Die Einrückungen gehen erst hier im Forum verloren. Das mag wohl den Python Syntax nicht :)

Wenn meine Einrückungen wirklich so wären wie hier würde alles streiken. Da ist Python echt übel, da langt eine falsche Einrückung, und schon geht gar nichts mehr. Was ganz übel war war mal dass meine Einrückungen von externem Python Code in Blender nicht als solche erkannt wurden. Mann hab ich geflucht bis ich da drauf gekommen bin. Weil es sah alles gut aus ...

Aber VS meckert einen ja mit der Python Erweiterung an wenn die Einrückungen nicht stimmen :)
Dateianhänge
indent.jpg
Free Gamegraphics, Freeware Games https://www.reinerstilesets.de
Die deutsche 3D Community: https://www.3d-ring.de
Benutzeravatar
Tiles
Establishment
Beiträge: 1990
Registriert: 11.01.2003, 13:21
Kontaktdaten:

Re: Python Menü und If

Beitrag von Tiles »

Lösung gefunden. Der Check den ich brauche um zu checken ob überhaupt ein Objekt in der Szene ist heisst

Code: Alles auswählen

if context.object :
Dank geht an Byob auf dem Blendpolis Forum :)
Free Gamegraphics, Freeware Games https://www.reinerstilesets.de
Die deutsche 3D Community: https://www.3d-ring.de
Antworten