Forenindex » Programme » Print/Bildbearbeitung » Adobe InDesign » Marginalien via Tags automatisch in Textrahmen verschieben

Marginalien via Tags automatisch in Textrahmen verschieben

madram
Beiträge gesamt: 3

7. Jan 2008, 00:23
Bewertung:

gelesen: 5458

Beitrag als Lesezeichen
Hallo,
ich habe mich seit heute mit Indesign-Scripting beschäftigt, weil ich gerade eine wissenschaftliche Arbeit von DokuWiki in Indesign importieren möchte. Nun habe ich die Daten als XML-Datei vorliegen. Die Absatz- und Zeichenstile werden einwandfrei übernommnen. Nur bei den Fußnoten hapert es noch. Diese sollen als Marginalien an den Rand.

Es existiert ein ObjektStil "Marginalia", welcher einen verankerten Textrahmen definiert. Von Hand geht die Zuweisung wunderbar, aber es soll ja jetzt automatisch laufen. Die Marginalien selber sind XML-Tags im Fließtext und momentan noch im Haupttextrahmen zu sehen.

Ein Script soll jetzt den XML-Baum nach Tags mit dem Namen "Marginalia" durchsuchen und deren Inhalt in einen neuerstellten Textrahmen des Stils "Marginalia" verschieben. Durch die Suche in diesem Forum habe ich mir schonmal folgenden Code zusammengeklickt:

Code
/** 
* This script walks through all XML-tags and moves all texts associated
* with "Marginalia" to anchored text frames
*/

var wantedTag = "Marginalia";
var marginaliaStyle = "Marginalia";
var crntDoc = app.activeDocument;

// start script
deepSearch(crntDoc, wantedTag);


/**
* traverse XML-Tree and look for element
*/
function deepSearch(element, tag){
var crnt;
var i;
for (i = 0; i < element.xmlElements.length; i++){
crnt = element.xmlElements[i];
if (crnt.markupTag.name == tag){
convertToMarginalia(crnt);
}
deepSearch(crnt, tag);
}
}

/**
* create text frame, and copy content into
*/
function convertToMarginalia(element) {
// var content = element.contents;
var textFrame = element.texts[0].parentTextFrames[0]; // the parent textframe of the actual element
var paragraphs = textFrame.paragraphs; // doesnt return the actual position

if(textFrame.appliedObjectStyle.name != marginaliaStyle) { // don't touch existing marginalia
$.writeln("Found marginalia, moving to anchored text frame...");
// move text into frame
var myFrame = paragraphs.item(0).insertionPoints[0].textFrames.add(); // create frame
var margStyle = app.activeDocument.objectStyles.item(marginaliaStyle); // get Style
//myFrame.applyObjectStyle(margStyle, true); // ID crashes here...
element.texts[0].move(LocationOptions.atBeginning, myFrame.texts[0]); // move Text
}
}



Das Traversieren ist nichts besonderes, aber beim Verschieben des Inhaltes bin ich sehr unsicher, kenne das Objektmodell von Indesign zu schlecht. Der Text wird zwar verschoben, aber ungetagged. Im Haupttextrahmen bleibt ein leeres Element zurück. Außerdem landet der verankerte Textrahmen immer am Anfang, aber ich setze ja auch den Cursor (noch) nicht.

Mir geht es eigentlich hauptsächlich darum, die Marginalie samt XML-Tag in den neuen Textrahmen zu verschieben.

Wäre dankbar, wenn mir jemand dabei auf die Sprünge helfen könnte.

Richard

PS: Warum wird mein Beitrag samt Code ab der Hälfte kursiv dargestellt?

(Dieser Beitrag wurde von Martin Fischer am 7. Jan 2008, 07:50 geändert)

Marginalien via Tags automatisch in Textrahmen verschieben

pixxxelschubser
Beiträge gesamt: 1708

7. Jan 2008, 01:12
Bewertung:

gelesen: 5443

Beitrag als Lesezeichen
Hallo madram,

erst einmal willkommen auf HDS
Beim Scripten kann ich Dir leider nicht helfen.

Antwort auf: PS: Warum wird mein Beitrag samt Code ab der Hälfte kursiv dargestellt

Hier gibt es wahrscheinlich eine Kollision mit der foreneigenen Formatierung.
[i] Sample Text [/i] ergibt zum Beispiel Kursiven Text = Sample Text

Damit Du jetzt [i] sehen kannst habe ich vor dem "i" einen Punkt eingefügt, also [.i]
(Damit du jetzt "[.i]" sehen kannst, mußte ich beim Schreiben 2 Punkte einfügen.)

Wink


Wink
Viele Grüße
pixxxelschubser




Was wir wissen, ist ein Tropfen; was wir nicht wissen, ein Ozean.

Isaac Newton


Marginalien via Tags automatisch in Textrahmen verschieben

Martin Fischer
  
