[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [2579] trunk/py/scripts/addons/ io_anim_c3d: SVN maintenance.
gsr b3d
gsr.b3d at infernal-iceberg.com
Thu Nov 3 05:07:00 CET 2011
Revision: 2579
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=2579
Author: gsrb3d
Date: 2011-11-03 04:06:55 +0000 (Thu, 03 Nov 2011)
Log Message:
-----------
SVN maintenance.
Modified Paths:
--------------
trunk/py/scripts/addons/io_anim_c3d/__init__.py
trunk/py/scripts/addons/io_anim_c3d/import_c3d.py
Property Changed:
----------------
trunk/py/scripts/addons/io_anim_c3d/__init__.py
trunk/py/scripts/addons/io_anim_c3d/import_c3d.py
Modified: trunk/py/scripts/addons/io_anim_c3d/__init__.py
===================================================================
--- trunk/py/scripts/addons/io_anim_c3d/__init__.py 2011-11-03 02:47:36 UTC (rev 2578)
+++ trunk/py/scripts/addons/io_anim_c3d/__init__.py 2011-11-03 04:06:55 UTC (rev 2579)
@@ -1,279 +1,279 @@
-# ##### BEGIN GPL LICENSE BLOCK #####
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 3
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# ##### END GPL LICENSE BLOCK #####
-
-# <pep8-80 compliant>
-
-# This script was developed with financial support from the Foundation for
-# Science and Technology of Portugal, under the grant SFRH/BD/66452/2009.
-
-
-bl_info = {
- 'name': "C3D Graphics Lab Motion Capture file (.c3d)",
- 'author': "Daniel Monteiro Basso <daniel at basso.inf.br>",
- 'version': (2011, 11, 3, 1),
- 'blender': (2, 6, 0),
- 'api': 41226,
- 'location': "File > Import",
- 'description': "Imports C3D Graphics Lab Motion Capture files",
- 'wiki_url': "http://wiki.blender.org/index.php/Extensions:2.5/Py/"
- "Scripts/Import-Export/C3D_Importer",
- 'tracker_url': "http://projects.blender.org/tracker/?func=detail&atid=467"
- "&aid=29061&group_id=153",
- 'category': 'Import-Export'}
-
-
-import bpy
-from bpy.props import (StringProperty,
- BoolProperty,
- FloatProperty,
- IntProperty,
- )
-
-import math
-import time
-from mathutils import Vector
-from . import import_c3d
-
-
-class C3DAnimateCloud(bpy.types.Operator):
- """
- Animate the Marker Cloud
- """
- bl_idname = "import_anim.c3danim"
- bl_label = "Animate C3D"
-
- markerset = None
- uname = None
- curframe = 0
- fskip = 0
- scale = 0
- timer = None
-
- def modal(self, context, event):
- if event.type == 'ESC':
- return self.cancel(context)
- if event.type == 'TIMER':
- if self.curframe > self.markerset.endFrame:
- return self.cancel(context)
- fno = self.curframe
- if not self.use_frame_no:
- fno = (self.curframe - self.markerset.startFrame) / self.fskip
- for i in range(self.fskip):
- self.markerset.readNextFrameData()
- for ml in self.markerset.markerLabels:
- name = self.unames[self.prefix + ml]
- o = bpy.context.scene.objects[name]
- m = self.markerset.getMarker(ml, self.curframe)
- o.location = Vector(m.position) * self.scale
- if m.confidence >= self.confidence:
- o.keyframe_insert('location', frame=fno)
- self.curframe += self.fskip
- return {'PASS_THROUGH'}
-
- def execute(self, context):
- context.window_manager.modal_handler_add(self)
- self.timer = context.window_manager.\
- event_timer_add(0.001, context.window)
- return {'RUNNING_MODAL'}
-
- def cancel(self, context):
- bpy.context.scene.frame_set(bpy.context.scene.frame_current)
- context.window_manager.event_timer_remove(self.timer)
- return {'CANCELLED'}
-
-
-class C3DImporter(bpy.types.Operator):
- """
- Load a C3D Marker Cloud
- """
- bl_idname = "import_anim.c3d"
- bl_label = "Import C3D"
-
- filepath = StringProperty(
- name="File Path",
- maxlen=1024,
- description="Path to the C3D file",
- )
- from_inches = BoolProperty(
- name="Convert from inches to metric",
- default=False,
- description="Scale by 2.54/100",
- )
- scale = FloatProperty(
- name="Scale",
- default=1.0,
- description="Scale the positions by this value",
- min=0.0001, max=1000000.0,
- soft_min=0.001, soft_max=100.0,
- )
- auto_scale = BoolProperty(
- name="Adjust scale automatically",
- default=False,
- description="Guess correct scale factor",
- )
- auto_magnitude = BoolProperty(
- name="Adjust scale magnitude",
- default=True,
- description="Automatically adjust scale magnitude",
- )
- size = FloatProperty(
- name="Empty Size",
- default=.03,
- description="The size of each empty",
- min=0.0001, max=1000000.0,
- soft_min=0.001, soft_max=100.0,
- )
- x_ray = BoolProperty(
- name="Use X-Ray",
- default=True,
- description="Show the empties over other objects",
- )
- frame_skip = IntProperty(
- name="Fps divisor",
- default=4,
- # usually the sample rate is 120, so the default 4 gives you 30fps
- description="Frame supersampling factor",
- min=1,
- )
- use_frame_no = BoolProperty(
- name="Use frame numbers",
- default=False,
- description="Offset start of animation according to the source",
- )
- show_names = BoolProperty(
- name="Show Names", default=False,
- description="Show the markers' name",
- )
- prefix = StringProperty(
- name="Name Prefix", maxlen=32,
- description="Prefix object names with this",
- )
- confidence = FloatProperty(
- name="Minimum Confidence Level", default=0,
- description="Only consider markers with at least "
- "this confidence level",
- min=-1., max=1000000.0,
- soft_min=-1., soft_max=100.0,
- )
-
- filter_glob = StringProperty(default="*.c3d;*.csv", options={'HIDDEN'})
-
- def find_height(self, ms):
- """
- Heuristic to find the height of the subject in the markerset
- (only works for standing poses)
- """
- zmin = None
- for ml in ms.markerLabels:
- if 'LTOE' in ml:
- hd = ml.replace('LTOE', 'LFHD')
- if hd not in ms.markerLabels:
- break
- pmin_idx = ms.markerLabels.index(ml)
- pmax_idx = ms.markerLabels.index(hd)
- zmin = ms.frames[0][pmin_idx].position[2]
- zmax = ms.frames[0][pmax_idx].position[2]
- if zmin is None: # could not find named markers, get extremes
- allz = [m.position[2] for m in ms.frames[0]]
- zmin, zmax = min(allz), max(allz)
- return abs(zmax - zmin)
-
- def adjust_scale_magnitude(self, height, scale):
- mag = math.log10(height * scale)
- #print('mag',mag, 'scale',scale)
- return scale * math.pow(10, -int(mag))
-
- def adjust_scale(self, height, scale):
- factor = height * scale / 1.75 # normalize
- if factor < 0.5:
- scale /= 10.0
- factor *= 10.0
- cmu_factors = [(1.0, 1.0), (1.1, 1.45), (1.6, 1.6), (2.54, 2.54)]
- sqerr, fix = min(((cf[0] - factor) ** 2.0, 1.0 / cf[1])
- for cf in cmu_factors)
- #print('height * scale: {:.2f}'.format(height * scale))
- #print(factor, fix)
- return scale * fix
-
- def execute(self, context):
- s = self.properties.size
- empty_size = (s, s, s)
- ms = import_c3d.read(self.properties.filepath, onlyHeader=True)
- ms.readNextFrameData()
- #print(ms.fileName)
-
- # determine the final scale
- height = self.find_height(ms)
- #print('h', height)
- scale = 1.0 if not self.properties.from_inches else 2.54
- scale *= ms.scale
- if self.properties.auto_magnitude:
- scale = self.adjust_scale_magnitude(height, scale)
- #print('scale',scale)
- if self.properties.auto_scale:
- scale = self.adjust_scale(height, scale)
- scale *= self.properties.scale
-
- # create the empties and get their collision-free names
- unames = {}
- for ml in ms.markerLabels:
- bpy.ops.object.add()
- bpy.ops.transform.resize(value=empty_size)
- name = self.properties.prefix + ml
- bpy.context.active_object.name = name
- unames[name] = bpy.context.active_object.name
- bpy.context.active_object.show_name = self.properties.show_names
- bpy.context.active_object.show_x_ray = self.properties.x_ray
- for name in unames.values():
- bpy.context.scene.objects[name].select = True
-
- # start animating the empties
- C3DAnimateCloud.markerset = ms
- C3DAnimateCloud.unames = unames
- C3DAnimateCloud.scale = scale
- C3DAnimateCloud.fskip = self.properties.frame_skip
- C3DAnimateCloud.prefix = self.properties.prefix
- C3DAnimateCloud.use_frame_no = self.properties.use_frame_no
- C3DAnimateCloud.confidence = self.properties.confidence
- C3DAnimateCloud.curframe = ms.startFrame
- bpy.ops.import_anim.c3danim()
- return {'FINISHED'}
-
- def invoke(self, context, event):
- wm = context.window_manager
- wm.fileselect_add(self)
- return {'RUNNING_MODAL'}
-
-
-def menu_func(self, context):
- self.layout.operator(C3DImporter.bl_idname,
- text="Graphics Lab Motion Capture (.c3d)")
-
-
-def register():
- bpy.utils.register_module(__name__)
- bpy.types.INFO_MT_file_import.append(menu_func)
-
-
-def unregister():
- bpy.utils.unregister_module(__name__)
- bpy.types.INFO_MT_file_import.remove(menu_func)
-
-
-if __name__ == "__main__":
- register()
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-extensions-cvs
mailing list