59f9eaea5482c2cd1071e3692853555c1fd6e3ad
[blender-addons-contrib.git] / io_mesh_gwyddion / __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          : http://development.root-1.de/Atomic_Blender.php
24 #
25 #  Start of project              : 2012-11-12 by Clemens Barth
26 #  First publication in Blender  : 2012-11-19
27 #  Last modified                 : 2012-11-19
28 #
29 #  Acknowledgements 
30 #  ================
31 #
32 #  Other: Frank Palmino
33 #
34
35 bl_info = {
36     "name": "Atomic Blender - Gwyddion",
37     "description": "Loading Gwyddion Atomic Force Microscopy images",
38     "author": "Clemens Barth",
39     "version": (0,1),
40     "blender": (2,6),
41     "location": "File -> Import -> Gwyddion (.gwy)",
42     "warning": "",
43     "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/"
44                 "Scripts/Import-Export/Gwyddion",
45     "tracker_url": "",
46     "category": "Import-Export"
47 }
48
49 import bpy
50 from bpy.types import Operator
51 from bpy_extras.io_utils import ImportHelper
52 from bpy.props import (BoolProperty, 
53                        StringProperty, 
54                        EnumProperty,
55                        FloatProperty)
56
57 from . import import_gwyddion
58
59 # -----------------------------------------------------------------------------
60 #                                                                           GUI
61
62 # This is the class for the file dialog of the importer.
63 class ImportGwyddion(Operator, ImportHelper):
64     bl_idname = "import_mesh.gwy"
65     bl_label  = "Import Gwyddion (*.gwy)"
66     bl_options = {'PRESET', 'UNDO'}
67
68     filename_ext = ".gwy"
69     filter_glob  = StringProperty(default="*.gwy", options={'HIDDEN'},)
70
71     use_camera = BoolProperty(
72         name="Camera", default=False,
73         description="Do you need a camera?")
74     use_lamp = BoolProperty(
75         name="Lamp", default=False,
76         description = "Do you need a lamp?")
77     fit = EnumProperty(
78         name="Processing",
79         description="Choose the image processing routine",
80         items=(('0', "None", "Load raw data"),
81                ('1', "Plane" , "Perform a plane fit"),
82                ('2', "Line" , "Perform a line fit")),
83                default='0',)             
84     use_smooth = BoolProperty(
85         name="Smooth image data", default=False,
86         description = "Smooth the images")
87     scale_size = FloatProperty (
88         name = "Scale xy", default=0.5,
89         description = "Scale the lateral size")    
90     scale_height = FloatProperty (
91         name = "Scale h", default=3.0,
92         description = "Scale the height")    
93     use_all_channels = BoolProperty(
94         name="All channels", default=False,
95         description = "Load all images")        
96     use_c1 = BoolProperty(
97         name="1", default=True,
98         description = "Channel 1")
99     use_c2 = BoolProperty(
100         name="2", default=False,
101         description = "Channel 2")        
102     use_c3 = BoolProperty(
103         name="3", default=False,
104         description = "Channel 3")
105     use_c4 = BoolProperty(
106         name="4", default=False,
107         description = "Channel 4")       
108     use_c5 = BoolProperty(
109         name="5", default=False,
110         description = "Channel 5")
111     use_c6 = BoolProperty(
112         name="6", default=False,
113         description = "Channel 6")        
114     use_c7 = BoolProperty(
115         name="7", default=False,
116         description = "Channel 7")
117     use_c8 = BoolProperty(
118         name="8", default=False,
119         description = "Channel 8")       
120  
121     def draw(self, context):
122         layout = self.layout
123         row = layout.row()
124         row.prop(self, "use_camera")
125         row.prop(self, "use_lamp")
126         row = layout.row()
127         row.prop(self, "fit")     
128         row = layout.row()
129         row.prop(self, "use_smooth")
130         row = layout.row()
131         row.prop(self, "scale_size")
132         row.prop(self, "scale_height")
133         row = layout.row()
134         row.label(text="Channels")
135         row.prop(self, "use_all_channels")
136         row = layout.row()
137         row.prop(self, "use_c1")
138         row.prop(self, "use_c2")
139         row.prop(self, "use_c3")
140         row.prop(self, "use_c4")
141         row = layout.row()
142         row.prop(self, "use_c5")
143         row.prop(self, "use_c6")
144         row.prop(self, "use_c7")
145         row.prop(self, "use_c8")
146         
147         if self.use_all_channels:
148             self.use_c1, self.use_c2, self.use_c3, self.use_c4, \
149             self.use_c5, self.use_c6, self.use_c7, self.use_c8  \
150             = True, True, True, True, True, True, True, True
151         
152     def execute(self, context):
153         # This is in order to solve this strange 'relative path' thing.
154         filepath_par = bpy.path.abspath(self.filepath)
155
156         channels = [self.use_c1, self.use_c2, self.use_c3, self.use_c4,
157                     self.use_c5, self.use_c6, self.use_c7, self.use_c8]
158
159         # Execute main routine   
160         #print("passed - 1")
161         images, AFMdata = import_gwyddion.load_gwyddion_images(filepath_par, 
162                                                                channels) 
163
164         #print("passed - 2")               
165         if self.fit == '1':
166             images = import_gwyddion.plane_fit(images, AFMdata)
167         if self.fit == '2':
168             images = import_gwyddion.line_fit(images, AFMdata) 
169
170         #print("passed - 3")
171         import_gwyddion.create_mesh(images, 
172                                  AFMdata,
173                                  self.use_smooth,
174                                  self.scale_size,
175                                  self.scale_height,
176                                  self.use_camera,
177                                  self.use_lamp)  
178         #print("passed - 4")
179         
180         return {'FINISHED'}
181
182
183 # The entry into the menu 'file -> import'
184 def menu_func_import(self, context):
185     self.layout.operator(ImportGwyddion.bl_idname, text="Gwyddion (.gwy)")
186
187
188 def register():
189     import_gwyddion.initialize_linalg()
190     bpy.utils.register_module(__name__)
191     bpy.types.INFO_MT_file_import.append(menu_func_import)
192     
193 def unregister():
194     bpy.utils.unregister_module(__name__)
195     bpy.types.INFO_MT_file_import.remove(menu_func_import)
196
197 if __name__ == "__main__":
198
199     register()