hilfdirselbst.ch
Facebook Twitter gamper-media

**********************************************
        Facelifting HDS: Danke für deine Unterstützung!

**********************************************


« « 1 2 » »  
Hans.Gruner S
Beiträge: 18
2. Nov 2009, 08:00
Beitrag #1 von 16
Bewertung:
(8895 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Höhe/Breite/Position per Script auslesen und neu zuweisen


Sehr geehrte JSX-Experten

Ich habe für unten beschriebenes Problem trotz langer Recherche noch keine passende Antwort gefunden. Daher wende ich mich, mit der Bitte um einen ersten Lösungsansatz, vertrauensvoll an Euch.

Voraussetzung: Mehrseitiges InDesign CS3 Dokument mit jeweils einer verknüpften Grafik (AI) pro Seite.
Problem: Die Eigenschaften einer fertig platzierten AI-Verknüpfung (X-Wert, Y-Wert, Breite, Höhe, Referenzpunkt) sollen auf eine Grafik auf einer anderen (selbst gewählten) Seite übertragen werden.
Theoretische Ablauf: erstes Objekt markieren --> Eigenschaften von erstem Objekt mit Skript zwischenspeichern --> zweites Objekt markieren --> zwischengespeicherte Eigenschaften aus erstem Objekt mittels Script zweitem Objekt zuweisen

Für eine Idee, wie die ausgelesenen Werte in einer zweiten Prozedur auf ein markiertes Objekt wieder angewendet werden können, wäre ich sehr dankbar.

Vielen Dank schon einmal allen, die sich meinem Problem annehmen.

Hans Gruner
Top
 
X
thahammer
Beiträge: 127
2. Nov 2009, 08:04
Beitrag #2 von 16
Beitrag ID: #413282
Bewertung:
(8888 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Höhe/Breite/Position per Script auslesen und neu zuweisen


Ich denke mal es wäre einfacher, wenn Diebeiden Objekte markiert wären und man per Script dann die Werte vom Objekt der ersten Seite (gemetricbounds) auf das Objekt der zweiten Seite zuweist.
als Antwort auf: [#413281] Top
 
Hans.Gruner S
Beiträge: 18
2. Nov 2009, 08:31
Beitrag #3 von 16
Beitrag ID: #413286
Bewertung:
(8882 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Höhe/Breite/Position per Script auslesen und neu zuweisen


Der Ansatz wäre sehr praktisch, nur leider sind die Objekte jeweils auf einer anderen Seite positioniert und damit nicht gleichzeitig zu markieren (oder ich habe die Option noch nicht entdeckt).

Vielen Dank für dieAntwort

Hans
als Antwort auf: [#413282] Top
 
Hans Haesler  M  p
Beiträge: 5580
2. Nov 2009, 08:37
Beitrag #4 von 16
Beitrag ID: #413287
Bewertung:
(8879 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Höhe/Breite/Position per Script auslesen und neu zuweisen


Hallo Hans,

es gibt zwei Probleme:
1. Wie "weiss" das Script, ob es nun speichern oder zuweisen soll?
2. Wo speichert man die Werte?

Zum ersten Punkt: Man könnte zwei Scripts entwickeln. Aber das wäre in der Anwendung weniger komfortabel.

Man könnte auch das Intervall zwischen den beiden Auswahlen prüfen: Ist es grösser, als der im Script eingestellte Wert (z.B. 5 Sekunden), dann werden die Attribute gespeichert. Ist der Unterschied kleiner, dann wird der Auswahl die gespeicherten Werte zugewiesen.

Dieser Trick wird im Script InAuswahlEinfuegen angewendet. http://www.fachhefte.ch / Link "JavaScripts", Ordner "mac_os_x_d" (oder "windows_d"), "indesign_cs3" (oder "indesign_cs4):

Zum zweiten Punkt: Weil die Werte nicht im JavaScript gespeichert werden können (im Gegensatz zu einem AppleScript), könnte man sie entweder in eine Textdatei schreiben oder mit "insertLabel" im Dokument unterbringen.

Gruss, Hans
als Antwort auf: [#413286] Top
 
Hans.Gruner S
Beiträge: 18
2. Nov 2009, 08:47
Beitrag #5 von 16
Beitrag ID: #413290
Bewertung:
(8849 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Höhe/Breite/Position per Script auslesen und neu zuweisen


Hallo Hans

Vielen Dank schon einmal für die schnelle Antwort:

zu 1. Das ich mit zwei Scripts leben muss, ist grundsätzlich ok. Denn besser zwei Scripts als Handarbeit.
zu 2. Leider bin ich in diesem Punkt noch zu unerfahren. Ich bin davon ausgegangen dass es globale Variablen gibt, die während der Laufzeit des Programms/der Datei Gültigkeit haben, was aber offenbar nicht der Fall ist. Daher finde ich Deinen Ansatz die Daten in eine Textdatei auszulagern sehr interessant. Jedoch versagen bei dieser Umsetzung meinen Fähigkeiten, da ich mich als Einsteiger (was das scripting betrifft) bezeichne.

Ein kleines Beispiel für zwei Werte sollte aber ausreichen um den Rest selbst heraus zu finden.

Vielen Dank aber dennoch für die grundsätzliche Idee!

Hans
als Antwort auf: [#413287] Top
 
Hans Haesler  M  p
Beiträge: 5580
2. Nov 2009, 09:10
Beitrag #6 von 16
Beitrag ID: #413293
Bewertung:
(8834 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Höhe/Breite/Position per Script auslesen und neu zuweisen


Hallo Hans,

zwei separate Scripts sind natürlich auch besser, wenn die Werte eines Musterrahmens auf viele weitere übertragen werden sollen.

Ein Beispiel zum Schreiben in eine Textdatei? Ich mache es so:

A. Speichern: Einen Array (= Liste) der Werte erstellen, diese Liste mit 'join("\r")' in eine Textkette verwandeln und das Ergebnis in eine Textdatei schreiben.
B. Einlesen: Die gespeicherte Datei in eine Variable lesen. Mit 'split("\r") in eine Liste verwandeln und dann dem Zielrahmen die Werte zuweisen.

Ein Beispielscript? Vielleicht TextSchatten.js, erhältlich hier: http://www.fachhefte.ch / Link "JavaScripts", Ordner "mac_os_x_d" (oder "windows_d"), "indesign_cs3".

Das erwähnte "insertLabel" ist aber auch interessant. Ein Beispiel findet sich im oben erwähnten InAuswahlEinfuegen. Nur sollte anstelle von 'app.insertLabel' eher 'curDoc.insertLabel' benutzt werden, weil das Übertragen im selben Dokument geschieht.

Gruss, Hans
als Antwort auf: [#413290] Top
 
Stephan_M S
Beiträge: 457
2. Nov 2009, 10:38
Beitrag #7 von 16
Beitrag ID: #413301
Bewertung:
(8802 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Höhe/Breite/Position per Script auslesen und neu zuweisen


Hi,
in dem Skript (smoothPathUI.jsx und scatterSelected202.jsx) könntest Du vielleicht was finden, das Du als Ansatz nehmen und Dir daraus was passendes basteln könntest. Ich speichere dort Objekteigenschaften in das CustomLabel des Objects und lese Sie später wieder aus und wende die Werte an - ein selbstgebasteltes Objekt-bezogenes UNDO.

http://www.hilfdirselbst.ch/foren/%5BJavascript%5D_Pfade_reduzieren___Pfade_Smoothen_P412494.html?sb=post_latest_reply;so=ASC;forum_view=forum_view_collapsed;;page=unread#unread

http://www.hilfdirselbst.ch/foren/Skript%3A_Per_Zufall_rotieren__bewegen__skalieren_P392645.html?search_string=scatter#392645

besten Gruß,
Stephan
als Antwort auf: [#413293]
(Dieser Beitrag wurde von Stephan_M am 2. Nov 2009, 10:40 geändert)
Top
 
Uwe Laubender S
Beiträge: 4039
2. Nov 2009, 12:02
Beitrag #8 von 16
Beitrag ID: #413329
Bewertung:
(8776 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Höhe/Breite/Position per Script auslesen und neu zuweisen


Hallo, Stephan!
Das mit dem selbstgebastelten Undo ist mir schon positiv aufgefallen. Toll! Und nachahmenswert. Werd's mir mal genauer ansehen.
*****
Mit herzlichem Gruß,
Uwe Laubender
als Antwort auf: [#413301] Top
 
Hans.Gruner S
Beiträge: 18
2. Nov 2009, 20:32
Beitrag #9 von 16
Beitrag ID: #413474
Bewertung:
(8741 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Höhe/Breite/Position per Script auslesen und neu zuweisen


Hallo Hans

Dank Deines Hinweises habe ich es schon einmal geschafft, die Eigenschaften in ein Textdatei zu schreiben. Vielleicht hast Du noch eine Idee für mich, wie ich (exemplarisch) einen Wert aus der Textdatei wieder einer Variale übergeben kann. In der Praxis würde ich nur die Werte (ohne vorangestellten Text) in die Datei schreiben. Ich bräuchte also einen Tipp wie ich eine ganze Zeile auslesen kann bzw. wie ich auf eine bestimmte zeile zugreifen kann.

Schon einmal vielen Dank

Hans

Code
 
// Prüfung: Ist ein Dokument geöffnet?
if (app.documents.length == 0) {
alert ("Es ist kein Dokument offen.", "Achtung");
exit();
}

// Variablen definieren
var myFile = new File("C:/Objektposition.txt");
var meinObjekt = app.selection[0];
var myBounds = meinObjekt.geometricBounds;

var myX = myBounds[1];
var myY = myBounds[0];
var myWidth = myBounds[3]-myBounds[1];
var myHeight = myBounds[2]-myBounds[0];
var myScaleVert = meinObjekt.absoluteVerticalScale;
var myScaleHori = meinObjekt.absoluteHorizontalScale;

// Werte in Textdatei schreiben
myFile.open('w', "TEXT", "R*ch");
myFile.writeln("Eigenschaft: \t" + "Wert");
myFile.writeln("X-Wert: \t" + myX);
myFile.writeln("Y-Wert: \t" + myY);
myFile.writeln("Width: \t" + myWidth);
myFile.writeln("Height: \t" + myHeight);
myFile.writeln("ScaleVerikal: \t" + myScaleVert);
myFile.writeln("ScaleHorizontal:\t" + myScaleHori);

myFile.close();

//Meldung
alert ("Export erfolgreich, jetzt Objekt zur Übertragung markieren", "Hinweis");

als Antwort auf: [#413293] Top
 
Hans Haesler  M  p
Beiträge: 5580
2. Nov 2009, 21:52
Beitrag #10 von 16
Beitrag ID: #413488
Bewertung:
(8733 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Höhe/Breite/Position per Script auslesen und neu zuweisen


Hallo Hans,

die Ideen habe ich ja oben schon angegeben: A. und B.. Und der entsprechende, funktionierende Code befindet sich im TextSchatten-Script.

Die Werte zeilenweise in die Datei zu schreiben ist möglich. Ich würde dies aber nur so machen, wenn die Werte in einer Schleife ermittelt und einzeln, als aktuelles Ergebnis des Umgangs, in die Datei geschrieben wird.

Wenn Deine Werte in der Datei gespeichert sind (aber, wie Du sagst, ohne Etiketten), kann man so vorgehen:
1. Die Datei in eine Variable lesen.
2. Mit 'split("\r") in eine Liste (= Array) verwandeln.
3. Den Variablen der Reihe nach die Elemente des Arrays zuweisen.

Angenommen, in der Datei ist Folgendes gespeichert ...

Code
20 
30
50
40
100
100

... dann wird die Variable (nennen wir sie "valString"), in welche die Datei gelesen wurde, dasselbe enthalten.

Jetzt diesen String in einen Array verwandeln ...

Code
var valList = valString.split("\r"); 


... und das Ergebnis sieht so aus:

Code
["20", "30", "50", "40", "100", "100"] 

Und so wird den Variablen der entsprechende Wert zugewiesen:

Code
var x1  = valList[0]; 
var y1 = valList[1];
var frW = valList[2];
var frH = valList[3];
var ySc = valList[4];
var xSc = valList[5];

Ich habe absichtlich andere Namen für die Variablen genommen, denn all dieses "my"-Zeugs sieht schlimm aus.

Gruss, Hans
als Antwort auf: [#413474] Top
 
Hans.Gruner S
Beiträge: 18
3. Nov 2009, 00:35
Beitrag #11 von 16
Beitrag ID: #413504
Bewertung:
(8709 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Höhe/Breite/Position per Script auslesen und neu zuweisen


Hallo Hans

Vielen Dank einmal wieder für Deine Tipps. Ich bin auf einem guten Weg, da ich jetzt auch die Textdatei auslesen kann. Allerdings klappt es mit dem Zerlegen in ein Array nach Deiner Vorlage noch nicht (siehe Script 2). Was mache ich hier falsch?

Danke für die unermüdliche Hilfe sagt Hans!

Script 1 (Eigenschaften in Textdatei schreiben)

Code
var myFile = new File("C:/Objektposition.txt"); 
var meinObjekt = app.selection[0];
var myBounds = meinObjekt.geometricBounds;

var myX = myBounds[1];
var myY = myBounds[0];
var myWidth = myBounds[3]-myBounds[1];
var myHeight = myBounds[2]-myBounds[0];

myFile.open('w', "TEXT", "R*ch");
myFile.writeln(myX);
myFile.writeln(myY);
myFile.writeln(myWidth);
myFile.writeln(myHeight);

myFile.close();


Script 2 (Eigenschaften aus Textdatei auslesen)

Code
var f = File ("C:/Objektposition.txt");  
f.open("r");
var valString = f.read();
f.close();

var valList = valString.split("\r");

var myX = valList[0];
var myY = valList[1];
var myWidth = valList[2];
var myHeight = valList[3];

alert (myX + ", " + myY + ", " + myWidth + ", " + myHeight);

als Antwort auf: [#413488] Top
 
Martin Fischer  M  p
Beiträge: 11808
3. Nov 2009, 08:01
Beitrag #12 von 16
Beitrag ID: #413521
Bewertung:
(8665 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Höhe/Breite/Position per Script auslesen und neu zuweisen


Hallo Hans,

statt die Daten in eine externe Datei zu schreiben könntest Du sie, wie Hans Haesler oben bereits hingewiesen hat, in einem Label (des Dokuments oder – dokumentübergreifend – der Anwendung) hinterlegen.

Halte Ausschau nach den Befehlen insertLabel() und extractLabel().

Etwa so:
Code
// 01_saveGeoBounds.jsx 

if (app.selection.length != 0 || app.selection[0].hasOwnProperty('geometricBounds'))
app.documents.firstItem().insertLabel('myGeoBounds', app.selection[0].geometricBounds.join('#'));


Code
// 02_restoreGeoBounds.jsx 

if (app.selection.length != 0 || app.selection[0].hasOwnProperty('geometricBounds'))
{
var myBounds = app.documents.firstItem().extractLabel('myGeoBounds').split('#');
for ( var i = 0; i < app.selection.length; i++ )
app.selection[i].geometricBounds = myBounds;
}


Viele Grüße
Martin
als Antwort auf: [#413504]
(Dieser Beitrag wurde von Martin Fischer am 3. Nov 2009, 08:05 geändert)
Top
 
Hans Haesler  M  p
Beiträge: 5580
3. Nov 2009, 08:54
Beitrag #13 von 16
Beitrag ID: #413528
Bewertung:
(8652 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Höhe/Breite/Position per Script auslesen und neu zuweisen


Hallo Hans,

zum Konvertieren des eingelesenen Strings mit 'split()' musst Du nur anstelle von "\r" ein "\n" verwenden.

Anstelle des zeilenweisen Schreibens in die Datei wäre es besser, alle Werte zuerst in einen String zu packen. Vorteil: Man kann den Trenner bestimmen. Das muss nicht unbedingt Return oder New Line sein. Ich verwende auch Zeichen wie "¶" (= Alt + 0182). Nach dem Einlesen verwendet man dasselbe Trenn-Zeichen.

Bitte versuche es auch mit den von Martin ebenfalls empfohlenen Labeln. Den entsprechenden Code findest Du im zuerst erwähnten Script InAuswahlEinfuegen.js. Aber wie gesagt, die Label ins Dokument schreiben ('curDoc' verwenden, statt 'app').

Gruss, Hans
als Antwort auf: [#413521] Top
 
Hans.Gruner S
Beiträge: 18
5. Nov 2009, 08:32
Beitrag #14 von 16
Beitrag ID: #413785
Bewertung:
(8597 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Höhe/Breite/Position per Script auslesen und neu zuweisen


Hallo Hans

Vielen Dank für Deine Tipps. Ich habe es (wenn auch aus Expertensicht nicht unbedingt ganz elegant) aber für mich ausreichend gelöst. Die Scripte machen genau das, was ich brauche. Hier der Vollständigkeit halber noch einmal der gesamte Code:

Skript 1: Objektdaten in Datei schreiben
Code
 
var myDoc = app.documents[0];
if (myDoc.saved == false)
{
alert("Achtung!\rBitte speichern Sie das Dokment zuerst!");
exit();
}
var myPath = myDoc.filePath + "/" + myDoc.name.split(".indd")[0] + '.txt';

var myFile = new File(myPath);
var meinObjekt = app.selection[0];
var myBounds = meinObjekt.geometricBounds;

var myX = myBounds[1];
var myY = myBounds[0];
var myWidth = myBounds[3]-myBounds[1];
var myHeight = myBounds[2]-myBounds[0];

myFile.open('w', "TEXT", "R*ch");
myFile.writeln(myX);
myFile.writeln(myY);
myFile.writeln(myWidth);
myFile.writeln(myHeight);

myFile.close();


Skript 2: Daten aus Datei auslesen und markiertem Objekt zuweisen
Code
 
var myDoc = app.documents[0];
if (myDoc.saved == false)
{
alert("Achtung!\rBitte speichern Sie das Dokment zuerst!");
exit();
}
var myPath = myDoc.filePath + "/" + myDoc.name.split(".indd")[0] + '.txt';

var f = File (myPath);
f.open("r");
var valString = f.read();
f.close();

var valList = valString.split("\n");

var myX = valList[0];
var myY = valList[1];
var myWidth = (valList[2]*1)+(myX*1);
var myHeight = (valList[3]*1)+(myY*1);

var meinObjekt = app.selection[0];
meinObjekt.geometricBounds = [myY,myX,myHeight,myWidth]
meinObjekt.fit(FitOptions.contentToFrame);


Nochmal vielen Dank!

Hans
als Antwort auf: [#413528] Top
 
Duplex p
Beiträge: 62
26. Jul 2017, 20:50
Beitrag #15 von 16
Beitrag ID: #558765
Bewertung:
(2486 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Höhe/Breite/Position per Script auslesen und neu zuweisen


Hallo,

für meine Aufgabenstellung (die Positionen von mehreren platzierten Rahmen auslesen) würde das erste Skript evtl. funktionieren. Leider liest es aber nur die Eigenschaften des aktuell aktivierten Rahmens aus. Wäre es ohne großen Aufwand möglich, dass die Positionen aller aktivierter leerer Rahmen in eine Textdatei geschrieben werden?

Vielen Dank für Eure Hilfe.
Annett
als Antwort auf: [#413785] Top
 
« « 1 2 » »  
X