Added research data, testing blender mesh generation
This commit is contained in:
215
src_research_readme/blender_2.43_scripts/obdatacopier.py
Normal file
215
src_research_readme/blender_2.43_scripts/obdatacopier.py
Normal file
@@ -0,0 +1,215 @@
|
||||
#!BPY
|
||||
|
||||
""" Registration info for Blender menus: <- these words are ignored
|
||||
Name: 'Data Copier'
|
||||
Blender: 232
|
||||
Group: 'Object'
|
||||
Tip: 'Copy data from active object to other selected ones.'
|
||||
"""
|
||||
|
||||
__author__ = "Jean-Michel Soler (jms), Campbell Barton (Ideasman42)"
|
||||
__url__ = ("blender", "blenderartists.org",
|
||||
"Script's homepage, http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_lampdatacopier.htm",
|
||||
"Communicate problems and errors, http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender")
|
||||
__version__ = "0.1.2"
|
||||
|
||||
__bpydoc__ = """\
|
||||
Use "Data Copier" to copy attributes from the active object to other selected ones of
|
||||
its same type.
|
||||
|
||||
This script is still in an early version but is already useful for copying
|
||||
attributes for some types of objects like lamps and cameras.
|
||||
|
||||
Usage:
|
||||
|
||||
Select the objects that will be updated, select the object whose data will
|
||||
be copied (they must all be of the same type, of course), then run this script.
|
||||
Toggle the buttons representing the attributes to be copied and press "Copy".
|
||||
"""
|
||||
|
||||
# ----------------------------------------------------------
|
||||
# Object DATA copier 0.1.2
|
||||
# (c) 2004 jean-michel soler
|
||||
# -----------------------------------------------------------
|
||||
#----------------------------------------------
|
||||
# Page officielle/official page du blender python Object DATA copier:
|
||||
# http://jmsoler.free.fr/didacticiel/blender/tutor/cpl_lampdatacopier.htm
|
||||
# Communiquer les problemes et erreurs sur:
|
||||
# To Communicate problems and errors on:
|
||||
# http://www.zoo-logique.org/3D.Blender/newsportal/thread.php?group=3D.Blender
|
||||
#---------------------------------------------
|
||||
# Blender Artistic License
|
||||
# http://download.blender.org/documentation/html/x21254.html
|
||||
#---------------------------------------------
|
||||
|
||||
import Blender
|
||||
from Blender import *
|
||||
from Blender.Draw import *
|
||||
from Blender.BGL import *
|
||||
|
||||
|
||||
scn= Blender.Scene.GetCurrent()
|
||||
|
||||
type_func_method= type(dir)
|
||||
type_func= type(lambda:i)
|
||||
type_dict= type({})
|
||||
# type_list= type([])
|
||||
|
||||
IGNORE_VARS = 'users', 'fakeUser', 'edges', 'faces', 'verts', 'elements'
|
||||
|
||||
def renew():
|
||||
scn= Blender.Scene.GetCurrent()
|
||||
act_ob= scn.objects.active
|
||||
if act_ob==None:
|
||||
return {}
|
||||
|
||||
act_ob_type= act_ob.getType()
|
||||
act_ob_data= act_ob.getData(mesh=1)
|
||||
|
||||
if act_ob_data==None: # Surf?
|
||||
return {}
|
||||
|
||||
PARAM={}
|
||||
evt=4
|
||||
doc='doc'
|
||||
|
||||
for prop_name in dir(act_ob_data):
|
||||
if not prop_name.startswith('__') and prop_name not in IGNORE_VARS:
|
||||
# Get the type
|
||||
try: exec 'prop_type= type(act_ob_data.%s)' % prop_name
|
||||
except: prop_type= None
|
||||
|
||||
if prop_type != None and prop_type not in (type_func_method, type_func, type_dict):
|
||||
|
||||
# Now we know that the attribute can be listed in the UI Create a button and tooltip.
|
||||
|
||||
# Tooltip
|
||||
try:
|
||||
if prop_name=='mode':
|
||||
try:
|
||||
exec "doc=str(%s.Modes)+' ; value : %s'"%( act_ob_type, str(act_ob_data.mode) )
|
||||
except:
|
||||
exec """doc= '%s'+' value = '+ str(act_ob.getData(mesh=1).%s)"""%(prop_name, prop_name)
|
||||
elif prop_name=='type':
|
||||
try:
|
||||
exec "doc=str(%s.Types)+' ; value : %s'"%( act_ob_type, str(act_ob_data.type) )
|
||||
except:
|
||||
exec """doc= '%s'+' value = '+ str(act_ob.getData(mesh=1).%s)"""%(prop_name, prop_name)
|
||||
else:
|
||||
exec """doc= '%s'+' value = '+ str(act_ob_data.%s)"""%(prop_name, prop_name)
|
||||
if doc.find('built-in')!=-1:
|
||||
exec """doc= 'This is a function ! Doc = '+ str(act_ob_data.%s.__doc__)"""% prop_name
|
||||
except:
|
||||
doc='Doc...'
|
||||
|
||||
# Button
|
||||
PARAM[prop_name]= [Create(0), evt, doc]
|
||||
evt+=1
|
||||
|
||||
return PARAM
|
||||
|
||||
def copy():
|
||||
global PARAM
|
||||
|
||||
scn= Blender.Scene.GetCurrent()
|
||||
act_ob= scn.getActiveObject()
|
||||
if act_ob==None:
|
||||
Blender.Draw.PupMenu('Error|No Active Object.')
|
||||
return
|
||||
|
||||
act_ob_type= act_ob.getType()
|
||||
|
||||
if act_ob_type in ('Empty', 'Surf'):
|
||||
Blender.Draw.PupMenu('Error|Copying Empty or Surf object data isnt supported.')
|
||||
return
|
||||
|
||||
act_ob_data= act_ob.getData(mesh=1)
|
||||
|
||||
print '\n\nStarting copy for object "%s"' % act_ob.name
|
||||
some_errors= False
|
||||
for ob in scn.objects.context:
|
||||
if ob != act_ob and ob.getType() == act_ob_type:
|
||||
ob_data= None
|
||||
for prop_name, value in PARAM.iteritems():
|
||||
if value[0].val==1:
|
||||
|
||||
# Init the object data if we havnt alredy
|
||||
if ob_data==None:
|
||||
ob_data= ob.getData(mesh=1)
|
||||
|
||||
try:
|
||||
exec "ob_data.%s = act_ob_data.%s"%(prop_name, prop_name)
|
||||
except:
|
||||
some_errors= True
|
||||
print 'Cant copy property "%s" for type "%s"' % (prop_name, act_ob_type)
|
||||
if some_errors:
|
||||
Blender.Draw.PupMenu('Some attributes could not be copied, see console for details.')
|
||||
|
||||
PARAM= renew()
|
||||
|
||||
def EVENT(evt,val):
|
||||
pass
|
||||
|
||||
def BUTTON(evt):
|
||||
global PARAM
|
||||
if (evt==1):
|
||||
Exit()
|
||||
|
||||
if (evt==2):
|
||||
copy()
|
||||
Blender.Redraw()
|
||||
|
||||
if (evt==3):
|
||||
PARAM= renew()
|
||||
Blender.Redraw()
|
||||
|
||||
def DRAW():
|
||||
global PARAM
|
||||
|
||||
scn= Blender.Scene.GetCurrent()
|
||||
act_ob= scn.objects.active
|
||||
|
||||
glColor3f(0.7, 0.7, 0.7)
|
||||
glClear(GL_COLOR_BUFFER_BIT)
|
||||
glColor3f(0.1, 0.1, 0.15)
|
||||
|
||||
size=Buffer(GL_FLOAT, 4)
|
||||
glGetFloatv(GL_SCISSOR_BOX, size)
|
||||
size= size.list
|
||||
for s in [0,1,2,3]: size[s]=int(size[s])
|
||||
ligne=20
|
||||
|
||||
Button("Exit",1,20,4,80,ligne)
|
||||
Button("Copy",2,102,4,80,ligne)
|
||||
Button("Renew",3,184,4,80,ligne)
|
||||
|
||||
glRasterPos2f(20, ligne*2-8)
|
||||
if act_ob:
|
||||
Text(act_ob.getType()+" DATA copier")
|
||||
else:
|
||||
Text("Please select an object")
|
||||
|
||||
|
||||
max=size[3] / 22 -2
|
||||
pos = 0
|
||||
decal = 20
|
||||
key=PARAM.keys()
|
||||
key.sort()
|
||||
for p in key:
|
||||
if pos==max:
|
||||
decal+=102
|
||||
pos=1
|
||||
else:
|
||||
pos+=1
|
||||
|
||||
PARAM[p][0]=Toggle(p,
|
||||
PARAM[p][1],
|
||||
decal,
|
||||
pos*22+22,
|
||||
100,
|
||||
20,
|
||||
PARAM[p][0].val,
|
||||
str(PARAM[p][2]))
|
||||
|
||||
|
||||
Register(DRAW,EVENT,BUTTON)
|
||||
Reference in New Issue
Block a user