ladon
15.10.2008, 20:42
Есть задача, надо взять кусок таймлайна и запихать его в символ.
для этого написана следующая jsfl конструкция
function Select( y, x, dy, dx )
{
var tl = fl.getDocumentDOM().getTimeline();
var a = new Array();
for (var i = y; i< y + dy; i++) {
a.push(i);
a.push(x)
a.push(x+dx);
}
tl.setSelectedFrames(a);
}
function ToMovieClip(name, y, x, dy, dx, prefix) {
var tl = fl.getDocumentDOM().getTimeline();
Select(y, x, dy, dx);
tl.copyFrames();
var lib = fl.getDocumentDOM().library;
if (lib.itemExists(prefix+name)) {
lib.deleteItem(prefix+name);
}
lib.addNewItem("movie clip",prefix+name);
lib.editItem(prefix+name);
fl.getDocumentDOM().getTimeline().selectAllFrames();
fl.getDocumentDOM().getTimeline().pasteFrames();
fl.getDocumentDOM().exitEditMode();
}
Все это богатство вызывается из функции Start() в данном jsfl файле.
Проблема заключается в том что при запуске lsfl файла все проходит нормально, а если Start вызвать из другого скрипта то функция
fl.getDocumentDOM().getTimeline().pasteFrames();
выдает Unknown error и соотвественно не вставляет кадры в символ.
То что такую ошибку дает именно pasteFrames выяснено путем покомандных alert().
Как можно с этим бороться ктонибудь знает?
Дополнительные изыскания показали что jsfl скрит работает нормально только если его вызвать через меню Commands->run command при уже открытом файле.
Если файл запустить просто из проводника при открытом файле - ситуация повторяется полностью, т.е. pasteFrames() выдает unknown error.
Как оказалось работа pasteFrames имеет замечательные особенности.
pasteFrames может вставить только непрерывный кусок кадров.
И еще более замечательные особенности нашлись у метода
fl.getDocumentDOM().getTimeline().setSelectedFrames(array);
по неизвестной мне причине применение этого метода дает разные результаты при срабатывании на только что открытом файле и на уже давно открытом. А именно на только что открытом файле этот метод не выделяет слои в которых только пустые кадры.
fl.openDocument("file:///testFile.fla");
Select(0,17,81,23);
fl.trace(fl.getDocumentDOM().getTimeline().getSelectedFrames()+"\n");
получается примерно следующее
на только что отрытом в скрипте файле
y 0 x 17 dy81 dx 23
6,17,40,7,17,40,8,17,40,9,17,40,11,17,40
на открытом во флеше файле и запущеном через Run Command скрипте
y 0 x 17 dy81 dx 23
0,17,40,1,17,40,2,17,40,3,17,40,4,17,40,5,17,40,6,17,40,7,17,40,8,17,40,9,17,40,10,17,40,11,17,40,12,17,40,13,17,40,14,17,40,15,17,40,16,17,40,17,17,4 0,18,17,40,19,17,40,20,17,40,21,17,40,22,17,40,23,17,40,24,17,40,25,17,40,26,17,40,27,17,40,28,17,40,29,17,40,30,17,40,31,17,40,32,17,40,33,17,40,34,1 7,40,35,17,40,36,17,40,37,17,40,38,17,40,39,17,40,40,17,40,41,17,40,42,17,40,43,17,40,44,17,40,45,17,40,46,17,40,47,17,40,48,17,40,49,17,40,50,17,40,5 1,17,40,52,17,40,53,17,40,54,17,40,55,17,40,56,17,40,57,17,40,58,17,40,59,17,40,60,17,40,61,17,40,62,17,40,63,17,40,64,17,40,65,17,40,66,17,40,67,17,4 0,68,17,40,69,17,40,70,17,40,71,17,40,72,17,40,73,17,40,74,17,40,75,17,40,76,17,40,77,17,40,78,17,40,79,17,40,80,17,40
:eek::wacko:
так же было установлено
после открытия файла fl.openDocument команда fl.getDocumentDOM().getTimeline().setSelectedFrames не может выбирать пустые ключевые кадры.
команда fl.getDocumentDOM().getTimeline().selectAllFrames(); замечательно выбирает все кадры, fl.getDocumentDOM().getTimeline().setSelectedLayers(1,true); так же нормально выбирает пустые кадры.
в качестве решения рассмотрен алгоритм - копируем весь таймлайн и отрезаем лишнее спереди и сзади нужного куска. неподходит, нельзя удалить то что неполучается выделить :)
единственный вариант покадровое перенесение. :bye:
для этого написана следующая jsfl конструкция
function Select( y, x, dy, dx )
{
var tl = fl.getDocumentDOM().getTimeline();
var a = new Array();
for (var i = y; i< y + dy; i++) {
a.push(i);
a.push(x)
a.push(x+dx);
}
tl.setSelectedFrames(a);
}
function ToMovieClip(name, y, x, dy, dx, prefix) {
var tl = fl.getDocumentDOM().getTimeline();
Select(y, x, dy, dx);
tl.copyFrames();
var lib = fl.getDocumentDOM().library;
if (lib.itemExists(prefix+name)) {
lib.deleteItem(prefix+name);
}
lib.addNewItem("movie clip",prefix+name);
lib.editItem(prefix+name);
fl.getDocumentDOM().getTimeline().selectAllFrames();
fl.getDocumentDOM().getTimeline().pasteFrames();
fl.getDocumentDOM().exitEditMode();
}
Все это богатство вызывается из функции Start() в данном jsfl файле.
Проблема заключается в том что при запуске lsfl файла все проходит нормально, а если Start вызвать из другого скрипта то функция
fl.getDocumentDOM().getTimeline().pasteFrames();
выдает Unknown error и соотвественно не вставляет кадры в символ.
То что такую ошибку дает именно pasteFrames выяснено путем покомандных alert().
Как можно с этим бороться ктонибудь знает?
Дополнительные изыскания показали что jsfl скрит работает нормально только если его вызвать через меню Commands->run command при уже открытом файле.
Если файл запустить просто из проводника при открытом файле - ситуация повторяется полностью, т.е. pasteFrames() выдает unknown error.
Как оказалось работа pasteFrames имеет замечательные особенности.
pasteFrames может вставить только непрерывный кусок кадров.
И еще более замечательные особенности нашлись у метода
fl.getDocumentDOM().getTimeline().setSelectedFrames(array);
по неизвестной мне причине применение этого метода дает разные результаты при срабатывании на только что открытом файле и на уже давно открытом. А именно на только что открытом файле этот метод не выделяет слои в которых только пустые кадры.
fl.openDocument("file:///testFile.fla");
Select(0,17,81,23);
fl.trace(fl.getDocumentDOM().getTimeline().getSelectedFrames()+"\n");
получается примерно следующее
на только что отрытом в скрипте файле
y 0 x 17 dy81 dx 23
6,17,40,7,17,40,8,17,40,9,17,40,11,17,40
на открытом во флеше файле и запущеном через Run Command скрипте
y 0 x 17 dy81 dx 23
0,17,40,1,17,40,2,17,40,3,17,40,4,17,40,5,17,40,6,17,40,7,17,40,8,17,40,9,17,40,10,17,40,11,17,40,12,17,40,13,17,40,14,17,40,15,17,40,16,17,40,17,17,4 0,18,17,40,19,17,40,20,17,40,21,17,40,22,17,40,23,17,40,24,17,40,25,17,40,26,17,40,27,17,40,28,17,40,29,17,40,30,17,40,31,17,40,32,17,40,33,17,40,34,1 7,40,35,17,40,36,17,40,37,17,40,38,17,40,39,17,40,40,17,40,41,17,40,42,17,40,43,17,40,44,17,40,45,17,40,46,17,40,47,17,40,48,17,40,49,17,40,50,17,40,5 1,17,40,52,17,40,53,17,40,54,17,40,55,17,40,56,17,40,57,17,40,58,17,40,59,17,40,60,17,40,61,17,40,62,17,40,63,17,40,64,17,40,65,17,40,66,17,40,67,17,4 0,68,17,40,69,17,40,70,17,40,71,17,40,72,17,40,73,17,40,74,17,40,75,17,40,76,17,40,77,17,40,78,17,40,79,17,40,80,17,40
:eek::wacko:
так же было установлено
после открытия файла fl.openDocument команда fl.getDocumentDOM().getTimeline().setSelectedFrames не может выбирать пустые ключевые кадры.
команда fl.getDocumentDOM().getTimeline().selectAllFrames(); замечательно выбирает все кадры, fl.getDocumentDOM().getTimeline().setSelectedLayers(1,true); так же нормально выбирает пустые кадры.
в качестве решения рассмотрен алгоритм - копируем весь таймлайн и отрезаем лишнее спереди и сзади нужного куска. неподходит, нельзя удалить то что неполучается выделить :)
единственный вариант покадровое перенесение. :bye: