I have been working on a panel that contains a list of textures and additional information. This is for rendering a garment with multiple textures.
The main idea is to facilitate non-3D users to load a file with a garment, camera and lights. The add-on aids in listing the textures and quickly render single views.
So, to focus on user-friendliness, I want to display the textures in the panel. There are two option I found, template_icon and template_preview. I added both to the script to see the different.
template_icon works but display quality is low.
template_preview works with only one display. Having multiple previews either starts flickering or displays only one texture.
Below is my Panel Operator. Maybe it is how I setup my panel.
###### Panel for texture list
# ------------------------------------------------------------------------
class CADListPanel(Panel):
bl_label = "CAD List"
bl_idname = "VIEW3D_PT_CAD_list"
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
bl_category = 'CAD List'
def draw(self, context):
###For Preffix and Suffix
render_inputs = bpy.context.scene.NameInputProps
scene = context.scene
layout = self.layout
box = layout.box()
col = box.column(align=True)
grid = col.grid_flow(columns=1, align=True)
grid.scale_y = 1.5
grid.operator('render.cads', text="Render Colorways")
grid = col.grid_flow(columns=1, align=True)
grid.scale_y = .75
grid.prop(context.scene, 'output_path')
grid.prop(render_inputs, "preffix_render", text="Prefix")
grid.prop(render_inputs, "suffix_render", text="Suffix")
###Checkbox generator
box = layout.box()
col = box.column(align=True)
grid = col.grid_flow(columns=1, align=True)
grid.label(text="Colorways to Render")
split = col.split()
columns = [split.column() for i in range(5)]
cad_list = bpy.context.scene.cad_list
for i in range (len(cad_list)):
if i >= len(cad_list):
break
rendercheck = str(i + 1)
###Use scene.cad_list[i] instead of cad_list[i]
columns[(i) % 5].prop(scene.cad_list[i], "renderbool", text=rendercheck, icon='MATCLOTH')
box = layout.box()
col = box.column(align=True)
grid = col.grid_flow(columns=1, align=True)
grid.label(text="Activate Render Preview to aid in centerline position")
#####CAD info and options
for idx, cad in enumerate(scene.cad_list):
try:
box = layout.box()
col = box.column(align=True)
grid = col.grid_flow(columns=3, align=True)
grid.label(text="")
grid.label(text=f"CAD {idx + 1}")
grid.prop(cad, "renderbool")
grid = col.grid_flow(columns=1, align=True)
grid.prop(cad, "name")
###Open and Remove
grid = col.grid_flow(columns=1, align=True)
if cad.image is None:
open_operator = grid.operator("scene.open_cad", text="Open", icon='FILEBROWSER')
open_operator.index = idx ###Pass the index as a property
else:
remove_operator = grid.operator("scene.remove_cad", text="Remove")
remove_operator.cad_index = idx
grid = col.grid_flow(columns=2, align=True)
icon = 'TRIA_DOWN' if cad.toggle_options else 'TRIA_RIGHT'
grid.prop(cad, 'toggle_options', icon=icon, icon_only=True, )
grid.label(text="Toggle Information")
if cad.toggle_options:
###Display the texture
if cad.image is not None:
###Image input field
grid = col.grid_flow(columns=1, align=True)
grid.prop(cad, "image", text="")
grid = col.grid_flow(columns=2, align=True)
###X and Y positioning
grid.prop(cad, "posx")
grid.prop(cad, "posy")
#####Comparing texture display options
grid = col.grid_flow(columns=1, align=True)
###Preview layout Function
grid.template_preview(bpy.data.textures[cad.name], preview_id=f"cad.preview{idx + 1}")
###Icon layout Function
grid.template_icon(cad.image.preview.icon_id, scale=10)
###DPI and Scale
grid = col.grid_flow(columns=2, align=True)
row = grid.row()
row.alignment = 'CENTER'
row.label(text="DPI")
grid.prop(cad, "dpi")
row = grid.row()
row.alignment = 'CENTER'
row.label(text="SCALE")
grid.prop(cad, "scale")
###Dropdown list
grid = col.grid_flow(columns=1, align=True)
grid.prop(cad, "matchinglist")
###Color inputs
row = grid.row(align=True)
row.prop(cad, "colorbutton")
row = grid.row(align=True)
row.prop(cad, "colorthread")
###Boolean option to hide/unhide Color 3
row = grid.row()
row.prop(cad, "nocontrast")
if not cad.nocontrast:
row = grid.row()
row.prop(cad, "colorcontrast")
grid = col.grid_flow(columns=2, align=True)
icon = 'TRIA_DOWN' if cad.toggle_options2 else 'TRIA_RIGHT'
grid.prop(cad, 'toggle_options2', icon=icon, icon_only=True,)
grid.label(text="Additioanl Options")
if cad.toggle_options2:
grid = col.grid_flow(columns=1, align=True)
grid.prop(cad, "saturation")
grid.prop(cad, "weave")
grid.prop(cad, "color_variation")
grid.prop(cad, "backside")
else:
if cad.image is not None:
grid = col.grid_flow(columns=1, align=True)
image = cad.image
grid.template_icon(image.preview.icon_id, scale=5)
except AttributeError:
###Handle the case where the image preview is not available
layout.label(text="Image preview not available.")
###Add texture button
layout.operator("scene.add_cad")
def update(self, context):
self.report({'INFO'}, "Panel Updated")
bpy.context.area.tag_redraw()