hilfdirselbst.ch
Facebook Twitter gamper-media
iduser S
Beiträge: 106
5. Okt 2013, 10:31
Beitrag #1 von 11
Bewertung:
(3616 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Absätze in Pfade konvertieren


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
Top

Anhang:
 
X
Gerald Singelmann  M  p
Beiträge: 6178
5. Okt 2013, 11:14
Beitrag #2 von 11
Beitrag ID: #518098
Bewertung:
(3594 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Absätze in Pfade konvertieren


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.)


--------------------------

InDesign-Wissen und Automatisierung nicht nur rund um die Suite.

http://www.cuppascript.com
als Antwort auf: [#518093]
(Dieser Beitrag wurde von Gerald Singelmann am 5. Okt 2013, 11:14 geändert)
Top
 
iduser S
Beiträge: 106
5. Okt 2013, 19:36
Beitrag #3 von 11
Beitrag ID: #518116
Bewertung:
(3548 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Absätze in Pfade konvertieren


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)
Top
 
Gerald Singelmann  M  p
Beiträge: 6178
5. Okt 2013, 21:01
Beitrag #4 von 11
Beitrag ID: #518118
Bewertung:
(3521 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Absätze in Pfade konvertieren


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.

:)
--------------------------

InDesign-Wissen und Automatisierung nicht nur rund um die Suite.

http://www.cuppascript.com
als Antwort auf: [#518116] Top
 
iduser S
Beiträge: 106
5. Okt 2013, 23:54
Beitrag #5 von 11
Beitrag ID: #518122
Bewertung:
(3492 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Absätze in Pfade konvertieren


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)
Top

Anhang:
 
WernerPerplies
Beiträge: 2201
6. Okt 2013, 09:44
Beitrag #6 von 11
Beitrag ID: #518125
Bewertung:
(3454 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Absätze in Pfade konvertieren


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.

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler 15.06.2018, Version 1.75, neue Funktionen
Aktuelles
XING
als Antwort auf: [#518116] Top
 
iduser S
Beiträge: 106
6. Okt 2013, 11:25
Beitrag #7 von 11
Beitrag ID: #518129
Bewertung:
(3432 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Absätze in Pfade konvertieren


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] Top
 
WernerPerplies
Beiträge: 2201
6. Okt 2013, 12:04
Beitrag #8 von 11
Beitrag ID: #518130
Bewertung:
(3416 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Absätze in Pfade konvertieren


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.

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler 15.06.2018, Version 1.75, neue Funktionen
Aktuelles
XING
als Antwort auf: [#518129]
(Dieser Beitrag wurde von WernerPerplies am 6. Okt 2013, 12:24 geändert)
Top
 
iduser S
Beiträge: 106
6. Okt 2013, 12:32
Beitrag #9 von 11
Beitrag ID: #518132
Bewertung:
(3402 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Absätze in Pfade konvertieren


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)
Top
 
WernerPerplies
Beiträge: 2201
6. Okt 2013, 12:50
Beitrag #10 von 11
Beitrag ID: #518134
Bewertung:
(3389 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Absätze in Pfade konvertieren


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.

Einen schönen Tag wünscht

Werner Perplies
Auftragsprogrammierung und Skripte für Adobe InDesign
neu: WpsProjectHandler 15.06.2018, Version 1.75, neue Funktionen
Aktuelles
XING
als Antwort auf: [#518132] Top
 
iduser S
Beiträge: 106
6. Okt 2013, 15:58
Beitrag #11 von 11
Beitrag ID: #518143
Bewertung:
(3338 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Absätze in Pfade konvertieren


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] Top
 
X