Beiträge gesamt: 12783

7. Jan 2008, 08:33
Bewertung:

gelesen: 5399

Beitrag als Lesezeichen
Hallo Richard,

Antwort auf: Der Text wird zwar verschoben, aber ungetagged. Im Haupttextrahmen bleibt ein leeres Element zurück.


Das liegt an der Definition des Objekts "element.texts[0]", das verschoben werden soll:
Code
element.texts[0].move(LocationOptions.atBeginning,  myFrame.texts[0]); // move Text 

texts ist ein reines Textobjekt.

Da ich mich in XML nicht so gut auskenne, um eine qualifizierte Antwort geben zu können, kann ich nur zu einem Versuch ermutigen:
Definiere statt "element.texts[0]" zum Verschieben mal nur "element" (damit sollte das ganze Element verschoben werden).
Oder in einem zweiten Versuch (falls der erste scheitert): "element.xmlContent" (wobei dies wahrscheinlich auch nur den ungetaggten Inhalt verschiebt).



Antwort auf: Außerdem landet der verankerte Textrahmen immer am Anfang,


Das liegt an der Definition des Ursprungs des Textrahmens: 'var myFrame = paragraphs.item(0).insertionPoints[0].textFrames.add();'
- am ersten Einfügepunkt des ersten Absatzes (also vor dem ersten Zeichen des ersten Absatzes).

Wo soll er denn hin?
An die Stelle, wo der Cursor steht?
app.selection[0].insertionPoints[0]

Viele Grüße
Martin


Marginalien via Tags automatisch in Textrahmen verschieben

madram
Beiträge gesamt: 3

8. Jan 2008, 09:51
Bewertung:

gelesen: 5358

Beitrag als Lesezeichen
Besten Dank erstmal für den Hinweis. Habs versucht, aber das ganze Element konnte ich nicht verschieben. Entweder kam es zum Absturz oder ID hat sich geweigert; weiß nicht mehr genau.

Folgendes Script geht jetzt durch sämtliche Tags, erzeugt Textrahmen, kopiert die Inhalte und weist den neuen Rahmen das existierende Tag zu.

Bleiben noch zwei offene Fragen:
Code
  * Der Cursor bleibt immer an der Stelle, wo ich 
ihn hingesetzt habe. Wie kann ich den so
manipulieren, dass er immer vor das ehemalige
XML-Element im alten Textrahmen zeigt?
* Wenn ich versuche, dem neuen Textrahmen einen
Objektstil zuzuweisen, schmiert ID ohne jegliche
Fehlermeldung einfach ab. Es scheint auch genau
bei diesem Befehl zu passieren, nicht irgendwann
später.


Antwort auf: Hier gibt es wahrscheinlich eine Kollision mit der foreneigenen Formatierung.
[i] Sample Text ergibt zum Beispiel Kursiven Text = Sample Text

Das ist ja lustig. Hab's umbenannt.

Danke nochmal für die Antworten.
Richard

Code
/** 
* This script walks through all XML-tags and moves
* all texts associated with "Marginalia" to
* anchored text frames
*/

var wantedTag = "Footnote";
var marginaliaStyle = "Marginalia";
var actDoc = app.activeDocument; // just lazyness

// start script
deepSearch(actDoc, wantedTag);


/**
* traverse XML-Tree and look for element
*/
function deepSearch(element, tag){
var crnt, x;
for (x = 0; x < element.xmlElements.length; x++){
crnt = element.xmlElements[x];
if (crnt.markupTag.name == tag){
convertToMarginalia(crnt);
}
deepSearch(crnt, tag);
}
}


/**
* create text frame, and copy content into
*/
function convertToMarginalia(element) {
var margStyle, elemPrntFrame;

elemPrntFrame = element.texts[0].parentTextFrames[0];

// perform only, when textframe is not tagged as marginalia
if(elemPrntFrame.appliedObjectStyle.name != marginaliaStyle) {
$.writeln("Found marginalia, move it to anchored text frame...");
// create frame at actual cursor position
var newFrame = actDoc.selection[0].insertionPoints[0].textFrames.add();
// move Text into Frame
element.texts[0].move(LocationOptions.atBeginning, newFrame.texts[0]);
newFrame.markup(element);

// get marginalia style
var margStyle = actDoc.objectStyles.item(marginaliaStyle);
// aply this style -> ID will crash here...
//newFrame.applyObjectStyle(margStyle, true);
}
}


(Dieser Beitrag wurde von madram am 8. Jan 2008, 09:58 geändert)

Marginalien via Tags automatisch in Textrahmen verschieben

Martin Fischer
  
Beiträge gesamt: 12783

8. Jan 2008, 10:16
Bewertung:

gelesen: 5348

Beitrag als Lesezeichen
Hallo Richard,

