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

21. Mai 2015, 10:13
Beitrag # 1 von 3
Bewertung:
(1845 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: 5253

21. Mai 2015, 21:05
Beitrag # 2 von 3
Beitrag ID: #539892
Bewertung:
(1804 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.

/**
* @@@BUILDINFO@@@ 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;

};

};



als Antwort auf: [#539852]

Reihenfolge von Pfaden im Bild ändern - ab Photoshop CS6

TMA
Beiträge gesamt: 384

22. Mai 2015, 08:24
Beitrag # 3 von 3
Beitrag ID: #539899
Bewertung:
(1760 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]

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
01.03.2023 - 09.03.2023

Online
Mittwoch, 01. März 2023, 00.00 Uhr - Donnerstag, 09. März 2023, 00.00 Uhr

Online Webinar

Wie gehen wir mit diesen Veränderungen um? Was ist notwendig, damit wir die Digitalisierung im Unternehmen klappt? Veränderungsprozesse verstehen und entsprechend handeln Mitarbeiter als Botschafter Webseite mit WordPress erstellen SEA /SEO (Ads aufschalten)

Ja

Organisator: B. Isik - SNF Academy

Kontaktinformation: B. Isik, E-Mailinfo AT snfa DOT ch

https://www.fernstudiumfitness.ch/digitalisierung-schweiz/