Python Menü und If
Verfasst: 20.11.2015, 11:41
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:
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:
Und hier das If Zeug aus dem Submenü, auszugsweise:
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.
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")
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()
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()
Wenn jemand von euch rumspielen will, das Script ist das space_view3d.py in scripts/startup/bl_ui, ab Zeile 1025 gehts los.