pep8 warnings
[blender.git] / release / scripts / ui / properties_data_modifier.py
1 # ##### BEGIN GPL LICENSE BLOCK #####
2 #
3 #  This program is free software; you can redistribute it and/or
4 #  modify it under the terms of the GNU General Public License
5 #  as published by the Free Software Foundation; either version 2
6 #  of the License, or (at your option) any later version.
7 #
8 #  This program is distributed in the hope that it will be useful,
9 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 #  GNU General Public License for more details.
12 #
13 #  You should have received a copy of the GNU General Public License
14 #  along with this program; if not, write to the Free Software Foundation,
15 #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 #
17 # ##### END GPL LICENSE BLOCK #####
18
19 # <pep8 compliant>
20 import bpy
21
22 narrowui = 180
23 narrowmod = 260
24
25
26 class DataButtonsPanel(bpy.types.Panel):
27     bl_space_type = 'PROPERTIES'
28     bl_region_type = 'WINDOW'
29     bl_context = "modifier"
30
31
32 class DATA_PT_modifiers(DataButtonsPanel):
33     bl_label = "Modifiers"
34
35     def draw(self, context):
36         layout = self.layout
37
38         ob = context.object
39         wide_ui = context.region.width > narrowui
40         compact_mod = context.region.width < narrowmod
41
42         layout.operator_menu_enum("object.modifier_add", "type")
43
44         for md in ob.modifiers:
45             box = layout.template_modifier(md, compact=compact_mod)
46             if box:
47                 # match enum type to our functions, avoids a lookup table.
48                 getattr(self, md.type)(box, ob, md, wide_ui)
49
50     # the mt.type enum is (ab)used for a lookup on function names
51     # ...to avoid lengthy if statements
52     # so each type must have a function here.
53
54     def ARMATURE(self, layout, ob, md, wide_ui):
55         split = layout.split()
56
57         col = split.column()
58         col.label(text="Object:")
59         col.prop(md, "object", text="")
60
61         if wide_ui:
62             col = split.column()
63         col.label(text="Vertex Group::")
64         col.prop_object(md, "vertex_group", ob, "vertex_groups", text="")
65         sub = col.column()
66         sub.active = bool(md.vertex_group)
67         sub.prop(md, "invert")
68
69         split = layout.split()
70
71         col = split.column()
72         col.label(text="Bind To:")
73         col.prop(md, "use_vertex_groups", text="Vertex Groups")
74         col.prop(md, "use_bone_envelopes", text="Bone Envelopes")
75
76         if wide_ui:
77             col = split.column()
78         col.label(text="Deformation:")
79         col.prop(md, "quaternion")
80         col.prop(md, "multi_modifier")
81
82     def ARRAY(self, layout, ob, md, wide_ui):
83         if wide_ui:
84             layout.prop(md, "fit_type")
85         else:
86             layout.prop(md, "fit_type", text="")
87
88
89         if md.fit_type == 'FIXED_COUNT':
90             layout.prop(md, "count")
91         elif md.fit_type == 'FIT_LENGTH':
92             layout.prop(md, "length")
93         elif md.fit_type == 'FIT_CURVE':
94             layout.prop(md, "curve")
95
96         layout.separator()
97
98         split = layout.split()
99
100         col = split.column()
101         col.prop(md, "constant_offset")
102         sub = col.column()
103         sub.active = md.constant_offset
104         sub.prop(md, "constant_offset_displacement", text="")
105
106         col.separator()
107
108         col.prop(md, "merge_adjacent_vertices", text="Merge")
109         sub = col.column()
110         sub.active = md.merge_adjacent_vertices
111         sub.prop(md, "merge_end_vertices", text="First Last")
112         sub.prop(md, "merge_distance", text="Distance")
113
114         if wide_ui:
115             col = split.column()
116         col.prop(md, "relative_offset")
117         sub = col.column()
118         sub.active = md.relative_offset
119         sub.prop(md, "relative_offset_displacement", text="")
120
121         col.separator()
122
123         col.prop(md, "add_offset_object")
124         sub = col.column()
125         sub.active = md.add_offset_object
126         sub.prop(md, "offset_object", text="")
127
128         layout.separator()
129
130         col = layout.column()
131         col.prop(md, "start_cap")
132         col.prop(md, "end_cap")
133
134     def BEVEL(self, layout, ob, md, wide_ui):
135         split = layout.split()
136
137         col = split.column()
138         col.prop(md, "width")
139
140         if wide_ui:
141             col = split.column()
142         col.prop(md, "only_vertices")
143
144         layout.label(text="Limit Method:")
145         layout.row().prop(md, "limit_method", expand=True)
146         if md.limit_method == 'ANGLE':
147             layout.prop(md, "angle")
148         elif md.limit_method == 'WEIGHT':
149             layout.row().prop(md, "edge_weight_method", expand=True)
150
151     def BOOLEAN(self, layout, ob, md, wide_ui):
152         split = layout.split()
153
154         col = split.column()
155         col.label(text="Operation:")
156         col.prop(md, "operation", text="")
157
158         if wide_ui:
159             col = split.column()
160         col.label(text="Object:")
161         col.prop(md, "object", text="")
162
163     def BUILD(self, layout, ob, md, wide_ui):
164         split = layout.split()
165
166         col = split.column()
167         col.prop(md, "start")
168         col.prop(md, "length")
169
170         if wide_ui:
171             col = split.column()
172         col.prop(md, "randomize")
173         sub = col.column()
174         sub.active = md.randomize
175         sub.prop(md, "seed")
176
177     def CAST(self, layout, ob, md, wide_ui):
178         split = layout.split(percentage=0.25)
179
180         if wide_ui:
181             split.label(text="Cast Type:")
182             split.prop(md, "cast_type", text="")
183         else:
184             layout.prop(md, "cast_type", text="")
185
186         split = layout.split(percentage=0.25)
187
188         col = split.column()
189         col.prop(md, "x")
190         col.prop(md, "y")
191         col.prop(md, "z")
192
193         col = split.column()
194         col.prop(md, "factor")
195         col.prop(md, "radius")
196         col.prop(md, "size")
197         col.prop(md, "from_radius")
198
199         split = layout.split()
200
201         col = split.column()
202         col.label(text="Vertex Group:")
203         col.prop_object(md, "vertex_group", ob, "vertex_groups", text="")
204         if wide_ui:
205             col = split.column()
206         col.label(text="Control Object:")
207         col.prop(md, "object", text="")
208         if md.object:
209             col.prop(md, "use_transform")
210
211     def CLOTH(self, layout, ob, md, wide_ui):
212         layout.label(text="See Cloth panel.")
213
214     def COLLISION(self, layout, ob, md, wide_ui):
215         layout.label(text="See Collision panel.")
216
217     def CURVE(self, layout, ob, md, wide_ui):
218         split = layout.split()
219
220         col = split.column()
221         col.label(text="Object:")
222         col.prop(md, "object", text="")
223         if wide_ui:
224             col = split.column()
225         col.label(text="Vertex Group:")
226         col.prop_object(md, "vertex_group", ob, "vertex_groups", text="")
227         layout.label(text="Deformation Axis:")
228         layout.row().prop(md, "deform_axis", expand=True)
229
230     def DECIMATE(self, layout, ob, md, wide_ui):
231         layout.prop(md, "ratio")
232         layout.prop(md, "face_count")
233
234     def DISPLACE(self, layout, ob, md, wide_ui):
235         split = layout.split()
236
237         col = split.column()
238         col.label(text="Texture:")
239         col.prop(md, "texture", text="")
240         col.label(text="Vertex Group:")
241         col.prop_object(md, "vertex_group", ob, "vertex_groups", text="")
242
243         if wide_ui:
244             col = split.column()
245         col.label(text="Direction:")
246         col.prop(md, "direction", text="")
247         col.label(text="Texture Coordinates:")
248         col.prop(md, "texture_coordinates", text="")
249         if md.texture_coordinates == 'OBJECT':
250             layout.prop(md, "texture_coordinate_object", text="Object")
251         elif md.texture_coordinates == 'UV' and ob.type == 'MESH':
252             layout.prop_object(md, "uv_layer", ob.data, "uv_textures")
253
254         layout.separator()
255
256         split = layout.split()
257
258         col = split.column()
259         col.prop(md, "midlevel")
260
261         if wide_ui:
262             col = split.column()
263         col.prop(md, "strength")
264
265     def EDGE_SPLIT(self, layout, ob, md, wide_ui):
266         split = layout.split()
267
268         col = split.column()
269         col.prop(md, "use_edge_angle", text="Edge Angle")
270         sub = col.column()
271         sub.active = md.use_edge_angle
272         sub.prop(md, "split_angle")
273
274         if wide_ui:
275             col = split.column()
276         col.prop(md, "use_sharp", text="Sharp Edges")
277
278     def EXPLODE(self, layout, ob, md, wide_ui):
279         split = layout.split()
280
281         col = split.column()
282         col.label(text="Vertex group:")
283         col.prop_object(md, "vertex_group", ob, "vertex_groups", text="")
284         sub = col.column()
285         sub.active = bool(md.vertex_group)
286         sub.prop(md, "protect")
287
288         if wide_ui:
289             col = split.column()
290         col.prop(md, "split_edges")
291         col.prop(md, "unborn")
292         col.prop(md, "alive")
293         col.prop(md, "dead")
294
295         layout.operator("object.explode_refresh", text="Refresh")
296
297     def FLUID_SIMULATION(self, layout, ob, md, wide_ui):
298         layout.label(text="See Fluid panel.")
299
300     def HOOK(self, layout, ob, md, wide_ui):
301         split = layout.split()
302
303         col = split.column()
304         col.label(text="Object:")
305         col.prop(md, "object", text="")
306         if md.object and md.object.type == 'ARMATURE':
307             col.label(text="Bone:")
308             col.prop_object(md, "subtarget", md.object.data, "bones", text="")
309         if wide_ui:
310             col = split.column()
311         col.label(text="Vertex Group:")
312         col.prop_object(md, "vertex_group", ob, "vertex_groups", text="")
313
314         layout.separator()
315
316         split = layout.split()
317
318         col = split.column()
319         col.prop(md, "falloff")
320         col.prop(md, "force", slider=True)
321         if wide_ui:
322             col = split.column()
323         else:
324             col.separator()
325         col.operator("object.hook_reset", text="Reset")
326         col.operator("object.hook_recenter", text="Recenter")
327
328         if ob.mode == 'EDIT':
329             layout.separator()
330             row = layout.row()
331             row.operator("object.hook_select", text="Select")
332             row.operator("object.hook_assign", text="Assign")
333
334     def LATTICE(self, layout, ob, md, wide_ui):
335         split = layout.split()
336
337         col = split.column()
338         col.label(text="Object:")
339         col.prop(md, "object", text="")
340
341         if wide_ui:
342             col = split.column()
343         col.label(text="Vertex Group:")
344         col.prop_object(md, "vertex_group", ob, "vertex_groups", text="")
345
346     def MASK(self, layout, ob, md, wide_ui):
347         split = layout.split()
348
349         col = split.column()
350         col.label(text="Mode:")
351         col.prop(md, "mode", text="")
352         if wide_ui:
353             col = split.column()
354         if md.mode == 'ARMATURE':
355             col.label(text="Armature:")
356             col.prop(md, "armature", text="")
357         elif md.mode == 'VERTEX_GROUP':
358             col.label(text="Vertex Group:")
359             col.prop_object(md, "vertex_group", ob, "vertex_groups", text="")
360
361         sub = col.column()
362         sub.active = bool(md.vertex_group)
363         sub.prop(md, "invert")
364
365     def MESH_DEFORM(self, layout, ob, md, wide_ui):
366         split = layout.split()
367         col = split.column()
368         sub = col.column()
369         sub.label(text="Object:")
370         sub.prop(md, "object", text="")
371         sub.prop(md, "mode", text="")
372         sub.active = not md.is_bound
373         if wide_ui:
374             col = split.column()
375         col.label(text="Vertex Group:")
376         col.prop_object(md, "vertex_group", ob, "vertex_groups", text="")
377
378         sub = col.column()
379         sub.active = bool(md.vertex_group)
380         sub.prop(md, "invert")
381
382         layout.separator()
383
384         if md.is_bound:
385             layout.operator("object.meshdeform_bind", text="Unbind")
386         else:
387             layout.operator("object.meshdeform_bind", text="Bind")
388
389             if md.mode == 'VOLUME':
390                 split = layout.split()
391
392                 col = split.column()
393                 col.prop(md, "precision")
394
395                 if wide_ui:
396                     col = split.column()
397                 col.prop(md, "dynamic")
398
399     def MIRROR(self, layout, ob, md, wide_ui):
400         layout.prop(md, "merge_limit")
401         if wide_ui:
402             split = layout.split(percentage=0.25)
403         else:
404             split = layout.split(percentage=0.4)
405
406         col = split.column()
407         col.label(text="Axis:")
408         col.prop(md, "x")
409         col.prop(md, "y")
410         col.prop(md, "z")
411
412         if wide_ui:
413             col = split.column()
414         else:
415             subsplit = layout.split()
416             col = subsplit.column()
417         col.label(text="Options:")
418         col.prop(md, "clip", text="Clipping")
419         col.prop(md, "mirror_vertex_groups", text="Vertex Groups")
420
421         col = split.column()
422         col.label(text="Textures:")
423         col.prop(md, "mirror_u", text="U")
424         col.prop(md, "mirror_v", text="V")
425
426         col = layout.column()
427         col.label(text="Mirror Object:")
428         col.prop(md, "mirror_object", text="")
429
430     def MULTIRES(self, layout, ob, md, wide_ui):
431         if wide_ui:
432             layout.row().prop(md, "subdivision_type", expand=True)
433         else:
434             layout.row().prop(md, "subdivision_type", text="")
435
436         split = layout.split()
437         col = split.column()
438         col.prop(md, "levels", text="Preview")
439         col.prop(md, "sculpt_levels", text="Sculpt")
440         col.prop(md, "render_levels", text="Render")
441
442         if wide_ui:
443             col = split.column()
444
445         col.enabled = ob.mode != 'EDIT'
446         col.operator("object.multires_subdivide", text="Subdivide")
447         col.operator("object.multires_higher_levels_delete", text="Delete Higher")
448         col.operator("object.multires_reshape", text="Reshape")
449         col.prop(md, "optimal_display")
450
451         layout.separator()
452
453         col = layout.column()
454         row = col.row()
455         if md.external:
456             row.operator("object.multires_pack_external", text="Pack External")
457             row.label()
458             row = col.row()
459             row.prop(md, "filename", text="")
460         else:
461             row.operator("object.multires_save_external", text="Save External...")
462             row.label()
463
464     def PARTICLE_INSTANCE(self, layout, ob, md, wide_ui):
465         layout.prop(md, "object")
466         layout.prop(md, "particle_system_number", text="Particle System")
467
468         split = layout.split()
469         col = split.column()
470         col.label(text="Create From:")
471         col.prop(md, "normal")
472         col.prop(md, "children")
473         col.prop(md, "size")
474
475         if wide_ui:
476             col = split.column()
477         col.label(text="Show Particles When:")
478         col.prop(md, "alive")
479         col.prop(md, "unborn")
480         col.prop(md, "dead")
481
482         layout.separator()
483
484         layout.prop(md, "path", text="Create Along Paths")
485
486         split = layout.split()
487         split.active = md.path
488         col = split.column()
489         col.row().prop(md, "axis", expand=True)
490         col.prop(md, "keep_shape")
491
492         if wide_ui:
493             col = split.column()
494         col.prop(md, "position", slider=True)
495         col.prop(md, "random_position", text="Random", slider=True)
496
497     def PARTICLE_SYSTEM(self, layout, ob, md, wide_ui):
498         layout.label(text="See Particle panel.")
499
500     def SHRINKWRAP(self, layout, ob, md, wide_ui):
501         split = layout.split()
502         col = split.column()
503         col.label(text="Target:")
504         col.prop(md, "target", text="")
505         if wide_ui:
506             col = split.column()
507         col.label(text="Vertex Group:")
508         col.prop_object(md, "vertex_group", ob, "vertex_groups", text="")
509
510         split = layout.split()
511
512         col = split.column()
513         col.prop(md, "offset")
514         col.prop(md, "subsurf_levels")
515
516         if wide_ui:
517             col = split.column()
518             col.label(text="Mode:")
519         col.prop(md, "mode", text="")
520
521         if wide_ui:
522             split = layout.split(percentage=0.25)
523         else:
524             split = layout.split(percentage=0.35)
525         col = split.column()
526
527         if md.mode == 'PROJECT':
528             col.label(text="Axis:")
529             col.prop(md, "x")
530             col.prop(md, "y")
531             col.prop(md, "z")
532
533             col = split.column()
534             col.label(text="Direction:")
535             col.prop(md, "negative")
536             col.prop(md, "positive")
537
538             if wide_ui:
539                 col = split.column()
540             else:
541                 subsplit = layout.split()
542                 col = subsplit.column()
543             col.label(text="Cull Faces:")
544             col.prop(md, "cull_front_faces", text="Front")
545             col.prop(md, "cull_back_faces", text="Back")
546
547             layout.label(text="Auxiliary Target:")
548             layout.prop(md, "auxiliary_target", text="")
549
550         elif md.mode == 'NEAREST_SURFACEPOINT':
551             layout.prop(md, "keep_above_surface")
552
553     def SIMPLE_DEFORM(self, layout, ob, md, wide_ui):
554         split = layout.split()
555
556         col = split.column()
557         col.label(text="Mode:")
558         col.prop(md, "mode", text="")
559
560         if wide_ui:
561             col = split.column()
562         col.label(text="Vertex Group:")
563         col.prop_object(md, "vertex_group", ob, "vertex_groups", text="")
564
565         split = layout.split()
566
567         col = split.column()
568         col.label(text="Origin:")
569         col.prop(md, "origin", text="")
570         sub = col.column()
571         sub.active = (md.origin != "")
572         sub.prop(md, "relative")
573
574         if wide_ui:
575             col = split.column()
576         col.label(text="Deform:")
577         col.prop(md, "factor")
578         col.prop(md, "limits", slider=True)
579         if md.mode in ('TAPER', 'STRETCH'):
580             col.prop(md, "lock_x_axis")
581             col.prop(md, "lock_y_axis")
582
583     def SMOKE(self, layout, ob, md, wide_ui):
584         layout.label(text="See Smoke panel.")
585
586     def SMOOTH(self, layout, ob, md, wide_ui):
587         split = layout.split(percentage=0.25)
588
589         col = split.column()
590         col.label(text="Axis:")
591         col.prop(md, "x")
592         col.prop(md, "y")
593         col.prop(md, "z")
594
595         col = split.column()
596         col.prop(md, "factor")
597         col.prop(md, "repeat")
598         col.label(text="Vertex Group:")
599         col.prop_object(md, "vertex_group", ob, "vertex_groups", text="")
600
601     def SOFT_BODY(self, layout, ob, md, wide_ui):
602         layout.label(text="See Soft Body panel.")
603
604     def SOLIDIFY(self, layout, ob, md, wide_ui):
605         layout.prop(md, "offset")
606
607         split = layout.split()
608
609         col = split.column()
610         col.label(text="Crease:")
611         col.prop(md, "edge_crease_inner", text="Inner")
612         col.prop(md, "edge_crease_outer", text="Outer")
613         col.prop(md, "edge_crease_rim", text="Rim")
614
615         if wide_ui:
616             col = split.column()
617             col.label()
618         col.prop(md, "use_rim")
619         col.prop(md, "use_even_offset")
620         col.prop(md, "use_quality_normals")
621
622         # col = layout.column()
623         # col.label(text="Vertex Group:")
624         # col.prop_object(md, "vertex_group", ob, "vertex_groups", text="")
625
626     def SUBSURF(self, layout, ob, md, wide_ui):
627         if wide_ui:
628             layout.row().prop(md, "subdivision_type", expand=True)
629         else:
630             layout.row().prop(md, "subdivision_type", text="")
631
632         split = layout.split()
633         col = split.column()
634         col.label(text="Subdivisions:")
635         col.prop(md, "levels", text="View")
636         col.prop(md, "render_levels", text="Render")
637
638         if wide_ui:
639             col = split.column()
640         col.label(text="Options:")
641         col.prop(md, "optimal_display")
642
643     def SURFACE(self, layout, ob, md, wide_ui):
644         layout.label(text="See Fields panel.")
645
646     def UV_PROJECT(self, layout, ob, md, wide_ui):
647         if ob.type == 'MESH':
648             split = layout.split()
649
650             col = split.column()
651             col.label(text="Image:")
652             col.prop(md, "image", text="")
653
654             if wide_ui:
655                 col = split.column()
656             col.label(text="UV Layer:")
657             col.prop_object(md, "uv_layer", ob.data, "uv_textures", text="")
658
659             split = layout.split()
660             col = split.column()
661             col.prop(md, "override_image")
662             col.prop(md, "num_projectors", text="Projectors")
663             for proj in md.projectors:
664                 col.prop(proj, "object", text="")
665
666             if wide_ui:
667                 col = split.column()
668             sub = col.column(align=True)
669             sub.label(text="Aspect Ratio:")
670             sub.prop(md, "horizontal_aspect_ratio", text="Horizontal")
671             sub.prop(md, "vertical_aspect_ratio", text="Vertical")
672
673     def WAVE(self, layout, ob, md, wide_ui):
674         split = layout.split()
675
676         col = split.column()
677         col.label(text="Motion:")
678         col.prop(md, "x")
679         col.prop(md, "y")
680         col.prop(md, "cyclic")
681
682         if wide_ui:
683             col = split.column()
684         col.prop(md, "normals")
685         sub = col.column()
686         sub.active = md.normals
687         sub.prop(md, "x_normal", text="X")
688         sub.prop(md, "y_normal", text="Y")
689         sub.prop(md, "z_normal", text="Z")
690
691         split = layout.split()
692
693         col = split.column()
694         col.label(text="Time:")
695         sub = col.column(align=True)
696         sub.prop(md, "time_offset", text="Offset")
697         sub.prop(md, "lifetime", text="Life")
698         col.prop(md, "damping_time", text="Damping")
699
700         if wide_ui:
701             col = split.column()
702         col.label(text="Position:")
703         sub = col.column(align=True)
704         sub.prop(md, "start_position_x", text="X")
705         sub.prop(md, "start_position_y", text="Y")
706         col.prop(md, "falloff_radius", text="Falloff")
707
708         layout.separator()
709
710         layout.prop(md, "start_position_object")
711         layout.prop_object(md, "vertex_group", ob, "vertex_groups")
712         layout.prop(md, "texture")
713         layout.prop(md, "texture_coordinates")
714         if md.texture_coordinates == 'MAP_UV' and ob.type == 'MESH':
715             layout.prop_object(md, "uv_layer", ob.data, "uv_textures")
716         elif md.texture_coordinates == 'OBJECT':
717             layout.prop(md, "texture_coordinates_object")
718
719         layout.separator()
720
721         split = layout.split()
722
723         col = split.column()
724         col.prop(md, "speed", slider=True)
725         col.prop(md, "height", slider=True)
726
727         if wide_ui:
728             col = split.column()
729         col.prop(md, "width", slider=True)
730         col.prop(md, "narrowness", slider=True)
731
732
733 classes = [
734     DATA_PT_modifiers]
735
736
737 def register():
738     register = bpy.types.register
739     for cls in classes:
740         register(cls)
741
742
743 def unregister():
744     unregister = bpy.types.unregister
745     for cls in classes:
746         unregister(cls)
747
748 if __name__ == "__main__":
749     register()