Здравствуйте, уважаемые читатели.
Это небольшая заметка на тему фильтрации элементов shape во Flash IDE. Ручной работой занимается практически каждый флешер. В интернете на разных русско и англо язычных форумах периодически всплывают вопросы на тему фильтрации выбранных объектов во Flash IDE, но решений практически никто не даёт. Меня эти вопросы тоже волновали и ответ я нашёл в программировании в среде flash на языке jsfl.
Предлагаю несколько jsfl скриптов на для упрощения обработки выбранных элементов:
Упоминаемые «группы» — это flash группы объектов, получаемых методом выделения нескольких объектов и выполнением действия меню «Инструменты->Группировка».
Понятие «предварительная выборка» я заимствовал из AutoCAD, когда объекты можно было выделить перед командой, а не сначала команду, потом объекты.
******************************************************************************
selectionOnlyGroup.jsfl
******************************************************************************
selectionOnlyGroupsWithNoMembers.jsfl
******************************************************************************
selectionOnlyGroupsWithMembers.jsfl:
******************************************************************************
Вообще во Flash IDE трудно работать с выборкой, а точнее практически невозможно. Всё что позволяет делать Flash — это выбрать объекты разными способами (click, shift click, double click, рамочное выделение объектов), но когда вы закончили выбор, то как-то отфильтровать элементы из этого selection с помощью меню практически невозможно. Только ручной select/unselect.
Вот примеры использования скриптов:
1. Первичная выборка выполнена прямоугольным выделением мышкой. Видно, что кроме групп объектов в выборку попала часть линии:
![](http://habrastorage.org/r/w1560/storage2/12c/e59/ff5/12ce59ff58a2f481b0b5c6ef6e2a92af.png)
2. После применения скрипта selectionOnlyGroup.jsfl:
![](http://habrastorage.org/r/w1560/storage2/28a/6b3/11f/28a6b311f83229f7be50eb38461c6a17.png)
Видно, что из предварительной выборки исчезла частично выделенная линия.
3. Разделим элементы Модификация->разделить:
![](http://habrastorage.org/r/w1560/storage2/1b4/7ed/c31/1b47edc31e6cd3ae68a107119c375fc9.png)
Видно, что часть объектов «извлеклась», но часть объектов продолжает «упорствовать» и стойко держится в группе.
4. Применим скрипт selectionOnlyGroupsWithMembers.jsfl, чтобы убрать из выделения графические объекты и оставить только группы с подгруппами:
![](http://habrastorage.org/r/w1560/storage2/7c8/ce3/256/7c8ce3256a4ddbf0f8e48a0646fa6f08.png)
и опять «разделим» selection. Получаем результат:
![](http://habrastorage.org/r/w1560/storage2/284/5ef/062/2845ef0621b9df1496842da9cd654ec4.png)
Вроде, как все… Но полной уверенности нет. Проверим имеющуюся выборку скриптом selectionOnlyGroupsWithMembers.jsfl:
![](http://habrastorage.org/r/w1560/storage2/0b5/55c/96c/0b555c96ce5157ee2636c509f63c0de4.png)
Вроде как то, что задумали. Всё аккуратно «разбито».
Напоминаю, что цель была не разбить объекты, а поработать с фильтрацией. Объекты можно было не разбивать, а переносить, например. Думаю, что с применением фильтрации проблем быть не должно. Главное, чтобы было что фильтровать.
Спасибо за внимание.
P.S.
Вообще, тема jsfl незаслуженно обходится вниманием, потому что во flash практически нет ручного способа грамотного рефакторинга изображения. Достаточно высокоуровневые методы из меню не дают доступа к внутренней структуре объектов.
Это небольшая заметка на тему фильтрации элементов shape во Flash IDE. Ручной работой занимается практически каждый флешер. В интернете на разных русско и англо язычных форумах периодически всплывают вопросы на тему фильтрации выбранных объектов во Flash IDE, но решений практически никто не даёт. Меня эти вопросы тоже волновали и ответ я нашёл в программировании в среде flash на языке jsfl.
Предлагаю несколько jsfl скриптов на для упрощения обработки выбранных элементов:
Упоминаемые «группы» — это flash группы объектов, получаемых методом выделения нескольких объектов и выполнением действия меню «Инструменты->Группировка».
Понятие «предварительная выборка» я заимствовал из AutoCAD, когда объекты можно было выделить перед командой, а не сначала команду, потом объекты.
******************************************************************************
selectionOnlyGroup.jsfl
// Выборка только групп из предварительной выборки.
// После фильтрации в выборке останутся только группы.
// никаких raw shape там не будет.
fl.outputPanel.clear();
var sel = fl.getDocumentDOM().selection;
var arrSelectedOnlyGroups = new Array();
for(i=0;i<=sel.length-1;i++)
{
var str="";
if(sel[i].elementType=="shape")
{
str+="isGroup:"+sel[i].isGroup+", members.length="+sel[i].members.length;
arrSelectedOnlyGroups.push(sel[i]);
}
fl.trace("i:"+i+" - "+sel[i].elementType+", "+str);
}
fl.getDocumentDOM().selectNone();
fl.getDocumentDOM().selection = arrSelectedOnlyGroups;
fl.trace("Выбрано объектов: "+fl.getDocumentDOM().selection.length);
******************************************************************************
selectionOnlyGroupsWithNoMembers.jsfl
// Выбрать только группы, которые не имеют вложенных подгрупп.
// Этот скрипт удобен при обработке импортированных во флеш документов,
// когда многие простые shape оказываются вложены в группы много раз.
// На входе нужно иметь предварительно выбранные объекты (прямоугольником).
// На выходе получаем выборку, которая содержит только объекты, являющиеся группами
// и эти группы сами НЕ содержат в себе другие группы.
// группы, в которых содержатся подгруппы отфильтровываются и в выборку не попадают.
// Так же не попадают в выборку группы, которые содержат в себе подгуппы.
fl.outputPanel.clear();
var sel = fl.getDocumentDOM().selection;
var arrSelectedOnlyGroups = new Array();
for(i=0;i<=sel.length-1;i++)
{
var str="";
if(sel[i].elementType=="shape")
{
str+="isGroup:"+sel[i].isGroup+", members.length="+sel[i].members.length;
if(sel[i].members.length==0)
{
arrSelectedOnlyGroups.push(sel[i]);
}
}
fl.trace("i:"+i+" - "+sel[i].elementType+", "+str);
}
fl.getDocumentDOM().selectNone();
fl.getDocumentDOM().selection = arrSelectedOnlyGroups;
fl.trace("Выбрано объектов: "+fl.getDocumentDOM().selection.length);
******************************************************************************
selectionOnlyGroupsWithMembers.jsfl:
// Выбрать только группы, которые имеют вложенные группы.
// Этот скрипт удобен при обработке импортированных во флеш документов,
// когда многие простые shape оказываются вложены в группы много раз.
// Обычно такие группы надо разбивать.
// На входе нужно иметь предварительно выбранные объекты (прямоугольников).
// На выходе получаем только объекты, которые являются группами
// и эти группы сами содержат в себе другие группы.
// группы, в которых сразу же содержатся shape отфильтровываются и в выборку не попадают.
fl.outputPanel.clear();
var sel = fl.getDocumentDOM().selection;
var arrSelectedOnlyGroups = new Array();
for(i=0;i<=sel.length-1;i++)
{
var str="";
if(sel[i].elementType=="shape")
{
str+="isGroup:"+sel[i].isGroup+", members.length="+sel[i].members.length;
if(sel[i].members.length>0)
{
arrSelectedOnlyGroups.push(sel[i]);
}
}
fl.trace("i:"+i+" - "+sel[i].elementType+", "+str);
}
fl.getDocumentDOM().selectNone();
fl.getDocumentDOM().selection = arrSelectedOnlyGroups;
fl.trace("Выбрано объектов: "+fl.getDocumentDOM().selection.length);
******************************************************************************
Вообще во Flash IDE трудно работать с выборкой, а точнее практически невозможно. Всё что позволяет делать Flash — это выбрать объекты разными способами (click, shift click, double click, рамочное выделение объектов), но когда вы закончили выбор, то как-то отфильтровать элементы из этого selection с помощью меню практически невозможно. Только ручной select/unselect.
Вот примеры использования скриптов:
1. Первичная выборка выполнена прямоугольным выделением мышкой. Видно, что кроме групп объектов в выборку попала часть линии:
![](http://habrastorage.org/storage2/12c/e59/ff5/12ce59ff58a2f481b0b5c6ef6e2a92af.png)
2. После применения скрипта selectionOnlyGroup.jsfl:
![](http://habrastorage.org/storage2/28a/6b3/11f/28a6b311f83229f7be50eb38461c6a17.png)
Видно, что из предварительной выборки исчезла частично выделенная линия.
3. Разделим элементы Модификация->разделить:
![](http://habrastorage.org/storage2/1b4/7ed/c31/1b47edc31e6cd3ae68a107119c375fc9.png)
Видно, что часть объектов «извлеклась», но часть объектов продолжает «упорствовать» и стойко держится в группе.
4. Применим скрипт selectionOnlyGroupsWithMembers.jsfl, чтобы убрать из выделения графические объекты и оставить только группы с подгруппами:
![](http://habrastorage.org/storage2/7c8/ce3/256/7c8ce3256a4ddbf0f8e48a0646fa6f08.png)
и опять «разделим» selection. Получаем результат:
![](http://habrastorage.org/storage2/284/5ef/062/2845ef0621b9df1496842da9cd654ec4.png)
Вроде, как все… Но полной уверенности нет. Проверим имеющуюся выборку скриптом selectionOnlyGroupsWithMembers.jsfl:
![](http://habrastorage.org/storage2/0b5/55c/96c/0b555c96ce5157ee2636c509f63c0de4.png)
Вроде как то, что задумали. Всё аккуратно «разбито».
Напоминаю, что цель была не разбить объекты, а поработать с фильтрацией. Объекты можно было не разбивать, а переносить, например. Думаю, что с применением фильтрации проблем быть не должно. Главное, чтобы было что фильтровать.
Спасибо за внимание.
P.S.
Вообще, тема jsfl незаслуженно обходится вниманием, потому что во flash практически нет ручного способа грамотного рефакторинга изображения. Достаточно высокоуровневые методы из меню не дают доступа к внутренней структуре объектов.