Код: Выделить всё
def draw_callback_px(self, context):
font_id = 0
# A4 dimensions at 300 DPI
a4_width = 707
a4_height = 1000
region_width = context.region.width
region_height = context.region.height
x_offset = (region_width - a4_width) / 2
y_offset = (region_height - a4_height) / 2
draw_a4_outline(context, x_offset, y_offset, a4_width, a4_height)
font_size = 14
background_color = (1.0, 1.0, 1.0, 0.8)
rectangle_height = 3.5 * font_size
rectangle_width = a4_width - 20
draw_filled_rectangle(
x_offset + 10, y_offset + a4_height - 20, rectangle_width, rectangle_height, background_color
)
# Rest of drawing code...
class OBJECT_OT_draw_dimensions(Operator):
bl_idname = "view3d.draw_dimensions"
bl_label = "Draw Dimensions"
bl_options = {"REGISTER", "UNDO"}
_handle = None
def modal(self, context, event):
if event.type in {"RIGHTMOUSE", "ESC"} or context.mode != "OBJECT":
if self._handle is not None:
bpy.types.SpaceView3D.draw_handler_remove(self._handle, "WINDOW")
context.area.tag_redraw()
self._handle = None
return {"CANCELLED"}
if event.type in {"TIMER"}:
context.area.tag_redraw()
return {"PASS_THROUGH"}
def invoke(self, context, event):
if context.area.type == "VIEW_3D":
if self._handle is None:
self._handle = bpy.types.SpaceView3D.draw_handler_add(
draw_callback_px, (self, context), "WINDOW", "POST_PIXEL"
)
context.window_manager.modal_handler_add(self)
return {"RUNNING_MODAL"}
else:
self.report({"WARNING"}, "Dimension drawing is already active")
return {"CANCELLED"}
else:
self.report({"WARNING"}, "View3D not found, cannot run operator")
return {"CANCELLED"}
class OBJECT_OT_export_to_image(Operator):
bl_idname = "object.export_to_image"
bl_label = "Export to Image"
bl_options = {"REGISTER", "UNDO"}
fp = fr"my_file_path.JPEG"
def execute(self, context):
global to_draw
to_draw = False
a4_width = 707
a4_height = 1000
framebuffer_image = bpy.data.images.new("buffer_copy", a4_width, a4_height, float_buffer=True, alpha=False, is_data=True)
def draw():
global to_draw
if to_draw:
framebuffer = gpu.state.active_framebuffer_get()
viewport_info = gpu.state.viewport_get()
width = viewport_info[2]
height = viewport_info[3]
framebuffer_image.scale(a4_width, a4_height)
pixelBuffer = framebuffer.read_color(
int((width - a4_width) / 2), int((height - a4_height) / 2), a4_width, a4_height, 4, 0, 'FLOAT'
)
pixelBuffer.dimensions = a4_width * a4_height * 4
framebuffer_image.pixels.foreach_set(pixelBuffer)
framebuffer_image.file_format = 'JPEG'
framebuffer_image.filepath_raw = self.fp
try:
framebuffer_image.save()
self.report({"INFO"}, f"Exported to Image: {self.fp}")
except Exception as e:
self.report({"ERROR"}, f"Failed to save image: {str(e)}")
to_draw = False
def update_draw():
global to_draw
bpy.ops.wm.redraw_timer(type='DRAW_WIN_SWAP', iterations=1)
to_draw = True
bpy.ops.wm.redraw_timer(type='DRAW_WIN_SWAP', iterations=1)
# Ensure the active area is the 3D view for capturing
for area in context.screen.areas:
if area.type == "VIEW_3D":
for region in area.regions:
if region.type == "WINDOW":
# Draw handler setup for dimensions
draw_handler = bpy.types.SpaceView3D.draw_handler_add(draw, (), "WINDOW", "POST_PIXEL")
# draw_handler_dimensions = bpy.types.SpaceView3D.draw_handler_add(draw_callback_px, (self, context), "WINDOW", "POST_PIXEL")
time.sleep(.1)
update_draw()
# Remove the dimensions draw handler after capturing
bpy.types.SpaceView3D.draw_handler_remove(draw_handler, "WINDOW")
# bpy.types.SpaceView3D.draw_handler_remove(draw_handler_dimensions, "WINDOW")
# Delete the created image from bpy.data.images
bpy.data.images.remove(framebuffer_image)
return {"FINISHED"}
Код: Выделить всё
bpy types SpaceView3D draw_handler_add(draw_callback_px, (self, context), "WINDOW", "POST_PIXEL")
Почему не отображаются материалы и свет? Выполнение того же самого с «POST_VIEW» показывает правильный вид (материал, рендеринг), но без линий и прямоугольников. В документации указано только:
Обычно POST_PIXEL для 2D-рисунков и POST_VIEW для 3D-рисунков. В некоторых случаях можно использовать PRE_VIEW. BACKDROP можно использовать для фона в редакторе узлов. (types.py)
Как настроить сцену (кроме освещения)? Как это должно выглядеть:

Подробнее здесь: https://stackoverflow.com/questions/787 ... -and-light