Avatar billede paal_dk Nybegynder
10. januar 2005 - 18:15 Der er 3 kommentarer

JSFL og elementer der er grupperet

EXECUTIVE SUMMARY:
Is it possible to change the content of grouped items that resides in the library only (not on the main timeline) with JSFL

Hej Alle,
Jeg prøver på at lave en funktion der ændrer properties på samtlige tekstfelter i en film (library og hovedscene)
Det fungerer fint, med mindre man har en eller flere tekstfelter i grupper... så vidt jeg kan se er der ikke nogen måde at få fat på indholdet af grupper via JSAPI'en.

Antag at jeg har en frame i en tidslinje. Jeg vil nu gerne finde samtlige tekstfelter og ændre deres tekst denne frame:
------------- BEGIN CODE ----------------
var e = frame.elements.length;
while ( e-- ) {
  var element = frame.elements[ e ];
  if ( element.isGroup ) {
    // HVORDAN FÅR MAN FAT I GRUPPENS "MEDLEMMER"?
  } else if ( element.elementType == "text" ) {
    element.setTextString( "Flash virker 90% - hver gang." );
  }
}
------------------ END OF CODE ---------

Et element kan enten være "shape", "text", "instance",  eller "shapeObj".
Hvis det er "text" er alt fint. Hvis det er "instance", kan jeg få fat i dets tidslinje og finde nye elementer dér.
Hvis det er en gruppe har det typen "shape" og en property der hedder isGroup, jvf. koden ovenfor. Shapes der er grupper har tilsyneladende ikke nogen properties eller metoder til at få fat i det grupperede indhold.

En langt ude workaround er at løbe samtlige frames i hovedtidslinjen igennem depth-first, af-gruppere alle grupper, undersøge deres indhold, checke for om der er tekstfelter, ændre properties, regruppere igen. Men det kan tilsyneladende kun lade sig gøre for elementer der er på hovedscenen (f.eks ikke linkede objekter)

Mvh,
Pål Østerud
Avatar billede barklund Nybegynder
10. januar 2005 - 18:55 #1
Jeg er ikke helt med på dit/dine spørgsmål?

Jeg tolker det som:

1. Hvordan tilgår man en gruppes elementer?
2. Hvordan tilgår man movieclips kun eksisterende i library uden instanser på scenen?

Er det korrekt opfattet, oder?

I så fald skal jeg da gerne kigge på, om jeg kan gennemskue det - det kan ikke være helt nemt under alle omstændigheder :)
Avatar billede paal_dk Nybegynder
11. januar 2005 - 11:48 #2
Spm 1. er rigtigt forstået.
Spm 2. skulle være: Hvordan unGroup'er man grupper der kun eksisterer i et clip i library.

Vedhæftet lidt eksempelkode som kan hjælpe i undersøgelsen m.m. kopier den ind i en tom .jsfl fil og dobbeltklik på den, så får du (næsten) al tekst i de åbne dokumenter i flash skrevet ud.

Mvh,
Pål
------------- BEGIN CODE -------------
// Copyright Pål Østerud, 2005

// Public variables to trace.
var document;
var timeline;
var symbolName;

// ---------------- MAIN PROGRAM ------------------
parseOpenDocuments( displayTextFieldTextInFrame );

// ------------ FUNCTION DECLARATIONS -------------
function parseOpenDocuments( refFunction, argsArray ) {
  // Parse all open documents in flash
  for (var k = 0; k<fl.documents.length; k++ ){
      document = fl.documents[k];
      // trace( "----------------\n"+document.name+"\n---------------" );
      parseDocumentElements( document, refFunction, argsArray );
     
      // Publish the document
      // document.publish();
  }
}

function parseDocumentElements( document, refFunction, argsArray )
{
  // Parse main stage timeline as it is not in the library
  runFunctionOnTimelineKeyframes( document.getTimeline(), refFunction, argsArray );     
 
  // Parse library
  var items = document.library.items;
  var i = items.length;
  while(i--)
  {
      var item = items[i];
      // Dont look at folders or sounds/images
      if ( item.timeline != undefined ) {
        // trace("Symbol = "+item.name );
        symbolName = item.name;
        timeline = item.timeline;
        runFunctionOnTimelineKeyframes( item.timeline, refFunction, argsArray );
      }
  }
}

function runFunctionOnTimelineKeyframes( timeline, refFunction, argsArray ) {
  // Loop through all layers
  var l = timeline.layerCount;
  while( l-- ) {
      var f = 0;
      // Parse all keyframes in the timeline and skip the others
      while ( f<timeline.layers[ l ].frameCount ) {
        // trace("Layer "+(l+1)+" frame "+(f+1));
        frame = timeline.layers[ l ].frames[ f ];
        refFunction( frame, argsArray );
        f += frame.duration;
      }
     
  }

}


// --------------------------- HELPER FUNCTIONS -------------------------
function dump( prefix, o )
{
  for (var i in o )
  {
      trace( prefix + i + "="+o[i] );
      dump( prefix+i+".", o[i] );
  }
}

function trace(str) {
  fl.outputPanel.trace( str );
}


// ---------------- USER DEFINED FUNCTIONS ----------------
// Parse the contents of a single frame
// Definition: function myfunction( frame:Frame, args:Array ):Void { ... }
// Call: parseOpenDocuments( myFunction, args );

function displayTextFieldTextInFrame( frame, argsArray ) {
  var e = frame.elements.length;
  while ( e-- ) {
      var element = frame.elements[ e ];
      if ( element.elementType == "text" ) {
        trace( "Symbol: "+symbolName+"\n  Text="+element.getTextString() );
      }
      else if ( element.elementType == "shape" && element.isGroup ) {
        trace("Found a group. Don't know what to do with it");
      }
  }
}

function displayFrameActionScript( frame, argsArray ) {
  if ( frame.actionScript!=undefined && frame.actionScript != "" )
      trace( frame.actionScript );
}
------------ END OF CODE ------------
Avatar billede paal_dk Nybegynder
11. januar 2005 - 19:02 #3
Hm ja, så er svaret fundet.

1) Man kan ikke få fat i en gruppes elementer. Eneste måde er at afgruppere og parse framen igen.

2) Der er en bug i isGroup. Den virker kun når man har selectet alle elementer i currentFrame før man spørger på den.
Man tilgår et element i library'et sådan:

  document.library.editSymbol( <name> );

og sætter pointers til den frame man vil editere i sådan:

  document.library.items[0].timeline.currentLayer = 0;
  document.library.items[0].timeline.layers[0].currentFrame = 0;

Derefter kan man bruge document.selectAll() og document.unGroup()

Lidt kryptisk, jeg ved det, men jeg håber det kan være en hjælp for andre der arbejder med JSFL.

/Pål
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester