[GastForen Programme Print/Bildbearbeitung Adobe InDesign Scripting Hilfe? - Smartes Ankerpunkt wählen

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

Scripting Hilfe? - Smartes Ankerpunkt wählen

Stephan_M
Beiträge gesamt: 480

23. Jan 2008, 18:56
Beitrag # 1 von 4
Bewertung:
(16292 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Scripter,

Ich bin faul, und darum möcht ich den Ankerpunkt per Tastaturkürzel wählen können. Darum habe ich mir 9 Scripts gemacht die jeweils aus einer dieser Zeilen bestehen.
Die Zeile habe ich mir übrigens aus dem Forum gefischt. (Singelmann sei wiedermal dank - muss mir mal sein Buch kaufen) ;)

Code
app.layoutWindows[0].transformReferencePoint = AnchorPoint.TOP_RIGHT_ANCHOR; 
app.layoutWindows[0].transformReferencePoint = AnchorPoint.RIGHT_CENTER_ANCHOR;
app.layoutWindows[0].transformReferencePoint = AnchorPoint.BOTTOM_RIGHT_ANCHOR;
app.layoutWindows[0].transformReferencePoint = AnchorPoint.TOP_CENTER_ANCHOR;
app.layoutWindows[0].transformReferencePoint = AnchorPoint.CENTER_ANCHOR;
app.layoutWindows[0].transformReferencePoint = AnchorPoint.BOTTOM_LEFT_ANCHOR;
app.layoutWindows[0].transformReferencePoint = AnchorPoint.TOP_LEFT_ANCHOR;
app.layoutWindows[0].transformReferencePoint = AnchorPoint.LEFT_CENTER_ANCHOR;
app.layoutWindows[0].transformReferencePoint = AnchorPoint.TOP_RIGHT_ANCHOR;


Die 9 Skripte habe ich mir auf 9 Tasten gelegt und nun kann ich bequem den Ankerpunkt ändern.

Nun gibt es aber ein zwar logisches aber unbequemes Verhalten beim Ankerpunkt wechseln. Unzwar wenn der gerade angewählte Gegenstand ein horizontal oder vertikal gespiegelter Gegenstand ist. Wenn er -100% bei der Skalierung hat, oder 180 gedreht ist, oder beides. Dann wählt das Skript den zwar für das Objekt korrekten Anker, aber im Kopf erwartet man beim Tastendruck "Anker oben links" auch "oben links" und will nicht erst umdenken wie das Objekt gespiegelt ist. Smart ist das Skript, das einem das denken erspart. :)

Als Lösung könnte das Script vielleicht kurz die Auswahl aufheben, den Ankerpunkt wechseln und wieder das zuvor gehabte Objekt zurückanwählen?

Als andere Lösung stelle ich mir ein WENN/DANN Weiche vor. Zum beispiel für OBEN-LINKS:

IF (VERT_SKALIERUNG > 0%) dann wähle TOP_LEFT_ANCHOR;
IF (VERT_SKALIERUNG < 0%) dann wähle TOP_RIGHT_ANCHOR;
IF (VERT_SKALIERUNG < 0%) UND (ROTATION = 180) dann wähle BOTTOM_RIGHT

Schlimm kompliziert wird es für mich als Nichtmathematiker, wenn man das Skript perfekt haben will. Denn es müste für Rotationsbereiche und für Skalierungsbereiche anders reagieren - sich bei 45° und 225° rotation anders verhalten.

Mag mir jemand helfen? Das resultierende Script wäre doch sehr praktisch. Gibt's des schon? Ich hab schon gesucht.

(Dieser Beitrag wurde von Stephan_M am 23. Jan 2008, 18:57 geändert)
X

Scripting Hilfe? - Smartes Ankerpunkt wählen

OliverM.
Beiträge gesamt:

