SequenceMgr.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703
  1. /*
  2. SEQUENCE GROUPING MANAGEMENT MODULE
  3. this module builds a representation of a sequence in values using containers
  4. It allows to create groups of keys, a group being a cue and one key per layer.
  5. In a group, all keys sync their time on cue's time, only value can be modified
  6. The sequence with grouping can then be exported and reloaded.
  7. The module checks periodicaly if timeline sequence structure (cues, layers and keys) and
  8. module values structure are in sync. If out of sync, you may either rebuild values structure
  9. from sequence or rebuild sequence from values
  10. */
  11. var syncRatems = 100;
  12. var syncDelta = 0.;
  13. var doSync = false ;
  14. var inibValuesChanged = false ;
  15. var debug = true;
  16. var debugFile;
  17. var parametersPath = local.parameters ;
  18. var sequence = '' ;
  19. var sequencePath = local.getChild("parameters").sequence ;
  20. var file ;
  21. var filePath = local.parameters.sequenceFile ;
  22. var newGroupLayers = local.values.newGroup.layers ;
  23. // var groups = local.getChild("values").groups ;
  24. var cues = local.getChild("values").keys.cues ;
  25. // var cuesList = []; //holds cues containers reference
  26. var layers = local.getChild("values").keys.layers ;
  27. // var layerList = {}; //holds layer container as object with reference and an array of keys containers references
  28. var rebuildValues = script.addTrigger("rebuild values", "adds a key at current cursor position" );
  29. var refreshKeys = script.addTrigger("refresh keys", "truc");
  30. var printKeys = script.addTrigger("printKeys","truc");
  31. var clearSeq = script.addTrigger("clear Sequence","truc");
  32. var sequence_structure = { params: {},
  33. groups:{},
  34. keys:{
  35. cues:{},
  36. layers:{}
  37. }
  38. };
  39. //WAS tl_groups
  40. /*group0 : { inCue : {pan : "key", tilt : "key", zoom : "key", dim : "key", focus : "key"},
  41. outCue : {pan : "key", tilt : "key", zoom : "key", dim : "key", focus : "key"}
  42. }*/
  43. ///////////////////// SCRIPT FUNCTIONS //////////////////////////////
  44. function init() {
  45. script.log("LOADED SEQUENCE GROUPING MANAGEMENT MODULE ");
  46. //adapt update rate
  47. updateSyncRate();
  48. updateSynchronize();
  49. // layers = local.getChild("values").keys.layers ;
  50. // printMethodsAndProperties(layers);
  51. //test if a sequence is already choosen else refresh and unlock sequence enum
  52. sequence = local.getChild("parameters").sequence.getKey();
  53. // var sequenceIndex = local.getChild("parameters").sequence.get();
  54. // script.log(sequenceIndex + " " + sequence);
  55. if(sequence == ""){refreshSequenceEnum();}
  56. else{
  57. sequencePath.removeOptions();
  58. sequencePath.addOption(sequence,0);
  59. sequencePath.setAttribute("readonly", true);}
  60. }
  61. function scriptParameterChanged(param){
  62. if (param.is(printKeys) ){printKeys();}
  63. else if(param.is(rebuildValues)){struct_buildValuesFromSeq();}
  64. else if (param.is(refreshKeys)){
  65. script.log("refreshKeys");
  66. refreshKeysList();
  67. }
  68. else {script.log("scriptparamchanged" + param.name);}
  69. }
  70. function update(deltaTime){
  71. if(sequence!=""){
  72. if(doSync){
  73. syncDelta += deltaTime ;
  74. // script.log(syncDelta);
  75. if (syncDelta >= syncRatems){
  76. syncDelta = 0. ;
  77. struct_buildValuesFromSeq();
  78. }
  79. }
  80. }
  81. }
  82. /////////////////////////// HELPERS /////////////////////////////////
  83. function printMethodsAndProperties(obj){
  84. script.log(" ");
  85. var name = obj.getControlAddress() == undefined ? "object" : obj.getControlAddress();
  86. // var name = "object";
  87. script.log(" METHODS OF " + name);
  88. var methods = util.getObjectMethods(obj);
  89. for(var i=0 ; i<methods.length ; i++){
  90. script.log(" "+ methods[i]);
  91. }
  92. script.log(" PARAMETERS OF " + name);
  93. var props = util.getObjectProperties(obj, true, false);
  94. for(var i=0 ; i<props.length ; i++){
  95. script.log(" "+ props[i]);
  96. }
  97. script.log(" OBJECTS OF " + name);
  98. var props = util.getObjectProperties(obj, false, true);
  99. for(var i=0 ; i<props.length ; i++){
  100. script.log(" "+ props[i]);
  101. }
  102. }
  103. function printKeys(){
  104. var seq = root.sequences.sequence.layers.mapping.automation.getItems() ;
  105. if(seq.length){
  106. for(var i=0; i<seq.length; i++){
  107. script.log (">> "+seq[i].name + " " + seq[i].position.get() + " " + seq[i].listSize.get() );
  108. }
  109. }
  110. else{script.log("nothing to print");}
  111. }
  112. /////////////////////// PARAMETERS FUNCTIONS ///////////////////////
  113. // Module callback
  114. function moduleParameterChanged(param){
  115. if (param.is(parametersPath.importExport.sequenceFile)) {}
  116. else if (param.is(parametersPath.importExport.loadSequence)){importSequenceFile();}
  117. else if (param.is(parametersPath.importExport.exportSequence)) { exportSequenceFile();}
  118. else if (param.is(parametersPath.synchronize)){updateSynchronize();}
  119. else if (param.is(parametersPath.syncRate)){updateSyncRate();}
  120. else if (param.is(parametersPath.clearSequence)){seq_clearSequence();}
  121. else if (param.is(parametersPath.changeSequence)){refreshSequenceEnum();}
  122. else if (param.is(parametersPath.sequence)){
  123. sequence = sequencePath.getKey();
  124. if(sequence!="choose sequence"){
  125. script.log("watching "+ sequence);
  126. local.parameters.sequence.setAttribute("readonly",true);
  127. }
  128. }
  129. else{script.log("received module param :" + param.name);}
  130. }
  131. function updateSynchronize(){
  132. doSync = parametersPath.synchronize.get();
  133. script.log(doSync ? "sync ON" : "sync OFF" );
  134. }
  135. function updateSyncRate(){
  136. syncRatems = parametersPath.syncRate.get() / 1000.;
  137. script.log("new sync rate : " + syncRatems);
  138. // script.setUpdateRate(syncRatems);
  139. }
  140. //refresh Enum
  141. function refreshSequenceEnum(){
  142. script.log("refresh list of sequences");
  143. local.parameters.sequence.setAttribute("readonly",false);
  144. if(root.sequences.getItems().length){
  145. local.parameters.sequence.removeOptions();
  146. local.parameters.sequence.addOption("", 0);
  147. for(var i=0 ; i<root.sequences.getItems().length ; i++ ){
  148. local.parameters.sequence.addOption(root.sequences.getItems()[i].name,i+1);
  149. }
  150. }
  151. }
  152. // function testSequenceFile(){
  153. // var file = local.parameters.sequenceFile;
  154. // //test if a file is declared
  155. // if( file.getAbsolutePath() != ""){
  156. // script.log("testing file " + file.getAbsolutePath() );
  157. // var data = file.readFile(true);
  158. // // test if expected fields are absent
  159. // if (data.groups == undefined){
  160. // script.log("file structure not recognized");
  161. // refreshSequenceEnum();
  162. // }
  163. // //if all is well, let's load in sequence_structure
  164. // else {
  165. // script.log("ready to import");
  166. // return 1;
  167. // // loadSequenceFile();
  168. // }
  169. // }
  170. // else {
  171. // script.log("no file to load");
  172. // refreshSequenceEnum();
  173. // return 0;
  174. // }
  175. // }
  176. function importSequenceFile(){
  177. script.log("loading file");
  178. sequence_structure = local.parameters.sequenceFile.readFile(true);
  179. //lock enum with curent sequence name
  180. var sequenceList = local.parameters.sequence;
  181. sequenceList.removeOptions();
  182. sequenceList.addOption(sequence_structure.params.sequence, 0);
  183. local.parameters.sequence.setAttribute("readonly",true);
  184. }
  185. function exportSequenceFile(){
  186. script.log("exporting file");
  187. var exportData = {parameters:{}, values:{groups:{}, keys:{cues:{}, layers:{}}}};
  188. //collect parameters
  189. var parameters = local.getChild("parameters");
  190. var parametersList = util.getObjectProperties(parametersPath, true, false);
  191. exportData.parameters["Sequence"] = parameters.sequence.getKey();
  192. exportData.parameters["Synchronise"] = parameters.synchronize.get();
  193. exportData.parameters["Sync Rate"] = parameters.syncRate.get();
  194. //collect values
  195. var values = local.getChild("values");
  196. var groups = values.groups;
  197. var groupsList=util.getObjectProperties(groups, true, false);
  198. if(groupsList.length){
  199. for(var i=0; i<groupsList.length; i++){
  200. var exportGroup = exportData.values.groups[groupsList[i]] = {};
  201. var currentGroup = groups.getChild(groupsList[i]);
  202. var currentGroupLayers = util.getObjectProperties(currentGroup.keys, true, false);
  203. if (currentGroupLayers.length){
  204. for(var j=0; j<currentGroupLayers.length; j++){
  205. // script.log(groupsList[i]+ " "+ currentGroupLayers[j]);
  206. exportGroup[currentGroupLayers[j]] = {key:"", value:0.};
  207. exportGroup[currentGroupLayers[j]].value = currentGroup.getChild(currentGroupLayers[j]).get();
  208. exportGroup[currentGroupLayers[j]].key = currentGroup.keys.getChild(currentGroupLayers[j]).get();
  209. }
  210. }
  211. }
  212. }
  213. var cues = values.keys.cues;
  214. var cuesList=util.getObjectProperties(cues, true, false);
  215. if(cuesList.length){
  216. for(var i=0; i<cuesList.length; i++){
  217. var exportCue = exportData.values.keys.cues[cuesList[i]] = {cue:"", time:0.};
  218. exportCue.cue = cuesList[i];
  219. exportCue.time = cues.getChild(cuesList[i]).time.get();
  220. }
  221. }
  222. var layers = values.keys.layers;
  223. var layersList=util.getObjectProperties(layers, true, false);
  224. if(layersList.length){
  225. for(var i=0; i<layersList.length; i++){
  226. var exportLayer = exportData.values.keys.layers[layersList[i]] = {};
  227. var currentLayer = layers.getChild(layersList[i]);
  228. var currentLayersKeys = util.getObjectProperties(currentLayer, true, false);
  229. if (currentLayersKeys.length){
  230. for(var j=0; j<currentLayersKeys.length; j++){
  231. // script.log(groupsList[i]+ " "+ currentGroupLayers[j]);
  232. exportLayer[currentLayersKeys[j]] = {key:"", value:0., time:0.};
  233. exportLayer[currentLayersKeys[j]].value = currentLayer.getChild(currentLayersKeys[j]).value.get();
  234. exportLayer[currentLayersKeys[j]].key = currentLayer.getChild(currentLayersKeys[j]).name;
  235. exportLayer[currentLayersKeys[j]].key = currentLayer.getChild(currentLayersKeys[j]).time.get();
  236. }
  237. }
  238. }
  239. }
  240. // exportData.groups
  241. parameters.importExport.sequenceFile.writeFile(JSON.stringify(exportData), true);
  242. }
  243. /////////////////////// VALUES FUNCTIONS ///////////////////////
  244. /* Values hold all keys, presented in group containers
  245. a nogroup container shows keys that are not grouped
  246. */
  247. // Value callback
  248. function moduleValueChanged(value){
  249. if(!inibValuesChanged){
  250. doSync = false;
  251. script.log(value.getParent().name);
  252. doSync = true;
  253. }
  254. if (value.is(local.values.newGroup.create)){createNewGroup();}
  255. // script.log(value.getParent().name);
  256. // if(value.getParent().name = "cue"){script.log("changed");}
  257. if (value.name == "addGroup"){createNewGroup();}
  258. }
  259. //rebuild values.keys structure from sequence
  260. function struct_buildValuesFromSeq(){
  261. inibValuesChanged = true;
  262. var tl_seq = root.sequences.getItemWithName(sequence);
  263. //build cues if needed
  264. var tl_cues = tl_seq.cues.getItems();
  265. cues = local.getChild("values").keys.cues ;
  266. var cuesList = util.getObjectProperties(cues, true, false);
  267. // script.log("cueList : " +cuesList.length);
  268. // script.log("tl List : " +tl_cues.length);
  269. if (cuesList.length != tl_cues.length){
  270. var delta = cuesList.length-tl_cues.length;
  271. var addRemove = delta > 0 ? false : true ; //0 to remove, 1 to add
  272. delta = Math.abs(delta);
  273. script.log("cues "+ delta + (addRemove ? " up" : " down"));
  274. for(var i=0; i<delta; i++){
  275. // script.log(i);
  276. if(addRemove){
  277. var newCue = cues.addContainer("newCue"+i);
  278. newCue.addFloatParameter("time", "position in time", 0., 0.);
  279. newCue.setCollapsed(true);
  280. }
  281. else {
  282. script.log(util.getObjectProperties(cues, true, false)[0]);
  283. cues.removeContainer(util.getObjectProperties(cues, true, false)[0]);
  284. }
  285. // cuesList = ;
  286. }
  287. }
  288. //update cues
  289. cues = local.getChild("values").keys.cues ;
  290. var cuesList = util.getObjectProperties(cues, true, false);
  291. if(tl_cues.length){
  292. for (var i=0; i<tl_cues.length; i++){
  293. var currentCue = cues.getChild(cuesList[i]);
  294. currentCue.setName(tl_cues[i].name);
  295. currentCue.time.set(tl_cues[i].time.get());
  296. }
  297. }
  298. //build layers if needed
  299. var layersChanged = false ;
  300. var tl_layers = tl_seq.layers.getItems();
  301. layers = local.getChild("values").keys.layers ;
  302. var layersList = util.getObjectProperties(layers, true, false);
  303. if (layersList.length != tl_layers.length){
  304. layersChanged = true ;
  305. var delta = layersList.length-tl_layers.length;
  306. var addRemove = delta > 0 ? false : true ; //0 to remove, 1 to add
  307. delta = Math.abs(delta);
  308. script.log("layers "+ delta + (addRemove ? " up" : " down"));
  309. for(var i=0; i<delta; i++){
  310. // script.log(i);
  311. if(addRemove){
  312. var newLayer = layers.addContainer("newLayer"+i);
  313. // newLayer.addFloatParameter("time", "position in time", 0., 0.);
  314. newLayer.setCollapsed(true);
  315. local.getChild("values").newGroup.layers.addFloatParameter("newLayer"+i, "value for this layer at group creation", 0., 0., 1.);
  316. }
  317. else {
  318. script.log(util.getObjectProperties(layers, true, false)[0]);
  319. layers.removeContainer(util.getObjectProperties(layers, true, false)[0]);
  320. local.getChild("values").newGroup.layers.removeContainer(util.getObjectProperties(layers, true, false)[0]);
  321. }
  322. // cuesList = ;
  323. }
  324. }
  325. //update layers value if there was a change in structure
  326. if(layersChanged){
  327. layers = local.getChild("values").keys.layers ;
  328. var layerList = util.getObjectProperties(layers, true, false);
  329. var template = local.getChild("values").newGroup.layers;
  330. var layerTemplate = util.getObjectProperties(template, true, false);
  331. if(tl_layers.length){
  332. for (var i=0; i<tl_layers.length; i++){
  333. var currentLayer = layers.getChild(layerList[i]);
  334. currentLayer.setName(tl_layers[i].name);
  335. var currentTemplate = template.getChild(layerTemplate[i]) ;
  336. currentTemplate.setName(tl_layers[i].name);
  337. }
  338. }
  339. }
  340. //build keys if needed
  341. layers = local.getChild("values").keys.layers ;
  342. layersList = util.getObjectProperties(layers, true, false);
  343. if(layersList.length){
  344. for(var layerIndex=0; layerIndex<layersList.length; layerIndex++){
  345. var currentLayer = layers.getChild(layersList[layerIndex]);
  346. var keyList = util.getObjectProperties(currentLayer, true, false);
  347. var tl_lay = tl_seq.layers.getItemWithName(layersList[layerIndex]);
  348. var tl_keys;
  349. if(tl_lay.automation!=undefined){tl_keys = tl_lay.automation.getItems();}
  350. //rebuild key structure for currentLayer
  351. if (keyList.length != tl_keys.length){
  352. var delta = keyList.length-tl_keys.length;
  353. var addRemove = delta > 0 ? false : true ; //0 to remove, 1 to add
  354. delta = Math.abs(delta);
  355. script.log("keys "+ delta + (addRemove ? " up" : " down"));
  356. for(var i=0; i<delta; i++){
  357. // script.log(i);
  358. if(addRemove){
  359. var newKey = currentLayer.addContainer("newkey"+i);
  360. newKey.addFloatParameter("time", "position in time", 0., 0.);
  361. newKey.addFloatParameter("value", "vertical value", 0., 0.);
  362. newKey.setCollapsed(true);
  363. }
  364. else {
  365. script.log(util.getObjectProperties(currentLayer, true, false)[0]);
  366. currentLayer.removeContainer(util.getObjectProperties(currentLayer, true, false)[0]);
  367. }
  368. }
  369. }
  370. currentLayer = layers.getChild(layersList[layerIndex]);
  371. keyList = util.getObjectProperties(currentLayer, true, false);
  372. //update values for currentLayer
  373. if(tl_keys.length){
  374. for(var i=0; i<tl_keys.length; i++){
  375. var currentKey = currentLayer.getChild(keyList[i]);
  376. currentKey.setName(tl_keys[i].name);
  377. currentKey.time.set(tl_keys[i].position.get());
  378. currentKey.value.set(tl_keys[i].value.get());
  379. }
  380. }
  381. }
  382. }
  383. //Groups
  384. tl_seq = root.sequences.getItemWithName(sequence);
  385. var groups = local.getChild("values").groups ;
  386. var groupList = util.getObjectProperties(groups, true, false);
  387. // printMethodsAndProperties(tl_seq.cues.getItemWithName("group0"));
  388. if(groupList.length){
  389. for (var i = 0; i<groupList.length; i++){
  390. //check if cue exist, else remove group
  391. // script.log(groupList[i]);
  392. var groupCue = tl_seq.cues.getItemWithName(groupList[i]);
  393. if(groupCue.name==undefined){
  394. script.log("cue " + groupList[i] + "not found, removing group (keys survive this)");
  395. groups.removeContainer(groupList[i]);
  396. break;
  397. }
  398. //else check at key level
  399. else {
  400. groups = local.getChild("values").groups ;
  401. groupList = util.getObjectProperties(groups, true, false);
  402. var currentGroup = groups.getChild(groupList[i]);
  403. var currentGroupLayers = util.getObjectProperties (currentGroup.keys, true, false);
  404. //update cue time
  405. var groupTime = groupCue.time.get();
  406. currentGroup.cue.set(groupTime);
  407. if (currentGroupLayers.length){
  408. // script.log(currentGroupLayers.length);
  409. for(var j=0; j<currentGroupLayers.length; j++){
  410. // script.log("in loop" + j);
  411. groups = local.getChild("values").groups ;
  412. groupList = util.getObjectProperties(groups, true, false);
  413. currentGroup = groups.getChild(groupList[i]);
  414. currentGroupLayers = util.getObjectProperties (currentGroup.keys, true, false);
  415. var tl_layer = tl_seq.layers.getItemWithName(currentGroupLayers[j]);
  416. var keyName = currentGroup.keys.getChild(tl_layer.name).get();
  417. // script.log(tl_layer.name + " " +tl_layer.automation.getItemWithName(keyName).name);
  418. //if key dosn't exist anymore, remove it from group
  419. if(tl_layer.automation.getItemWithName(keyName).name == undefined){
  420. groups = local.getChild("values").groups ;
  421. groupList = util.getObjectProperties(groups, true, false);
  422. currentGroup = groups.getChild(groupList[i]);
  423. currentGroupLayers = util.getObjectProperties (currentGroup.keys, true, false);
  424. tl_layer = tl_seq.layers.getItemWithName(currentGroupLayers[j]);
  425. keyName = currentGroup.keys.getChild(tl_layer.name).get();
  426. script.log("should remove" + currentGroup.name + " " + currentGroupLayers[j]);
  427. currentGroup.keys.removeParameter(currentGroupLayers[j]);
  428. currentGroup.removeParameter(currentGroupLayers[j]);
  429. currentGroup.setCollapsed(true);
  430. currentGroup.setCollapsed(false);
  431. }
  432. //if key exists, update value from tl and update time from group cue
  433. else{
  434. //apply groupTime
  435. var tl_key = tl_layer.automation.getItemWithName(keyName);
  436. tl_key.position.set(groupTime);
  437. //get tl value
  438. var keyValue = tl_key.value.get();
  439. var currentKey = currentGroup.getChild(tl_layer.name);
  440. // script.log(tl_layer.name + " " +keyName+" " + keyValue);
  441. // script.log(currentKey.name + " " +keyName+" " + keyValue);
  442. currentKey.set(keyValue);
  443. // script.log(currentKey.get());
  444. }
  445. }
  446. }
  447. //if cue doesn't exist, remove whole group
  448. if(tl_layers.length){
  449. for (var j=0; j<tl_layers.length; j++){
  450. if(!tl_layers[j].automation.getItemWithName(groupList[i])){
  451. script.log("key " + groupList[i] + "not found, removing group (keys survive this)");
  452. groups.removeContainer(groupList[i]);}
  453. }
  454. }
  455. //update group values
  456. }
  457. }
  458. }
  459. inibValuesChanged = false;
  460. }
  461. function struct_exportToFile(){}
  462. // function rebuildValuesStructure() {
  463. // script.log("updating values structure");
  464. // //empty current structure
  465. // // local.values.removeAll();
  466. // local.getChild("Values").removeContainer("newGroup");
  467. // local.getChild("Values").removeContainer("groups");
  468. // local.getChild("Values").removeContainer("ungrouped");
  469. // //rebuild containers
  470. // var ng_cont = local.values.addContainer("New group");
  471. // var g_cont = local.values.addContainer("groups");
  472. // var ug_cont = local.values.addContainer("ungrouped");
  473. // // rebuild new group
  474. // ng_cont.addTrigger("add group", "adds a new group at cursor time with below values");
  475. // ng_cont.addFloatParameter("group time", "time position where the group will be created ", 0., 0.);
  476. // var layer_cont = ng_cont.addContainer("layers values");
  477. // var layers = util.getObjectProperties(sequence_structure.keys.layers) ;
  478. // for (var i=0; i<layers.length; i++){
  479. // //add a float value in each layer for group creation
  480. // layer_cont.addFloatParameter(layers[i], "", 0., 0., 1.);
  481. // ug_cont.addContainer(layers[i]);
  482. // }
  483. // //rebuild keys grouped/ungrouped
  484. // //first create group containers in groups
  485. // // //then create layer containers in ungrouped
  486. // // var layer_cont = ug_cont.addContainer("layers values");
  487. // }
  488. /////////////////////// TIMELINE FUNCTIONS ///////////////////////
  489. function seq_clearSequence(){
  490. var seq = root.sequences.getItemWithName(sequence) ;
  491. script.log("clearing all keys and cues of sequence : "+seq.name);
  492. seq.cues.removeAll();
  493. var layers = seq.layers.getItems();
  494. if(layers.length){
  495. for (var i = 0; i<layers.length; i++){
  496. if(layers[i].automation){layers[i].automation.removeAll();}
  497. }
  498. }
  499. //clear all groups
  500. var groups = local.getChild("values").groups;
  501. var groupsList = util.getObjectProperties(groups, true, false);
  502. if (groupsList.length){
  503. for(var i=0; i<groupsList.length; i++){
  504. groups.removeContainer(groupsList[i]);
  505. }
  506. }
  507. }
  508. //use Values structure to rebuild the sequence
  509. function seq_buildSeqFromValues(){}
  510. //use file to rebuild sequence
  511. function seq_buildSeqFromFile(){}
  512. function createNewGroup(){
  513. script.log("create new group");
  514. //create a cue and a key in each layer at cursor position in selected sequence
  515. var groups = local.getChild("values").groups;
  516. var groupsList = util.getObjectProperties(groups, true, false);
  517. // var index = groupsList.length == undefined ? 0 : groupsList.length;
  518. var currentGroup;
  519. var tl_seq = root.sequences.getItemWithName(sequence);
  520. var tl_layers = tl_seq.layers.getItems();
  521. script.log(groupList.length);
  522. //Get current sequence time position and create cue at this position, with group name
  523. var currentTime = tl_seq.currentTime.get() ;
  524. // var currentTime = local.values.newGroup.groupTime.get();
  525. script.log(currentTime);
  526. newCue = tl_seq.cues.addItem();
  527. newCue.time.set(currentTime);
  528. //test for holes in the sequence to rename the cue
  529. for (var i=0; i<=groupsList.length+1; i++){
  530. if(tl_seq.cues.getChild("group"+i)==undefined){
  531. newCue.setName("group"+i);
  532. currentGroup = groups.addContainer("group"+i);
  533. script.log("create new group: group"+i);
  534. break;
  535. }
  536. }
  537. currentGroup.addFloatParameter(newCue.name, "cue of the group", currentTime, 0.);
  538. var keysContainer = currentGroup.addContainer("keys");
  539. keysContainer.setCollapsed(true);
  540. // var struc_layers = util.getObjectProperties(sequence_structure.keys.layers);
  541. if(tl_layers.length){
  542. for(var i=0;i<tl_layers.length; i++ ){
  543. if(tl_layers[i].automation!=undefined){//only for mapping layers
  544. // script.log(sequence_structure.keys.layers[layers[i].name]);
  545. var newKey = tl_layers[i].automation.addItem();
  546. newKey.position.set(currentTime);
  547. script.log([layers[i].name]); //local.getChild("values").newGroup.layers.getChild().name
  548. newKey.value.set(local.getChild("values").newGroup.layers.getChild(tl_layers[i].name).get());
  549. // newKey.value.set(Math.random());
  550. keysContainer.addStringParameter(tl_layers[i].name, "",newKey.name );
  551. currentGroup.addFloatParameter(tl_layers[i].name,tl_layers[i].name+" value" , newKey.value.get(), 0., 1.);
  552. // newKey.addStringParameter("group", "key is part of this group","mongroupe");
  553. tl_layers[i].automation.reorderItems();
  554. }
  555. }
  556. }
  557. // seq = seq.getItems();
  558. }