Antworten auf deine Fragen:
Neues Thema erstellen

Ungültige Objekte bei Scripten für ID

lobsterbake

Nicht mehr ganz neu hier

Ohne lange Einleitung: wieso tritt im folgenden Script ein Fehler auf?

PHP:
var mytextframe = app.activeDocument.stories.firstItem().textFrames.firstItem();
alert (mytextframe); // -> object textframe
var mywords = mytextframe.words;
alert (mywords) // -> objekt ist ungültig
Momentan soll der Script, der nach dem letzten Wort eines Textrahmen eine bes. Glyphe einfügt (black-right-pointing-triangel aus Minion).
Meine Scripting Kenntnisse sind bescheiden und beschränken sich eher auf den Zusammenhang mit Indesign. Ich bin dankbar für jede Hilfe - weil ich es nicht verstehe, weshalb der Fehler auftritt und was er bedeutet.
 

Design & Layout

AW: Ungültige Objekte bei Scripten für ID

Du solltest dir zwei grundsätzliche Fragen stellen:
1) Brauche ich dafür ein Skript?
2) Wenn Skript, dann: Willst du mit dem Cursor arbeiten oder (früher oder später die Textrahmen der Reihenfolge nach durchgehen und Texte ersetzen bzw. einfügen?

zu 1) Diese Aufgabenstellung könnte man auch einfach mit einem verschachteltem Absatzformat lösen. Oder per GREP.
zu 2) Einfügen kann man nur an einem Einfügepunkt (insertionPoint). Du kannst zwar Wörter ansprechen, aber dann kannst du „nur“ entweder alle angesprochenen Wörter oder ein bestimmtes Wort oder mehrere bestimmte Wörter ersetzen. Oder du liest alle Wörter, oder ein bestimmtes Wort oder mehrere bestimmte Wörter über eine Schleife aus und fügst dem ausgelesenen Inhalt einen zusätzlichen Inhalt an.
Wenn du den Cursor in einem Textrahmen stehen hast, dann „befüllst“ du den vorletzten Einfügepunkt (also vor der Absatzmarke) des ersten Absatzes dieses Textrahmens mit
PHP:
app.selection[0].paragraphs[0].insertionPoints[-2].contents = ' Letzter'
 

lobsterbake

Nicht mehr ganz neu hier

AW: Ungültige Objekte bei Scripten für ID

Ja, eine Schleife. Weil in allen bis auf den letzten Textframe eine Story das 'nach rechts zeigende Dreieck' eingefügt werden soll. Und in den letzten ein Quadrat.
In einer früheren Versuch hat das so halbwegs ohne Probleme funktioniert:
PHP:
app.activeDocument.textFrames.everyItem().words.lastItem(-1).insertionPoints.item(0).contents = "\u0008" + "\u25B6" + "\u000D" ;
In zweiten Versuch wollte ich über die Textabschnitte gehen. Weil ich denke dass man so leichter zwischen dem letzten und den übrigen Textframes eines Textabschnitts/Story unterscheiden kann. Da tritt aber das Problem mit dem ungültigen Objekt auf. Wieso?

Danke für deinen Vorschlag pixxxelschubser - ich hatte ja nicht erwähnt, dass ich auch schon eine Lösung gefunden hatte - mit der ich aber nicht ganz zufrieden bin. :)
 

lobsterbake

Nicht mehr ganz neu hier

AW: Ungültige Objekte bei Scripten für ID

jetzt hab ich auch eine Schleife. Das Problem hab ich durch eine andere Adressierung (richtige Bezeichnung?) gelöst.

PHP:
var mylenght = app.selection[0].parentStory.textContainers.length;
for ( myCounter = 0 ; myCounter <= mylenght - 2; myCounter++)
{
app.selection[0].parentStory.textContainers[myCounter].words.lastItem(-1).insertionPoints.item(0).contents = "\u0008" + "\u25B6" + "\u000D" ;
}
app.selection[0].parentStory.characters.lastItem().insertionPoints.item(+1).contents = "\u0008" + "\u25A0"
wenn jemand noch Ideen hat...
 
