1 # ##### BEGIN GPL LICENSE BLOCK #####
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.
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.
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.
17 # ##### END GPL LICENSE BLOCK #####
20 "name": "Export Pointcache Format(.pc2)",
21 "author": "Florian Meyer (tstscr)",
23 "blender": (2, 57, 0),
24 "location": "File > Export > Pointcache (.pc2)",
25 "description": "Export mesh Pointcache data (.pc2)",
27 "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/"\
28 "Scripts/Import-Export/PC2_Pointcache_export",
29 "tracker_url": "https://projects.blender.org/tracker/index.php?"\
30 "func=detail&aid=24703",
31 "category": "Import-Export"}
37 cacheFile -pc2 1 -pcf "<insert filepath of source>" -f "<insert target filename w/o extension>" -dir "<insert directory path for target>" -format "OneFile";
42 from bpy
.props
import *
43 import mathutils
, math
, struct
46 from bpy_extras
.io_utils
import ExportHelper
48 def getSampling(start
, end
, sampling
):
49 samples
= [start
+ x
* sampling
50 for x
in range(int((end
- start
) / sampling
) + 1)]
53 def do_export(context
, props
, filepath
):
54 mat_x90
= mathutils
.Matrix
.Rotation(-math
.pi
/2, 4, 'X')
55 ob
= context
.active_object
57 start
= props
.range_start
59 sampling
= float(props
.sampling
)
60 apply_modifiers
= props
.apply_modifiers
61 me
= ob
.to_mesh(sc
, apply_modifiers
, 'PREVIEW')
62 vertCount
= len(me
.vertices
)
63 sampletimes
= getSampling(start
, end
, sampling
)
64 sampleCount
= len(sampletimes
)
67 headerFormat
='<12siiffi'
68 headerStr
= struct
.pack(headerFormat
, b
'POINTCACHE2\0',
69 1, vertCount
, start
, sampling
, sampleCount
)
71 file = open(filepath
, "wb")
74 for frame
in sampletimes
:
76 me
= ob
.to_mesh(sc
, apply_modifiers
, 'PREVIEW')
78 if len(me
.vertices
) != vertCount
:
83 empty
= open(filepath
, 'w')
84 empty
.write('DUMMIFILE - export failed\n')
86 print('Export failed. Vertexcount of Object is not constant')
90 me
.transform(ob
.matrix_world
)
95 thisVertex
= struct
.pack('<fff', float(v
.co
[0]),
98 file.write(thisVertex
)
105 ###### EXPORT OPERATOR #######
106 class Export_pc2(bpy
.types
.Operator
, ExportHelper
):
107 """Export the active Object as a .pc2 Pointcache file"""
108 bl_idname
= "export_shape.pc2"
109 bl_label
= "Export Pointcache (.pc2)"
111 filename_ext
= ".pc2"
113 rot_x90
= BoolProperty(name
="Convert to Y-up",
114 description
="Rotate 90 degrees around X to convert to y-up",
117 world_space
= BoolProperty(name
="Export into Worldspace",
118 description
="Transform the Vertexcoordinates into Worldspace",
121 apply_modifiers
= BoolProperty(name
="Apply Modifiers",
122 description
="Applies the Modifiers",
125 range_start
= IntProperty(name
='Start Frame',
126 description
='First frame to use for Export',
129 range_end
= IntProperty(name
='End Frame',
130 description
='Last frame to use for Export',
133 sampling
= EnumProperty(name
='Sampling',
134 description
='Sampling --> frames per sample (0.1 yields 10 samples per frame)',
135 items
=(('0.01', '0.01', ''),
136 ('0.05', '0.05', ''),
139 ('0.25', '0.25', ''),
152 def poll(cls
, context
):
153 return context
.active_object
.type in {'MESH', 'CURVE', 'SURFACE', 'FONT'}
155 def execute(self
, context
):
156 start_time
= time
.time()
157 print('\n_____START_____')
158 props
= self
.properties
159 filepath
= self
.filepath
160 filepath
= bpy
.path
.ensure_ext(filepath
, self
.filename_ext
)
162 exported
= do_export(context
, props
, filepath
)
165 print('finished export in %s seconds' %((time
.time() - start_time
)))
170 def invoke(self
, context
, event
):
171 wm
= context
.window_manager
175 wm
.fileselect_add(self
) # will run self.execute()
176 return {'RUNNING_MODAL'}
179 wm
.invoke_search_popup(self
)
180 return {'RUNNING_MODAL'}
183 return wm
.invoke_props_popup(self
, event
)
185 return self
.execute(context
)
190 def menu_func(self
, context
):
191 self
.layout
.operator(Export_pc2
.bl_idname
, text
="Pointcache (.pc2)")
195 bpy
.utils
.register_module(__name__
)
197 bpy
.types
.INFO_MT_file_export
.append(menu_func
)
198 #bpy.types.VIEW3D_PT_tools_objectmode.prepend(menu_func)
201 bpy
.utils
.unregister_module(__name__
)
203 bpy
.types
.INFO_MT_file_export
.remove(menu_func
)
204 #bpy.types.VIEW3D_PT_tools_objectmode.remove(menu_func)
206 if __name__
== "__main__":