[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: 138

12. Feb 2014, 09:07
Beitrag # 1 von 13
Bewertung:
(3782 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: 138

12. Feb 2014, 11:49
Beitrag # 2 von 13
Beitrag ID: #523493
Bewertung:
(3743 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: 4853

12. Feb 2014, 12:26
Beitrag # 3 von 13
Beitrag ID: #523495
Bewertung:
(3725 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
*****
Mit herzlichem Gruß,
Uwe Laubender


als Antwort auf: [#523493]

TransformationMatrices - Verständnisfrage

peterhenrich
Beiträge gesamt: 138

12. Feb 2014, 16:46
Beitrag # 4 von 13
Beitrag ID: #523530
Bewertung:
(3678 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: 4853

12. Feb 2014, 18:16
Beitrag # 5 von 13
Beitrag ID: #523540
Bewertung:
(3637 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 ;-)
*****
Mit herzlichem Gruß,
Uwe Laubender


als Antwort auf: [#523530]

TransformationMatrices - Verständnisfrage

peterhenrich
Beiträge gesamt: 138

12. Feb 2014, 20:01
Beitrag # 6 von 13
Beitrag ID: #523546
Bewertung:
(3606 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: 4853

12. Feb 2014, 22:40
Beitrag # 7 von 13
Beitrag ID: #523554
Bewertung:
(3579 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.
*****
Mit herzlichem Gruß,
Uwe Laubender


als Antwort auf: [#523546]

TransformationMatrices - Verständnisfrage

peterhenrich
Beiträge gesamt: 138

11. Mär 2014, 16:10
Beitrag # 8 von 13
Beitrag ID: #524732
Bewertung:
(3438 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: 4853

11. Mär 2014, 17:11
Beitrag # 9 von 13
Beitrag ID: #524735
Bewertung:
(3413 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
*****
Mit herzlichem Gruß,
Uwe Laubender


als Antwort auf: [#524732]

TransformationMatrices - Verständnisfrage

peterhenrich
Beiträge gesamt: 138

11. Mär 2014, 17:15
Beitrag # 10 von 13
Beitrag ID: #524737
Bewertung:
(3406 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: 4853

11. Mär 2014, 17:22
Beitrag # 11 von 13
Beitrag ID: #524738
Bewertung:
(3404 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.
*****
Mit herzlichem Gruß,
Uwe Laubender


als Antwort auf: [#524737]

TransformationMatrices - Verständnisfrage

peterhenrich
Beiträge gesamt: 138

11. Mär 2014, 17:30
Beitrag # 12 von 13
Beitrag ID: #524740
Bewertung:
(3397 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: 4853

31. Mär 2014, 19:43
Beitrag # 13 von 13
Beitrag ID: #525722
Bewertung:
(3186 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!
*****
Mit herzlichem Gruß,
Uwe Laubender


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

Aktuell

Veranstaltungskalender

Hier können Sie Ihre Anlässe eintragen, welche einen Zusammenhang mit den Angeboten von HilfDirSelbst.ch wie z.B. Adobe InDesign, Photoshop, Illustrator, PDF, Pitstop, Affinity, Marketing, SEO, Büro- und Rechtsthemen etc. haben. Die Einträge werden moderiert freigeschaltet. Dies wird werktags üblicherweise innert 24 Stunden erfolgen.

pdf-icon Hier eine kleine Anleitung hinsichtlich Bedeutung der auszufüllenden Formularfelder.

Veranstaltungen
25.01.2021 - 26.01.2021

Digicomp Academy AG, Bern oder Zürich
Montag, 25. Jan. 2021, 08.30 Uhr - Dienstag, 26. Jan. 2021, 17.00 Uhr

Kurs

In diesem Basic-Kurs lernen Sie das Wichtigste über den Aufbau und die Funktionsweise von Photoshop. Zusammen mit den notwendigen Grundlagen von Farbenlehre bis Bildauflösung lernen Sie zudem die kreativen Möglichkeiten von Photoshop kennen.

Dauer: 2 Tage
Preis: CHF 1'400.–

Ja

Organisator: Digicomp Academy AG

Kontaktinformation: Kundenberater-Team, E-Mailkundenberatung AT digicomp DOT ch

digicomp.ch/d/PHOTM1

Veranstaltungen
25.01.2021 - 26.01.2021

Digicomp Academy AG, Zürich oder virtuell
Montag, 25. Jan. 2021, 08.30 Uhr - Dienstag, 26. Jan. 2021, 17.00 Uhr

Kurs

Im Kurs lernen Sie die Schritte vom Import des Rohmaterials bis zum fertig exportierten Clip kennen. Dazu zählen die Materialverwaltung, das Trimmen für Roh- und Feinschnitt, Blenden, Titel und Effekte und eine Übersicht über die wichtigsten Formate.

Preis: CHF 1'700.-
Dauer: 2 Tage

Ja

Organisator: Digicomp Academy AG

Kontaktinformation: Kundenberater-Team, E-Mailkundenberatung AT digicomp DOT ch

digicomp.ch/d/AP6

Neuste Foreneinträge


Exel ohne leeres Tabellenblatt starten

Text- oder Grafikrahmen nach Position und Größe suchen und ändern

[GREP] beliebige Zeichen finden und durch selbe Anzahl an Leerzeichen oder Anzahl Zeichen "x" ersetzen

InDesign 2021 – Suchen/Ersetzen: Farbe

Langsamer MacMini

Netzwerklaufwerke verbinden -> Bei nicht verfügbar Fehlermeldung unterdrücken

Balken hinter einen Bildteil

Geteiltes Album

Verschiedene Netzwerke Handeln

Nicht "Silben über Spalten hinweg trennen" (CC 2018/ CC 2021)
medienjobs