[Bf-extensions-cvs] [e1ba55d8] master: object_color_rules: move to addons
Campbell Barton
noreply at git.blender.org
Thu Feb 28 06:34:01 CET 2019
Commit: e1ba55d88b94327581dff91bca2c4b1e10ddfbfe
Author: Campbell Barton
Date: Thu Feb 28 16:05:18 2019 +1100
Branches: master
https://developer.blender.org/rBACe1ba55d88b94327581dff91bca2c4b1e10ddfbfe
object_color_rules: move to addons
===================================================================
D object_color_rules.py
===================================================================
diff --git a/object_color_rules.py b/object_color_rules.py
deleted file mode 100644
index 2851f310..00000000
--- a/object_color_rules.py
+++ /dev/null
@@ -1,485 +0,0 @@
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# 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, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# ***** END GPL LICENCE BLOCK *****
-
-bl_info = {
- "name": "Object Color Rules",
- "author": "Campbell Barton",
- "version": (0, 0, 1),
- "blender": (2, 73, 0),
- "location": "Properties > Object Buttons",
- "description": "Rules for assigning object color (used for wireframe colors).",
- "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/"
- "Scripts/Object/Color_Rules",
- "tracker_url": "https://developer.blender.org/maniphest/task/edit/form/2/",
- "category": "Object",
- }
-
-
-def test_name(rule, needle, haystack):
- # TODO, compile expression for re-use
- if rule.use_match_regex:
- import re
- return (re.match(needle, haystack) is not None)
- else:
- return (needle in haystack)
-
-
-class rule_test:
- __slots__ = ()
-
- def __new__(cls, *args, **kwargs):
- raise RuntimeError("%s should not be instantiated" % cls)
-
- @staticmethod
- def NAME(obj, rule, cache):
- match_name = rule.match_name
- return test_name(rule, match_name, obj.name)
-
- def DATA(obj, rule, cache):
- match_name = rule.match_name
- obj_data = obj.data
- if obj_data is not None:
- return test_name(rule, match_name, obj_data.name)
- else:
- return False
-
- @staticmethod
- def GROUP(obj, rule, cache):
- if not cache:
- match_name = rule.match_name
- objects = {o for g in bpy.data.collections if test_name(rule, match_name, g.name) for o in g.objects}
- cache["objects"] = objects
- else:
- objects = cache["objects"]
-
- return obj in objects
-
- @staticmethod
- def MATERIAL(obj, rule, cache):
- match_name = rule.match_name
- materials = getattr(obj.data, "materials", None)
-
- return ((materials is not None) and
- (any((test_name(rule, match_name, m.name) for m in materials if m is not None))))
-
- @staticmethod
- def LAYER(obj, rule, cache):
- match_layers = rule.match_layers[:]
- obj_layers = obj.layers[:]
-
- return any((match_layers[i] and obj_layers[i]) for i in range(20))
-
- @staticmethod
- def TYPE(obj, rule, cache):
- return (obj.type == rule.match_object_type)
-
- @staticmethod
- def EXPR(obj, rule, cache):
- if not cache:
- match_expr = rule.match_expr
- expr = compile(match_expr, rule.name, 'eval')
-
- namespace = {}
- namespace.update(__import__("math").__dict__)
-
- cache["expr"] = expr
- cache["namespace"] = namespace
- else:
- expr = cache["expr"]
- namespace = cache["namespace"]
-
- try:
- return bool(eval(expr, {}, {"self": obj}))
- except:
- import traceback
- traceback.print_exc()
- return False
-
-
-class rule_draw:
- __slots__ = ()
-
- def __new__(cls, *args, **kwargs):
- raise RuntimeError("%s should not be instantiated" % cls)
-
- @staticmethod
- def _generic_match_name(layout, rule):
- layout.label(text="Match Name:")
- row = layout.row(align=True)
- row.prop(rule, "match_name", text="")
- row.prop(rule, "use_match_regex", text="", icon='SORTALPHA')
-
- @staticmethod
- def NAME(layout, rule):
- rule_draw._generic_match_name(layout, rule)
-
- @staticmethod
- def DATA(layout, rule):
- rule_draw._generic_match_name(layout, rule)
-
- @staticmethod
- def GROUP(layout, rule):
- rule_draw._generic_match_name(layout, rule)
-
- @staticmethod
- def MATERIAL(layout, rule):
- rule_draw._generic_match_name(layout, rule)
-
- @staticmethod
- def TYPE(layout, rule):
- row = layout.row()
- row.prop(rule, "match_object_type")
-
- @staticmethod
- def LAYER(layout, rule):
- row = layout.row()
- row.prop(rule, "match_layers")
-
- @staticmethod
- def EXPR(layout, rule):
- col = layout.column()
- col.label(text="Scripted Expression:")
- col.prop(rule, "match_expr", text="")
-
-
-def object_colors_calc(rules, objects):
- from mathutils import Color
-
- rules_cb = [getattr(rule_test, rule.type) for rule in rules]
- rules_blend = [(1.0 - rule.factor, rule.factor) for rule in rules]
- rules_color = [Color(rule.color) for rule in rules]
- rules_cache = [{} for i in range(len(rules))]
- rules_inv = [rule.use_invert for rule in rules]
-
- for obj in objects:
- is_set = False
- obj_color = Color(obj.color[0:3])
-
- for (rule, test_cb, color, blend, cache, use_invert) \
- in zip(rules, rules_cb, rules_color, rules_blend, rules_cache, rules_inv):
-
- if test_cb(obj, rule, cache) is not use_invert:
- if is_set is False:
- obj_color = color
- else:
- # prevent mixing colors loosing saturation
- obj_color_s = obj_color.s
- obj_color = (obj_color * blend[0]) + (color * blend[1])
- obj_color.s = (obj_color_s * blend[0]) + (color.s * blend[1])
-
- is_set = True
-
- if is_set:
- obj.show_wire_color = True
- obj.color[0:3] = obj_color
-
-
-def object_colors_select(rule, objects):
- cache = {}
-
- rule_type = rule.type
- test_cb = getattr(rule_test, rule_type)
-
- for obj in objects:
- obj.select = test_cb(obj, rule, cache)
-
-
-def object_colors_rule_validate(rule, report):
- rule_type = rule.type
-
- if rule_type in {'NAME', 'DATA', 'GROUP', 'MATERIAL'}:
- if rule.use_match_regex:
- import re
- try:
- re.compile(rule.match_name)
- except Exception as e:
- report({'ERROR'}, "Rule %r: %s" % (rule.name, str(e)))
- return False
-
- elif rule_type == 'EXPR':
- try:
- compile(rule.match_expr, rule.name, 'eval')
- except Exception as e:
- report({'ERROR'}, "Rule %r: %s" % (rule.name, str(e)))
- return False
-
- return True
-
-
-
-import bpy
-from bpy.types import (
- Operator,
- Panel,
- UIList,
- )
-from bpy.props import (
- StringProperty,
- BoolProperty,
- IntProperty,
- FloatProperty,
- EnumProperty,
- CollectionProperty,
- BoolVectorProperty,
- FloatVectorProperty,
- )
-
-
-class OBJECT_PT_color_rules(Panel):
- bl_label = "Color Rules"
- bl_space_type = 'PROPERTIES'
- bl_region_type = 'WINDOW'
- bl_context = "object"
-
- def draw(self, context):
- layout = self.layout
-
- scene = context.scene
-
- # Rig type list
- row = layout.row()
- row.template_list(
- "OBJECT_UL_color_rule", "color_rules",
- scene, "color_rules",
- scene, "color_rules_active_index")
-
- col = row.column()
- colsub = col.column(align=True)
- colsub.operator("object.color_rules_add", icon='ADD', text="")
- colsub.operator("object.color_rules_remove", icon='REMOVE', text="")
-
- colsub = col.column(align=True)
- colsub.operator("object.color_rules_move", text="", icon='TRIA_UP').direction = -1
- colsub.operator("object.color_rules_move", text="", icon='TRIA_DOWN').direction = 1
-
- colsub = col.column(align=True)
- colsub.operator("object.color_rules_select", text="", icon='RESTRICT_SELECT_OFF')
-
- if scene.color_rules:
- index = scene.color_rules_active_index
- rule = scene.color_rules[index]
-
- box = layout.box()
- row = box.row(align=True)
- row.prop(rule, "name", text="")
- row.prop(rule, "type", text="")
- row.prop(rule, "use_invert", text="", icon='ARROW_LEFTRIGHT')
-
- draw_cb = getattr(rule_draw, rule.type)
- draw_cb(box, rule)
-
- row = layout.split(0.75, align=True)
- props = row.operator("object.color_rules_assign", text="Assign Selected")
- props.use_selection = True
- props = row.operator("object.color_rules_assign", text="All")
- props.use_selection = False
-
-
-class OBJECT_UL_color_rule(UIList):
- def draw_item(self, context, layout, data, rule, icon, active_data, active_propname, index):
- # assert(isinstance(rule, bpy.types.ShapeKey))
- # scene = active_data
- split = layout.split(0.5)
- row = split.split(align=False)
- row.label(text="%s (%s)" % (rule.name, rule.type.lower()))
- split = split.split(0.7)
- split.prop(rule, "factor", text="", emboss=False)
- split.prop(rule, "color", text="")
-
-
-class OBJECT_OT_color_rules_assign(Operator):
- """Assign colors to objects based on user rules"""
- bl_idname = "object.color_rules_assign"
- bl_label = "Assign Colors"
- bl_options = {'UNDO'}
-
- use_selection: BoolProperty(
- name="Selected",
- description="Apply to selected (otherwise all objects in the scene)",
- default=True,
- )
-
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-extensions-cvs
mailing list