[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt TransformationMatrices - Verständnisfrage

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

TransformationMatrices - Verständnisfrage

peterhenrich
Beiträge gesamt: 139

12. Feb 2014, 09:07
Beitrag # 1 von 13
Bewertung:
(4408 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

ich verschiebe in den Scripten die Objekte mit den TransformationMatrices. Diese adde ich die ganze Zeit fröhlich zur Applikation, was auch problemlos funktioniert. Einen Befehl zum Löschen der Matrizen habe ich nicht gefunden.

Dann hat mich interessiert, ob die irgendwo gespeichert werden und es eventuell später, wenn viele Anwender auf den Server zugreifen, zu Problemen kommen kann. Die Anzahl der Matrizen wurde aber am Ende eines Scriptes immer mit Null angegeben.

Dann habe ich die Anzahl direkt nach Erstellen ausgegeben:

Code
var transMat2 = app.transformationMatrices.add({verticalScaleFactor:scaleFactor[0]}); 
alert(app.transformationMatrices.length);
shadow.transform(CoordinateSpaces.pasteboardCoordinates, AnchorPoint.CENTER_ANCHOR, transMat2);


In der ersten Zeile lege ich die Matrix an, in der zweiten wird die Anzahl der Matrizen mit Null ausgegeben und in der dritten Zeile kann ich die Matrix anwenden.

Frage ich da einen falschen Wert ab oder wie ist das Verhalten?

Peter
X

TransformationMatrices - Verständnisfrage

peterhenrich
Beiträge gesamt: 139

12. Feb 2014, 11:49
Beitrag # 2 von 13
Beitrag ID: #523493
Bewertung:
(4369 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Und noch eine weitere Frage zu den Matrizen:

Ich möchte eine Linie außen an einem Kreis rotieren lassen - ähnlich also wie die Unterteilung bei einem Tacho.

Dazu setze ich erst den Nullpunkt der Seite auf die Mitte des Kreises, zeichne die Linie auf der 12-Uhr-Position und möchte diese dann mithilfe der Matrix und des transform-Befehls drehen:

Code
var rotMat = app.transformationMatrices.add({counterclockwiseRotationAngle:rotAngle}); 
line1stOrder.transform(CoordinateSpaces.SPREAD_COORDINATES, [0,0], rotMat);


Dabei ergibt sich folgendes:
- Egal, was ich unter CoordinateSpaces eintrage, am Verhalten ändert sich nichts.

- An der zweiten Stelle habe ein Array mit dem vermeintlichen Nullpunkt eingesetzt, um das ID drehen soll. Macht es aber nicht - es wird um irgendeinen x-beliebigen Punkt gedreht, der gefühlt in der Mitte der Seite liegt.

- Verändere ich die Werte in dem Array, ändert sich an dem Verhalten nichts.

- Setze ich an diese Stelle irgendetwas wie "AnchorPoint.BOTTOM_RIGHT_ANCHOR", ist das Verhalten wieder korrekt. Aber ich will halt eben nicht um einen Punkt des zu drehenden Objekts rotieren.

Was mache ich falsch?


als Antwort auf: [#523482]

TransformationMatrices - Verständnisfrage

Uwe Laubender
Beiträge gesamt: 5319

12. Feb 2014, 12:26
Beitrag # 3 von 13
Beitrag ID: #523495
Bewertung:
(4351 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, Peter!

Vielleicht findest Du etwas zum Thema auf Marc Autrets Website?

http://www.indiscripts.com

Nicht direkt das, was Du brauchst, aber schau' mal da rein:

Marc Autret
Moving Objects with respect to a Reference Point

http://www.indiscripts.com/...rum-roundup-5#hd1sb2

Alles, was ich seitens Adobe über transform() mit transformationMatrices finden konnte, war das hier:

https://wwwimages2.adobe.com/...orial_javascript.pdf


als Antwort auf: [#523493]

TransformationMatrices - Verständnisfrage

peterhenrich
Beiträge gesamt: 139

12. Feb 2014, 16:46
Beitrag # 4 von 13
Beitrag ID: #523530
Bewertung:
(4304 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

vielen Dank für die Links. Die Autret-Beispiele haben nicht geholfen (schlicht, weil ich sie nicht verstanden habe :-).

Der Link auf die Beschreibung aus CS3 hat aber geholfen. Man muss den Drehpunkt auch auf eine Seite beziehen: Anstatt den Nullpunkt mit [0,0] zu bezeichnen, muss man auch die Seite nennen - in meinem Fall die erste: [[0,0],0]

Nachträglich sehe ich das durchaus ein, allerdings findet sich dieser Hinweis unter der Beschreibung bei jongware nicht: Dort sind bei der transform-Methode explizit "Array of 2 Reals" als auch ""Array of Arrays of 2 Reals" genannt, nicht jedoch die Kombination aus einem Array und einer Real.

Sei's drum - so funktioniert es.

Danke

Peter


als Antwort auf: [#523495]
(Dieser Beitrag wurde von peterhenrich am 12. Feb 2014, 16:47 geändert)

TransformationMatrices - Verständnisfrage

Uwe Laubender
Beiträge gesamt: 5319

12. Feb 2014, 18:16
Beitrag # 5 von 13
Beitrag ID: #523540
Bewertung:
(4263 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, Peter!

Sehr schön. Danke für den Hinweis. Das ist auch neu für mich.

Aber mach Jongware keinen Vorwurf, 99,99% der Dokumentation des DOMs ist automatisiert aus den XML-Daten des ESTK erzeugt. Da hat höchstens Adobe geschludert…

Sich mit Marc Autrets Code oder besser Schreibstil zu beschäftigen, dürfte lohnen. Aber wahrscheinlich nur etwas für lange Winterabende am Kaminfeuer ;-)


als Antwort auf: [#523530]

TransformationMatrices - Verständnisfrage

peterhenrich
Beiträge gesamt: 139

12. Feb 2014, 20:01
Beitrag # 6 von 13
Beitrag ID: #523546
Bewertung:
(4232 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

das war ganz bestimmt nicht als Vorwurf an jongware gerichtet, der, so mein Kenntnisstand, diese verborgene Dokumentation überhaupt erst entdeckt und dann auch noch lesbar gemacht hat. Ihm ist ja nicht genug zu danken.

Bei Autret habe ich insbesondere eine Zeile nicht verstanden:

Code
function moveToConsideringAnchor(obj, xyDest, anchorPt) 
// -------------------------------------
// <obj> : any singular PageItem specifier
// <xyDest> : [x,y] location expressed in the current ruler space
// <anchorPt> : the considered AnchorPoint (default is top-left)
{
if( !(obj && 'transform' in obj) ) return;

var CS_PASTEBOARD = CoordinateSpaces.pasteboardCoordinates;

anchorPt || (anchorPt=AnchorPoint.topLeftAnchor);

var xy0 = obj.resolve(anchorPt,CS_PASTEBOARD)[0],
xy1 = obj.resolve([xyDest,anchorPt],CS_PASTEBOARD,true)[0],
dx = xy1[0]-xy0[0],
dy = xy1[1]-xy0[1];

obj.transform(CS_PASTEBOARD,[0,0],[1,0,0,1,dx,dy]);
}


Was bewirkt denn diese Zeile?
Code
anchorPt || (anchorPt=AnchorPoint.topLeftAnchor); 

Sieht für mich aus wie eine Oder-Bedingung, die Boolean liefert, was aber nirgends aufgefangen wird.

Gruß

Peter


als Antwort auf: [#523540]

TransformationMatrices - Verständnisfrage

Uwe Laubender
Beiträge gesamt: 5319

12. Feb 2014, 22:40
Beitrag # 7 von 13
Beitrag ID: #523554
Bewertung:
(4205 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, Peter!

Ich würd's mal so interpretieren:

anchorPt ist ja das dritte Argument der Funktion moveToConsideringAnchor().

Wenn nun nur die beiden ersten Argumente in die Funktion eingegeben werden, das dritte Argument aber nicht, also "undefined" ist, schlägt der Ausdruck nach dem logischen Oder || zu.

Also: Marc bestimmt also einen Default-Wert für anchorPt, der auf (anchorPt=AnchorPoint.topLeftAnchor) steht, wenn das dritte Argument nicht benutzt wird.

Wird hingegen ein Wert für anchorPt in die Funktion eingegeben, bleibt der eingegebene Wert, der Ausdruck nach dem || kommt nicht zum Zuge.


als Antwort auf: [#523546]

TransformationMatrices - Verständnisfrage

peterhenrich
Beiträge gesamt: 139

11. Mär 2014, 16:10
Beitrag # 8 von 13
Beitrag ID: #524732
Bewertung:
(4064 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

leider muss ich dieses Thema mit einem anderen Focus nochmal aufrufen. Ich versuche, mit der Angabe einer horizontalTranslation sowie dem vertikalen Gegenstück ein Rectangle zu verschieben. Da kommen aber immer nur krumme Werte bei rum, als ob ID generell in Millimetern arbeitet, beim Verschieben aber mit Punkt arbeitet.

Code
#target indesign; 

var doc = app.documents.add();
doc.documentPreferences.pageWidth = 500;
doc.documentPreferences.pageHeight = 500;

var newRect = doc.rectangles.add();
newRect.geometricBounds = [0, 0, 200, 200];

//Bis hier hin sind alle Angaben in Millimetern -
//ohne dass es irgendwo explizit gesagt wird

var transMat = app.transformationMatrices.add({horizontalTranslation: 0, verticalTranslation: -100});
newRect.transform(CoordinateSpaces.PASTEBOARD_COORDINATES, AnchorPoint.TOP_LEFT_ANCHOR, transMat);
//Nach der Verschiebung befindet sich das Rectangle -35,27777 mm vom Dokumentrand entfernt
//also wurde hier in pt verschoben.

alert(newRect.geometricBounds.join("\r"));


Warum ist das so und wie kann ich das auf mm setzen?

Gruß

Peter


als Antwort auf: [#523554]

TransformationMatrices - Verständnisfrage

Uwe Laubender
Beiträge gesamt: 5319

11. Mär 2014, 17:11
Beitrag # 9 von 13
Beitrag ID: #524735
Bewertung:
(4039 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, Peter!

Warum? Tja, weil Adobe das so eingerichtet hat…

Vielleicht etwas unbefriedigend, aber:
Du könntest die mm in pt ausdrücken.
Die -100 in mm sind -283.465 in pt ausgedrückt.

Uwe


als Antwort auf: [#524732]

TransformationMatrices - Verständnisfrage

peterhenrich
Beiträge gesamt: 139

11. Mär 2014, 17:15
Beitrag # 10 von 13
Beitrag ID: #524737
Bewertung:
(4032 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,

danke für die Antwort. Wenn es so ist, ist es so. Ich hatte nur gedacht, dass es irgendwo ein Setting gibt, mit dem man auf mm umstellen kann.

Gruß

Peter


als Antwort auf: [#524735]

TransformationMatrices - Verständnisfrage

Uwe Laubender
Beiträge gesamt: 5319

11. Mär 2014, 17:22
Beitrag # 11 von 13
Beitrag ID: #524738
Bewertung:
(4030 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, Peter!

Also im konkreten Fall bräuchtest Du keine Transformationsmatrix.
Das kann auch die move()-Methode:

Code
newRect.move(undefined,[0,-100]); 


Und die macht das mit dem Maßsystem des Dokuments.
In Deinem Fall den mm.


als Antwort auf: [#524737]

TransformationMatrices - Verständnisfrage

peterhenrich
Beiträge gesamt: 139

11. Mär 2014, 17:30
Beitrag # 12 von 13
Beitrag ID: #524740
Bewertung:
(4023 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Das ist aber auch eine gute Idee!

Danke.


als Antwort auf: [#524738]

TransformationMatrices - Verständnisfrage

Uwe Laubender
Beiträge gesamt: 5319

31. Mär 2014, 19:43
Beitrag # 13 von 13
Beitrag ID: #525722
Bewertung:
(3812 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, Peter!

Ich komme noch mal aus aktuellem Anlaß auf Deine Entdeckung des nicht-dokumentierten Parameters in der Methode transform() zurück.

Ich habe mal ein Dokument mit 3 Seiten angelegt. Auf jeder Seite ein gelbes Rechteck, das um 20° gedreht werden soll. Die Montagefläche ist auf das absolut mögliche Minimum begrenzt: kein Abstand in beide Richtungen!

Tut nichts zur Sache, aber hier im Code-Beispiel arbeite ich mit der Auswahl des gelben Rechtecks:

Code
var myRotationMatrix = app.transformationMatrices.add({counterclockwiseRotationAngle: 20}); 

var myDup = app.selection[0].duplicate();
myDup.fillColor = "Magenta";

myDup.transform(CoordinateSpaces.INNER_COORDINATES, [0,0], myRotationMatrix);


Wähle ich also der Reihe nach durch die Seiten das gelbe Rechteck aus und lasse jeweils das Script laufen, ergibt sich eine interessante Transformationsfolge, die sich durch das Dokument zieht.

Siehe angehängtem Screenshot:

"1-TransformMethod_CounterclockwiseRotationAngle.png"

Die abgebildete rote Linie habe ich anschließend eingefügt. Sie zeigt den Drehwinkel mit Flucht zum imaginären 0-Punkt der Rotation, der sich durch die ganze Datei durchzieht. Auffälligerweise findet auch der "Abstand" zwischen den einzelnen Montageflächen beachtung (wie bereits oben vermerkt: die Montagefläche ist auf die kleinste Größe eingestellt)!

"2-DetailBetweenTheSpreads.png"

Ändert man nun die Montagefläche zB. in der Höhe, ändert sich auch die Position des gedrehten Objekts, da sich der imaginäre 0-Punkt des gesamten Dokumentes den neuen Gegebenheiten anpasst:

"3-PasteBoard-0-100.png"

(Im hier gezeigten Beispiel verursacht die Abarbeitung des Scripts auf Seite 3 einen Fehler: "Mit diesem Wert würde mindestens ein Objekt von der Montagefläche verdrängt.". Kein Wunder.)

Definiert man hingegen die transform()-Methode mit der von Dir gefundenen Erweiterung des Parameters für die Seite (der Index der Seite innerhalb des Dokuments), läuft das Script wunschgemäß für alle Druckbogen problemlos und vorhersehbar.

Code
var pageIndexPageThree = 2; 
myDup.transform(CoordinateSpaces.INNER_COORDINATES, [ [0,0],pageIndexPageThree ], myRotationMatrix);


Siehe Screenshot am Beispiel der dritten Seite:
"4-UndocumentedParameterUsed.png"

Nochmals danke für den Hinweis!


als Antwort auf: [#524740]
Anhang:
1-TransformMethod_CounterclockwiseRotationAngle.png (53.4 KB)   2-DetailBetweenTheSpreads.png (53.7 KB)   3-PasteBoard-0-100.png (65.7 KB)   4-UndocumentedParameterUsed.png (23.1 KB)
X