这是我正在尝试创建的附加组件:
import bpy
import os
import sys
import subprocess
import time
from threading import *
class Repeat(Thread):
def __init__(self,delay,function,*args,**kwargs):
Thread.__init__(self)
self.abort = Event()
self.delay = delay
self.args = args
self.kwargs = kwargs
self.function = function
def stop(self):
self.abort.set()
def run(self):
while not self.abort.isSet():
self.function(*self.args,**self.kwargs)
self.abort.wait(self.delay)
class ExportToGIMP(bpy.types.Operator):
bl_idname = "uv.exporttogimp"
bl_label = "Export to GIMP"
def execute(self, context):
f = open("/home/antoni4040/blender.txt", "w").close()
self.filepath = os.path.join(os.path.dirname(bpy.data.filepath), "Layout")
bpy.ops.uv.export_layout(filepath=self.filepath, check_existing=True, export_all=False, modified=False, mode='PNG', size=(1024, 1024), opacity=0.25, tessellated=False)
self.files = os.path.dirname(bpy.data.filepath)
cmd = " (python-fu-bgsync RUN-NONINTERACTIVE)"
subprocess.Popen(['gimp', '-b', cmd])
file = Repeat(3, self.up)
file.start()
return {'FINISHED'};
def doit(self):
r = Repeat(3, self.update)
r.start()
def up(self):
f = open("/home/antoni4040/blender.txt", "r")
string = f.read()
if "ok" in string:
self.materialize()
self.doit()
file.stop()
else:
pass
def update(self):
self.layout_texture.image.reload()
for area in bpy.data.screens['Default'].areas:
if area.type in ['IMAGE_EDITOR', 'VIEW_3D']:
area.tag_redraw()
def materialize(self):
self.layout_texture = bpy.data.textures.new(name = "Layout_Texture", type = "IMAGE")
self.material = bpy.data.materials.new(name="Layout")
self.object = bpy.context.active_object
self.material_texture = self.material.texture_slots.add()
self.material_texture.texture = self.layout_texture
self.material_texture.texture_coords = "UV"
self.filepath2 = "/home/antoni4040/Έγγραφα/Layout1.png"
self.texture_image = bpy.data.images.load(self.filepath2)
self.layout_texture.image = self.texture_image
self.con_obj = self.object.data
self.con_obj.materials.append(self.material)
bpy.data.screens['UV Editing'].areas[1].spaces[0].image = self.texture_image
def exporttogimp_menu(self, context):
self.layout.operator(ExportToGIMP.bl_idname, text="Export To GIMP")
bpy.utils.register_class(ExportToGIMP)
bpy.types.IMAGE_MT_uvs.append(exporttogimp_menu)
与此一起使用:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from gimpfu import *
import time
import sys
def blender_gimp_sync():
im_dir = "/home/antoni4040/Έγγραφα/Layout.png"
image = gimp.pdb.gimp_file_load(im_dir, im_dir)
gimp.Display(image)
layer = gimp.pdb.gimp_layer_new(image, 1024, 1024, RGBA_IMAGE, "PaintHere", 100.0, NORMAL_MODE)
image.add_layer(layer)
drawable = pdb.gimp_image_get_active_layer(image)
num = 1
while True:
time.sleep(3.0)
if image is not None:
ims_dir = "/home/antoni4040/Έγγραφα/Layout1.png"
gimp.pdb.file_png_save(image, drawable, ims_dir, ims_dir, 0, 0, 0, 0, 0, 0, 0)
f = open("/home/antoni4040/blender.txt", "w")
f.write("ok")
else:
pass
register(
"python_fu_bgsync",
"Blender-Gimp Sync",
"Syncronize Gimp with Blender for texturing",
"Antonis Karvelas",
"Antonis Karvelas",
"2012",
"Sync",
"",
[],
[],
blender_gimp_sync,
menu="<Image>/Image/Blender-Gimp"
)
main()
但是,我总是收到段错误错误...为什么会发生这种情况?我做错了什么?
嗯,您可以在代码模板中找到“Operator Modal Timer”,它展示了如何在 Blender 中连续执行操作:
import bpy
class ModalTimerOperator(bpy.types.Operator):
"""Operator which runs its self from a timer"""
bl_idname = "wm.modal_timer_operator"
bl_label = "Modal Timer Operator"
_timer = None
def modal(self, context, event):
if event.type == 'ESC':
return self.cancel(context)
if event.type == 'TIMER':
# change theme color, silly!
color = context.user_preferences.themes[0].view_3d.space.back
color.s = 1.0
color.h += 0.01
return {'PASS_THROUGH'}
def execute(self, context):
self._timer = context.window_manager.event_timer_add(0.1, context.window)
context.window_manager.modal_handler_add(self)
return {'RUNNING_MODAL'}
def cancel(self, context):
context.window_manager.event_timer_remove(self._timer)
return {'CANCELLED'}
def register():
bpy.utils.register_class(ModalTimerOperator)
def unregister():
bpy.utils.unregister_class(ModalTimerOperator)
if __name__ == "__main__":
register()
# test call
bpy.ops.wm.modal_timer_operator()
我是一名优秀的程序员,十分优秀!