die von Dir verwandte Methode, einen Objektstil zuzuweisen ist zwar die bessere (weil man damit bestimmen kann, daß Abweichungen gelöscht werden). Es gibt aber noch eine Alternative:
Code
myFrame.appliedObjectStyle = margStyle; 


Könntest Du mal testen, ob ID damit weiter abstürzt oder zumindest das Absturzproblem damit behoben ist?

Antwort auf: Der Cursor bleibt immer an der Stelle, wo ich
ihn hingesetzt habe. Wie kann ich den so
manipulieren, dass er immer vor das ehemalige
XML-Element im alten Textrahmen zeigt?


Versuchs mal folgendermaßen:
Ersetze
Code
// move Text into Frame  
element.texts[0].move(LocationOptions.atBeginning, myFrame.texts[0]);
myFrame.markup(element);


durch
Code
var myPointBeforeElement = element.texts[0].parentStory.insertionPoints[element.texts[0].insertionPoints[0].index-1]; 
// move Text into Frame
element.texts[0].move(LocationOptions.atBeginning, myFrame.texts[0]);
myFrame.markup(element);
myPointBeforeElement.select();


Eventuell geht die Bestimmung des myPointBeforeElement etwas einfacher (über previousItem).
Das müßte ich selbst erst noch konkret prüfen.

Viele Grüße
Martin



(Dieser Beitrag wurde von Martin Fischer am 8. Jan 2008, 10:20 geändert)

Marginalien via Tags automatisch in Textrahmen verschieben

Martin Fischer
  
Beiträge gesamt: 12783

8. Jan 2008, 10:34
Bewertung:

gelesen: 5341

Beitrag als Lesezeichen
Code
var myPointBeforeElement = element.texts[0].parentStory.insertionPoints.itemBefore(element.texts[0].insertionPoints[0]); 


Der Einfügepunt vor element ist notwendig, da element verschoben wird (und mit ihm der erste Einfügepunkt).

Viele Grüße
Martin


Marginalien via Tags automatisch in Textrahmen verschieben

madram
Beiträge gesamt: 3

9. Jan 2008, 16:17
Bewertung:

gelesen: 5280

Beitrag als Lesezeichen
Hallo Martin.

=== Stil zuweisen ===
Die "alternative" und offizielle weil dokumentierte Variante, welche Sie vorgeschlagen haben, bringt hier nicht viel, weil sämtliche wichtigen Stile nicht übernommen werden.

ID (CS2) stürzt übrigens immer nur dann beim Objektstilzuweisen ab, wenn im Objektstil unter "Text Frame General Options" das Häkchen bei "Fixed Column Width" gesetzt ist. Marginalien sollten bei eine feste Breite besitzen, darum habe ich die Option gesetzt. Wird wohl ein Bug sein. Wenn ich die Option erben lasse, läuft alles wie geschmiert. Ebenso, wenn ich den Objektstil von Hand zuweise.

=== Textrahmen verschieben ===
Auch das läuft jetzt wunderbar. Die von Ihnen vorgeschlagene zweite Variante, das Vorgängerelement zu finden, bietet CS2 nicht an, aber ich habe ja auch nicht geschrieben, dass ich kein CS3 verwende.


Vielen Dank für die Hilfe. Ich probier noch ein bisschen und poste dann irgendwann das Script komplett.

Mit herzlichen Grüßen
Richard Weickelt

Marginalien via Tags automatisch in Textrahmen verschieben

Martin Fischer
  
Beiträge gesamt: 12783

9. Jan 2008, 16:23
Bewertung:

gelesen: 5278

Beitrag als Lesezeichen
Antwort auf: ID (CS2) stürzt übrigens immer nur dann beim Objektstilzuweisen ab, wenn im Objektstil unter "Text Frame General Options" das Häkchen bei "Fixed Column Width" gesetzt ist.


Ist es möglich, diese Häkchen zunächst mal wegzulassen und nach Aufführung des Skripts zu setzen?

Wenn ja - Ist es möglich, das Häkchen per Skript temporär zu deaktivieren, die Prozeduren auszuführen und am Ende das Häkchen über das Skript wieder zu aktivieren?

Viele Grüße
Martin


Marginalien via Tags automatisch in Textrahmen verschieben

Gerald Singelmann
  
Beiträge gesamt: 6269

9. Jan 2008, 18:03
Bewertung:

gelesen: 5257

Beitrag als Lesezeichen
Zitat und nach Aufführung des Skripts zu setzen

:)

Marginalien via Tags automatisch in Textrahmen verschieben

silo
Beiträge gesamt: 29

28. Jan 2008, 10:51
Bewertung:

gelesen: 5130

Beitrag als Lesezeichen
Hallo,
ich arbeite mich seit letzter Woche in InDesign, den Import von XML in InDesign und nun auch in das Skripting mit InDesign ein. Ich bin vorher nie mit DTP-Programmen in Berührung gekommen.