Zuletzt bearbeitet:
AW: Ungültige Objekte bei Scripten für ID

Welche Ideen könntest du meinen?
:uhm:

Dein Skript scheint doch zu funktionieren. Allerdings ist jetzt die Frage, ob und wie oft du es (ausschliesslich?) allein verwendest?
Wenn es von mehreren genutzt werden soll, dann müssten noch einige Abfragen eingebaut werden: Dokument geöffnet?, Textrahmen vorhanden?, Auswahl aktiv?, was ist ausgewählt? (also DAU-sicher machen ;))

Für eine alleinige Nutzung würde ich das Skript um zwei Punkte erweitern:
- (den jeweils letzten Absätzen) je ein verschachteltes Absatzformat zuweisen, damit die Formatierung direkt nach dem Einfügen greift. (in der Art: normaler Text über 1 "Zeilenspalter", Minion Pro in deiner Wunschfarbe und -größe bis Absatzende)
- und da die einzufügenden Zeichen deinen Umbruch verändern, sich aber auch bei Umbruchänderungen in den nächsten Textrahmen verschieben können, würde ich noch eine Abfrage und ein Löschen eventuell bereits vorhandener Zeichenfolgen "\u0008" + "\u25B6" + "\u000D" und "\u0008" + "\u25A0" einbauen. Dadurch kann das Skript zuerst prüfen, ob diese Zeichenfolgen bereits vorhanden sind, wenn ja, löschen und neu einpflegen.
Das ist zum Beispiel beim Einfügen von zusätzlichem Text oder auch bei einer Formatierungsänderung mit daraus resultierenden anderem Umbruch sehr nützlich. --> Denn dann müsstest du einfach nur das Skript neu „drüber laufen lassen“.
;)

btw:
- Könntest du einmal einen Screenshot mit ein paar Beispielseiten zeigen?
- Sind deine Textrahmen verkettet?
- Gibt es mehrere (eventuell verkettete) Textrahmen auf einer Seite?
- Existieren Bildunterschriften/ Marginalien/Fußnoten o.ä?
- Welche ID-Version benutzt du?
- Was hat an deinem ersten Skriptschnipsel nicht mehr so funktioniert, wie du es wolltest?


uhm:
 

lobsterbake

Nicht mehr ganz neu hier

AW: Ungültige Objekte bei Scripten für ID

ein Löschen eventuell bereits vorhandener Zeichenfolgen "\u0008" + "\u25B6" + "\u000D" und "\u0008" + "\u25A0" einbauen. Dadurch kann das Skript zuerst prüfen, ob diese Zeichenfolgen bereits vorhanden sind
- Ja genau hab ich dann beim aktiven Nutzen des Scripts auch schnell gemerkt, dass er ohne "Säubern Funktion" ein bisschen unpraktisch ist. ;)
In dem Ansatz in dem ich alle textframes eines Dokument angesprochen haben, wurde das Zeichen ja in jeden textframe (also z.B. auch Inhaltsverzeichnisse u.s.w) eingefügt. Über ParentStory nur in alle Textframes einer Story.
Im Script wird vlt. klarer was ich meine . Jetzt hab ich auch - mit ein bisschen Hilfe - ein paar feine Regeln eingefügt, durch die der Leser durch die Seiten des Artikels geführt wird, indem die Richtungszeichen nur da eingefügt werden, wo es meiner Meinung nach sinnvoll ist. :)

PHP:
/**
 Typographische_Leserführung.jsx 
*/


var myStory = app.selection[0].parentStory;
var Länge = myStory.textContainers.length
var myDreieck = "\u0008" + "\u25B6" + "\u000D" // Zeichen für den Verweis auf die Fortführung des Artikels
var myViereck =  "\u0008" + "\u25A0" // Endzeichen

