[GastForen Programmierung/Entwicklung JavaScript Reihenfolge von Pfaden im Bild ändern - ab Photoshop CS6

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Themen
Beiträge
Moderatoren
Letzter Beitrag

Reihenfolge von Pfaden im Bild ändern - ab Photoshop CS6

TMA
Beiträge gesamt: 372

21. Mai 2015, 08:13
Beitrag # 1 von 3
Bewertung:
(1748 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo zusammen,
ich hatte einen Thread im AppleScript-Forum aufgemacht, mich aber später für JavaScript entschieden:
http://www.hilfdirselbst.ch/...hop_CS6_P539783.html

Mittlerweile habe ich ein lauffähiges Script fertig, habe aber noch eine Frage. Siehe ganz unten.

Ich habe ein Bild in dem folgende Pfade mit dieser Reihenfolge vorhanden sind:
Code
1  
2
3
4

a
b




Das Ziel ist folgende Reihenfolge:
Code
1  
2

a
b

3
4




Code
if (!Array.prototype.indexOf)  
{
Array.prototype.indexOf = function(searchElement /*, fromIndex */)
{
"use strict";

if (this === void 0 || this === null)
throw new TypeError();

var t = Object(this);
var len = t.length >>> 0;
if (len === 0)
return -1;

var n = 0;
if (arguments.length > 0)
{
n = Number(arguments[1]);
if (n !== n)
n = 0;
else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0))
n = (n > 0 || -1) * Math.floor(Math.abs(n));
}

if (n >= len)
return -1;

var k = n >= 0
? n
: Math.max(len - Math.abs(n), 0);

for (; k < len; k++)
{
if (k in t && t[k] === searchElement)
return k;
}
return -1;
};
}

main();

function main(){
// Pfadliste aufteilen
var usedPathList = [];
var usedPathListFirst = ["1", "2"];
var usedPathListSecond = ["3", "4"];
usedPathList = usedPathListFirst.concat(usedPathListSecond);

var theDoc = app.activeDocument;
var pathItems = theDoc.pathItems;

// Namen der vorhandenen Pfade auslesen
var pathItemsNameList = [];
for (var i = 0; i < pathItems.length; i++){
tmpPath = pathItems[i].name;
pathItemsNameList.push(tmpPath);
}

// Die Pfade die nicht vorgegeben sind in eine extra Liste packen.
var otherPathItemsList = [];
for (var i = 0; i < pathItemsNameList.length; i++){
if (usedPathList.indexOf(pathItemsNameList[i]) < 0){
otherPathItemsList.push(pathItemsNameList[i]);
}
}

// neue sortierte Liste zusammensetzen
var sortedList = usedPathListFirst.concat(otherPathItemsList, usedPathListSecond);

// pfade umbenennen. Alten Pfad "_new" benennen. Neuen Pfad "_new" duplizieren und den altem Namen vergeben (ohne "_new"). Pfad mit neuem Namen "_new" löschen.
for (var i = 0; i < sortedList.length; i++){
var tmpPathItem = theDoc.pathItems.getByName(sortedList[i]).name = sortedList[i] + "_new";
duplicatePathItem(theDoc, tmpPathItem, sortedList[i]);
theDoc.pathItems.getByName(sortedList[i] + "_new").remove();
}
}



function duplicatePathItem(theDoc, oldPathName, newPathName){
try{
// try to delete an old path item before make a new one
try{
theDoc.pathItems.getByName(newPathName).remove();
}
catch (e){}
// duplicate path with new name
tmpPath = theDoc.pathItems.getByName (oldPathName);
tmpPath.duplicate(newPathName);
}
catch (e) {
throw "ERROR WHILE duplicatePathItem: " + e;
}
}



Alles funktioniert soweit aber vielleicht hat jemand noch Verbesserungsvorschläge.
Kann man z.B. als Einzeiler eine Liste aller Pfadnamen erstellen?
Zur Zeit packe ich ja alle pathItems in eine Liste. In einer Schleife dadurch hole ich mir dann einzeln den Pfadnamen und packe ihn in eine neue Liste. Geht das evtl einfacher?

Gruß
TMA
X

Reihenfolge von Pfaden im Bild ändern - ab Photoshop CS6

Uwe Laubender
Beiträge gesamt: 5000