Auf jeden Fall habe ich (neben vielen weiteren) ziemlich genau die selbe Anforderung an ein Skript wie es durch madram beschrieben wurde. Deshalb bin ich froh das in diesem Thema bereits ein so gutes Skript erarbeitet wurde. Einige Fragen und Anmerkungen habe ich jedoch noch.


Antwort auf [ madram ] ID (CS2) stürzt übrigens immer nur dann beim Objektstilzuweisen ab, wenn im Objektstil unter "Text Frame General Options" das Häkchen bei "Fixed Column Width" gesetzt ist. Marginalien sollten bei eine feste Breite besitzen, darum habe ich die Option gesetzt. Wird wohl ein Bug sein. Wenn ich die Option erben lasse, läuft alles wie geschmiert. Ebenso, wenn ich den Objektstil von Hand zuweise.

Dieses Problem habe ich versucht nachzustellen, konnte es aber in CS3 nicht mehr feststellen (allerdings weiss ich nicht genau was die Option "erben" im Kontext von InDesign bedeutet).


Antwort auf [ Martin Fischer ]
Code
var myPointBeforeElement = element.texts[0].parentStory.insertionPoints.itemBefore(element.texts[0].insertionPoints[0]); 


Bei dieser Zeile wirft mir ID einen JavaScript Fehler.
Code
element.texts[0].parentStory.insertionPoints.itemBefore ist keine Funktion 

Das Objektmodell für CS3 kennt nur previousItem(obj): InsertionPoint, und damit funktioniert es auch.


