Welcome to mirror list, hosted at ThFree Co, Russian Federation.

__init__.py « extensions_framework « modules « scripts « release - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: fdb7ddd706d27be2def0e8e42765bf61e4854585 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# -*- coding: utf8 -*-
#
# ***** BEGIN GPL LICENSE BLOCK *****
#
# --------------------------------------------------------------------------
# Blender 2.5 Extensions Framework
# --------------------------------------------------------------------------
#
# Authors:
# Doug Hammond
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, see <http://www.gnu.org/licenses/>.
#
# ***** END GPL LICENCE BLOCK *****
#

import os, time
import bpy

#---------------------------------------------------------------------------------------------------------------------- 

def log(str, popup=False, module_name='EF'):
	print("[%s %s] %s" % (module_name, time.strftime('%Y-%b-%d %H:%M:%S'), str))
	if popup:
		bpy.ops.ef.msg(
			msg_type='WARNING',
			msg_text=str
		)

#---------------------------------------------------------------------------------------------------------------------- 

from .ui import EF_OT_msg

bpy.types.register(EF_OT_msg)
ef_path = os.path.realpath( os.path.dirname(__file__) )
# log('Extensions_Framework detected and loaded from %s'%ef_path)

del EF_OT_msg, os

#---------------------------------------------------------------------------------------------------------------------- 

class ef(object):
	'''
	Extensions Framework base class
	'''
	
	added_property_cache = {}


def init_properties(obj, props, cache=True):
	if not obj in ef.added_property_cache.keys():
		ef.added_property_cache[obj] = []
	
	for prop in props:
		if cache and prop['attr'] in ef.added_property_cache[obj]:
			continue
		try:
			if prop['type'] == 'bool':
				t = bpy.props.BoolProperty
				a = {k: v for k,v in prop.items() if k in ['name','description','default']}
			elif prop['type'] == 'collection':
				t = bpy.props.CollectionProperty
				a = {k: v for k,v in prop.items() if k in ["ptype", "name", "description"]}
				a['type'] = a['ptype']
				del a['ptype']
			elif prop['type'] == 'enum':
				t = bpy.props.EnumProperty
				a = {k: v for k,v in prop.items() if k in ["items", "name", "description", "default"]}
			elif prop['type'] == 'float':
				t = bpy.props.FloatProperty
				a = {k: v for k,v in prop.items() if k in ["name", "description", "min", "max", "soft_min", "soft_max", "default", "precision"]}
			elif prop['type'] == 'float_vector':
				t = bpy.props.FloatVectorProperty
				a = {k: v for k,v in prop.items() if k in ["name", "description", "min", "max", "soft_min", "soft_max", "default", "precision", "size", "subtype"]}
			elif prop['type'] == 'int':
				t = bpy.props.IntProperty
				a = {k: v for k,v in prop.items() if k in ["name", "description", "min", "max", "soft_min", "soft_max", "default"]}
			elif prop['type'] == 'pointer':
				t = bpy.props.PointerProperty
				a = {k: v for k,v in prop.items() if k in ["ptype", "name", "description"]}
				a['type'] = a['ptype']
				del a['ptype']
			elif prop['type'] == 'string':
				t = bpy.props.StringProperty
				a = {k: v for k,v in prop.items() if k in ["name", "description", "maxlen", "default", "subtype"]}
			else:
				#ef.log('Property type not recognised: %s' % prop['type'])
				continue
			
			setattr(obj, prop['attr'], t(**a))
			
			ef.added_property_cache[obj].append(prop['attr'])
			#log('Created property %s.%s' % (obj, prop['attr']))
		except KeyError:
			continue

class declarative_property_group(bpy.types.IDPropertyGroup):
	
	controls = [
		# this list controls the order of property
		# layout when rendered by a property_group_renderer.
		# This can be a nested list, where each list
		# becomes a row in the panel layout.
		# nesting may be to any depth
	]
	
	# Include some properties in display based on values of others
	visibility = {
		# See ef.validate for test syntax
	}
	
	# engine-specific properties to create in the scene.
	# Each item should be a dict of args to pass to a 
	# bpy.types.Scene.<?>Property function, with the exception
	# of 'type' which is used and stripped by ef
	properties = [
		# example:
		#{
		#	'type': 'int',
		#	'attr': 'threads',
		#	'name': 'Render Threads',
		#	'description': 'Number of threads to use',
		#	'default': 1,
		#	'min': 1,
		#	'soft_min': 1,
		#	'max': 64,
		#	'soft_max': 64
		#},
	]
	
	def draw_callback(self, context):
		'''
		Sub-classes can override this to get a callback
		when rendered by a property_group_renderer class
		'''
		
		pass
	
	@classmethod
	def get_exportable_properties(cls):
		out = []
		for prop in cls.properties:
			if 'save_in_preset' in prop.keys() and prop['save_in_preset']:
				out.append(prop)
		return out