JSFL: выбор элементов, возвращаемых функцией fl.findObjectInDocByType () - PullRequest
1 голос
/ 29 ноября 2011

Я не могу использовать информацию, возвращаемую fl.findObjectInDocByType() с fl.getDocumentDOM().selection.

Я хочу использовать document.setTextRectangle для изменения размера некоторых текстовых полей из массива, созданного с использованием fl.findObjectInDocByType().

Я могу легко получить доступ ко всем свойствам textObject, но, поскольку document.setTextRectangle требует текущего выделения, я в растерянности.

Пример в документации для выбора настроек:

fl.getDocumentDOM().selection = fl.getDocumentDOM().getTimeline().layers[0].frames[0].elements[0];

fl.findObjectInDocByType() возвращает массив объектов с атрибутами: (object.timeline, object.layer, object.frame, object.parent)

Но это объекты, и у них нет свойства для номеров индексов массива, требуемых fl.getDocumentDOM().selection= ...

var doc = fl.getDocumentDOM();
var textFieldArray = fl.findObjectInDocByType("text", doc);
    for (var i=0; i < textFieldArray.length; i ++){
        fnResizeTheTextField(textFieldArray[i]);
    }

function fnResizeTheTextField(theTextField){
        //force current selection to be theTextField
        //doc.selection MUST be an array, so assign theTextField to an array...
        var selectArray = new Array();
        selectArray[0] = theTextField.obj;
        var theTimeline =theTextField.timeline;
        var theLayer =theTextField.layer;
        var theFrame =theTextField.frame;
        doc.currentTimeline =theTextField.timeline;
        doc.selection = doc.getTimeline().theLayer.theFrame.selectArray;//error
        //resize the text rectangle
        doc.setTextRectangle({left:0, top:0, right:1000, bottom:1000});
    }
}

Результат: Error:doc.getTimeline().theLayer has no properties

Ответы [ 3 ]

2 голосов
/ 21 декабря 2011

Оказывается, сценарий ObjectFindAndSelect.jsfl уже содержит специальную функцию для этого: fl.selectElement (). Гораздо элегантнее:

var doc = fl.getDocumentDOM();
// generate an array of elements of type "text"
var textFieldArray = fl.findObjectInDocByType("text", doc);
    for (var i=0; i < textFieldArray.length; i ++){
        fnResizeTheTextField(textFieldArray[i]);
    }

function fnResizeTheTextField(theTextField){
        //force current selection to be theTextField
        fl.selectElement(theTextField,false);//enter 'edit mode' =false...
        //resize the text rectangle
        doc.setTextRectangle({left:0, top:0, right:1000, bottom:1000});
    }
}
0 голосов
/ 16 января 2013

У меня недавно была похожая проблема, и, очевидно, все результаты Google о setTextRectangle() направляют нас сюда.Невероятно, насколько плохо документирован jsfl:)

Если вам нужно использовать setTextRectangle() внутри элемента библиотеки, который не находится на сцене, вам нужно сначала открыть его для редактирования элемента.

Воткод, который решил мою проблему:

library.selectItem(libraryItemName);
doc.selection = [tf];//where tf is the reference to textfield we need to edit
doc.library.editItem(libraryItemName);  
doc.setTextRectangle({left:l, top:t, right:r, bottom:b});
doc.selectNone();

Если у вас есть лучшее рабочее решение, пожалуйста, напишите.Надеюсь, это сэкономит кому-то время.Удачи!

0 голосов
/ 17 декабря 2011

Я нашел ответ. Чтобы выбрать что-либо для операции на уровне документа, вы также должны сделать флэш-фокус на ключевом кадре этого объекта.

Итак, если я перебираю массив объектов, созданных функцией fl.findObjectInDocByType (), я использую этот код для правильной фокусировки флэш-памяти на объекте:

function fnMakeFlashLookAt(theObject){
        doc.currentTimeline =theObject.timeline;
        doc.getTimeline().currentLayer =theObject.layer;
        doc.getTimeline().currentFrame =theObject.frame;
    }

однако это может не работать на объектах, вложенных в символ.

...