24. Jan 2008, 08:55
Beitrag # 2 von 4
Beitrag ID: #332934
Bewertung:
(16226 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Antwort auf [ Stephan_M ] (Singelmann sei wiedermal dank - muss mir mal sein Buch kaufen)


Ich habe es getan, es tat nicht weh, nicht mal im Geldbeutel angesichts der überbordenden Fülle an Aha-Erlebnissen, die man bei der Lektüre hat.

Das einzige Problem sind die jetzt bei mir sinnlos herumstehenden, genau so teuren, aber nicht halb so gehaltvollen, jedoch leider früher erschienenen anderen InDesign-Bücher.

Ich hoffe, dass diese Produktempfehlung nicht gegen den common sense von HDS verstößt. Aber wenn es doch nun mal das beste Buch ist?

OliverM.


als Antwort auf: [#332863]

Scripting Hilfe? - Smartes Ankerpunkt wählen

Martin Fischer
  
Beiträge gesamt: 12783

24. Jan 2008, 10:35
Beitrag # 3 von 4
Beitrag ID: #332958
Bewertung:
(16203 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Stephan,

die Sache wird wahrscheinlich komplexer als ich mir im Moment vorstelle.
Dabei spielen zwei Überraschungen eine Rolle.

Hinsichtlich der Spiegelung könnte eine Unterscheidung zur Setzung des Ankerpunkts rechts oben etwa so aussehen:
Code
// temporäre Voreinstellung: Ankerpunkt zentriert 
app.layoutWindows[0].transformReferencePoint = AnchorPoint.CENTER_ANCHOR;

if ( app.selection.length > 0 )
{
switch(app.selection[0].flip)
{
case Flip.NONE:
alert('n');
app.layoutWindows[0].transformReferencePoint = AnchorPoint.TOP_RIGHT_ANCHOR;
break;
case Flip.HORIZONTAL:
alert('h');
app.layoutWindows[0].transformReferencePoint = AnchorPoint.TOP_LEFT_ANCHOR;
break;
case Flip.VERTICAL:
alert('v');
app.layoutWindows[0].transformReferencePoint = AnchorPoint.BOTTOM_RIGHT_ANCHOR;
break;
case Flip.HORIZONTAL_AND_VERTICAL:
alert('hv');
case Flip.BOTH:
alert('b');
app.layoutWindows[0].transformReferencePoint = AnchorPoint.BOTTOM_LEFT_ANCHOR;
break;
default :
alert('-')
app.layoutWindows[0].transformReferencePoint = AnchorPoint.CENTER_ANCHOR;
}
}


Spontan habe mich die beiden Spiegelungswerte "Flip.HORIZONTAL_AND_VERTICAL" und "Flip.BOTH" überrascht.
Ist das nicht dasselbe.
Dies habe ich mit folgenden Befehlen, die ich im Wechsel auskommentiert habe, geprüft:
Code
app.selection[0].flip = Flip.both 
//app.selection[0].flip = Flip.HORIZONTAL_AND_VERTICAL


Das Ergebnis war dasselbe.

Zweite Überraschung:
Spiegle ich in der Transformieren-Palette einmal horizontal und vertikal, wird dies vom Skript weder als "Flip.HORIZONTAL_AND_VERTICAL" und "Flip.BOTH" erkannt, sondern als "Flip.NONE".
Hmm.

Selbst wenn ich diese Doppelspiegelung per Skriptbefehl ausführe (s.o., einmal mit "Flip.HORIZONTAL_AND_VERTICAL" und "Flip.BOTH"), erkennt das Skript diese nicht als Doppelspiegelung, sondern als "Flip.NONE".
Das Skript zum Ankersetzen setzt den Anker deswegen auch ins gegenüberliegende Eck.

Das legt einen bestimmten Schluß nahe.
Und wie dieses Problem zu umgehen wäre, dazu fällt mir im Moment nur kein Weg ein.
Denn nach "Flip.HORIZONTAL_AND_VERTICAL" und "Flip.BOTH" stellt der Wert Flip.NONE" das Bild nicht mehr in die Ursprungsposition.

Es kommt mir so vor, als verwechsle die Skriptengine hier (bei horizontal_and_vertical und both) flip als Eigenschaft mit einer Methode: spiegele!

flip ist aber als Eigenschaft eingeführt.
Das zeigt etwa
Code
app.selection[0].flip = Flip.horizontal 

Wenn ich diesen Befehl wiederholt ausführte, dann bleibt das Bild erwartungsgemäß horizontal gespiegel stehen

Wenn ich hingegen
Code
app.selection[0].flip = Flip.both 

ausführe, dann springt die Anzeige mit jedem Aufruf.

Spiegelung both und gleich darauf none bewirkt keine Rückstellung der Spiegelung:
Code
app.selection[0].flip = Flip.both 
app.selection[0].flip = Flip.none


Bei Deinem Skript hättest Du nicht nur mit der Mathematik zu kämpfen, sondern auch mit diese Überraschungen.

Ich lasse mich bei meinen Schlüssen liebend gerne korrigieren und verstehe die o.g. Untersuchung aus Aufforderung, das selber nachzustellen und zu testen und mich bitte zu widerlegen.


als Antwort auf: [#332863]

Scripting Hilfe? - Smartes Ankerpunkt wählen

Stephan_M
Beiträge gesamt: 480

25. Jan 2008, 00:42
Beitrag # 4 von 4
Beitrag ID: #333197
Bewertung:
(16178 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Danke Martin. Klasse, dass es eine Flip-Funktion gibt. Schade das sie nicht ganz korrekt funktioniert.

Das könnte vielleicht damit zusammenhängen, das es in Indesign CS3 (v.5.0; win) nicht klappt ein Objekt horizontal auf -100% zu skalieren. Wenn man das versucht, dann trägt Indesign die -100% unerwartet im anderen Feld ein, im Feld für die vertikale Skalierung. Das Objekt ist dann auch falsch geflipt. Wirkt wie ein Bug! Er mag einfach keine -100% beim horizontalen Skalierungsfaktor. Indesign vermeided es auch selbst beim Button zum vertikalen Flippen - macht stattdessen eine 180° Drehung des Objektes. Die Funktion .FLIP prüft mutmasslich vielleicht noch auf [-100, -100] und klappt deswegen nicht.

Als Lösung könnten wir FLIP_BOTH und FLIP_HOR_AND_VERT vergessen und stattdessen was mit dem Drehungswinkel machen.

Hier ein Skript für das pure "smarte" Setzen des Ankerpunktes je nach Drehungswinkel des Objektes: Beispielscript setzt immer den Anker nach oben rechts - egal ob Objekt -179, -23, 30, 91 oder 180° gedreht ist.

Code
// temporäre Voreinstellung: Ankerpunkt zentriert  
app.layoutWindows[0].transformReferencePoint = AnchorPoint.CENTER_ANCHOR;

if ( app.selection.length > 0 )
{
if ((app.selection[0].rotationAngle > -180) && (app.selection[0].rotationAngle <= -135))
{
alert('-179 - -135');
app.layoutWindows[0].transformReferencePoint = AnchorPoint.BOTTOM_LEFT_ANCHOR;
}
if ((app.selection[0].rotationAngle > -135) && (app.selection[0].rotationAngle <= -45))
{
alert('-135 - -45');
app.layoutWindows[0].transformReferencePoint = AnchorPoint.TOP_LEFT_ANCHOR;
}
if ((app.selection[0].rotationAngle > -45) && (app.selection[0].rotationAngle <= 45))
{
alert('-45 - 45');
app.layoutWindows[0].transformReferencePoint = AnchorPoint.TOP_RIGHT_ANCHOR;
}
if ((app.selection[0].rotationAngle > 45) && (app.selection[0].rotationAngle <= 135))
{
alert('45 - 135');
app.layoutWindows[0].transformReferencePoint = AnchorPoint.BOTTOM_RIGHT_ANCHOR;
}
if ((app.selection[0].rotationAngle > 135) && (app.selection[0].rotationAngle <= 180))
{
alert('135 - 180');
app.layoutWindows[0].transformReferencePoint = AnchorPoint.BOTTOM_LEFT_ANCHOR;
}
}


Vielleicht lässt sich nun smartes gedrehtes-Ankerpunkt und smartes gefliptes Ankerpunkt setzen vereinen?


als Antwort auf: [#332958]
(Dieser Beitrag wurde von Stephan_M am 25. Jan 2008, 00:46 geändert)
X