diff -urN rt_v45/dat.py rt_v46/dat.py --- rt_v45/dat.py 2018-06-04 23:11:09.000000000 +0900 +++ rt_v46/dat.py 2018-06-05 22:38:30.000000000 +0900 @@ -3,6 +3,7 @@ import math import ut import mt +import v import line import ax import cylx @@ -72,12 +73,29 @@ if not m.get('rep'): m['rep'] = (0,0) +def tm_sft_copy(yd): + def f_d(d): + if 'tsc' not in d: + return [d] + (n, sft) = d.pop('tsc') + def f(i): + d_ = d_copy(d) + d_['tm_sft'] = sft * i + return d_ + return list( map( lambda i: f(i), range(n) ) ) + + f_lst = lambda lst: sum( map( lambda d: f_d(d), lst ), [] ) + + return dict( map( lambda k: ( k, f_lst( yd.get(k) ) ), yd.keys() ) ) + def setup_ydic(o, sec): t = type(o) if t == list: return list( map( lambda o: setup_ydic(o, sec), o ) ) if t == dict: - return dict( map( lambda k: ( k, setup_ydic( o.get(k), sec ) ), o.keys() ) ) + tm_sft = o.get('tm_sft', 0) + f = lambda k: ( k, setup_ydic( o.get(k), sec + tm_sft ) ) + return dict( map( f, o.keys() ) ) if t == str and o.startswith('ax.'): return eval(o) return o @@ -347,7 +365,10 @@ def setup(sec): data_name = ut.arg_s('data_name', 'copen') fn = ut.arg_s('yaml', 'dat.yaml') - yd = setup_ydic( ut.yaml_load(fn, {}), sec ) + yd = ut.yaml_load(fn, {}) + yd = ut.defs_eval(yd) + yd = tm_sft_copy(yd) + yd = setup_ydic(yd, sec) ydic.clear() ydic.update(yd) data = ydic.get(data_name, []) diff -urN rt_v45/spin_coin.yaml rt_v46/spin_coin.yaml --- rt_v45/spin_coin.yaml 1970-01-01 09:00:00.000000000 +0900 +++ rt_v46/spin_coin.yaml 2018-06-05 22:38:30.000000000 +0900 @@ -0,0 +1,35 @@ +defs: + rtd_A: { base: 0.1, diff: 0, reflect: 0.5, reflact: 0.5, density: 2 } + mov4: IMG_3999_4.mov + +spin_coin: +- kind: pipe + rtd: '*rtd_A' + m2g: + - 'ax.zoom_z(0.1)' + - 'ax.rot( line.new(mt.zero, v.one), way.get([(0,1),(720,1)], sec, True))' + - 'ax.slide( way.liss([-20,-20,-20],[20,20,20],[3,4,5])(sec) )' + tsc: [ 10, -0.3 ] + +big_ball: +- kind: ball + rtd: { diff: 0.3 } + maps: + - fn: '*mov4' + fn_r: '*mov4' + t2m: [ ax.zoom_all(2), ax.rot_x(90) ] + - fn: '*mov4' + fn_r: '*mov4' + t2m: [ ax.zoom_all(2), ax.rot_x(90), ax.rot_z(180) ] + m2g: [ ax.zoom_all(1000) ] + +all: +- kind: export + export: spin_coin +- kind: export + export: big_ball +- kind: ball + rtd: '*rtd_A' + m2g: [ 'ax.zoom([20,20,1])' ] + +# EOF diff -urN rt_v45/ut.py rt_v46/ut.py --- rt_v45/ut.py 2018-05-24 20:19:08.000000000 +0900 +++ rt_v46/ut.py 2018-06-05 22:43:02.000000000 +0900 @@ -273,4 +273,43 @@ def yaml_save(fname, v, default_flow_style=False): file_write( fname, yaml_dump(v) ) +def defs_eval(d): + # sample yaml + # + # defs: + # foo: 123 + # bar: 456 + # data: + # k1: "*foo" + # k2: "* foo + bar - 1" + + defs_stk = [] + + def defs_x(s): + for d in defs_stk: + if s in d: + v = d.get(s) + return "'{}'".format(v) if type(v) == str else str(v) + return s + + def f(o): + t = type(o) + if t == list: + return map_lst(f, o) + if t == dict: + defs = {} + ks = list( o.keys() ) + if 'defs' in ks: + defs = o.get('defs') + ks.remove('defs') + defs_stk.insert(0, defs) + d = dict( map_lst( lambda k: ( k, f( o.get(k) ) ), ks ) ) + if defs: + defs_stk.pop(0) + return d + if t == str and o.startswith('*'): + return eval( ' '.join( map( defs_x, o[1:].split(' ') ) ) ) + return o + + return f(d) # EOF