blender/release/io/netrender/operators.py
Martin Poirier afee963155 First commit draft for network rendering.
Docs are here: http://wiki.blender.org/index.php/User:Theeth/netrender

Should be easy to test if people want too, just follow the instructions on wiki

Code is still very much in flux, so I'd like if people would refrain from making changes (send patches directly to me if you must).

The UI side is very crap, it's basically there just to get things testable. See wiki for known bugs.
2009-08-29 17:25:22 +00:00

238 lines
6.5 KiB
Python

import bpy
import sys, os
import http, http.client, http.server, urllib
from netrender.utils import *
import netrender.model
class RENDER_OT_netclientsend(bpy.types.Operator):
'''
Operator documentation text, will be used for the operator tooltip and python docs.
'''
__idname__ = "render.netclientsend"
__label__ = "Net Render Client Send"
# List of operator properties, the attributes will be assigned
# to the class instance from the operator settings before calling.
__props__ = []
def poll(self, context):
return True
def execute(self, context):
scene = context.scene
conn = clientConnection(scene)
if conn:
# Sending file
scene.network_render.job_id = clientSendJob(conn, scene, True)
return ('FINISHED',)
def invoke(self, context, event):
return self.execute(context)
class RENDER_OT_netclientstatus(bpy.types.Operator):
'''Operator documentation text, will be used for the operator tooltip and python docs.'''
__idname__ = "render.netclientstatus"
__label__ = "Net Render Client Status"
# List of operator properties, the attributes will be assigned
# to the class instance from the operator settings before calling.
__props__ = []
def poll(self, context):
return True
def execute(self, context):
netprops = context.scene.network_render
conn = clientConnection(context.scene)
if conn:
conn.request("GET", "status")
response = conn.getresponse()
print( response.status, response.reason )
jobs = (netrender.model.RenderJob.materialize(j) for j in eval(str(response.read(), encoding='utf8')))
while(len(netprops.jobs) > 0):
netprops.jobs.remove(0)
for j in jobs:
netprops.jobs.add()
job = netprops.jobs[-1]
job_results = j.status()
job.id = j.id
job.name = j.name
job.length = len(j)
job.done = job_results[DONE]
job.error = job_results[ERROR]
return ('FINISHED',)
def invoke(self, context, event):
return self.execute(context)
class RENDER_OT_netclientblacklistslave(bpy.types.Operator):
'''Operator documentation text, will be used for the operator tooltip and python docs.'''
__idname__ = "render.netclientblacklistslave"
__label__ = "Net Render Client Blacklist Slave"
# List of operator properties, the attributes will be assigned
# to the class instance from the operator settings before calling.
__props__ = []
def poll(self, context):
return True
def execute(self, context):
netprops = context.scene.network_render
if netprops.active_slave_index >= 0:
slave = netrender.slaves[netprops.active_slave_index]
netprops.slaves_blacklist.add()
netprops.slaves_blacklist[-1].id = slave.id
netprops.slaves_blacklist[-1].name = slave.name
netprops.slaves_blacklist[-1].adress = slave.adress
netprops.slaves_blacklist[-1].last_seen = slave.last_seen
netprops.slaves_blacklist[-1].stats = slave.stats
netprops.slaves.remove(netprops.active_slave_index)
netprops.active_slave_index = -1
return ('FINISHED',)
def invoke(self, context, event):
return self.execute(context)
class RENDER_OT_netclientwhitelistslave(bpy.types.Operator):
'''Operator documentation text, will be used for the operator tooltip and python docs.'''
__idname__ = "render.netclientwhitelistslave"
__label__ = "Net Render Client Whitelist Slave"
# List of operator properties, the attributes will be assigned
# to the class instance from the operator settings before calling.
__props__ = []
def poll(self, context):
return True
def execute(self, context):
netprops = context.scene.network_render
if netprops.active_blacklisted_slave_index >= 0:
slave = netprops.slaves_blacklist[netprops.active_blacklisted_slave_index]
netprops.slaves.add()
netprops.slaves[-1].id = slave.id
netprops.slaves[-1].name = slave.name
netprops.slaves[-1].adress = slave.adress
netprops.slaves[-1].last_seen = slave.last_seen
netprops.slaves[-1].stats = slave.stats
netprops.slaves_blacklist.remove(netprops.active_blacklisted_slave_index)
netprops.active_blacklisted_slave_index = -1
return ('FINISHED',)
def invoke(self, context, event):
return self.execute(context)
class RENDER_OT_netclientslaves(bpy.types.Operator):
'''Operator documentation text, will be used for the operator tooltip and python docs.'''
__idname__ = "render.netclientslaves"
__label__ = "Net Render Client Slaves"
# List of operator properties, the attributes will be assigned
# to the class instance from the operator settings before calling.
__props__ = []
def poll(self, context):
return True
def execute(self, context):
netprops = context.scene.network_render
conn = clientConnection(context.scene)
if conn:
conn.request("GET", "slave")
response = conn.getresponse()
print( response.status, response.reason )
slaves = (netrender.model.RenderSlave.materialize(s) for s in eval(str(response.read(), encoding='utf8')))
while(len(netprops.slaves) > 0):
netprops.slaves.remove(0)
for s in slaves:
for slave in netprops.slaves_blacklist:
if slave.id == s.id:
break
netprops.slaves.add()
slave = netprops.slaves[-1]
slave.id = s.id
slave.name = s.name
slave.stats = s.stats
slave.adress = s.adress[0]
slave.last_seen = time.ctime(s.last_seen)
return ('FINISHED',)
def invoke(self, context, event):
return self.execute(context)
class RENDER_OT_netclientcancel(bpy.types.Operator):
'''Operator documentation text, will be used for the operator tooltip and python docs.'''
__idname__ = "render.netclientcancel"
__label__ = "Net Render Client Cancel"
# List of operator properties, the attributes will be assigned
# to the class instance from the operator settings before calling.
__props__ = []
def poll(self, context):
netrender = scene.network_render
return netrender.active_job_index >= 0 and len(netrender.jobs) > 0
def execute(self, context):
netprops = context.scene.network_render
conn = clientConnection(context.scene)
if conn:
job = netprops.jobs[netrender.active_job_index]
conn.request("POST", "cancel", headers={"job-id":job.id})
response = conn.getresponse()
print( response.status, response.reason )
return ('FINISHED',)
def invoke(self, context, event):
return self.execute(context)
bpy.ops.add(RENDER_OT_netclientsend)
bpy.ops.add(RENDER_OT_netclientstatus)
bpy.ops.add(RENDER_OT_netclientslaves)
bpy.ops.add(RENDER_OT_netclientblacklistslave)
bpy.ops.add(RENDER_OT_netclientwhitelistslave)
bpy.ops.add(RENDER_OT_netclientcancel)