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

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2007-04-01 21:08:05 +0400
committerCampbell Barton <ideasman42@gmail.com>2007-04-01 21:08:05 +0400
commit11d727aae064e8102593b7499e99459d000136f8 (patch)
treeb105d2a547bdbf3827ab25bc52db0200541c33ba /release
parent873b83c131bfa2c9faaec63e035cd2bed7f39365 (diff)
This script is accessed from the object menu, used for finding an object by the data its linked to.
obdata/group/dupgroup/image/material/texture This or similar functionality should eventualy be added to the outliner.
Diffstat (limited to 'release')
-rw-r--r--release/scripts/object_find.py201
1 files changed, 201 insertions, 0 deletions
diff --git a/release/scripts/object_find.py b/release/scripts/object_find.py
new file mode 100644
index 00000000000..a52f6810da9
--- /dev/null
+++ b/release/scripts/object_find.py
@@ -0,0 +1,201 @@
+#!BPY
+"""
+Name: 'Find by Data Use'
+Blender: 242
+Group: 'Object'
+Tooltip: 'Find an object by the data it uses'
+"""
+__author__= "Campbell Barton"
+__url__= ["blender.org", "blenderartists.org"]
+__version__= "1.0"
+
+__bpydoc__= """
+"""
+
+# --------------------------------------------------------------------------
+# Find by Data Use v0.1 by Campbell Barton (AKA Ideasman42)
+# --------------------------------------------------------------------------
+# ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# ***** END GPL LICENCE BLOCK *****
+# --------------------------------------------------------------------------
+
+from Blender import Image, sys, Draw, Window, Scene, Group
+import bpy
+import BPyMessages
+
+
+def get_object_images(ob):
+ # Could optimize this
+ if ob.type == 'Mesh':
+ unique_images = {}
+ me = ob.getData(mesh=1)
+ orig_uvlayer = me.activeUVLayer
+
+ for uvlayer in me.getUVLayerNames():
+ me.activeUVLayer = uvlayer
+ for f in me.faces:
+ i = f.image
+ if i: unique_images[i.name] = i
+
+ me.activeUVLayer = orig_uvlayer
+
+ return unique_images.values()
+
+ # Todo, support other object types, materials
+ return []
+
+
+
+def main():
+
+ NAME_DATA= Draw.Create('')
+ NAME_INGROUP= Draw.Create('')
+ NAME_DUPGROUP= Draw.Create('')
+ NAME_IMAGE= Draw.Create('')
+ NAME_MATERIAL= Draw.Create('')
+ NAME_TEXTURE= Draw.Create('')
+
+
+ PREF_CASESENS= Draw.Create(False)
+ PREF_PART_MATCH= Draw.Create(True)
+
+
+ # Get USER Options
+ pup_block= [\
+ ('ObData:', NAME_DATA, 0, 32, 'Match with the objects data name'),\
+ ('InGroup:', NAME_INGROUP, 0, 32, 'Match with the group name to find one of its objects'),\
+ ('DupGroup:', NAME_DUPGROUP, 0, 32, 'Match with the group name to find an object that instances this group'),\
+ ('Image:', NAME_IMAGE, 0, 32, 'Match with the image name to find an object that uses this image'),\
+ ('Material:', NAME_MATERIAL, 0, 32, 'Match with the material name to find an object that uses this material'),\
+ ('Texture:', NAME_TEXTURE, 0, 32, 'Match with the texture name to find an object that uses this texture'),\
+ ('Case Sensitive', PREF_CASESENS, 'Do a case sensitive comparison?'),\
+ ('Partial Match', PREF_PART_MATCH, 'Match when only a part of the text is in the data name'),\
+ ]
+
+ if not Draw.PupBlock('Find object using dataname...', pup_block):
+ return
+
+ NAME_DATA = NAME_DATA.val
+ NAME_INGROUP = NAME_INGROUP.val
+ NAME_DUPGROUP = NAME_DUPGROUP.val
+ NAME_IMAGE = NAME_IMAGE.val
+ NAME_MATERIAL = NAME_MATERIAL.val
+ NAME_TEXTURE = NAME_TEXTURE.val
+
+ PREF_CASESENS = PREF_CASESENS.val
+ PREF_PART_MATCH = PREF_PART_MATCH.val
+
+ if not PREF_CASESENS:
+ NAME_DATA = NAME_DATA.lower()
+ NAME_INGROUP = NAME_INGROUP.lower()
+ NAME_DUPGROUP = NAME_DUPGROUP.lower()
+ NAME_IMAGE = NAME_IMAGE.lower()
+ NAME_MATERIAL = NAME_MATERIAL.lower()
+ NAME_TEXTURE = NAME_TEXTURE.lower()
+
+ def activate(ob, scn):
+ bpy.scenes.active = scn
+ scn.objects.selected = []
+ scn.Layers = ob.Layers
+ ob.sel = 1
+
+ def name_cmp(name_search, name_found):
+ if name_found == None: return False
+ if not PREF_CASESENS: name_found = name_found.lower()
+ if PREF_PART_MATCH:
+ if name_search in name_found:
+ # print name_found, name_search
+ return True
+ else:
+ if name_found == name_search:
+ # print name_found, name_search
+ return True
+
+ return False
+
+
+ if NAME_INGROUP:
+ # Best we speed this up.
+ bpy.objects.tag = False
+
+ ok = False
+ for group in bpy.groups:
+ if name_cmp(NAME_INGROUP, group.name):
+ for ob in group.objects:
+ ob.tag = True
+ ok = True
+ if not ok:
+ Draw.PupMenu('No Objects Found')
+ return
+
+ for scn in bpy.scenes:
+ for ob in scn.objects:
+ if NAME_DATA:
+ if name_cmp(NAME_DATA, ob.getData(1)):
+ activate(ob, scn)
+ return
+ if NAME_INGROUP:
+ # Crap and slow but not much we can do about that
+ '''
+ for group in bpy.groups:
+ if name_cmp(NAME_INGROUP, group.name):
+ for ob_group in group.objects:
+ if ob == ob_group:
+ activate(ob, scn)
+ return
+ '''
+ # Use speedup, this is in a group whos name matches.
+ if ob.tag:
+ activate(ob, scn)
+ return
+
+ if NAME_DUPGROUP:
+ if ob.DupGroup and name_cmp(NAME_DUPGROUP, ob.DupGroup.name):
+ activate(ob, scn)
+ return
+
+ if NAME_IMAGE:
+ for img in get_object_images(ob):
+ if name_cmp(NAME_IMAGE, img.name) or name_cmp(NAME_IMAGE, img.filename.split('\\')[-1].split('/')[-1]):
+ activate(ob, scn)
+ return
+ if NAME_MATERIAL or NAME_TEXTURE:
+ try: materials = ob.getData(mesh=1).materials
+ except: materials = []
+
+ # Add object materials
+ materials.extend(ob.getMaterials())
+
+ for mat in materials:
+ if mat:
+ if NAME_MATERIAL:
+ if name_cmp(NAME_MATERIAL, mat.name):
+ activate(ob, scn)
+ return
+ if NAME_TEXTURE:
+ for tex in mat.getTextures():
+ if tex:
+ if name_cmp(NAME_MATERIAL, tex.name):
+ activate(ob, scn)
+ return
+
+
+ Draw.PupMenu('No Objects Found')
+
+if __name__ == '__main__':
+ main()