Als nächstes musste ich die Reihenfolge der Ereignisse anpassen (im Gegensatz zu der in Beitrag #4).
1. Zuerst die Cursorposition setzen
Code
var myPointBefore = elem... 
myPointBefore.select();


2. und erst dann ein neues Frame erzeugen
Code
var newFrame = actDoc... 


3. Text verschieben
Code
element.texts[0].move(... 
newFrame.markup(...


4. Objektstiel zuweisen
Code
var margStyle = actDoc.... 
newFrame.applyObjectStyle(...



Nun meine Fragen:
Wenn der Text auf mehreren Textrahmen (bzw. die Story auf mehreren sog. 'textContainers') verteilt ist funktioniert das nur für den ersten Textrahmen (textContainers[0]).
Ich habe überlegt eine Schleife über die entsprechenden Textrahmen zu durchlaufen (for(j=0; j<currentStory.textContainers.length; ++j)), aber das Skript wird ja über die deepSearch()-Funktion nicht auf einem Textrahmen aufgerufen, sondern auf dem Dokument. Und das iteriert über die XML-Elemente. Da bin ich gerade etwas überfordert und würde mich freuen wenn mir jemand einen Hilfreichen Tip geben könnte.

Marginalien via Tags automatisch in Textrahmen verschieben

Imion
Beiträge gesamt: 141

12. Feb 2008, 14:23
Bewertung:

gelesen: 5040

Beitrag als Lesezeichen
Hallo zusammen,

ich hoffe es ist in Ordnung, dass ich mich hier anschließe. Solch ein Sktipt habe ich nun auf der Basis des hier vorgestellten aufgebaut und für unsere Zwecke angepasst. Es funktioniert wunderbar und ich möchte mich bei allen Beteiligten bedanken, ich habe viel dadurch gelernt.

Nun erstelle ich gerade ein zweites Skript, welches global alle XML Tags durchläuft und die größen der Rahmen, egal ob Bilder oder Texte. Diesen Wert wende ich dann beim nächsten Objekt an, eshandelt sich um viele Rahmen die als verankerte Objekte in einem Fließtext eingebunden sind und über Objektstile ausgerichtet wurden, um dessen "y Versatz" Wert um die Höhe des vorhergehenden Rahmens zu verändern.

Das Funktioniert auch, solange der Rahmen, dessen Wert ich abgreifen möchte nicht einer von denen ist, die mit dem MarginalienScript erzeugt wurden. Ich bekomme zwar einen Wert, dieser ist aber die Höhe des Rahmens, in dem sich alle verankerten Objekte befinden und nicht der des neu erzeugten Rahmens.

Kann mir jemand sagen wo bei mir der Fehler liegt? Das wäre super.

Code
var objectHeight; 

traversexmlelements(app.activeDocument);
function traversexmlelements(elm){
var i;
for (i = 0; i < elm.xmlElements.length; i++){
if (elm.xmlElements[i].markupTag.name == "Artikelgruppe")
{
$.writeln("Artikelgruppe");
}
if (elm.xmlElements[i].markupTag.name == "Fotografie-Produktbild")
{
dothething(elm.xmlElements[i]);
}
if(elm.xmlElements[i].markupTag.name == "Fotografie-Schmuckbild")
{
dothething(elm.xmlElements[i]);
}
if(elm.xmlElements[i].markupTag.name == "Artikelgruppenname")
{
dothething(elm.texts[i].parentTextFrames[i]);
}
if(elm.xmlElements[i].markupTag.name == "Artikelgruppentext")
{
dothething(elm.xmlElements[i]);
}
if(elm.xmlElements[i].markupTag.name == "Guetesiegel")
{
dothething(elm.xmlElements[i]);
}
if(elm.xmlElements[i].markupTag.name == "Logo")
{
dothething(elm.xmlElements[i]);
}
traversexmlelements(elm.xmlElements[i]);
}
}

function dothething(elm){
var obj = null;
if (elm.pageItems.length != 0){
obj = elm;
} else if (elm.images.length !=0 ){
obj = elm.xmlContent.parent;
} else if (elm.epss.length != 0){
obj = elm.xmlContent.parent;
} else if (elm.pdfs.length !=0){
obj = elm.xmlContent.parent;
} else if (elm.texts.length !=0){
obj = elm.xmlContent.parent;
}
if (obj != null){
if(objectHeight)
{
obj.anchoredObjectSettings.anchorYoffset = objectHeight;
}
objectHeight = obj.geometricBounds[2] - obj.geometricBounds[0];
//alert(objectHeight);
}
}

---------------------------------------------------------------------------------
Creative Suite CS3 Design Premium auf MacBook Core 2 Duo 2,4 GHz und 4 GB Ram mit Mac OS X 10.6.1

(Dieser Beitrag wurde von Martin Fischer am 12. Feb 2008, 14:29 geändert)

Marginalien via Tags automatisch in Textrahmen verschieben

Martin Fischer
  
Beiträge gesamt: 12783

12. Feb 2008, 14:36
Bewertung:

gelesen: 5034

Beitrag als Lesezeichen
Antwort auf: Ich bekomme zwar einen Wert, dieser ist aber die Höhe des Rahmens, in dem sich alle verankerten Objekte befinden und nicht der des neu erzeugten Rahmens.


Mal ins Blaue rein:
Ist es möglich, daß Du ein Parent bzw. parentTextFrames[0] zu hoch gegangen bist?
Etwa bei "Artikelgruppenname"?

Viele Grüße
Martin


Marginalien via Tags automatisch in Textrahmen verschieben

zaphodbeeblebroxx
Beiträge gesamt: 408

12. Feb 2008, 14:57
Bewertung:

gelesen: 5024

Beitrag als Lesezeichen
 
Hallo,

vielleicht liegt es auch daran, dass Du mit Deinem ersten Skript verankerte Textrahmen erzeugst. Wenn Du dann mit Deinem 2. Skript über die XML-Tags auf diese verankerten Textrahmen (bzw. den Content) zugreifst und Dich über die parents "hochangelst" erhälst Du als parent evtl. insertionPoints, die keine geometricBounds besitzten. Mit parentTextFrames[0] erhälst Du dann (wie Martin schon vermutet hat) den TF in dem Dein Text mit dem verankerten Rahmen liegt und nicht den TF des verankerten Rahmens. Somit die falschen Werte.


Matthias

Marginalien via Tags automatisch in Textrahmen verschieben

Imion
Beiträge gesamt: 141

12. Feb 2008, 16:08
Bewertung:

gelesen: 5005

Beitrag als Lesezeichen
Hallo,

das stimmt so. Allerdings habe ich jetzt hier die ganze Zeit nach einer Möglichkeit im Datenbrowser gesucht den Textframe zu bekommen, der den Text an sich enthällt.
Dabei habe ich festgestellt, dass der neu erzeugte Textrahmen das entsprechende Tag erbt und das wenn ich vom Content eine Ebene höher gehe, immer sofort im Vatertextframe lande. Weiß jemand wie ich diesen dazwischenliegenden Textframe von der Story ausgehend aufrufen kann?

Sollte as jemand nachvollziehen wollen ist das ganz einfach möglich indem man einen großen Textrahmen erzeugt und diesem das Tag Artikelgruppe zuweist. Anschließend erzeugt man einen verankterten Rahmen und weißt diesem das Tag Artikelgruppentext zu. dann noch ein bischen Kauderwelch in den verankerten Rahmen getippt und das Script laufen lassen.

Ich hoffe jemand hat einen Tip für mich, es kann ja nicht sein, dass man diesen Rahmen nicht zu packen bekommt.

vielen Dank für eure Hilfe,

Gruß, Andreas
---------------------------------------------------------------------------------
Creative Suite CS3 Design Premium auf MacBook Core 2 Duo 2,4 GHz und 4 GB Ram mit Mac OS X 10.6.1

Marginalien via Tags automatisch in Textrahmen verschieben

Martin Fischer
  
Beiträge gesamt: 12783

12. Feb 2008, 16:12
Bewertung:

gelesen: 5002

Beitrag als Lesezeichen
Antwort auf: Weiß jemand wie ich diesen dazwischenliegenden Textframe von der Story ausgehend aufrufen kann?


Es ist ein aStory.textFrames[x] (in CS3; in CS2 wahrscheinlich auch - da muß man aber aufpassen, daß man nicht die verknüpften Textrahmen der story erwischt)

Das x ermittelst Du über ein itemByRange vom ersten Zeichen der story bis zum besagten Textrahmen und zählst die darin enthaltenen Textrahmen.

Wahrscheinlich geht es sogar noch einfacher über den index des Textrahmens. Der müßte eigentlich je story bei 0 beginnen.

Viele Grüße
Martin


Marginalien via Tags automatisch in Textrahmen verschieben

zaphodbeeblebroxx
Beiträge gesamt: 408

12. Feb 2008, 18:40
Bewertung:

gelesen: 2824

Beitrag als Lesezeichen
 
Hallo,

die verankerten Text-Rahmen kann man auch über die PageItems der parent-Textframes bzw. der parent-Story ansprechen.


Matthias

Marginalien via Tags automatisch in Textrahmen verschieben

Martin Fischer
  
Beiträge gesamt: 12783

12. Feb 2008, 18:50
Bewertung:

gelesen: 2821

Beitrag als Lesezeichen
Matthias,

Antwort auf: die verankerten Text-Rahmen kann man auch über die PageItems der parent-Textframes bzw. der parent-Story ansprechen.


Dann hast Du aber auch ovals und rectangles und sonstiges Ungeziefer mit dabei.

Viele Grüße
Martin


Marginalien via Tags automatisch in Textrahmen verschieben

Imion
Beiträge gesamt: 141

13. Feb 2008, 11:56
Bewertung:

gelesen: 2787

Beitrag als Lesezeichen
Antwort auf [ Martin Fischer ]
Antwort auf: Weiß jemand wie ich diesen dazwischenliegenden Textframe von der Story ausgehend aufrufen kann?


Es ist ein aStory.textFrames[x] (in CS3; in CS2 wahrscheinlich auch - da muß man aber aufpassen, daß man nicht die verknüpften Textrahmen der story erwischt)

Das x ermittelst Du über ein itemByRange vom ersten Zeichen der story bis zum besagten Textrahmen und zählst die darin enthaltenen Textrahmen.

Wahrscheinlich geht es sogar noch einfacher über den index des Textrahmens. Der müßte eigentlich je story bei 0 beginnen.


Also ich versuche da sjetzt mal ohne die XML Elemente, ich muss eh alle Elemente durchgehen, deshalb kann ich die XML Elemente aussen vor lassen.

Dazu habe ich jetzt folgendes Script erstellt und versuche jetzt die Inhalte des Textrahmens, welchen ich auf diese Weise erhalte durch zu gehen. Das funktioniert auch, aber wie bekomme ich jetzt raus ob der aktuelle Character ein Rahmen oder ein Buchstabe ist?

Hier mein Code bis jetzt:
Code
alignElements(app.selection[0]); 
function alignElements(elm)
{
if(elm.constructor.name == "TextFrame")
{
var i;
for(i = 0; i < elm.characters.length;i++)
{
//alert(elm.characters[i].content);
switch (elm.characters[i].content)
{
case "TextFrame":
alert(elm.textFrames[0]);
break;
}
}
}
else
{
alert("Ausgewähltes Element ist kein Textrahmen.");
}
}


Hat jemand eine Idee wo es bei mir hapert? Für Denkanstöße wäre ich dankbar.
---------------------------------------------------------------------------------
Creative Suite CS3 Design Premium auf MacBook Core 2 Duo 2,4 GHz und 4 GB Ram mit Mac OS X 10.6.1

(Dieser Beitrag wurde von Martin Fischer am 13. Feb 2008, 12:10 geändert)

Marginalien via Tags automatisch in Textrahmen verschieben

zaphodbeeblebroxx
Beiträge gesamt: 408

13. Feb 2008, 11:59
Bewertung:

gelesen: 2782

Beitrag als Lesezeichen
 
Hallo,

schau mal hier:

http://www.adobeforums.com/webx/.3c06157c/37


Matthias

Marginalien via Tags automatisch in Textrahmen verschieben

Imion
Beiträge gesamt: 141

13. Feb 2008, 12:28
Bewertung:

gelesen: 2767

Beitrag als Lesezeichen
Das könnte hilfreich sein, wenn ich denn dann auch weiß das ich zum jetzigen Zeitpunkt einen verankerten Rahmen habe. Ist das aktuelle Zeichen aber tatsächlich ein Buchstabe, so bekomme ich eine Fehlermeldung.

Für mich wäre es wichtig zuerst einmal zu wissen was ich da im Moment überhaupt habe. Das bringt mich gerade etwas zur Verzweiflung, wo ich doch scheinbar so kurz vor dem Ziel bin...
---------------------------------------------------------------------------------
Creative Suite CS3 Design Premium auf MacBook Core 2 Duo 2,4 GHz und 4 GB Ram mit Mac OS X 10.6.1

Marginalien via Tags automatisch in Textrahmen verschieben

zaphodbeeblebroxx
Beiträge gesamt: 408

13. Feb 2008, 12:42
Bewertung:

gelesen: 2760

Beitrag als Lesezeichen
 
Hallo,

das müsste doch über eine "constructor.name" Abfrage des Objekts bestimmbar sein, ob es sich um einen "Character" oder einen "Textframe" handelt.

Mit einer "try + catch(e)" Abfrage müsste der beschriebene Fehler doch abgefangen werden können.


Matthias

Marginalien via Tags automatisch in Textrahmen verschieben

Imion
Beiträge gesamt: 141

13. Feb 2008, 18:55
Bewertung:

gelesen: 2729

Beitrag als Lesezeichen
Hallo,

das Skript läuft nun mit Hilfe von PageItems. Damit bekomme ich alle verankerten Bildrahmen und Textrahmen abgefangen. Allerdings nicht Texte bzw. Tabellen die im Rahmen stehen.

Reine Texte sind auch nicht das Problem, die kann man ignorieren, aber Tabellen sollten von meinem Skript einbezogen werden.
Das wird allerdings nur gehen schätze ich, wenn ich alle Zeichen durch gehe und prüfe.

mit elm.characters[i].constructor.name erhalte ich allerdings auch bei verankerten Textrahmen als Rückgabe "Character". Gibt es noch eine andere Funktion bzw ein anderes Attribut im constructor ausser name, mit dem man vielleicht den Typ abfragen kann?


Code
alignElements(app.selection[0]); 

function alignElements(elm)
{
if(elm.constructor.name == "TextFrame")
{
var i, objectHeight;
for(i = 0; i < elm.characters.length; i++)
{
alert(elm.characters[i].constructor.name);
try
{
if(objectHeight)
{
elm.pageItems[i].anchoredObjectSettings.anchorYoffset = objectHeight;
objectHeight = elm.pageItems[i].geometricBounds[2] - elm.pageItems[i].geometricBounds[0] + objectHeight;
}
else
{
objectHeight = elm.pageItems[i].geometricBounds[2] - elm.pageItems[i].geometricBounds[0];
}
}
catch(err)
{
alert(err);
}
}
}
else
{
alert("Ausgewähltes Element ist kein Textrahmen.");
}
}


Gruß, Andreas
---------------------------------------------------------------------------------
Creative Suite CS3 Design Premium auf MacBook Core 2 Duo 2,4 GHz und 4 GB Ram mit Mac OS X 10.6.1

(Dieser Beitrag wurde von Martin Fischer am 13. Feb 2008, 19:02 geändert)

Marginalien via Tags automatisch in Textrahmen verschieben

Martin Fischer
  
Beiträge gesamt: 12783

13. Feb 2008, 19:05
Bewertung:

gelesen: 2726

Beitrag als Lesezeichen
Andreas,

wenn Du in deinem Code [i] verwendest, dann gibt es hier im Forum eine Kollision mit dem Befehl für die Kursivschaltung [i].

Bitte füge deswegen vor dem i einen Punkt ein: [.i].
Das wird dann als [i] dargestellt.

Deinen Beitrag oben habe ich entsprechend korrigiert.

Viele Grüße
Martin


Marginalien via Tags automatisch in Textrahmen verschieben

Martin Fischer
  
Beiträge gesamt: 12783

13. Feb 2008, 19:10
Bewertung:

gelesen: 2724

Beitrag als Lesezeichen
Hallo Andreas,

Antwort auf: Reine Texte sind auch nicht das Problem, die kann man ignorieren, aber Tabellen sollten von meinem Skript einbezogen werden.
Das wird allerdings nur gehen schätze ich, wenn ich alle Zeichen durch gehe und prüfe.


Du könntest nach den Tabellen in einem Textabschnitt suchen und durch das Ergebnis iterieren.

Antwort auf: mit elm.characters[i].constructor.name erhalte ich allerdings auch bei verankerten Textrahmen als Rückgabe "Character". Gibt es noch eine andere Funktion bzw ein anderes Attribut im constructor ausser name, mit dem man vielleicht den Typ abfragen kann?


Bist Du dem Link von Matthias oben gefolgt?
Da wird das sehr ausführlich und gründlich diskutiert.
U.a. gibt es noch 'instanceof' - aber mit Vorsicht zu genießen.

Viele Grüße
Martin



(Dieser Beitrag wurde von Martin Fischer am 13. Feb 2008, 19:33 geändert)

Marginalien via Tags automatisch in Textrahmen verschieben

Imion
Beiträge gesamt: 141

13. Feb 2008, 20:39
Bewertung:

gelesen: 2698

Beitrag als Lesezeichen
Hallo Martin,

ich hatte mir den Link angesehen, aber nur vier Beiträge bekommen die für mich irgendwie völlig unzusammenhängend waren.
Nach dem Du mich eben danach gefragt hast habe ich mir das noch mal angesehen. Und jetzt habe ich es auch gefunden. Danke dafür.

Nun bekomme ich den verankerten Rahmen zu sehen. Allerdings als eine Art Zeichen und noch nicht so, dass ich auf seine geometricBonds zugreifen kann. Aber ich werde mich morgen noch weiter damit beschäftigen.

Danke für die tolle Hilfe. :-)
---------------------------------------------------------------------------------
Creative Suite CS3 Design Premium auf MacBook Core 2 Duo 2,4 GHz und 4 GB Ram mit Mac OS X 10.6.1

Marginalien via Tags automatisch in Textrahmen verschieben

Martin Fischer
  
Beiträge gesamt: 12783

13. Feb 2008, 21:11
Bewertung:

gelesen: 2686

Beitrag als Lesezeichen
Hallo Imion,

Antwort auf: ich hatte mir den Link angesehen, aber nur vier Beiträge bekommen die für mich irgendwie völlig unzusammenhängend waren.


Du hast den Link zu "Show All Messages" gefunden?
Es gibt momentan ca. 40 Diskussionsbeiträge.

Viele Grüße
Martin


Marginalien via Tags automatisch in Textrahmen verschieben

zaphodbeeblebroxx
Beiträge gesamt: 408

13. Feb 2008, 23:20
Bewertung:

gelesen: 2668

Beitrag als Lesezeichen
 
Hallo,

die geometricBounds eines verankerten Rahmens kannst Du über pageItems[0] erhalten. Wenn Du als Rückgabe von constructor.name "Character" erhälst, dann prüfe per "try" ob das Objekt pageItems[0] vorhanden ist. Wenn ja, handelt es sich um einen verankerten Textrahmen; wenn nicht handelt es sich um einen "normalen Text-Character".

Als Beispiel kannst Du mal einen Textrahmen in einem Text verankern und dann den verankerten Rahmen markieren. Mit alert(app.selection[0].parent.pageItems[0].geometricBounds) erhälst Du die entsprechenden Werte und kannst diese ändern.


Matthias

Marginalien via Tags automatisch in Textrahmen verschieben

Imion
Beiträge gesamt: 141

14. Feb 2008, 10:40
Bewertung:

gelesen: 2644

Beitrag als Lesezeichen
Den Link habe ich gefunden und mich da durch gelesen. ;-)

Und dank der abschließenden Erklärung von zaphodbeeblebroxx habe ich es nun auch entgültig verstanden und nun funktioniert alles wie gewünscht.
Sogar Tabellen werden berücksichtigt.

Die Frage ist, ob das nicht sogar noch eleganter geht, aber ich habe eine Menge dabei gelernt, und das ist das wichtigste.

Danke für eure Hilfe.

Code
alignElements(app.selection[0]); 
function alignElements(elm)
{
if(elm.constructor.name == "TextFrame")
{
var i, int_anzPageItems, int_anzTables, objectHeight;
int_anzPageItems = 0;
int_anzTables = 0;
for(i = 0; i < elm.characters.length; i++)
{
try
{
if(elm.characters[i].pageItems[0].geometricBounds)
{
$.writeln (elm.characters[i].pageItems[0].geometricBounds);
if(objectHeight)
{
elm.pageItems[int_anzPageItems].anchoredObjectSettings.anchorYoffset = objectHeight;
objectHeight = elm.pageItems[int_anzPageItems].geometricBounds[2] - elm.pageItems[int_anzPageItems].geometricBounds[0] + objectHeight;
}
else
{
objectHeight = elm.pageItems[int_anzPageItems].geometricBounds[2] - elm.pageItems[int_anzPageItems].geometricBounds[0];
}
int_anzPageItems++;
}
}
catch(err)
{
$.writeln(err);
}
try
{
if(elm.characters[i].tables[0])
{
//var test = elm.characters[i].parent.tables[int_anzTables];
$.writeln (elm.characters[i].tables[0].height);
var test = elm.characters[i].tables[0];
if(objectHeight)
{
elm.characters[i].tables[0].spaceBefore = objectHeight;
objectHeight = elm.characters[i].tables[0].height
}
else
{
objectHeight = elm.characters[i].parent.tables[int_anzTables].height
}
int_anzTables++;
}
}
catch(err)
{
$.writeln(err)
}
}
}
else
{
alert("Ausgewähltes Element ist kein Textrahmen.");
}
alert("Fertig");
}

---------------------------------------------------------------------------------
Creative Suite CS3 Design Premium auf MacBook Core 2 Duo 2,4 GHz und 4 GB Ram mit Mac OS X 10.6.1