24
24
from __future__ import print_function
25
25
26
26
import collections
27
- import math
28
27
import datetime
28
+ import math
29
+ import pprint
29
30
30
31
import maya .cmds
31
32
@@ -51,9 +52,9 @@ def parse_command_result(cmd_result):
51
52
data = collections .defaultdict (list )
52
53
for res in cmd_result :
53
54
assert isinstance (res , pycompat .TEXT_TYPE )
54
- splt = res .partition (KEY_VALUE_SEP_CHAR )
55
- key = splt [0 ]
56
- value = splt [- 1 ]
55
+ split = res .partition (KEY_VALUE_SEP_CHAR )
56
+ key = split [0 ]
57
+ value = split [- 1 ]
57
58
if len (key ) == 0 :
58
59
continue
59
60
if SPLIT_SEP_CHAR in value :
@@ -142,6 +143,33 @@ def _string_get_solver_stats(input_data):
142
143
return solver_stats
143
144
144
145
146
+ def _string_get_solver_frames_stats (input_data ):
147
+ name_keys = [
148
+ ('number_of_valid_frames' , 'number_of_valid_frames' , int , None ),
149
+ ('number_of_invalid_frames' , 'number_of_invalid_frames' , int , None ),
150
+ ('valid_frames' , 'valid_frames' , list , int ),
151
+ ('invalid_frames' , 'invalid_frames' , list , int ),
152
+ ]
153
+ index = 0
154
+ solver_frames = {}
155
+ for name , key , outer_type , inner_type in name_keys :
156
+ value = input_data .get (key )
157
+ if value is None :
158
+ continue
159
+ if inner_type is None :
160
+ v = _convert_to (name , key , outer_type , value , index )
161
+ solver_frames [name ] = v
162
+ else :
163
+ if len (value ) == 1 :
164
+ value = value [0 ]
165
+ values = []
166
+ for v in value :
167
+ if len (v ) > 0 :
168
+ values .append (inner_type (v ))
169
+ solver_frames [name ] = values
170
+ return solver_frames
171
+
172
+
145
173
def _string_get_error_stats (input_data ):
146
174
name_keys = [
147
175
('initial' , 'error_initial' , float ),
@@ -254,6 +282,15 @@ def _get_maya_attr_anim_curve(node, attr_name, existing_attrs):
254
282
return anim_curves [0 ]
255
283
256
284
285
+ def _get_node_frame_list (node , attr_name , existing_attrs ):
286
+ anim_curve = _get_maya_attr_anim_curve (node , attr_name , existing_attrs )
287
+ if anim_curve is None :
288
+ return {}
289
+
290
+ keyframe_times = maya .cmds .keyframe (anim_curve , query = True , timeChange = True ) or []
291
+ return set (keyframe_times )
292
+
293
+
257
294
def _get_node_frame_error_list (node , attr_name , existing_attrs ):
258
295
anim_curve = _get_maya_attr_anim_curve (node , attr_name , existing_attrs )
259
296
if anim_curve is None :
@@ -343,6 +380,21 @@ def _node_get_solver_stats(node, existing_attrs):
343
380
return data
344
381
345
382
383
+ def _node_get_solver_frames_stats (node , existing_attrs ):
384
+ assert maya .cmds .objExists (node ) is True
385
+ data = {
386
+ 'number_of_valid_frames' : _get_maya_attr (
387
+ node , 'number_of_valid_frames' , int , existing_attrs
388
+ ),
389
+ 'number_of_invalid_frames' : _get_maya_attr (
390
+ node , 'number_of_invalid_frames' , int , existing_attrs
391
+ ),
392
+ 'valid_frames' : _get_node_frame_list (node , 'valid_frames' , existing_attrs ),
393
+ 'invalid_frames' : _get_node_frame_list (node , 'invalid_frames' , existing_attrs ),
394
+ }
395
+ return data
396
+
397
+
346
398
def _node_get_print_stats (node , existing_attrs ):
347
399
assert maya .cmds .objExists (node ) is True
348
400
data = {
@@ -414,8 +466,8 @@ def __init__(self, *args, **kwargs):
414
466
self ._solver_stats = _node_get_solver_stats (node , existing_attrs )
415
467
self ._error_stats = _node_get_error_stats (node , existing_attrs )
416
468
self ._timer_stats = _node_get_timer_stats (node , existing_attrs )
469
+ self ._solver_frames_stats = _node_get_solver_frames_stats (data )
417
470
self ._print_stats = _node_get_print_stats (node , existing_attrs )
418
-
419
471
self ._per_frame_error = _node_get_per_frame_error (node , existing_attrs )
420
472
self ._per_marker_per_frame_error = _node_get_per_marker_per_frame_error (
421
473
node , existing_attrs
@@ -428,6 +480,7 @@ def __init__(self, *args, **kwargs):
428
480
self ._solver_stats = _string_get_solver_stats (data )
429
481
self ._error_stats = _string_get_error_stats (data )
430
482
self ._timer_stats = _string_get_timer_stats (data )
483
+ self ._solver_frames_stats = _string_get_solver_frames_stats (data )
431
484
self ._print_stats = _string_get_print_stats (data )
432
485
self ._per_marker_per_frame_error = _string_get_error_per_marker_per_frame (
433
486
data
@@ -509,6 +562,13 @@ def get_print_stats(self):
509
562
"""
510
563
return self ._print_stats .copy ()
511
564
565
+ def get_solver_frames_stats (self ):
566
+ """
567
+ Details of internal statistics that can be gathered and
568
+ printed out.
569
+ """
570
+ return self ._solver_frames_stats .copy ()
571
+
512
572
def get_frame_list (self ):
513
573
"""
514
574
The list of frames that this solve result contains.
@@ -540,6 +600,20 @@ def get_marker_error_list(self, marker_node=None):
540
600
v = self ._per_marker_per_frame_error .get (marker_node )
541
601
return v
542
602
603
+ def get_solver_valid_frame_list (self ):
604
+ """
605
+ The list of valid frames that the solver can solve.
606
+ """
607
+ frame_list = self ._solver_frames_stats .get ('valid_frames' , [])
608
+ return list (sorted (frame_list ))
609
+
610
+ def get_solver_invalid_frame_list (self ):
611
+ """
612
+ The list of invalid frames that the solver can solve.
613
+ """
614
+ frame_list = self ._solver_frames_stats .get ('invalid_frames' , [])
615
+ return list (sorted (frame_list ))
616
+
543
617
544
618
def combine_timer_stats (solres_list ):
545
619
"""
0 commit comments