//Säubert das Dokument um doppelte typographische Leserführungszeichen zu vermeiden.
//Zunächst werden die Voreinstellungen für die Textsuche zurückgesetzt
app.findTextPreferences = NothingEnum.nothing;
app.changeTextPreferences = NothingEnum.nothing;
app.findChangeTextOptions.caseSensitive = false;
app.findChangeTextOptions.includeFootnotes = false;
app.findChangeTextOptions.includeHiddenLayers = false;
app.findChangeTextOptions.includeLockedLayersForFind = false;
app.findChangeTextOptions.includeLockedStoriesForFind = false;
app.findChangeTextOptions.includeMasterPages = false;
app.findChangeTextOptions.wholeWord = false;
//löscht ein möglicherweiße vorhandenes weiterführende Dreieck
app.findTextPreferences.findWhat = myDreieck;
app.changeTextPreferences.changeTo = "";
myStory.changeText();
app.findTextPreferences = NothingEnum.nothing;
app.changeTextPreferences = NothingEnum.nothing;
//löscht ein möglicherweiße vorhandenes Endzeichen
app.findTextPreferences.findWhat = myViereck;
app.changeTextPreferences.changeTo = "";
myStory.changeText();
app.findTextPreferences = NothingEnum.nothing;
app.changeTextPreferences = NothingEnum.nothing;


// Einfügen der typographische Leserführungszeichen, wenn Voraussetzungen erfüllt

for (var myCounter = 0 ; myCounter < Länge -1  ; myCounter++)

{ 
    
 if  ( myStory.textContainers[myCounter].parentPage.documentOffset < myStory.textContainers[myCounter+1].parentPage.documentOffset  )
{ 
    if ( myStory.textContainers[myCounter].parentPage.side == 1818653800)
    
    { if (  myStory.textContainers[myCounter+1].parentPage.side == 1818653800)
        
   { app.selection[0].parentStory.textContainers[myCounter].words.lastItem(-1).insertionPoints.item(0).contents = myDreieck } 
   }
    if ( myStory.textContainers[myCounter].parentPage.side == 1919382632)
    { app.selection[0].parentStory.textContainers[myCounter].words.lastItem(-1).insertionPoints.item(0).contents = myDreieck }
}
}
app.selection[0].parentStory.characters.lastItem().insertionPoints.item(+1).contents = myViereck
DAU-Sicher klingt gut, insbesondere weil ich den Script nicht allein benutzten werde. Ich muss mich aber erst mal damit beschäftigen, wie man das macht. Verschachteltes Absatzformat hat momentan erst mal Vorrang - danke für die Idee.
 
AW: Ungültige Objekte bei Scripten für ID

:D
Woher kam die Hilfe (wenn man fragen darf)?
Das FindChangeByText-Skript hast du ja wahrscheinlich nicht selbst gefunden bzw. eingepflegt.

Arbeitest du mit CS4?
Da das Skript in CS3 lediglich Fehler erzeugt und in CS5 nur das Schlussquadrat setzt?
 

lobsterbake

Nicht mehr ganz neu hier

AW: Ungültige Objekte bei Scripten für ID

Ja, den findchangebytext script hab ich in der scripting anleitung von adobe gefunden und dann ein bisschen angepasst. Hilfe hatte ich von einem Kollegen bei den Kontrollstrukturen, insofern als das ich nicht wusste wie man die Entscheidungsregeln logisch als code hinschreibt. Ich benutze CS5. Eigentlich sollte der Script da wunderbar funktionieren. Dreiecke werden auch nur in den letzte texframe auf der rechten Seite einer verketten Story eingefügt (also wenn dann noch was kommt). Oder aber auf der rechten seite, wenn der lesefluss durch fehlenden text auf der linken Seite (z.B. wegen einem ganzseitigem bild) unterbrochen wird und auf der nächsten linken seite fortgesetzt wird. Ein Viereck wird eingefügt wenn die Story zu Ende ist.
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.635
Beiträge
1.538.481
Mitglieder
67.559
Neuestes Mitglied
hanuta
Oben