Ekranda Görüntü Röntgen modu

Oct 10 2020

Python'da yeniyim

3B görünüm alanında X ışını modunun daha iyi bir temsilini göstermek istiyorum. Başlık simgesi bana yeterince görünmüyor. AÇIK ve KAPALI arasındaki farkı görmek her zaman kolay değildir.

Başarılı olmayan potansiyel bir eklenti veya komut dosyası aradım.

Yanıtlar

2 batFINGER Oct 11 2020 at 08:21

Biraz görsel kaplama yapın

Yardımcı olamadı , ancak bu ve Hata arasındaki bağlantıyı, başlık rengini dinamik olarak değiştirmek için Eklenti görüyorum . Eklenti, kullanıcıya otomatik anahtar kare modunda olduklarını hatırlatmak için vardı.

Bir özelliği değiştirip bir ayarı açıp kapatmanın genel bir yolu verildiğinde, düşünmenin ilginç bir eklenti olacağını unutmayın. Ancak şimdiye kadar geri dönmedi

Benzer şekilde, röntgen modundaysa, davranışı 3B görünümün bg rengini değiştirecek şekilde değiştirmek için bir düzenleme.

Bunu bir "kavram kanıtı" test komut dosyası olarak düşünün, daha ince bir gösterge kullanılabilir.

metin düzenleyiciye yapıştırın komut dosyasını çalıştırın.

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

Daha fazla soruya yol açar.

Bir çizim işleyicisi tür için tanımlandığından, ekranda 1'den fazla 3d görünüm çizilirken senkronizasyonla ilgili bir sorun olabilir. Ayrıca görünüm alanının tema bg rengini ayarlamak, harman dosyası genişliğindedir.

Hızlı bir test korkularımı doğruladı. Metnin doğru olduğuna ancak tema bg renginin doğru olmadığına dikkat edin.

İlginç olan, aynı anda aktif olan iki temaya sahip olmaktır.

1 Stefakapapy Oct 14 2020 at 12:38

İşte ilgilenen varsa son senaryo;)

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