b9fec3bab7dadea2b19af23377d5e3991750c6d0
[blender-addons-contrib.git] / io_directx_bel / bel / ob.py
1 import bpy
2 from bpy.types import Mesh, PointLamp, SpotLamp, HemiLamp, AreaLamp, SunLamp, Camera, TextCurve, MetaBall, Lattice, Armature
3
4
5 def new(name,datatype,naming_method):
6     if name in bpy.data.objects and naming_method :
7         ob = bpy.data.objects[name]
8         if naming_method == 1 :
9             ob.parent = None
10             ob.user_clear()
11         elif naming_method == 2 :
12             ob = bpy.data.objects.new(name,datatype)
13             ob.name = name
14         elif naming_method == 3 :
15             bpy.context.scene.objects.unlink(ob)
16             ob.user_clear()
17             bpy.data.objects.remove(ob)
18             ob = bpy.data.objects.new(name,datatype)
19     else :
20         ob = bpy.data.objects.new(name,datatype)
21     if ob.name not in bpy.context.scene.objects.keys() :
22         bpy.context.scene.objects.link(ob)
23     return ob
24
25 ## returns an object or a list of objects
26 # @param ob 'all', 'active', 'selected', <object>, 'objectname'
27 # @return a list of objects or an empty list
28 def get(ob) :
29     if type(ob) == str :
30         if ob == 'all' : return bpy.context.scene.objects
31         elif ob == 'active' : return [bpy.context.active_object] if bpy.context.active_object != None else []
32         elif ob == 'selected' : return bpy.context.selected_objects
33         else :
34             try : return [bpy.data.objects[ob]]
35             except : return []
36     return [ob]
37
38
39 ## remove an object from blender internal
40 def remove(ob,with_data=True) :
41     objs = get(ob)
42     #if objs :
43     #    if type(objs) == bpy.types.Object : objs = [objs]
44     for ob in objs :
45             data = ob.data
46             #and_data=False
47             # never wipe data before unlink the ex-user object of the scene else crash (2.58 3 770 2)
48             # if there's more than one user for this data, never wipeOutData. will be done with the last user
49             # if in the list
50             and_data = with_data
51             try :
52                 if data.users > 1 :
53                     and_data=False
54             except :
55                 and_data=False # empties
56
57             # odd (pre 2.60) :
58             # ob=bpy.data.objects[ob.name]
59             # if the ob (board) argument comes from bpy.data.collections['aGroup'].objects,
60             #  bpy.data.collections['board'].objects['board'].users_scene
61             ob.name = '_dead'
62             for sc in ob.users_scene :
63                 sc.objects.unlink(ob)
64
65             #try :
66                 #print('  removing object %s...'%(ob.name)),
67             bpy.data.objects.remove(ob)
68                 #print('  done.')
69             #except :
70             #    print('removing failed, but renamed %s and unlinked'%ob.name)
71
72             # never wipe data before unlink the ex-user object of the scene else crash (2.58 3 770 2)
73             if and_data :
74                 wipeOutData(data)
75
76
77 ## remove an object data from blender internal
78 ## or rename it _dead if there's still users
79 def removeData(data) :
80     #print('%s has %s user(s) !'%(data.name,data.users))
81
82     if data.users <= 0 :
83
84             #data.user_clear()
85             data_type = type(data)
86
87             # mesh
88             if data_type == Mesh :
89                 bpy.data.meshes.remove(data)
90             # lamp
91             elif data_type in [ PointLamp, SpotLamp, HemiLamp, AreaLamp, SunLamp ] :
92                 bpy.data.lamps.remove(data)
93             # camera
94             elif data_type == Camera :
95                 bpy.data.cameras.remove(data)
96             # Text, Curve
97             elif data_type in [ Curve, TextCurve ] :
98                 bpy.data.curves.remove(data)
99             # metaball
100             elif data_type == MetaBall :
101                 bpy.data.metaballs.remove(data)
102             # lattice
103             elif data_type == Lattice :
104                 bpy.data.lattices.remove(data)
105             # armature
106             elif data_type == Armature :
107                 bpy.data.armatures.remove(data)
108             else :
109                 print('  data still here : forgot %s type'%type(data))
110         #except :
111             # empty, field
112         #    print('%s has no user_clear attribute ? (%s).'%(data.name,type(data)))
113     else :
114         #print('  not done, %s has %s user'%(data.name,data.users))
115         data.name = '_dead'