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