use alternate syntax for clearing lists
[blender-addons-contrib.git] / io_atomblend_utilities / __init__.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 #
20 #
21 #  Authors           : Clemens Barth (Blendphys@root-1.de), ...
22 #
23 #  Homepage(Wiki)    : http://development.root-1.de/Atomic_Blender.php
24 #
25 #  Start of project              : 2011-12-01 by Clemens Barth
26 #  First publication in Blender  : 2012-11-03
27 #  Last modified                 : 2012-11-09
28 #
29 #  Acknowledgements 
30 #  ================
31 #
32 #  Blender: ideasman, meta_androcto, truman, kilon, CoDEmanX, dairin0d, PKHG, 
33 #           Valter, ...
34 #  Other: Frank Palmino
35 #
36
37 bl_info = {
38     "name": "Atomic Blender - Utilities",
39     "description": "Utilities for manipulating atom structures",
40     "author": "Clemens Barth",
41     "version": (0,6),
42     "blender": (2,6),
43     "location": "Panel: View 3D - Tools",
44     "warning": "",
45     "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/"
46                 "Py/Scripts/Import-Export/PDB",
47     "tracker_url": "http://projects.blender.org/tracker/"
48                    "index.php?func=detail&aid=33071&group_id=153&atid=467",
49     "category": "Import-Export"
50 }
51
52 import bpy
53 from bpy.types import Operator, Panel
54 from bpy.props import (StringProperty,
55                        EnumProperty,
56                        FloatProperty)
57
58 from . import io_atomblend_utilities
59
60 # -----------------------------------------------------------------------------
61 #                                                                           GUI
62
63 # This is the panel, which can be used to prepare the scene.
64 # It is loaded after the file has been chosen via the menu 'File -> Import'
65 class PreparePanel(Panel):
66     bl_label       = "Atomic Blender Utilities"
67     bl_space_type  = "VIEW_3D"
68     bl_region_type = "TOOL_PROPS"
69
70     def draw(self, context):
71         layout = self.layout
72         scn    = context.scene.atom_blend[0]
73
74         row = layout.row()
75         row.label(text="Custom data file")
76         box = layout.box()
77         row = box.row()
78         row.label(text="Custom data file")
79         row = box.row()
80         col = row.column()
81         col.prop(scn, "datafile")
82         col.operator("atom_blend.datafile_apply")
83         row = box.row()
84         row.operator("atom_blend.button_distance")
85         row.prop(scn, "distance")
86         row = layout.row()
87         row.label(text="Choice of atom radii")
88         box = layout.box()
89         row = box.row()
90         row.label(text="All changes concern:")
91         row = box.row()
92         row.prop(scn, "radius_how")
93         row = box.row()
94         row.label(text="1. Change type of radii")
95         row = box.row()
96         row.prop(scn, "radius_type")
97         row = box.row()
98         row.label(text="2. Change atom radii in pm")
99         row = box.row()
100         row.prop(scn, "radius_pm_name")
101         row = box.row()
102         row.prop(scn, "radius_pm")
103         row = box.row()
104         row.label(text="3. Change atom radii by scale")
105         row = box.row()
106         col = row.column()
107         col.prop(scn, "radius_all")
108         col = row.column(align=True)
109         col.operator( "atom_blend.radius_all_bigger" )
110         col.operator( "atom_blend.radius_all_smaller" )
111
112         layout.separator()
113         row = box.row()
114         row.active = (bpy.context.mode == 'EDIT_MESH')
115         row.operator( "atom_blend.separate_atom" )
116
117
118 class PanelProperties(bpy.types.PropertyGroup):
119
120     def Callback_radius_type(self, context):
121         scn = bpy.context.scene.atom_blend[0]
122         io_atomblend_utilities.choose_objects("radius_type", 
123                                               scn.radius_how, 
124                                               None,
125                                               None,
126                                               scn.radius_type) 
127     def Callback_radius_pm(self, context):
128         scn = bpy.context.scene.atom_blend[0]
129         io_atomblend_utilities.choose_objects("radius_pm", 
130                                               scn.radius_how, 
131                                               None,
132                                               [scn.radius_pm_name,
133                                               scn.radius_pm],
134                                               None) 
135         
136     datafile = StringProperty(
137         name = "", description="Path to your custom data file",
138         maxlen = 256, default = "", subtype='FILE_PATH')
139     XYZ_file = StringProperty(
140         name = "Path to file", default="",
141         description = "Path of the XYZ file")
142     number_atoms = StringProperty(name="",
143         default="Number", description = "This output shows "
144         "the number of atoms which have been loaded")
145     distance = StringProperty(
146         name="", default="Distance (A)",
147         description="Distance of 2 objects in Angstrom")
148     radius_how = EnumProperty(
149         name="",
150         description="Which objects shall be modified?",
151         items=(('ALL_ACTIVE',"all active objects", "in the current layer"),
152                ('ALL_IN_LAYER',"all"," in active layer(s)")),
153                default='ALL_ACTIVE',)
154     radius_type = EnumProperty(
155         name="Type",
156         description="Which type of atom radii?",
157         items=(('0',"predefined", "Use pre-defined radii"),
158                ('1',"atomic", "Use atomic radii"),
159                ('2',"van der Waals","Use van der Waals radii")),
160                default='0',update=Callback_radius_type)
161     radius_pm_name = StringProperty(
162         name="", default="Atom name",
163         description="Put in the name of the atom (e.g. Hydrogen)")
164     radius_pm = FloatProperty(
165         name="", default=100.0, min=0.0,
166         description="Put in the radius of the atom (in pm)",
167         update=Callback_radius_pm)
168     radius_all = FloatProperty(
169         name="Scale", default = 1.05, min=1.0, max=5.0,
170         description="Put in the scale factor")
171
172
173
174 # Button loading a custom data file
175 class DatafileApply(Operator):
176     bl_idname = "atom_blend.datafile_apply"
177     bl_label = "Apply"
178     bl_description = "Use color and radii values stored in the custom file"
179
180     def execute(self, context):
181         scn = bpy.context.scene.atom_blend[0]
182
183         if scn.datafile == "":
184             return {'FINISHED'}
185
186         io_atomblend_utilities.custom_datafile(scn.datafile)
187         io_atomblend_utilities.custom_datafile_change_atom_props()
188
189         return {'FINISHED'}
190
191
192 # Button for separating a single atom from a structure
193 class SeparateAtom(Operator):
194     bl_idname = "atom_blend.separate_atom"
195     bl_label = "Separate atoms"
196     bl_description = ("Separate atoms you have selected. "
197                       "You have to be in the 'Edit Mode'")
198
199     def execute(self, context):
200         scn = bpy.context.scene.atom_blend[0]
201
202         io_atomblend_utilities.separate_atoms(scn)
203
204         return {'FINISHED'}
205
206
207 # Button for measuring the distance of the active objects
208 class DistanceButton(Operator):
209     bl_idname = "atom_blend.button_distance"
210     bl_label = "Measure ..."
211     bl_description = "Measure the distance between two objects"
212
213     def execute(self, context):
214         scn  = bpy.context.scene.atom_blend[0]
215         dist = io_atomblend_utilities.distance()
216
217         # Put the distance into the string of the output field.
218         scn.distance = dist
219         return {'FINISHED'}
220
221
222 # Button for increasing the radii of all atoms
223 class RadiusAllBiggerButton(Operator):
224     bl_idname = "atom_blend.radius_all_bigger"
225     bl_label = "Bigger ..."
226     bl_description = "Increase the radii of the atoms"
227
228     def execute(self, context):
229         scn = bpy.context.scene.atom_blend[0]     
230         io_atomblend_utilities.choose_objects("radius_all", 
231                                               scn.radius_how, 
232                                               scn.radius_all, 
233                                               None,
234                                               None)        
235         return {'FINISHED'}
236
237
238 # Button for decreasing the radii of all atoms
239 class RadiusAllSmallerButton(Operator):
240     bl_idname = "atom_blend.radius_all_smaller"
241     bl_label = "Smaller ..."
242     bl_description = "Decrease the radii of the atoms"
243
244     def execute(self, context):
245         scn = bpy.context.scene.atom_blend[0]
246         io_atomblend_utilities.choose_objects("radius_all", 
247                                               scn.radius_how, 
248                                               1.0/scn.radius_all, 
249                                               None,
250                                               None)                                     
251         return {'FINISHED'}
252
253
254 def register():
255     io_atomblend_utilities.read_elements()  
256     bpy.utils.register_module(__name__)
257     bpy.types.Scene.atom_blend = bpy.props.CollectionProperty(type=
258                                                    PanelProperties)
259     bpy.context.scene.atom_blend.add()
260
261 def unregister():
262     bpy.utils.unregister_module(__name__)
263
264
265 if __name__ == "__main__":
266
267     register()