Copy link to clipboard
Copied
I have a clean Animate file.
One graphic object in the library "blueCircle".
and one instance of that object on the main timeline.
I copied the code directly from the documentation.
It fails everytime.
Am I missing something or is fl.findObjectInDocByName(); no longer supports?
PLEASE HELP!!! I will buy you cookies!
var nameToSearchFor = "blueCircle";
var doc = fl.getDocumentDOM();
var results = fl.findObjectInDocByName(nameToSearchFor, doc);
if (results.length > 0) {
alert("success, found " + results.length + " objects");
}
else {
alert("failed, no objects named " + nameToSearchFor + " found");
}
As a side suggestion:
If you want to find an instance of a specific symbol by name (not instance name, but symbol name), you can refer to instance's property called libraryItem. It stores a reference to the real symbol in the library, that the particular instance represents. So, to find all the instances of the symbol blueCircle, you can use:
function selectInstancesBySymbolName( symbolName ){
// Deselect all in the current frame
fl.getDocumentDOM().selectNone();
var timeline = fl.getDocu
...
Copy link to clipboard
Copied
I think that this method looks for movie clip instances only. Graphic instances don't have names, so you can't search them by name. In your example, if you change the instance type to "Movie Clip" and assign it an instance name "blueCircle", the method will find the instance.
Copy link to clipboard
Copied
Thankyou SO Much for clarifying this!
I couldn't find any answers in the documentation.
Is there a way to find a specific Graphic Symbol on the stage by name?
Basically I'm writing a script that changes the FirstFrame of the Head symbol, and then adjusts the "nose" position accordingly.
But all the symbols have to remain Graphic symbols.
Somthing like:
function HEADANGLE(mousePosX, mousePosY) {
newFirstFrame = mousePosX - mousePosY;
fl.getDocumentDOM().HEADSYMBOL.setElementProperty('firstFrame', newFirstFrame);
//search and select "nose" Graphic symbol:
var nameToSearchFor = "nose";
var doc = fl.getDocumentDOM();
var results = fl.findObjectInDocByName(nameToSearchFor, doc);
if (results.length > 0) {
alert("success, found " + results.length + " objects");
}
else {
alert("failed, no objects named " + nameToSearchFor + " found");
}
//Move nose accordingly:
nose.moveX ++;
nose.moveY ++;
}
Copy link to clipboard
Copied
Ok I think I have a work around:
My layer names should be correct so....
I can cycle through all the layers and lock all the others and selectAll.
Then I can manipulate the selected graphic symbol from there.
//////////////////////////Select the right Layer Function:
function SELECTLAYER(layerName) {
var timeline = fl.getDocumentDOM().getTimeline();
//cyle through all the layers and then cycles through all the layer names. If they match, unlock the layer and lock everything else.
for (var i = 0; i < timeline.layerCount; ++i) {
fl.trace("layerName========= "+ layerName[i]);
//Lock the layer...
fl.getDocumentDOM().getTimeline().layers[i].locked = true;
//cycle through the layer names.
for (j = 0; j < timeline.layerCount; j++) {
//fl.trace("In FLA layerNames========= "+ timeline.layers[j].name);
//fl.trace("in TXT layerNames========= "+ layerNames[i]);
//if there's a match Unlock the layer.
if (timeline.layers[i].name == layerName) {
fl.getDocumentDOM().getTimeline().layers[i].locked = false;
fl.trace("MATCH!!! " + timeline.layers[i].name + " <is> " + layerName);
}
}
}
//select all unlocked items.
fl.getDocumentDOM().selectAll();
}
Copy link to clipboard
Copied
Hi,
It's good that you found a workaround!
Below is an optimized variant of your function - with one cycle less and early exit from the loop.
function selectLayerByName( layerName ){
var timeline = fl.getDocumentDOM().getTimeline();
// Select all layers
timeline.setLayerProperty( "locked", true, "all" );
// If the layer's name matches the parameter, unlock it
for ( var i = 0; i < timeline.layerCount; i++ ){
if ( timeline.layers[ i ].name == layerName ){
timeline.layers[ i ].locked = false;
fl.trace( "MATCH!!! " + timeline.layers[ i ].name + " <is> " + layerName );
// If we suppose that there is no duplicated layer names
// in the timeline, we can skip the rest of the loop
break;
}
}
//Select all unlocked items.
fl.getDocumentDOM().selectAll();
}
selectLayerByName( "blueCircle" );
Copy link to clipboard
Copied
As a side suggestion:
If you want to find an instance of a specific symbol by name (not instance name, but symbol name), you can refer to instance's property called libraryItem. It stores a reference to the real symbol in the library, that the particular instance represents. So, to find all the instances of the symbol blueCircle, you can use:
function selectInstancesBySymbolName( symbolName ){
// Deselect all in the current frame
fl.getDocumentDOM().selectNone();
var timeline = fl.getDocumentDOM().getTimeline();
var i, cf = timeline.currentFrame, myFrame, j;
for ( i = 0; i < timeline.layerCount; i++ ){
myFrame = timeline.layers[ i ].frames[ cf ];
for( j = 0; j < myFrame.elements.length; j++ ){
if( myFrame.elements[ j ].libraryItem.name === symbolName ){
myFrame.elements[ j ].selected = true;
}
}
}
}
selectInstancesBySymbolName( "blueCircle" );
Copy link to clipboard
Copied
I have no idea how to thankyou!!!
This is a breath of fresh air!!!
Thankyou thankyou thankyou!!!