Ekranda Görüntü Röntgen modu
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
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.
İş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()