On-Screen-Display-Röntgenmodus

Oct 10 2020

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

2 batFINGER Oct 11 2020 at 08:21

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

1 Stefakapapy Oct 14 2020 at 12:38

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()