7220084cc7eb0a8de7734f7b5ea343b0c068c4c7
[blender.git] / release / scripts / op / io_scene_obj / __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 # <pep8 compliant>
20
21 # To support reload properly, try to access a package var, if it's there, reload everything
22 if "bpy" in locals():
23     # only reload if we alredy loaded, highly annoying
24     import sys
25     reload(sys.modules.get("io_scene_obj.import_obj", sys))
26     reload(sys.modules.get("io_scene_obj.export_obj", sys))
27
28
29 import bpy
30 from bpy.props import *
31 from io_utils import ExportHelper, ImportHelper
32
33
34 class ImportOBJ(bpy.types.Operator, ImportHelper):
35     '''Load a Wavefront OBJ File'''
36     bl_idname = "import_scene.obj"
37     bl_label = "Import OBJ"
38
39     filename_ext = ".obj"
40
41     CREATE_SMOOTH_GROUPS = BoolProperty(name="Smooth Groups", description="Surround smooth groups by sharp edges", default= True)
42     CREATE_FGONS = BoolProperty(name="NGons as FGons", description="Import faces with more then 4 verts as fgons", default= True)
43     CREATE_EDGES = BoolProperty(name="Lines as Edges", description="Import lines and faces with 2 verts as edge", default= True)
44     SPLIT_OBJECTS = BoolProperty(name="Object", description="Import OBJ Objects into Blender Objects", default= True)
45     SPLIT_GROUPS = BoolProperty(name="Group", description="Import OBJ Groups into Blender Objects", default= True)
46     # old comment: only used for user feedback
47     # disabled this option because in old code a handler for it disabled SPLIT* params, it's not passed to load_obj
48     # KEEP_VERT_ORDER = BoolProperty(name="Keep Vert Order", description="Keep vert and face order, disables split options, enable for morph targets", default= True)
49     ROTATE_X90 = BoolProperty(name="-X90", description="Rotate X 90.", default= True)
50     CLAMP_SIZE = FloatProperty(name="Clamp Scale", description="Clamp the size to this maximum (Zero to Disable)", min=0.0, max=1000.0, soft_min=0.0, soft_max=1000.0, default=0.0)
51     POLYGROUPS = BoolProperty(name="Poly Groups", description="Import OBJ groups as vertex groups.", default= True)
52     IMAGE_SEARCH = BoolProperty(name="Image Search", description="Search subdirs for any assosiated images (Warning, may be slow)", default= True)
53
54
55     def execute(self, context):
56         # print("Selected: " + context.active_object.name)
57         import io_scene_obj.import_obj
58         return io_scene_obj.import_obj.load(self, context, **self.properties)
59         '''
60         load_obj(self.filepath,
61                  context,
62                  self.CLAMP_SIZE,
63                  self.CREATE_FGONS,
64                  self.CREATE_SMOOTH_GROUPS,
65                  self.CREATE_EDGES,
66                  self.SPLIT_OBJECTS,
67                  self.SPLIT_GROUPS,
68                  self.ROTATE_X90,
69                  self.IMAGE_SEARCH,
70                  self.POLYGROUPS)
71         '''
72
73         return {'FINISHED'}
74
75
76 class ExportOBJ(bpy.types.Operator, ExportHelper):
77     '''Save a Wavefront OBJ File'''
78
79     bl_idname = "export_scene.obj"
80     bl_label = 'Export OBJ'
81     
82     filename_ext = ".obj"
83
84     # List of operator properties, the attributes will be assigned
85     # to the class instance from the operator settings before calling.
86
87     # context group
88     use_selection = BoolProperty(name="Selection Only", description="Export selected objects only", default= False)
89     use_all_scenes = BoolProperty(name="All Scenes", description="", default= False)
90     use_animation = BoolProperty(name="Animation", description="", default= False)
91
92     # object group
93     use_modifiers = BoolProperty(name="Apply Modifiers", description="Apply modifiers (preview resolution)", default= True)
94     use_rotate_x90 = BoolProperty(name="Rotate X90", description="", default= True)
95
96     # extra data group
97     use_edges = BoolProperty(name="Edges", description="", default=True)
98     use_normals = BoolProperty(name="Normals", description="", default=False)
99     use_hq_normals = BoolProperty(name="High Quality Normals", description="", default=True)
100     use_uvs = BoolProperty(name="UVs", description="", default= True)
101     use_materials = BoolProperty(name="Materials", description="", default=True)
102     copy_images = BoolProperty(name="Copy Images", description="", default=False)
103     use_triangles = BoolProperty(name="Triangulate", description="", default=False)
104     use_vertex_groups = BoolProperty(name="Polygroups", description="", default=False)
105     use_nurbs = BoolProperty(name="Nurbs", description="", default=False)
106
107     # grouping group
108     use_blen_objects = BoolProperty(name="Objects as OBJ Objects", description="", default= True)
109     group_by_object = BoolProperty(name="Objects as OBJ Groups ", description="", default= False)
110     group_by_material = BoolProperty(name="Material Groups", description="", default= False)
111     keep_vertex_order = BoolProperty(name="Keep Vertex Order", description="", default= False)
112
113
114     def execute(self, context):
115         import io_scene_obj.export_obj
116         print(self.keys())
117         return io_scene_obj.export_obj.save(self, context, **self.properties)
118
119
120 def menu_func_import(self, context):
121     self.layout.operator(ImportOBJ.bl_idname, text="Wavefront (.obj)")
122
123
124 def menu_func_export(self, context):
125     self.layout.operator(ExportOBJ.bl_idname, text="Wavefront (.obj)")
126
127
128 def register():
129     bpy.types.INFO_MT_file_import.append(menu_func_import)
130     bpy.types.INFO_MT_file_export.append(menu_func_export)
131
132 def unregister():
133     bpy.types.INFO_MT_file_import.remove(menu_func_import)
134     bpy.types.INFO_MT_file_export.remove(menu_func_export)
135
136
137 # CONVERSION ISSUES
138 # - matrix problem
139 # - duplis - only tested dupliverts
140 # - all scenes export
141 # + normals calculation
142
143 if __name__ == "__main__":
144     register()