On-Screen-Display-Röntgenmodus
Ich bin neu in Python
Ich möchte im 3D-Ansichtsfenster eine bessere Darstellung des Röntgenmodus anzeigen. Das Header-Symbol ist für mich nicht sichtbar genug. Es ist nicht immer leicht, den Unterschied zwischen EIN und AUS zu erkennen.
Ich habe erfolglos nach einem möglichen Addon oder Skript gesucht.
Antworten
Machen Sie eine visuelle Überlagerung
Konnte nicht anders, als den Zusammenhang zwischen diesem und dem Fehler im Addon zu sehen, um die Headerfarbe dynamisch zu ändern. Das Addon dort sollte den Benutzer daran erinnern, dass sie sich im automatischen Keyframe-Modus befinden.
Denken Sie daran, dass das Denken zu der Zeit ein interessantes Addon wäre, wenn eine generische Möglichkeit zum Verknüpfen eines Eigenschaftstauschs mit dem Umschalten einer Einstellung gegeben wäre. Allerdings sind bis jetzt nicht zurückgekehrt
Ebenso eine Bearbeitung, um das Verhalten zu ändern und stattdessen die Hintergrundfarbe der 3D-Ansicht im Röntgenmodus zu ändern.
Betrachten Sie dies als ein "Proof of Concept" -Testskript, ein subtilerer Indikator könnte verwendet werden.
In Texteditor einfügen Klicken Sie auf Skript ausführen.
import blf
import bpy
bl_info = {
"name": "New Object",
"author": "Your Name Here",
"version": (1, 0),
"blender": (2, 80, 0),
"location": "View3D > Add > Mesh > New Object",
"description": "Adds a new Mesh Object",
"warning": "",
"wiki_url": "",
"category": "Add Mesh",
}
highlight_color = (0.4, 0, 0)
class DrawingClass:
def __init__(self, prop):
from bpy import context
self.prop = prop
self.col = context.preferences.themes[0].view_3d.space.gradients.high_gradient[:]
self.handle = bpy.types.SpaceView3D.draw_handler_add(
self.draw_text_callback, (), 'WINDOW', 'POST_PIXEL')
def draw_text_callback(self):
from bpy import context
font_id = 0 # XXX, need to find out how best to get this.
if not hasattr(context, "scene"):
return None
shading = context.space_data.shading
if shading.show_xray:
context.preferences.themes[0].view_3d.space.gradients.high_gradient = highlight_color
# draw some text
blf.position(font_id, 18, 50, 0)
blf.size(font_id, 50, 72)
blf.draw(font_id, f"{self.prop}")
else:
context.preferences.themes[0].view_3d.space.gradients.high_gradient = self.col
def remove_handle(self):
from bpy import context
context.preferences.themes[0].view_3d.space.gradients.high_gradient = self.col
bpy.types.SpaceView3D.draw_handler_remove(self.handle, 'WINDOW')
dc = None
def register():
global dc
dc = DrawingClass("XRay Mode")
def unregister():
global dc
if dc:
dc.remove_handle()
dc = None
if __name__ == "__main__":
register()
Führt zu weiteren Fragen.
Ein Problem kann sein, dass ein Zeichenhandler für den Typ definiert ist. Dies kann ein Problem bei der Synchronisierung sein, wenn mehr als eine Ansicht 3d auf dem Bildschirm gezeichnet wird. Das Festlegen der Design-Hintergrundfarbe des Ansichtsfensters erfolgt über die gesamte Datei.
Ein schneller Test bestätigte meine Befürchtungen. Beachten Sie, dass der Text korrekt ist, die Farbe des Themas jedoch nicht.
Interessant ist, dass zwei Themen gleichzeitig aktiv sind
Hier ist das endgültige Skript, wenn jemand interessiert ist;)
import blf
import bpy
bl_info = {
"name": "Better Xray Visualization",
"author": "Stefakapapy",
"version": (1, 0),
"blender": (2, 80, 0),
"location": "Toggle Xray",
"description": "Displays better visual representation on screen",
"category": "Interface",
}
class DrawingClass:
def __init__(self, prop):
from bpy import context
self.prop = prop
self.handle = bpy.types.SpaceView3D.draw_handler_add(
self.draw_text_callback, (), 'WINDOW', 'POST_PIXEL')
def draw_text_callback(self):
from bpy import context
if not hasattr(context, "scene"):
return None
shading = context.space_data.shading
shading_type = context.space_data.shading.type
xray = shading.show_xray
xray_wireframe = shading.show_xray_wireframe
if (shading_type=="SOLID" and xray) or (shading_type=="WIREFRAME" and xray_wireframe):
display_xray = True
else:
display_xray = False
if display_xray:
font_id = 0 # XXX, need to find out how best to get this.
color1 = (0, 0.624, 1.0, 1.0)
width = context.area.width
blf.size(font_id, 40, 72)
dim_x = blf.dimensions(font_id, self.prop)[0]/2
blf.position(font_id, width/2-dim_x, 18, 0)
blf.color(font_id, *color1)
blf.draw(font_id, f"{self.prop}")
def remove_handle(self):
from bpy import context
bpy.types.SpaceView3D.draw_handler_remove(self.handle, 'WINDOW')
dc = None
def register():
global dc
dc = DrawingClass("XRay Mode")
def unregister():
global dc
if dc:
dc.remove_handle()
dc = None
if __name__ == "__main__":
register()