[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Absätze in Pfade konvertieren

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Print/Bildbearbeitung - Photos, Layout, Design
Themen
Beiträge
Moderatoren
Letzter Beitrag

Absätze in Pfade konvertieren

iduser
Beiträge gesamt: 107

5. Okt 2013, 10:31
Beitrag # 1 von 11
Bewertung:
(4097 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,
ich habe eine Frage bezüglich der Konvertierung in Pfade.
Der Ausgang soll eine zweizeilige mathematische Formel über zwei Zeilen bzw. Absätze sein (unterschiedlich mit einem harten und weichen Umbruch getrennt). Diese soll in Pfade gewandelt werden.
Im Anhang ist eine Datei die den Sachverhalt etwas verdeutlichen soll. Ausgewählt sind die kompletten zwei Zeilen inkl. Absatzmarke.

Im ersten Fall:
Code
app.selection[0].createOutlines(true); 

wird jede Zeile einzeln in Pfade gewandelt (eventuelle Leerräume am Anfang und Ende der Zeile, zur Ausrichtung der Formel werden nicht berücksichtigt)

Im zweiten Fall:
Code
app.selection[0].createOutlines(false); 

werden die zwei Zeilen in ein Objekt zusammengefasst/gruppiert, jedoch nicht verankert über den Text gelegt.

Ziel ist es nur ein Objekt/eine Gruppe (wie im zweiten Fall) zu haben, welche aber im Text verankert ist.

Ist dies mit der Funktion createOutlines() machbar oder gibt es noch einen einfacheren Weg als die Gruppe aus dem 2. Fall per Skript an der entsprechenden Stelle im Text zu verankern?

Philipp

Anhang:
Outlines-test.idml (152 KB)
X

Absätze in Pfade konvertieren

Gerald Singelmann
  
Beiträge gesamt: 6269

5. Okt 2013, 11:14
Beitrag # 2 von 11
Beitrag ID: #518098
Bewertung:
(4075 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Das ist wie in der GUI. Text wird zeilenweise in Pfade umgewandelt.

Es gibt verschiedene Wege, zum Ziel zum kommen.

Ohne es selbst ausprobiert zu haben, halte ich folgenden für plausibel:

  1. Mit createOutline(false) umwandeln und das Ergebnis der Umwandlung in Variable speichern

  2. Der Auswahl (also dem Text) die Farbe "Keine" zuweisen. Dadurch ändert sich der Umbruch nicht.

  3. Ergebnis der Umwandlung verankern am ersten insertionPoint der Auswahl. (Nicht einfügen.)




als Antwort auf: [#518093]
(Dieser Beitrag wurde von Gerald Singelmann am 5. Okt 2013, 11:14 geändert)

Absätze in Pfade konvertieren

iduser
Beiträge gesamt: 107

5. Okt 2013, 19:36
Beitrag # 3 von 11
Beitrag ID: #518116
Bewertung:
(4029 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Herr Singelmann,
vielen Dank für Ihre Antwort. An eine ähnliche Vorgehensweise habe ich auch gedacht. Der 2. Schirtt ist sehr trickreich :). Die Erhaltung der Textteile ist jedoch nicht nötig (Umbruchänderungen können geschehen, da es ein epub-export wird)

So hab ich es bisher.
Zitat var _sel = app.selection[0];
var _oldSelect = _sel;
var _newObject = _sel.createOutlines(false);

app.select(_newObject);
app.cut();
app.select(_oldSelect.paragraphs.itemByRange(_oldSelect.characters[0], _oldSelect.characters[-2]));// Damit die Absatzmarke nicht mit ersetzt wird
app.paste();


Eine Frage habe ich noch. Schritt 3 hätte ich wie oben mit cut() and paste() realisiert. Nun haben Sie aber geschrieben "Nicht einfügen". Könnten Sie mir bitte noch einen kleinen Tip geben, wie man das Objekt verankert ohne es auszuschneiden und wieder einzufügen?

Danke für die schnelle Hilfe
Philipp


als Antwort auf: [#518098]
(Dieser Beitrag wurde von iduser am 5. Okt 2013, 19:52 geändert)

Absätze in Pfade konvertieren

Gerald Singelmann
  
Beiträge gesamt: 6269

5. Okt 2013, 21:01
Beitrag # 4 von 11
Beitrag ID: #518118
Bewertung:
(4002 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Zitat Nun haben Sie aber geschrieben "Nicht einfügen". Könnten Sie mir bitte noch einen kleinen Tip geben, wie man das Objekt verankert ohne es auszuschneiden und wieder einzufügen?


Entschuldigung, das war in Ihrem Kontext Unsinn.
Das sieht alles OK aus.

:)


als Antwort auf: [#518116]

Absätze in Pfade konvertieren

iduser
Beiträge gesamt: 107

5. Okt 2013, 23:54
Beitrag # 5 von 11
Beitrag ID: #518122
Bewertung:
(3973 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
ok, hätte ja sein können, dass es noch eine ressourcenschonendere Variante geben könnte :)

Eine weitere Frage stellt sich mir gerade. Es kann vorkommen, dass am Anfang oder Ende der Zeile ein verankertes Objekt vorkommt (Icon) wenn dieses in der Auswahl inbegriffen ist, so wird dieses mit in die Gruppierung eingebettet.

Nun dachte ich, dass ich mit nachfolgendem Code die Auswahl verringern kann.

Code
var _sel = app.selection[0]; 

if(_sel.characters[0].contents == String.fromCharCode(0xFFFC))
// Objektanker am Anfang der 1. Zeile soll
_sel = _sel.texts.itemByRange(_sel.characters[1], _sel.characters[-1]); abgewählt werden
if(_sel.characters[-2].contents == String.fromCharCode(0xFFFC))
// Objektanker am Ende der letzten Zeile soll abgewählt werden
_sel = _sel.texts.itemByRange(_sel.characters[0], _sel.characters[-3]);
if(_sel.characters[-1].contents == String.fromCharCode(0xD))
// Absatzmarke in letzter Zeile soll abgewählt werden
_sel = _sel.texts.itemByRange(_sel.characters[0], _sel.characters[-2]);

var _newObject = _sel.createOutlines(false);
app.select(_newObject);
app.cut();
app.select(_sel);
app.paste();


Das funktioniert auch soweit, jedoch kann ich dann das neue Objekt (die Gruppe) nicht mehr auswählen und es erscheint die Fehlermeldung: "Ungültiger Wert für Parameter 'selectableItems' der Methode 'select'... gEnum enumerator or SelectAll enumerator erwartet, aber (()) erhalten".

Kann mir dies bitte jemand erklären?

Im Anhang ist nochmal eine Datei.
Der oben genannte Code ist nur beispielhaft, später soll es dann in einer Schleife mehrere Absätze durchlaufen, sodass die manuelle Demakierung der Anker nicht in Frage kommt ;)


als Antwort auf: [#518118]
(Dieser Beitrag wurde von iduser am 5. Okt 2013, 23:56 geändert)

Anhang:
Outlines-test2.idml (71.9 KB)

Absätze in Pfade konvertieren

WernerPerplies
Beiträge gesamt: 2762

6. Okt 2013, 09:44
Beitrag # 6 von 11
Beitrag ID: #518125
Bewertung:
(3935 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Philipp,

Zitat Könnten Sie mir bitte noch einen kleinen Tip geben, wie man das Objekt verankert ohne es auszuschneiden und wieder einzufügen?

Das funktioniert erst ab einer bestimmten InDesignversion (CS6?), deshalb verwende ich eine Funktion, die versionsunabhängig funktionieren sollte.
Anwendung für Dein Beispiel:
Code
#target indesign 
main();

function main()
{
try
{
// selektierter Absatz
var selected = app.selection[0]
if (selected.constructor.name!="Paragraph")
throw new Error("Kein Absatz ausgewählt!");
// selektiert den Text bis zum Absatzumbruch
var sel = selected.paragraphs.itemByRange(selected.characters[0], selected.characters[-2]);
// wandelt den Text in eine Gruppe mit Outlines um
var newObject = sel.createOutlines(false);
// löscht den Absatz_inhalt_
sel.remove();
// keine Ahnung warum, aber es funktioniert weder die direkte Übergabe des neuen Objektes,
// noch die direkte Selektion, deshalb
anchorThis(app.activeDocument.groups[-1], sel.insertionPoints[0]);
function anchorThis(/*object*/toAnchor, /*InsertionPoint*/ip, /*enum*/anchorPosition, /*enum*/anchorPoint)
{
if ((toAnchor.hasOwnProperty ("anchoredObjectSettings")) &&
(toAnchor.anchoredObjectSettings.hasOwnProperty ("insertAnchoredObject")))
{
// Funktion ist von der InDesignversion abhängig!
if (anchorPosition==null) anchorPosition = AnchorPosition.INLINE_POSITION;
if (anchorPoint==null) anchorPoint = AnchorPoint.BOTTOM_RIGHT_ANCHOR;
toAnchor.anchoredObjectSettings.insertAnchoredObject(ip, anchorPosition);
toAnchor.anchoredObjectSettings.anchorPoint = anchorPoint;
}
else
{
// alernativ copy and paste Lösung
toAnchor.select();
app.cut();
ip.select();
app.pasteInPlace();
toAnchor = app.selection[0].parent.textFrames[0];
}
return toAnchor;
}
}
catch (error)
{
alert(error.message+"\n"+error.line);
}
}

Ich hoffe, das ich alles richtig umgesetzt habe.


als Antwort auf: [#518116]

Absätze in Pfade konvertieren

iduser
Beiträge gesamt: 107

6. Okt 2013, 11:25
Beitrag # 7 von 11
Beitrag ID: #518129
Bewertung:
(3913 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Herr Perplies,
vielen Dank für die
Antwort auf: // keine Ahnung warum, aber es funktioniert weder die direkte Übergabe des neuen Objektes,
// noch die direkte Selektion
, deshalb
anchorThis(app.activeDocument.groups[-1], sel.insertionPoints[0]);

Genau, das verstehe ich auch nicht.
Aber die Lösung, die zuletzt erstellte Gruppe auszuwählen finde ich sehr gut und es funktioniert :)
Ist die zuletzt erstellte Gruppe immer diese "app.activeDocument.groups[-1]", völlig gleichgültig an welcher Stelle im Dokument sie hinzugefügt wird?

Danke für den Hinweis, dass die Objekte auch ohne cut-paste-Prozedur verankert werden können.

In der Testversion (CS6) erscheint bei mir nur folgende Fehlermeldung: Ungültiger Wert für Parameter "StoryOffset" der Methode "insertAnchoredObject"... Aber normalerweise sollte vor der Absatzmarke in der Variable "sel" ein Einfügepunkt vorhanden sein.

Das werde ich bei Gelegenheit näher Anschauen. Momentan arbeite ich mit der ID-Version 7.5 (CS5.5)

Vielen Dank für die sehr hilfreichen Antworten und die Aufwendung der damit verbundenen Zeit.

Testweise funktionierte es nun auch mit diesem Code:
Code
var _sel = app.selection[0];  

if(_sel.characters[0].contents == String.fromCharCode(0xFFFC))
// Objektanker am Anfang der 1. Zeile soll abgewählt werden
_sel = _sel.texts.itemByRange(_sel.characters[1], _sel.characters[-1]);
if(_sel.characters[-2].contents == String.fromCharCode(0xFFFC))
// Objektanker am Ende der letzten Zeile soll abgewählt werden
_sel = _sel.texts.itemByRange(_sel.characters[0], _sel.characters[-3]);
if(_sel.characters[-1].contents == String.fromCharCode(0xD))
// Absatzmarke in letzter Zeile soll abgewählt werden
_sel = _sel.texts.itemByRange(_sel.characters[0], _sel.characters[-2]);

var _newObject = _sel.createOutlines(false);
app.activeDocument.groups[-1].select();
app.cut();
app.select(_sel);
app.paste();


Philipp


als Antwort auf: [#518125]

Absätze in Pfade konvertieren

WernerPerplies
Beiträge gesamt: 2762

6. Okt 2013, 12:04
Beitrag # 8 von 11
Beitrag ID: #518130
Bewertung:
(3897 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Herr ?;-),

Zitat Ist die zuletzt erstellte Gruppe immer diese "app.activeDocument.groups[-1]", völlig gleichgültig an welcher Stelle im Dokument sie hinzugefügt wird?

Das weiß ich nicht, aber ich vermute es.
Noch sicherer wäre es, sich eine Gruppensammlung zu suchen, die näher dran liegt, z. B. Page.groups.
Zitat In der Testversion (CS6) erscheint bei mir nur folgende Fehlermeldung: Ungültiger Wert für Parameter "StoryOffset" der Methode "insertAnchoredObject"... Aber normalerweise sollte vor der Absatzmarke in der Variable "sel" ein Einfügepunkt vorhanden sein.

Das verstehe ich jetzt nicht, ich habe es hier mit CS6 getestet. Die Ursache müsste damit wohl bei der Testdatei liegen.
Könnten Sie mir Ihre Datei zur Verfügung stellen?
Zitat Vielen Dank für die sehr hilfreichen Antworten und die Aufwendung der damit verbundenen Zeit.

Gerne, ich lerne zu jeder Zeit gerne etwas hinzu, und das geht am Besten, in dem man gestellte Aufgaben löst. ;-)
Ihre Version habe ich hier auch ausprobiert, sie erscheint mir aber irgendwie aufwändiger zu sein.

Ich habe mein Programm gerade auch mit der Version CS5.5 ausprobiert, auch in dieser Version funktioniert der Zweig ohne Copy und Paste.

Ich arbeite unter Windows, aber das sollte keine Rolle spielen.

Ergänzung:
ich habe gerade gesehen, dass Sie bereits eine Testdatei zur Verfügung gestellt haben, und damit verhält sich das Programm wirklich anders:
Das Object toAnchor.anchoredObjectSettings ist zwar vorhanden, aber ungültig!
Bei meiner Datei (einfacher Text) ist das Object gültig.


als Antwort auf: [#518129]
(Dieser Beitrag wurde von WernerPerplies am 6. Okt 2013, 12:24 geändert)

Absätze in Pfade konvertieren

iduser
Beiträge gesamt: 107

6. Okt 2013, 12:32
Beitrag # 9 von 11
Beitrag ID: #518132
Bewertung:
(3883 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Die Testdatei habe ich in einem der vorherigen Posts angehängt (Outlines-test2.idml). Der Fehler kam nun auch in CS5.5.

Die 2 ersten If-Abfragen sollten eventuelle icons (verankertes Objekt), welche auftreten können, am Anfang und Ende der Auswahl entfernen. Die dritte Abfrage entfernt die Absatzmarke falls vorhanden (Formel kann ja auch am Ende des Textrahmens stehen)
Die cut-paste-Prozedur ist annähernd die gleiche.
Ich habe nun bei mir noch eine Unterscheidung zwischen mehr- und einzeiligen Auswahlen getroffen. Bei einer Zeile kann man dann der Funktion createOutlines() den Wert "true" übergeben und man spart sich den Rest.

Mit freundlichen Grüßen
Philipp Kern ;)

PS: Bei mir läufts auch auf Windows :)


als Antwort auf: [#518130]
(Dieser Beitrag wurde von iduser am 6. Okt 2013, 12:43 geändert)

Absätze in Pfade konvertieren

WernerPerplies
Beiträge gesamt: 2762

6. Okt 2013, 12:50
Beitrag # 10 von 11
Beitrag ID: #518134
Bewertung:
(3870 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Herr Kern,

Zitat Die Testdatei habe ich in einem der vorherigen Posts angehängt (Outlines-test2.idml). Der Fehler kam nun auch in CS5.5.


Ja, und es sieht so aus, dass das Objekt, das durch CreateOutlines entsteht je nach Input ein mehr oder weniger vollständiges Objekt ist.

So kann zum Beispiel das aus Ihren Daten erzeugte Objekt und über app.activeDocument.groups[-1] referenzierte Object nicht dupliziert werden.

Das sieht für mich alles nach einem Bug aus.


als Antwort auf: [#518132]

Absätze in Pfade konvertieren

iduser
Beiträge gesamt: 107

6. Okt 2013, 15:58
Beitrag # 11 von 11
Beitrag ID: #518143
Bewertung:
(3819 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Herr Perplies,
das erzeugte Objekt kann über app.activeDocument.stories[1].groups[-1] angesprochen werden. Ich vermute, dass verankerte Gruppen nur über die Story ansprechbar sind. Nur "lose" Gruppen können mit app.activeDocument.groups referenziert werden. Da bei der Erzeugung mit createOutlines(false) eine "lose" Gruppe erzeugt wird, funktioniert es. Erst nachträglich wird sie durch das Ausschneiden und Einfügen verankert.

Aber nun gut. Mit den heutigen Erkenntnissen funktionierts vorübergehend :)

Vielen Dank nochmals
Philipp Kern


als Antwort auf: [#518134]
X