21. Mai 2015, 19:05
Beitrag # 2 von 3
Beitrag ID: #539892
Bewertung:
(1707 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo, TMA!

Na, dann wird's doch Zeit meine Lösung, die ich als Idee bereits im AppleScript-Forum angedacht hatte, hier vorzustellen:

Code
//PSD-ReorderPaths-CS6-150520-1.jsx 
//Uwe Laubender

//An Adobe PhotoShop-ExtendScript Script
//Something like a substitute for the missing method move() for path items.

/**
* @@@[email protected]@@ PSD-ReorderPaths-CS6-150520-1.jsx !Version! Wed May 20 2015 20:07:24 GMT+0200
*/

reorderPaths();

function reorderPaths(){

if(app.name.match("Photoshop") === null){return};

//Here go the names of the paths in the right order, from top to down in the path items panel:
var myNewStackingOrder = [
"Pfad 1",
"Pfad 2",
"Pfad 3",
"Pfad 4"
];

//Prepare a var for an associative array for the path items:
var myPathItemsArray = [];
//A counter for the for-loop where you go straight to the path items in the associative array:

//Check, if a document is open:
if(app.documents.length === 0){return};

//WARNING: THIS COULD GO WRONG, IF MORE THAN ONE PhotoShop DOCUMENT IS OPEN:
var myPSD = app.documents[0];

//Check, if there are any path items:
if(myPSD.pathItems.length === 0){return};

//Get all path items:
var myPSDpathItems = myPSD.pathItems;

//Build the associative array based on the path item names:
for(var n=0;n<myPSDpathItems.length;n++){
myPathItemsArray[myPSDpathItems[n].name] = myPSDpathItems[n];
};


//NOW HERE IS THE ACTION OF RE-ORDERING:
//A FOR-LOOP

for(var n=0;n<myNewStackingOrder.length;n++){

//Let's see, if the path we want to re-order is there.
//If not, loop on by continue:
if(myPathItemsArray[myNewStackingOrder[n]] === undefined){continue};

//IF THE PATH ITEM IS VALID:
//Here is a existing path we can work with:
var myCurrentPath = myPathItemsArray[myNewStackingOrder[n]];
//And its name:
var myCurrentName = myNewStackingOrder[n];
//Duplicate it. We don't need its name.
var myDup = myCurrentPath.duplicate();
//Remove the original path item:
myCurrentPath.remove();
//Rename the dup:
myDup.name = myCurrentName;

};

};

*****
Mit herzlichem Gruß,
Uwe Laubender


als Antwort auf: [#539852]

Reihenfolge von Pfaden im Bild ändern - ab Photoshop CS6

TMA
Beiträge gesamt: 372

22. Mai 2015, 06:24
Beitrag # 3 von 3
Beitrag ID: #539899
Bewertung:
(1663 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Uwe,
das Script funktioniert super, solange man nur die Pfade neu sortieren möchte die man in der Liste mitgibt.

Leider kann ich das für meinen Fall nicht benutzen. Dazu mal die Aufgabenstellung:

Ich habe, sagen wir mal, 3 Blöcke mit Pfadnamen. Von 2 Blöcken sind die Pfadnamen fest vorgeschrieben, der 3. Block kann beliebig viele Pfade mit den unterschiedlichsten Namen enthalten.

Nun müssen die Pfade in folgende Reihenfolge gesetzt werden:

Block 1 (Pfadnamen bekannt), z.B.:
Pfad 1
Pfad 2

Block 2 (Pfadnamen unbekannt, beliebig viele), z.B.:
Ton 1
Ton 2
Ton 3
...

Block 3 (Pfadnamen bekannt), z.B.:
Pfad 3
Pfad 4
Model
Hintergrund

Wie geschrieben, funktioniert mein Script aber vielleicht kann man was verbessern oder kürzen (Ich bin noch JavaScript Anfänger). Kann man z.B. das mit dem Prototyp "IndexOf" irgendwie anders lösen? Den benutze ich ja nur um einen String in einer Liste zu suchen, ob vorhanden oder nicht. Evtl geht das auch anders.

Danke und Gruß
TMA


als Antwort auf: [#539892]

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
05.02.2021 - 05.11.2021

Digicomp Academy AG, Limmatstrasse 50, 8005 Zürich
Freitag, 05. Feb. 2021, 13.00 Uhr - Freitag, 05. Nov. 2021, 17.00 Uhr

Lehrgang

Bilden Sie sich zum zertifizierten Publishing-Multimedia-Profi aus. Neben Fotografie und Video befassen Sie sich mit der Medienproduktion, digitalen Publikationen und dem Webdesign für Desktop- und mobile Endgeräte.

Preis: CHF 10'500.-
Dauer: 30 Tage (ca. 210 Lektionen) – Unterricht findet jeweils am Freitag von 13 - 19 Uhr und Samstag von 09 - 17 Uhr statt

Ja

Organisator: Digicomp Academy AG

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

digicomp.ch/d/9PM

Veranstaltungen
09.09.2021 - 17.12.2021

Digicomp Academy, Zürich
Donnerstag, 09. Sept. 2021, 13.00 Uhr - Freitag, 17. Dez. 2021, 19.00 Uhr

Lehrgang

Steigen Sie in die Welt des Publishings ein und erlangen Sie die Zertifizierung von Publishing NETWORK. Lernen Sie in diesem Lehrgang Druckmedien professionell zu erarbeiten, druckfertige PDFs zu erstellen und CI/CD-Vorgaben umzusetzen.

Preis: 6'300.– zzgl. 7.7% MWST
Dauer: 18 Tage(ca. 126 Lektionen) – Unterricht findet jeweils am Freitag von 13 - 19 Uhr und Samstag von 09 - 17 Uhr statt.

Ja

Organisator: Digicomp Academy AG

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